#!/usr/bin/env python3 """ Standalone Admin Audit Script for Service Finder Ez a szkript teljesen önálló, nem használ subprocess-t, és közvetlenül hívja a Gitea API-t. A konténeren belül fut, ahol a Docker parancsok nem elérhetők. Feladatok: 1. Hardcode értékek szkennelése a megadott könyvtárakban 2. Gitea mérföldkő létrehozása 3. 4 db issue létrehozása a szigorú sablonnal """ import os import re import sys import json import requests from pathlib import Path from typing import List, Dict, Tuple, Optional # ==================== KONSTANSOK ==================== GITEA_URL = "http://gitea:3000/api/v1" TOKEN = "783f58519ee0ca060491dbc07f3dde1d8e48c5dd" HEADERS = {"Authorization": f"token {TOKEN}", "Content-Type": "application/json"} REPO_OWNER = "kincses" REPO_NAME = "service-finder" # A Docker konténer belső útvonalai! SCAN_DIRS = [Path("/app/app/services"), Path("/app/app/api/v1/endpoints")] # Hardcode minta regexek - kombinált lista HARDCODE_PATTERNS = [ # Általános minták (r'\b\d{1,3}\b', "Mágikus szám (1-3 jegyű)"), (r'\b(50|10|100|1000|5000|10000)\b', "Gyakori mágikus szám (pl. 50, 10)"), (r'"(active|inactive|pending|approved|rejected|blocked)"', "Fix státusz string"), (r"'active'|'inactive'|'pending'|'approved'|'rejected'|'blocked'", "Fix státusz string (aposztróf)"), (r'\b(True|False)\b', "Hardcode boolean"), (r'\b(max|min|limit|threshold|default)\s*=\s*\d+', "Limit/Threshold érték"), # Specifikus gamification minták (r'award_points\([^)]*,\s*(\d+)\s*,', "Fix pontszám osztás (Gamification)"), (r'validation_level\s*[+=]\s*(\d+)', "Fix validációs szint növelés/csökkentés"), (r'validation_level\s*[<>]=?\s*(\d+)', "Fix validációs küszöb ellenőrzés"), (r'trust_score\s*[+=]\s*(\d+)', "Fix trust score módosítás"), (r'level_threshold\s*=\s*(\d+)', "Fix szint küszöbérték"), (r'bonus_multiplier\s*=\s*(\d+(?:\.\d+)?)', "Fix bónusz szorzó"), ] # ==================== GITEA API SEGÉDFÜGGVÉNYEK ==================== def gitea_request(method: str, endpoint: str, data: Optional[Dict] = None) -> Tuple[bool, Dict]: """Közvetlen Gitea API hívás.""" url = f"{GITEA_URL}/{endpoint}" try: if method.upper() == "GET": response = requests.get(url, headers=HEADERS, timeout=30) elif method.upper() == "POST": response = requests.post(url, headers=HEADERS, json=data, timeout=30) else: return False, {"error": f"Unsupported method: {method}"} if response.status_code >= 200 and response.status_code < 300: return True, response.json() else: return False, {"error": f"HTTP {response.status_code}", "details": response.text} except requests.exceptions.RequestException as e: return False, {"error": f"Request failed: {e}"} def create_milestone(title: str, description: str) -> Tuple[bool, Optional[int]]: """Mérföldkő létrehozása a Gitea-ban.""" data = { "title": title, "description": description, "state": "open" } success, result = gitea_request("POST", f"repos/{REPO_OWNER}/{REPO_NAME}/milestones", data) if success and "id" in result: return True, result["id"] else: print(f"❌ Mérföldkő létrehozása sikertelen: {result}") return False, None def create_issue(title: str, body: str, milestone_id: Optional[int] = None, labels: Optional[List[str]] = None) -> Tuple[bool, Optional[int]]: """Issue létrehozása a Gitea-ban.""" data = { "title": title, "body": body, "state": "open" } if milestone_id: data["milestone"] = milestone_id if labels: data["labels"] = labels success, result = gitea_request("POST", f"repos/{REPO_OWNER}/{REPO_NAME}/issues", data) if success and "id" in result: return True, result["id"] else: print(f"❌ Issue létrehozása sikertelen: {result}") return False, None # ==================== HARDCODE SCANNER ==================== def find_python_files(directory: Path) -> List[Path]: """Rekurzívan gyűjti össze az összes .py fájlt a megadott könyvtárban.""" python_files = [] for root, dirs, files in os.walk(directory): for file in files: if file.endswith('.py'): python_files.append(Path(root) / file) return python_files def scan_file(file_path: Path) -> List[Dict]: """Egy fájlban keres hardcode értékeket a regex minták alapján.""" findings = [] try: content = file_path.read_text(encoding='utf-8') lines = content.splitlines() for line_num, line in enumerate(lines, 1): for pattern, description in HARDCODE_PATTERNS: matches = re.finditer(pattern, line) for match in matches: # Csak számértékeket gyűjtsünk a specifikus mintáknál if 'gamification' in description.lower() or 'trust' in description.lower(): value = match.group(1) if match.groups() else match.group() else: value = match.group() findings.append({ 'file': str(file_path), 'line': line_num, 'column': match.start() + 1, 'match': value, 'description': description, 'context': line.strip()[:100] }) except Exception as e: print(f"⚠️ Hiba a fájl olvasásakor {file_path}: {e}") return findings def generate_markdown_report(findings: List[Dict]) -> str: """Generál egy Markdown formátumú riportot a találatokról.""" if not findings: return "## ✅ Nincs hardcode találat\n\nA szkennelés nem talált gyanús hardcode értékeket." # Csoportosítás fájl szerint by_file = {} for finding in findings: file = finding['file'] if file not in by_file: by_file[file] = [] by_file[file].append(finding) report_lines = [ "# 🔍 Hardcode Audit Részletes Részletek", "", f"**Összes találat:** {len(findings)}", "", "---", ] for file, file_findings in sorted(by_file.items()): # Csak relatív útvonalat mutassunk rel_path = file try: rel_path = Path(file).relative_to("/app") except ValueError: pass report_lines.append(f"## 📄 {rel_path}") report_lines.append("") for finding in file_findings: report_lines.append(f"### L{ finding['line'] }: `{ finding['match'] }`") report_lines.append(f"- **Leírás:** {finding['description']}") report_lines.append(f"- **Kontextus:** `{finding['context']}`") report_lines.append(f"- **Hely:** {finding['file']}:{finding['line']}:{finding['column']}") report_lines.append("") return "\n".join(report_lines) # ==================== EPIC BUILDER LOGIKA ==================== def run_hardcode_scan() -> Tuple[List[Dict], str]: """Végrehajtja a hardcode szkennelést és generálja a jelentést.""" print("🔍 Hardcode értékek szkennelése...") all_findings = [] for scan_dir in SCAN_DIRS: if not scan_dir.exists(): print(f"⚠️ A könyvtár nem létezik: {scan_dir}") continue print(f" 📁 Könyvtár: {scan_dir}") python_files = find_python_files(scan_dir) print(f" {len(python_files)} Python fájl található") for file_path in python_files: findings = scan_file(file_path) all_findings.extend(findings) print(f"✅ Szkennelés kész. Összes találat: {len(all_findings)}") markdown_report = generate_markdown_report(all_findings) return all_findings, markdown_report def create_epic_project(markdown_report: str): """Létrehozza a teljes projekt tervet a Gitea-ban.""" print("\n🚀 Gitea Projekt Terv Létrehozása...") # 1. Mérföldkő létrehozása print("📌 Mérföldkő létrehozása...") milestone_title = "v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig" milestone_desc = "Admin rendszer fejlesztése: RBAC, dinamikus konfiguráció, anomália detektálás" success, milestone_id = create_milestone(milestone_title, milestone_desc) if success: print(f"✅ Mérföldkő sikeresen létrehozva (ID: {milestone_id})") else: print("⚠️ Mérföldkő létrehozása sikertelen, folytatás milestone nélkül") milestone_id = None # 2. Issue 1: Hardcode Értékek Dinamikussá Tétele issue1_body = f"""**Mérföldkő:** v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig **Cél:** Hardcode értékek kiszervezése SystemParameter táblába és ConfigService-be ### 🔗 Függőségek (Dependencies) - **Bemenet (Mikre támaszkodik):** Database (system.parameters tábla), ConfigService - **Kimenet (Mik támaszkodnak rá):** GamificationService, NotificationService, SecurityService ### 📝 Elemzés A hardcode audit {len(markdown_report.splitlines())} sor találatot jelentett. Ezeket az értékeket át kell helyezni a dinamikus konfigurációs rendszerbe. ### ✅ To-Do Lista - [ ] `SystemParameter` vagy `AdminConfig` adatbázis tábla létrehozása (Key-Value alapú) - [ ] `ConfigService` megírása (Redis/Memória gyorsítótárral) - [ ] A kód átírása, hogy az értékeket a DB-ből olvassa ### 🔍 Hardcode Találatok (Összefoglaló) {markdown_report[:1500]}... """ print("📝 Issue 1 létrehozása...") success, issue1_id = create_issue( title="Phase 1: Hardcode Értékek Dinamikussá Tétele", body=issue1_body, milestone_id=milestone_id, labels=["Scope: Backend", "Type: Refactor", "Status: To Do"] ) if success: print(f"✅ Issue 1 létrehozva (ID: {issue1_id})") # 3. Issue 2: RBAC és Admin API Router issue2_body = """**Mérföldkő:** v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig **Cél:** Superadmin, Moderator szerepkörök és `/api/v1/admin` végpontok implementálása ### 🔗 Függőségek (Dependencies) - **Bemenet (Mikre támaszkodik):** Identity modell (User, Role), Permission tábla - **Kimenet (Mik támaszkodnak rá):** Admin UI, Moderátori felület ### 📝 Elemzés Létre kell hozni a Role-Based Access Control (RBAC) rendszert, amely támogatja a Superadmin, Moderator, és Auditor szerepköröket. ### ✅ To-Do Lista - [ ] `User` modell bővítése: `role` oszlop bevezetése (user, moderator, superadmin) - [ ] FastAPI Dependency (`get_current_admin`) megírása, ami blokkolja a normál usereket - [ ] Az `/api/v1/admin` router regisztrálása a main.py-ban """ print("📝 Issue 2 létrehozása...") success, issue2_id = create_issue( title="Phase 2: RBAC és Admin API Router", body=issue2_body, milestone_id=milestone_id, labels=["Scope: Backend", "Type: Feature", "Role: Admin", "Status: To Do"] ) if success: print(f"✅ Issue 2 létrehozva (ID: {issue2_id})") # 4. Issue 3: Core Felügyeleti Végpontok issue3_body = """**Mérföldkő:** v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig **Cél:** User (KYC), Jármű, Szerviz felügyelet (Tiltás/Jóváhagyás) végpontok ### 🔗 Függőségek (Dependencies) - **Bemenet (Mikre támaszkodik):** UserService, VehicleService, ServiceRegistry - **Kimenet (Mik támaszkodnak rá):** Admin dashboard, Moderátori munkafolyamatok ### 📝 Elemzés Külön végpontok kellenek a felhasználók KYC (Know Your Customer) jóváhagyásához, járművek tiltásához/engedélyezéséhez, és szervizek moderálásához. ### ✅ To-Do Lista - [ ] `GET /admin/users` - Felhasználók listázása (szűréssel, pl. pending KYC) - [ ] `POST /admin/users/{id}/ban` - Fiók tiltása/felfüggesztése - [ ] `POST /admin/marketplace/services/{id}/approve` - Szerviz manuális 100%-ra validálása (Kék pipa) - [ ] `GET /admin/assets/flagged` - Gyanús járművek listája """ print("📝 Issue 3 létrehozása...") success, issue3_id = create_issue( title="Phase 3: Core Felügyeleti Végpontok", body=issue3_body, milestone_id=milestone_id, labels=["Scope: API", "Type: Feature", "Role: Admin", "Status: To Do"] ) if success: print(f"✅ Issue 3 létrehozva (ID: {issue3_id})") # 5. Issue 4: Anomália Detektálás (Anti-Cheat) issue4_body = """**Mérföldkő:** v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig **Cél:** Robot felügyelő a gyanús aktivitásokhoz (pl. túl gyors pontgyűjtés, sok sikertelen bejelentkezés) ### 🔗 Függőségek (Dependencies) - **Bemenet (Mikre támaszkodik):** Audit log, Gamification events, Security events - **Kimenet (Mik támaszkodnak rá):** Admin értesítések, Automatikus tiltások ### 📝 Elemzés Anomália detektáló algoritmus készítése, amely gyanús mintákat keres a felhasználói aktivitásban. ### ✅ To-Do Lista - [ ] Automatikus detektálás gyanúsan sok validációra rövid időn belül - [ ] Sebesség/Távolság ellenőrzés (Nem lehet 1 perc alatt 50km-re lévő szervizeket rögzíteni) - [ ] Riasztások küldése a `/admin/alerts` végpontra a Moderátoroknak """ print("📝 Issue 4 létrehozása...") success, issue4_id = create_issue( title="Phase 4: Anomália Detektálás (Anti-Cheat)", body=issue4_body, milestone_id=milestone_id, labels=["Scope: Backend", "Type: Feature", "Role: Admin", "Status: To Do"] ) if success: print(f"✅ Issue 4 létrehozva (ID: {issue4_id})") print("\n🎉 Gitea projekt terv sikeresen létrehozva!") print(f" Mérföldkő ID: {milestone_id}") print(f" Issue-k: {issue1_id}, {issue2_id}, {issue3_id}, {issue4_id}") # ==================== FŐ FÜGGVÉNY ==================== def main(): """A szkript fő végrehajtási logikája.""" print("=" * 60) print("🚀 Service Finder Admin Audit & Gitea Epic Builder") print("=" * 60) # 1. Hardcode szkennelés findings, markdown_report = run_hardcode_scan() # 2. Gitea projekt létrehozása create_epic_project(markdown_report) print("\n✅ A szkript sikeresen lefutott!") print(" A Gitea-ban megjelentek a kártyák a 'v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig' mérföldkő alatt.") if __name__ == "__main__": main()