# Auth Rules Management System - Current Status ## Executive Summary The auth rules management system is **fully implemented** with a database schema that differs from c-relay. This document outlines the current state and proposes alignment with c-relay's schema. ## Current Database Schema ### Ginxsom Schema (Current) ```sql CREATE TABLE auth_rules ( id INTEGER PRIMARY KEY AUTOINCREMENT, rule_type TEXT NOT NULL, -- 'pubkey_blacklist', 'pubkey_whitelist', etc. rule_target TEXT NOT NULL, -- The pubkey, hash, or MIME type to match operation TEXT NOT NULL DEFAULT '*', -- 'upload', 'delete', 'list', or '*' enabled INTEGER NOT NULL DEFAULT 1, -- 1 = enabled, 0 = disabled priority INTEGER NOT NULL DEFAULT 100,-- Lower number = higher priority description TEXT, -- Human-readable description created_by TEXT, -- Admin pubkey who created the rule created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), CHECK (rule_type IN ('pubkey_blacklist', 'pubkey_whitelist', 'hash_blacklist', 'mime_blacklist', 'mime_whitelist')), CHECK (operation IN ('upload', 'delete', 'list', '*')), CHECK (enabled IN (0, 1)), CHECK (priority >= 0), UNIQUE(rule_type, rule_target, operation) ); ``` ### C-Relay Schema (Target) ```sql CREATE TABLE auth_rules ( id INTEGER PRIMARY KEY AUTOINCREMENT, rule_type TEXT NOT NULL, pattern_type TEXT NOT NULL, pattern_value TEXT NOT NULL, active INTEGER NOT NULL DEFAULT 1, created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) ); ``` ## Schema Differences | Field | Ginxsom | C-Relay | Notes | |-------|---------|---------|-------| | `id` | ✅ | ✅ | Same | | `rule_type` | ✅ | ✅ | Same | | `rule_target` | ✅ | ❌ | Ginxsom-specific | | `pattern_type` | ❌ | ✅ | C-relay-specific | | `pattern_value` | ❌ | ✅ | C-relay-specific | | `operation` | ✅ | ❌ | Ginxsom-specific | | `enabled` | ✅ (1/0) | ❌ | Ginxsom uses `enabled` | | `active` | ❌ | ✅ (1/0) | C-relay uses `active` | | `priority` | ✅ | ❌ | Ginxsom-specific | | `description` | ✅ | ❌ | Ginxsom-specific | | `created_by` | ✅ | ❌ | Ginxsom-specific | | `created_at` | ✅ | ✅ | Same | | `updated_at` | ✅ | ✅ | Same | ## What Has Been Implemented ### ✅ Database Layer - **Schema Created**: [`auth_rules`](../db/52e366edfa4e9cc6a6d4653828e51ccf828a2f5a05227d7a768f33b5a198681a.db) table exists with full schema - **Indexes**: 5 indexes for performance optimization - **Constraints**: CHECK constraints for data validation - **Unique Constraint**: Prevents duplicate rules ### ✅ Rule Evaluation Engine Location: [`src/request_validator.c:1318-1592`](../src/request_validator.c#L1318-L1592) **Implemented Features:** 1. **Pubkey Blacklist** (Priority 1) - Lines 1346-1377 2. **Hash Blacklist** (Priority 2) - Lines 1382-1420 3. **MIME Blacklist** (Priority 3) - Lines 1423-1462 4. **Pubkey Whitelist** (Priority 4) - Lines 1464-1491 5. **MIME Whitelist** (Priority 5) - Lines 1493-1526 6. **Whitelist Default Denial** (Priority 6) - Lines 1528-1591 **Features:** - ✅ Priority-based rule evaluation - ✅ Wildcard operation matching (`*`) - ✅ MIME type pattern matching (`image/*`) - ✅ Whitelist default-deny behavior - ✅ Detailed violation tracking - ✅ Performance-optimized queries ### ✅ Admin API Commands Location: [`src/admin_commands.c`](../src/admin_commands.c) **Implemented Commands:** - ✅ `config_query` - Query configuration values - ✅ `config_update` - Update configuration - ✅ `stats_query` - Get system statistics (includes auth_rules count) - ✅ `system_status` - System health check - ✅ `blob_list` - List stored blobs - ✅ `storage_stats` - Storage statistics - ✅ `sql_query` - Direct SQL queries (read-only) **Note:** The stats_query command already queries auth_rules: ```c // Line 390-395 sql = "SELECT COUNT(*) FROM auth_rules WHERE enabled = 1"; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (rc == SQLITE_OK && sqlite3_step(stmt) == SQLITE_ROW) { cJSON_AddNumberToObject(stats, "active_auth_rules", sqlite3_column_int(stmt, 0)); } ``` ### ❌ Missing Admin API Endpoints The following endpoints from [`docs/AUTH_RULES_IMPLEMENTATION_PLAN.md`](../docs/AUTH_RULES_IMPLEMENTATION_PLAN.md) are **NOT implemented**: 1. **GET /api/rules** - List authentication rules 2. **POST /api/rules** - Create new rule 3. **PUT /api/rules/:id** - Update existing rule 4. **DELETE /api/rules/:id** - Delete rule 5. **POST /api/rules/clear-cache** - Clear auth cache 6. **GET /api/rules/test** - Test rule evaluation ### ✅ Configuration System - ✅ `auth_rules_enabled` config flag (checked in [`reload_auth_config()`](../src/request_validator.c#L1049-L1145)) - ✅ Cache system with 5-minute TTL - ✅ Environment variable support (`GINX_NO_CACHE`, `GINX_CACHE_TIMEOUT`) ### ✅ Documentation - ✅ [`docs/AUTH_API.md`](../docs/AUTH_API.md) - Complete authentication flow - ✅ [`docs/AUTH_RULES_IMPLEMENTATION_PLAN.md`](../docs/AUTH_RULES_IMPLEMENTATION_PLAN.md) - Implementation plan - ✅ Flow diagrams and performance metrics ## Proposed Schema Migration to C-Relay Format ### Option 1: Minimal Changes (Recommended) Keep Ginxsom's richer schema but rename fields for compatibility: ```sql ALTER TABLE auth_rules RENAME COLUMN enabled TO active; ALTER TABLE auth_rules ADD COLUMN pattern_type TEXT; ALTER TABLE auth_rules ADD COLUMN pattern_value TEXT; -- Populate new fields from existing data UPDATE auth_rules SET pattern_type = CASE WHEN rule_type LIKE '%pubkey%' THEN 'pubkey' WHEN rule_type LIKE '%hash%' THEN 'hash' WHEN rule_type LIKE '%mime%' THEN 'mime' END, pattern_value = rule_target; ``` **Pros:** - Maintains all Ginxsom features (operation, priority, description) - Adds c-relay compatibility fields - No data loss - Backward compatible **Cons:** - Redundant fields (`rule_target` + `pattern_value`) - Larger schema ### Option 2: Full Migration to C-Relay Schema Drop Ginxsom-specific fields and adopt c-relay schema: ```sql -- Create new table with c-relay schema CREATE TABLE auth_rules_new ( id INTEGER PRIMARY KEY AUTOINCREMENT, rule_type TEXT NOT NULL, pattern_type TEXT NOT NULL, pattern_value TEXT NOT NULL, active INTEGER NOT NULL DEFAULT 1, created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) ); -- Migrate data INSERT INTO auth_rules_new (id, rule_type, pattern_type, pattern_value, active, created_at, updated_at) SELECT id, rule_type, CASE WHEN rule_type LIKE '%pubkey%' THEN 'pubkey' WHEN rule_type LIKE '%hash%' THEN 'hash' WHEN rule_type LIKE '%mime%' THEN 'mime' END as pattern_type, rule_target as pattern_value, enabled as active, created_at, updated_at FROM auth_rules; -- Replace old table DROP TABLE auth_rules; ALTER TABLE auth_rules_new RENAME TO auth_rules; ``` **Pros:** - Full c-relay compatibility - Simpler schema - Smaller database **Cons:** - **Loss of operation-specific rules** (upload/delete/list) - **Loss of priority system** - **Loss of description and created_by tracking** - **Breaking change** - requires code updates in [`request_validator.c`](../src/request_validator.c) ## Code Impact Analysis ### Files Requiring Updates for C-Relay Schema 1. **[`src/request_validator.c`](../src/request_validator.c)** - Lines 1346-1591: Rule evaluation queries need field name changes - Change `enabled` → `active` - Change `rule_target` → `pattern_value` - Add `pattern_type` to queries if using Option 1 2. **[`src/admin_commands.c`](../src/admin_commands.c)** - Line 390: Stats query uses `enabled` field - Any future rule management endpoints 3. **[`docs/AUTH_RULES_IMPLEMENTATION_PLAN.md`](../docs/AUTH_RULES_IMPLEMENTATION_PLAN.md)** - Update schema documentation - Update API endpoint specifications ## Recommendations ### For C-Relay Alignment **Use Option 1 (Minimal Changes)** because: 1. Preserves Ginxsom's advanced features (operation-specific rules, priority) 2. Adds c-relay compatibility without breaking existing functionality 3. Minimal code changes required 4. No data loss ### For Admin API Completion Implement the missing endpoints in priority order: 1. **POST /api/rules** - Create rules (highest priority) 2. **GET /api/rules** - List rules 3. **DELETE /api/rules/:id** - Delete rules 4. **PUT /api/rules/:id** - Update rules 5. **GET /api/rules/test** - Test rules 6. **POST /api/rules/clear-cache** - Clear cache ### Migration Script ```bash #!/bin/bash # migrate_auth_rules_to_crelay.sh DB_PATH="db/52e366edfa4e9cc6a6d4653828e51ccf828a2f5a05227d7a768f33b5a198681a.db" sqlite3 "$DB_PATH" <