Remove non-org-scoped invites from backend (#585)
* Remove non-org-scoped invites - remove POST /users/invite and related tests - remove GET /users/invite-delete/{token}
This commit is contained in:
parent
b642c53c59
commit
103d91556f
@ -25,7 +25,7 @@ from fastapi_users.authentication import (
|
||||
)
|
||||
from fastapi_users.db import MongoDBUserDatabase
|
||||
|
||||
from .invites import InvitePending, InviteRequest, UserRole
|
||||
from .invites import InvitePending, UserRole
|
||||
|
||||
|
||||
# ============================================================================
|
||||
@ -446,31 +446,6 @@ def init_users_api(app, user_manager):
|
||||
print(f"user info with orgs: {user_info}", flush=True)
|
||||
return user_info
|
||||
|
||||
@users_router.post("/invite", tags=["invites"])
|
||||
async def invite_user(
|
||||
invite: InviteRequest,
|
||||
request: Request,
|
||||
user: User = Depends(current_active_user),
|
||||
):
|
||||
if not user.is_superuser:
|
||||
raise HTTPException(status_code=403, detail="Not Allowed")
|
||||
|
||||
await user_manager.invites.invite_user(
|
||||
invite,
|
||||
user,
|
||||
user_manager,
|
||||
org=None,
|
||||
allow_existing=False,
|
||||
headers=request.headers,
|
||||
)
|
||||
|
||||
return {"invited": "new_user"}
|
||||
|
||||
@users_router.get("/invite/{token}", tags=["invites"])
|
||||
async def get_invite_info(token: str, email: str):
|
||||
invite = await user_manager.invites.get_valid_invite(uuid.UUID(token), email)
|
||||
return await user_manager.format_invite(invite)
|
||||
|
||||
@users_router.get("/me/invite/{token}", tags=["invites"])
|
||||
async def get_existing_user_invite_info(
|
||||
token: str, user: User = Depends(current_active_user)
|
||||
|
@ -15,9 +15,9 @@ def test_pending_invites(admin_auth_headers, default_org_id):
|
||||
INVITE_EMAIL = "invite-pending@example.com"
|
||||
|
||||
r = requests.post(
|
||||
f"{API_PREFIX}/users/invite",
|
||||
f"{API_PREFIX}/orgs/{default_org_id}/invite",
|
||||
headers=admin_auth_headers,
|
||||
json={"email": INVITE_EMAIL},
|
||||
json={"email": INVITE_EMAIL, "role": 20},
|
||||
)
|
||||
assert r.status_code == 200
|
||||
data = r.json()
|
||||
@ -40,75 +40,3 @@ def test_pending_invites_crawler(crawler_auth_headers, default_org_id):
|
||||
# Verify that only superusers can see pending invites
|
||||
r = requests.get(f"{API_PREFIX}/users/invites", headers=crawler_auth_headers)
|
||||
assert r.status_code == 403
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"invite_email, expected_stored_email",
|
||||
[
|
||||
# Standard email
|
||||
("invite-to-accept@example.com", "invite-to-accept@example.com"),
|
||||
# Email address with comments
|
||||
("user+comment@example.com", "user+comment@example.com"),
|
||||
# URL encoded email address with comments
|
||||
("user%2Bcomment-encoded%40example.com", "user+comment-encoded@example.com"),
|
||||
# User email with diacritic characters
|
||||
("diacritic-tést@example.com", "diacritic-tést@example.com"),
|
||||
# User email with encoded diacritic characters
|
||||
(
|
||||
"diacritic-t%C3%A9st-encoded%40example.com",
|
||||
"diacritic-tést-encoded@example.com",
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_send_and_accept_invite(
|
||||
admin_auth_headers, default_org_id, invite_email, expected_stored_email
|
||||
):
|
||||
# Send invite
|
||||
r = requests.post(
|
||||
f"{API_PREFIX}/users/invite",
|
||||
headers=admin_auth_headers,
|
||||
json={"email": invite_email},
|
||||
)
|
||||
assert r.status_code == 200
|
||||
data = r.json()
|
||||
assert data["invited"] == "new_user"
|
||||
|
||||
# Look up token
|
||||
r = requests.get(
|
||||
f"{API_PREFIX}/users/invites",
|
||||
headers=admin_auth_headers,
|
||||
)
|
||||
assert r.status_code == 200
|
||||
data = r.json()
|
||||
invites_matching_email = [
|
||||
invite
|
||||
for invite in data["pending_invites"]
|
||||
if invite["email"] == expected_stored_email
|
||||
]
|
||||
token = invites_matching_email[0]["id"]
|
||||
|
||||
# Register user
|
||||
# Note: This will accept invitation without needing to call the
|
||||
# accept invite endpoint explicitly due to post-registration hook.
|
||||
r = requests.post(
|
||||
f"{API_PREFIX}/auth/register",
|
||||
headers=admin_auth_headers,
|
||||
json={
|
||||
"name": "accepted",
|
||||
"email": expected_stored_email,
|
||||
"password": "testpw",
|
||||
"inviteToken": token,
|
||||
"newOrg": False,
|
||||
},
|
||||
)
|
||||
assert r.status_code == 201
|
||||
|
||||
# Verify user belongs to org
|
||||
r = requests.get(f"{API_PREFIX}/orgs/{default_org_id}", headers=admin_auth_headers)
|
||||
assert r.status_code == 200
|
||||
data = r.json()
|
||||
users = data["users"]
|
||||
users_with_invited_email = [
|
||||
user for user in users.values() if user["email"] == expected_stored_email
|
||||
]
|
||||
assert len(users_with_invited_email) == 1
|
||||
|
Loading…
Reference in New Issue
Block a user