|
1 | 1 | import os |
2 | 2 | import time |
3 | | -from typing import Annotated |
| 3 | +import subprocess |
| 4 | +from typing import Annotated, Optional |
4 | 5 | from dotenv import load_dotenv |
5 | 6 | from utils.database import SQLiteDb |
6 | 7 | from fastapi.responses import StreamingResponse |
|
9 | 10 | from fastapi import Depends, HTTPException, status, APIRouter |
10 | 11 | from utils.adb import Adb, DeviceUnavailable, DeviceConnectionError |
11 | 12 | from routes.authentication import authenticate_with_token, AdditionalAccountData, MUST_BE_ADMINISTRATOR_EXCEPTION |
12 | | -from models.adb import AdbListDevices, AdbDetailResponse, AdbConnectDeviceRequest, AdbConnectDeviceResponse, AdbSendTextMessageRequest, AdbMessageSentResponse, AdbShellExecuteRequest, AdbProcessResult, AdbPairDeviceWithCodeRequest, execution_route_enabled, ADB_QR_PAIRING_INSTRUCTIONS, ADB_PAIRING_INSTRUCTIONS |
| 13 | +from models.adb import AdbListDevices, AdbDetailResponse, AdbConnectDeviceRequest, AdbConnectDeviceResponse, AdbSendTextMessageRequest, AdbMessageSentResponse, AdbShellExecuteRequest, AdbProcessResult, AdbPairDeviceWithCodeRequest, execution_route_enabled, ADB_QR_PAIRING_INSTRUCTIONS, ADB_PAIRING_INSTRUCTIONS, AdbMessage, AdbConversation |
13 | 14 |
|
14 | 15 | load_dotenv() |
15 | 16 |
|
@@ -45,6 +46,25 @@ async def adb_list_devices( |
45 | 46 | return devices_list |
46 | 47 |
|
47 | 48 |
|
| 49 | +@router.get( |
| 50 | + "/list-messages", |
| 51 | + summary="List all SMS messages from a connected device", |
| 52 | + status_code=status.HTTP_200_OK, |
| 53 | + response_model=list[AdbConversation] |
| 54 | +) |
| 55 | +async def adb_list_messages( |
| 56 | + account: Annotated[AdditionalAccountData, Depends(authenticate_with_token)], |
| 57 | + device_id: Optional[str] = None |
| 58 | +): |
| 59 | + |
| 60 | + if not account.administrator: |
| 61 | + raise MUST_BE_ADMINISTRATOR_EXCEPTION |
| 62 | + |
| 63 | + messages = await adb.list_messages(device_id=device_id) |
| 64 | + |
| 65 | + return messages |
| 66 | + |
| 67 | + |
48 | 68 | @router.get( |
49 | 69 | "/qr-pair-device", |
50 | 70 | summary="Pairing a new Android device over the network via QR code", |
@@ -134,17 +154,24 @@ async def adb_connect_device( |
134 | 154 |
|
135 | 155 | response_detail = "ADB Error while connecting to device!" |
136 | 156 |
|
137 | | - device = await adb.connect_device(body.device_id) |
| 157 | + try: |
| 158 | + device = await adb.connect_device(body.device_id) |
138 | 159 |
|
139 | | - if "connected" in device.stdout or "already" in device.stdout: |
| 160 | + if "connected" in device.stdout or "already" in device.stdout: |
140 | 161 |
|
141 | | - response_detail = "ADB is now connected to device" |
| 162 | + response_detail = "ADB is now connected to device" |
142 | 163 |
|
143 | | - return AdbConnectDeviceResponse( |
144 | | - detail=response_detail, |
145 | | - device_id=body.device_id, |
146 | | - adb_output=device.stdout |
147 | | - ) |
| 164 | + return AdbConnectDeviceResponse( |
| 165 | + detail=response_detail, |
| 166 | + device_id=body.device_id, |
| 167 | + adb_output=device.stdout |
| 168 | + ) |
| 169 | + |
| 170 | + except subprocess.TimeoutExpired: |
| 171 | + raise HTTPException( |
| 172 | + status_code=status.HTTP_504_GATEWAY_TIMEOUT, |
| 173 | + detail="The connection attempt to the device timed out." |
| 174 | + ) |
148 | 175 |
|
149 | 176 |
|
150 | 177 | @router.post( |
|
0 commit comments