Linux cesa-www-main 6.1.0-49-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64
Apache/2.4.68 (Debian)
Server IP : 10.218.0.2 & Your IP : 216.73.216.28
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
var /
www /
cesa.co.za /
php /
includes /
Delete
Unzip
Name
Size
Permission
Date
Action
error_handling
[ DIR ]
drwxr-sr-x
2025-07-07 15:54
mail
[ DIR ]
drwxr-sr-x
2025-06-14 11:17
ADQAnswers.php
3.16
KB
-rw-r--r--
2026-06-03 05:55
ADQAudit.php
6.51
KB
-rw-r--r--
2026-06-03 05:55
ADQAuditAnswers.php
1.21
KB
-rw-r--r--
2026-06-03 05:55
ADQFirms.php
18.41
KB
-rw-r--r--
2025-12-31 10:56
ADQuestionnairesAnswers.php
1.05
KB
-rw-r--r--
2026-06-03 05:55
ADQuestionnairesAudit.php
2.01
KB
-rw-r--r--
2026-06-03 05:55
ADecQuestionnaires.php
3.31
KB
-rw-r--r--
2026-06-03 05:55
ADecQuestions.php
541
B
-rw-r--r--
2026-06-03 05:55
ADec_Contacts.php
1.61
KB
-rw-r--r--
2026-06-03 05:55
ADec_OfficeContacts.php
7.43
KB
-rw-r--r--
2026-06-03 05:55
ADec_PIUnderwriters.php
742
B
-rw-r--r--
2026-06-03 05:55
ADec_Transformation.php
817
B
-rw-r--r--
2026-06-03 05:55
ADec_tblMemberFirmOffices.php
1.49
KB
-rw-r--r--
2026-06-03 05:55
ADec_tblMemberFirmSkills.php
2.38
KB
-rw-r--r--
2026-06-03 05:55
ADec_tblMemberFirms.php
19.37
KB
-rw-r--r--
2026-06-03 05:55
AnonRespondees.php
4.25
KB
-rw-r--r--
2026-06-05 11:41
AwardsEntries.php
2.4
KB
-rw-r--r--
2026-06-06 10:48
BaseTableClass.php
950
B
-rw-r--r--
2026-04-26 08:24
BatchJob.php
4.46
KB
-rw-r--r--
2026-06-03 05:55
BceAssignmentFeedbackFormsReportService.php
6.77
KB
-rw-r--r--
2026-05-25 13:06
CCEAssignment.php
12.44
KB
-rw-r--r--
2026-05-26 14:26
CCEAssignmentMarking.php
26.26
KB
-rw-r--r--
2026-08-14 12:06
CCEBooks.php
524
B
-rw-r--r--
2026-06-03 05:55
CCEConvenorAuth.php
3.06
KB
-rw-r--r--
2026-08-19 11:18
CCECourseSchedules.php
579
B
-rw-r--r--
2026-06-03 05:55
CCEDocCategories.php
529
B
-rw-r--r--
2026-06-03 05:55
CCEDocuments.php
8.15
KB
-rw-r--r--
2026-08-20 12:16
CCEExam.php
15.87
KB
-rw-r--r--
2026-06-03 06:35
CCEExamQuestion.php
1.76
KB
-rw-r--r--
2026-06-03 05:55
CCEFacilitatorUser.php
931
B
-rw-r--r--
2026-06-03 05:55
CCEMessageLog.php
951
B
-rw-r--r--
2026-06-03 05:55
CCEMessages.php
8.88
KB
-rw-r--r--
2026-07-01 13:20
CCEModuleMarksService.php
7.16
KB
-rw-r--r--
2026-05-26 10:30
CCEModules.php
1.16
KB
-rw-r--r--
2026-06-03 05:55
CCEResourceGroups.php
591
B
-rw-r--r--
2026-06-03 05:55
CCEResources.php
896
B
-rw-r--r--
2026-06-03 05:55
CCESetup.php
256
B
-rw-r--r--
2026-02-09 16:20
CCEStAssigExtension.php
2.07
KB
-rw-r--r--
2026-06-03 05:55
CCEStAssigExtensionRequest.php
6.65
KB
-rw-r--r--
2026-06-03 05:55
CCEStudentAssignment.php
16.61
KB
-rw-r--r--
2026-07-15 14:44
CCEStudentCourses.php
611
B
-rw-r--r--
2026-06-03 05:55
CCEStudentDisplayOrder.php
4.96
KB
-rw-r--r--
2026-05-26 09:32
CCEStudents.php
8.4
KB
-rw-r--r--
2026-08-19 11:18
CCETemplates.php
896
B
-rw-r--r--
2026-06-03 05:55
CCEWeeklySessions.php
2.27
KB
-rw-r--r--
2026-02-09 16:25
CPDSPReview.php
624
B
-rw-r--r--
2026-06-03 05:55
CPDServiceProvider.php
4.57
KB
-rw-r--r--
2026-06-12 11:48
CPDTrainingMaterial.php
3.96
KB
-rw-r--r--
2026-06-12 11:48
CceUploadedFileService.php
34.9
KB
-rw-r--r--
2026-06-24 12:03
Certificates.php
8.93
KB
-rw-r--r--
2026-08-18 15:42
Contact.php
690
B
-rw-r--r--
2026-06-03 05:55
ErrorLog.php
1.22
KB
-rw-r--r--
2026-08-24 10:12
EventSchedules.php
5.39
KB
-rw-r--r--
2025-12-20 10:03
FileUploads.php
2.1
KB
-rw-r--r--
2026-06-03 05:55
HTMLHelper.php
17.2
KB
-rw-r--r--
2026-06-03 05:55
KeyValue.php
4.9
KB
-rw-r--r--
2026-04-25 09:34
Mailer.php
12.78
KB
-rw-r--r--
2026-07-15 09:50
MarketingAttendees.php
36.87
KB
-rw-r--r--
2026-08-14 12:06
MarketingPayments.php
2.52
KB
-rw-r--r--
2026-06-03 05:55
MemberContact.php
1.04
KB
-rw-r--r--
2026-06-03 05:55
MemberFirm.php
17.71
KB
-rw-r--r--
2026-06-03 05:55
MemberFirmOffices.php
752
B
-rw-r--r--
2026-06-03 05:55
MemberFirmSkill.php
18.04
KB
-rw-r--r--
2026-06-03 05:55
MemberPortalTransformationProxy.php
4.44
KB
-rw-r--r--
2026-05-20 09:08
MemberPortalUrls.php
1.82
KB
-rw-r--r--
2026-05-20 09:53
MsgAttachFileService.php
4.92
KB
-rw-r--r--
2026-06-22 08:37
OfficeContact.php
1.01
KB
-rw-r--r--
2026-06-03 05:55
Picklists.php
539
B
-rw-r--r--
2026-06-03 05:55
Questionnaires.php
849
B
-rw-r--r--
2026-01-23 12:39
SchoolAttendeeBulkMailerService.php
34.26
KB
-rw-r--r--
2026-08-11 10:45
SchoolAttendees.php
73.21
KB
-rw-r--r--
2026-08-11 10:45
SchoolCourses.php
7.98
KB
-rw-r--r--
2026-08-19 11:59
SchoolEvents.php
45.54
KB
-rw-r--r--
2026-08-18 15:42
SchoolPayments.php
4.48
KB
-rw-r--r--
2026-04-13 09:33
SchoolPresenters.php
1.86
KB
-rw-r--r--
2026-01-23 12:43
SchoolWeeksCoursesDashboardProxy.php
10.69
KB
-rw-r--r--
2026-08-14 12:32
TrainingProvider.php
8.06
KB
-rw-r--r--
2026-01-23 12:43
TrainingProviderDoc.php
554
B
-rw-r--r--
2026-06-03 05:55
Transformation.php
10.87
KB
-rw-r--r--
2026-05-13 09:36
UnempPractitioners.php
1.43
KB
-rw-r--r--
2026-06-03 05:55
Utils.php
13.72
KB
-rw-r--r--
2026-07-23 07:28
WeeklySessionsParser.php
7.87
KB
-rw-r--r--
2026-02-09 16:20
cceMessageAttachmentUpload.inc.php
5.12
KB
-rw-r--r--
2026-06-03 05:55
cceMessageEditor.inc.php
9.26
KB
-rw-r--r--
2026-07-01 13:20
cce_file_download_endpoint.php
1.75
KB
-rw-r--r--
2026-06-24 08:38
cstUnreadMessages.php
2.1
KB
-rw-r--r--
2026-07-01 13:20
cstWeeksCourses.php
1.84
KB
-rw-r--r--
2026-08-14 12:06
load_phpmailer.php
742
B
-rw-r--r--
2026-07-17 14:57
maill.php
19.45
KB
-rw-r--r--
2026-08-19 12:23
require_ewmysql.php
1.2
KB
-rw-r--r--
2026-08-24 10:12
sqlFunctions.php
10.48
KB
-rw-r--r--
2026-08-24 10:12
Save
Rename
<?php /* * Contact otto@igotafrica.com for details */ include_once($_SERVER['DOCUMENT_ROOT'] . '/php/includes/BaseTableClass.php'); include_once($_SERVER['DOCUMENT_ROOT'] . '/php/includes/Utils.php'); /** * CCEMessages table access and message body formatting for portal views. * * @author Otto Saayman */ class CCEMessages extends BaseTableClass { public function findByMessagId($messageId, $userId) { global $conni; $sql = "SELECT * FROM CCEMessages WHERE CCEMessageID = " . mysqli_real_escape_string($conni, $messageId); return $this->sqlf->getRow($sql); } /** * Full HTML for read / view pages, with reply sections separated. * * @param string|null $messageText * @return string */ public function formatForDisplay($messageText) { if ($messageText === null || trim($messageText) === '') { return ''; } $segments = $this->splitMessageSegments($messageText); if (count($segments) === 0) { return ''; } $html = '<div class="cce-message-body">'; foreach ($segments as $index => $segment) { if (trim($segment) === '') { continue; } $class = 'cce-message-segment'; if ($index > 0) { $class .= ' cce-message-segment-reply'; } else { $class .= ' cce-message-segment-current'; } $html .= '<div class="' . $class . '">' . $this->formatBodySegment($segment) . '</div>'; } $html .= '</div>'; return $html; } /** * HTML quote block for reply/forward compose (CKEditor). * * @param string|null $messageText * @param string $sentDateTime * @param string $sentByName * @return string */ public function formatQuotedReplyForEditor($messageText, $sentDateTime, $sentByName) { $header = 'On ' . date('Y-m-d', strtotime($sentDateTime)) . ' ' . trim($sentByName) . ' wrote:'; return '<p> </p>' . '<p>---------------------------------------------------------</p>' . '<p><strong>' . htmlspecialchars($header, ENT_QUOTES, 'UTF-8') . '</strong></p>' . $this->formatEditorMessageBody($messageText); } /** * Message body HTML for editor insertion (plain text or well-formed HTML). * * @param string|null $messageText * @return string */ public function formatEditorMessageBody($messageText) { if ($messageText === null || trim($messageText) === '') { return ''; } $sanitized = sanitizeCceMessageHtml($messageText); if ($this->isRenderableHtmlMessage($sanitized)) { return $sanitized; } return $this->plainTextToEditorHtml(cleanHTMLMessageText($sanitized)); } /** * @param string $plainText * @return string */ protected function plainTextToEditorHtml($plainText) { if ($plainText === '') { return ''; } $plainText = str_replace(array("\r\n", "\r"), "\n", $plainText); $paragraphs = preg_split('/\n\s*\n/', $plainText); $html = ''; foreach ($paragraphs as $paragraph) { $paragraph = trim($paragraph); if ($paragraph === '') { continue; } $html .= '<p>' . nl2br(htmlspecialchars($paragraph, ENT_QUOTES, 'UTF-8')) . '</p>'; } return $html; } /** * Plain-text preview for list grids (escaped HTML, no tags). * * @param string|null $messageText * @param int $maxLength * @return string */ public function formatForListPreview($messageText, $maxLength = 150) { if ($messageText === null || trim($messageText) === '') { return ''; } $segments = $this->splitMessageSegments($messageText); $body = (count($segments) > 0) ? $segments[0] : $messageText; $plain = cleanHTMLMessageText($body); $plain = preg_replace('/\s+/u', ' ', $plain); $plain = trim($plain); if ($maxLength > 0 && strlen($plain) > $maxLength) { $plain = substr($plain, 0, $maxLength) . '...'; } return htmlspecialchars($plain, ENT_QUOTES, 'UTF-8'); } /** * Split a message on the standard reply delimiter (dashes + "On date name wrote:") * or, for older messages, on the reply header alone. * * @param string $messageText * @return array<int, string> */ public function splitMessageSegments($messageText) { $normalized = $this->normalizeForReplyParsing($messageText); if ($normalized === '') { return array(); } $matches = $this->findReplyDelimiterMatches($normalized); if (count($matches) === 0) { return array($normalized); } $segments = array(); $lastEnd = 0; foreach ($matches as $match) { $start = $match[1]; if ($start > $lastEnd) { $segments[] = substr($normalized, $lastEnd, $start - $lastEnd); } $lastEnd = $start; } if ($lastEnd < strlen($normalized)) { $segments[] = substr($normalized, $lastEnd); } return $segments; } /** * @param string $normalized * @return array<int, array{0:string,1:int}> */ protected function findReplyDelimiterMatches($normalized) { if (preg_match('/[-]{25,}/', $normalized)) { $pattern = '/(?:\n\s*[-]{25,}\s*\n|\s*[-]{25,}\s+)On \d{4}-\d{2}-\d{2} [^\n]+ wrote:\s*\n?/'; } else { $pattern = '/(?:\n\s+|\s+)On \d{4}-\d{2}-\d{2} [^\n]+ wrote:\s*\n?/'; } if (!preg_match_all($pattern, $normalized, $matches, PREG_OFFSET_CAPTURE)) { return array(); } return $matches[0]; } /** * @param string $segmentText * @return string */ protected function formatBodySegment($segmentText) { if ($segmentText === null || trim($segmentText) === '') { return ''; } $sanitized = sanitizeCceMessageHtml($segmentText); if ($this->isRenderableHtmlMessage($sanitized)) { return '<div class="cce-message-segment-body">' . $sanitized . '</div>'; } $plain = cleanHTMLMessageText($sanitized); if ($plain === '') { return ''; } return '<div class="cce-message-segment-body">' . $this->formatPlainTextAsHtml($plain) . '</div>'; } /** * True only for HTML that can be shown without orphan tags or escaped fragments. * * @param string $text * @return bool */ protected function isRenderableHtmlMessage($text) { if (!cceMessageLooksLikeHtml($text)) { return false; } if (preg_match('/<\/p>/i', $text) && !preg_match('/<p[\s>\/]/i', $text)) { return false; } if (preg_match('/<\/div>/i', $text) && !preg_match('/<div[\s>\/]/i', $text)) { return false; } if (preg_match('/<\/span>/i', $text) && !preg_match('/<span[\s>\/]/i', $text)) { return false; } return true; } /** * @param string $plainText * @return string */ protected function formatPlainTextAsHtml($plainText) { $html = htmlspecialchars($plainText, ENT_QUOTES, 'UTF-8'); $html = preg_replace( '/^(On \d{4}-\d{2}-\d{2} .+ wrote:)/m', '<div class="cce-message-reply-header">$1</div>', $html ); return nl2br($html); } /** * @param string $messageText * @return string */ protected function normalizeForReplyParsing($messageText) { $text = str_replace(array("\r\n", "\r"), "\n", $messageText); $text = preg_replace('/<br\s*\/?>/i', "\n", $text); $text = preg_replace('/<\/p>\s*<p[^>]*>/i', "\n\n", $text); $text = preg_replace('/<\/div>\s*<div[^>]*>/i', "\n", $text); return trim($text); } } function CCEMessages_Recordset_Selecting(&$objThis, &$filter) { // Handle complex custom view with aggregate functions // The issue is that the query uses aggregate functions and GROUP BY // We need to ensure any additional WHERE conditions are applied correctly // If there are additional filters, we need to handle them carefully // since the base query already has GROUP BY and aggregate functions // For now, we'll keep the original filter logic but ensure it's applied // to the correct table alias if ($filter <> "") { // Replace any table references with the correct alias } $sOrderBy = $objThis->getSessionOrderBy(); if ($sOrderBy == "") { $sOrderBy = "CCEMessageID DESC"; } $objThis->setSessionOrderBy($sOrderBy); }