-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathphp_handler.js
More file actions
212 lines (183 loc) · 8.21 KB
/
php_handler.js
File metadata and controls
212 lines (183 loc) · 8.21 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
204
205
206
207
208
209
210
211
212
const phpGenerator = (() => {
let dom = {};
function cacheDom() {
const settingsModal = document.getElementById('settingsModal');
if (!settingsModal) return false;
dom.secretKeyCheck = settingsModal.querySelector('#phpSecretKeyCheck');
dom.secretKey = settingsModal.querySelector('#phpSecretKey');
dom.restrictExtIdCheck = settingsModal.querySelector('#phpRestrictToExtensionIdCheck');
dom.savePath = settingsModal.querySelector('#phpSavePath');
dom.filenameOriginalRadio = settingsModal.querySelector('#phpFilenameOriginal');
dom.filenameFixedRadio = settingsModal.querySelector('#phpFilenameFixed');
dom.fixedFilename = settingsModal.querySelector('#phpFixedFilename');
dom.addTimestampCheck = settingsModal.querySelector('#phpAddTimestamp');
dom.overwriteCheck = settingsModal.querySelector('#phpOverwrite');
dom.generatedCode = settingsModal.querySelector('#generatedPhpCode');
dom.generateBtn = settingsModal.querySelector('#generatePhpScriptBtn');
dom.copyBtn = settingsModal.querySelector('#copyPhpScriptBtn');
return dom.generateBtn && dom.copyBtn;
}
function init() {
if (!cacheDom()) {
console.error("No se pudieron cachear los elementos del DOM para el generador PHP.");
return;
}
dom.generateBtn.addEventListener('click', generatePhpScript);
dom.copyBtn.addEventListener('click', copyScript);
}
function generatePhpScript() {
const useSecretKey = dom.secretKeyCheck.checked;
const secretKey = dom.secretKey.value.trim();
const useExtensionIdCheck = dom.restrictExtIdCheck.checked;
const extensionId = chrome.runtime.id;
const savePath = dom.savePath.value.trim();
const useFixedFilename = dom.filenameFixedRadio.checked;
const fixedFilename = dom.fixedFilename.value.trim();
const addTimestamp = dom.addTimestampCheck.checked;
const allowOverwrite = dom.overwriteCheck.checked;
let script = `<?php
// Script generado por DRM Player Avanzado para recibir listas M3U
// Versión: 1.0
// --- Cabeceras ---
// Permiten que la extensión se comunique con este script desde cualquier origen.
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Origin');
// Manejo de la solicitud pre-vuelo (preflight) de CORS
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
exit(0);
}
// --- Configuración ---
`;
if (useSecretKey) {
script += `define('SECRET_KEY', '${secretKey.replace(/'/g, "\\'")}'); // Clave secreta para validar la solicitud\n`;
}
if (useExtensionIdCheck) {
script += `define('ALLOWED_EXTENSION_ID', '${extensionId}'); // ID de la extensión de Chrome permitida\n`;
}
script += `define('TARGET_DIRECTORY', '${savePath.replace(/'/g, "\\'")}'); // Directorio donde se guardarán las listas. Dejar vacío para el mismo directorio del script.\n`;
script += `define('USE_FIXED_FILENAME', ${useFixedFilename ? 'true' : 'false'}); // true para usar un nombre de archivo fijo, false para usar el original.\n`;
script += `define('FIXED_FILENAME', '${fixedFilename.replace(/'/g, "\\'")}'); // Nombre de archivo a usar si USE_FIXED_FILENAME es true.\n`;
script += `define('ADD_TIMESTAMP', ${addTimestamp ? 'true' : 'false'}); // Añadir fecha y hora al nombre del archivo para evitar sobrescrituras.\n`;
script += `define('ALLOW_OVERWRITE', ${allowOverwrite ? 'true' : 'false'}); // Permitir sobrescribir archivos si ya existen (ignorado si ADD_TIMESTAMP es true).\n`;
script += `
// --- Lógica del Script ---
$response = ['success' => false, 'message' => '', 'filename' => ''];
// Verificar el método de la solicitud
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
$response['message'] = 'Error: Método no permitido. Solo se acepta POST.';
http_response_code(405);
echo json_encode($response);
exit;
}
// Verificar la clave secreta si está configurada
`;
if (useSecretKey) {
script += `
if (defined('SECRET_KEY') && SECRET_KEY !== '') {
$submittedKey = isset($_POST['secret']) ? $_POST['secret'] : '';
if ($submittedKey !== SECRET_KEY) {
$response['message'] = 'Error: Clave secreta inválida.';
http_response_code(403);
echo json_encode($response);
exit;
}
}
`;
}
if (useExtensionIdCheck) {
script += `
// Verificar el origen de la extensión de Chrome si está configurado
if (defined('ALLOWED_EXTENSION_ID') && ALLOWED_EXTENSION_ID !== '') {
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
if ($origin !== 'chrome-extension://' . ALLOWED_EXTENSION_ID) {
$response['message'] = 'Error: Solicitud desde un origen no permitido.';
http_response_code(403);
echo json_encode($response);
exit;
}
}
`;
}
script += `
// Obtener datos del POST
$m3uContent = isset($_POST['m3u_content']) ? $_POST['m3u_content'] : null;
$originalM3uName = isset($_POST['m3u_name']) ? $_POST['m3u_name'] : 'lista_subida.m3u';
if (empty($m3uContent)) {
$response['message'] = 'Error: No se recibió contenido M3U (m3u_content).';
http_response_code(400);
echo json_encode($response);
exit;
}
// Determinar el directorio de destino
$targetDir = TARGET_DIRECTORY !== '' ? rtrim(TARGET_DIRECTORY, '/\\\\') : __DIR__;
if (!is_dir($targetDir) || !is_writable($targetDir)) {
$response['message'] = 'Error: El directorio de destino no existe o no tiene permisos de escritura.';
http_response_code(500);
echo json_encode($response);
exit;
}
// Determinar el nombre del archivo final
$filename = '';
if (USE_FIXED_FILENAME && FIXED_FILENAME !== '') {
$filename = FIXED_FILENAME;
} else {
$filename = empty(trim($originalM3uName)) ? 'lista_sin_nombre.m3u' : $originalM3uName;
}
// Asegurarse de que el nombre del archivo tiene la extensión .m3u
if (strtolower(substr($filename, -4)) !== '.m3u') {
$filename .= '.m3u';
}
// Sanitizar el nombre del archivo para seguridad
$baseFilename = basename($filename);
$safeFilename = preg_replace('/[^\w\s._-]/', '_', $baseFilename);
$safeFilename = preg_replace('/\s+/', '_', $safeFilename);
// Añadir timestamp si está configurado
if (ADD_TIMESTAMP) {
$nameWithoutExt = pathinfo($safeFilename, PATHINFO_FILENAME);
$extension = pathinfo($safeFilename, PATHINFO_EXTENSION);
$timestamp = date('Ymd_His');
$safeFilename = "{$nameWithoutExt}_{$timestamp}.{$extension}";
}
$targetFilePath = $targetDir . DIRECTORY_SEPARATOR . $safeFilename;
// Comprobar si se permite sobrescribir (solo si no se añade timestamp)
if (!ADD_TIMESTAMP && !ALLOW_OVERWRITE && file_exists($targetFilePath)) {
$response['message'] = 'Error: El archivo ya existe y no está permitida la sobrescritura.';
http_response_code(409);
echo json_encode($response);
exit;
}
// Guardar el archivo
if (file_put_contents($targetFilePath, $m3uContent) !== false) {
$response['success'] = true;
$response['message'] = 'Archivo M3U guardado correctamente en el servidor.';
$response['filename'] = $safeFilename;
http_response_code(200);
} else {
$response['message'] = 'Error: No se pudo escribir el archivo en el servidor.';
http_response_code(500);
}
// Enviar la respuesta final
echo json_encode($response);
?>
`;
dom.generatedCode.value = script;
showNotification("Script PHP generado.", "success");
}
function copyScript() {
if (!dom.generatedCode.value || dom.generatedCode.value.startsWith('Configura')) {
showNotification("Primero genera un script para poder copiarlo.", "warning");
return;
}
navigator.clipboard.writeText(dom.generatedCode.value).then(() => {
showNotification("Script PHP copiado al portapapeles.", "success");
}).catch(err => {
showNotification("Error al copiar el script. Revisa la consola.", "error");
console.error('Error al copiar: ', err);
});
}
return {
init: init
};
})();