golden hour
/home/doctorbruno/public_html/doctorbruno.info/taeionline/support/include
⬆️ Go Up
Upload
File/Folder
Size
Actions
.MANIFEST
194.97 KB
Del
OK
.htaccess
14 B
Del
OK
JSON.php
33.13 KB
Del
OK
PasswordHash.php
6.92 KB
Del
OK
Spyc.php
31.74 KB
Del
OK
UniversalClassLoader.php
8.61 KB
Del
OK
ajax.admin.php
7.29 KB
Del
OK
ajax.config.php
4.61 KB
Del
OK
ajax.content.php
9.76 KB
Del
OK
ajax.draft.php
13.03 KB
Del
OK
ajax.email.php
2.33 KB
Del
OK
ajax.export.php
1006 B
Del
OK
ajax.filter.php
874 B
Del
OK
ajax.forms.php
13.84 KB
Del
OK
ajax.i18n.php
5.1 KB
Del
OK
ajax.kbase.php
2.93 KB
Del
OK
ajax.note.php
2.05 KB
Del
OK
ajax.orgs.php
11.73 KB
Del
OK
ajax.plugins.php
2.15 KB
Del
OK
ajax.schedule.php
4.29 KB
Del
OK
ajax.search.php
12.72 KB
Del
OK
ajax.sequence.php
3.2 KB
Del
OK
ajax.staff.php
11.62 KB
Del
OK
ajax.tasks.php
33.87 KB
Del
OK
ajax.thread.php
8.81 KB
Del
OK
ajax.tickets.php
79.7 KB
Del
OK
ajax.tips.php
1.66 KB
Del
OK
ajax.upgrader.php
2.24 KB
Del
OK
ajax.users.php
18.33 KB
Del
OK
api.cron.php
1.06 KB
Del
OK
api.tickets.php
10.36 KB
Del
OK
class.2fa.php
7.76 KB
Del
OK
class.ajax.php
1.45 KB
Del
OK
class.api.php
15.31 KB
Del
OK
class.app.php
1.49 KB
Del
OK
class.attachment.php
6.95 KB
Del
OK
class.auth.php
50.73 KB
Del
OK
class.avatar.php
6.44 KB
Del
OK
class.banlist.php
2.58 KB
Del
OK
class.base32.php
4.07 KB
Del
OK
class.businesshours.php
7.08 KB
Del
OK
class.canned.php
9.05 KB
Del
OK
class.captcha.php
1.73 KB
Del
OK
class.category.php
11.14 KB
Del
OK
class.charset.php
3.41 KB
Del
OK
class.cli.php
9.48 KB
Del
OK
class.client.php
15.39 KB
Del
OK
class.collaborator.php
5.65 KB
Del
OK
class.company.php
2.65 KB
Del
OK
class.config.php
60.36 KB
Del
OK
class.controller.php
1.15 KB
Del
OK
class.cron.php
3.6 KB
Del
OK
class.crypto.php
18.92 KB
Del
OK
class.csrf.php
2.38 KB
Del
OK
class.dept.php
33.21 KB
Del
OK
class.dispatcher.php
7.12 KB
Del
OK
class.draft.php
6.23 KB
Del
OK
class.dynamic_forms.php
64.98 KB
Del
OK
class.email.php
49 KB
Del
OK
class.error.php
1.69 KB
Del
OK
class.export.php
32.92 KB
Del
OK
class.faq.php
15.05 KB
Del
OK
class.file.php
34.59 KB
Del
OK
class.filter.php
31.9 KB
Del
OK
class.filter_action.php
23.67 KB
Del
OK
class.format.php
44.3 KB
Del
OK
class.forms.php
195.58 KB
Del
OK
class.http.php
7.16 KB
Del
OK
class.i18n.php
24.28 KB
Del
OK
class.import.php
6.9 KB
Del
OK
class.json.php
2.71 KB
Del
OK
class.knowledgebase.php
5.8 KB
Del
OK
class.list.php
42 KB
Del
OK
class.lock.php
4.05 KB
Del
OK
class.log.php
1.55 KB
Del
OK
class.mail.php
35.76 KB
Del
OK
class.mailer.php
25.75 KB
Del
OK
class.mailfetch.php
9.72 KB
Del
OK
class.mailparse.php
30.99 KB
Del
OK
class.message.php
6.42 KB
Del
OK
class.migrater.php
5.2 KB
Del
OK
class.misc.php
7.5 KB
Del
OK
class.model.php
2.3 KB
Del
OK
class.nav.php
14.15 KB
Del
OK
class.note.php
2.39 KB
Del
OK
class.oauth2.php
4.04 KB
Del
OK
class.organization.php
22.45 KB
Del
OK
class.orm.php
120.9 KB
Del
OK
class.osticket.php
20.64 KB
Del
OK
class.ostsession.php
21.86 KB
Del
OK
class.page.php
10.59 KB
Del
OK
class.pagenate.php
5.53 KB
Del
OK
class.passwd.php
1.21 KB
Del
OK
class.pdf.php
3.83 KB
Del
OK
class.plugin.php
36.13 KB
Del
OK
class.priority.php
1.81 KB
Del
OK
class.queue.php
103.51 KB
Del
OK
class.report.php
11.76 KB
Del
OK
class.role.php
11.27 KB
Del
OK
class.schedule.php
46.28 KB
Del
OK
class.search.php
61.66 KB
Del
OK
class.sequence.php
7.27 KB
Del
OK
class.session.php
19.25 KB
Del
OK
class.setup.php
3.55 KB
Del
OK
class.signal.php
4.16 KB
Del
OK
class.sla.php
9.11 KB
Del
OK
class.staff.php
60.21 KB
Del
OK
class.task.php
56.21 KB
Del
OK
class.team.php
12.31 KB
Del
OK
class.template.php
23.45 KB
Del
OK
class.thread.php
108.96 KB
Del
OK
class.thread_actions.php
17.08 KB
Del
OK
class.ticket.php
167.39 KB
Del
OK
class.timezone.php
21.94 KB
Del
OK
class.topic.php
20.06 KB
Del
OK
class.translation.php
34.79 KB
Del
OK
class.upgrader.php
13.76 KB
Del
OK
class.user.php
43.4 KB
Del
OK
class.usersession.php
7.55 KB
Del
OK
class.util.php
10.07 KB
Del
OK
class.validator.php
12.94 KB
Del
OK
class.variable.php
11.93 KB
Del
OK
class.xml.php
3.23 KB
Del
OK
class.yaml.php
1.15 KB
Del
OK
cli
-
Del
OK
client
-
Del
OK
config
-
Del
OK
fpdf
-
Del
OK
htmLawed.php
53.53 KB
Del
OK
html2text.php
33.71 KB
Del
OK
i18n
-
Del
OK
index.php
37 B
Del
OK
laminas-mail
-
Del
OK
mpdf
-
Del
OK
mysqli.php
9.55 KB
Del
OK
ost-config.php
5.63 KB
Del
OK
ost-sampleconfig.php
6.24 KB
Del
OK
pear
-
Del
OK
plugins
-
Del
OK
staff
-
Del
OK
tnef_decoder.php
19.82 KB
Del
OK
upgrader
-
Del
OK
Edit: api.tickets.php
<?php include_once INCLUDE_DIR.'class.api.php'; include_once INCLUDE_DIR.'class.ticket.php'; class TicketApiController extends ApiController { # Supported arguments -- anything else is an error. These items will be # inspected _after_ the fixup() method of the ApiXxxDataParser classes # so that all supported input formats should be supported function getRequestStructure($format, $data=null) { $supported = array( "alert", "autorespond", "source", "topicId", "attachments" => array("*" => array("name", "type", "data", "encoding", "size") ), "message", "ip", "priorityId", "system_emails" => array( "*" => "*" ), "thread_entry_recipients" => array ( "*" => array("to", "cc") ) ); # Fetch dynamic form field names for the given help topic and add # the names to the supported request structure if (isset($data['topicId']) && ($topic = Topic::lookup($data['topicId'])) && ($forms = $topic->getForms())) { foreach ($forms as $form) foreach ($form->getDynamicFields() as $field) $supported[] = $field->get('name'); } # Ticket form fields # TODO: Support userId for existing user if(($form = TicketForm::getInstance())) foreach ($form->getFields() as $field) $supported[] = $field->get('name'); # User form fields if(($form = UserForm::getInstance())) foreach ($form->getFields() as $field) $supported[] = $field->get('name'); switch ($format) { case 'email': $supported = array_merge($supported, [ 'header', 'mid', 'emailId', 'to-email-id', 'ticketId', 'reply-to', 'reply-to-name', 'in-reply-to', 'references', 'thread-type', 'system_emails', 'mailflags' => ['bounce', 'auto-reply', 'spam', 'viral'], 'recipients' => ['*' => ['name', 'email', 'source']] ]); $supported['attachments']['*'][] = 'cid'; break; case 'json': case 'xml': $supported = array_merge($supported, [ 'duedate', 'slaId', 'staffId' ]); break; } return $supported; } /* Validate data - overwrites parent's validator for additional validations. */ function validate(&$data, $format, $strict=true) { global $ost; //Call parent to Validate the structure if(!parent::validate($data, $format, $strict) && $strict) $this->exerr(400, __('Unexpected or invalid data received')); // Use the settings on the thread entry on the ticket details // form to validate the attachments in the email $tform = TicketForm::objects()->one()->getForm(); $messageField = $tform->getField('message'); $fileField = $messageField->getWidget()->getAttachments(); // Nuke attachments IF API files are not allowed. if (!$messageField->isAttachmentsEnabled()) $data['attachments'] = array(); //Validate attachments: Do error checking... soft fail - set the error and pass on the request. if (isset($data['attachments']) && is_array($data['attachments'])) { foreach($data['attachments'] as &$file) { if ($file['encoding'] && !strcasecmp($file['encoding'], 'base64')) { if(!($file['data'] = base64_decode($file['data'], true))) $file['error'] = sprintf(__('%s: Poorly encoded base64 data'), Format::htmlchars($file['name'])); } // Validate and save immediately try { $F = $fileField->uploadAttachment($file); $file['id'] = $F->getId(); } catch (FileUploadError $ex) { $name = $file['name']; $file = array(); $file['error'] = Format::htmlchars($name) . ': ' . $ex->getMessage(); } } unset($file); } return true; } function create($format) { if (!($key=$this->requireApiKey()) || !$key->canCreateTickets()) return $this->exerr(401, __('API key not authorized')); $ticket = null; if (!strcasecmp($format, 'email')) { // Process remotely piped emails - could be a reply...etc. $ticket = $this->processEmailRequest(); } else { // Get and Parse request body data for the format $ticket = $this->createTicket($this->getRequest($format)); } if ($ticket) $this->response(201, $ticket->getNumber()); else $this->exerr(500, _S("unknown error")); } /* private helper functions */ function createTicket($data, $source = 'API') { # Pull off some meta-data $alert = (bool) (isset($data['alert']) ? $data['alert'] : true); $autorespond = (bool) (isset($data['autorespond']) ? $data['autorespond'] : true); // Assign default value to source if not defined, or defined as NULL $data['source'] ??= $source; // Create the ticket with the data (attempt to anyway) $errors = array(); if (($ticket = Ticket::create($data, $errors, $data['source'], $autorespond, $alert)) && !$errors) return $ticket; // Ticket create failed Bigly - got errors? $title = null; // Got errors? if (count($errors)) { // Ticket denied? Say so loudly so it can standout from generic // validation errors if (isset($errors['errno']) && $errors['errno'] == 403) { $title = _S('Ticket denied'); $error = sprintf("%s: %s\n\n%s", $title, $data['email'], $errors['err']); } else { // unpack the errors $error = Format::array_implode("\n", "\n", $errors); } } else { // unknown reason - default $error = _S('unknown error'); } $error = sprintf('%s :%s', _S('Unable to create new ticket'), $error); return $this->exerr($errors['errno'] ?: 500, $error, $title); } function processEmailRequest() { return $this->processEmail(); } function processEmail($data=false, array $defaults = []) { try { if (!$data) $data = $this->getEmailRequest(); elseif (!is_array($data)) $data = $this->parseEmail($data); } catch (Exception $ex) { throw new EmailParseError($ex->getMessage()); } $data = array_merge($defaults, $data); $seen = false; if (($entry = ThreadEntry::lookupByEmailHeaders($data, $seen)) && ($message = $entry->postEmail($data)) ) { if ($message instanceof ThreadEntry) { return $message->getThread()->getObject(); } else if ($seen) { // Email has been processed previously return $entry->getThread()->getObject(); } } // Allow continuation of thread without initial message or note elseif (($thread = Thread::lookupByEmailHeaders($data)) && ($message = $thread->postEmail($data)) ) { return $thread->getObject(); } // All emails which do not appear to be part of an existing thread // will always create new "Tickets". All other objects will need to // be created via the web interface or the API try { return $this->createTicket($data, 'Email'); } catch (TicketApiError $err) { // Check if the ticket was denied by a filter or banlist if ($err->isDenied() && $data['mid']) { // We need to log the Message-Id (mid) so we don't // process the same email again in subsequent fetches $entry = new ThreadEntry(); $entry->logEmailHeaders(0, $data['mid']); // throw TicketDenied exception so the caller can handle it // accordingly throw new TicketDenied($err->getMessage()); } else { // otherwise rethrow this bad baby as it is! throw $err; } } } } //Local email piping controller - no API key required! class PipeApiController extends TicketApiController { // Overwrite grandparent's (ApiController) response method. function response($code, $resp) { // It's important to use postfix exit codes for local piping instead // of HTTP's so the piping script can process them accordingly switch($code) { case 201: //Success $exitcode = 0; break; case 400: $exitcode = 66; break; case 401: /* permission denied */ case 403: $exitcode = 77; break; case 415: case 416: case 417: case 501: $exitcode = 65; break; case 503: $exitcode = 69; break; case 500: //Server error. default: //Temp (unknown) failure - retry $exitcode = 75; } //We're simply exiting - MTA will take care of the rest based on exit code! exit($exitcode); } static function process($sapi=null) { $pipe = new PipeApiController($sapi); if (($ticket=$pipe->processEmail())) return $pipe->response(201, is_object($ticket) ? $ticket->getNumber() : $ticket); return $pipe->exerr(416, __('Request failed - retry again!')); } static function local() { return self::process('cli'); } } class TicketApiError extends Exception { // Check if exception is because of denial public function isDenied() { return ($this->getCode() === 403); } } class TicketDenied extends Exception {} class EmailParseError extends Exception {} ?>
Save