Fix issue where users are added to default org as admin (#534)

Users should only be added as to the default org with Owner permissions
if they are not specifically being invited to another org. This commit
fixes the logic in the post-registration callback to make this the case.
This commit is contained in:
Tessa Walsh 2023-01-31 15:55:31 -05:00 committed by GitHub
parent 5fac103e10
commit 6cb79b580a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 9 deletions

View File

@ -81,7 +81,7 @@ class InviteOps:
status_code=403, detail="This user has already been invited"
)
# Invitations to a specific org via API must invite role, so if it's
# Invitations to a specific org via API must include role, so if it's
# absent assume this is a general invitation from superadmin.
if not new_user_invite.role:
new_user_invite.role = UserRole.OWNER

View File

@ -278,7 +278,7 @@ class OrgOps:
new_user_invite = await self.invites.get_valid_invite(invite_token, user.email)
await self.add_user_by_invite(new_user_invite, user)
await self.invites.remove_invite(invite_token)
return True
return new_user_invite
async def add_user_by_invite(self, invite: InvitePending, user: User):
"""Add user to an org from an InvitePending, if any.

View File

@ -236,6 +236,7 @@ class UserManager(BaseUserManager[UserCreate, UserDB]):
"""custom post registration callback, also receive the UserCreate object"""
print(f"User {user.id} has registered.")
add_to_default_org = False
if user_create.newOrg is True:
print(f"Creating new organization for {user.id}")
@ -249,25 +250,34 @@ class UserManager(BaseUserManager[UserCreate, UserDB]):
storage_name="default",
user=user,
)
else:
default_org = await self.org_ops.get_default_org()
if default_org:
await self.org_ops.add_user_to_org(default_org, user.id)
is_verified = hasattr(user_create, "is_verified") and user_create.is_verified
if user_create.inviteToken:
new_user_invite = None
try:
await self.org_ops.handle_new_user_invite(user_create.inviteToken, user)
new_user_invite = await self.org_ops.handle_new_user_invite(
user_create.inviteToken, user
)
except HTTPException as exc:
print(exc)
if new_user_invite and not new_user_invite.oid:
add_to_default_org = True
if not is_verified:
# if user has been invited, mark as verified immediately
await self._update(user, {"is_verified": True})
elif not is_verified:
asyncio.create_task(self.request_verify(user, request))
else:
add_to_default_org = True
if not is_verified:
asyncio.create_task(self.request_verify(user, request))
if add_to_default_org:
default_org = await self.org_ops.get_default_org()
if default_org:
await self.org_ops.add_user_to_org(default_org, user.id)
async def on_after_forgot_password(
self, user: UserDB, token: str, request: Optional[Request] = None