Interface : corrections à la souris et accès protégé
Onglet « Carte et corrections » : glisser une photo ou une vidéo, placer les médias sans position, masquer des zones de trace (pour un voyage, ou zone privée pour tous). Corrections notées dans voyage.toml ([positions], [corrections]) ou site.toml ([confidentialite]), appliquées par les pages ; les originaux ne changent pas. L'extraction garde les médias datés sans position pour qu'on puisse les placer. Accès : clé d'accès aléatoire à chaque lancement, session par cookie HttpOnly/SameSite=Strict, mot de passe facultatif (rtg mot-de-passe, empreinte scrypt hors du site, blocage après 5 échecs), accès réseau seulement avec mot de passe (--distant), HTTPS possible (--certificat, --cle), Content-Security-Policy et interdiction des cadres. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mf2kATMtqVABHSYdxJMnim
This commit is contained in:
1 parent
06153a227e
commit
71779f6f53
17 files changed
+1047
-38
No files matched your search
+27
-1
@@ -8,6 +8,7 @@
|
||||
rtg migrer écrire site.toml et les voyage.toml depuis l'existant
|
||||
rtg verifier tout ce dont RTG a besoin est-il installé ?
|
||||
rtg interface ouvrir l'interface dans le navigateur
|
||||
rtg mot-de-passe définir le mot de passe de l'interface (accès distant)
|
||||
|
||||
La racine du site est le premier dossier, en remontant depuis le dossier
|
||||
courant, qui contient site.toml (sinon le dossier courant) ; --racine la force.
|
||||
@@ -49,9 +50,31 @@ def main(argv=None):
|
||||
i = sp.add_parser("interface", help="ouvrir l'interface dans le navigateur")
|
||||
i.add_argument("--port", type=int, default=8765)
|
||||
i.add_argument("--sans-navigateur", action="store_true", help="ne pas ouvrir le navigateur")
|
||||
i.add_argument("--distant", action="store_true",
|
||||
help="accepter les connexions depuis le réseau (mot de passe obligatoire)")
|
||||
i.add_argument("--certificat", help="certificat TLS (PEM) pour servir en HTTPS")
|
||||
i.add_argument("--cle", help="clé privée du certificat TLS (PEM)")
|
||||
|
||||
mp = sp.add_parser("mot-de-passe", help="définir ou supprimer le mot de passe de l'interface")
|
||||
mp.add_argument("--supprimer", action="store_true")
|
||||
|
||||
args = p.parse_args(argv)
|
||||
|
||||
if args.commande == "mot-de-passe":
|
||||
from rtg import acces
|
||||
if args.supprimer:
|
||||
print("✅ Mot de passe supprimé." if acces.supprimer() else "ℹ️ Aucun mot de passe défini.")
|
||||
return
|
||||
import getpass
|
||||
mdp = getpass.getpass("Nouveau mot de passe : ")
|
||||
if mdp != getpass.getpass("Le même, encore une fois : "):
|
||||
sys.exit("❌ Les deux saisies diffèrent.")
|
||||
try:
|
||||
print(f"✅ Mot de passe enregistré ({acces.definir(mdp)}).")
|
||||
except ValueError as e:
|
||||
sys.exit(f"❌ {e}")
|
||||
return
|
||||
|
||||
if args.commande == "verifier":
|
||||
# Avant tout autre import : doit fonctionner même si un module manque.
|
||||
from rtg.verifier import verifier
|
||||
@@ -80,7 +103,10 @@ def main(argv=None):
|
||||
site.migrer(racine)
|
||||
elif args.commande == "interface":
|
||||
from rtg.interface.serveur import lancer
|
||||
lancer(racine, args.port, ouvrir=not args.sans_navigateur)
|
||||
if bool(args.certificat) != bool(args.cle):
|
||||
sys.exit("❌ --certificat et --cle vont ensemble.")
|
||||
lancer(racine, args.port, ouvrir=not args.sans_navigateur, distant=args.distant,
|
||||
certificat=args.certificat, cle=args.cle)
|
||||
except KeyboardInterrupt:
|
||||
print("\nInterrompu.")
|
||||
sys.exit(130)
|
||||
Reference in new issue
Block a user