Changes from Codex

This commit is contained in:
2026-03-13 08:29:21 +03:00
parent fca46a009c
commit 4a11526445
2 changed files with 324 additions and 0 deletions

1
bin/wscraper Submodule

Submodule bin/wscraper added at b8e99ebbd2

323
review.md Normal file
View File

@@ -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 | `<Navigate to="/buffer" 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*