-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.php
More file actions
203 lines (173 loc) · 8.92 KB
/
Copy pathinstall.php
File metadata and controls
203 lines (173 loc) · 8.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
<?php
// install.php - Обработчик установки приложения Bitrix24
declare(strict_types=1);
header('Content-Type: text/html; charset=utf-8');
// --- ОТВЕТ НА HEAD-ЗАПРОС ДЛЯ ВАЛИДАЦИИ BITRIX24 ---
// Отправляем 200 OK и выходим, если это HEAD-запрос для проверки доступности
if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'HEAD') {
if (!headers_sent()) { // Дополнительная проверка
header("HTTP/1.1 200 OK");
}
exit;
}
// --- КОНЕЦ БЛОКА ДЛЯ HEAD ---
// --- НАСТРОЙКА ЛОГИРОВАНИЯ ---
ini_set('display_errors', '1'); // Показывать ошибки при установке для отладки
error_reporting(E_ALL);
ini_set('log_errors', '1');
// Базовый путь к директории данных приложения
define('APP_DATA_PATH', '/var/www/www-root/data/bitrix24/draft');
// Проверка существования директории APP_DATA_PATH
if (!is_dir(APP_DATA_PATH)) {
$errorMsg = "FATAL ERROR: APP_DATA_PATH directory does not exist: " . APP_DATA_PATH;
error_log($errorMsg);
die($errorMsg);
}
// Путь к лог-файлу установки
define('INSTALL_LOG_FILE', APP_DATA_PATH . '/logs/install.log');
ini_set('error_log', INSTALL_LOG_FILE);
// Путь к файлу конфигурации
define('CONFIG_PATH', APP_DATA_PATH . '/config.php');
// Проверка существования config.php
if (!file_exists(CONFIG_PATH)) {
$errorMsg = "FATAL ERROR: config.php does NOT exist at path: " . CONFIG_PATH;
error_log($errorMsg);
die($errorMsg);
}
if (!is_readable(CONFIG_PATH)) {
$errorMsg = "FATAL ERROR: config.php is NOT readable at path: " . CONFIG_PATH;
error_log($errorMsg);
die($errorMsg);
}
// Подключаем конфигурацию
$config = require_once CONFIG_PATH;
// Путь для хранения токенов
define('TOKEN_DIR', APP_DATA_PATH . '/tokens');
// Создаем директорию для токенов, если она не существует
if (!is_dir(TOKEN_DIR)) {
mkdir(TOKEN_DIR, 0775, true);
}
// Проверка доступа на запись в директорию токенов
if (!is_writable(TOKEN_DIR)) {
$errorMsg = "FATAL ERROR: TOKEN_DIR is not writable: " . TOKEN_DIR;
error_log($errorMsg);
die($errorMsg);
}
// Логируем запрос для отладки
$requestMethod = $_SERVER['REQUEST_METHOD'] ?? 'N/A';
$requestUri = $_SERVER['REQUEST_URI'] ?? 'N/A';
$logEntry = date('Y-m-d H:i:s') . " Install Request Received:\n";
$logEntry .= "METHOD: {$requestMethod}\n";
$logEntry .= "URI: {$requestUri}\n";
$logEntry .= "_REQUEST Data:\n" . print_r($_REQUEST, true) . "\n---\n";
@file_put_contents(APP_DATA_PATH . '/logs/install_requests.log', $logEntry, FILE_APPEND);
error_log("--- install.php execution started ---");
// --- ФУНКЦИЯ СОХРАНЕНИЯ ТОКЕНА ---
function saveAuth($memberId, $authData) {
$tokenFile = TOKEN_DIR . '/' . preg_replace('/[^a-zA-Z0-9_-]/', '', $memberId) . '.json';
// Сохраняем токен доступа
if (!file_put_contents($tokenFile, json_encode($authData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE))) {
error_log("Failed to save auth data to {$tokenFile}");
return false;
}
return true;
}
// --- ПРОВЕРКА ТИПА ЗАПРОСА ---
// Проверяем запрос установки приложения (POST с AUTH_ID)
if ($requestMethod === 'POST' &&
isset($_REQUEST['DOMAIN'], $_REQUEST['AUTH_ID'], $_REQUEST['REFRESH_ID'], $_REQUEST['member_id'])) {
error_log("Detected installation request for domain: " . $_REQUEST['DOMAIN']);
// Подготавливаем данные для сохранения
$authData = [
'member_id' => $_REQUEST['member_id'],
'domain' => $_REQUEST['DOMAIN'],
'access_token' => $_REQUEST['AUTH_ID'],
'refresh_token' => $_REQUEST['REFRESH_ID'],
'expires_at' => time() + intval($_REQUEST['AUTH_EXPIRES'] ?? 3600),
'install_time' => time(),
'client_id' => $config['app_id'] ?? '',
'client_endpoint' => 'https://' . $_REQUEST['DOMAIN'] . '/rest/',
];
// Сохраняем данные авторизации
if (saveAuth($_REQUEST['member_id'], $authData)) {
error_log("Installation successful for member_id: " . $_REQUEST['member_id']);
// Отправляем успешный ответ в Bitrix24
echo '<!DOCTYPE html><html><head><meta charset="UTF-8">';
echo '<script src="//api.bitrix24.com/api/v1/"></script>';
echo '<script>';
echo ' console.log("Install successful, calling BX24.installFinish()...");';
echo ' if (typeof BX24 !== "undefined") {';
echo ' BX24.installFinish();';
echo ' } else {';
echo ' console.warn("BX24 object not found, attempting to initialize...");';
echo ' setTimeout(function() {';
echo ' if (typeof BX24 !== "undefined") {';
echo ' BX24.init(function(){ BX24.installFinish(); });';
echo ' } else {';
echo ' document.body.innerHTML = "Установка завершена. Пожалуйста, закройте это окно.";';
echo ' }';
echo ' }, 1000);';
echo ' }';
echo '</script>';
echo '</head><body>Установка успешно завершена! Окно закроется автоматически.</body></html>';
error_log("--- install.php execution finished successfully ---");
exit;
} else {
// Ошибка сохранения токена
$errorMsg = "FATAL ERROR: Failed to save auth data for member_id: " . $_REQUEST['member_id'];
error_log($errorMsg);
http_response_code(500);
die("Ошибка установки: не удалось сохранить данные авторизации. Пожалуйста, проверьте права доступа к директории токенов.");
}
}
// --- КОНЕЦ БЛОКА УСТАНОВКИ ---
// --- ОБРАБОТКА JSON-MANIFEST ЗАПРОСА ---
// Если это GET без специфических параметров, скорее всего запрашивается JSON-манифест
$isManifestRequest = $requestMethod === 'GET' &&
!isset($_REQUEST['DOMAIN']) &&
!isset($_REQUEST['AUTH_ID']) &&
!isset($_REQUEST['event']);
if ($isManifestRequest) {
// Базовая конфигурация приложения (манифест)
$appConfig = [
'name' => 'Draft App', // Имя приложения
'code' => 'custom.draft.app', // Уникальный код приложения
'version' => '1.0.0',
'vendor' => 'BI-DATA',
'description' => 'Заготовка для тиражного приложения Bitrix24',
'icon' => 'images/icon.png',
// Права доступа, необходимые приложению
'scope' => ['crm', 'user', 'log'],
// Размещение приложения в интерфейсе Bitrix24
'placement' => [
'DEFAULT' => [
'LANG' => [
'ru' => ['NAME' => 'Draft App'],
'en' => ['NAME' => 'Draft App'],
]
]
],
// Обработчики событий
'handlers' => [
'ONAPPINSTALL' => 'index.php',
'ONAPPUNINSTALL' => 'index.php',
],
'support_url' => 'https://bi-data.ru/support'
];
header('Content-Type: application/json');
echo json_encode($appConfig, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit;
}
// --- КОНЕЦ БЛОКА MANIFEST ---
// --- РЕДИРЕКТ НА ОСНОВНОЙ ФАЙЛ ПРИЛОЖЕНИЯ ---
// Для всех других случаев - редирект на index.php
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$host = $_SERVER['HTTP_HOST'];
$baseAppPath = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/');
$indexPath = $baseAppPath . '/index.php';
$queryString = $_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : '';
$redirectUrl = $protocol . $host . $indexPath . $queryString;
error_log("Redirecting from install.php to: " . $redirectUrl);
header('Location: ' . $redirectUrl, true, 302);
exit;
?>