1
0
Files
homelab-public-context/runtime/latest.txt
T

37 lines
49 KiB
Plaintext

CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-260918-GRAM-SUPPORT-SCREENSHOT-CONTENTTYPE-RCA-READONLY-516R6R2
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=gram-support-screenshot-contenttype-rca-readonly
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=ebcb50c8b6611004b35a22ff7b9d84652a06563de483931394a777d1fe34d9ba
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=0
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=5d03f3bf31b0f910209d8c1ee71b10d44c31a6abe2f2903eb50a69c18e873f4b
SANITIZED_OUTPUT_SHA256=5d03f3bf31b0f910209d8c1ee71b10d44c31a6abe2f2903eb50a69c18e873f4b
OUTPUT_BEGIN
GRAM516R6R2_SAFE_REPORT={"err_truncated":false,"guest":{"error":null,"file_count":51,"files":[{"bytes":2741,"path":"Service/GuestScreenshotService.php","present":true,"sha256":"9c0cbf49c4fca5a632a651a288063bc63f9a7ef85f04b32c96b96dd8c9e13e02","text":"<?php\n\nnamespace Gram\\Support\\Service;\n\nuse Gram\\Support\\Attachment\\TicketHandler;\nuse Gram\\Support\\Entity\\Ticket;\nuse XF\\Http\\Upload;\n\nfinal class GuestScreenshotService\n{\n private const CONTENT_TYPE = 'gram_support_ticket';\n\n public function prepareInitialUpload(Upload $upload, string $tempHash): int\n {\n if ($tempHash === '')\n {\n throw new \\InvalidArgumentException('Attachment temp hash must not be empty.');\n }\n\n $upload->setAllowedExtensions(['gif', 'jpeg', 'jpg', 'jpe', 'png', 'webp']);\n $upload->requireImage();\n\n $errors = [];\n if (!$upload->isValid($errors))\n {\n throw new \\InvalidArgumentException((string)(reset($errors) ?: 'Invalid screenshot.'));\n }\n\n /** @var \\XF\\Repository\\AttachmentRepository $attachmentRepo */\n $attachmentRepo = \\XF::repository('XF:Attachment');\n $handler = new TicketHandler(self::CONTENT_TYPE);\n\n $manipulator = new \\XF\\Attachment\\Manipulator(\n $handler,\n $attachmentRepo,\n [],\n $tempHash\n );\n\n $error = null;\n $attachment = $manipulator->insertAttachmentFromUpload($upload, $error);\n if (!$attachment)\n {\n throw new \\RuntimeException((string)($error ?: 'Screenshot upload failed.'));\n }\n\n return (int)$attachment->attachment_id;\n }\n\n public function associatePreparedUpload(\n string $tempHash,\n Ticket $ticket,\n int $attachmentId,\n bool $isInternal = false,\n int $messageId = 0\n ): int\n {\n if ($tempHash === '' || $attachmentId < 1 || !$ticket->ticket_id)\n {\n throw new \\InvalidArgumentException('Invalid screenshot association state.');\n }\n\n /** @var \\XF\\Service\\Attachment\\PreparerService $preparer */\n $preparer = \\XF::service(\\XF\\Service\\Attachment\\PreparerService::class);\n\n $associated = (int)$preparer->associateAttachmentsWithContent(\n $tempHash,\n self::CONTENT_TYPE,\n (int)$ticket->ticket_id\n );\n\n if ($associated < 1)\n {\n throw new \\RuntimeException('No screenshot attachment was associated.');\n }\n\n $meta = \\XF::em()->find('Gram\\Support:AttachmentMeta', $attachmentId);\n if (!$meta)\n {\n $meta = \\XF::em()->create('Gram\\Support:AttachmentMeta');\n $meta->attachment_id = $attachmentId;\n }\n\n $meta->ticket_id = (int)$ticket->ticket_id;\n $meta->message_id = max(0, $messageId);\n $meta->is_internal = $isInternal ? 1 : 0;\n $meta->created_date = \\XF::$time;\n $meta->save();\n\n return $associated;\n }\n}\n"},{"bytes":955,"path":"Service/GuestTicketCreateAttachmentFlow.php","present":true,"sha256":"8f4bf8ed6fa0244e6195d7f91bdbdfd0bc7c9ec7d88b1fe5111377a68b8c0266","text":"<?php\n\nnamespace Gram\\Support\\Service;\n\nuse Gram\\Support\\Entity\\Ticket;\nuse XF\\Http\\Upload;\n\nfinal class GuestTicketCreateAttachmentFlow\n{\n private GuestScreenshotService $screenshots;\n\n public function __construct()\n {\n $this->screenshots = new GuestScreenshotService();\n }\n\n public function prepare(?Upload $upload, string $tempHash): int\n {\n if (!$upload)\n {\n return 0;\n }\n\n return $this->screenshots->prepareInitialUpload($upload, $tempHash);\n }\n\n public function complete(\n ?Upload $upload,\n string $tempHash,\n Ticket $ticket,\n int $attachmentId\n ): void\n {\n if (!$upload || $attachmentId < 1)\n {\n return;\n }\n\n $this->screenshots->associatePreparedUpload(\n $tempHash,\n $ticket,\n $attachmentId,\n false,\n (int)$ticket->last_message_id\n );\n }\n}\n"},{"bytes":2689,"path":"Entity/Ticket.php","present":true,"sha256":"f322695057ada74af17de2498dd171c64c6be5bb7eb082388ad94301b13f9eae","text":"<?php\n\nnamespace Gram\\Support\\Entity;\n\nuse XF\\Mvc\\Entity\\Entity;\nuse XF\\Mvc\\Entity\\Structure;\n\nclass Ticket extends Entity\n{\n public static function getStructure(Structure $structure): Structure\n {\n $structure->table = 'xf_gram_support_ticket';\n $structure->shortName = 'Gram\\Support:Ticket';\n $structure->contentType = 'gram_support_ticket';\n $structure->primaryKey = 'ticket_id';\n $structure->columns = [\n 'ticket_id' => ['type' => self::UINT, 'autoIncrement' => true, 'nullable' => true],\n 'public_ref' => ['type' => self::STR, 'nullable' => false, 'maxLength' => 64],\n 'site_id' => ['type' => self::STR, 'nullable' => false, 'maxLength' => 32],\n 'user_id' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'guest_email' => ['type' => self::STR, 'default' => '', 'nullable' => false, 'maxLength' => 255],\n 'guest_access_token_hash' => ['type' => self::STR, 'default' => '', 'nullable' => false, 'maxLength' => 64],\n 'guest_access_expires' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'node_id' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'thread_id' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'post_id' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'category' => ['type' => self::STR, 'nullable' => false, 'maxLength' => 64],\n 'subject' => ['type' => self::STR, 'nullable' => false, 'maxLength' => 255],\n 'status' => ['type' => self::STR, 'nullable' => false, 'maxLength' => 32],\n 'assigned_user_id' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'created_date' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'updated_date' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'resolved_date' => ['type' => self::UINT, 'default' => 0, 'nullable' => false],\n 'context_json' => ['type' => self::STR, 'nullable' => false, 'default' => ''],\n 'last_message_id' => ['type' => self::UINT, 'default' => 0, 'nullable' => false]\n ];\n\n $structure->relations = [\n 'Attachments' => [\n 'entity' => 'XF:Attachment',\n 'type' => self::TO_MANY,\n 'conditions' => [\n ['content_type', '=', 'gram_support_ticket'],\n ['content_id', '=', '$ticket_id']\n ],\n 'with' => 'Data',\n 'order' => 'attach_date'\n ]\n ];\n\n return $structure;\n }\n}\n"},{"bytes":6301,"path":"Setup.php","present":true,"sha256":"4977f90ec0444e2e3a1e4ee9b79a4e88098c5a3ae37b30d63e77cff2e1fcb971","text":"<?php\nnamespace Gram\\Support;\n\nuse XF\\AddOn\\AbstractSetup;\nuse XF\\AddOn\\StepRunnerInstallTrait;\nuse XF\\AddOn\\StepRunnerUninstallTrait;\nuse XF\\AddOn\\StepRunnerUpgradeTrait;\n\nclass Setup extends AbstractSetup\n{\n use StepRunnerInstallTrait;\n use StepRunnerUpgradeTrait;\n use StepRunnerUninstallTrait;\n\n public function installStep1(): void\n {\n $sm = $this->schemaManager();\n $sm->createTable('xf_gram_support_ticket', function($table) {\n $table->addColumn('ticket_id', 'int')->unsigned()->autoIncrement();\n $table->addColumn('public_ref', 'varchar', 64);\n $table->addColumn('site_id', 'varchar', 32);\n $table->addColumn('user_id', 'int')->unsigned()->setDefault(0);\n $table->addColumn('guest_email', 'varchar', 255)->setDefault('');\n $table->addColumn('guest_access_token_hash', 'char', 64)->setDefault('');\n $table->addColumn('guest_access_expires', 'int')->unsigned()->setDefault(0);\n $table->addColumn('node_id', 'int')->unsigned()->setDefault(0);\n $table->addColumn('thread_id', 'int')->unsigned()->setDefault(0);\n $table->addColumn('post_id', 'int')->unsigned()->setDefault(0);\n $table->addColumn('category', 'varchar', 64)->setDefault('');\n $table->addColumn('subject', 'varchar', 255)->setDefault('');\n $table->addColumn('status', 'varchar', 32)->setDefault('NEW');\n $table->addColumn('assigned_user_id', 'int')->unsigned()->setDefault(0);\n $table->addColumn('created_date', 'int')->unsigned()->setDefault(0);\n $table->addColumn('updated_date', 'int')->unsigned()->setDefault(0);\n $table->addColumn('resolved_date', 'int')->unsigned()->setDefault(0);\n $table->addColumn('context_json', 'mediumtext');\n $table->addColumn('last_message_id', 'int')->unsigned()->setDefault(0);\n $table->addPrimaryKey('ticket_id');\n $table->addUniqueKey('public_ref');\n $table->addKey('guest_access_token_hash', 'guest_token_hash');\n $table->addKey(['site_id','user_id','updated_date'], 'site_user_updated');\n $table->addKey(['site_id','status','updated_date'], 'site_status_updated');\n });\n $sm->createTable('xf_gram_support_message', function($table) {\n $table->addColumn('message_id', 'int')->unsigned()->autoIncrement();\n $table->addColumn('ticket_id', 'int')->unsigned();\n $table->addColumn('user_id', 'int')->unsigned()->setDefault(0);\n $table->addColumn('is_staff', 'tinyint')->unsigned()->setDefault(0);\n $table->addColumn('is_internal', 'tinyint')->unsigned()->setDefault(0);\n $table->addColumn('message', 'mediumtext');\n $table->addColumn('message_date', 'int')->unsigned()->setDefault(0);\n $table->addPrimaryKey('message_id');\n $table->addKey(['ticket_id','message_date'], 'ticket_date');\n $table->addKey(['ticket_id','is_internal','message_date'], 'ticket_public_date');\n });\n $sm->createTable('xf_gram_support_event', function($table) {\n $table->addColumn('event_id', 'int')->unsigned()->autoIncrement();\n $table->addColumn('ticket_id', 'int')->unsigned();\n $table->addColumn('site_id', 'varchar', 32);\n $table->addColumn('actor_user_id', 'int')->unsigned()->setDefault(0);\n $table->addColumn('event_type', 'varchar', 64);\n $table->addColumn('event_date', 'int')->unsigned()->setDefault(0);\n $table->addColumn('safe_payload_json', 'mediumtext');\n $table->addPrimaryKey('event_id');\n $table->addKey(['ticket_id','event_date'], 'ticket_date');\n });\n\n $sm->createTable('xf_gram_support_attachment_meta', function($table) {\n $table->addColumn('attachment_id', 'int')->unsigned();\n $table->addColumn('ticket_id', 'int')->unsigned();\n $table->addColumn('message_id', 'int')->unsigned()->setDefault(0);\n $table->addColumn('is_internal', 'tinyint')->unsigned()->setDefault(0);\n $table->addColumn('created_date', 'int')->unsigned()->setDefault(0);\n $table->addPrimaryKey('attachment_id');\n $table->addKey(['ticket_id','is_internal'], 'ticket_internal');\n $table->addKey('message_id');\n });\n $sm->createTable('xf_gram_support_delivery', function($table) {\n $table->addColumn('delivery_key', 'char', 64);\n $table->addColumn('event_id', 'int')->unsigned();\n $table->addColumn('consumer', 'varchar', 32);\n $table->addColumn('recipient_key', 'varchar', 96);\n $table->addColumn('state', 'varchar', 16)->setDefault('pending');\n $table->addColumn('lease_expires', 'int')->unsigned()->setDefault(0);\n $table->addColumn('attempt_count', 'int')->unsigned()->setDefault(0);\n $table->addColumn('last_failure_class', 'varchar', 191)->setDefault('');\n $table->addColumn('created_date', 'int')->unsigned()->setDefault(0);\n $table->addColumn('updated_date', 'int')->unsigned()->setDefault(0);\n $table->addColumn('sent_date', 'int')->unsigned()->setDefault(0);\n $table->addPrimaryKey('delivery_key');\n $table->addKey(['event_id','consumer'], 'event_consumer');\n $table->addKey(['state','lease_expires'], 'state_lease');\n });\n $sm->createTable('xf_gram_support_rate_limit', function($table) {\n $table->addColumn('rate_key', 'char', 64);\n $table->addColumn('window_start', 'int')->unsigned();\n $table->addColumn('hit_count', 'int')->unsigned()->setDefault(0);\n $table->addColumn('updated_date', 'int')->unsigned()->setDefault(0);\n $table->addPrimaryKey('rate_key');\n $table->addKey('updated_date');\n });\n }\n\n public function uninstallStep1(): void\n {\n $sm = $this->schemaManager();\n foreach (['xf_gram_support_attachment_meta','xf_gram_support_delivery','xf_gram_support_rate_limit','xf_gram_support_event','xf_gram_support_message','xf_gram_support_ticket'] as $name) {\n $sm->dropTable($name);\n }\n }\n}\n"},{"bytes":212,"path":"_data/content_type_fields.xml","present":true,"sha256":"6f9760bc6cc3c78aaec3a1ad68bcbc180d6cd4d2ef30830a4dc3b7b500a0cc97","text":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<content_type_fields>\n <field content_type=\"gram_support_ticket\" field_name=\"attachment_handler_class\">Gram\\Support\\Attachment\\TicketHandler</field>\n</content_type_fields>\n"},{"bytes":26547,"matches":[{"sep":true},{"line":616,"text":"\tconst request = event.request;"},{"line":617,"text":"\tif (request.method !== 'GET') {"},{"line":618,"text":"\t\treturn;"},{"line":619,"text":"\t}"},{"line":620,"text":""},{"line":621,"text":"\tconst url = new URL(request.url);"},{"line":622,"text":"\tif (url.origin !== self.location.origin) {"},{"line":623,"text":"\t\treturn;"},{"line":624,"text":"\t}"},{"line":625,"text":""},{"line":626,"text":"\t// SECURITY: all support/ticket/account/admin-like content is network-only."},{"line":627,"text":"\t// Never cache HTML/API responses that can contain ticket data, identities,"},{"line":628,"text":"\t// access state, internal notes, attachments or staff-only information."},{"line":629,"text":"\tconst sensitive ="},{"line":630,"text":"\t\turl.pathname.startsWith('/support/') ||"},{"line":631,"text":"\t\turl.pathname.startsWith('/account/') ||"},{"line":632,"text":"\t\turl.pathname.startsWith('/admin.php') ||"},{"line":633,"text":"\t\trequest.headers.get('accept')?.includes('text/html');"},{"line":634,"text":""},{"line":635,"text":"\tif (sensitive) {"},{"line":636,"text":"\t\tevent.respondWith("},{"line":637,"text":"\t\t\tfetch(request, {cache: 'no-store'}).catch(() =&gt; {"},{"line":638,"text":"\t\t\t\tif (request.mode === 'navigate') {"},{"line":639,"text":"\t\t\t\t\treturn caches.match(OFFLINE_URL);"},{"line":640,"text":"\t\t\t\t}"},{"sep":true},{"line":676,"text":"\t\t\t\t\t&lt;div class=\"gramSupport-messageMeta\"&gt;"},{"line":677,"text":"\t\t\t\t\t\t{{ date_time($message.message_date) }}"},{"line":678,"text":"\t\t\t\t\t\t&lt;xf:if is=\"$message.is_internal\"&gt; \u00b7 {{ phrase('gram_support_internal_note') }}&lt;/xf:if&gt;"},{"line":679,"text":"\t\t\t\t\t&lt;/div&gt;"},{"line":680,"text":"\t\t\t\t\t&lt;div class=\"gramSupport-messageBody\"&gt;{$message.message}&lt;/div&gt;"},{"line":681,"text":"\t\t\t\t&lt;/div&gt;"},{"line":682,"text":"\t\t\t&lt;/xf:foreach&gt;"},{"line":683,"text":"\t\t&lt;/div&gt;"},{"line":684,"text":"\t&lt;/div&gt;"},{"line":685,"text":"&lt;/div&gt;"},{"line":686,"text":""},{"line":687,"text":""},{"line":688,"text":"&lt;xf:if is=\"$ticket.Attachments is not empty\"&gt;"},{"line":689,"text":"\t&lt;div class=\"block\"&gt;"},{"line":690,"text":"\t\t&lt;div class=\"block-container\"&gt;"},{"line":691,"text":"\t\t\t&lt;h3 class=\"block-minorHeader\"&gt;{{ phrase('gram_support_attachments') }}&lt;/h3&gt;"},{"line":692,"text":"\t\t\t&lt;div class=\"block-body\"&gt;"},{"line":693,"text":"\t\t\t\t&lt;xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\"&gt;"},{"line":694,"text":"\t\t\t\t\t&lt;div class=\"block-row\"&gt;"},{"line":695,"text":"\t\t\t\t\t\t&lt;a href=\"{{ link('attachments', $attachment) }}\"&gt;{$attachment.filename}&lt;/a&gt;"},{"line":696,"text":"\t\t\t\t\t&lt;/div&gt;"},{"line":697,"text":"\t\t\t\t&lt;/xf:foreach&gt;"},{"line":698,"text":"\t\t\t&lt;/div&gt;"},{"line":699,"text":"\t\t&lt;/div&gt;"},{"line":700,"text":"\t&lt;/div&gt;"},{"line":701,"text":"&lt;/xf:if&gt;"},{"line":702,"text":""},{"line":703,"text":"&lt;xf:form action=\"{{ link('support/staff/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\"&gt;"},{"line":704,"text":"\t&lt;div class=\"block-container\"&gt;"},{"line":705,"text":"\t\t&lt;div class=\"block-body\"&gt;"},{"line":706,"text":"\t\t\t&lt;xf:textarearow name=\"message\" required=\"required\" rows=\"6\" label=\"{{ phrase('gram_support_reply') }}\" /&gt;"},{"line":707,"text":"\t\t\t&lt;xf:if is=\"$xf.visitor.hasPermission('gramSupport', 'internalNotes')\"&gt;"},{"sep":true},{"line":720,"text":"\t\t\t&lt;xf:selectrow name=\"status\" value=\"{$ticket.status}\" label=\"{{ phrase('gram_support_status') }}\"&gt;"},{"line":721,"text":"\t\t\t\t&lt;xf:foreach loop=\"$statusOptions\" value=\"$status\"&gt;"},{"line":722,"text":"\t\t\t\t\t&lt;xf:option value=\"{$status}\"&gt;{{ $status == 'NEW' ? '\u041d\u043e\u0432\u044b\u0439' : ($status == 'IN_PROGRESS' ? '\u0412 \u0440\u0430\u0431\u043e\u0442\u0435' : ($status == 'WAITING_USER' ? '\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f' : ($status == 'RESOLVED' ? '\u0420\u0435\u0448\u0451\u043d' : ($status == 'CLOSED' ? '\u0417\u0430\u043a\u0440\u044b\u0442' : $status)))) }}&lt;/xf:option&gt;"},{"line":723,"text":"\t\t\t\t&lt;/xf:foreach&gt;"},{"line":724,"text":"\t\t\t&lt;/xf:selectrow&gt;"},{"line":725,"text":"\t\t\t&lt;xf:textboxrow name=\"assigned_user_id\" type=\"number\" value=\"{$ticket.assigned_user_id}\""},{"line":726,"text":"\t\t\t\tlabel=\"{{ phrase('gram_support_assigned_user_id') }}\" /&gt;"},{"line":727,"text":"\t\t&lt;/div&gt;"},{"line":728,"text":"\t\t&lt;xf:submitrow submit=\"{{ phrase('save') }}\" /&gt;"},{"line":729,"text":"\t&lt;/div&gt;"},{"line":730,"text":"&lt;/xf:form&gt;"},{"line":731,"text":"</template>"},{"line":732,"text":" <template type=\"public\" title=\"gram_support_ticket\" version_id=\"1000050\" version_string=\"1.0.0 Alpha 3 Unified Fix 3\">&lt;xf:title&gt;{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}&lt;/xf:title&gt;"},{"line":733,"text":"&lt;xf:css src=\"gram_support.less\" /&gt;"},{"line":734,"text":""},{"line":735,"text":"&lt;div class=\"block\"&gt;"},{"line":736,"text":"\t&lt;div class=\"block-container\"&gt;"},{"line":737,"text":"\t\t&lt;h2 class=\"block-header\"&gt;{{ $ticket.public_ref }}&lt;/h2&gt;"},{"line":738,"text":"\t\t&lt;div class=\"block-body\"&gt;"},{"line":739,"text":"\t\t\t&lt;div class=\"block-row\"&gt;"},{"line":740,"text":"\t\t\t\t&lt;strong&gt;{{ phrase('gram_support_status') }}:&lt;/strong&gt; &lt;xf:if is=\"$ticket.status == 'NEW'\"&gt;\u041d\u043e\u0432\u044b\u0439"},{"line":741,"text":"&lt;xf:elseif is=\"$ticket.status == 'IN_PROGRESS'\" /&gt;\u0412 \u0440\u0430\u0431\u043e\u0442\u0435"},{"line":742,"text":"&lt;xf:elseif is=\"$ticket.status == 'WAITING_USER'\" /&gt;\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f"},{"line":743,"text":"&lt;xf:elseif is=\"$ticket.status == 'RESOLVED'\" /&gt;\u0420\u0435\u0448\u0451\u043d"},{"line":744,"text":"&lt;xf:elseif is=\"$ticket.status == 'CLOSED'\" /&gt;\u0417\u0430\u043a\u0440\u044b\u0442"},{"sep":true},{"line":747,"text":"\t\t\t&lt;/div&gt;"},{"line":748,"text":"\t\t\t&lt;xf:foreach loop=\"$messages\" value=\"$message\"&gt;"},{"line":749,"text":"\t\t\t\t&lt;div class=\"block-row gramSupport-message\"&gt;"},{"line":750,"text":"\t\t\t\t\t&lt;div class=\"gramSupport-messageMeta\"&gt;{{ date_time($message.message_date) }}&lt;/div&gt;"},{"line":751,"text":"\t\t\t\t\t&lt;div class=\"gramSupport-messageBody\"&gt;{$message.message}&lt;/div&gt;"},{"line":752,"text":"\t\t\t\t&lt;/div&gt;"},{"line":753,"text":"\t\t\t&lt;/xf:foreach&gt;"},{"line":754,"text":"\t\t&lt;/div&gt;"},{"line":755,"text":"\t&lt;/div&gt;"},{"line":756,"text":"&lt;/div&gt;"},{"line":757,"text":""},{"line":758,"text":""},{"line":759,"text":"&lt;xf:if is=\"$ticket.Attachments is not empty\"&gt;"},{"line":760,"text":"\t&lt;div class=\"block\"&gt;"},{"line":761,"text":"\t\t&lt;div class=\"block-container\"&gt;"},{"line":762,"text":"\t\t\t&lt;h3 class=\"block-minorHeader\"&gt;{{ phrase('gram_support_attachments') }}&lt;/h3&gt;"},{"line":763,"text":"\t\t\t&lt;div class=\"block-body\"&gt;"},{"line":764,"text":"\t\t\t\t&lt;xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\"&gt;"},{"line":765,"text":"\t\t\t\t\t&lt;div class=\"block-row\"&gt;"},{"line":766,"text":"\t\t\t\t\t\t&lt;a href=\"{{ link('attachments', $attachment) }}\"&gt;{$attachment.filename}&lt;/a&gt;"},{"line":767,"text":"\t\t\t\t\t&lt;/div&gt;"},{"line":768,"text":"\t\t\t\t&lt;/xf:foreach&gt;"},{"line":769,"text":"\t\t\t&lt;/div&gt;"},{"line":770,"text":"\t\t&lt;/div&gt;"},{"line":771,"text":"\t&lt;/div&gt;"},{"line":772,"text":"&lt;/xf:if&gt;"},{"line":773,"text":""},{"line":774,"text":"&lt;xf:if is=\"$ticket.status != 'CLOSED'\"&gt;"},{"line":775,"text":"\t&lt;xf:form action=\"{{ link('support/reply', null, {'ref': $ticket.public_ref}) }}\" method=\"post\" class=\"block\"&gt;"},{"line":776,"text":"\t\t&lt;div class=\"block-container\"&gt;"},{"line":777,"text":"\t\t\t&lt;div class=\"block-body\"&gt;"},{"line":778,"text":"\t\t\t\t&lt;xf:textarearow name=\"message\" required=\"required\" rows=\"6\""},{"line":779,"text":"\t\t\t\t\tlabel=\"{{ phrase('gram_support_reply') }}\" /&gt;"},{"line":780,"text":"\t\t\t&lt;/div&gt;"},{"line":781,"text":"\t\t\t&lt;xf:submitrow submit=\"{{ phrase('gram_support_send') }}\" /&gt;"},{"line":782,"text":"\t\t&lt;/div&gt;"},{"line":783,"text":"\t&lt;/xf:form&gt;"},{"line":784,"text":"&lt;/xf:if&gt;"},{"line":785,"text":"</template>"},{"line":786,"text":" <template type=\"email\" title=\"gram_support_ticket_event\" version_id=\"1000050\" version_string=\"1.0.0 Alpha 3 Unified Fix 3\">&lt;mail:subject&gt;"},{"line":787,"text":"\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":788,"text":"&lt;/mail:subject&gt;"},{"line":789,"text":""},{"line":790,"text":"{{ phrase('gram_support_email_ticket_event_body_registered', {"},{"line":791,"text":"\t'public_ref': $ticket.public_ref"},{"line":792,"text":"}) }}"},{"line":793,"text":"</template>"},{"line":794,"text":" <template type=\"email\" title=\"gram_support_ticket_event_guest\" version_id=\"1000050\" version_string=\"1.0.0 Alpha 3 Unified Fix 3\">&lt;mail:subject&gt;"},{"line":795,"text":"\t{{ phrase('gram_support_email_ticket_event_subject', {'public_ref': $ticket.public_ref}) }}"},{"line":796,"text":"&lt;/mail:subject&gt;"},{"line":797,"text":""},{"line":798,"text":"{{ phrase('gram_support_email_ticket_event_body_guest', {"},{"line":799,"text":"\t'public_ref': $ticket.public_ref,"},{"line":800,"text":"\t'access_url': $accessUrl"},{"line":801,"text":"}) }}"},{"line":802,"text":"</template>"},{"line":803,"text":"</templates>"}],"path":"_data/templates.xml","present":true,"sha256":"04ed000e02dd040f0587cf276f8c2ad332b568c951b58bd5767df78406e10239"},{"bytes":6986,"path":"hashes.json","present":true,"sha256":"bb009f37cf73670d20a66d18931a0344a648b6a44305094e0278960bfbfe2b65","text":"{\n \"js/gram/support/access.js\": \"4140aef30c7c39d102af5efd64d38dae54b810945d96faa8884fd00eaab31358\",\n \"js/gram/support/access.min.js\": \"4140aef30c7c39d102af5efd64d38dae54b810945d96faa8884fd00eaab31358\",\n \"js/gram/support/pwa/icon-192.png\": \"1c52e67c4a4963f3a134f9cea0a695702eae06ed2e62ccacd67f2efa2bc692e2\",\n \"js/gram/support/pwa/icon-512.png\": \"66f60c10b8c7d67e432c9fb701c1cde6130e4bc18788a7d9c470c0c6fdd9cfd4\",\n \"js/gram/support/pwa/manifest.webmanifest\": \"49224d92b3a98f447b63e1f4a1a14c106e31a9392b202826979f7d9391a03732\",\n \"js/gram/support/pwa/offline.html\": \"7cbf2c5efa2cf3e5bb479d01e1b1b68f45fa0877de6a5f867c34ea6a312e6901\",\n \"js/gram/support/staff-pwa.js\": \"026b270bee0103d42c2881017b885bd2c6ad67b9482b323fbd5a2297dbd4247c\",\n \"js/gram/support/staff-pwa.min.js\": \"026b270bee0103d42c2881017b885bd2c6ad67b9482b323fbd5a2297dbd4247c\",\n \"src/addons/Gram/Support/Attachment/TicketHandler.php\": \"0def74cda843a56cdea03a8f9c40156a86424de6a09ce64ced655e5f0458361a\",\n \"src/addons/Gram/Support/Entity/AttachmentMeta.php\": \"e19fbc558741df7fbad0b1cbd68b6f1c149db4544deb97bfd9432d6c44c27b5d\",\n \"src/addons/Gram/Support/Entity/Delivery.php\": \"034fa397e67003884d197908a0b4ba968aea4832684c9e12aeff495c4378e551\",\n \"src/addons/Gram/Support/Entity/Message.php\": \"f8a38d779917d577a3c17ecdb4606505bdd4f1588a091e8f89f775c7c60c8342\",\n \"src/addons/Gram/Support/Entity/RateLimit.php\": \"d964076da9a290c505bf0798b00b6a9677520d4a925b8771f066d48b3c516783\",\n \"src/addons/Gram/Support/Entity/SupportEvent.php\": \"b9c68bda7488e167cf437061e547646db27b60976d8a2d2ae39d8cb914223723\",\n \"src/addons/Gram/Support/Entity/Ticket.php\": \"f322695057ada74af17de2498dd171c64c6be5bb7eb082388ad94301b13f9eae\",\n \"src/addons/Gram/Support/Listener/SourcePageContext.php\": \"25e449317b7b48959aad49e1b73f785c84d0e14bd9d6fa55d7e3cb8ac074b253\",\n \"src/addons/Gram/Support/Notification/AlertConsumer.php\": \"e22d0cdb0a0806c6a231504409bd17cd781caab0f28181aff7246b0295d8cd98\",\n \"src/addons/Gram/Support/Notification/DeliveryGate.php\": \"32447f0066a3153e241424ef6f87459ad9aa067c389a693cc98a21498bbd5d7b\",\n \"src/addons/Gram/Support/Notification/Dispatcher.php\": \"faa370b6b2abda1defa4a1d49aeb448a5f16f8013add4cd1975cc3b65eecda2b\",\n \"src/addons/Gram/Support/Notification/EmailConsumer.php\": \"d1928ebb89483fbc59ac0323cfaabb064e8e6281d4927666c63568ac540e7a34\",\n \"src/addons/Gram/Support/Notification/EntityDeliveryGate.php\": \"188ddc86845c0cef16d1749a2bc6824c199a5d99dd9acbbc610b8e23439ec4f4\",\n \"src/addons/Gram/Support/Notification/EventDispatcher.php\": \"7b5be9cd2421aa365a618687e7af43e2d8320515bd85f90a23877c30c92b0817\",\n \"src/addons/Gram/Support/Notification/Policy.php\": \"5fb1f224ab1064f18bb7e8ab9fa7cc4f77c6587ea9a01c7f48c81186e4c618ed\",\n \"src/addons/Gram/Support/Notification/RecipientKey.php\": \"23d7a6793221011de7af02bcac796c8418748758ef3c4185406deaca90a76529\",\n \"src/addons/Gram/Support/Pub/Controller/AccountSupport.php\": \"236e648a240a3bde2721f3d9355ce0c48f81a0b727407e08cbaa563ae2df1dfd\",\n \"src/addons/Gram/Support/Pub/Controller/Pwa.php\": \"9e3217d9524349a8137b89d418e4693ca17f8e5f61ba5b563fff747d1014efb3\",\n \"src/addons/Gram/Support/Pub/Controller/StaffSupport.php\": \"6852bd0061d6e118851673bfd4099e2b22e6291bf09f429820740844996f93f9\",\n \"src/addons/Gram/Support/Pub/Controller/Support.php\": \"6cb34b1d27e9f0132263637cefa62fe0e998a9a86620b7ac33199f41ee86f9d4\",\n \"src/addons/Gram/Support/Pub/View/PwaServiceWorker.php\": \"4bf365039b6deeb476d2137cdea27b5c463f15c54e370e607251db0643c46ae3\",\n \"src/addons/Gram/Support/Repository/Message.php\": \"bd077eaf7070f3c2b23259f51bd98788db4ca5a6efc6fedf98772159fbcd6e19\",\n \"src/addons/Gram/Support/Repository/Ticket.php\": \"051b470f486fccbddf881779327b03f0c804462c4d47de3a11e0ffb62352aad7\",\n \"src/addons/Gram/Support/Security/GuestTicketSession.php\": \"9637043a10b7f2806c50ee9da04ea076d25a6924d7636b0533a2ea59212975e1\",\n \"src/addons/Gram/Support/Security/TicketAccess.php\": \"f486abd65893052dbaafad550ad0d147ba638661e0e7ed73d7e2b3e046bec4a5\",\n \"src/addons/Gram/Support/Service/GuestScreenshotService.php\": \"9c0cbf49c4fca5a632a651a288063bc63f9a7ef85f04b32c96b96dd8c9e13e02\",\n \"src/addons/Gram/Support/Service/GuestTicketCreateAttachmentFlow.php\": \"8f4bf8ed6fa0244e6195d7f91bdbdfd0bc7c9ec7d88b1fe5111377a68b8c0266\",\n \"src/addons/Gram/Support/Service/RateLimiter.php\": \"266b3b39785ae5272f478d3fed527850bda2526fc70ac5122ff663f1c702a360\",\n \"src/addons/Gram/Support/Service/SourceContextResolver.php\": \"a66215ecabacbbad8daa8f1fef95a541a5d6863df2ab977a714737c0a2a76c95\",\n \"src/addons/Gram/Support/Service/Ticket/Creator.php\": \"7a84cd77761a7943495f9d3ef11269987f85265170ad6cf927a1661b8bf0a99a\",\n \"src/addons/Gram/Support/Service/Ticket/Reply.php\": \"482571a2ccf07a3c8672f34940243264a8271ef8c3cbc4fadbb46112afd36830\",\n \"src/addons/Gram/Support/Service/Ticket/StaffUpdate.php\": \"400596fbe4d2f990a5301973318b65f20f2618a34e6b202d975c62bd252eabdf\",\n \"src/addons/Gram/Support/Setup.php\": \"4977f90ec0444e2e3a1e4ee9b79a4e88098c5a3ae37b30d63e77cff2e1fcb971\",\n \"src/addons/Gram/Support/Util/GuestToken.php\": \"4c82936658fa7ca351f5d3d106f82bf49365f571e0fbb53e15de72bc22a746b8\",\n \"src/addons/Gram/Support/Util/PublicRef.php\": \"4dfc846870192d175941546192deaf6dfb68306401b8a368b166975ec67b11a2\",\n \"src/addons/Gram/Support/Util/RateKey.php\": \"cdf0588dff095dbeb89c1ed6e2b12af583c0f6bca2d66de7390e224045c0eac9\",\n \"src/addons/Gram/Support/Util/SafeContext.php\": \"edd58d3135b05cd85d393d3e6f674601d530fb38d9667dbab0e4ddba7db78519\",\n \"src/addons/Gram/Support/Util/SiteConfig.php\": \"db246e35b477c55d4fb1d464b0de0829a91e09ed42058bf704d667ae7b23e3b8\",\n \"src/addons/Gram/Support/Util/StatusPolicy.php\": \"356f4b24d4b2a562105d3c7cc4f83ce198be11d15770c71ec2bf1d9ca43310f7\",\n \"src/addons/Gram/Support/_data/code_event_listeners.xml\": \"b61eea171404d5a64dd639aa6432af83b9dca4d3cab040eaa0496780e9fa34a2\",\n \"src/addons/Gram/Support/_data/content_type_fields.xml\": \"6f9760bc6cc3c78aaec3a1ad68bcbc180d6cd4d2ef30830a4dc3b7b500a0cc97\",\n \"src/addons/Gram/Support/_data/option_groups.xml\": \"357e532805c40e424fec654349241ecb322e1cb8ee2560f9abb964f10a55cdda\",\n \"src/addons/Gram/Support/_data/options.xml\": \"499d0a3b543eb838d5497f2da1b0cd13e5510e9f7e10aded7b06cb422cab8143\",\n \"src/addons/Gram/Support/_data/permission_interface_groups.xml\": \"f54be0d872f43813e0f57d75a73420da70d37091f408d3cbdf9e943d4f67c1ad\",\n \"src/addons/Gram/Support/_data/permissions.xml\": \"c0cf9d60702b670355f3f0928e0afde20a5c7becf065536c3487289211a4bbee\",\n \"src/addons/Gram/Support/_data/phrases.xml\": \"ea6e84de301145312758285cfcd63ee4c12b8e921877bcde15c17dd4c115c434\",\n \"src/addons/Gram/Support/_data/routes.xml\": \"c80e6b0f7153993915d8bbc8ee6b36e6386b00bb1865d6aff050f9c1fd1f0302\",\n \"src/addons/Gram/Support/_data/template_modifications.xml\": \"04f338a8107a80bd3c17b6f6888faea596a5057140556ce6f4f1673d2034628b\",\n \"src/addons/Gram/Support/_data/templates.xml\": \"04ed000e02dd040f0587cf276f8c2ad332b568c951b58bd5767df78406e10239\",\n \"src/addons/Gram/Support/addon.json\": \"566f1739937088517f5ef0dd2d20bc92460084028180c16502931fa86057aea5\"\n}\n"}],"occurrences":[{"bytes":3232,"hit_count":18,"hits":[{"line":3,"text":"namespace Gram\\Support\\Attachment;"},{"line":5,"text":"use Gram\\Support\\Entity\\Ticket;"},{"line":7,"text":"use XF\\Entity\\Attachment;"},{"line":8,"text":"use XF\\Mvc\\Entity\\Entity;"},{"line":10,"text":"class TicketHandler extends \\XF\\Attachment\\AbstractHandler"},{"line":12,"text":" public function canView(Attachment $attachment, Entity $container, &$error = null)"},{"line":19,"text":" $meta = \\XF::em()->find('Gram\\Support:AttachmentMeta', (int)$attachment->attachment_id);"},{"line":40,"text":" public function canManageAttachments(array $context, &$error = null)"},{"line":56,"text":" return TicketAccess::canManageAttachments($ticket, \\XF::visitor());"},{"line":59,"text":" public function onAttachmentDelete(Attachment $attachment, Entity $container = null)"},{"line":61,"text":" $meta = \\XF::em()->find('Gram\\Support:AttachmentMeta', (int)$attachment->attachment_id);"},{"line":70,"text":" $constraints = \\XF::repository('XF:Attachment')->getDefaultAttachmentConstraints();"},{"line":80,"text":" public function getContainerLink(Entity $container, array $extraParams = [])"},{"line":96,"text":" public function getContext(Entity $entity = null, array $extraContext = [])"},{"line":98,"text":" if ($entity instanceof Ticket)"},{"line":100,"text":" $extraContext['ticket_id'] = (int)$entity->ticket_id;"},{"line":104,"text":" if ($entity === null)"},{"line":109,"text":" throw new \\InvalidArgumentException('Entity must be a support ticket.');"}],"path":"Attachment/TicketHandler.php","sha256":"0def74cda843a56cdea03a8f9c40156a86424de6a09ce64ced655e5f0458361a"},{"bytes":884,"hit_count":8,"hits":[{"line":3,"text":"namespace Gram\\Support\\Entity;"},{"line":5,"text":"use XF\\Mvc\\Entity\\Entity;"},{"line":6,"text":"use XF\\Mvc\\Entity\\Structure;"},{"line":8,"text":"class AttachmentMeta extends Entity"},{"line":12,"text":" $structure->table = 'xf_gram_support_attachment_meta';"},{"line":13,"text":" $structure->shortName = 'Gram\\Support:AttachmentMeta';"},{"line":14,"text":" $structure->primaryKey = 'attachment_id';"},{"line":16,"text":" 'attachment_id' => ['type' => self::UINT, 'nullable' => false],"}],"path":"Entity/AttachmentMeta.php","sha256":"e19fbc558741df7fbad0b1cbd68b6f1c149db4544deb97bfd9432d6c44c27b5d"},{"bytes":1474,"hit_count":4,"hits":[{"line":3,"text":"namespace Gram\\Support\\Entity;"},{"line":5,"text":"use XF\\Mvc\\Entity\\Entity;"},{"line":6,"text":"use XF\\Mvc\\Entity\\Structure;"},{"line":8,"text":"class Delivery extends Entity"}],"path":"Entity/Delivery.php","sha256":"034fa397e67003884d197908a0b4ba968aea4832684c9e12aeff495c4378e551"},{"bytes":1049,"hit_count":4,"hits":[{"line":2,"text":"namespace Gram\\Support\\Entity;"},{"line":4,"text":"use XF\\Mvc\\Entity\\Entity;"},{"line":5,"text":"use XF\\Mvc\\Entity\\Structure;"},{"line":7,"text":"class Message extends Entity"}],"path":"Entity/Message.php","sha256":"f8a38d779917d577a3c17ecdb4606505bdd4f1588a091e8f89f775c7c60c8342"},{"bytes":805,"hit_count":4,"hits":[{"line":2,"text":"namespace Gram\\Support\\Entity;"},{"line":4,"text":"use XF\\Mvc\\Entity\\Entity;"},{"line":5,"text":"use XF\\Mvc\\Entity\\Structure;"},{"line":7,"text":"class RateLimit extends Entity"}],"path":"Entity/RateLimit.php","sha256":"d964076da9a290c505bf0798b00b6a9677520d4a925b8771f066d48b3c516783"},{"bytes":1069,"hit_count":4,"hits":[{"line":2,"text":"namespace Gram\\Support\\Entity;"},{"line":4,"text":"use XF\\Mvc\\Entity\\Entity;"},{"line":5,"text":"use XF\\Mvc\\Entity\\Structure;"},{"line":7,"text":"class SupportEvent extends Entity"}],"path":"Entity/SupportEvent.php","sha256":"b9c68bda7488e167cf437061e547646db27b60976d8a2d2ae39d8cb914223723"},{"bytes":2689,"hit_count":9,"hits":[{"line":3,"text":"namespace Gram\\Support\\Entity;"},{"line":5,"text":"use XF\\Mvc\\Entity\\Entity;"},{"line":6,"text":"use XF\\Mvc\\Entity\\Structure;"},{"line":8,"text":"class Ticket extends Entity"},{"line":12,"text":" $structure->table = 'xf_gram_support_ticket';"},{"line":14,"text":" $structure->contentType = 'gram_support_ticket';"},{"line":39,"text":" 'Attachments' => ["},{"line":40,"text":" 'entity' => 'XF:Attachment',"},{"line":43,"text":" ['content_type', '=', 'gram_support_ticket'],"}],"path":"Entity/Ticket.php","sha256":"f322695057ada74af17de2498dd171c64c6be5bb7eb082388ad94301b13f9eae"},{"bytes":2147,"hit_count":3,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\SupportEvent;"},{"line":6,"text":"use Gram\\Support\\Entity\\Ticket;"},{"line":7,"text":"use XF\\Entity\\User;"}],"path":"Notification/AlertConsumer.php","sha256":"e22d0cdb0a0806c6a231504409bd17cd781caab0f28181aff7246b0295d8cd98"},{"bytes":1771,"hit_count":3,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\SupportEvent;"},{"line":6,"text":"use Gram\\Support\\Entity\\Ticket;"},{"line":7,"text":"use XF\\Entity\\User;"}],"path":"Notification/Dispatcher.php","sha256":"faa370b6b2abda1defa4a1d49aeb448a5f16f8013add4cd1975cc3b65eecda2b"},{"bytes":4045,"hit_count":6,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\SupportEvent;"},{"line":6,"text":"use Gram\\Support\\Entity\\Ticket;"},{"line":7,"text":"use XF\\Entity\\User;"},{"line":38,"text":" ->setTemplate('gram_support_ticket_event', ["},{"line":70,"text":" ->setTemplate('gram_support_ticket_event', ["},{"line":105,"text":" ->setTemplate('gram_support_ticket_event_guest', ["}],"path":"Notification/EmailConsumer.php","sha256":"d1928ebb89483fbc59ac0323cfaabb064e8e6281d4927666c63568ac540e7a34"},{"bytes":3504,"hit_count":1,"hits":[{"line":5,"text":"final class EntityDeliveryGate implements DeliveryGate"}],"path":"Notification/EntityDeliveryGate.php","sha256":"188ddc86845c0cef16d1749a2bc6824c199a5d99dd9acbbc610b8e23439ec4f4"},{"bytes":2801,"hit_count":3,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\SupportEvent;"},{"line":6,"text":"use Gram\\Support\\Entity\\Ticket;"},{"line":14,"text":" $gate = new EntityDeliveryGate();"}],"path":"Notification/EventDispatcher.php","sha256":"7b5be9cd2421aa365a618687e7af43e2d8320515bd85f90a23877c30c92b0817"},{"bytes":1452,"hit_count":1,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\SupportEvent;"}],"path":"Notification/Policy.php","sha256":"5fb1f224ab1064f18bb7e8ab9fa7cc4f77c6587ea9a01c7f48c81186e4c618ed"},{"bytes":1531,"hit_count":1,"hits":[{"line":50,"text":" 'gram_support_ticket',"}],"path":"Pub/Controller/AccountSupport.php","sha256":"236e648a240a3bde2721f3d9355ce0c48f81a0b727407e08cbaa563ae2df1dfd"},{"bytes":7077,"hit_count":6,"hits":[{"line":8,"text":"use Gram\\Support\\Service\\GuestTicketCreateAttachmentFlow;"},{"line":71,"text":" $attachmentFlow = new GuestTicketCreateAttachmentFlow();"},{"line":73,"text":" $attachmentId = 0;"},{"line":76,"text":" $attachmentId = $attachmentFlow->prepare($upload, $tempHash);"},{"line":99,"text":" $attachmentFlow->complete($upload, $tempHash, $ticket, $attachmentId);"},{"line":180,"text":" 'gram_support_ticket',"}],"path":"Pub/Controller/Support.php","sha256":"6cb34b1d27e9f0132263637cefa62fe0e998a9a86620b7ac33199f41ee86f9d4"},{"bytes":358,"hit_count":1,"hits":[{"line":9,"text":" $this->response->contentType('application/javascript', 'utf-8');"}],"path":"Pub/View/PwaServiceWorker.php","sha256":"4bf365039b6deeb476d2137cdea27b5c463f15c54e370e607251db0643c46ae3"},{"bytes":563,"hit_count":1,"hits":[{"line":5,"text":"use XF\\Mvc\\Entity\\Repository;"}],"path":"Repository/Message.php","sha256":"bd077eaf7070f3c2b23259f51bd98788db4ca5a6efc6fedf98772159fbcd6e19"},{"bytes":1329,"hit_count":1,"hits":[{"line":6,"text":"use XF\\Mvc\\Entity\\Repository;"}],"path":"Repository/Ticket.php","sha256":"051b470f486fccbddf881779327b03f0c804462c4d47de3a11e0ffb62352aad7"},{"bytes":1318,"hit_count":1,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\Ticket;"}],"path":"Security/GuestTicketSession.php","sha256":"9637043a10b7f2806c50ee9da04ea076d25a6924d7636b0533a2ea59212975e1"},{"bytes":1305,"hit_count":3,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\Ticket;"},{"line":6,"text":"use XF\\Entity\\User;"},{"line":33,"text":" public static function canManageAttachments(Ticket $ticket, User $visitor): bool"}],"path":"Security/TicketAccess.php","sha256":"f486abd65893052dbaafad550ad0d147ba638661e0e7ed73d7e2b3e046bec4a5"},{"bytes":2741,"hit_count":23,"hits":[{"line":5,"text":"use Gram\\Support\\Attachment\\TicketHandler;"},{"line":6,"text":"use Gram\\Support\\Entity\\Ticket;"},{"line":9,"text":"final class GuestScreenshotService"},{"line":11,"text":" private const CONTENT_TYPE = 'gram_support_ticket';"},{"line":17,"text":" throw new \\InvalidArgumentException('Attachment temp hash must not be empty.');"},{"line":29,"text":" /** @var \\XF\\Repository\\AttachmentRepository $attachmentRepo */"},{"line":30,"text":" $attachmentRepo = \\XF::repository('XF:Attachment');"},{"line":31,"text":" $handler = new TicketHandler(self::CONTENT_TYPE);"},{"line":33,"text":" $manipulator = new \\XF\\Attachment\\Manipulator("},{"line":35,"text":" $attachmentRepo,"},{"line":41,"text":" $attachment = $manipulator->insertAttachmentFromUpload($upload, $error);"},{"line":42,"text":" if (!$attachment)"},{"line":47,"text":" return (int)$attachment->attachment_id;"},{"line":53,"text":" int $attachmentId,"},{"line":58,"text":" if ($tempHash === '' || $attachmentId < 1 || !$ticket->ticket_id)"},{"line":63,"text":" /** @var \\XF\\Service\\Attachment\\PreparerService $preparer */"},{"line":64,"text":" $preparer = \\XF::service(\\XF\\Service\\Attachment\\PreparerService::class);"},{"line":66,"text":" $associated = (int)$preparer->associateAttachmentsWithContent("},{"line":68,"text":" self::CONTENT_TYPE,"},{"line":74,"text":" throw new \\RuntimeException('No screenshot attachment was associated.');"},{"line":77,"text":" $meta = \\XF::em()->find('Gram\\Support:AttachmentMeta', $attachmentId);"},{"line":80,"text":" $meta = \\XF::em()->create('Gram\\Support:AttachmentMeta');"},{"line":81,"text":" $meta->attachment_id = $attachmentId;"}],"path":"Service/GuestScreenshotService.php","sha256":"9c0cbf49c4fca5a632a651a288063bc63f9a7ef85f04b32c96b96dd8c9e13e02"},{"bytes":955,"hit_count":7,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\Ticket;"},{"line":8,"text":"final class GuestTicketCreateAttachmentFlow"},{"line":10,"text":" private GuestScreenshotService $screenshots;"},{"line":14,"text":" $this->screenshots = new GuestScreenshotService();"},{"line":31,"text":" int $attachmentId"},{"line":34,"text":" if (!$upload || $attachmentId < 1)"},{"line":42,"text":" $attachmentId,"}],"path":"Service/GuestTicketCreateAttachmentFlow.php","sha256":"8f4bf8ed6fa0244e6195d7f91bdbdfd0bc7c9ec7d88b1fe5111377a68b8c0266"},{"bytes":5008,"hit_count":1,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\Ticket;"}],"path":"Service/Ticket/Creator.php","sha256":"7a84cd77761a7943495f9d3ef11269987f85265170ad6cf927a1661b8bf0a99a"},{"bytes":2243,"hit_count":1,"hits":[{"line":5,"text":"use Gram\\Support\\Entity\\Ticket;"}],"path":"Service/Ticket/Reply.php","sha256":"482571a2ccf07a3c8672f34940243264a8271ef8c3cbc4fadbb46112afd36830"},{"bytes":6301,"hit_count":5,"hits":[{"line":18,"text":" $sm->createTable('xf_gram_support_ticket', function($table) {"},{"line":68,"text":" $sm->createTable('xf_gram_support_attachment_meta', function($table) {"},{"line":69,"text":" $table->addColumn('attachment_id', 'int')->unsigned();"},{"line":74,"text":" $table->addPrimaryKey('attachment_id');"},{"line":107,"text":" foreach (['xf_gram_support_attachment_meta','xf_gram_support_delivery','xf_gram_support_rate_limit','xf_gram_support_event','xf_gram_support_message','xf_gram_support_ticket'] as $name) {"}],"path":"Setup.php","sha256":"4977f90ec0444e2e3a1e4ee9b79a4e88098c5a3ae37b30d63e77cff2e1fcb971"},{"bytes":212,"hit_count":3,"hits":[{"line":2,"text":"<content_type_fields>"},{"line":3,"text":" <field content_type=\"gram_support_ticket\" field_name=\"attachment_handler_class\">Gram\\Support\\Attachment\\TicketHandler</field>"},{"line":4,"text":"</content_type_fields>"}],"path":"_data/content_type_fields.xml","sha256":"6f9760bc6cc3c78aaec3a1ad68bcbc180d6cd4d2ef30830a4dc3b7b500a0cc97"},{"bytes":9117,"hit_count":1,"hits":[{"line":39,"text":" <phrase title=\"gram_support_attachments\" version_id=\"1000050\" version_string=\"1.0.0 Alpha 3 Unified Fix 3\">\u0412\u043b\u043e\u0436\u0435\u043d\u0438\u044f</phrase>"}],"path":"_data/phrases.xml","sha256":"ea6e84de301145312758285cfcd63ee4c12b8e921877bcde15c17dd4c115c434"},{"bytes":26547,"hit_count":12,"hits":[{"line":628,"text":"\t// access state, internal notes, attachments or staff-only information."},{"line":688,"text":"&lt;xf:if is=\"$ticket.Attachments is not empty\"&gt;"},{"line":691,"text":"\t\t\t&lt;h3 class=\"block-minorHeader\"&gt;{{ phrase('gram_support_attachments') }}&lt;/h3&gt;"},{"line":693,"text":"\t\t\t\t&lt;xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\"&gt;"},{"line":695,"text":"\t\t\t\t\t\t&lt;a href=\"{{ link('attachments', $attachment) }}\"&gt;{$attachment.filename}&lt;/a&gt;"},{"line":732,"text":" <template type=\"public\" title=\"gram_support_ticket\" version_id=\"1000050\" version_string=\"1.0.0 Alpha 3 Unified Fix 3\">&lt;xf:title&gt;{{ $ticket.public_ref }} \u2014 {{ $ticket.subject }}&lt;/xf:title&gt;"},{"line":759,"text":"&lt;xf:if is=\"$ticket.Attachments is not empty\"&gt;"},{"line":762,"text":"\t\t\t&lt;h3 class=\"block-minorHeader\"&gt;{{ phrase('gram_support_attachments') }}&lt;/h3&gt;"},{"line":764,"text":"\t\t\t\t&lt;xf:foreach loop=\"$ticket.Attachments\" value=\"$attachment\"&gt;"},{"line":766,"text":"\t\t\t\t\t\t&lt;a href=\"{{ link('attachments', $attachment) }}\"&gt;{$attachment.filename}&lt;/a&gt;"},{"line":786,"text":" <template type=\"email\" title=\"gram_support_ticket_event\" version_id=\"1000050\" version_string=\"1.0.0 Alpha 3 Unified Fix 3\">&lt;mail:subject&gt;"},{"line":794,"text":" <template type=\"email\" title=\"gram_support_ticket_event_guest\" version_id=\"1000050\" version_string=\"1.0.0 Alpha 3 Unified Fix 3\">&lt;mail:subject&gt;"}],"path":"_data/templates.xml","sha256":"04ed000e02dd040f0587cf276f8c2ad332b568c951b58bd5767df78406e10239"},{"bytes":6986,"hit_count":11,"hits":[{"line":10,"text":" \"src/addons/Gram/Support/Attachment/TicketHandler.php\": \"0def74cda843a56cdea03a8f9c40156a86424de6a09ce64ced655e5f0458361a\","},{"line":11,"text":" \"src/addons/Gram/Support/Entity/AttachmentMeta.php\": \"e19fbc558741df7fbad0b1cbd68b6f1c149db4544deb97bfd9432d6c44c27b5d\","},{"line":12,"text":" \"src/addons/Gram/Support/Entity/Delivery.php\": \"034fa397e67003884d197908a0b4ba968aea4832684c9e12aeff495c4378e551\","},{"line":13,"text":" \"src/addons/Gram/Support/Entity/Message.php\": \"f8a38d779917d577a3c17ecdb4606505bdd4f1588a091e8f89f775c7c60c8342\","},{"line":14,"text":" \"src/addons/Gram/Support/Entity/RateLimit.php\": \"d964076da9a290c505bf0798b00b6a9677520d4a925b8771f066d48b3c516783\","},{"line":15,"text":" \"src/addons/Gram/Support/Entity/SupportEvent.php\": \"b9c68bda7488e167cf437061e547646db27b60976d8a2d2ae39d8cb914223723\","},{"line":16,"text":" \"src/addons/Gram/Support/Entity/Ticket.php\": \"f322695057ada74af17de2498dd171c64c6be5bb7eb082388ad94301b13f9eae\","},{"line":22,"text":" \"src/addons/Gram/Support/Notification/EntityDeliveryGate.php\": \"188ddc86845c0cef16d1749a2bc6824c199a5d99dd9acbbc610b8e23439ec4f4\","},{"line":35,"text":" \"src/addons/Gram/Support/Service/GuestScreenshotService.php\": \"9c0cbf49c4fca5a632a651a288063bc63f9a7ef85f04b32c96b96dd8c9e13e02\","},{"line":36,"text":" \"src/addons/Gram/Support/Service/GuestTicketCreateAttachmentFlow.php\": \"8f4bf8ed6fa0244e6195d7f91bdbdfd0bc7c9ec7d88b1fe5111377a68b8c0266\","},{"line":50,"text":" \"src/addons/Gram/Support/_data/content_type_fields.xml\": \"6f9760bc6cc3c78aaec3a1ad68bcbc180d6cd4d2ef30830a4dc3b7b500a0cc97\","}],"path":"hashes.json","sha256":"bb009f37cf73670d20a66d18931a0344a648b6a44305094e0278960bfbfe2b65"}],"ok":true,"probe_rc":0,"probe_stderr_bytes":0,"probe_stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","runtime":{"content_type_field_columns":["content_type","field_name","field_value","addon_id"],"content_type_fields":[{"addon_id":"Gram/Support","content_type":"gram_support_ticket","field_name":"attachment_handler_class","field_value":"Gram\\Support\\Attachment\\TicketHandler"}],"error":null,"error_count":1,"error_max":1,"ok":true,"tables":["xf_content_type_field"]},"tree_matches_516r6":true,"tree_sha256":"127ae3b4c0639807dcb91899dba0a8242f798f3b1dd5f175bd7a87218fecc359"},"guest_stderr_present":false,"inner_rc":0,"ok":true,"out_truncated":false,"transport_rc":0,"transport_stderr_bytes":0,"transport_stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}
GRAM516R6R2_DECISION=PASS_SCREENSHOT_CONTENTTYPE_EVIDENCE_CAPTURED
GRAM516R6R2_NEXT_GATE=BUILD_EXACT_SCREENSHOT_ASSOCIATION_FIX
HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260918-GRAM-SUPPORT-SCREENSHOT-CONTENTTYPE-RCA-READONLY-516R6R2","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null}
OUTPUT_END
CHAT_OUTPUT_END