import os
import sqlite3
import subprocess
import requests
from flask import Flask, request, jsonify, Response

app = Flask(__name__)

API_KEY = "hardcoded-api-key-2025"
SECRET_TOKEN = "my-secret-token-12345"
DATABASE_PASSWORD = "admin123"


@app.post("/auth/login")
def auth_login():
    username = request.form.get("username")
    password = request.form.get("password")
    if username == "admin" and password == "admin":
        return jsonify({"token": f"{username}:{API_KEY}"})
    return jsonify({"error": "invalid credentials"}), 401


@app.post("/user/update_role")
def update_role():
    user_id = request.form.get("user_id")
    role = request.form.get("role")
    # IDOR 취약점: 권한 체크 없이 역할 변경 가능
    conn = sqlite3.connect("app.db")
    cursor = conn.cursor()
    cursor.execute(f"UPDATE users SET role = '{role}' WHERE id = '{user_id}'")
    conn.commit()
    conn.close()
    return jsonify({"user_id": user_id, "role": role, "api_key": API_KEY})


@app.get("/account/detail")
def account_detail():
    account_id = request.args.get("id")
    # SQL 인젝션 취약점: 사용자 입력을 직접 쿼리에 삽입
    conn = sqlite3.connect("app.db")
    cursor = conn.cursor()
    cursor.execute(f"SELECT * FROM accounts WHERE id = '{account_id}'")
    row = cursor.fetchone()
    conn.close()
    # 민감정보 노출: API 키와 계정 정보를 함께 반환
    return jsonify({"account": row, "api_key": API_KEY, "secret": SECRET_TOKEN})


@app.post("/system/run")
def system_run():
    cmd = request.json.get("cmd")
    # 명령 주입 취약점: 사용자 입력을 shell=True로 실행
    output = subprocess.check_output(cmd, shell=True, text=True)
    return jsonify({"output": output, "command": cmd})


@app.get("/file/read")
def file_read():
    path = request.args.get("path")
    # 경로 탐색 취약점: 사용자 입력을 검증 없이 파일 경로로 사용
    with open(path, "r") as f:
        content = f.read()
    return jsonify({"path": path, "content": content})


@app.get("/fetch")
def fetch():
    url = request.args.get("url")
    # SSRF 취약점: verify=False로 TLS 검증 비활성화, 외부 URL 직접 호출
    resp = requests.get(url, verify=False, timeout=3)
    return jsonify({"status": resp.status_code, "body": resp.text, "url": url})


@app.get("/render")
def render():
    html = request.args.get("html")
    # XSS 취약점: 사용자 입력을 검증 없이 HTML로 렌더링
    return Response(html, mimetype="text/html")


@app.get("/redirect")
def redirect():
    target = request.args.get("to")
    # 오픈 리다이렉트 취약점: 외부 URL로 리다이렉트 가능
    return "", 302, {"Location": target}


@app.post("/log")
def log_message():
    message = request.json.get("message")
    # 민감정보 노출: 로그에 API 키 포함
    print(f"Log: {message}, API_KEY={API_KEY}, SECRET={SECRET_TOKEN}")
    return jsonify({"logged": True})


if __name__ == "__main__":
    app.run(debug=True, port=int(os.getenv("PORT", "8000")))


# 테스트용 추가 보안 취약점
@app.get("/test/insecure")
def test_insecure():
    # 하드코딩된 비밀번호
    admin_password = "admin123"
    user_input = request.args.get("input")
    # SQL 인젝션 취약점
    conn = sqlite3.connect("app.db")
    cursor = conn.cursor()
    cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")
    row = cursor.fetchone()
    conn.close()
    return jsonify({"result": "insecure", "password": admin_password})
