{"record":{"id":"8a370eed3ddf3c23","repo":"makeplane/plane","slug":"5015","errorCode":"5015","errorMessage":"SIGNUP_DISABLED","messagePattern":"SIGNUP_DISABLED","errorType":"exception","errorClass":"AuthenticationException","httpStatus":null,"severity":"error","filePath":"apps/api/plane/authentication/adapter/base.py","lineNumber":114,"sourceCode":"                error_code=AUTHENTICATION_ERROR_CODES[\"PASSWORD_TOO_WEAK\"],\n                error_message=\"PASSWORD_TOO_WEAK\",\n                payload={\"email\": email},\n            )\n        return\n\n    def __check_signup(self, email):\n        \"\"\"Check if sign up is enabled or not and raise exception if not enabled\"\"\"\n\n        # Get configuration value\n        (ENABLE_SIGNUP,) = get_configuration_value([\n            {\"key\": \"ENABLE_SIGNUP\", \"default\": os.environ.get(\"ENABLE_SIGNUP\", \"1\")}\n        ])\n\n        # Check if sign up is disabled and invite is present or not\n        if ENABLE_SIGNUP == \"0\" and not WorkspaceMemberInvite.objects.filter(email=email).exists():\n            self.logger.warning(\"Sign up is disabled and invite is not present\")\n            # Raise exception\n            raise AuthenticationException(\n                error_code=AUTHENTICATION_ERROR_CODES[\"SIGNUP_DISABLED\"],\n                error_message=\"SIGNUP_DISABLED\",\n                payload={\"email\": email},\n            )\n\n        return True\n\n    def get_avatar_download_headers(self):\n        return {}\n\n    def check_sync_enabled(self):\n        \"\"\"Check if sync is enabled for the provider\"\"\"\n        provider_config_map = {\n            \"google\": \"ENABLE_GOOGLE_SYNC\",\n            \"github\": \"ENABLE_GITHUB_SYNC\",\n            \"gitlab\": \"ENABLE_GITLAB_SYNC\",\n            \"gitea\": \"ENABLE_GITEA_SYNC\",\n        }","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/makeplane/plane/blob/1c8a60f858d8472aa56e29994ec1c7926da2c6ce/apps/api/plane/authentication/adapter/base.py#L96-L132","documentation":"The private __check_signup reads ENABLE_SIGNUP from configuration/env (default '1'). When ENABLE_SIGNUP == '0' AND no WorkspaceMemberInvite exists for the email, AuthenticationException code 5015 (SIGNUP_DISABLED) is raised. If an invite exists, signup is allowed even with ENABLE_SIGNUP off — invites bypass the global gate.","triggerScenarios":"Self-serve sign-up attempt on an instance where ENABLE_SIGNUP=0 and the user's email has not been invited to any workspace.","commonSituations":"Enterprise/SSO-only deployments disabling public sign-up; admin forgot to invite a user before they try to register; email mismatch between invite and sign-up attempt (case/typo).","solutions":["Have a workspace admin invite the user's exact email, then retry sign-up.","If self-serve sign-up should be allowed, set ENABLE_SIGNUP=1 in the instance config/env and restart.","Confirm the sign-up email exactly matches the invited email (the invite lookup is case-sensitive after lowercasing)."],"exampleFix":"# before (env)\nENABLE_SIGNUP=0\n# user tries to sign up uninvited -> SIGNUP_DISABLED\n\n# after (option A: invite)\nadmin invites user@example.com -> user signs up with that exact email\n# after (option B: open signup)\nENABLE_SIGNUP=1  # then restart the web service","handlingStrategy":"validation","validationCode":"from django.conf import settings\nimport os\nENABLE_SIGNUP = os.environ.get('ENABLE_SIGNUP', '1')\nif ENABLE_SIGNUP == '0' and not WorkspaceMemberInvite.objects.filter(email=email).exists():\n    return bad_request('Signup disabled; ask your admin to invite you')","typeGuard":null,"tryCatchPattern":"try:\n    adapter._BaseAdapter__check_signup(email)\nexcept AuthenticationException as e:\n    if e.error_code == 5015:\n        return bad_request('Sign-up is disabled. Request an invite.')\n    raise","preventionTips":["Invite users before they sign up when ENABLE_SIGNUP=0","Match the sign-up email exactly to the invite","Set ENABLE_SIGNUP=1 if public self-serve is intended","Document the invite-bypass rule for admins"],"tags":["auth","signup","config","invites","authentication-adapter"],"backgroundTag":null,"analyzedSha":"1c8a60f858d8472aa56e29994ec1c7926da2c6ce","analyzedAt":"2026-08-12T14:44:31.636Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}