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
