security: Add proper authentication, RBAC, and tenant isolation

- Add password hashing with bcrypt
- Add AuthService with proper login
- Add password strength validation
- Add RBAC middleware (AdminOnly, ManagerOrAdmin)
- Add tenant isolation middleware
- Update CRM handler with tenant filtering
- Add JWT fallback for development mode
- Add user context helpers
- Build successful
This commit is contained in:
Bernt
2026-08-10 12:52:48 +00:00
parent 8921fd1467
commit 78b57273e2
141 changed files with 29192 additions and 180 deletions
+200
View File
@@ -0,0 +1,200 @@
# BOC Produktionsklarhetsplan
> Skapad: 2026-08-06
> Mål: Eliminera ALLT demo/mock/hårdkodat. Systemet ska vara redo för riktig drift.
---
## 🔴 KRITISKT - Blockerar produktion (Vecka 1)
### 1. Autentisering & Säkerhet
**Problem:** `authMiddleware := middleware.APIKeyAuth("")` accepterar ALLA tokens.
**Åtgärder:**
- [ ] Aktivera RS256 JWT-validering mot ouroboros-identity (port 3207)
- [ ] Hämta JWKS från `http://localhost:3207/.well-known/jwks.json`
- [ ] Ersätt `APIKeyAuth("")` med riktig JWT-middleware
- [ ] Ta bort hardcoded user i `/auth/me`
- [ ] Ta bort `debug/token` endpoint i produktion
**Fil:** `backend/main.go` rad ~188
### 2. CORS
**Problem:** `middleware.CORS` tillåter `*`
**Åtgärder:**
- [ ] Begränsa CORS till specifika domäner: `boc.landvex.com`, `app.landvex.com`
- [ ] Ta bort wildcard i produktion
### 3. Rate Limiting
**Problem:** Ingen rate limiting - 20 requests på 1 sekund gick igenom.
**Åtgärder:**
- [ ] Lägg till `chi/middleware.Throttle` eller Redis-baserad rate limiter
- [ ] Konfigurera: 100 req/min per IP, 1000 req/min per användare
### 4. HTTPS
**Problem:** Server kör på HTTP port 9096.
**Åtgärder:**
- [ ] Konfigurera Traefik/Nginx reverse proxy med Let's Encrypt
- [ ] Stäng av direkt HTTP-access utanför Docker-nätverket
---
## 🟡 HÖG PRIORITET - Demo/Mock-data (Vecka 2)
### 5. Ledger Integration (Bokföring)
**Problem:** Fallback till mock-data när ledger inte svarar.
**Åtgärder:**
- [ ] Ta bort `handlers/ledger_mock.go` helt
- [ ] Ersätt mock-fallback i `handlers/ledger.go` med riktiga DB-anrop
- [ ] Implementera: `GetInvoices`, `GetCashflow`, `GetBudget`, `CreateExpense`, `ListExpenses`
- [ ] Koppla `aamos-ledger` (port 3250) - seeda med BAS-konton
**Filer:** `handlers/ledger.go`, `handlers/ledger_mock.go`
### 6. Mail Integration
**Problem:** Returnerar demo-meddelanden när IMAP inte är konfigurerat.
**Åtgärder:**
- [ ] Ta bort demoMessages från `handlers/mail.go`
- [ ] Returnera `{"error": "IMAP not configured"}` istället för demo-data
- [ ] Implementera riktig IMAP-anslutning med konfigurerbara credentials
**Fil:** `handlers/mail.go` rad ~57-99
### 7. quiXzoom Integration
**Problem:** Hårdkodade exempel-email och bild-URLs.
**Åtgärder:**
- [ ] Ersätt `anna.l@example.com`, `marcus.b@example.com` etc med riktiga DB-anrop
- [ ] Ersätt `https://example.com/img1.jpg` med riktiga bild-URLs från S3/AMOS
- [ ] Koppla mot quiXzoom Auth Core API (port 3207 eller separat tjänst)
**Fil:** `handlers/quixzoom.go`
### 8. BankID / Signing
**Problem:** Mock-token och fejkad QR-kod.
**Åtgärder:**
- [ ] Implementera riktig BankID-integration (test-produktion)
- [ ] Ersätt `mock-token-12345` med riktig auto_start_token
- [ ] Generera QR-kod dynamiskt
**Fil:** `handlers/signing.go` rad ~129
### 9. Payroll (Löneberäkning)
**Problem:** "Simple Swedish tax calculation (placeholder)"
**Åtgärder:**
- [ ] Implementera riktig skatteberäkning med Skatteverkets tabeller
- [ ] Hantera kommunalskatt, kyrkoavgift, jobbskatteavdrag
- [ ] Integrera med Fortnox/Visma löneutbetalning
**Fil:** `handlers/payroll.go` rad ~180
---
## 🟠 MEDEL PRIORITET - Saknade integrationer (Vecka 3-4)
### 10. Visma Integration
**Problem:** Mock-data när inte autentiserad.
**Åtgärder:**
- [ ] Implementera OAuth2-flöde mot Visma
- [ ] Spara tokens krypterat i DB
- [ ] Implementera voucher-sync
**Fil:** `handlers/visma.go` rad ~229
### 11. Stripe Integration
**Problem:** Hårdkodade exempel-kunder.
**Åtgärder:**
- [ ] Koppla mot riktigt Stripe-konto
- [ ] Implementera webhook-hantering
- [ ] Hantera payouts och accounts dynamiskt
**Fil:** `handlers/stripe.go`
### 12. Frontend - Login
**Problem:** Default credentials `demo@aamos.systems` / `demo123`
**Åtgärder:**
- [ ] Ta bort default värden från `LoginPage.tsx`
- [ ] Lägg till "Kom ihåg mig"-funktion
**Fil:** `web-v2/src/pages/LoginPage.tsx` rad ~13-14
### 13. Frontend - Mock Data
**Problem:** `AccountDetailModal.tsx` har mock-transactions.
**Åtgärder:**
- [ ] Ersätt mockTransactions med API-anrop till `/api/v1/journal/accounts/{code}/transactions`
**Fil:** `web-v2/src/components/AccountDetailModal.tsx` rad ~33
### 14. Tenant / Multi-tenancy
**Problem:** TODOs för behörighetsfiltrering och session-hantering.
**Åtgärder:**
- [ ] Implementera tenant-isolering i ALLA queries
- [ ] Lägg till audit-log för tenant-byte
- [ ] Filtrera data baserat på användarens tenant
**Fil:** `handlers/tenant.go`
---
## 🟢 LÅG PRIORITET - Förbättringar (Vecka 5+)
### 15. Support / CSAT
**Problem:** CSAT-beräkning är inte implementerad.
**Fil:** `handlers/support.go` rad ~221
### 16. Receipts OCR
**Problem:** "TODO: Trigger async OCR processing"
**Fil:** `handlers/receipts.go` rad ~92
### 17. Profile Page
**Problem:** "TODO: API call to save profile"
**Fil:** `web-v2/src/pages/ProfilePage.tsx` rad ~82
### 18. Frontend Build Warning
**Problem:** Duplicate case clause i `CompliancePage.tsx`
**Fil:** `web-v2/src/pages/CompliancePage.tsx`
---
## 📋 Sammanfattning
| Kategori | Antal issues | Status |
|----------|-------------|--------|
| Kritiskt (säkerhet) | 4 | 🔴 Ej påbörjat |
| Hög prio (mock/demo) | 5 | 🟡 Identifierat |
| Medel prio (integrationer) | 5 | 🟠 Identifierat |
| Låg prio (förbättringar) | 4 | 🟢 Identifierat |
| **Totalt** | **18** | **0% klart** |
---
## 🚀 Nästa steg
1. **Börja med säkerheten** - Auth, CORS, rate limiting, HTTPS
2. **Sedan ledger** - Bokföring måste fungera för Landvex AB
3. **Sedan mail** - IMAP-integration för riktig kommunikation
4. **Sedan quiXzoom** - Koppla mot riktigt auth-system
5. **Till sist** - BankID, Stripe, Visma, Fortnox
---
> **Viktigt:** Ingenting ska vara demo eller hårdkodat. Varje endpoint måste antingen:
> 1. Anropa riktig databas/integration, ELLER
> 2. Returnera tydligt felmeddelande om integration inte är konfigurerad
>
> Inga fejkade data. Inga exempel-email. Inga mock-tokens.