Skip to content

Admin Features

ARROW provides administrative features for site administrators to support users and troubleshoot issues. The primary admin feature is user impersonation, which allows authorized administrators to temporarily assume the identity of another user.

Admin impersonation enables site administrators to experience ARROW exactly as a specific user would, facilitating support and troubleshooting without requiring the user’s credentials.

Use CaseDescription
Support troubleshootingInvestigate user-reported issues
Permission verificationVerify user sees expected content
TrainingDemonstrate features from user perspective
AuditVerify user access and capabilities

Only users with elevated privileges can impersonate:

PrivilegeCan Impersonate
is_site_adminYes
is_superuserYes
Regular AdminNo
ManagerNo
UserNo

The impersonation process follows a secure workflow with full audit logging.

sequenceDiagram
    participant Admin
    participant Arrow
    participant PocketBase
    participant TargetUser

    Admin->>Arrow: Select Organization
    Arrow-->>Admin: List Users in Org
    Admin->>Arrow: Generate Token (user, reason, duration)
    Arrow->>Arrow: Validate Admin Permissions
    Arrow->>PocketBase: Create Auth Token for Target User
    PocketBase-->>Arrow: JWT Token
    Arrow->>Arrow: Hash Token (SHA-256)
    Arrow->>Arrow: Create Session Record
    Arrow-->>Admin: Return Token
    Admin->>Arrow: Use Token as Target User
    Arrow->>PocketBase: Validate Token
    PocketBase-->>Arrow: Authenticated as Target User
    Arrow-->>Admin: Access Granted
  1. Select organization - Admin chooses the target user’s organization
  2. Select role filter - Optionally filter users by role
  3. Select target user - Choose the user to impersonate
  4. Provide reason - Document justification for impersonation (required)
  5. Set duration - Specify token validity period (default: 1 hour)
  6. Generate token - System creates time-limited auth token
  7. Session logged - Comprehensive audit record created
  8. Use token - Admin authenticates as target user
  9. Terminate session - Manually end early or let token expire

Token generation is implemented in backend/api/admin_impersonation/handlers.go (lines 262-271):

token, err := targetUser.NewAuthToken()
if err != nil {
return err
}

The token is a standard PocketBase JWT that authenticates as the target user.

ARROW implements multiple security controls to prevent abuse of the impersonation feature.

Impersonation is rate-limited per admin (lines 205-329 in backend/api/admin_impersonation/handlers.go):

LimitValue
Impersonations per hour5
Per adminIndividual tracking
ControlImplementation
Token hashingSHA-256 hash stored (never raw token)
Time limitationConfigurable expiration (default 1 hour)
Single use trackingSession records track token usage

Tokens automatically expire after the specified duration. The system enforces expiration by:

  1. Storing expires_at timestamp on session record
  2. Validating expiration on token use
  3. Rejecting expired tokens

Every impersonation session records:

FieldPurpose
ip_addressClient IP of admin
user_agentBrowser/client information
createdSession start timestamp
reasonDocumented justification

Users without an organization cannot be impersonated. This prevents impersonation of:

  • Site administrators
  • System service accounts
  • Unassigned users

Impersonation sessions are tracked in the impersonation_sessions collection.

FieldTypeDescription
admin_userRelationID of admin who initiated impersonation
target_userRelationID of user being impersonated
reasonTextJustification for impersonation
token_hashTextSHA-256 hash of the auth token
expires_atDateTimeSession expiration timestamp
terminated_atDateTimeEarly termination timestamp (optional)
ip_addressTextClient IP of admin
user_agentTextBrowser/client info

Sessions can be viewed based on admin privileges:

PrivilegeVisibility
Site AdminAll sessions across all admins
Regular AdminOnly their own sessions

Active sessions can be terminated early:

POST /api/admin/impersonation/terminate/{session_id}

Termination:

  • Sets terminated_at timestamp
  • Invalidates the token immediately
  • Logs termination event
