mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-03-27 02:02:18 +01:00
* first cut at slack oauth flow * fix usage of hooks * fix button spacing * add additional error logging * no dev redirect * early cut at google drive oauth * second pass * switch to production uri's * try handling oauth_interactive differently * pass through client id and secret if uploaded * fix call * fix test * temporarily disable check for testing * Revert "temporarily disable check for testing" This reverts commit 4b5a022a5fe38b05355a561616068af8e969def2. * support visibility in test * missed file * first cut at confluence oauth * work in progress * work in progress * work in progress * work in progress * work in progress * first cut at distributed locking * WIP to make test work * add some dev mode affordances and gate usage of redis behind dynamic credentials * mypy and credentials provider fixes * WIP * fix created at * fix setting initialValue on everything * remove debugging, fix ??? some TextFormField issues * npm fixes * comment cleanup * fix comments * pin the size of the card section * more review fixes * more fixes --------- Co-authored-by: Richard Kuo <rkuo@rkuo.com> Co-authored-by: Richard Kuo (Danswer) <rkuo@onyx.app>
86 lines
2.5 KiB
Python
86 lines
2.5 KiB
Python
import base64
|
|
import json
|
|
import os
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from fastapi import HTTPException
|
|
from fastapi import status
|
|
|
|
from onyx.connectors.google_utils.shared_constants import (
|
|
DB_CREDENTIALS_AUTHENTICATION_METHOD,
|
|
)
|
|
|
|
|
|
class BasicAuthenticationError(HTTPException):
|
|
def __init__(self, detail: str):
|
|
super().__init__(status_code=status.HTTP_403_FORBIDDEN, detail=detail)
|
|
|
|
|
|
class DateTimeEncoder(json.JSONEncoder):
|
|
"""Custom JSON encoder that converts datetime objects to ISO format strings."""
|
|
|
|
def default(self, obj: Any) -> Any:
|
|
if isinstance(obj, datetime):
|
|
return obj.isoformat()
|
|
return super().default(obj)
|
|
|
|
|
|
def get_json_line(
|
|
json_dict: dict[str, Any], encoder: type[json.JSONEncoder] = DateTimeEncoder
|
|
) -> str:
|
|
"""
|
|
Convert a dictionary to a JSON string with datetime handling, and add a newline.
|
|
|
|
Args:
|
|
json_dict: The dictionary to be converted to JSON.
|
|
encoder: JSON encoder class to use, defaults to DateTimeEncoder.
|
|
|
|
Returns:
|
|
A JSON string representation of the input dictionary with a newline character.
|
|
"""
|
|
return json.dumps(json_dict, cls=encoder) + "\n"
|
|
|
|
|
|
def mask_string(sensitive_str: str) -> str:
|
|
return "****...**" + sensitive_str[-4:]
|
|
|
|
|
|
MASK_CREDENTIALS_WHITELIST = {
|
|
DB_CREDENTIALS_AUTHENTICATION_METHOD,
|
|
"wiki_base",
|
|
"cloud_name",
|
|
"cloud_id",
|
|
}
|
|
|
|
|
|
def mask_credential_dict(credential_dict: dict[str, Any]) -> dict[str, str]:
|
|
masked_creds = {}
|
|
for key, val in credential_dict.items():
|
|
if isinstance(val, str):
|
|
# we want to pass the authentication_method field through so the frontend
|
|
# can disambiguate credentials created by different methods
|
|
if key in MASK_CREDENTIALS_WHITELIST:
|
|
masked_creds[key] = val
|
|
else:
|
|
masked_creds[key] = mask_string(val)
|
|
continue
|
|
|
|
if isinstance(val, int):
|
|
masked_creds[key] = "*****"
|
|
continue
|
|
|
|
raise ValueError(
|
|
f"Unable to mask credentials of type other than string or int, cannot process request."
|
|
f"Received type: {type(val)}"
|
|
)
|
|
|
|
return masked_creds
|
|
|
|
|
|
def make_short_id() -> str:
|
|
"""Fast way to generate a random 8 character id ... useful for tagging data
|
|
to trace it through a flow. This is definitely not guaranteed to be unique and is
|
|
targeted at the stated use case."""
|
|
return base64.b32encode(os.urandom(5)).decode("utf-8")[:8] # 5 bytes → 8 chars
|