# Filemounts: Dosya Klasör Yetkilendirme

TYPO3'te File Mount sistemi ile dosya erişim haklarının yönetimi — depolama yapılandırması, güvenlik kısıtlamaları ve bu projede yapılan uygulamalar.

---

## File Mount Nedir? (Basit Anlatım)

**File Mount** = “Bu editör sadece şu klasöre erişebilir” kuralı

```
fileadmin/ (üst çözgün depolama)
├── user_uploads/
│   ├── content/     ← İçerik Editörü — sadece burasını görür
│   ├── news/        ← Haber Editörü — sadece burasını görür
│   ├── images/      ← Tüm editörler (okuma + yazma)
│   ├── documents/   ← Tüm editörler (okuma + yazma)
│   └── media/       ← Tüm editörler (video/ses)
├── templates/       ← Site Yöneticisi + Admin only
└── protected/       ← Web erişimi yok (.htaccess ile kapalı)
```

**Sonuç:** Her kullanıcı, sadece kendine atanan klasörü görür.

---

## Bu Projede Yapılan Yapılandırmalar ✓

| Dosya / İşlem | Açıklama |
|------------|----------|
| `public/fileadmin/user_uploads/{content,news,images,documents,media}` | Klasör yapısı oluşturuldu |
| `public/fileadmin/protected/.htaccess` | Web erişimi kapalı klasör |
| `config/system/additional.php` | `fileDenyPattern` + `maxFileSize` eklendi |
| `packages/testproject/Configuration/user.tsconfig` | Storage izinleri |

---

## Klasör Yapısı (Bu Proje ✓)

```
public/fileadmin/
├── _processed_/          ← TYPO3 işlenmiş görseller (otomatik)
├── _temp_/               ← Geçici dosyalar (otomatik)
├── user_uploads/
│   ├── content/          ← İçerik editörü görselleri ✓
│   ├── news/             ← Haber görselleri ✓
│   ├── general/          ← Genel dosyalar ✓
│   ├── images/           ← Paylaşılan görseller ✓
│   ├── documents/        ← PDF, Word vs. ✓
│   └── media/            ← Video, ses dosyaları ✓
├── templates/            ← Site yöneticisi için ✓
└── protected/            ← Web erişimi kapalı ✓
    └── .htaccess         ← Deny from all
```

Yeni klasör ekleme:

```bash
ddev exec mkdir -p public/fileadmin/user_uploads/[klasor-adi]
```

---

---

## File Mount Oluşturma (Backend Adımları)

**System → File Storage & Filemounts → File Mounts → +**

### Mount 1: İçerik Editörü Görselleri

| Alan | Değer |
|------|-------|
| **Title** | İçerik Editörü Görselleri |
| **Storage** | fileadmin (Local Filesystem) |
| **Path** | `user_uploads/content/` |
| **Read Only** | ☐ Hayır |

### Mount 2: Haber Editörü Medyası

| Alan | Değer |
|------|-------|
| **Title** | Haber Editörü Medyası |
| **Storage** | fileadmin (Local Filesystem) |
| **Path** | `user_uploads/news/` |
| **Read Only** | ☐ Hayır |

### Mount 3: Ortak Görseller (Salt Okunur)

| Alan | Değer |
|------|-------|
| **Title** | Ortak Görsel Kütüphanesi |
| **Storage** | fileadmin (Local Filesystem) |
| **Path** | `user_uploads/images/` |
| **Read Only** | ☑ Evet |

### Gruba Atama

1. **System → Backend User Groups → [Grubu Düzenle]**
2. **Mounts and Workspaces** sekmesi
3. **File Mounts** alanı → ilgili mount'u seç

```
İçerik Editörü Grubu:
  File Mounts: [İçerik Editörü Görselleri, Ortak Görsel Kütüphanesi]

Haber Editörü Grubu:
  File Mounts: [Haber Editörü Medyası, Ortak Görsel Kütüphanesi]
```

---

---

## File Storage (Depolama Alanı) Yapılandırması

### Varsayılan Storage: fileadmin

TYPO3 kurulumunda otomatik oluşturulur:

