# Déploiement OVH — protection avancée (jeu.div.re)

Script PHP qui sert les cartes à gratter via un **jeton** : les fichiers HTML ne sont plus accessibles directement par URL.

---

## Fonctionnement

1. L'outil exporte un fichier au nom aléatoire, ex. `k7m2p9xq4n1a.html`.
2. Vous uploadez ce fichier dans `private/cartes/` (dossier **non public**).
3. Vous enregistrez le même token dans `data/tokens.json`.
4. Le SMS envoie : `https://jeu.div.re/grattage.php?t=k7m2p9xq4n1a`
5. PHP vérifie le jeton, compte les ouvertures, puis affiche la page.

---

## Prérequis

| Élément | Détail |
|--------|--------|
| Hébergement OVH | Mutualisé avec **PHP** activé |
| Domaine | `jeu.div.re` (ou autre) |
| Accès | FTP / SFTP ou Explorateur FTP OVH |

---

## Installation sur jeu.div.re

### 1. Structure à uploader

Dans le dossier racine de **jeu.div.re** (souvent `www/jeu.div.re/`) :

```text
www/jeu.div.re/
  grattage.php
  pages/
    lien-deja-utilise.html
    lien-expire.html
    lien-introuvable.html
    render.php
  private/
    .htaccess
    cartes/
      .htaccess
      k7m2p9xq4n1a.html    ← votre export
  data/
    .htaccess
    tokens.json
```

Uploadez le contenu du dossier `serveur-ovh/` de ce projet.

### 2. Droits d'écriture

Le dossier `data/` doit être **inscriptible** par PHP (pour incrémenter le compteur de vues) :

- droits recommandés : `755` pour les dossiers, `644` pour `tokens.json`
- si besoin sur OVH : `705` ou `775` sur `data/` selon la config du mutualisé

### 3. Enregistrer un jeton

L'outil génère automatiquement `token-TOKEN.json` à l'export HTML. Fusionnez son contenu dans `data/tokens.json`.

Exemple généré par l'outil :

```json
{
  "k7m2p9xq4n1a": {
    "expires": 0,
    "max_views": 1,
    "views": 0,
    "note": "Carte pour Marie"
  }
}
```

Édition manuelle possible si besoin :

```json
{
  "k7m2p9xq4n1a": {
    "expires": 0,
    "max_views": 1,
    "views": 0,
    "note": "Carte pour Marie"
  }
}
```

| Champ | Description |
|-------|-------------|
| `expires` | Timestamp Unix de fin (`0` = pas d'expiration). Ex. 31/12/2026 : `1798675200` |
| `max_views` | Nombre max d'ouvertures (`1` = lien à usage unique, `0` = illimité) |
| `views` | Compteur (laisser à `0`) |

Le **token** doit être identique au nom du fichier HTML **sans** `.html`.

### 4. Lien SMS

```text
https://jeu.div.re/grattage.php?t=k7m2p9xq4n1a
```

L'outil copie déjà un lien du type `https://jeu.div.re/k7m2p9xq4n1a.html` — remplacez par la forme `grattage.php?t=...` une fois PHP en place.

---

## Niveau intermédiaire : mot de passe OVH (sans PHP)

Si vous n'installez pas le script PHP :

1. Créez `www/jeu.div.re/prive/`
2. Uploadez le `.html` dedans
3. Dans OVH → Hébergement → **Protection du répertoire** → protégez `prive/`
4. SMS 1 : `https://jeu.div.re/prive/k7m2p9xq4n1a.html`
5. SMS 2 (ou oral) : le mot de passe

---

## Comparaison

| Méthode | Lien direct `.html` | Dossier protégé OVH | Script `grattage.php` |
|---------|---------------------|---------------------|------------------------|
| Nom aléatoire | Oui | Oui | Oui |
| Mot de passe | Non | Oui | Non (sauf combinaison) |
| Usage unique | Non | Non | **Oui** |
| Expiration | Non | Non | **Oui** |
| Fichier caché | Non | Non | **Oui** |

---

## Limites

- Impossible de lier automatiquement au **numéro SMS** sans service SMS/API dédié.
- Un destinataire peut toujours faire une **capture d'écran** une fois la page ouverte.
- `tokens.json` n'est pas adapté à un très grand volume ; suffisant pour un usage personnel.

---

## Dépannage

| Problème | Piste |
|----------|--------|
| Page blanche | Vérifier que PHP est activé sur le multisite |
| « Lien introuvable » | Token absent de `tokens.json` ou fichier manquant dans `private/cartes/` |
| Compteur ne bouge pas | Droits d'écriture sur `data/` |
| Fichier HTML accessible directement | Vérifier les `.htaccess` dans `private/` |
| « Lien déjà utilisé » en texte brut | Uploadez le dossier `pages/` complet sur le serveur |

---

## Pages d'erreur

| Situation | Page | Code HTTP |
|-----------|------|-----------|
| Token invalide, fichier ou jeton absent | `pages/lien-introuvable.html` | 404 |
| Date d'expiration dépassée | `pages/lien-expire.html` | 410 |
| Nombre d'ouvertures atteint | `pages/lien-deja-utilise.html` | 410 |

Uploadez tout le dossier `pages/` sur OVH avec `grattage.php`.
