1, 'message' => 'Invalid callback body']); return; } $key = $data['key']; $status = (int)$data['status']; $templateId = (int)$key; if ($templateId <= 0) { echo json_encode(['error' => 0]); return; } if (!in_array($status, [2, 3, 6, 7], true)) { echo json_encode(['error' => 0]); return; } $url = isset($data['url']) ? trim($data['url']) : ''; if ($url === '') { echo json_encode(['error' => 0]); return; } $fileType = isset($data['filetype']) ? strtolower(trim($data['filetype'])) : 'docx'; if ($fileType !== 'docx') { $fileType = 'docx'; } require_once dirname(__DIR__) . '/config.php'; require_once dirname(__DIR__) . '/resources/S3Helper.php'; $config = OnlyOfficeTemplates_getConfig(); $adb = PearDatabase::getInstance(); $res = $adb->pquery("SELECT id, file_name FROM vtiger_oot_templates WHERE id = ?", [$templateId]); $row = $adb->fetchByAssoc($res); if (!$row) { echo json_encode(['error' => 0]); return; } $fileName = $row['file_name'] ?: ('template_' . $templateId . '.' . $fileType); if (pathinfo($fileName, PATHINFO_EXTENSION) !== $fileType) { $fileName = pathinfo($fileName, PATHINFO_FILENAME) . '.' . $fileType; } $s3 = new OnlyOfficeTemplates_S3Helper($config); $s3Key = $s3->getTemplateKey($templateId, $fileName); $tmpFile = tempnam(sys_get_temp_dir(), 'oot_callback_') . '.' . $fileType; try { $ctx = stream_context_create(['http' => ['timeout' => 30]]); $content = @file_get_contents($url, false, $ctx); if ($content === false || strlen($content) === 0) { echo json_encode(['error' => 1, 'message' => 'Failed to download document']); return; } file_put_contents($tmpFile, $content); $s3->uploadFile($tmpFile, $s3Key, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'); $adb->pquery("UPDATE vtiger_oot_templates SET s3_key = ?, file_name = ? WHERE id = ?", [$s3Key, $fileName, $templateId]); } finally { @unlink($tmpFile); } echo json_encode(['error' => 0]); } }