# Timebank.cc Security Overview
This document provides a comprehensive overview of the authentication and security features implemented in the Timebank.cc application.
## Multi-Guard Authentication System
### Guard Architecture
The application implements a sophisticated 4-guard authentication system:
- **web**: Individual user accounts (`App\Models\User`) - Base authentication layer
- **organization**: Non-profit organization profiles (`App\Models\Organization`)
- **bank**: Timebank operator profiles (`App\Models\Bank`)
- **admin**: Administrative profiles (`App\Models\Admin`)
### Profile Relationship Model
Each User can be associated with multiple elevated profiles through relationships:
```php
// User Model Relationships
$user->organizations() // Many-to-many via organization_user table
$user->banksManaged() // Many-to-many via bank_user table
$user->admins() // Many-to-many via admins_user table
```
### Guard Switching Mechanism
#### SwitchGuardTrait Implementation
Located in `app/Traits/SwitchGuardTrait.php`:
```php
function switchGuard($newGuard, $profile) {
// Logout from all other elevated guards
foreach (['admin', 'bank', 'organization'] as $guard) {
if ($guard !== $newGuard) {
Auth::guard($guard)->logout();
}
}
Auth::guard($newGuard)->login($profile);
session(['active_guard' => $newGuard]);
}
```
**Security Features**:
- **Mutual Exclusion**: Only one elevated guard active at a time
- **Base Guard Preservation**: 'web' guard remains active as foundation
- **Session State Management**: Active guard tracked in session
#### Profile Switch Flow
Complete authentication flow for elevated profiles:
1. **Intent Registration**: Target profile stored in session
2. **Relationship Verification**: System validates user association with target profile
3. **Password Re-Authentication**: Separate password verification required for elevated access
4. **Legacy Password Migration**: Automatic Cyclos password conversion if applicable
5. **Guard Switch**: Authentication state transition using SwitchGuardTrait
6. **Session Update**: Active profile context establishment
7. **Event Broadcasting**: Real-time profile switch notification
#### Direct Login Routes for Non-User Profiles
Secure direct links to elevated profile logins for use in emails and external communications:
**Route Structure:**
```php
// Organization
GET /organization/{organizationId}/login
Route name: 'organization.direct-login'
// Bank
GET /bank/{bankId}/login
Route name: 'bank.direct-login'
// Admin
GET /admin/{adminId}/login
Route name: 'admin.direct-login'
```
**Layered Authentication Flow:**
1. **Profile Existence Validation**: System verifies target profile exists (404 if not found)
2. **User Authentication Check**:
- If user not authenticated on 'web' guard → redirect to user login
- Stores return URL in `session('url.intended')` for post-login redirect
- Custom `LoginResponse` allows redirect back to profile switch after user auth
3. **Relationship Authorization**: Verifies user owns/manages target profile (403 if denied)
4. **Profile Switch**:
- **Organizations**: Direct guard switch without password (passwordless)
- **Banks/Admins**: Sets session variables for profile password page
5. **Password Re-Authentication** (Banks/Admins only): Redirects to profile-specific password entry
6. **Guard Switch & Redirect**: Switches guard and redirects to intended URL or main page
**Security Features:**
- **Multi-Layer Verification**: Requires both user authentication AND profile relationship
- **Differentiated Authentication**:
- **Organizations**: Passwordless switch (matches in-app profile switching behavior)
- **Banks**: Separate password required for elevated financial privileges
- **Admins**: Separate password required for administrative access
- **Session Isolation**: Each profile type uses dedicated session keys
- **Intended URL Validation**: Only allows redirects to profile login routes during user auth phase
- **Automatic Cleanup**: Session variables cleared after successful authentication
- **Access Control**:
- Organizations: Verified via `organization_user` pivot table
- Banks: Verified via `bank_managers` pivot table
- Admins: Verified via `admin_user` pivot table
**Session Variables Used:**
```php
// Common for all types
'url.intended' // Laravel's intended URL (user login phase)
'intended_profile_switch_type' // Target profile type (Organization|Bank|Admin)
'intended_profile_switch_id' // Target profile ID
// Profile-specific final redirects
'organization_login_intended_url' // Post-organization-login destination
'bank_login_intended_url' // Post-bank-login destination
'admin_login_intended_url' // Post-admin-login destination
```
**Implementation Locations:**
- Controllers: `OrganizationLoginController`, `BankLoginController`, `AdminLoginController`
- Custom Response: `app/Http/Responses/LoginResponse.php` (handles user login redirects)
- Routes: `routes/web.php` (lines 434, 448, 462)
- Documentation: `references/PROFILE_DIRECT_LOGIN.md`
**Use Case Examples:**
```php
// Email notification to organization manager
route('organization.direct-login', [
'organizationId' => $org->id,
'intended' => route('event.approve', $event->id)
])
// Bank transaction alert
route('bank.direct-login', [
'bankId' => $bank->id,
'intended' => route('transaction.review', $tx->id)
])
// Admin moderation request
route('admin.direct-login', [
'adminId' => $admin->id,
'intended' => route('report.handle', $report->id)
])
```
This feature maintains the security principle of layered authentication while providing seamless deep-linking capabilities for email workflows.
### Session-Based Profile Management
#### Global Helper Functions
Located in `app/Helpers/ProfileHelper.php`:
- **getActiveProfile()**: Retrieves current active profile model from session
- **getActiveProfileType()**: Returns profile type name (User, Organization, Bank, Admin)
- **userOwnsProfile()**: Verifies user ownership of profile through relationships
#### Session Data Structure
Active profile information stored in encrypted session:
- Profile type (full class name)
- Profile ID and name
- Profile photo path
- Last activity timestamp
- Active guard identifier
### Custom Middleware Stack
#### SetActiveGuard Middleware
Ensures Laravel uses the correct guard for each request based on session state.
#### AuthAnyGuard Middleware
Validates authentication across multiple specified guards, redirecting to login if none are authenticated.
**Usage Pattern**: `middleware(['auth.any:admin,bank,organization,web'])`
### Template Security Integration
#### Custom Blade Directives
Registered in `AppServiceProvider.php`:
```blade
@profile('admin')
Admin-only content
@endprofile
@usercan('manage users')
@endusercan
```
These directives provide secure, session-aware template rendering based on active profile type and permissions.
## Database-Level Security
### Transaction Immutability
**Critical Financial Security** implemented at MySQL user permission level:
The application database user has restricted permissions where transactions can only be created (INSERT) and read (SELECT), but never modified (UPDATE) or deleted (DELETE). This ensures:
- All transactions are permanent once created
- Application cannot modify transaction history
- Complete financial audit trail maintained
- Prevents accidental or malicious transaction tampering
### Model Security Patterns
- **Mass Assignment Protection**: Models use selective `$fillable` arrays
- **Hidden Attributes**: Sensitive fields (passwords, tokens) hidden from serialization
- **Soft Deletes**: Critical models use soft deletion to preserve data integrity
## Session Security & Timeout Management
### Profile-Specific Timeout Policies
The system supports configurable timeout periods per profile type:
- Different timeout durations based on profile privilege level
- More privileged profiles can have shorter timeout periods
- Configurable through `config/timebank-cc.php`
### Timeout Security Features
Implemented in `CheckProfileInactivity` middleware:
#### Graduated Timeout Behavior
- **Standard Users**: Configurable full logout on timeout
- **Elevated Profiles**: Configurable graceful demotion to User profile
- **Security Principle**: Higher privilege levels can have shorter timeouts
#### Activity Tracking Exclusions
System excludes specific routes (heartbeat, livewire updates) from resetting activity timers to prevent artificial session extension.
#### AJAX-Aware Timeout Responses
Provides appropriate JSON responses for timeout events in AJAX requests with proper HTTP status codes.
### Session Encryption & Storage
- **Database Storage**: Sessions stored in database for scalability
- **Encryption**: All session data encrypted
- **Configurable Lifetime**: Base session lifetime configurable
- **Secure Cookies**: HTTPS-only and HttpOnly flags in production
## Livewire Method-Level Authorization
### Protection Against Direct Method Invocation Attacks
**Critical Security Feature** implemented across all admin management Livewire components to prevent unauthorized direct method calls.
#### The Vulnerability
Livewire components present a unique security challenge: the `mount()` method only executes once when the component loads. After that, any public method can be called directly via browser console:
```javascript
Livewire.find('component-id').call('methodName', parameters)
```
If authorization is only checked in `mount()`, attackers can bypass these checks by calling methods directly after the component loads.
#### The Solution: RequiresAdminAuthorization Trait
**File**: `app/Http/Livewire/Traits/RequiresAdminAuthorization.php`
All sensitive admin operations use this trait which provides:
- **ProfileAuthorizationHelper Integration**: Centralized authorization with database-level validation
- **Cross-Guard Attack Prevention**: Validates authenticated guard matches profile type
- **IDOR Prevention**: Prevents access to unauthorized profiles
- **Bank Level Validation**: Only central bank (level=0) can access admin functions
- **Performance Caching**: Request-scoped caching to avoid repeated checks
#### Protected Components (27 Methods)
1. **Posts/Manage.php** - 7 methods (create, edit, save, delete, undelete, publication control)
2. **Categories/Manage.php** - 4 methods (create, update, delete operations)
3. **Tags/Manage.php** - 3 methods (create, update, delete operations)
4. **Tags/Create.php** - 1 method (create)
5. **Profiles/Manage.php** - 5 methods (create, update, delete, restore, attach operations)
6. **Profiles/Create.php** - 1 method (create) - **Critical vulnerability fixed**
7. **Mailings/Manage.php** - 6 methods (create, save, send, delete operations) - **Bulk delete vulnerability fixed**
#### Usage Pattern
```php
public function sensitiveOperation($id)
{
// CRITICAL: Authorize admin access at method level
$this->authorizeAdminAccess();
// Now safe to perform the sensitive operation
Model::find($id)->update($data);
}
```
#### Documentation
See `references/LIVEWIRE_METHOD_AUTHORIZATION_SECURITY.md` for comprehensive documentation including:
- Complete method inventory
- Security architecture details
- Testing requirements
- Migration guide for new components
## Role-Based Access Control (RBAC)
### Spatie Permissions Integration
Advanced permission system with hierarchical roles:
#### Role Naming Convention
```php
// Pattern: {ProfileType}\{ProfileID}\{role-suffix}
"Admin\{id}\admin"
"Bank\{id}\bank-manager"
"Organization\{id}\organization-manager"
```
#### Permission Categories
Granular permissions for different functional areas:
- **Content Management**: Posts, categories, tags
- **Profile Management**: User profiles and accounts
- **Transaction Management**: Financial operations
- **System Administration**: Platform configuration
#### Permission Checking Implementation
Custom traits provide methods to verify permissions based on active profile context and role assignments.
## Input Validation & Protection
### CSRF Protection
- **Implementation**: Laravel's built-in `VerifyCsrfToken` middleware
- **Scope**: All state-changing requests protected
- **No Exclusions**: Maximum security with no CSRF bypass routes
### Hidden Captcha Protection
Time-based form submission validation:
- **Minimum Submission Time**: Prevents bot submissions
- **Maximum Submission Time**: Prevents abandoned form attacks
- **Configurable Timing**: Adjustable timing windows
### Form Validation Security
Multi-layer validation approach:
#### Authorization Verification
- Model class existence validation
- Profile existence verification
- User association checking through relationships
- Hash-based verification for sensitive operations
#### Hash-Based Security
- **Email Verification**: SHA1 hash comparison prevents URL tampering
- **Timing Attack Protection**: `hash_equals()` prevents timing analysis
- **Association Validation**: Users must own profiles to perform actions
## Legacy System Security
### Cyclos Password Migration
Secure migration from legacy Cyclos system:
- **Backward Compatibility**: Supports existing SHA256+salt passwords
- **Automatic Conversion**: Migrates to Laravel hashing on successful login
- **One-Time Migration**: Salt removed after conversion
- **Transparent Process**: Users unaware of password format changes
## Real-Time Security
### WebSocket Authentication
Integration with Laravel Reverb and WireChat:
#### Multi-Guard Support
WireChat configured to work with all 4 authentication guards, ensuring real-time features respect the multi-profile system.
#### Presence Tracking Security
- **Guard-Aware Tracking**: Presence system tracks which guard user is active on
- **Authentication Verification**: Presence updates only for authenticated users
- **Profile Context**: Presence reflects current active profile type
### Broadcasting Security
- **Private Channels**: User-specific channels prevent unauthorized access
- **Authentication Requirements**: Channels require proper authentication
- **Event Data Security**: Only necessary profile information broadcast
## Route Protection Strategies
### Layered Middleware Protection
Multiple middleware combinations for different security levels.
#### Multi-Guard Routes
Routes can specify multiple acceptable guards for flexible access control.
#### Guard-Specific Routes
Routes can require specific guard types for profile-type-restricted functionality.
#### Enhanced Security Routes
High-security routes can combine multiple middleware layers (authentication, session verification, email verification).
## Activity Logging & Monitoring
### Comprehensive Activity Tracking
Using Spatie ActivityLog package:
#### Profile Switch Logging
All profile switches logged with:
- Source and target profile information
- Timestamp and user context
- Previous login information
- Custom log categories
#### Selective Model Logging
Models configured to log only sensitive attribute changes to balance security with performance.
### Event Broadcasting System
Profile switches and security events broadcast through:
- **Private Channels**: User-specific channels prevent eavesdropping
- **Secure Event Data**: Minimal necessary information broadcast
- **Queue Processing**: Events processed through authenticated queue system
## Profile Inactivity Management
### Automated Inactivity Detection
Configurable inactivity policies for:
- **Search Visibility**: Hide inactive profiles from search results
- **Messenger Access**: Remove inactive profiles from chat searches
- **Profile Access**: Control profile page visibility
- **Labeling**: Visual indicators for inactive status
### Security Implications
- **Privacy Protection**: Inactive profiles automatically hidden
- **Reversible Process**: Profiles can be reactivated without data loss
- **Configurable Behavior**: All inactivity policies configurable
## Email Verification Security
### Multi-Profile Email Verification
Custom implementation supporting all profile types:
#### Association Verification
Strict verification that users own the profiles they're attempting to verify through proper relationship checking.
#### Hash Verification Security
Uses timing-attack-resistant hash comparison for email verification URLs.
## Security Configuration Framework
### Key Configuration Files
- `config/auth.php`: Multi-guard authentication setup
- `config/fortify.php`: Authentication feature configuration
- `config/permission.php`: Role-based access control settings
- `config/hidden_captcha.php`: Bot protection timing configuration
- `config/timebank-cc.php`: Profile timeout and security policies
### Environment Security
- **Database User Restrictions**: Limited MySQL permissions for application user
- **Session Security**: Configurable encryption and storage options
- **Rate Limiting**: Configurable throttling for authentication attempts
- **Timeout Policies**: Profile-specific session timeout configuration
## Security Best Practices
### Defense in Depth
- **Multiple Authentication Layers**: Guards + middleware + permissions + database restrictions
- **Input Validation**: Request validation + model validation + business logic validation
- **Session Security**: Encryption + timeouts + activity tracking + CSRF protection
### Principle of Least Privilege
- **Minimal Permissions**: Roles contain only necessary permissions
- **Profile Isolation**: Elevated profiles automatically timeout to lower privilege
- **Relationship Verification**: Strict ownership checks before profile access
### Audit & Monitoring
- **Complete Activity Logging**: All profile actions tracked with configurable retention
- **Real-time Event Broadcasting**: Immediate notification of security events
- **Comprehensive Error Logging**: Detailed logging without exposing sensitive data
### Secure Defaults
- **Encrypted Sessions**: All session data encrypted by default
- **CSRF Protection**: Universal CSRF verification with no exclusions
- **Email Verification**: Configurable verification requirements
- **Password Confirmation**: Required for sensitive operations
This security framework provides robust protection for the time banking platform while maintaining flexibility through comprehensive configuration options.