Phase A: Close fixed issues (#7, #8, #9), add server/ user/ to .gitignore, increase extractor timeout to 30 min. Phase B: Add 10 new tests — access request lifecycle (4), CLI admin commands (5), sync subprocess trigger (1). 578 tests passing. Phase C: Delete entire webapp/ directory (24,800 lines) — legacy Flask app fully replaced by FastAPI app/. Fix auth providers to use app.instance_config instead of webapp.config. Update CLAUDE.md. Delete 6 webapp-only test files. Fix Jira service config imports.
60 lines
1.3 KiB
Python
60 lines
1.3 KiB
Python
"""
|
|
Desktop JWT authentication provider.
|
|
|
|
Desktop JWT authentication (Flask blueprint).
|
|
This is NOT a login provider (no login button) - it provides
|
|
JWT-based API authentication for the native desktop application.
|
|
"""
|
|
|
|
import logging
|
|
|
|
from flask import Blueprint
|
|
|
|
import os
|
|
|
|
from auth import AuthProvider
|
|
|
|
|
|
class _Config:
|
|
DESKTOP_JWT_SECRET = os.environ.get("DESKTOP_JWT_SECRET", "")
|
|
|
|
|
|
Config = _Config
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class DesktopAuthProvider(AuthProvider):
|
|
"""Desktop app JWT authentication provider."""
|
|
|
|
def get_name(self) -> str:
|
|
return "desktop"
|
|
|
|
def get_display_name(self) -> str:
|
|
return "Desktop App"
|
|
|
|
def get_blueprint(self) -> Blueprint:
|
|
# Legacy Flask blueprint — removed with webapp/
|
|
return Blueprint("desktop_auth", __name__)
|
|
|
|
def get_login_button(self) -> dict:
|
|
return {
|
|
"text": "",
|
|
"url": "",
|
|
"icon_html": "",
|
|
"subtitle": "",
|
|
"order": 100,
|
|
"css_class": "",
|
|
"visible": False,
|
|
}
|
|
|
|
def is_available(self) -> bool:
|
|
return bool(Config.DESKTOP_JWT_SECRET)
|
|
|
|
def init_app(self, app) -> None:
|
|
"""No additional initialization needed."""
|
|
pass
|
|
|
|
|
|
# Module-level provider instance for auto-discovery
|
|
provider = DesktopAuthProvider()
|