- Configuration complète Stripe pour les 3 environnements (DEV/REC/PROD) * DEV: Clés TEST Pierre (mode test) * REC: Clés TEST Client (mode test) * PROD: Clés LIVE Client (mode live) - Ajout de la gestion des bases de données immeubles/bâtiments * Configuration buildings_database pour DEV/REC/PROD * Service BuildingService pour enrichissement des adresses - Optimisations pages et améliorations ergonomie - Mises à jour des dépendances Composer - Nettoyage des fichiers obsolètes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
579 lines
16 KiB
Markdown
579 lines
16 KiB
Markdown
# BAO - Back-office Admin Operations
|
|
|
|
Toolkit d'administration pour consulter et gérer les données chiffrées de l'API Geosector.
|
|
|
|
## 🚀 Scripts disponibles
|
|
|
|
| Script | Description | Exemple |
|
|
|--------|-------------|---------|
|
|
| `./bin/bao` | Menu interactif principal | `./bin/bao` |
|
|
| `./bin/search-user` | Rechercher un user par nom/prénom/username/secteur | `./bin/search-user rca dupont` |
|
|
| `./bin/decrypt-user` | Afficher les infos complètes d'un user | `./bin/decrypt-user rca 123` |
|
|
| `./bin/reset-password` | Générer et enregistrer un nouveau mot de passe | `./bin/reset-password rca 123` |
|
|
| `./bin/search-email` | Rechercher par email | `./bin/search-email rca contact@example.com` |
|
|
| `./bin/list-users` | Lister les utilisateurs | `./bin/list-users dva --entite=5` |
|
|
| `./bin/search-entite` | Rechercher une entité (mode interactif) | `./bin/search-entite rca plumeliau` |
|
|
| `./bin/decrypt-entite` | Afficher les infos complètes d'une entité | `./bin/decrypt-entite rca 10` |
|
|
| `./bin/list-entites` | Lister les entités | `./bin/list-entites dva --stripe` |
|
|
| `./bin/list-operations` | Lister les opérations | `./bin/list-operations dva --entite=5` |
|
|
| `./bin/list-sectors` | Lister les secteurs d'une opération | `./bin/list-sectors dva --operation=123` |
|
|
|
|
## 📋 Vue d'ensemble
|
|
|
|
BAO est un ensemble de scripts **indépendants de l'API** permettant de :
|
|
- Consulter les données **déchiffrées** des utilisateurs et entités
|
|
- Rechercher dans les champs chiffrés (username, nom, email)
|
|
- Réinitialiser les mots de passe utilisateurs
|
|
- Se connecter aux **3 environnements** (DVA, RCA, PRA) via tunnels SSH
|
|
- Vérifier l'intégrité du chiffrement AES-256-CBC
|
|
|
|
## 🏗️ Architecture
|
|
|
|
### Depuis le PC (via tunnels SSH)
|
|
|
|
```
|
|
PC Bureau (localhost)
|
|
↓ SSH Tunnels
|
|
├─→ IN3/dva-geo → IN3/maria3:3306 → dva_geo
|
|
├─→ IN3/rca-geo → IN3/maria3:3306 → rca_geo
|
|
└─→ IN4/pra-geo → IN4/maria4:3306 → pra_geo
|
|
```
|
|
|
|
### Depuis les containers (connexion directe)
|
|
|
|
```
|
|
IN3/dva-geo ──→ 13.23.33.4:3306 (maria3) → dva_geo
|
|
IN3/rca-geo ──→ 13.23.33.4:3306 (maria3) → rca_geo
|
|
IN4/pra-geo ──→ 13.23.33.4:3306 (maria4) → pra_geo
|
|
```
|
|
|
|
### Connexions SSH
|
|
|
|
Les tunnels SSH sont gérés automatiquement via `~/.ssh/config` :
|
|
- **vpn-dva-geo** : Container DVA sur IN3 (via VPN)
|
|
- **vpn-rca-geo** : Container RCA sur IN3 (via VPN)
|
|
- **pra-geo** : Container PRA sur IN4 (désactivé)
|
|
|
|
**Note** : Depuis les containers, les tunnels SSH ne sont **pas nécessaires**. BAO se connecte directement aux bases maria3/maria4.
|
|
|
|
## 📦 Installation
|
|
|
|
### 1. Prérequis
|
|
|
|
```bash
|
|
# PHP 8.3+ avec extensions
|
|
php -v
|
|
php -m | grep -E 'pdo|openssl|mbstring'
|
|
|
|
# SSH configuré dans ~/.ssh/config
|
|
ssh vpn-dva-geo 'echo OK'
|
|
ssh vpn-rca-geo 'echo OK'
|
|
```
|
|
|
|
### 2. Configuration
|
|
|
|
#### Sur le PC
|
|
|
|
```bash
|
|
cd /home/pierre/dev/geosector/bao
|
|
|
|
# Copier le template et adapter
|
|
cp config/.env.example config/.env
|
|
|
|
# Les valeurs par défaut sont configurées pour utiliser les tunnels SSH
|
|
# vers dva-geo (port 3307) et rca-geo (port 3308)
|
|
cat config/.env
|
|
```
|
|
|
|
#### Sur les containers (après déploiement)
|
|
|
|
Le script `deploy-bao.sh` copie automatiquement `config/.env.container` vers `config/.env`.
|
|
|
|
Cette configuration utilise les connexions **directes** vers maria3/maria4 (pas de tunnels SSH).
|
|
|
|
## 📦 Déploiement sur les containers
|
|
|
|
BAO peut être déployé sur les containers pour une utilisation directe sur les serveurs.
|
|
|
|
### Déployer sur DVA (IN3/dva-geo)
|
|
|
|
```bash
|
|
cd /home/pierre/dev/geosector/bao
|
|
./deploy-bao.sh
|
|
```
|
|
|
|
### Déployer sur RECETTE (IN3/rca-geo)
|
|
|
|
```bash
|
|
cd /home/pierre/dev/geosector/bao
|
|
./deploy-bao.sh rca
|
|
```
|
|
|
|
### Déployer sur PRODUCTION (IN4/pra-geo)
|
|
|
|
```bash
|
|
cd /home/pierre/dev/geosector/bao
|
|
./deploy-bao.sh pra
|
|
```
|
|
|
|
### Utiliser BAO sur un container
|
|
|
|
```bash
|
|
# Connexion au container
|
|
ssh -i ~/.ssh/id_rsa_mbpi root@195.154.80.116 'incus exec rca-geo -- bash'
|
|
|
|
# Lancer BAO
|
|
cd /var/www/geosector/bao
|
|
./bin/bao
|
|
|
|
# Ou directement un script
|
|
./bin/search-user rca dupont
|
|
```
|
|
|
|
## 🚀 Utilisation
|
|
|
|
### Menu interactif principal
|
|
|
|
```bash
|
|
cd /home/pierre/dev/geosector/bao
|
|
./bin/bao
|
|
```
|
|
|
|
Menu avec :
|
|
1. Sélection de l'environnement (DVA/RCA/PRA)
|
|
2. Actions disponibles (liste, recherche, décryptage)
|
|
3. Gestion automatique des tunnels SSH
|
|
|
|
### Scripts individuels
|
|
|
|
#### Rechercher un utilisateur
|
|
|
|
```bash
|
|
# Rechercher par nom, prénom, username ou secteur
|
|
./bin/search-user dva dupont
|
|
./bin/search-user rca pv_admin
|
|
./bin/search-user dva jean
|
|
```
|
|
|
|
**Fonctionnalités :**
|
|
- Déchiffre **tous** les utilisateurs pour chercher
|
|
- Cherche dans : `encrypted_user_name`, `encrypted_name`, `first_name`, `sect_name`
|
|
- Affiche un tableau avec les résultats
|
|
- Propose d'afficher les détails complets si 1 seul résultat
|
|
|
|
#### Décrypter un utilisateur
|
|
|
|
```bash
|
|
./bin/decrypt-user dva 123
|
|
./bin/decrypt-user rca 456
|
|
```
|
|
|
|
**Affiche :**
|
|
- Username, email, nom, prénom (déchiffrés)
|
|
- Téléphones (déchiffrés)
|
|
- Rôle, entité, dates
|
|
|
|
#### Réinitialiser un mot de passe
|
|
|
|
```bash
|
|
./bin/reset-password dva 123
|
|
./bin/reset-password rca 456
|
|
```
|
|
|
|
**Fonctionnalités :**
|
|
- Affiche les infos de l'utilisateur
|
|
- Demande confirmation
|
|
- Génère un mot de passe sécurisé (12-20 caractères, conforme aux règles API)
|
|
- Hash avec bcrypt et met à jour la base
|
|
- **Affiche le mot de passe en clair** (à sauvegarder)
|
|
|
|
#### Décrypter une entité (amicale)
|
|
|
|
```bash
|
|
./bin/decrypt-entite dva 5
|
|
./bin/decrypt-entite rca 10
|
|
```
|
|
|
|
**Affiche :**
|
|
- Nom, email, téléphones (déchiffrés)
|
|
- Adresse complète
|
|
- IBAN/BIC (déchiffrés)
|
|
- Configuration (Stripe, mots de passe, etc.)
|
|
- Statistiques (nb users, opérations)
|
|
|
|
#### Lister les utilisateurs
|
|
|
|
```bash
|
|
# Tous les utilisateurs (limite 50)
|
|
./bin/list-users dva
|
|
|
|
# Filtrer par entité
|
|
./bin/list-users dva --entite=5
|
|
|
|
# Filtrer par rôle
|
|
./bin/list-users rca --role=2
|
|
|
|
# Limite personnalisée
|
|
./bin/list-users dva --limit=100
|
|
|
|
# Combinaison de filtres
|
|
./bin/list-users dva --entite=5 --role=2 --limit=20
|
|
```
|
|
|
|
**Affiche :** Tableau avec username, email, nom (déchiffrés)
|
|
|
|
#### Rechercher une entité
|
|
|
|
```bash
|
|
# Rechercher par nom, adresse, ville ou email
|
|
./bin/search-entite dva plumeliau
|
|
./bin/search-entite rca amicale
|
|
./bin/search-entite dva appli
|
|
```
|
|
|
|
**Fonctionnalités :**
|
|
- Déchiffre **toutes** les entités pour chercher
|
|
- Cherche dans : `encrypted_name`, `encrypted_email`, `adresse1`, `adresse2`, `ville`
|
|
- Affiche un tableau numéroté avec les résultats
|
|
- **Mode interactif** :
|
|
1. Détail d'une entité → appelle `decrypt-entite`
|
|
2. Opérations d'une entité → appelle `list-operations`
|
|
3. Membres d'une entité → appelle `list-users`
|
|
|
|
#### Lister les entités
|
|
|
|
```bash
|
|
# Toutes les entités
|
|
./bin/list-entites dva
|
|
|
|
# Uniquement celles avec Stripe activé
|
|
./bin/list-entites dva --stripe
|
|
|
|
# Limite personnalisée
|
|
./bin/list-entites rca --limit=20
|
|
```
|
|
|
|
**Affiche :** Tableau avec nom, email (déchiffrés), stats
|
|
|
|
#### Lister les opérations
|
|
|
|
```bash
|
|
# Toutes les opérations
|
|
./bin/list-operations dva
|
|
|
|
# Opérations d'une entité spécifique
|
|
./bin/list-operations dva --entite=5
|
|
|
|
# Limite personnalisée
|
|
./bin/list-operations rca --entite=10 --limit=20
|
|
```
|
|
|
|
**Affiche :** Tableau avec entité, libellé, dates, nb passages, nb users, nb secteurs
|
|
|
|
#### Lister les secteurs d'une opération
|
|
|
|
```bash
|
|
# Secteurs d'une opération spécifique
|
|
./bin/list-sectors dva --operation=123
|
|
./bin/list-sectors rca --operation=456
|
|
```
|
|
|
|
**Fonctionnalités :**
|
|
- Affiche le libellé de l'opération
|
|
- Liste tous les secteurs (actifs et inactifs)
|
|
- Compte le nombre d'utilisateurs par secteur (depuis `ope_users_sectors`)
|
|
- Compte le nombre de passages par secteur
|
|
- Affiche des statistiques globales (total users, passages, secteurs actifs)
|
|
|
|
**Affiche :** Tableau avec ID, libellé, couleur, nb users, nb passages, actif, date création
|
|
|
|
#### Rechercher par email
|
|
|
|
```bash
|
|
./bin/search-email dva contact@example.com
|
|
./bin/search-email rca admin@amicale.fr
|
|
```
|
|
|
|
**Fonctionnalités :**
|
|
- Déchiffre **tous** les emails pour chercher
|
|
- Affiche **tous** les comptes avec cet email (système autorise les doublons)
|
|
- Propose d'afficher les détails complets si 1 seul résultat
|
|
|
|
### Gestion des tunnels SSH
|
|
|
|
```bash
|
|
# Afficher l'état des tunnels
|
|
./bin/_ssh-tunnel.sh status
|
|
|
|
# Ouvrir un tunnel manuellement
|
|
./bin/_ssh-tunnel.sh open dva
|
|
./bin/_ssh-tunnel.sh open rca
|
|
|
|
# Fermer un tunnel
|
|
./bin/_ssh-tunnel.sh close dva
|
|
|
|
# Fermer tous les tunnels
|
|
./bin/_ssh-tunnel.sh close-all
|
|
```
|
|
|
|
## 📁 Structure du projet
|
|
|
|
```
|
|
bao/
|
|
├── README.md # Cette documentation
|
|
├── .gitignore # Exclut config/.env
|
|
├── deploy-bao.sh # Script de déploiement vers containers
|
|
│
|
|
├── config/
|
|
│ ├── .env # Configuration locale (gitignored)
|
|
│ ├── .env.example # Template pour utilisation PC (tunnels SSH)
|
|
│ ├── .env.container # Template pour utilisation containers (connexion directe)
|
|
│ └── database.php # Classe DatabaseConfig
|
|
│
|
|
├── lib/
|
|
│ ├── CryptoService.php # Chiffrement/déchiffrement AES-256-CBC
|
|
│ ├── DatabaseConnection.php # Connexion PDO aux bases
|
|
│ └── helpers.php # Fonctions utilitaires (affichage, couleurs)
|
|
│
|
|
└── bin/
|
|
├── bao # Script principal (menu interactif)
|
|
├── search-user # Rechercher un utilisateur
|
|
├── decrypt-user # Décrypter un utilisateur
|
|
├── reset-password # Réinitialiser un mot de passe
|
|
├── search-email # Rechercher par email
|
|
├── list-users # Lister les utilisateurs
|
|
├── search-entite # Rechercher une entité (interactif)
|
|
├── decrypt-entite # Décrypter une entité
|
|
├── list-entites # Lister les entités
|
|
├── list-operations # Lister les opérations
|
|
├── list-sectors # Lister les secteurs d'une opération
|
|
└── _ssh-tunnel.sh # Helper gestion tunnels SSH
|
|
```
|
|
|
|
## 🔐 Sécurité
|
|
|
|
### Chiffrement
|
|
|
|
L'API utilise **deux méthodes de chiffrement AES-256-CBC** différentes :
|
|
|
|
#### 1. Données "Searchable" (recherche)
|
|
- **Champs** : `encrypted_user_name`, `encrypted_email`
|
|
- **IV** : Fixe (16 bytes de `\0`)
|
|
- **Format** : `base64(encrypted_data)`
|
|
- **Usage** : Permet la recherche par égalité dans la base
|
|
|
|
#### 2. Données avec IV aléatoire
|
|
- **Champs** : `encrypted_name`, `encrypted_phone`, `encrypted_mobile`, `encrypted_iban`, `encrypted_bic`
|
|
- **IV** : Aléatoire (16 bytes)
|
|
- **Format** : `base64(IV + encrypted_data)`
|
|
- **Usage** : Sécurité maximale, pas de recherche directe
|
|
|
|
**Clé de chiffrement** : Base64 encodée (32 bytes) partagée avec l'API
|
|
|
|
### Données chiffrées
|
|
|
|
**Utilisateurs (`users`) :**
|
|
- `encrypted_user_name` → Username (searchable)
|
|
- `encrypted_email` → Email (searchable)
|
|
- `encrypted_name` → Nom complet (IV aléatoire)
|
|
- `encrypted_phone` → Téléphone fixe (IV aléatoire)
|
|
- `encrypted_mobile` → Téléphone mobile (IV aléatoire)
|
|
|
|
**Entités (`entites`) :**
|
|
- `encrypted_name` → Nom de l'amicale (IV aléatoire)
|
|
- `encrypted_email` → Email (searchable)
|
|
- `encrypted_phone` → Téléphone (IV aléatoire)
|
|
- `encrypted_mobile` → Mobile (IV aléatoire)
|
|
- `encrypted_iban` → Coordonnées bancaires (IV aléatoire)
|
|
- `encrypted_bic` → Code BIC (IV aléatoire)
|
|
|
|
### Bonnes pratiques
|
|
|
|
✅ **Faire :**
|
|
- Garder `.env` hors du versioning (déjà dans `.gitignore`)
|
|
- Fermer les tunnels après usage (`Ctrl+C` ou `close-all`)
|
|
- Utiliser le menu interactif pour les tâches courantes
|
|
|
|
❌ **Ne pas faire :**
|
|
- Partager la clé de chiffrement (`ENCRYPTION_KEY`)
|
|
- Laisser les tunnels ouverts en permanence
|
|
- Exporter les données déchiffrées sans précaution
|
|
|
|
## 🛠️ Dépannage
|
|
|
|
### Erreur : "Impossible d'ouvrir le tunnel SSH"
|
|
|
|
```bash
|
|
# Vérifier la connexion SSH
|
|
ssh dva-geo 'echo OK'
|
|
|
|
# Vérifier qu'aucun processus n'utilise le port
|
|
lsof -i :3307
|
|
lsof -i :3308
|
|
lsof -i :3309
|
|
|
|
# Fermer les tunnels zombies
|
|
./bin/_ssh-tunnel.sh close-all
|
|
```
|
|
|
|
### Erreur : "Impossible de se connecter à la base"
|
|
|
|
#### Depuis le PC
|
|
|
|
```bash
|
|
# Vérifier que le tunnel est actif
|
|
./bin/_ssh-tunnel.sh status
|
|
|
|
# Tester manuellement la connexion au tunnel
|
|
nc -zv 127.0.0.1 3307 # Pour DVA
|
|
nc -zv 127.0.0.1 3308 # Pour RCA
|
|
```
|
|
|
|
#### Depuis un container
|
|
|
|
```bash
|
|
# Tester la connexion directe vers maria3/maria4
|
|
mysql -h 13.23.33.4 -u dva_geo_user -p dva_geo -e "SELECT 1"
|
|
```
|
|
|
|
### Erreur : "Échec du déchiffrement"
|
|
|
|
```bash
|
|
# Vérifier la clé de chiffrement
|
|
grep ENCRYPTION_KEY config/.env
|
|
|
|
# Comparer avec l'API
|
|
grep encryption_key ../api/src/Config/AppConfig.php
|
|
```
|
|
|
|
### Permissions refusées sur les scripts
|
|
|
|
```bash
|
|
# Rendre tous les scripts exécutables
|
|
chmod +x bin/*
|
|
```
|
|
|
|
## 📊 Exemples d'utilisation
|
|
|
|
### Cas d'usage 1 : Rechercher un utilisateur par nom
|
|
|
|
```bash
|
|
./bin/search-user rca dupont
|
|
```
|
|
|
|
Résultat : Tableau des utilisateurs contenant "dupont" (nom, prénom, username ou secteur)
|
|
|
|
### Cas d'usage 2 : Réinitialiser le mot de passe d'un utilisateur
|
|
|
|
```bash
|
|
./bin/search-user rca martin # Trouver l'ID
|
|
./bin/reset-password rca 56930 # Réinitialiser avec l'ID
|
|
```
|
|
|
|
Résultat : Nouveau mot de passe généré et affiché en clair
|
|
|
|
### Cas d'usage 3 : Trouver tous les comptes d'un email
|
|
|
|
```bash
|
|
./bin/search-email dva contact@amicale.fr
|
|
```
|
|
|
|
Résultat : Liste tous les utilisateurs avec cet email (peut être multiple)
|
|
|
|
### Cas d'usage 4 : Lister les admins d'une amicale
|
|
|
|
```bash
|
|
./bin/list-users dva --entite=5 --role=2
|
|
```
|
|
|
|
Résultat : Tableau des administrateurs (rôle 2) de l'entité 5
|
|
|
|
### Cas d'usage 5 : Explorer une entité (mode interactif)
|
|
|
|
```bash
|
|
./bin/search-entite rca plumeliau # Rechercher l'entité
|
|
# Sélectionner n° de ligne: 1
|
|
# Choisir action: 2 (Opérations)
|
|
```
|
|
|
|
Résultat : Workflow complet pour explorer une entité et ses données liées
|
|
|
|
### Cas d'usage 6 : Vérifier les entités avec Stripe
|
|
|
|
```bash
|
|
./bin/list-entites dva --stripe
|
|
```
|
|
|
|
Résultat : Toutes les amicales ayant activé Stripe Connect
|
|
|
|
### Cas d'usage 7 : Lister les opérations d'une entité
|
|
|
|
```bash
|
|
./bin/list-operations rca --entite=662
|
|
```
|
|
|
|
Résultat : Tableau des opérations avec stats (passages, users, secteurs)
|
|
|
|
### Cas d'usage 8 : Explorer les secteurs d'une opération
|
|
|
|
```bash
|
|
./bin/list-sectors dva --operation=123
|
|
```
|
|
|
|
Résultat : Tableau des secteurs avec nb users/passages + stats globales
|
|
|
|
### Cas d'usage 9 : Audit complet d'un utilisateur
|
|
|
|
```bash
|
|
./bin/decrypt-user dva 123
|
|
```
|
|
|
|
Résultat : Toutes les informations déchiffrées + métadonnées
|
|
|
|
## 🔄 Évolutions futures
|
|
|
|
### À court terme
|
|
- [ ] Export CSV avec données déchiffrées
|
|
- [ ] Statistiques globales par environnement
|
|
- [x] ~~Recherche par nom (déchiffré)~~ ✓ Implémenté (`search-user`)
|
|
- [x] ~~Réinitialisation de mots de passe~~ ✓ Implémenté (`reset-password`)
|
|
|
|
### À moyen terme
|
|
- [ ] Vérification HIBP pour `reset-password`
|
|
- [ ] Version Go pour performances accrues
|
|
- [ ] Cache local des données déchiffrées
|
|
- [ ] Interface TUI avec bibliotèque comme `gum`
|
|
|
|
### À long terme
|
|
- [ ] Modification de données complètes (avec validation)
|
|
- [ ] Audit trail des accès
|
|
- [ ] Synchronisation inter-environnements
|
|
|
|
## 📝 Notes
|
|
|
|
### Environnement PRA
|
|
|
|
⚠️ **Attention :** L'environnement PRA n'est **pas encore créé** (base de données inexistante).
|
|
|
|
Pour l'activer :
|
|
1. Créer la base `pra_geo` sur IN4/maria4
|
|
2. Migrer les données depuis RCA
|
|
3. Changer `PRA_ENABLED=true` dans `config/.env`
|
|
|
|
### Comptes multiples par email
|
|
|
|
Le système Geosector **autorise plusieurs comptes avec le même email** (choix client).
|
|
|
|
Le script `search-email` gère cette particularité en affichant **tous** les comptes trouvés.
|
|
|
|
## 🤝 Support
|
|
|
|
Pour toute question ou amélioration :
|
|
1. Consulter le TECHBOOK de l'API : `../api/docs/TECHBOOK.md`
|
|
2. Vérifier les logs SSH : `~/.ssh/`
|
|
3. Tester la connexion directe aux containers
|
|
|
|
## 📜 Licence
|
|
|
|
Usage interne - Projet Geosector © 2025
|