21 KiB
Ginxsom Blossom Server Implementation Checklist
This document outlines the implementation plan for ginxsom, a FastCGI-based Blossom server designed to work with nginx for optimal performance.
Architecture Overview
- nginx: Handles static file serving (GET /) for maximum performance
- FastCGI Application: Handles authenticated operations, metadata queries, uploads
- SQLite Database: Stores blob metadata and server configuration
- File Storage: Flat directory structure initially, hierarchical optimization later
Phase 1: Basic File Serving & Retrieval (BUD-01)
1.1 Infrastructure Setup
- Create basic directory structure
- Create
blobs/directory for file storage - Create
db/directory for SQLite database - Create
logs/directory for application logs - Set up proper permissions (nginx readable, app writable)
- Create
1.2 Database Schema
- Design SQLite schema for blob metadata
blobstable: sha256, size, type, uploaded_at, uploader_pubkey, filenameserver_configtable: key-value pairs for server settings- Create database initialization script
- Add proper indexes on sha256 hash
1.3 nginx Configuration
- Configure nginx for static file serving
- Set up location block for
GET /<sha256>pattern with extension support - Configure try_files directive for multiple extension fallbacks
- Configure proper MIME type detection
- Add proper headers (Cache-Control, ETag, etc.)
- Handle 404s gracefully when blob doesn't exist
- Configure FastCGI pass-through for HEAD and non-GET requests
- Set up location block for
Future Enhancement Note: Consider implementing nginx Lua extension for true Blossom compliance with dynamic file discovery. The current approach uses explicit extension lists in try_files, which works well for common extensions but may not serve files with unusual extensions. Lua module would allow runtime directory scanning for hash-matching files regardless of extension.
1.4 Basic HEAD Endpoint
- Implement FastCGI handler for
HEAD /<sha256>- Query database for blob metadata (single source of truth)
- Extract SHA-256 from URL (strip extensions)
- Return proper headers (Content-Type, Content-Length, etc.)
- Return 404 if blob doesn't exist in database
- Add server timing headers for debugging
1.5 Testing & Validation
- Create test blobs with known SHA-256 hashes
- Verify nginx serves files correctly with extension support
- Verify HEAD requests return proper metadata
- Test with missing files (404 responses)
- Test HEAD requests with and without extensions
- Performance test with large files
Phase 2: Upload & Authentication (BUD-02)
2.1 Nostr Authentication Setup
-
Integrate nostr_core_lib submodule
- Update Makefile to include nostr_core_lib paths and static library
- Build libnostr_core_x64.a using provided build.sh script
- Add system dependencies: -lsecp256k1 -lssl -lcrypto -lcurl -lz -ldl -lpthread -lm
-
Implement authentication functions in main.c (BUD-02 section):
parse_authorization_header()- Extract JSON from "Nostr base64(event)" headervalidate_blossom_event()- Validate Blossom-specific requirements (kind 24242, content hash, method, expiration)authenticate_request()- Main orchestrator function
-
Leverage existing nostr_core_lib functions:
- Use
nostr_validate_event()for structure + signature validation (from nip001.h) - Use standardized error codes from nostr_common.h (NOSTR_SUCCESS, NOSTR_ERROR_EVENT_INVALID_SIGNATURE, etc.)
- Use
nostr_strerror()for error message translation
- Use
2.2 Upload Endpoint Implementation
- Implement
PUT /uploadendpoint- Parse Authorization header (Nostr base64 event extraction)
- Stream file upload to temporary location
- Calculate SHA-256 hash during upload
- Validate hash matches authorization if provided
- Move file to permanent location
- Store metadata in database (including uploader_pubkey and filename)
- Return blob descriptor JSON response
2.3 Blob Descriptor Response
- Implement blob descriptor structure
- Required fields: url, sha256, size, type, uploaded
- Handle MIME type detection
- Generate proper blob URLs
- Add optional server-specific fields (uploader_pubkey, filename)
2.4 Error Handling
- Implement proper HTTP status codes
- 400 Bad Request for invalid data
- 401 Unauthorized for auth failures
- 409 Conflict for hash mismatches
- 413 Payload Too Large for size limits
- 500 Internal Server Error for system issues
- Add detailed error messages
- Implement request logging
2.5 List Blobs Endpoint
- Implement
GET /list/<pubkey>endpoint- Extract pubkey from URL path
- Query database for blobs uploaded by specified pubkey
- Support
sinceanduntilquery parameters for date filtering - Return JSON array of blob descriptors
- Handle empty results gracefully
- Implement optional authorization with kind 24242 event validation
- Validate
ttag is set to "list" - Check authorization expiration
- Verify event signature and structure
- Validate
2.6 Delete Blob Endpoint
- Implement
DELETE /<sha256>endpoint- Extract SHA-256 hash from URL path
- Require authorization with kind 24242 event validation
- Validate
ttag is set to "delete" - Verify at least one
xtag matches the requested hash - Check authorization expiration
- Verify event signature and structure
- Validate
- Check blob exists in database
- Verify uploader_pubkey matches authorized pubkey (ownership check)
- Remove blob file from filesystem
- Remove blob metadata from database
- Handle file deletion errors gracefully
- Return appropriate success/error responses
2.7 Testing & Validation
- Test uploads without authentication
- Test uploads with valid nostr auth ✅ WORKING (HTTP 200 success)
- Test uploads with invalid auth ✅ WORKING (proper error responses with specific error types)
- Test hash mismatch scenarios ✅ WORKING (409 Conflict responses)
- Test file size limits
- Verify blob descriptors are correct
- Verify database metadata storage (uploader_pubkey and filename)
Phase 3: Upload Requirements (BUD-06)
3.1 Upload Policy Configuration
- Add server configuration options
- Maximum file size limits
- Allowed MIME types
- Authentication requirements
- Rate limiting settings
- Storage quota limits
- Hash-based banning/filtering
3.2 HEAD /upload Endpoint Implementation
- Implement
HEAD /uploadendpoint for pre-flight upload validation- Parse client headers:
X-SHA-256: blob's SHA-256 hashX-Content-Length: blob size in bytesX-Content-Type: blob's MIME type
- Handle optional Authorization header (same as PUT /upload)
- Perform validation checks without file transfer:
- Validate SHA-256 format
- Check file size against limits
- Validate MIME type restrictions
- Check authentication if required
- Check if hash already exists (duplicate detection)
- Check if hash is banned
- Return appropriate HTTP status codes:
200 OK- upload can proceed400 Bad Request- invalid headers401 Unauthorized- auth required403 Forbidden- not permitted (banned hash, etc.)411 Length Required- missing content length413 Content Too Large- file too large415 Unsupported Media Type- invalid MIME type
- Add
X-Reasonheader with human-readable error messages
- Parse client headers:
3.3 Upload Pre-validation Logic
- Create validation functions that can be shared between HEAD and PUT endpoints
validate_upload_headers()- check required headers present and validcheck_file_size_limits()- enforce maximum size restrictionscheck_mime_type_allowed()- validate against allowed types listcheck_hash_restrictions()- check banned hashes, duplicatescheck_upload_permissions()- user-specific upload rights
3.4 DOS Protection Benefits
- Implement early rejection before file transfer:
- Authentication happens before any file data sent
- Size validation prevents large file uploads that would be rejected
- MIME type checking prevents unwanted file types
- Hash checking prevents duplicate uploads
- Update PUT /upload to use same validation functions for consistency
3.5 Client Integration Support
- Update nginx configuration to properly handle HEAD requests to /upload
- Ensure FastCGI handles HEAD method for /upload endpoint
- Add CORS headers for preflight requests
3.6 Testing & Validation
- Test HEAD /upload with valid headers
- Test various error scenarios (missing headers, invalid formats)
- Test authorization requirements
- Test policy enforcement (size limits, MIME types, banned hashes)
- Verify error responses match BUD-06 specification
- Test client workflow: HEAD check → PUT upload
- Verify DOS protection effectiveness
Phase 4: Advanced Authentication & Administration System
4.1 Flexible Authentication Rules System
4.1.1 Database Schema Extension
- Create authentication rules tables
auth_rulestable: rule_type, rule_target, operation, rule_value, enabled, expires_atauth_cachetable: performance caching for rule evaluation results- Add indexes on rule_type, rule_target, operation for performance
4.1.2 Authentication Rule Types Implementation
- Basic rule types:
pubkey_whitelist: Only specific pubkeys allowedpubkey_blacklist: Specific pubkeys bannedhash_blacklist: Specific file hashes cannot be uploadedmime_type_whitelist: Only specific content types allowedmime_type_blacklist: Specific content types banned
- Advanced rule types:
rate_limit: Limit operations per pubkey/IP per time periodsize_limit: Per-pubkey or global size limitsconditional: Complex JSON-based rules (time-based, size-based, etc.)
4.1.3 Rule Evaluation Engine
- Core authentication functions:
evaluate_auth_rules(): Main rule evaluation with cachingcheck_rule_cache(): Performance optimization layerprocess_rule_priority(): Handle rule precedence and conflictsupdate_auth_cache(): Store evaluation results for reuse
- Integration points:
- Extend
handle_upload_request()with rule evaluation - Extend
handle_delete_request()with rule evaluation - Extend
handle_list_request()with rule evaluation (optional)
- Extend
4.1.4 Rule Management Interface
- SQL-based rule management:
add_auth_rule(): Add new authentication rulesremove_auth_rule(): Remove rules by IDlist_auth_rules(): Query existing rules with filtersupdate_auth_rule(): Modify existing rule parameters
4.2 Nostr-Native Administrative Interface
4.2.1 Server Identity Management
- Server keypair generation and storage:
- Generate server public/private keypair on first run
- Store server pubkey in
server_configtable - Secure private key storage (encrypted file or environment)
- Key rotation capabilities for security
4.2.2 Administrator Management System
- Administrator database schema:
administratorstable: pubkey, permissions, added_by, expires_at- Permission levels: rules, config, users, stats, * (full access)
- Initial admin setup during server deployment
- Administrative functions:
check_admin_permissions(): Verify admin authorizationadd_administrator(): Grant admin privilegesremove_administrator(): Revoke admin privilegeslist_administrators(): Query admin list with permissions
4.2.3 Administrative Event Types
- Event kind definitions:
- Kind 30242: Administrative commands (rule_add, rule_remove, config_set, etc.)
- Kind 30243: Administrative queries (stats_get, rule_list, audit_log, etc.)
- Kind 30244: Administrative responses (command results, query data)
- Command implementations:
- Rule management:
rule_add,rule_remove,rule_update,rule_list - System management:
config_set,config_get,admin_add,admin_remove - Query operations:
stats_get,blob_list,audit_log,storage_cleanup
- Rule management:
4.2.4 Administrative Event Processing
- HTTP administrative endpoint:
POST /adminwith nostr event authorization- JSON command interface with parameter validation
- Synchronous response with operation results
- Direct nostr relay integration (future enhancement):
- Subscribe to administrative events on configured relays
- Real-time event processing and response
- Publish response events back to relays
4.2.5 Administrative Audit Trail
- Administrative logging system:
admin_logtable: track all administrative actions- Event ID references for nostr event traceability
- Success/failure tracking with detailed error messages
- Audit query capabilities for compliance
4.2.6 Security & Permission Framework
- Multi-level permission system:
- Granular permissions: rules, config, users, stats
- Permission inheritance and delegation
- Time-limited administrative access (expires_at)
- Authentication security:
- Strong nostr signature validation
- Administrator authorization chain verification
- Command-specific permission checks
- Rate limiting for administrative operations
4.3 Integration & Testing
- Authentication system integration:
- Integrate rule evaluation into existing authentication flow
- Maintain backward compatibility with nostr-only authentication
- Performance testing with rule caching
- Administrative system testing:
- Test all administrative commands and queries
- Verify permission enforcement and security
- Test audit logging and compliance features
- Load testing for administrative operations
Phase 5: Optional Features
Phase 5: Optional Features
4.1 User Server Lists (BUD-03) - Optional
- Implement server list advertisement
- Handle kind:10063 events
- Create server discovery endpoint
- Test client fallback scenarios
4.2 Blob Mirroring (BUD-04) - Optional
- Implement
PUT /mirrorendpoint - Add URL downloading capability
- Implement hash verification
- Handle authorization for mirroring
- Test inter-server mirroring
4.3 Media Optimization (BUD-05) - Optional
- Implement
PUT /mediaendpoint - Add media processing libraries
- Implement optimization algorithms
- Handle various media formats
- Test optimization pipeline
4.4 Payment Integration (BUD-07) - Optional
- Implement 402 Payment Required responses
- Add Lightning payment support
- Add Cashu payment support
- Implement payment verification
- Test payment flows
4.5 NIP-94 Metadata (BUD-08) - Optional
- Add NIP-94 tag generation
- Extend blob descriptor responses
- Generate magnet links if supported
- Test metadata compatibility
4.6 Blob Reporting (BUD-09) - Optional
- Implement
PUT /reportendpoint - Handle NIP-56 report events
- Add moderation interface
- Implement content filtering
- Test reporting workflow
Development Milestones
Milestone 1: Basic Functionality (Phase 1 Complete)
- nginx serves files by hash with extension support
- HEAD requests return metadata from database
- Database stores blob information with proper schema
Milestone 2: Full Upload Support (Phase 2 Pending)
- Basic upload functionality working (PUT requests accepted)
- SHA-256 hash calculation during upload
- File storage to blobs/ directory
- Blob descriptor JSON response
- Authenticated uploads working (Nostr kind 24242 event validation)
- Proper error handling for upload scenarios
- Database metadata storage during upload (with uploader_pubkey and filename)
- List blobs endpoint implemented (GET /list/)
- Delete blob endpoint implemented (DELETE /)
Milestone 3: Policy Compliance (Phase 3 Pending)
- Upload requirements implemented
- Server policies configurable
- Spec compliance verified
Milestone 4: Advanced Authentication (Phase 4 Complete)
- Flexible authentication rules system operational
- Nostr-native administrative interface implemented
- Rule evaluation engine with caching performance
- Administrative audit trail and compliance features
Milestone 5: Production Ready (Phase 5 Complete)
- Optional features implemented as needed
- Performance optimized
- Security hardened
- Documentation complete
Testing Strategy
Unit Tests
- Authentication validation functions
- SHA-256 hash calculation
- Database operations
- Configuration parsing
Integration Tests
- nginx + FastCGI integration
- End-to-end upload/download flows
- Error scenario handling
- Multi-client concurrent access
Performance Tests
- Large file uploads/downloads
- Concurrent request handling
- Database query performance
- Memory usage optimization
Compliance Tests
- Blossom protocol compliance
- Nostr event validation
- HTTP specification compliance
- Security best practices
Future Improvements
Upload Security & Performance Enhancements
Current Issue: The existing upload flow has a DOS vulnerability where large files are loaded entirely into memory before authentication occurs. This allows unauthenticated attackers to exhaust server memory.
Current Flow:
Client → nginx → FastCGI ginxsom
├─ reads entire file into memory (malloc + fread)
├─ validates auth (after file in memory)
└─ saves to blobs/ or errors
Proposed Solution - nginx Upload Module:
Client → nginx upload module → temp file → FastCGI ginxsom
├─ saves to /tmp/uploads/ ├─ validates auth quickly
└─ passes metadata only ├─ moves file to blobs/
└─ or deletes temp file
Benefits:
- Eliminates DOS vulnerability - nginx handles large files efficiently
- Fast auth validation - no waiting for full upload
- Leverages nginx strengths - what it's designed for
- Better scalability - memory usage independent of file size
Implementation Requirements:
- nginx upload module configuration
- Temp file cleanup handling
- Modified FastCGI code to process file paths instead of stdin
- Proper error handling for temp file operations
Alternative Enhancement - HTTP 100 Continue: Could propose new Blossom BUD for two-phase upload:
- Client sends headers with
Expect: 100-continue+ auth event - Server validates early (signature, expiration, pubkey)
- Server responds
100 Continueor401 Unauthorized - Client only sends file data if authorized
Priority: Implement after core BUD compliance is complete.
Security Considerations
- Input validation on all endpoints
- Rate limiting to prevent abuse
- Secure file storage permissions
- Database injection prevention
- Memory safety in C implementation
- Proper error message sanitization
- Log security (no sensitive data)
- secp256k1 Context Initialization Fixed - Authentication system now fully functional
- API Refactoring Complete - Upgraded from low-level crypto headers to high-level
nostr_crypto_init()API - Enhanced Error Messages - Specific error types: event_expired, invalid_signature, invalid_pubkey, etc.
- Upload DOS vulnerability - Current implementation vulnerable to memory exhaustion attacks
Performance Optimizations
- nginx direct file serving (bypasses application)
- FastCGI connection pooling
- Database connection management
- Efficient hash calculation
- Memory-mapped file operations
- Hierarchical file storage (future)
- CDN integration support
Deployment Checklist
- nginx configuration template
- FastCGI service configuration
- Database initialization scripts
- Log rotation setup
- Monitoring and health checks
- Backup procedures
- Security hardening guide
- Documentation and examples