Skip to content

Commit e4bb14d

Browse files
authored
Super user (#2944)
* add super user * nits
1 parent 5d9b836 commit e4bb14d

File tree

25 files changed

+237
-29
lines changed

25 files changed

+237
-29
lines changed

backend/danswer/auth/users.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@
9393
from danswer.utils.telemetry import optional_telemetry
9494
from danswer.utils.telemetry import RecordType
9595
from danswer.utils.variable_functionality import fetch_versioned_implementation
96-
from shared_configs.configs import CURRENT_TENANT_ID_CONTEXTVAR
9796
from shared_configs.configs import MULTI_TENANT
9897
from shared_configs.configs import POSTGRES_DEFAULT_SCHEMA
98+
from shared_configs.contextvars import CURRENT_TENANT_ID_CONTEXTVAR
9999

100100

101101
logger = setup_logger()
@@ -510,19 +510,23 @@ async def get_user_manager(
510510

511511
# This strategy is used to add tenant_id to the JWT token
512512
class TenantAwareJWTStrategy(JWTStrategy):
513-
async def write_token(self, user: User) -> str:
513+
async def _create_token_data(self, user: User, impersonate: bool = False) -> dict:
514514
tenant_id = get_tenant_id_for_email(user.email)
515515
data = {
516516
"sub": str(user.id),
517517
"aud": self.token_audience,
518518
"tenant_id": tenant_id,
519519
}
520+
return data
521+
522+
async def write_token(self, user: User) -> str:
523+
data = await self._create_token_data(user)
520524
return generate_jwt(
521525
data, self.encode_key, self.lifetime_seconds, algorithm=self.algorithm
522526
)
523527

524528

525-
def get_jwt_strategy() -> JWTStrategy:
529+
def get_jwt_strategy() -> TenantAwareJWTStrategy:
526530
return TenantAwareJWTStrategy(
527531
secret=USER_AUTH_SECRET,
528532
lifetime_seconds=SESSION_EXPIRE_TIME_SECONDS,

backend/danswer/configs/app_configs.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,3 +478,7 @@
478478

479479
# JWT configuration
480480
JWT_ALGORITHM = "HS256"
481+
482+
# Super Users
483+
SUPER_USERS = json.loads(os.environ.get("SUPER_USERS", '["pablo@danswer.ai"]'))
484+
SUPER_CLOUD_API_KEY = os.environ.get("SUPER_CLOUD_API_KEY", "api_key")

backend/danswer/connectors/file/connector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
from danswer.file_processing.extract_file_text import read_text_file
2828
from danswer.file_store.file_store import get_default_file_store
2929
from danswer.utils.logger import setup_logger
30-
from shared_configs.configs import CURRENT_TENANT_ID_CONTEXTVAR
3130
from shared_configs.configs import POSTGRES_DEFAULT_SCHEMA
31+
from shared_configs.contextvars import CURRENT_TENANT_ID_CONTEXTVAR
3232

3333
logger = setup_logger()
3434

backend/danswer/danswerbot/slack/listener.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@
5757
from danswer.server.manage.models import SlackBotTokens
5858
from danswer.utils.logger import setup_logger
5959
from danswer.utils.variable_functionality import set_is_ee_based_on_env_variable
60-
from shared_configs.configs import CURRENT_TENANT_ID_CONTEXTVAR
6160
from shared_configs.configs import MODEL_SERVER_HOST
6261
from shared_configs.configs import MODEL_SERVER_PORT
6362
from shared_configs.configs import SLACK_CHANNEL_ID
63+
from shared_configs.contextvars import CURRENT_TENANT_ID_CONTEXTVAR
6464

6565
logger = setup_logger()
6666

backend/danswer/db/engine.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@
3737
from danswer.configs.app_configs import USER_AUTH_SECRET
3838
from danswer.configs.constants import POSTGRES_UNKNOWN_APP_NAME
3939
from danswer.utils.logger import setup_logger
40-
from shared_configs.configs import CURRENT_TENANT_ID_CONTEXTVAR
4140
from shared_configs.configs import MULTI_TENANT
4241
from shared_configs.configs import POSTGRES_DEFAULT_SCHEMA
4342
from shared_configs.configs import TENANT_ID_PREFIX
43+
from shared_configs.contextvars import CURRENT_TENANT_ID_CONTEXTVAR
4444

4545
logger = setup_logger()
4646

backend/danswer/key_value_store/store.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
from danswer.key_value_store.interface import KvKeyNotFoundError
1717
from danswer.redis.redis_pool import get_redis_client
1818
from danswer.utils.logger import setup_logger
19-
from shared_configs.configs import CURRENT_TENANT_ID_CONTEXTVAR
2019
from shared_configs.configs import MULTI_TENANT
2120
from shared_configs.configs import POSTGRES_DEFAULT_SCHEMA
21+
from shared_configs.contextvars import CURRENT_TENANT_ID_CONTEXTVAR
2222

2323
logger = setup_logger()
2424

backend/danswer/server/auth_check.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from danswer.auth.users import current_user_with_expired_token
1111
from danswer.configs.app_configs import APP_API_PREFIX
1212
from danswer.server.danswer_api.ingestion import api_key_dep
13+
from ee.danswer.auth.users import current_cloud_superuser
1314
from ee.danswer.server.tenants.access import control_plane_dep
1415

1516

@@ -100,6 +101,7 @@ def check_router_auth(
100101
or depends_fn == api_key_dep
101102
or depends_fn == current_user_with_expired_token
102103
or depends_fn == control_plane_dep
104+
or depends_fn == current_cloud_superuser
103105
):
104106
found_auth = True
105107
break

backend/danswer/server/manage/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class UserInfo(BaseModel):
5757
oidc_expiry: datetime | None = None
5858
current_token_created_at: datetime | None = None
5959
current_token_expiry_length: int | None = None
60+
is_cloud_superuser: bool = False
6061
organization_name: str | None = None
6162

6263
@classmethod
@@ -65,6 +66,7 @@ def from_model(
6566
user: User,
6667
current_token_created_at: datetime | None = None,
6768
expiry_length: int | None = None,
69+
is_cloud_superuser: bool = False,
6870
organization_name: str | None = None,
6971
) -> "UserInfo":
7072
return cls(
@@ -90,6 +92,7 @@ def from_model(
9092
oidc_expiry=user.oidc_expiry if TRACK_EXTERNAL_IDP_EXPIRY else None,
9193
current_token_created_at=current_token_created_at,
9294
current_token_expiry_length=expiry_length,
95+
is_cloud_superuser=is_cloud_superuser,
9396
)
9497

9598

backend/danswer/server/manage/users.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from danswer.configs.app_configs import AUTH_TYPE
3636
from danswer.configs.app_configs import ENABLE_EMAIL_INVITES
3737
from danswer.configs.app_configs import SESSION_EXPIRE_TIME_SECONDS
38+
from danswer.configs.app_configs import SUPER_USERS
3839
from danswer.configs.app_configs import VALID_EMAIL_DOMAINS
3940
from danswer.configs.constants import AuthType
4041
from danswer.db.auth import get_total_users_count
@@ -476,6 +477,7 @@ def verify_user_logged_in(
476477
# NOTE: this does not use `current_user` / `current_admin_user` because we don't want
477478
# to enforce user verification here - the frontend always wants to get the info about
478479
# the current user regardless of if they are currently verified
480+
479481
if user is None:
480482
# if auth type is disabled, return a dummy user with preferences from
481483
# the key-value store
@@ -502,6 +504,7 @@ def verify_user_logged_in(
502504
user,
503505
current_token_created_at=token_created_at,
504506
expiry_length=SESSION_EXPIRE_TIME_SECONDS,
507+
is_cloud_superuser=user.email in SUPER_USERS,
505508
organization_name=organization_name,
506509
)
507510

backend/danswer/server/query_and_chat/token_limit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from danswer.utils.logger import setup_logger
2222
from danswer.utils.variable_functionality import fetch_versioned_implementation
2323
from ee.danswer.db.token_limit import fetch_all_global_token_rate_limits
24-
from shared_configs.configs import CURRENT_TENANT_ID_CONTEXTVAR
24+
from shared_configs.contextvars import CURRENT_TENANT_ID_CONTEXTVAR
2525

2626

2727
logger = setup_logger()

0 commit comments

Comments
 (0)