""" Development authentication module for StarPunk WARNING: This module provides a development-only authentication mechanism that bypasses IndieLogin. It should NEVER be enabled in production. This module is separate from production auth (starpunk/auth.py) to maintain clear architectural boundaries and enable easy security audits. Security measures: - Only active when DEV_MODE=true - Returns 404 if DEV_MODE=false - Requires DEV_ADMIN_ME configuration - Logs prominent warnings - Cannot coexist with production SITE_URL - Visual warnings in UI Functions: is_dev_mode: Check if development mode is enabled validate_dev_config: Validate development configuration create_dev_session: Create session without authentication """ from flask import current_app from starpunk.auth import create_session def is_dev_mode() -> bool: """ Check if development mode is enabled Returns: True if DEV_MODE is enabled, False otherwise Example: >>> from starpunk.dev_auth import is_dev_mode >>> if is_dev_mode(): ... print("Development mode active") """ return current_app.config.get("DEV_MODE", False) def validate_dev_config() -> None: """ Validate development mode configuration Checks that DEV_MODE configuration is valid and safe: - DEV_ADMIN_ME must be set if DEV_MODE is true - Warns if DEV_MODE is enabled with production-like SITE_URL Raises: ValueError: If DEV_MODE is true but DEV_ADMIN_ME is not set Logs: WARNING: If DEV_MODE is enabled with HTTPS SITE_URL """ dev_mode = current_app.config.get("DEV_MODE", False) if dev_mode: # Require DEV_ADMIN_ME dev_admin_me = current_app.config.get("DEV_ADMIN_ME") if not dev_admin_me: raise ValueError("DEV_MODE=true requires DEV_ADMIN_ME to be set") # Warn if production-like configuration detected site_url = current_app.config.get("SITE_URL", "") if site_url.startswith("https://"): current_app.logger.warning( "WARNING: DEV_MODE is enabled with production SITE_URL. " "This is likely a misconfiguration. " "DEV_MODE should only be used in local development." ) def create_dev_session(me: str) -> str: """ Create development session without authentication WARNING: This bypasses IndieLogin authentication entirely. Only use in development environments. Args: me: User identity URL (from DEV_ADMIN_ME config) Returns: Session token (same format as production sessions) Logs: WARNING: Logs that dev session was created without authentication Example: >>> token = create_dev_session("https://example.com") >>> # Session created without IndieLogin verification """ current_app.logger.warning( f"DEV MODE: Creating session for {me} without authentication. " f"This should NEVER happen in production!" ) # Use production session creation (same session format) # This ensures dev sessions work identically to production return create_session(me)