Aller au contenu

Routers (endpoints API)

Chaque router vit dans backend/app/routers/ et est monté dans main.py sous un préfixe /api/<domaine>. Sauf mention contraire, toutes les routes admin nécessitent la dépendance get_current_admin (Authentification & sécurité).

auth.py — /api/auth

Méthode Route Accès Description
POST /token Public Flux OAuth2 password (formulaire) utilisé par Swagger UI.
POST /login Public Connexion JSON ({username, password}) — pose les cookies access_token (JWT, HttpOnly) et csrf_token.
POST /logout Authentifié Efface les cookies de session, journalise l'événement si l'utilisateur était identifié.
GET /me Authentifié Profil de l'utilisateur courant.
GET /config Authentifié Feature flags exposés au frontend (ex. api_keys_enabled).
POST /change-password Authentifié Change le mot de passe (refusé pour les comptes oidc).

Les connexions locales sont refusées avec 403 si local_login_allowed() renvoie faux (mode OIDC-only activé). Chaque tentative de connexion, réussie ou non, est journalisée via services/audit.py.

clients.py — /api/clients (admin)

Méthode Route Description
GET / Liste tous les pairs, triés par nom.
POST / Crée un pair : vérifie l'unicité (nom/email/IP), génère une paire de clés WireGuard, réécrit wg0.conf et applique un hot reload (reload_peers), envoie optionnellement l'email de configuration en tâche de fond.
GET /suggest-ip Renvoie la prochaine IP libre du réseau du serveur (services/ip_suggestion.py).
GET /utils/keypair Génère une paire de clés WireGuard à la volée.
GET /utils/machine-ips Liste les IP non-loopback de la machine hôte.
GET /{client_id} Détail d'un pair.
PATCH /{client_id} Mise à jour partielle ; réapplique la config serveur + hot reload.
DELETE /{client_id} Supprime le pair et retire son entrée de la configuration active.
GET /{client_id}/config Génère le fichier .conf du client et son QR code (base64).
POST /{client_id}/send-email Planifie l'envoi de la configuration par email, dans la langue demandée.

Toutes les mutations (POST/PATCH/DELETE) sont journalisées (client.created, client.updated, client.deleted) et déclenchent une réécriture de la configuration WireGuard via services/wireguard.py.

server.py — /api/server (admin)

Méthode Route Description
GET / Configuration serveur actuelle (404 si non configuré).
PUT / Crée ou remplace la configuration (adresse, port, clés, règles PostUp/PostDown), puis réécrit wg0.conf.
DELETE / Supprime la configuration serveur enregistrée.
POST /keypair Génère une nouvelle paire de clés serveur.
POST /apply Réécrit la config sur disque et redémarre le service WireGuard.
POST /service/{action} start, stop ou restart du service (wg-quick).

settings.py — /api/settings (admin)

Réglages globaux du VPN (GlobalSettings, ligne unique) : adresse d'endpoint, serveurs DNS, MTU, PersistentKeepalive, mode maintenance.

Méthode Route Description
GET / Réglages actuels (créés avec des valeurs par défaut si absents).
PATCH / Mise à jour partielle.
DELETE /reset Réinitialise aux valeurs par défaut.

smtp.py — /api/smtp (admin)

Méthode Route Description
GET / Configuration SMTP (le mot de passe n'est jamais renvoyé).
PUT / Met à jour la configuration ; conserve le mot de passe existant si non fourni.
DELETE /reset Réinitialise aux valeurs par défaut.
POST /test Envoie un email de test en tâche de fond vers un destinataire donné.

oidc.py — /api/oidc

Méthode Route Accès Description
GET /settings Admin Réglages OIDC complets (dont client_secret).
PUT /settings Admin Met à jour les réglages ; refuse oidc_only=true si enabled=false.
GET /config Public Config OIDC publique (sans secret), enrichie des endpoints authorization/end_session via la discovery document de l'issuer.
POST /callback Public Échange le code d'autorisation contre un JWT applicatif (voir services/oidc.py).
DELETE /reset Admin Réinitialise les réglages OIDC.

users.py — /api/users (admin)

Méthode Route Description
GET / Liste tous les utilisateurs (avec leurs rôles).
GET /utils/roles Liste les rôles disponibles.
POST / Crée un utilisateur (vérifie l'unicité username/email, hash du mot de passe).
GET /{user_id} Détail d'un utilisateur.
PATCH /{user_id} Mise à jour partielle.
DELETE /{user_id} Supprime un utilisateur.

Garde-fous importants :

  • Un compte OIDC (auth_source != "local") ne peut pas voir son email, nom ou mot de passe modifiés depuis cette API (gérés par l'IdP) — seuls les rôles et le statut active restent modifiables.
  • Impossible de désactiver ou rétrograder le dernier administrateur actif (ensure_not_last_active_admin / vérification dans update_user).
  • Impossible de supprimer son propre compte (delete_user).

audit.py — /api/audit (admin, lecture seule)

Méthode Route Description
GET / Liste paginée du journal d'audit (limit, offset, filtre optionnel action), triée du plus récent au plus ancien.

pat.py — /api/pat (utilisateur connecté)

Gestion des Personal Access Tokens, propres à chaque utilisateur (pas admin-only : chacun gère ses propres tokens). Désactivable globalement via API_KEYS_ENABLED.

Méthode Route Description
GET / Liste les tokens de l'utilisateur courant (jamais la valeur brute).
POST / Émet un nouveau token — la valeur brute n'est renvoyée qu'à la création.
DELETE /{token_id} Révoque un token.

status.py — /api/status (tout utilisateur connecté)

Seul router accessible aux utilisateurs non-admin en dehors de profile/about.

Méthode Route Description
GET / État runtime WireGuard (pairs connectés, trafic) via wg show.
GET /version Version de l'application (APP_VERSION).
GET /latest-release Proxy vers l'API GitHub (releases/latest) pour contourner les restrictions CORS côté navigateur.

Vue d'ensemble

flowchart LR
    subgraph Public
        A1["/api/auth/login, /token"]
        A2["/api/oidc/config, /callback"]
    end
    subgraph Authentifie["Tout utilisateur connecté"]
        B1["/api/auth/me, /logout"]
        B2["/api/status/*"]
        B3["/api/pat/*"]
    end
    subgraph Admin
        C1["/api/clients/*"]
        C2["/api/server/*"]
        C3["/api/settings/*"]
        C4["/api/smtp/*"]
        C5["/api/oidc/settings"]
        C6["/api/users/*"]
        C7["/api/audit"]
    end