Commit Graph

151 Commits

Author SHA1 Message Date
Eric Gullickson
513df9c027 Updated image to node:lts-alpine 2025-12-20 12:16:58 -06:00
Eric Gullickson
065fed8d98 Fix GitLab CI backend health check
Use docker exec curl instead of node http.get from host.
Port 3001 is not exposed to host, so health checks must run inside the container.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-20 12:06:44 -06:00
Eric Gullickson
ce6976d3ab Fix Let's Encrypt certificate deployment issues
- Change CF_DNS_API_TOKEN_FILE to CLOUDFLARE_DNS_API_TOKEN_FILE (correct env var for Traefik/lego)
- Fix inject-secrets.sh to clean up Docker-created directories before injecting secrets
- Add detection for GitLab variables set as Variable type instead of File type
- Improve error messages to help diagnose configuration issues

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-20 11:45:00 -06:00
Eric Gullickson
9eb025a21f Update to production Let's Encrypt certificates 2025-12-20 11:14:44 -06:00
Eric Gullickson
a17944d79f Update deployment health checks. Fix UI bugs. 2025-12-20 10:50:44 -06:00
Eric Gullickson
2bd0981490 PROMPTS.md update 2025-12-20 09:51:45 -06:00
Eric Gullickson
b9801d5f3b Update Dockerfile with curl 2025-12-20 09:50:00 -06:00
Eric Gullickson
2174a1b1e3 Add vehicle ETL import to GitLab CI deployment 2025-12-19 14:14:05 -06:00
Eric Gullickson
0e85cf48c3 Updated packages. Changed date picker package to Day.JS and applied it across whole app. 2025-12-18 16:07:30 -06:00
Eric Gullickson
843825a956 Fix: Load runtime config before module scripts
Move config.js script to head section so it loads synchronously before
any module scripts execute. This fixes a race condition on mobile where
the app could initialize before window.CONFIG was set.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 14:23:39 -06:00
Eric Gullickson
cdb9d5575f Fix: Move catalog search indexes to ETL migration 2025-12-18 13:53:50 -06:00
Eric Gullickson
7a2e11953a Update config defs 2025-12-18 13:40:57 -06:00
Eric Gullickson
33e5797ae0 Runner update 1.5 2025-12-18 13:30:43 -06:00
Eric Gullickson
667632f54b Track config files for CI/CD deployment
Config files were previously gitignored, causing CI/CD pipeline to fail
because Docker would create directories instead of mounting the expected files.

