diff --git a/app/utils/settings_service.py b/app/utils/settings_service.py index c11e64d6..eb622f1b 100644 --- a/app/utils/settings_service.py +++ b/app/utils/settings_service.py @@ -1784,6 +1784,60 @@ SETTING_METADATA = { "required": False, "restart_required": False, }, + # Local User Signup + "allow_local_signup": { + "category": "Authentication", + "description": ( + "Allow users to self-register with email and password. " + "Has no effect unless MULTI_USER_ENABLED is also True. " + "Requires SMTP (EMAIL_HOST) to be configured so verification emails can be sent." + ), + "type": "boolean", + "sensitive": False, + "required": False, + "restart_required": False, + }, + # Stripe Billing + "stripe_secret_key": { + "category": "Billing", + "description": "Stripe secret API key (starts with sk_). Required for payment processing.", + "type": "string", + "sensitive": True, + "required": False, + "restart_required": False, + }, + "stripe_publishable_key": { + "category": "Billing", + "description": "Stripe publishable key (starts with pk_). Exposed to the browser for Checkout.", + "type": "string", + "sensitive": False, + "required": False, + "restart_required": False, + }, + "stripe_webhook_secret": { + "category": "Billing", + "description": "Stripe webhook signing secret (starts with whsec_). Used to verify incoming webhook payloads.", + "type": "string", + "sensitive": True, + "required": False, + "restart_required": False, + }, + "stripe_success_url": { + "category": "Billing", + "description": "Absolute URL Stripe redirects to after a successful checkout (e.g. https://app.example.com/billing/success).", + "type": "string", + "sensitive": False, + "required": False, + "restart_required": False, + }, + "stripe_cancel_url": { + "category": "Billing", + "description": "Absolute URL Stripe redirects to when a user cancels the checkout flow (e.g. https://app.example.com/pricing).", + "type": "string", + "sensitive": False, + "required": False, + "restart_required": False, + }, } diff --git a/migrations/versions/018_add_local_users_and_billing.py b/migrations/versions/018_add_local_users_and_billing.py index 91e2dafb..ea84d811 100644 --- a/migrations/versions/018_add_local_users_and_billing.py +++ b/migrations/versions/018_add_local_users_and_billing.py @@ -1,7 +1,7 @@ """Add local_users table and billing columns Revision ID: 018_add_local_users_and_billing -Revises: 017_add_onboarding_fields +Revises: 017_add_onboarding_fields, 017_add_pipelines Create Date: 2026-03-09 """ @@ -11,7 +11,7 @@ import sqlalchemy as sa from alembic import op revision: str = "018_add_local_users_and_billing" -down_revision: Union[str, None] = "017_add_onboarding_fields" +down_revision: Union[str, tuple] = ("017_add_onboarding_fields", "017_add_pipelines") depends_on: Union[str, None] = None diff --git a/tests/test_auth_module.py b/tests/test_auth_module.py index 47dcddbc..7cf30187 100644 --- a/tests/test_auth_module.py +++ b/tests/test_auth_module.py @@ -298,6 +298,11 @@ class TestAuthEndpoint: mock_settings.admin_username = "admin" mock_settings.admin_password = "secret123" mock_settings.multi_user_enabled = False + + from app.auth import auth + + mock_request = MagicMock() + mock_form_data = {"username": "admin", "password": "wrong_password"} mock_request.form = AsyncMock(return_value=mock_form_data) mock_request.session = {}