# 7drive : drive privé de Chris

Projet de Christoph von Siebenthal (Chris). Drive privé sur l'hébergement de Chris : consulter en ligne des notes et des fichiers, avec des droits par espace. Premier projet : le dossier « Bourdonnette » (chemin en copropriété, parcelle 46/643, Vernier). Développé avec VS Code et Claude Code, hébergé chez AlpHosting (cPanel, LiteSpeed, PHP 8.x, SSH). Sur le serveur, tout est regroupé sous `~/share/` pour garder `~/` lisible ; seul `~/share/drive/` est exposé au web.

## Principe

- **La source de vérité reste le dossier local** (iCloud, fichiers `.md` et `.pdf`). Le site ne sert qu'à lire. On n'écrit jamais dans le site.
- `scripts/sync.sh` pousse les fichiers vers le serveur par `rsync` en SSH.
- Les contenus sont **hors de la racine web**. Ils ne sont servis que par `api.php`, qui vérifie les droits.

## Architecture

```
serveur (compte cPanel)
~/share/                        ← tout 7drive est regroupé ici
├── drive/                      ← racine web de drive.7img.ch (contenu de public/)
│   ├── index.html, app.js, style.css
│   ├── api.php                 ← seul point d'accès aux contenus
│   └── .htaccess               ← noindex, pas de listage, en-têtes de sécurité
├── drive-config/config.php     ← droits : utilisateur → espaces (hors web)
└── drive-data/                 ← contenus synchronisés (hors web)
    ├── bourdonnette-interne/   ← notes internes (famille)
    └── bourdonnette-partage/   ← documents pour les copropriétaires
```

- **Espaces** : chaque sous-dossier de `share/drive-data/` est un espace, nommé `<projet>-<niveau>` (ex. `bourdonnette-interne`, `bourdonnette-partage`). Les droits se donnent par espace. Ajouter un projet = ajouter des espaces, sans toucher au code.
- **Identité** : `api.php` lit l'utilisateur authentifié. Étape 1 : `REMOTE_USER` (Directory Privacy de cPanel, HTTP Basic). Étape ultérieure : en-tête `Cf-Access-Authenticated-User-Email` (Cloudflare Access). La table des droits dans `config.php` ne change pas de forme.

## Règles de sécurité (non négociables)

- Aucun contenu dans la racine web. Tout passe par `api.php`.
- `api.php` : liste blanche d'extensions (`md`, `pdf`, `png`, `jpg`, `jpeg`), `realpath()` et vérification que le chemin reste dans l'espace demandé (pas de `..`), refus par défaut.
- Le Markdown est rendu côté navigateur avec `marked`, puis **nettoyé avec DOMPurify** avant insertion.
- `noindex, nofollow` partout (`.htaccess` et balise meta).
- Pas de `.xlsx` sur le serveur (données personnelles brutes). Seuls les documents listés dans `scripts/<espace>.list` vont dans un espace `-partage`.
- Ne jamais committer `config/config.php` réel ni de mot de passe. Seul `config.example.php` est versionné.

## Conventions de contenu (reprises dans l'affichage)

- Typographie : une seule convention par élément. Parenthèses **ou** guillemets **ou** italique, jamais cumulés.
- Toujours indiquer le **numéro de parcelle** quand on cite un numéro du chemin, par exemple « n°12 (5958) ».
- Dates au format JJ.MM.AAAA.
- Guillemets français « » avec espaces.
- Interface en français.

## Vision : du lecteur de notes au drive

7drive commence comme un lecteur de notes en lecture seule. Il doit pouvoir devenir un petit drive :
- plusieurs projets, chacun avec ses espaces ;
- téléchargement de fichiers, puis dépôt de fichiers par des utilisateurs autorisés (espace `-depot`) ;
- liens de partage limités dans le temps pour un fichier.
Tant que ce n'est pas nécessaire, on garde : lecture seule, fichiers locaux comme source de vérité, aucun compte à gérer dans le code (l'authentification reste confiée à cPanel, puis à Cloudflare Access).

## Feuille de route

1. **Étape 1 (ce squelette)** : sous-domaine, HTTPS, Directory Privacy, liste et lecture des notes, liens entre notes, PDF intégrés, `sync.sh`.
2. **Étape 2** : recherche plein texte (MiniSearch), tri par date et par type, titre tiré du premier `#`.
3. **Étape 3** : plusieurs utilisateurs avec droits par espace (déjà prévu dans `config.php`).
4. **Étape 4** : Cloudflare Access (connexion par email à usage unique), sans mot de passe à gérer.

## Commandes utiles

- Test local : voir README.md, section 4 (variables `DRIVE_DATA`, `DRIVE_CONFIG`, `DRIVE_DEV_USER`).
- Synchronisation : `scripts/sync.sh` (lire les variables en tête du script).
