From a61fab12e664991ebec87aa77a5ce73af68c4aff Mon Sep 17 00:00:00 2001 From: Claude Code Date: Mon, 16 Feb 2026 21:20:16 +0000 Subject: [PATCH] Backup: Stand vor Design-Optimierung (2026-02-16) --- .claude/settings.local.json | 3 +- CLAUDE.md | 100 + CLAUDE_PROJECT_README.md | 57 - COOKIE_CONSENT_IMPLEMENTATION.md | 6 +- ...lsight-dark-no-tagline-website-cropped.svg | 53 - Logo/intelsight-dark-no-tagline-website.svg | 53 - Logo/intelsight-icon-transparent-dark.svg | 40 - PROFESSIONAL_TOOLBOX_CONTENT.md | 112 + README.md | 1 - accountforger-video.html | 8 - .../images/logos/AegisSightLogo_NavyGold.svg | 8 + assets/images/logos/Logo+Schrift_Rechts.png | Bin 0 -> 31685 bytes assets/images/logos/Logo+Schrift_Rechts.svg | 20 + assets/images/logos/intelsight-name-light.svg | 101 - cookie-consent.css | 8 +- cookie-consent.js | 10 +- css/about-modern.css | 36 +- css/main.css | 37 +- css/mobile.css | 33 +- css/products-modern.css | 28 +- datenschutz-en.html | 50 +- datenschutz.html | 50 +- downloads/af-updates/session_manager.py | 452 ++++ favicon.svg | 8 + impressum-en.html | 32 +- impressum.html | 32 +- index.html | 135 +- js/animations.js | 2 +- js/components.js | 4 +- js/config.js | 4 +- js/legal-pages.js | 14 +- js/main.js | 36 +- js/protection.js | 4 + js/translations.js | 57 +- robots.txt | 2 +- script.js | 689 ----- styles.css | 2213 ----------------- 37 files changed, 1042 insertions(+), 3456 deletions(-) create mode 100644 CLAUDE.md delete mode 100644 CLAUDE_PROJECT_README.md delete mode 100644 Logo/intelsight-dark-no-tagline-website-cropped.svg delete mode 100644 Logo/intelsight-dark-no-tagline-website.svg delete mode 100644 Logo/intelsight-icon-transparent-dark.svg create mode 100644 PROFESSIONAL_TOOLBOX_CONTENT.md delete mode 100644 README.md create mode 100644 assets/images/logos/AegisSightLogo_NavyGold.svg create mode 100644 assets/images/logos/Logo+Schrift_Rechts.png create mode 100644 assets/images/logos/Logo+Schrift_Rechts.svg delete mode 100644 assets/images/logos/intelsight-name-light.svg create mode 100644 downloads/af-updates/session_manager.py create mode 100644 favicon.svg delete mode 100644 script.js delete mode 100644 styles.css diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 93859a8..7b88c36 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -8,7 +8,8 @@ "Bash(sudo apt-get:*)", "Bash(sudo apt-get install:*)", "Bash(git add:*)", - "Bash(rm:*)" + "Bash(rm:*)", + "Bash(hostname)" ], "deny": [] } diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..1079fe7 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,100 @@ +# CLAUDE.md - AegisSight Website + +RELATED_DOCS: + COOKIE_CONSENT_IMPLEMENTATION.md: "Cookie-Banner Implementierung, GDPR, Testing" + DATENSCHUTZ_ANALYTICS.md: "Textbausteine fuer Datenschutzerklaerung" + PROFESSIONAL_TOOLBOX_CONTENT.md: "Backup-HTML fuer entfernte Produktkarte" + VIDEO_UPLOAD_INSTRUCTIONS.md: "Anleitung fuer manuelle Video-Uploads (Git-Limit)" + +PROJECT: Website +STATUS: PRODUCTION +URL: https://aegis-sight.de +CONTAINER: aegis-website-nginx + +COMPANY: + name: AegisSight UG (haftungsbeschraenkt) + domain: aegis-sight.de + email: info@aegis-sight.de + +TECHNOLOGY: + type: Static Website + build_process: NONE + deployment: Docker/nginx + + frontend: + - HTML5 + - CSS3 (modular) + - JavaScript ES6+ + - SVG + + features: + - multi_language: [DE, EN] + - responsive: mobile-first + - video_backgrounds: true + - cookie_consent: GDPR-compliant + - security_headers: enabled + +STRUCTURE: + root_files: + - index.html: Hauptseite + - impressum.html: Impressum DE + - impressum-en.html: Impressum EN + - datenschutz.html: Datenschutz DE + - datenschutz-en.html: Datenschutz EN + - accountforger-video.html: Produkt-Demo + - robots.txt: SEO-Konfiguration + - cookie-consent.js: GDPR Cookie-System + - cookie-consent.css: Cookie-Banner Styles + + directories: + assets: + fonts: [Inter, Bebas Neue] + images: + icons: UI-Icons (SVG) + flags: Laenderflaggen + logos: "Logo+Schrift_Rechts.svg" + videos: "~300MB - Hero-Videos, AFv6.mp4" + + css: + - main.css: Kern-Styles + - animations-enhanced.css: Animationen + - mobile.css: Mobile Responsive + - fonts.css: Typografie + + js: + - main.js: Einstiegspunkt + - translations.js: Mehrsprachigkeit + - components.js: UI-Komponenten + - animations.js: Animationssystem + + docs: Rechtliche PDFs + +PAGES: + homepage: + sections: [Hero mit Video, Ueber uns, Loesungen, Kontakt] + legal: + - Impressum (DE/EN) + - Datenschutz (DE/EN) + product: + - AccountForger Video-Demo + +DEVELOPMENT: + translations: js/translations.js + large_files: "assets/videos/ (~300MB)" + design: mobile-first responsive + +DEPLOYMENT: + container: aegis-website-nginx + server: nginx (static files) + ssl: enabled + security_headers: enabled + rate_limiting: configured + +CHANGE_LOG: + 2026-01-08: + - "Rebrand: IntelSight -> AegisSight" + - "Neues Logo: Logo+Schrift_Rechts.svg" + - "Email: info@aegis-sight.de" + - "Footer: Dynamisches Jahr, AGB entfernt" + +Last-Updated: 2026-01-25 diff --git a/CLAUDE_PROJECT_README.md b/CLAUDE_PROJECT_README.md deleted file mode 100644 index 9012649..0000000 --- a/CLAUDE_PROJECT_README.md +++ /dev/null @@ -1,57 +0,0 @@ - # website-main - -*This README was automatically generated by Claude Project Manager* - -## Project Overview - -- **Path**: `C:/Users/hendr/Desktop/IntelSight/Projektablage/website-main` -- **Files**: 12 files -- **Size**: 137.5 KB -- **Last Modified**: 2025-08-14 22:51 - -## Technology Stack - -### Languages -- JavaScript - -## Project Structure - -``` -CLAUDE_PROJECT_README.md -de.svg -en.svg -index.html -README.md -robots.txt -script.js -Sitemap_IntelSight_UG.docx -styles.css -Logo/ - ├── intelsight-dark-no-tagline-website-cropped.svg - ├── intelsight-dark-no-tagline-website.svg - └── intelsight-icon-transparent-dark.svg -``` - -## Key Files - -- `README.md` - -## Claude Integration - -This project is managed with Claude Project Manager. To work with this project: - -1. Open Claude Project Manager -2. Click on this project's tile -3. Claude will open in the project directory - -## Notes - -*Add your project-specific notes here* - ---- - -## Development Log - -- README generated on 2025-07-03 23:25:48 -- README updated on 2025-08-14 22:51:36 -- README updated on 2025-08-14 22:51:56 diff --git a/COOKIE_CONSENT_IMPLEMENTATION.md b/COOKIE_CONSENT_IMPLEMENTATION.md index f98dc7a..8e99f65 100644 --- a/COOKIE_CONSENT_IMPLEMENTATION.md +++ b/COOKIE_CONSENT_IMPLEMENTATION.md @@ -434,7 +434,7 @@ E-Mail: datenschutz@ihre-domain.de └── cookie-consent-demo.html (optional, für Tests) # Tracking-Script (bereits vorhanden) -/opt/v2-Docker/v2_nginx/html/insights/t.js +/opt/v2-Docker/aegis-website/insights/t.js ``` --- @@ -549,7 +549,7 @@ curl -X POST https://aegis-sight.de/insights/api/track ... - [ ] GeoIP-Datenbank aktualisieren ```bash - cd /opt/v2-Docker/v2_nginx/html/insights/data/geoip + cd /opt/v2-Docker/aegis-website/insights/data/geoip wget -O GeoLite2-City.mmdb.new https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb mv GeoLite2-City.mmdb.new GeoLite2-City.mmdb ``` @@ -558,7 +558,7 @@ curl -X POST https://aegis-sight.de/insights/api/track ... - [ ] Analytics-Daten prüfen (>90 Tage löschen) ```bash - php /opt/v2-Docker/v2_nginx/html/insights/cleanup-old-data.php + php /opt/v2-Docker/aegis-website/insights/cleanup-old-data.php ``` ## **Jährlich:** diff --git a/Logo/intelsight-dark-no-tagline-website-cropped.svg b/Logo/intelsight-dark-no-tagline-website-cropped.svg deleted file mode 100644 index 1fcb5e5..0000000 --- a/Logo/intelsight-dark-no-tagline-website-cropped.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IntelSight - - \ No newline at end of file diff --git a/Logo/intelsight-dark-no-tagline-website.svg b/Logo/intelsight-dark-no-tagline-website.svg deleted file mode 100644 index 41ead70..0000000 --- a/Logo/intelsight-dark-no-tagline-website.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IntelSight - - \ No newline at end of file diff --git a/Logo/intelsight-icon-transparent-dark.svg b/Logo/intelsight-icon-transparent-dark.svg deleted file mode 100644 index 69f6cd9..0000000 --- a/Logo/intelsight-icon-transparent-dark.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/PROFESSIONAL_TOOLBOX_CONTENT.md b/PROFESSIONAL_TOOLBOX_CONTENT.md new file mode 100644 index 0000000..6dcd3ca --- /dev/null +++ b/PROFESSIONAL_TOOLBOX_CONTENT.md @@ -0,0 +1,112 @@ +# Professional Toolbox - Backup Content + +## Beschreibung +Dieser Code enthält die vollständige Professional Toolbox Produktkarte, die temporär von der Website entfernt wurde. + +## Verwendung +Um die Professional Toolbox wieder auf der Website anzuzeigen, fügen Sie den folgenden HTML-Code in die `index.html` innerhalb des `
` Elements ein: + +```html + +
+
+
+
+ Toolbox +
+
+

