From 521e72e5a4de2973287b2fefa7e0983c1e96f027 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Mon, 23 Feb 2026 16:51:08 +0200 Subject: [PATCH] catch 403 and return insufficient_permissions in google drive tools --- .../tools/google_drive/create_file.py | 25 ++++++++++++++----- .../new_chat/tools/google_drive/trash_file.py | 15 ++++++++++- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/surfsense_backend/app/agents/new_chat/tools/google_drive/create_file.py b/surfsense_backend/app/agents/new_chat/tools/google_drive/create_file.py index df7c103f1..b8490c12b 100644 --- a/surfsense_backend/app/agents/new_chat/tools/google_drive/create_file.py +++ b/surfsense_backend/app/agents/new_chat/tools/google_drive/create_file.py @@ -1,6 +1,7 @@ import logging from typing import Any, Literal +from googleapiclient.errors import HttpError from langchain_core.tools import tool from langgraph.types import interrupt from sqlalchemy.ext.asyncio import AsyncSession @@ -180,12 +181,24 @@ def create_create_google_drive_file_tool( f"Creating Google Drive file: name='{final_name}', type='{final_file_type}', connector={actual_connector_id}" ) client = GoogleDriveClient(session=db_session, connector_id=actual_connector_id) - created = await client.create_file( - name=final_name, - mime_type=mime_type, - parent_folder_id=final_parent_folder_id, - content=final_content, - ) + try: + created = await client.create_file( + name=final_name, + mime_type=mime_type, + parent_folder_id=final_parent_folder_id, + content=final_content, + ) + except HttpError as http_err: + if http_err.resp.status == 403: + logger.warning( + f"Insufficient permissions for connector {actual_connector_id}: {http_err}" + ) + return { + "status": "insufficient_permissions", + "connector_id": actual_connector_id, + "message": "This Google Drive account needs additional permissions. Please re-authenticate.", + } + raise logger.info(f"Google Drive file created: id={created.get('id')}, name={created.get('name')}") return { diff --git a/surfsense_backend/app/agents/new_chat/tools/google_drive/trash_file.py b/surfsense_backend/app/agents/new_chat/tools/google_drive/trash_file.py index a6ce43eb2..660f518c6 100644 --- a/surfsense_backend/app/agents/new_chat/tools/google_drive/trash_file.py +++ b/surfsense_backend/app/agents/new_chat/tools/google_drive/trash_file.py @@ -1,6 +1,7 @@ import logging from typing import Any +from googleapiclient.errors import HttpError from langchain_core.tools import tool from langgraph.types import interrupt from sqlalchemy.ext.asyncio import AsyncSession @@ -149,7 +150,19 @@ def create_trash_google_drive_file_tool( f"Trashing Google Drive file: file_id='{final_file_id}', connector={final_connector_id}" ) client = GoogleDriveClient(session=db_session, connector_id=connector.id) - await client.trash_file(file_id=final_file_id) + try: + await client.trash_file(file_id=final_file_id) + except HttpError as http_err: + if http_err.resp.status == 403: + logger.warning( + f"Insufficient permissions for connector {connector.id}: {http_err}" + ) + return { + "status": "insufficient_permissions", + "connector_id": connector.id, + "message": "This Google Drive account needs additional permissions. Please re-authenticate.", + } + raise logger.info(f"Google Drive file trashed: file_id={final_file_id}") return {