átlagos kiegészítséek jó sok
This commit is contained in:
358
backend/app/tests/run_admin_audit.py
Normal file
358
backend/app/tests/run_admin_audit.py
Normal file
@@ -0,0 +1,358 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user