Professional Toolbox

+

Professional OSINT Suite

+
+
+
+

Eine leistungsstarke Desktop-Anwendung mit fünf essentiellen Tools für behördliche OSINT-Ermittler und Analysten. Modernes Design, intuitive Bedienung, professionelle Funktionen.

+ + + + +
+
+``` + +## Hinweise +- Die Professional Toolbox wurde temporär entfernt, um die AccountForger-Box korrekt zu zentrieren +- Der Code ist vollständig funktionsfähig und kann jederzeit wieder eingefügt werden +- Alle Übersetzungsschlüssel und Funktionen sind bereits in den entsprechenden JavaScript-Dateien vorhanden \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 1fd62cb..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# website diff --git a/accountforger-video.html b/accountforger-video.html index c818f21..e9e0220 100644 --- a/accountforger-video.html +++ b/accountforger-video.html @@ -531,7 +531,6 @@

AccountForger

-

Exklusiver Zugang für autorisierte Behörden

@@ -570,13 +569,6 @@
-
- - - - - Dieses Video ist geschützt und nur für autorisierte Nutzer zugänglich. -
- + \ No newline at end of file diff --git a/datenschutz.html b/datenschutz.html index c2513cf..7bcf726 100644 --- a/datenschutz.html +++ b/datenschutz.html @@ -3,7 +3,17 @@ - Datenschutz - IntelSight + Datenschutz - AegisSight + + + + + + + + + + @@ -110,14 +120,14 @@ - + \ No newline at end of file diff --git a/downloads/af-updates/session_manager.py b/downloads/af-updates/session_manager.py new file mode 100644 index 0000000..001591e --- /dev/null +++ b/downloads/af-updates/session_manager.py @@ -0,0 +1,452 @@ +""" +Session Manager für die Lizenz-Session-Verwaltung mit Heartbeat. +""" + +import threading +import time +import logging +import json +import os +import requests +from datetime import datetime +from typing import Optional, Dict, Any +from .api_client import LicenseAPIClient +from .hardware_fingerprint import HardwareFingerprint + +logger = logging.getLogger("session_manager") +logger.setLevel(logging.DEBUG) +# Füge Console Handler hinzu falls noch nicht vorhanden +if not logger.handlers: + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + logger.addHandler(handler) + + +class SessionManager: + """Verwaltet die Lizenz-Session und Heartbeat.""" + + SESSION_FILE = os.path.join("config", ".session_data") + HEARTBEAT_INTERVAL = 60 # Sekunden + + def __init__(self, api_client: Optional[LicenseAPIClient] = None): + """ + Initialisiert den Session Manager. + + Args: + api_client: Optional vorkonfigurierter API Client + """ + self.api_client = api_client or LicenseAPIClient() + self.hardware_fingerprint = HardwareFingerprint() + + self.session_token: Optional[str] = None + self.license_key: Optional[str] = None + self.activation_id: Optional[int] = None + self.heartbeat_thread: Optional[threading.Thread] = None + self.stop_heartbeat = threading.Event() + self.is_active = False + + # Lade Session-IP-Konfiguration + self._load_ip_config() + + # Session-Daten laden falls vorhanden + self._load_session_data() + + def _save_session_data(self) -> None: + """Speichert die aktuelle Session-Daten.""" + try: + os.makedirs("config", exist_ok=True) + session_data = { + "session_token": self.session_token, + "license_key": self.license_key, + "activation_id": self.activation_id, + "timestamp": datetime.now().isoformat() + } + with open(self.SESSION_FILE, 'w') as f: + json.dump(session_data, f) + logger.debug("Session-Daten gespeichert") + except Exception as e: + logger.error(f"Fehler beim Speichern der Session-Daten: {e}") + + def _load_session_data(self) -> None: + """Lädt gespeicherte Session-Daten.""" + if os.path.exists(self.SESSION_FILE): + try: + with open(self.SESSION_FILE, 'r') as f: + data = json.load(f) + self.session_token = data.get("session_token") + self.license_key = data.get("license_key") + self.activation_id = data.get("activation_id") + logger.info("Session-Daten geladen") + except Exception as e: + logger.warning(f"Fehler beim Laden der Session-Daten: {e}") + + def _clear_session_data(self) -> None: + """Löscht die gespeicherten Session-Daten.""" + try: + if os.path.exists(self.SESSION_FILE): + os.remove(self.SESSION_FILE) + logger.debug("Session-Daten gelöscht") + except Exception as e: + logger.error(f"Fehler beim Löschen der Session-Daten: {e}") + + def start_session(self, license_key: str, activation_id: Optional[int] = None) -> Dict[str, Any]: + """ + Startet eine neue Session für die Lizenz. + + Args: + license_key: Der Lizenzschlüssel + activation_id: Optional die Aktivierungs-ID + + Returns: + Dictionary mit Session-Informationen oder Fehler + """ + if self.is_active: + logger.warning("Session läuft bereits") + return { + "success": False, + "error": "Session already active" + } + + # Hardware-Info sammeln + hw_hash = self.hardware_fingerprint.get_or_create_fingerprint() + machine_name = self.hardware_fingerprint.get_machine_name() + + # IP-Adresse ermitteln + client_ip = self._get_session_ip() + + logger.info(f"Starte Session für Lizenz: {license_key[:4]}...") + logger.debug(f"Session-Parameter: machine_name={machine_name}, hw_hash={hw_hash[:8]}..., ip={client_ip}") + + # Session-Start API Call mit IP-Adresse + result = self.api_client.start_session( + license_key=license_key, + machine_id=machine_name, + hardware_hash=hw_hash, + version="1.0.0", # TODO: Version aus config lesen + ip_address=client_ip # NEU: IP-Adresse hinzugefügt + ) + + logger.debug(f"Session-Start Response: {result}") + + if result.get("success"): + data = result.get("data", {}) + + # Prüfe ob die Session wirklich erfolgreich war + if data.get("success") is False: + # Session wurde abgelehnt + error_msg = data.get("message", "Session start failed") + logger.error(f"Session abgelehnt: {error_msg}") + return { + "success": False, + "error": error_msg, + "code": "SESSION_REJECTED" + } + + self.session_token = data.get("session_token") + self.license_key = license_key + self.activation_id = activation_id or data.get("activation_id") + self.is_active = True if self.session_token else False + + # Session-Daten speichern + self._save_session_data() + + # Heartbeat starten + self._start_heartbeat() + + logger.info(f"Session erfolgreich gestartet: {self.session_token}") + + # Update-Info prüfen + if data.get("update_available"): + logger.info(f"Update verfügbar: {data.get('latest_version')}") + + return { + "success": True, + "session_token": self.session_token, + "update_info": { + "available": data.get("update_available", False), + "version": data.get("latest_version"), + "download_url": data.get("download_url") + } + } + else: + error = result.get("error", "Unknown error") + logger.error(f"Session-Start fehlgeschlagen: {error}") + + # Bei Konflikt (409) bedeutet es, dass bereits eine Session läuft + if result.get("status") == 409: + return { + "success": False, + "error": "Another session is already active for this license", + "code": "SESSION_CONFLICT" + } + + return { + "success": False, + "error": error, + "code": result.get("code", "SESSION_START_FAILED") + } + + def _start_heartbeat(self) -> None: + """Startet den Heartbeat-Thread.""" + if self.heartbeat_thread and self.heartbeat_thread.is_alive(): + logger.warning("Heartbeat läuft bereits") + return + + self.stop_heartbeat.clear() + self.heartbeat_thread = threading.Thread( + target=self._heartbeat_worker, + daemon=True, + name="LicenseHeartbeat" + ) + self.heartbeat_thread.start() + logger.info("Heartbeat-Thread gestartet") + + def _heartbeat_worker(self) -> None: + """Worker-Funktion für den Heartbeat-Thread.""" + logger.info(f"Heartbeat-Worker gestartet (Interval: {self.HEARTBEAT_INTERVAL}s)") + + while not self.stop_heartbeat.is_set(): + try: + # Warte das Interval oder bis Stop-Signal + if self.stop_heartbeat.wait(self.HEARTBEAT_INTERVAL): + break + + # Sende Heartbeat + if self.session_token and self.license_key: + logger.debug("Sende Heartbeat...") + result = self.api_client.session_heartbeat( + session_token=self.session_token, + license_key=self.license_key + ) + + # Pruefe sowohl HTTP-Status als auch Body-Success + http_ok = result.get("success") + body_data = result.get("data", {}) + body_ok = body_data.get("success", True) if isinstance(body_data, dict) else True + + if http_ok and body_ok: + logger.debug("Heartbeat erfolgreich") + else: + body_msg = body_data.get("message", "") if isinstance(body_data, dict) else "" + logger.error(f"Heartbeat fehlgeschlagen: {body_msg or result.get('error')}") + + # Bei HTTP-Fehlern oder Body-Fehler Session beenden + if result.get("status") in [401, 404] or (http_ok and not body_ok): + logger.error("Session ungueltig, beende...") + self.end_session() + break + else: + logger.warning("Keine Session-Daten für Heartbeat") + + except Exception as e: + logger.error(f"Fehler im Heartbeat-Worker: {e}") + + logger.info("Heartbeat-Worker beendet") + + def end_session(self) -> Dict[str, Any]: + """ + Beendet die aktuelle Session. + + Returns: + Dictionary mit Informationen über die beendete Session + """ + if not self.is_active: + logger.warning("Keine aktive Session zum Beenden") + return { + "success": False, + "error": "No active session" + } + + logger.info("Beende Session...") + + # Heartbeat stoppen + self.stop_heartbeat.set() + if self.heartbeat_thread: + self.heartbeat_thread.join(timeout=5) + + # Session beenden API Call + result = {"success": True} + if self.session_token: + result = self.api_client.end_session(self.session_token) + + if result.get("success"): + logger.info("Session erfolgreich beendet") + else: + logger.error(f"Fehler beim Beenden der Session: {result.get('error')}") + + # Session-Daten löschen + self.session_token = None + self.license_key = None + self.activation_id = None + self.is_active = False + self._clear_session_data() + + return result + + def resume_session(self) -> bool: + """ + Versucht eine gespeicherte Session fortzusetzen. + + Returns: + True wenn erfolgreich, False sonst + """ + if self.is_active: + logger.info("Session läuft bereits") + return True + + if not self.session_token or not self.license_key: + logger.info("Keine gespeicherten Session-Daten vorhanden") + return False + + logger.info("Versuche Session fortzusetzen...") + + # Teste mit Heartbeat ob Session noch gültig ist + result = self.api_client.session_heartbeat( + session_token=self.session_token, + license_key=self.license_key + ) + + # Pruefe sowohl HTTP-Status als auch Body-Success + http_ok = result.get("success") + body_data = result.get("data", {}) + body_ok = body_data.get("success", True) if isinstance(body_data, dict) else True + + if http_ok and body_ok: + logger.info("Session erfolgreich fortgesetzt") + self.is_active = True + self._start_heartbeat() + return True + else: + body_msg = body_data.get("message", "") if isinstance(body_data, dict) else "" + logger.warning(f"Gespeicherte Session ungueltig: {body_msg or result.get('error', 'unbekannt')}") + self._clear_session_data() + return False + + def is_session_active(self) -> bool: + """ + Prüft ob eine Session aktiv ist. + + Returns: + True wenn aktiv, False sonst + """ + return self.is_active + + def get_session_info(self) -> Dict[str, Any]: + """ + Gibt Informationen über die aktuelle Session zurück. + + Returns: + Dictionary mit Session-Informationen + """ + return { + "active": self.is_active, + "session_token": self.session_token[:8] + "..." if self.session_token else None, + "license_key": self.license_key[:4] + "..." if self.license_key else None, + "activation_id": self.activation_id, + "heartbeat_interval": self.HEARTBEAT_INTERVAL + } + + def set_heartbeat_interval(self, seconds: int) -> None: + """ + Setzt das Heartbeat-Interval. + + Args: + seconds: Interval in Sekunden (min 30, max 300) + """ + if 30 <= seconds <= 300: + self.HEARTBEAT_INTERVAL = seconds + logger.info(f"Heartbeat-Interval auf {seconds}s gesetzt") + + # Restart Heartbeat wenn aktiv + if self.is_active: + self.stop_heartbeat.set() + if self.heartbeat_thread: + self.heartbeat_thread.join(timeout=5) + self._start_heartbeat() + else: + logger.warning(f"Ungültiges Heartbeat-Interval: {seconds}") + + def _load_ip_config(self) -> None: + """Lädt die IP-Konfiguration aus license_config.json.""" + config_path = os.path.join("config", "license_config.json") + self.session_ip_mode = "auto" # Default + self.ip_fallback = "0.0.0.0" + + try: + if os.path.exists(config_path): + with open(config_path, 'r') as f: + config = json.load(f) + self.session_ip_mode = config.get("session_ip_mode", "auto") + self.ip_fallback = config.get("ip_fallback", "0.0.0.0") + logger.debug(f"IP-Konfiguration geladen: mode={self.session_ip_mode}, fallback={self.ip_fallback}") + except Exception as e: + logger.warning(f"Fehler beim Laden der IP-Konfiguration: {e}") + + def _get_session_ip(self) -> str: + """ + Ermittelt die IP-Adresse für die Session basierend auf der Konfiguration. + + TESTBETRIEB: Temporäre Lösung - wird durch Server-Ressourcenmanagement ersetzt + + Returns: + Die IP-Adresse als String + """ + if self.session_ip_mode == "auto": + # TESTBETRIEB: Auto-Erkennung der öffentlichen IP + logger.info("TESTBETRIEB: Ermittle öffentliche IP-Adresse automatisch") + try: + response = requests.get("https://api.ipify.org?format=json", timeout=5) + if response.status_code == 200: + ip = response.json().get("ip") + logger.info(f"Öffentliche IP ermittelt: {ip}") + return ip + else: + logger.warning(f"IP-Ermittlung fehlgeschlagen: Status {response.status_code}") + except Exception as e: + logger.error(f"Fehler bei IP-Ermittlung: {e}") + + # Fallback verwenden + logger.warning(f"Verwende Fallback-IP: {self.ip_fallback}") + return self.ip_fallback + + elif self.session_ip_mode == "server_assigned": + # TODO: Implementierung für Server-zugewiesene IPs + logger.info("Server-assigned IP mode noch nicht implementiert, verwende Fallback") + return self.ip_fallback + + elif self.session_ip_mode == "proxy": + # TODO: Proxy-IP verwenden wenn Proxy aktiv + logger.info("Proxy IP mode noch nicht implementiert, verwende Fallback") + return self.ip_fallback + + else: + logger.warning(f"Unbekannter IP-Modus: {self.session_ip_mode}, verwende Fallback") + return self.ip_fallback + + +# Test-Funktion +if __name__ == "__main__": + logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + + print("=== Session Manager Test ===\n") + + # Session Manager erstellen + session_mgr = SessionManager() + + # Session-Info anzeigen + print("Aktuelle Session-Info:") + info = session_mgr.get_session_info() + for key, value in info.items(): + print(f" {key}: {value}") + + # Versuche gespeicherte Session fortzusetzen + print("\nVersuche Session fortzusetzen...") + if session_mgr.resume_session(): + print(" ✓ Session fortgesetzt") + else: + print(" ✗ Keine gültige Session gefunden") + + print("\n=== Test abgeschlossen ===") \ No newline at end of file diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 0000000..835ad75 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/impressum-en.html b/impressum-en.html index da8e555..8c9d7f4 100644 --- a/impressum-en.html +++ b/impressum-en.html @@ -3,7 +3,17 @@ - Legal Notice - IntelSight + Legal Notice - AegisSight + + + + + + + + + +