"""Plugin visibility control for public vs admin users (Track F.1). Controls which plugins are visible to public (OAuth) users vs admin users. Admin users (MASTER_API_KEY) always see all plugins. Public users only see plugins listed in the ENABLED_PLUGINS setting (DB > ENV > default). Usage: from core.plugin_visibility import get_public_plugin_types, is_plugin_public public_types = get_public_plugin_types() if is_plugin_public("gitea"): # True ... """ import os # Default plugins available to public (OAuth) users. DEFAULT_PUBLIC_PLUGINS = { "wordpress", "woocommerce", "wordpress_specialist", "supabase", "openpanel", "gitea", "n8n", "coolify", } def _parse_plugins(val: str) -> set[str]: """Parse comma-separated plugin string into set.""" return {p.strip().lower() for p in val.split(",") if p.strip()} def get_public_plugin_types() -> set[str]: """Return the set of plugin types visible to public users. Checks DB settings first (sync-safe), then env var, then defaults. Returns: Set of lowercase plugin type strings. """ # Try DB setting (sync access via cached value) try: from core.settings import _cached_plugins if _cached_plugins is not None: return set(_cached_plugins) except (ImportError, AttributeError): pass # Fallback to env var env_val = os.getenv("ENABLED_PLUGINS", "").strip() if not env_val: return set(DEFAULT_PUBLIC_PLUGINS) return _parse_plugins(env_val) def is_plugin_public(plugin_type: str) -> bool: """Check if a plugin type is enabled for public users. Args: plugin_type: Plugin type string (e.g., "wordpress"). Returns: True if the plugin is in the public set. """ return plugin_type.lower() in get_public_plugin_types()