- Remove config/** from .gitignore
- Track all config files (secrets still ignored)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 13:28:27 -06:00
Eric Gullickson
a991c01f64 Runner test 1.4 2025-12-18 13:19:46 -06:00
Eric Gullickson
e52e2390bc Test Run 1.3 2025-12-18 13:11:54 -06:00
Eric Gullickson
16833d94f8 Update permissions script 2025-12-18 13:10:18 -06:00
Eric Gullickson
6fb3882e4f Runner update v1.1 2025-12-18 13:06:22 -06:00
Eric Gullickson
b16aa80909 Test Run 1.0 2025-12-18 13:02:39 -06:00
Eric Gullickson
b1de1366ba Update to workflow 2025-12-18 12:56:30 -06:00
Eric Gullickson
c2118bc8c1 Updated pipeline 2025-12-18 12:17:21 -06:00
Eric Gullickson
72e23a8ba0 Update deployment YAML 2025-12-18 12:07:47 -06:00
Eric Gullickson
c6e187e29e CI/CD Improvements 2025-12-18 12:03:04 -06:00
Eric Gullickson
192f2edc04 Update runner config 2025-12-18 08:43:35 -06:00
Eric Gullickson
07275ec549 Deleted files. Updated gitignore 2025-12-18 08:41:53 -06:00
Eric Gullickson
2105919d26 Remove playwright files 2025-12-17 21:47:25 -06:00
Eric Gullickson
c13e17f0eb Mobile UX fixes 2025-12-17 21:46:44 -06:00
Eric Gullickson
b611b56336 Initial Commit 2025-12-17 15:43:32 -06:00
Eric Gullickson
cd0cfa8913 Vehicle drop down and Gas Station fixes 2025-12-17 10:49:29 -06:00
Eric Gullickson
0925a31fd4 Custom Images? 2025-12-16 07:49:08 -06:00
Eric Gullickson
263fc434b0 Photos for vehicles 2025-12-15 21:39:51 -06:00
Eric Gullickson
e1c48b7a26 Added Logos 2025-12-15 21:13:23 -06:00
Eric Gullickson
8a28749b3c Fixed COMMANDS.md 2025-12-15 20:52:20 -06:00
Eric Gullickson
b84d4c7fef Vehicle ETL Process fixed. Admin settings fixed. 2025-12-15 20:51:52 -06:00
Eric Gullickson
1a9ead9d9d Commit 2025-12-15 18:50:13 -06:00
Eric Gullickson
1e599e334f Possible working ETL 2025-12-15 18:19:55 -06:00
Eric Gullickson
1fc69b7779 Before updates to NHTSA 2025-12-14 14:53:45 -06:00
Eric Gullickson
61e87bb9ad ETL Fix Plan complete. Not implemented. 2025-12-14 13:55:39 -06:00
Eric Gullickson
3ca3592e72 Updated PROMPTS 2025-12-14 13:24:21 -06:00
Eric Gullickson
a9fc7741a6 Improved the UX on Stations Page 2025-12-14 12:51:29 -06:00
Eric Gullickson
3852ec9f71 Documentation Updates 2025-12-14 12:00:42 -06:00
Eric Gullickson
183d55b0fe Security fix: Implement magic byte validation for file uploads (Fix 2)
Fixed HIGH severity security vulnerability (CVSS 7.5) where file upload
validation relied solely on Content-Type headers, allowing malicious
files with spoofed MIME types to bypass validation.

Changes:
- Updated file-type dependency to v16.5.4 (last CommonJS version)
- Added magic byte (file signature) validation using fileTypeFromBuffer
- Read first 4100 bytes of upload to detect actual file type
- Verify detected type matches claimed Content-Type header
- Reject files where content doesn't match headers
- Enhanced logging with detected_type for audit trail

Security impact:
- Prevents .exe files renamed to .pdf from being uploaded
- Prevents Content-Type header spoofing attacks
- Validates file content at binary level, not just metadata

Status: Fix 2 complete
- Fix 1: crypto.randomBytes() ✓
- Fix 2: Magic byte validation ✓
- Fix 3: Google Maps API proxy ✓

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 10:06:53 -06:00
Eric Gullickson
bcb1cea311 Security fix: Implement Google Maps API photo proxy (Fix 3)
Completed HIGH severity security fix (CVSS 6.5) to prevent Google Maps
API key exposure to frontend clients.

Issue: API key was embedded in photo URLs sent to frontend, allowing
potential abuse and quota exhaustion.

Solution: Implemented backend proxy endpoint for photos.

Backend Changes:
- google-maps.client.ts: Changed photoUrl to photoReference, added fetchPhoto()
- stations.types.ts: Updated type definition (photoUrl → photoReference)
- stations.controller.ts: Added getStationPhoto() proxy method
- stations.routes.ts: Added GET /api/stations/photo/:reference route
- stations.service.ts: Updated to use photoReference
- stations.repository.ts: Updated database queries and mappings
- admin controllers/services: Updated for consistency
- Created migration 003 to rename photo_url column

Frontend Changes:
- stations.types.ts: Updated type definition (photoUrl → photoReference)
- photo-utils.ts: NEW - Helper to generate proxy URLs
- StationCard.tsx: Use photoReference with helper function

Tests & Docs:
- Updated mock data to use photoReference
- Updated test expectations for proxy URLs
- Updated API.md and TESTING.md documentation

Database Migration:
- 003_rename_photo_url_to_photo_reference.sql: Renames column in station_cache

Security Benefits:
- API key never sent to frontend
- All photo requests proxied through authenticated endpoint
- Photos cached for 24 hours (Cache-Control header)
- No client-side API key exposure

Files modified: 16 files
New files: 2 (photo-utils.ts, migration 003)

Status: All 3 P0 security fixes now complete
- Fix 1: crypto.randomBytes() ✓
- Fix 2: Magic byte validation ✓
- Fix 3: API key proxy ✓

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 09:56:33 -06:00
Eric Gullickson
a35e1a3aea Security fixes: Implement P0 critical vulnerability remediations
Implemented 3 critical security fixes identified in audit report:

1. CRITICAL (CVSS 8.1): Replace Math.random() with crypto.randomBytes()
   - Location: documents.controller.ts cryptoRandom() function
   - Risk: Predictable document storage keys could allow unauthorized access
   - Fix: Use crypto.randomBytes(32).toString('hex') for cryptographic security
   - Impact: Document storage keys are now cryptographically unpredictable

2. HIGH (CVSS 7.5): Implement magic byte validation for file uploads
   - Location: documents.controller.ts upload method
   - Risk: Malicious files with spoofed Content-Type could bypass validation
   - Fix: Added file-type library to validate actual file content via magic bytes
   - Impact: File uploads now verify actual file type matches claimed type
   - Added dependency: file-type@^19.8.0

3. HIGH (CVSS 6.5): Proxy Google Maps photos to hide API key
   - Note: Implementation in progress - agent reached token limit
   - Will be completed in follow-up commit

Files modified:
- backend/package.json: Added file-type dependency
- backend/src/features/documents/api/documents.controller.ts:
  - Added crypto import
  - Replaced insecure cryptoRandom() with secure version
  - Added magic byte validation to upload method
  - Added file-type and Readable imports
- SECURITY-FIXES.md: Complete implementation guide for all fixes

Security status: 2/3 P0 fixes implemented and verified
Next step: Complete Google Maps API proxy implementation

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 09:49:05 -06:00
Eric Gullickson
99747ffd67 Add comprehensive software audit report
Generated formal audit report identifying security, code quality,
architecture, data integrity, performance, and compliance issues.

Key findings:
- CRITICAL: Insecure random number generation in document storage
- HIGH: Inadequate file upload validation (no magic bytes)
- HIGH: Google Maps API key exposure to frontend

Overall verdict: CONDITIONALLY READY for production pending
remediation of 3 critical/high security issues.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-13 20:50:04 -06:00
Eric Gullickson
8376aee7ed Updates to database and API for dropdowns. 2025-11-11 10:29:02 -06:00
Eric Gullickson
3dc0f2a733 New Vehicle Database 2025-11-10 11:22:31 -06:00
Eric Gullickson
cd118c8f9d New Vehicle Database 2025-11-10 11:20:31 -06:00
Eric Gullickson
b50942e909 Make Model Source Data 2025-11-09 10:39:57 -06:00
Eric Gullickson
b1755d415c Bug Fixes 2025-11-09 10:37:27 -06:00