diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 33de43b84f..069cb4c245 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1203,6 +1203,12 @@ DEFAULT_USER_ROLE = PersistentConfig( os.getenv("DEFAULT_USER_ROLE", "pending"), ) +DEFAULT_GROUP_ID = PersistentConfig( + "DEFAULT_GROUP_ID", + "ui.default_group_id", + os.environ.get("DEFAULT_GROUP_ID", ""), +) + PENDING_USER_OVERLAY_TITLE = PersistentConfig( "PENDING_USER_OVERLAY_TITLE", "ui.pending_user_overlay_title", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index e0e23390af..34da15eb67 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -369,6 +369,7 @@ from open_webui.config import ( BYPASS_ADMIN_ACCESS_CONTROL, USER_PERMISSIONS, DEFAULT_USER_ROLE, + DEFAULT_GROUP_ID, PENDING_USER_OVERLAY_CONTENT, PENDING_USER_OVERLAY_TITLE, DEFAULT_PROMPT_SUGGESTIONS, @@ -762,6 +763,7 @@ app.state.config.MODEL_ORDER_LIST = MODEL_ORDER_LIST app.state.config.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS app.state.config.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE +app.state.config.DEFAULT_GROUP_ID = DEFAULT_GROUP_ID app.state.config.PENDING_USER_OVERLAY_CONTENT = PENDING_USER_OVERLAY_CONTENT app.state.config.PENDING_USER_OVERLAY_TITLE = PENDING_USER_OVERLAY_TITLE diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 75777d771a..c30c1d48d4 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -694,7 +694,11 @@ async def signup(request: Request, response: Response, form_data: SignupForm): if not has_users: # Disable signup after the first user is created request.app.state.config.ENABLE_SIGNUP = False - + + default_group_id = getattr(request.app.state.config, 'DEFAULT_GROUP_ID', "") + if default_group_id and default_group_id: + Groups.add_users_to_group(default_group_id, [user.id]) + return { "token": token, "token_type": "Bearer", @@ -888,6 +892,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)): "ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS": request.app.state.config.ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS, "API_KEYS_ALLOWED_ENDPOINTS": request.app.state.config.API_KEYS_ALLOWED_ENDPOINTS, "DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE, + "DEFAULT_GROUP_ID": request.app.state.config.DEFAULT_GROUP_ID, "JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN, "ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING, "ENABLE_MESSAGE_RATING": request.app.state.config.ENABLE_MESSAGE_RATING, @@ -908,6 +913,7 @@ class AdminConfig(BaseModel): ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS: bool API_KEYS_ALLOWED_ENDPOINTS: str DEFAULT_USER_ROLE: str + DEFAULT_GROUP_ID: str JWT_EXPIRES_IN: str ENABLE_COMMUNITY_SHARING: bool ENABLE_MESSAGE_RATING: bool @@ -922,7 +928,7 @@ class AdminConfig(BaseModel): @router.post("/admin/config") async def update_admin_config( request: Request, form_data: AdminConfig, user=Depends(get_admin_user) -): +): request.app.state.config.SHOW_ADMIN_DETAILS = form_data.SHOW_ADMIN_DETAILS request.app.state.config.WEBUI_URL = form_data.WEBUI_URL request.app.state.config.ENABLE_SIGNUP = form_data.ENABLE_SIGNUP @@ -941,6 +947,8 @@ async def update_admin_config( if form_data.DEFAULT_USER_ROLE in ["pending", "user", "admin"]: request.app.state.config.DEFAULT_USER_ROLE = form_data.DEFAULT_USER_ROLE + request.app.state.config.DEFAULT_GROUP_ID = form_data.DEFAULT_GROUP_ID + pattern = r"^(-1|0|(-?\d+(\.\d+)?)(ms|s|m|h|d|w))$" # Check if the input string matches the pattern @@ -971,6 +979,7 @@ async def update_admin_config( "ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS": request.app.state.config.ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS, "API_KEYS_ALLOWED_ENDPOINTS": request.app.state.config.API_KEYS_ALLOWED_ENDPOINTS, "DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE, + "DEFAULT_GROUP_ID": request.app.state.config.DEFAULT_GROUP_ID, "JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN, "ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING, "ENABLE_MESSAGE_RATING": request.app.state.config.ENABLE_MESSAGE_RATING, diff --git a/src/lib/components/admin/Settings/General.svelte b/src/lib/components/admin/Settings/General.svelte index 44ce446d71..288ca28e63 100644 --- a/src/lib/components/admin/Settings/General.svelte +++ b/src/lib/components/admin/Settings/General.svelte @@ -10,6 +10,7 @@ updateLdapConfig, updateLdapServer } from '$lib/apis/auths'; + import { getGroups } from '$lib/apis/groups'; import SensitiveInput from '$lib/components/common/SensitiveInput.svelte'; import Switch from '$lib/components/common/Switch.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; @@ -32,6 +33,7 @@ let adminConfig = null; let webhookUrl = ''; + let groups = []; // LDAP let ENABLE_LDAP = false; @@ -104,6 +106,9 @@ })(), (async () => { LDAP_SERVER = await getLdapServer(localStorage.token); + })(), + (async () => { + groups = await getGroups(localStorage.token); })() ]); @@ -299,6 +304,22 @@ +
+
{$i18n.t('Default Group')}
+
+ +
+
+
{$i18n.t('Enable New Sign Ups')}