# GuruRMM Tunnel API - Phase 1 Test Results **Date:** 2026-04-14 **Server:** http://172.16.3.30:3001 **Tester:** Claude Code ## Test Environment - Server: GuruRMM API v0.6.0 (Rust/Axum) - Database: PostgreSQL 14 @ localhost - Authentication: JWT Bearer tokens - Test User: claude-api@azcomputerguru.com (admin role) ## Database Schema Verification ### tech_sessions table ``` Columns: - id (serial primary key) - session_id (varchar(36), unique) - tech_id (uuid, FK -> users.id) - agent_id (uuid, FK -> agents.id) - opened_at (timestamptz, default now()) - last_activity (timestamptz, default now()) - closed_at (timestamptz, nullable) - status (varchar(20), default 'active') Indexes: - Primary key on id - Unique on session_id - Unique partial index: (tech_id, agent_id, status) WHERE status='active' - Indexes on: agent_id, tech_id, status Foreign Keys: - tech_id -> users(id) ON DELETE CASCADE - agent_id -> agents(id) ON DELETE CASCADE ``` ### tunnel_audit table ``` Columns: - id (bigserial primary key) - session_id (varchar(36), FK -> tech_sessions.session_id) - channel_id (varchar(36)) - operation (varchar(50)) - details (jsonb) - created_at (timestamptz, default now()) Indexes: - Primary key on id - Index on session_id - Index on created_at Foreign Keys: - session_id -> tech_sessions(session_id) ON DELETE CASCADE ``` ## API Endpoint Tests ### 1. Authentication **Endpoint:** POST /api/auth/login **Test:** Valid credentials - Status: [OK] 200 OK - Response: JWT token + user object - Token expiry: 24 hours ### 2. POST /api/v1/tunnel/open **Purpose:** Open a new tunnel session to an agent #### Test 2.1: Invalid agent_id format - Request: `{"agent_id":"invalid-uuid"}` - Expected: 400 Bad Request - Result: [OK] 400 Bad Request - Message: "Invalid agent_id format" #### Test 2.2: Agent not connected - Request: `{"agent_id":"6177bcac-e046-4166-ac76-a6db68a363ab"}` - Expected: 404 Not Found - Result: [OK] 404 Not Found - Message: "Agent not connected" #### Test 2.3: Unauthorized access (no token) - Request: No Authorization header - Expected: 401 Unauthorized - Result: [OK] 401 Unauthorized ### 3. GET /api/v1/tunnel/status/:session_id **Purpose:** Get tunnel session status #### Test 3.1: Invalid session_id format - Request: GET /api/v1/tunnel/status/invalid-uuid - Expected: 400 Bad Request - Result: [OK] 400 Bad Request - Message: "Invalid session_id format" #### Test 3.2: Non-existent session - Request: GET /api/v1/tunnel/status/00000000-0000-0000-0000-000000000000 - Expected: 403 Forbidden - Result: [OK] 403 Forbidden - Message: "Session not found or not owned by user" ### 4. POST /api/v1/tunnel/close **Purpose:** Close an existing tunnel session #### Test 4.1: Invalid session_id format - Request: `{"session_id":"invalid-uuid"}` - Expected: 400 Bad Request - Result: [OK] 400 Bad Request - Message: "Invalid session_id format" #### Test 4.2: Non-existent session - Request: `{"session_id":"00000000-0000-0000-0000-000000000000"}` - Expected: 403 Forbidden - Result: [OK] 403 Forbidden - Message: "Session not found or not owned by user" ## Connected Agents Total agents registered: 6 Online agents: 0 (all offline at test time) Sample agents: - d28a1c90-47d7-448f-a287-197bc8892234 (AD2, Windows 10) - 6177bcac-e046-4166-ac76-a6db68a363ab (Mikes-MacBook-Air.local, macOS) - 8cd0440f-a65c-4ed2-9fa8-9c6de83492a4 (gururmm, Linux) - 0b2527cc-ab3f-49d9-9a06-bfd0b4a613a7 (DESKTOP-0O8A1RL, Windows 11) ## Summary ### Working Correctly - [OK] Authentication system - [OK] Input validation (UUID format checking) - [OK] Authorization checks (JWT required) - [OK] Agent connectivity validation - [OK] Session ownership verification - [OK] Proper HTTP status codes - [OK] Database schema (migration 010 applied successfully) - [OK] Foreign key constraints - [OK] Unique constraints (prevent duplicate active sessions) ### Not Tested (Requires Online Agent) - [ ] Successful tunnel session creation - [ ] Successful tunnel session closure - [ ] Session status retrieval for active session - [ ] WebSocket communication to agent - [ ] Duplicate session detection (409 Conflict) - [ ] Tunnel audit logging ### Next Steps 1. Start an agent on a test machine 2. Test successful tunnel/open flow 3. Verify database session creation 4. Test tunnel/status retrieval 5. Test tunnel/close flow 6. Verify tunnel_audit logging 7. Test duplicate session prevention ### HTTP Status Code Summary - 200 OK: Successful operations (not tested yet) - 400 Bad Request: Invalid UUID formats [WORKING] - 401 Unauthorized: Missing/invalid JWT [WORKING] - 403 Forbidden: Session ownership issues [WORKING] - 404 Not Found: Agent not connected [WORKING] - 409 Conflict: Duplicate active session (not tested) - 500 Internal Server Error: Database errors (not triggered) ## Conclusion All Phase 1 tunnel endpoints are implemented correctly with proper: - Input validation - Authentication/authorization - Error handling - HTTP status codes - Database schema The API is ready for Phase 2 testing with live agents.