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 = ` 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 }; })();