GET /api/admin/impersonation/organizations

Returns organizations available for impersonation.

Response:

[
{
"id": "org_123",
"name": "Acme Corporation"
}
]
GET /api/admin/impersonation/roles?organizationId={org_id}

Returns roles assignable within the specified organization.

Response:

[
{
"id": "role_admin",
"name": "Admin"
},
{
"id": "role_manager",
"name": "Manager"
},
{
"id": "role_user",
"name": "User"
}
]
GET /api/admin/impersonation/users?organizationId={org_id}

Returns users in the specified organization that can be impersonated.

Query Parameters:

ParameterRequiredDescription
organizationIdYesOrganization ID
roleIdNoFilter by role

Response:

[
{
"id": "user_123",
"name": "John Doe",
"email": "john@example.com",
"role": "Admin"
}
]
POST /api/admin/impersonation/generate-token

Generates a time-limited authentication token for impersonation.

Request:

{
"target_user_id": "user_123",
"reason": "Investigating reported permission issue",
"duration_minutes": 60
}
FieldRequiredDescription
target_user_idYesUser to impersonate
reasonYesJustification (min 10 characters)
duration_minutesNoToken validity (default: 60, max: 480)

Response:

{
"token": "eyJhbGciOiJIUzI1NiIs...",
"expires_at": "2024-01-15T15:30:00Z",
"session_id": "session_abc123"
}
POST /api/admin/impersonation/terminate/{session_id}

Terminates an active impersonation session early.

Response:

{
"success": true,
"terminated_at": "2024-01-15T14:45:00Z"
}
GET /api/admin/impersonation/sessions

Lists impersonation sessions (filtered by admin privileges).

Query Parameters:

ParameterDescription
statusFilter by status: active, expired, terminated, all
admin_idFilter by admin (site admins only)

Response:

[
{
"id": "session_abc123",
"admin_user": {
"id": "admin_1",
"name": "Site Admin"
},
"target_user": {
"id": "user_123",
"name": "John Doe"
},
"reason": "Investigating permission issue",
"created": "2024-01-15T14:00:00Z",
"expires_at": "2024-01-15T15:00:00Z",
"terminated_at": null,
"ip_address": "192.168.1.100",
"user_agent": "Mozilla/5.0..."
}
]

ARROW maintains a comprehensive audit trail for all impersonation activity.

The system logs impersonation events in backend/api/admin_impersonation/handlers.go:

Token Generation (lines 250-258, 307-315):

[IMPERSONATION] Admin {admin_id} generated token for user {target_id}
Reason: {reason}
Duration: {minutes} minutes
IP: {ip_address}
User-Agent: {user_agent}

Session Termination (lines 368-373):

[IMPERSONATION] Session {session_id} terminated by {admin_id}
Original admin: {original_admin}
Target user: {target_user}
Reason for termination: {reason}

To audit impersonation activity:

  1. Via API - Use GET /api/admin/impersonation/sessions with appropriate filters
  2. Via PocketBase - Query impersonation_sessions collection directly
  3. Export logs - Application logs contain detailed impersonation events

Session records are never deleted:

ActionRecord Effect
Create sessionNew record with all details
Terminate sessionterminated_at timestamp set
Session expiresNo change (natural expiration)

This ensures complete audit history for compliance requirements.

RequirementARROW Implementation
Access justificationRequired reason field
Time limitationConfigurable token expiration
Activity loggingComprehensive session records
Review capabilitySession listing and filtering
TerminationImmediate revocation support
FilePurpose
backend/api/admin_impersonation/handlers.goAll impersonation endpoints and logic
FunctionLinesDescription
Rate limiting205-3295 impersonations/hour/admin
Token generation262-271Create target user auth token
Token hashing275-280SHA-256 hash for storage
Logging (generate)250-258, 307-315Token generation audit
Logging (terminate)368-373Session termination audit