diff --git a/backend/bracket/config.py b/backend/bracket/config.py index 78aba709..824e0a74 100644 --- a/backend/bracket/config.py +++ b/backend/bracket/config.py @@ -3,7 +3,7 @@ import os from enum import auto import sentry_sdk -from pydantic import BaseSettings, PostgresDsn +from pydantic import BaseSettings, Field, PostgresDsn from bracket.utils.types import EnumAutoStr @@ -34,39 +34,34 @@ class Environment(EnumAutoStr): class Config(BaseSettings): pg_dsn: PostgresDsn = 'postgresql://user:pass@localhost:5432/db' # type: ignore[assignment] jwt_secret: str - cors_origins: str = '' - cors_origin_regex: str = '' - admin_email: str | None = None - admin_password: str | None = None - sentry_dsn: str | None = None - allow_insecure_http_sso: bool = False - base_url: str = 'http://localhost:8400' + cors_origins: str = Field(default='') + cors_origin_regex: str = Field(default='') + admin_email: str | None = Field(default=None) + admin_password: str | None = Field(default=None) + sentry_dsn: str | None = Field(default=None) + allow_insecure_http_sso: bool = Field(default=False) + base_url: str = Field(default='http://localhost:8400') + allow_user_registration: bool = Field(default=True) class CIConfig(Config): - allow_insecure_http_sso = False - class Config: env_file = 'ci.env' class DevelopmentConfig(Config): - allow_insecure_http_sso = True + allow_insecure_http_sso: bool = Field(default=True) class Config: env_file = 'dev.env' class ProductionConfig(Config): - allow_insecure_http_sso = False - class Config: env_file = 'prod.env' class DemoConfig(Config): - allow_insecure_http_sso = False - class Config: env_file = 'demo.env' diff --git a/backend/bracket/routes/users.py b/backend/bracket/routes/users.py index 0c40dcd1..7735f64d 100644 --- a/backend/bracket/routes/users.py +++ b/backend/bracket/routes/users.py @@ -2,6 +2,7 @@ from fastapi import APIRouter, Depends, HTTPException from heliclockter import datetime_utc, timedelta from starlette import status +from bracket.config import config from bracket.models.db.user import ( User, UserPasswordToUpdate, @@ -68,6 +69,9 @@ async def patch_user_password( @router.post("/users/register", response_model=TokenResponse) async def register_user(user_to_register: UserToRegister) -> TokenResponse: + if not config.allow_user_registration: + raise HTTPException(status.HTTP_401_UNAUTHORIZED, 'Account creation is unavailable for now') + user = User( email=user_to_register.email, password_hash=pwd_context.hash(user_to_register.password), diff --git a/docs/docs/getting-started/configuration.md b/docs/docs/getting-started/configuration.md index 5c20785f..1e4c0e81 100644 --- a/docs/docs/getting-started/configuration.md +++ b/docs/docs/getting-started/configuration.md @@ -10,6 +10,9 @@ Copy `ci.env` to `prod.env` and fill in the values: - `CORS_ORIGINS` and `CORS_ORIGIN_REGEX`: Specify allowed frontend domain names for CORS (see the [FastAPI docs](https://fastapi.tiangolo.com/tutorial/cors/)) - `ADMIN_EMAIL` and `ADMIN_PASSWORD`: The credentials of the admin user, which is created when initializing the database - `SENTRY_DSN`: The [Sentry](https://sentry.io) DSN for monitoring and error tracking +- `BASE_URL`: The base url of the API used for SSO +- `ALLOW_USER_REGISTRATION`: Can be used to disallow user registration in the web app, currently used for production while bracket is still in beta +- `ALLOW_INSECURE_HTTP_SSO`: Should not be used in production. Allows use of INSECURE requests for SSO auth. ## Example configuration file This is an example of how the config file should look like: @@ -21,4 +24,6 @@ CORS_ORIGIN_REGEX='https://.*\.vercel\.app' ADMIN_EMAIL='admin@example.com' ADMIN_PASSWORD='some unused password' SENTRY_DSN='my sentry dsn' +ALLOW_USER_REGISTRATION=false +ALLOW_INSECURE_HTTP_SSO=false ``` diff --git a/frontend/src/pages/create_account.tsx b/frontend/src/pages/create_account.tsx index 1290f849..9a4d8b88 100644 --- a/frontend/src/pages/create_account.tsx +++ b/frontend/src/pages/create_account.tsx @@ -1,4 +1,5 @@ import { + Alert, Anchor, Box, Button, @@ -11,7 +12,7 @@ import { createStyles, } from '@mantine/core'; import { useForm } from '@mantine/form'; -import { IconArrowLeft } from '@tabler/icons-react'; +import { IconAlertCircle, IconArrowLeft } from '@tabler/icons-react'; import { useRouter } from 'next/router'; import React from 'react'; @@ -72,6 +73,15 @@ export default function CreateAccount() { Create a new account + } + mb={16} + title="Unavailable" + color="red" + radius="lg" + > + Account creation is disabled on this domain for now since bracket is still in beta phase +
{ await registerAndRedirect(values);