mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-10-11 05:36:03 +02:00
normalize emails on bulk invite, normalize/lowercase emails on invite… (#2184)
* normalize emails on bulk invite, normalize/lowercase emails on invite matching * fix validate_email import
This commit is contained in:
@@ -8,6 +8,8 @@ from email.mime.text import MIMEText
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
|
from email_validator import EmailNotValidError
|
||||||
|
from email_validator import validate_email
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
from fastapi import Depends
|
from fastapi import Depends
|
||||||
from fastapi import HTTPException
|
from fastapi import HTTPException
|
||||||
@@ -62,7 +64,6 @@ from danswer.utils.telemetry import optional_telemetry
|
|||||||
from danswer.utils.telemetry import RecordType
|
from danswer.utils.telemetry import RecordType
|
||||||
from danswer.utils.variable_functionality import fetch_versioned_implementation
|
from danswer.utils.variable_functionality import fetch_versioned_implementation
|
||||||
|
|
||||||
|
|
||||||
logger = setup_logger()
|
logger = setup_logger()
|
||||||
|
|
||||||
|
|
||||||
@@ -105,7 +106,27 @@ def user_needs_to_be_verified() -> bool:
|
|||||||
|
|
||||||
def verify_email_is_invited(email: str) -> None:
|
def verify_email_is_invited(email: str) -> None:
|
||||||
whitelist = get_invited_users()
|
whitelist = get_invited_users()
|
||||||
if (whitelist and email not in whitelist) or not email:
|
if not whitelist:
|
||||||
|
return
|
||||||
|
|
||||||
|
if not email:
|
||||||
|
raise PermissionError("Email must be specified")
|
||||||
|
|
||||||
|
email_info = validate_email(email) # can raise EmailNotValidError
|
||||||
|
|
||||||
|
for email_whitelist in whitelist:
|
||||||
|
try:
|
||||||
|
# normalized emails are now being inserted into the db
|
||||||
|
# we can remove this normalization on read after some time has passed
|
||||||
|
email_info_whitelist = validate_email(email_whitelist)
|
||||||
|
except EmailNotValidError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# oddly, normalization does not include lowercasing the user part of the
|
||||||
|
# email address ... which we want to allow
|
||||||
|
if email_info.normalized.lower() == email_info_whitelist.normalized.lower():
|
||||||
|
return
|
||||||
|
|
||||||
raise PermissionError("User not on allowed user whitelist")
|
raise PermissionError("User not on allowed user whitelist")
|
||||||
|
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@ import re
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from datetime import timezone
|
from datetime import timezone
|
||||||
|
|
||||||
|
from email_validator import validate_email
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
from fastapi import Body
|
from fastapi import Body
|
||||||
from fastapi import Depends
|
from fastapi import Depends
|
||||||
@@ -159,12 +160,18 @@ def bulk_invite_users(
|
|||||||
emails: list[str] = Body(..., embed=True),
|
emails: list[str] = Body(..., embed=True),
|
||||||
current_user: User | None = Depends(current_admin_user),
|
current_user: User | None = Depends(current_admin_user),
|
||||||
) -> int:
|
) -> int:
|
||||||
|
"""emails are string validated. If any email fails validation, no emails are
|
||||||
|
invited and an exception is raised."""
|
||||||
if current_user is None:
|
if current_user is None:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail="Auth is disabled, cannot invite users"
|
status_code=400, detail="Auth is disabled, cannot invite users"
|
||||||
)
|
)
|
||||||
|
|
||||||
all_emails = list(set(emails) | set(get_invited_users()))
|
normalized_emails = []
|
||||||
|
for email in emails:
|
||||||
|
email_info = validate_email(email) # can raise EmailNotValidError
|
||||||
|
normalized_emails.append(email_info.normalized) # type: ignore
|
||||||
|
all_emails = list(set(normalized_emails) | set(get_invited_users()))
|
||||||
return write_invited_users(all_emails)
|
return write_invited_users(all_emails)
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user