| Özellik | Değer |
|---------|-------|
| **UID** | 1 |
| **Name** | fileadmin/ |
| **Driver** | Local filesystem |
| **Base path** | `fileadmin/` |
| **Publicly available** | Evet (web'den erişilebilir) |

TSconfig'de `1:` prefix'i bu storage'u ifade eder:
```typoscript
options.defaultUploadFolder = 1:/user_uploads/content/
#                             ^ storage uid
```

### Özel (Private) Storage Oluşturma

Private storage = web'den erişilemeyen dosya alanı (PDF, protected belgeler)

**System → List (root sayfasında) → File Storage → +**

| Alan | Değer |
|------|-------|
| **Name** | Private Belgeler |
| **Driver** | Local (on this server) |
| **Base absolute path** | `/var/www/html/private_storage/` |
| **Publicly available** | ☐ **Hayır** |

**Önemli:** `Publicly available = Hayır` ise dosyalara tarayıcıdan URL ile ulaşılamaz.

### Bu Projede Korumalı Klasör (.htaccess ile ✓)

`public/fileadmin/protected/.htaccess` dosyası oluşturuldu:

```apache
# Web üzerinden doğrudan erişim kapalı
Order deny,allow
Deny from all
```

**Sonuç:**
- `https://site.com/fileadmin/protected/belge.pdf` → **403 Forbidden**
- Backend'den çalıştırılabilir, TYPO3 FAL üzerinden serve edilebilir

---

---

## İzin Seviyeleri (Detaylı)

### Dosya İzinleri

| İzin | Açıklama | Editör | Yönetici |
|------|----------|-------|-----------|
| `readFile` | Dosyayı görüntüle | ✅ | ✅ |
| `addFile` | Yeni dosya yükle | ✅ | ✅ |
| `writeFile` | Dosyayı düzenle | ✅ | ✅ |
| `copyFile` | Dosyayı kopyala | ✅ | ✅ |
| `moveFile` | Dosyayı taşı | ✅ | ✅ |
| `renameFile` | Dosyayı yeniden adlandır | ✅ | ✅ |
| `deleteFile` | Dosyayı sil | ❌ | ✅ |

### Klasör İzinleri

| İzin | Açıklama | Editör | Yönetici |
|------|----------|-------|-----------|
| `readFolder` | Klasörü görüntüle | ✅ | ✅ |
| `addFolder` | Yeni klasör oluştur | ✅ | ✅ |
| `writeFolder` | Klasör içeriğini düzenle | ✅ | ✅ |
| `copyFolder` | Klasörü kopyala | ❌ | ✅ |
| `moveFolder` | Klasörü taşı | ❌ | ✅ |
| `renameFolder` | Klasörü yeniden adlandır | ❌ | ✅ |
| `deleteFolder` | Klasörü sil | ❌ | ✅ |
| `recursivedeleteFolder` | Alt klasörlerle birlikte sil | ❌ | ✅ |

### User TSconfig ile İzin Kontrolü

```typoscript
# Dosya izinlerini kısıtla
permissions.file.default {
    readFolder = 1
    writeFolder = 1
    addFolder = 1
    renameFolder = 0
    moveFolder = 0
    deleteFolder = 0
    readFile = 1
    writeFile = 1
    addFile = 1
    renameFile = 1
    replaceFile = 1
    moveFile = 0
    deleteFile = 0
}

# Yükleme boyutu sınırı (KB)
options.defaultUploadFolder = 1:user_uploads/

# İzin verilen dosya uzantıları
# (Sistem geneli config/system/additional.php'de ayarlanır)
```

---

---

## Yükleme Kısıtlamaları (Bu Projede Aktif ✓)

`config/system/additional.php` içine eklendi:

```php
// Tehlikeli uzantıları engelle
$GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'] =
    '\.(
        php[3-8]?|phtml|pht|phar|  # PHP dosyaları
        shtml|cgi|pl|asp|aspx|     # Sunucu tarafı betikler
        htaccess|htpasswd|ini|     # Yapılandırma dosyaları
        bat|exe|com|cmd|sh|csh     # Çalıştırılabilir dosyalar
    )(\.|$)';

// Maksimum yükleme: 25 MB
$GLOBALS['TYPO3_CONF_VARS']['BE']['maxFileSize'] = 25600; // KB
```

**İzin verilen görsel uzantıları** (`additional.php` GFX ayarı):

```php
$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'] =
    'gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai,svg,webp,avif';
```

### PHP Tarafı Boyut Sınırı

`.ddev/php/php.ini` veya `php.ini`:

```ini
upload_max_filesize = 32M
post_max_size = 64M
; TYPO3'un 'maxFileSize' ayarı ilk kontrol
; PHP'nin 'upload_max_filesize' ikinci kontrol
; İkisi de geçilmeli!
```

```bash
ddev exec php -i | grep upload_max
# upload_max_filesize => 32M
```

---

---

## Pratik Senaryo: 3 Grup, 3 File Mount

```
┌──────────────────────────────────────────────────────────────┐
│ fileadmin/                                             │
│   user_uploads/                                          │
│     content/  ← Mount A: İçerik Editörü Görselleri     │
│     news/     ← Mount B: Haber Editörü Medyası          │
│     images/   ← Mount C: Ortak Görsel Kütüphane (RO)   │
└──────────────────────────────────────────────────────────────┘

İçerik Editörü (Ahmet):
  File Mounts: [Mount A (okuma+yazma), Mount C (salt okunur)]
  Görüdüğü: content/ ve images/
  Göremediği: news/, templates/, protected/

Haber Editörü (Zeynep):
  File Mounts: [Mount B (okuma+yazma), Mount C (salt okunur)]
  Görüdüğü: news/ ve images/
  Göremediği: content/, templates/, protected/

Site Yöneticisi (Fatih):
  File Mounts: Tüm mount'lar (tam erişim)
  Görüdüğü: Tüm fileadmin/ alt klasörleri
```

---

## Yeni dosya yükleme sırasında ne olur?

```
1. Editör "Dosya Yükle" tıklar
2. TYPO3:
   a. fileDenyPattern kontrol — php,exe vs. engellenir
   b. maxFileSize kontrol — 25MB üstü engellenir
   c. PHP upload_max_filesize kontrol — 32MB sınır
   d. File Mount klasörü kontrol — izin yoksa engellenir
3. Dosya kaydedilir: fileadmin/user_uploads/content/resim.jpg
4. sys_file tablosuna kaydedilir (FAL indexed)
5. Sayfa editöründe kullanılabilir
```

---

## En İyi Uygulamalar

| Kural | Uygulama |
|-------|----------|
| **Her grup ayrı klasör** | `content/`, `news/`, `images/` ayrı mount'lar |
| **Salt okunur paylaşım** | Logo, shared assets okuma izniyle |
| **Korumalı klasör** | `protected/.htaccess` Deny from all |
| **Dosya boyutu sınır** | `maxFileSize = 25600` (25MB) |
| **Tehlikeli uzantı engeli** | `fileDenyPattern` PHP, EXE, SH vs. |
| **PHP php.ini uyumu** | `upload_max_filesize` ≥ `maxFileSize` olmalı |

---

## Dosya Yapısı (Bu Proje)

```
public/fileadmin/
├── user_uploads/
│   ├── content/       ← İçerik editörü ✓
│   ├── news/          ← Haber editörü ✓
│   ├── general/       ← Genel ✓
│   ├── images/        ← Paylaşılan görseller ✓
│   ├── documents/     ← PDF, Word ✓
│   └── media/         ← Video, ses ✓
├── templates/         ← Site yöneticisi ✓
└── protected/         ← Web erişimi kapalı ✓
    └── .htaccess      ← Deny from all

config/system/additional.php ← fileDenyPattern + maxFileSize ✓
packages/testproject/
  Configuration/user.tsconfig  ← Storage izinleri ✓
```

---

## Kaynaklar

- [TYPO3 File Abstraction Layer](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Fal/)
- [FAL Permissions](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Fal/Administration/Permissions.rst)
- [File Mounts](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Backend/AccessControl/MoreAboutFileMounts/)
- [Backend User Permissions](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/AccessControl/)
