diff --git a/bin/wscraper b/bin/wscraper new file mode 160000 index 0000000..b8e99eb --- /dev/null +++ b/bin/wscraper @@ -0,0 +1 @@ +Subproject commit b8e99ebbd2c45b50c13ba054ad873a7b75c8b8d7 diff --git a/review.md b/review.md new file mode 100644 index 0000000..699649f --- /dev/null +++ b/review.md @@ -0,0 +1,323 @@ +# Q-Buffer Kod Review Raporu + +**Tarih:** 2026-03-13 +**Takım:** Product Owner, Backend Developer, Frontend Developer, UI/UX Designer, QA Engineer +**Proje:** q-buffer (Torrent yönetim uygulaması) + +--- + +## İçindekiler + +1. [Özet](#özet) +2. [Backend Developer Raporu](#backend-developer-raporu) +3. [Frontend Developer Raporu](#frontend-developer-raporu) +4. [UI/UX Designer Raporu](#uiux-designer-raporu) +5. [QA Engineer Raporu](#qa-engineer-raporu) +6. [Product Owner Değerlendirmesi](#product-owner-değerlendirmesi) +7. [Öncelikli Aksiyon Planı](#öncelikli-aksiyon-planı) + +--- + +## Özet + +| Alan | Skor | Durum | +|------|------|-------| +| Güvenlik | 6/10 | JWT secret zorunlu kılınmalı | +| Kod Kalitesi | 7/10 | İyi, bazı refactor'ler gerekli | +| Performans | 7/10 | Cache mekanizması iyileştirilmeli | +| Hata Yönetimi | 8/10 | İyi, logging mevcut | +| TypeScript | 8/10 | Tip güvenliği iyi | +| Accessibility | 6/10 | Daha fazla ARIA gerekli | + +**Genel Değerlendirme:** Proje temiz bir mimariye sahip, ancak güvenlik konusunda bazı kritik iyileştirmeler gerekiyor. + +--- + +## Backend Developer Raporu + +### İncelenen Dosyalar + +- `apps/server/src/index.ts` +- `apps/server/src/config.ts` +- `apps/server/src/auth/auth.routes.ts` +- `apps/server/src/auth/auth.service.ts` +- `apps/server/src/watcher/watcher.routes.ts` +- `apps/server/src/watcher/watcher.service.ts` +- `apps/server/src/qbit/qbit.client.ts` + +### Kritik Sorunlar (HIGH) + +| # | Dosya | Satır | Tespit | Açıklama | Öneri | +|---|-------|-------|--------|----------|-------| +| B1 | `config.ts` | 16 | JWT Secret fallback boş string | `jwtSecret: process.env.JWT_SECRET ?? ""` - Eğer `JWT_SECRET` environment variable set edilmezse, JWT token'ları boş string ile imzalanır. Bu durumda token'lar güvenli değil ve kolayca forge edilebilir. | Başlangıçta zorunlu kontrol: `if (!config.jwtSecret) throw new Error("JWT_SECRET environment variable is required")` | +| B2 | `auth.service.ts` | 43 | JWT süresi çok uzun | `expiresIn: "60d"` - 60 gün geçerlilik süresi güvenlik riski oluşturur. Çalınan bir token uzun süre kullanılabilir. | `expiresIn: "7d"` veya refresh token mekanizması ekle | +| B3 | `watcher.service.ts` | 452 | Hardcoded Referer header | `Referer: "https://www.happyfappy.net/"` hardcoded. Farklı tracker'lar için farklı referer gerekebilir. | Tracker konfigürasyonundan referer değerini al | +| B4 | `watcher.service.ts` | 534-535 | Dynamic import sync kullanımı | `const { default: parseTorrent } = await import("parse-torrent")` ardından sync `parseTorrent()` çağrısı. Bu async context'te potential blocking. | `parse-torrent` paketinin async versiyonunu kullan veya import'u başlangıçta yap | + +### Orta Öncelikli Sorunlar (MEDIUM) + +| # | Dosya | Satır | Tespit | Açıklama | Öneri | +|---|-------|-------|--------|----------|-------| +| B5 | `index.ts` | 76-90 | CORS sadece dev modda | `if (isDev)` bloğu içinde CORS ayarları. Production'da CORS header'ları gönderilmiyor. | Production'da da `webAllowedOrigins` kontrolü yap | +| B6 | `auth.routes.ts` | 34 | Cookie sameSite lax | `sameSite: "lax"` kullanılıyor. API istekleri için `strict` daha güvenli olabilir. | CSRF koruması için `sameSite: "strict"` değerlendir | +| B7 | `watcher.service.ts` | 23-26 | In-memory image cache | `watcherImageCache` Map'i memory'de tutuluyor. Server restart'ta kaybolur ve memory leak riski var. | Redis veya dosya tabanlı cache kullan | +| B8 | `qbit.client.ts` | 47-74 | Session yönetimi eksik | `loggedIn` flag'i var ama session timeout mekanizması yok. Uzun süreli bağlantılarda sorun çıkabilir. | Session timeout ve heartbeat mekanizması ekle | +| B9 | `watcher.service.ts` | 448-456 | User-Agent hardcoded | Sabit User-Agent string kullanılıyor. Bazı siteler bunu engelleyebilir. | Config'den alınabilir yap veya rotate et | + +### Düşük Öncelikli Sorunlar (LOW) + +| # | Dosya | Satır | Tespit | Açıklama | Öneri | +|---|-------|-------|--------|----------|-------| +| B10 | `watcher.service.ts` | 28 | `delay()` utility tekrarı | `const delay = (ms: number) => ...` fonksiyonu birden fazla dosyada tanımlanmış olabilir. | `utils/time.ts` içine taşı ve import et | +| B11 | Genel | - | Hata mesajları karışık | Bazı hata mesajları Türkçe, bazıları İngilizce. | Dil standardizasyonu uygula (i18n) | +| B12 | `watcher.service.ts` | 454 | Chrome versiyonu eski | `Chrome/145.0.0.0` User-Agent'de bu versiyon gerçek değil. | Güncel Chrome versiyonu kullan | + +### Kod Kalitesi Notları + +| Pozitif | Açıklama | +|---------|----------| +| ✅ Temiz mimari | Modüler yapı, clear separation of concerns | +| ✅ Zod validation | Input validation için Zod kullanılıyor | +| ✅ Logging | Pino ile yapılandırılmış logging | +| ✅ Error boundaries | try-catch blokları mevcut | +| ✅ TypeScript | Tip tanımlamaları iyi | + +--- + +## Frontend Developer Raporu + +### İncelenen Dosyalar + +- `apps/web/src/App.tsx` +- `apps/web/src/store/useAuthStore.ts` +- `apps/web/src/api/client.ts` +- `apps/web/src/components/` + +### Kritik Sorunlar (HIGH) + +| # | Dosya | Satır | Tespit | Açıklama | Öneri | +|---|-------|-------|--------|----------|-------| +| F1 | `useAuthStore.ts` | 22 | Token localStorage'da | `localStorage.setItem("qbuffer_token", ...)` - Token localStorage'da saklanıyor. XSS saldırılarında token çalınabilir. | localStorage kullanmayı bırak, sadece httpOnly cookie ile authentication yap (backend zaten set ediyor) | +| F2 | `useAuthStore.ts` | 20-21 | Token response'dan okunuyor | `response.data?.token` kontrolü yapılıp localStorage'a yazılıyor. Bu gereksiz ve güvenli değil. | Token handling'i tamamen backend'e bırak, frontend'de token tutma | + +### Orta Öncelikli Sorunlar (MEDIUM) + +| # | Dosya | Satır | Tespit | Açıklama | Öneri | +|---|-------|-------|--------|----------|-------| +| F3 | `App.tsx` | 14-16 | Auth check her mount'ta | `useEffect` ile her component mount'ta `check()` çağrılıyor. Gereksiz API istekleri. | React Query veya SWR ile cache'le, veya mounting stratejisi değiştir | +| F4 | `useAuthStore.ts` | 27 | Generic error message | `set({ error: "Login failed" })` - API'den gelen gerçek hata mesajı gösterilmiyor. | API response'dan hata mesajını al ve göster | +| F5 | `App.tsx` | 18-20 | Conditional rendering | `if (!username)` kontrolü ile LoginPage gösteriliyor. Loading state dikkate alınmıyor. | Loading state için Suspense veya loading indicator ekle | +| F6 | `useAuthStore.ts` | - | Persist yok | Store state'i sayfa refresh'te kaybolur. | Zustand persist middleware kullan | + +### Düşük Öncelikli Sorunlar (LOW) + +| # | Dosya | Satır | Tespit | Açıklama | Öneri | +|---|-------|-------|--------|----------|-------| +| F7 | `useAuthStore.ts` | 8-11 | Interface tanımı | AuthState interface'i iyi tanımlanmış ama `error` için spesifik tip yok. | `error: string | null` yerine daha spesifik tip | +| F8 | `App.tsx` | 26 | Navigate replace | `` - replace kullanılıyor. Bazı durumlarda history tutulması istenebilir. | Kullanım senaryosuna göre değerlendir | + +### Performans Önerileri + +| Konu | Öneri | +|------|-------| +| Bundle Size | Code splitting ve lazy loading uygula | +| Re-renders | Zustand selector'ları optimize et | +| API Calls | React Query ile request deduplication | + +--- + +## UI/UX Designer Raporu + +### İncelenen Dosyalar + +- `apps/web/src/index.css` +- `apps/web/src/components/` +- `apps/web/tailwind.config.cjs` + +### Orta Öncelikli Sorunlar (MEDIUM) + +| # | Bileşen/Dosya | Tespit | Açıklama | Öneri | +|---|---------------|--------|----------|-------| +| U1 | Genel | Global loading indicator yok | Uzun süren işlemlerde kullanıcıya feedback yok. | Global Suspense boundary veya loading spinner ekle | +| U2 | Genel | Toast notification sistemi yok | İşlem sonuçları (success/error) için görsel feedback yok. | `react-hot-toast` veya `sonner` kütüphanesi ekle | +| U3 | `tailwind.config.cjs` | Default renk paleti | Tailwind'in default renkleri kullanılıyor, brand identity yok. | Custom color palette ile brand renkleri tanımla | +| U4 | Genel | Dark mode desteği yok | Sadece light theme mevcut. | `prefers-color-scheme` media query ile dark mode ekle | + +### Düşük Öncelikli Sorunlar (LOW) + +| # | Bileşen/Dosya | Tespit | Açıklama | Öneri | +|---|---------------|--------|----------|-------| +| U5 | `Alert.tsx` | Variant renkleri hardcoded | `variants` objesi içinde renkler sabit. | Tailwind config'den veya CSS variable'lardan al | +| U6 | Genel | Responsive breakpoints | Mobil uyumluluk kontrol edilmeli. | Farklı ekran boyutlarında test et | +| U7 | `index.css` | Custom font yok | Sistem fontları kullanılıyor. | Brand için custom font yükle | + +### Pozitif Bulguar + +| # | Bileşen | Pozitif | +|---|---------|---------| +| ✅ | `Alert.tsx` | `role="alert"` ile accessibility doğru | +| ✅ | Genel | `clsx` ile className birleştirme doğru | +| ✅ | Genel | Tailwind utility kullanımı tutarlı | +| ✅ | `Alert.tsx` | Compound component pattern (Alert, AlertTitle, AlertDescription) | + +### Accessibility (WCAG) Kontrolü + +| Kriter | Durum | Not | +|--------|-------|-----| +| 1.1.1 Non-text Content | ⚠️ | Image alt text'ler kontrol edilmeli | +| 1.3.1 Info and Relationships | ✅ | Semantic HTML kullanılıyor | +| 2.1.1 Keyboard | ⚠️ | Keyboard navigation test edilmeli | +| 2.4.7 Focus Visible | ⚠️ | Focus indicator'lar kontrol edilmeli | +| 4.1.2 Name, Role, Value | ✅ | ARIA attributes mevcut | + +--- + +## QA Engineer Raporu + +### Güvenlik Testi Sonuçları + +#### OWASP Top 10 Analizi + +| # | OWASP Kategorisi | Tespit | Risk | Öneri | +|---|------------------|--------|------|-------| +| Q1 | A01: Broken Access Control | Socket.io authentication mekanizması görünmüyor | HIGH | Socket middleware'de JWT verify zorunlu kıl | +| Q2 | A02: Cryptographic Failures | JWT_SECRET environment variable zorunlu değil | HIGH | Startup'da `JWT_SECRET` kontrolü, yoksa crash | +| Q3 | A02: Cryptographic Failures | Token localStorage'da saklanıyor (frontend) | HIGH | HttpOnly cookie kullan, localStorage'ı kaldır | +| Q4 | A03: Injection | Zod validation mevcut, iyi | LOW | Devam ettir | +| Q5 | A05: Security Misconfiguration | Rate limiting sadece `/login` endpoint'inde | MEDIUM | Tüm API endpoint'lerine rate limit uygula | +| Q6 | A05: Security Misconfiguration | CORS production'da kapalı | MEDIUM | Production'da da allowed origins kontrol et | +| Q7 | A07: Identification and Authentication Failures | JWT 60 gün geçerli | MEDIUM | Süreyi kısalt (7 gün) veya refresh token ekle | + +### Kritik Sorunlar (HIGH) + +| # | Kategori | Dosya | Tespit | Açıklama | Öneri | +|---|----------|-------|--------|----------|-------| +| Q8 | Authentication | `realtime/socket.ts` | Socket auth kontrolü | Socket.io bağlantılarında JWT doğrulama yapılmıyor olabilir. | Socket middleware ekle: `io.use((socket, next) => { verifyToken(socket.handshake.auth.token) })` | +| Q9 | Configuration | `config.ts` | Environment validation | Zorunlu env variable'lar validate edilmiyor. | `dotenv` ve Joi/Zod ile env schema validation | + +### Orta Öncelikli Sorunlar (MEDIUM) + +| # | Kategori | Tespit | Açıklama | Öneri | +|---|----------|--------|----------|-------| +| Q10 | Input Validation | Zod schemas partial | Bazı route'larda validation schema eksik olabilir. | Tüm API route'ları için完整 Zod schema | +| Q11 | Error Handling | Stack trace exposure | Production'da error stack trace dönebilir. | `isDev` kontrolü ile stack trace gizle | +| Q12 | Rate Limiting | Sadece login'de | Brute force için sadece login yeterli değil. | Global rate limiter + endpoint-specific limiters | +| Q13 | Secret Management | Secrets .env'de | Environment variable'lar log'lara sızabilir. | Secrets için encrypted storage veya vault kullan | + +### Düşük Öncelikli Sorunlar (LOW) + +| # | Kategori | Tespit | Açıklama | Öneri | +|---|----------|--------|----------|-------| +| Q14 | Logging | Sensitive data in logs | Cookie value'lar log'lara yazılıyor olabilir. | Pino redaction kullan | +| Q15 | Docker | Dockerfile görülmedi | Multi-stage build ve non-root user kontrolü. | Security best practices uygula | + +### Güvenlik Checklist + +| Kontrol | Durum | Not | +|---------|-------|-----| +| Password Hashing (bcrypt) | ✅ | 10 rounds | +| HttpOnly Cookie | ✅ | Doğru kullanılıyor | +| CSRF Protection | ⚠️ | sameSite: lax, token-based yok | +| Rate Limiting | ⚠️ | Sadece login'de | +| Input Validation (Zod) | ✅ | Mevcut | +| JWT Implementation | ⚠️ | Secret zorunlu değil, süre uzun | +| HTTPS Enforcement | ⚠️ | Config'de yok | +| Security Headers | ⚠️ | Helmet.js kullanılmıyor | +| SQL Injection | ✅ | JSON DB, risk yok | +| XSS | ⚠️ | localStorage token riski | + +### Test Coverage Analizi + +| Modül | Unit Tests | Integration Tests | Durum | +|-------|------------|-------------------|-------| +| auth | ❌ | ❌ | Test yok | +| qbit | ❌ | ❌ | Test yok | +| watcher | ❌ | ❌ | Test yok | +| timer | ❌ | ❌ | Test yok | +| loop | ❌ | ❌ | Test yok | + +**Öneri:** Jest + Supertest ile API testleri, Vitest ile frontend testleri ekle. + +--- + +## Product Owner Değerlendirmesi + +### İş Değeri Analizi + +| Özellik | Durum | Risk | Öneri | +|---------|-------|------|-------| +| Auth System | Çalışıyor | Orta | JWT süresini kısalt | +| Watcher Service | Çalışıyor | Düşük | Cache mekanizması iyileştir | +| qBittorrent Integration | Çalışıyor | Düşük | Error handling güçlendir | +| Timer Feature | Çalışıyor | Düşük | Devam ettir | +| Real-time Updates | Çalışıyor | Orta | Socket auth ekle | + +### Teknik Borç (Technical Debt) + +| Öncelik | Alan | Borç | Çaba | +|---------|------|------|------| +| 1 | Güvenlik | JWT secret validation | 1-2 saat | +| 2 | Güvenlik | localStorage token removal | 2-3 saat | +| 3 | Güvenlik | Socket.io auth | 3-4 saat | +| 4 | Test | Unit test altyapısı | 1-2 gün | +| 5 | Cache | Redis entegrasyonu | 1 gün | + +--- + +## Öncelikli Aksiyon Planı + +### Sprint 1 - Güvenlik (Kritik) + +| # | Görev | Sorumlu | Öncelik | Tahmini Süre | +|---|-------|---------|---------|--------------| +| 1 | JWT_SECRET zorunlu hale getir | Backend Dev | P0 | 1 saat | +| 2 | localStorage'dan token kaldır | Frontend Dev | P0 | 2 saat | +| 3 | Socket.io authentication ekle | Backend Dev | P0 | 3 saat | +| 4 | JWT expires_in 7 güne düşür | Backend Dev | P1 | 30 dk | +| 5 | Global rate limiter ekle | Backend Dev | P1 | 2 saat | + +### Sprint 2 - Stabilite (Önemli) + +| # | Görev | Sorumlu | Öncelik | Tahmini Süre | +|---|-------|---------|---------|--------------| +| 6 | Toast notification sistemi | UI/UX | P1 | 3 saat | +| 7 | Global loading indicator | Frontend Dev | P1 | 2 saat | +| 8 | Helmet.js security headers | Backend Dev | P1 | 1 saat | +| 9 | Error boundary component | Frontend Dev | P2 | 2 saat | +| 10 | Production CORS fix | Backend Dev | P1 | 1 saat | + +### Sprint 3 - İyileştirme (Orta) + +| # | Görev | Sorumlu | Öncelik | Tahmini Süre | +|---|-------|---------|---------|--------------| +| 11 | Unit test altyapısı | QA + Backend | P2 | 1 gün | +| 12 | Redis cache entegrasyonu | Backend Dev | P2 | 1 gün | +| 13 | Dark mode desteği | UI/UX | P3 | 4 saat | +| 14 | Custom color palette | UI/UX | P3 | 2 saat | +| 15 | API error message iyileştirme | Full Team | P2 | 3 saat | + +--- + +## Ek Notlar + +### Pozitif Bulgular + +1. **Temiz Mimari:** Modüler yapı, clear separation of concerns +2. **TypeScript Kullanımı:** Tip güvenliği iyi uygulanmış +3. **Logging:** Pino ile yapılandırılmış logging mevcut +4. **Error Handling:** try-catch blokları ve unhandled rejection logging +5. **Validation:** Zod ile input validation +6. **Cookie Security:** HttpOnly, Secure, SameSite attributes doğru + +### Geliştirme Önerileri + +1. **Monitoring:** Prometheus/Grafana ile metrik toplama +2. **Health Check:** `/health` endpoint ekle +3. **API Documentation:** Swagger/OpenAPI dokümantasyonu +4. **CI/CD:** GitHub Actions ile otomatik test ve deploy +5. **Docker:** Multi-stage build ve non-root user + +--- + +*Rapor tarihi: 2026-03-13* +*Review yapan takım: Product Owner, Backend Developer, Frontend Developer, UI/UX Designer, QA Engineer*