import os import subprocess import json import re import time import uuid from flask import Flask, render_template_string, request, session, redirect, url_for, send_file, Response, make_response app = Flask(__name__) app.secret_key = "JST_STABLE_SECRET_KEY_ZIE_2026" # Konfigurasi Session dibikin standar aja biar HP gak rewel app.config.update( PERMANENT_SESSION_LIFETIME=86400 ) # --- SYSTEM LIMITER (MAX 4 ORANG) --- ACTIVE_USERS = {} MAX_CONCURRENT_USERS = 4 @app.before_request def track_sessions(): now = time.time() # Bersihin session yang udah afk / mati lebih dari 2 jam (7200 detik) dead_uids = [u for u, t in ACTIVE_USERS.items() if now - t > 7200] for d in dead_uids: del ACTIVE_USERS[d] if 'uid' in session: ACTIVE_USERS[session['uid']] = now # --- IDENTITY & CREDENTIALS --- OWNER_NAME = "WhyLaugh404" TEAM_NAME = "JakartaSecTeam" LOGIN_LOGO = "https://i.pinimg.com/736x/c2/9a/b9/c29ab9478d9c8f3f84e070d65b2514bc.jpg" DASH_LOGO = "https://i.pinimg.com/736x/22/46/87/224687d938e12d1bfaf9edd0385fd42b.jpg" PASSWORDS = { "owner": "izie19281933", "admin": "admin404jst", "member": "memberjst404" } ACCESS_LEVELS = { "member": ["sherlock", "socialscan", "holehe", "exiftool"], "admin": ["sherlock", "maigret", "socialscan", "holehe", "phoneinfoga", "exiftool", "cloud_enum"], "owner": ["sherlock", "maigret", "socialscan", "holehe", "phoneinfoga", "twint", "exiftool", "ghunt", "cloud_enum"] } ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])') # --- STYLING: FULLY RESPONSIVE B&W --- CSS = """ :root { --bg: #000; --text: #fff; --panel: #0a0a0a; --border: #333; } body { background: var(--bg); color: var(--text); font-family: 'Courier New', monospace; margin: 0; padding: 0; overflow-x: hidden; } /* LAYOUT LOGIN */ .login-screen { display: flex; align-items: center; justify-content: center; min-height: 100vh; flex-direction: column; padding: 20px; box-sizing: border-box; } .login-logo { width: 150px; height: 150px; border-radius: 50%; margin-bottom: 25px; filter: grayscale(100%); border: 3px solid var(--text); } .jst-brand { font-size: 2.2em; font-weight: bold; letter-spacing: 5px; text-align: center; margin-bottom: 25px; } .login-card { background: var(--panel); border: 1px solid var(--border); padding: 40px 30px; width: 100%; max-width: 380px; text-align: center; box-sizing: border-box; } /* HEADER DASHBOARD */ .header { background: var(--panel); border-bottom: 1px solid var(--border); padding: 20px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; } .header-left { display: flex; align-items: center; gap: 15px; } .mrx-logo { width: 60px; height: 60px; border-radius: 50%; border: 1px solid var(--border); filter: grayscale(100%); } .header-title { font-size: 1.5em; font-weight: bold; letter-spacing: 3px; } .header-sub { font-size: 0.7em; color: #aaa; margin-top: 5px; } /* BUTTONS & INPUTS (Lebih gede biar gampang dipencet di HP) */ .logout-btn { color: var(--bg); background: var(--text); text-decoration: none; padding: 10px 20px; font-size: 0.9em; font-weight: bold; border: 1px solid var(--text); transition: 0.3s; } .logout-btn:hover { background: var(--bg); color: var(--text); } input { background: var(--bg); border: 1px solid var(--border); color: var(--text); padding: 15px; width: 100%; box-sizing: border-box; outline: none; margin-bottom: 15px; font-family: inherit; font-size: 1em; } input:focus { border-color: var(--text); } button { background: var(--bg); border: 1px solid var(--text); color: var(--text); padding: 15px; width: 100%; cursor: pointer; font-weight: bold; letter-spacing: 2px; font-size: 1em; transition: 0.3s; } button:hover:not(:disabled) { background: var(--text); color: var(--bg); } /* GRID SYSTEM MANTAP (Gak Berdempetan) */ .container { max-width: 1400px; margin: 30px auto; padding: 0 20px; } .guide-box { border: 1px dashed var(--border); padding: 20px; margin-bottom: 30px; background: var(--panel); font-size: 0.9em; line-height: 1.8; } .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 30px; } .card { background: var(--panel); border: 1px solid var(--border); padding: 25px; box-sizing: border-box; display: flex; flex-direction: column; } .card h3 { margin-top: 0; border-bottom: 1px dashed var(--border); padding-bottom: 10px; font-size: 1em; } /* CONSOLE BOX */ .console-box { background: var(--bg); border: 1px solid var(--border); margin-top: 20px; display: none; flex-direction: column; flex-grow: 1; } .console-header { background: #111; padding: 10px; font-size: 0.8em; display: flex; justify-content: space-between; border-bottom: 1px solid var(--border); align-items: center; } .console-body { padding: 15px; height: 300px; overflow-y: auto; font-size: 0.85em; white-space: pre-wrap; color: #ccc; } .dl-btn { color: var(--bg); background: var(--text); text-decoration: none; padding: 5px 12px; display: none; font-weight:bold; font-size: 0.9em; } /* RESPONSIVE ANDROID / MOBILE */ @media (max-width: 768px) { .header { flex-direction: column; text-align: center; gap: 20px; } .header-left { flex-direction: column; } .logout-btn { width: 100%; box-sizing: border-box; text-align: center; padding: 15px; } .grid { grid-template-columns: 1fr; gap: 20px; } .container { margin: 15px auto; padding: 0 15px; } .card { padding: 20px; } } """ # --- SERVER LOGIC --- @app.route('/', methods=['GET', 'POST']) def entry(): if request.method == 'POST': p = request.form.get('p', '').strip() matched_role = None for role, val in PASSWORDS.items(): if p == val: matched_role = role break if matched_role: if 'uid' not in session and len(ACTIVE_USERS) >= MAX_CONCURRENT_USERS: return f"""
sabar dulu temen lu lagi osint mek