mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-10 16:22:38 +02:00
fix: improve notification for token expiration and revocation errors for multiple connectors
This commit is contained in:
parent
a0bbd9e2e1
commit
5e555a8f9a
9 changed files with 125 additions and 0 deletions
|
|
@ -132,6 +132,15 @@ async def get_valid_credentials(
|
||||||
await session.commit()
|
await session.commit()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
error_str = str(e)
|
||||||
|
# Check if this is an invalid_grant error (token expired/revoked)
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_str.lower()
|
||||||
|
or "token has been expired or revoked" in error_str.lower()
|
||||||
|
):
|
||||||
|
raise Exception(
|
||||||
|
"Google Drive authentication failed. Please re-authenticate."
|
||||||
|
) from e
|
||||||
raise Exception(f"Failed to refresh Google OAuth credentials: {e!s}") from e
|
raise Exception(f"Failed to refresh Google OAuth credentials: {e!s}") from e
|
||||||
|
|
||||||
return credentials
|
return credentials
|
||||||
|
|
|
||||||
|
|
@ -442,11 +442,24 @@ async def refresh_airtable_token(
|
||||||
|
|
||||||
if token_response.status_code != 200:
|
if token_response.status_code != 200:
|
||||||
error_detail = token_response.text
|
error_detail = token_response.text
|
||||||
|
error_code = ""
|
||||||
try:
|
try:
|
||||||
error_json = token_response.json()
|
error_json = token_response.json()
|
||||||
error_detail = error_json.get("error_description", error_detail)
|
error_detail = error_json.get("error_description", error_detail)
|
||||||
|
error_code = error_json.get("error", "")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = (error_detail + error_code).lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="Airtable authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -417,6 +417,17 @@ async def refresh_clickup_token(
|
||||||
error_detail = error_json.get("error", error_detail)
|
error_detail = error_json.get("error", error_detail)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = error_detail.lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="ClickUp authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -428,13 +428,26 @@ async def refresh_confluence_token(
|
||||||
|
|
||||||
if token_response.status_code != 200:
|
if token_response.status_code != 200:
|
||||||
error_detail = token_response.text
|
error_detail = token_response.text
|
||||||
|
error_code = ""
|
||||||
try:
|
try:
|
||||||
error_json = token_response.json()
|
error_json = token_response.json()
|
||||||
error_detail = error_json.get(
|
error_detail = error_json.get(
|
||||||
"error_description", error_json.get("error", error_detail)
|
"error_description", error_json.get("error", error_detail)
|
||||||
)
|
)
|
||||||
|
error_code = error_json.get("error", "")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = (error_detail + error_code).lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="Confluence authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -446,13 +446,26 @@ async def refresh_jira_token(
|
||||||
|
|
||||||
if token_response.status_code != 200:
|
if token_response.status_code != 200:
|
||||||
error_detail = token_response.text
|
error_detail = token_response.text
|
||||||
|
error_code = ""
|
||||||
try:
|
try:
|
||||||
error_json = token_response.json()
|
error_json = token_response.json()
|
||||||
error_detail = error_json.get(
|
error_detail = error_json.get(
|
||||||
"error_description", error_json.get("error", error_detail)
|
"error_description", error_json.get("error", error_detail)
|
||||||
)
|
)
|
||||||
|
error_code = error_json.get("error", "")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = (error_detail + error_code).lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="Jira authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -403,11 +403,24 @@ async def refresh_linear_token(
|
||||||
|
|
||||||
if token_response.status_code != 200:
|
if token_response.status_code != 200:
|
||||||
error_detail = token_response.text
|
error_detail = token_response.text
|
||||||
|
error_code = ""
|
||||||
try:
|
try:
|
||||||
error_json = token_response.json()
|
error_json = token_response.json()
|
||||||
error_detail = error_json.get("error_description", error_detail)
|
error_detail = error_json.get("error_description", error_detail)
|
||||||
|
error_code = error_json.get("error", "")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = (error_detail + error_code).lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="Linear authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -407,11 +407,24 @@ async def refresh_notion_token(
|
||||||
|
|
||||||
if token_response.status_code != 200:
|
if token_response.status_code != 200:
|
||||||
error_detail = token_response.text
|
error_detail = token_response.text
|
||||||
|
error_code = ""
|
||||||
try:
|
try:
|
||||||
error_json = token_response.json()
|
error_json = token_response.json()
|
||||||
error_detail = error_json.get("error_description", error_detail)
|
error_detail = error_json.get("error_description", error_detail)
|
||||||
|
error_code = error_json.get("error", "")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = (error_detail + error_code).lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="Notion authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -418,6 +418,19 @@ async def refresh_slack_token(
|
||||||
error_detail = error_json.get("error", error_detail)
|
error_detail = error_json.get("error", error_detail)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = error_detail.lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "invalid_auth" in error_lower
|
||||||
|
or "token_revoked" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="Slack authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
||||||
)
|
)
|
||||||
|
|
@ -427,6 +440,20 @@ async def refresh_slack_token(
|
||||||
# Slack OAuth v2 returns success status in the JSON
|
# Slack OAuth v2 returns success status in the JSON
|
||||||
if not token_json.get("ok", False):
|
if not token_json.get("ok", False):
|
||||||
error_msg = token_json.get("error", "Unknown error")
|
error_msg = token_json.get("error", "Unknown error")
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = error_msg.lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "invalid_auth" in error_lower
|
||||||
|
or "invalid_refresh_token" in error_lower
|
||||||
|
or "token_revoked" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="Slack authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Slack OAuth refresh error: {error_msg}"
|
status_code=400, detail=f"Slack OAuth refresh error: {error_msg}"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -420,11 +420,24 @@ async def refresh_teams_token(
|
||||||
|
|
||||||
if token_response.status_code != 200:
|
if token_response.status_code != 200:
|
||||||
error_detail = token_response.text
|
error_detail = token_response.text
|
||||||
|
error_code = ""
|
||||||
try:
|
try:
|
||||||
error_json = token_response.json()
|
error_json = token_response.json()
|
||||||
error_detail = error_json.get("error_description", error_detail)
|
error_detail = error_json.get("error_description", error_detail)
|
||||||
|
error_code = error_json.get("error", "")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# Check if this is a token expiration/revocation error
|
||||||
|
error_lower = (error_detail + error_code).lower()
|
||||||
|
if (
|
||||||
|
"invalid_grant" in error_lower
|
||||||
|
or "expired" in error_lower
|
||||||
|
or "revoked" in error_lower
|
||||||
|
):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=401,
|
||||||
|
detail="Microsoft Teams authentication failed. Please re-authenticate.",
|
||||||
|
)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
status_code=400, detail=f"Token refresh failed: {error_detail}"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue