Page web de partage d'une clé PGP publique.
Find a file
Manu e4d8c68524
All checks were successful
Tests automatisés / Lint et validation (push) Successful in 3s
Tests automatisés / Vérification syntaxe JavaScript (push) Successful in 2s
Tests automatisés / Validation de la clé PGP (push) Successful in 1s
Tests automatisés / Vérifications de sécurité (push) Successful in 1s
Tests automatisés / Vérification documentation (push) Successful in 1s
Tests automatisés / Vérification accessibilité (push) Successful in 1s
Tests automatisés / Tests d'intégration JavaScript (push) Successful in 2s
Tests automatisés / Vérification de buildabilité (push) Successful in 2s
Tests automatisés / Vérification finale (push) Successful in 0s
fix: déclencheur
2025-11-04 10:12:16 -05:00
.forgejo/workflows fix: déclencheur 2025-11-04 10:12:16 -05:00
css --color-gradient-2: #18212b; 2025-11-04 00:47:03 -05:00
js fix: potentielle vulnérabilité XSS 2025-11-02 23:04:58 -05:00
public/keys chore: initialisation complète du projet 2025-10-26 01:58:44 -04:00
.gitignore ajout: workflow de minification 2025-11-03 19:42:49 -05:00
apple-touch-icon.png ajout: favicon 2025-10-27 22:23:18 -04:00
BUILD.md ajout: workflow de minification 2025-11-03 19:42:49 -05:00
build.sh ajout: workflow de minification 2025-11-03 19:42:49 -05:00
favicon-96x96.png ajout: favicon 2025-10-27 22:23:18 -04:00
favicon.ico ajout: favicon 2025-10-27 22:23:18 -04:00
favicon.svg ajout: favicon 2025-10-27 22:23:18 -04:00
index.html fix: amélioration de l'accessibilité de empreinte 2025-11-02 23:08:04 -05:00
LICENSE ajout de la license 2025-10-26 16:15:24 -04:00
README.md docs: consolider toute la documentation dans README.md 2025-10-27 21:38:24 -04:00
robots.txt ajout: robots.txt 2025-11-02 16:25:58 -05:00
site.webmanifest ajout: favicon 2025-10-27 22:23:18 -04:00
web-app-manifest-192x192.png ajout: favicon 2025-10-27 22:23:18 -04:00
web-app-manifest-512x512.png ajout: favicon 2025-10-27 22:23:18 -04:00
WORKFLOW.md ajout: workflow de minification 2025-11-03 19:42:49 -05:00

Visionneuse de clé PGP publique

Une application web moderne et minimaliste pour afficher et partager votre clé PGP publique.

Demo : https://pgp.manu.quebec

Fonctionnalités

  • 📋 Affichage de la clé PGP au format ASCII
  • 📊 Extraction automatique des métadonnées (ID, empreinte, algorithme, dates, UIDs)
  • 📋 Copie vers le presse-papiers avec fallback
  • 💾 Téléchargement de la clé
  • 📱 Design responsive mobile-first
  • 🌓 Mode sombre automatique
  • Accessible (WCAG AA)
  • Zéro dépendances externes (JavaScript vanilla)
  • Tests automatisés CI/CD avec Forgejo

Structure du projet

pgp-key-viewer/
├── index.html              # Page principale
├── README.md               # Ce fichier
├── LICENSE                 # MIT License
├── .gitignore
│
├── .forgejo/
│   └── workflows/
│       └── tests.yml       # CI/CD (6 jobs)
│
├── css/
│   └── styles.css          # Design moderne (~750 lignes)
│
├── js/
│   ├── main.js             # Orchestration (~330 lignes)
│   ├── pgp-parser.js       # Parsing PGP (~280 lignes)
│   └── utils.js            # Utilitaires (~180 lignes)
│
└── public/
    └── keys/
        └── public.asc      # Votre clé PGP publique

Installation rapide

1. Cloner le dépôt

git clone https://code.manu.quebec/manu/pgp-key-viewer.git
cd pgp-key-viewer

2. Ajouter votre clé PGP

# Exporter votre clé (remplacer YOUR_KEY_ID)
gpg --export --armor YOUR_KEY_ID > public/keys/public.asc

# Vérifier le format
head -1 public/keys/public.asc
# Doit afficher: -----BEGIN PGP PUBLIC KEY BLOCK-----

3. Tester en local

# Python 3
python3 -m http.server 8000

# Puis ouvrir http://localhost:8000

Déploiement en production

Avec Caddy (Docker Compose)

1. Déployer les fichiers

# Sur votre VPS
mkdir -p /VOTRE/CHEMIN/pgp-key-viewer
cd /VOTRE/CHEMIN/pgp-key-viewer
git clone https://code.manu.quebec/manu/pgp-key-viewer.git .

2. Configuration Caddy

Ajouter ce bloc à votre Caddyfile (ou fichier de configuration Caddy) :

pgp.manu.quebec {
    root * /srv/pgp-key-viewer
    file_server
    encode gzip

    # Headers de sécurité
    header {
        X-Frame-Options "SAMEORIGIN"
        X-Content-Type-Options "nosniff"
        X-XSS-Protection "1; mode=block"
        Referrer-Policy "strict-origin-when-cross-origin"
        Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'"
    }

    # Cache pour fichiers statiques
    @static {
        path /css/* /js/* /public/*
    }
    header @static Cache-Control "public, max-age=31536000, immutable"
}

3. Recharger Caddy

Redémarrez ou rechargez votre serveur Caddy pour appliquer la nouvelle configuration.

4. Vérifier le déploiement

# Tester depuis votre machine locale
curl -I https://pgp.manu.quebec

Mise à jour

cd /VOTRE/CHEMIN/pgp-key-viewer
git pull origin main

Configuration

Changer le chemin de la clé

Dans js/main.js :

const CONFIG = {
    KEY_PATH: './public/keys/public.asc',  // Modifier ici
    FILENAME: 'public.asc'
};

Personnaliser les couleurs

Dans css/styles.css :

:root {
    --color-primary: #2563eb;
    --color-success: #10b981;
    --color-error: #ef4444;
    /* ... */
}

API JavaScript

Le projet expose des fonctions globales utilisables dans la console :

// Configuration
console.log(pgpViewer.config);

// Récupérer la clé en cache
const key = pgpViewer.getCachedKey();

// Recharger la clé
await pgpViewer.reloadKey();

// Parser les métadonnées
const metadata = parseKeyMetadata(key);

// Utilitaires
showNotification('Message', 'success', 2000);
copyToClipboard('texte');
downloadFile('contenu', 'fichier.txt');

Tests automatisés

Les tests CI/CD s'exécutent automatiquement à chaque push sur Forgejo via .forgejo/workflows/tests.yml.

Jobs de tests

  1. lint-and-validate - Validation de la structure

    • Vérification des répertoires et fichiers requis
    • Présence des fonctions principales dans le code
    • Structure HTML et imports CSS/JS
  2. syntax-check - Vérification syntaxe JavaScript

    • Validation syntaxe avec Node.js (node -c)
    • Tous les fichiers JS (main.js, utils.js, pgp-parser.js)
  3. pgp-validation - Validation de la clé PGP

    • Format BEGIN/END PGP PUBLIC KEY BLOCK
    • Fichier non vide et taille minimale (> 500 bytes)
  4. documentation - Vérification documentation

    • Présence de README.md, LICENSE, .gitignore
    • Sections requises dans README.md
    • Configuration .gitignore
  5. integration-test - Tests d'intégration JavaScript

    • Test de isPGPKey() avec clés valides/invalides
    • Test de formatFingerprint() (ajout d'espaces)
    • Test de escapeHtml() (protection XSS)
    • Test de cleanPGPText() (nettoyage du texte)
  6. build-check - Vérification de buildabilité

    • Présence de tous les fichiers de production
  7. final-check - Résumé final

    • Agrégation des résultats de tous les jobs
    • Affichage du statut global

Voir les résultats : Actions sur Forgejo

Tests locaux avant push

# Syntaxe JavaScript
node -c js/main.js
node -c js/utils.js
node -c js/pgp-parser.js

# Structure
test -f public/keys/public.asc && echo "✓ Clé trouvée"
test -f index.html && echo "✓ HTML trouvé"

# Format PGP
head -1 public/keys/public.asc | grep -q "BEGIN PGP" && echo "✓ Format correct"

Dépannage

Erreur 404 : fichier non trouvé

# Vérifier le fichier existe
ls -la public/keys/public.asc

# Vérifier les permissions
chmod 644 public/keys/public.asc

# Vérifier le chemin dans main.js
grep "KEY_PATH" js/main.js

Format de clé invalide

# Vérifier le début
head -1 public/keys/public.asc
# Doit afficher: -----BEGIN PGP PUBLIC KEY BLOCK-----

# Réexporter la clé
gpg --export --armor YOUR_KEY_ID > public/keys/public.asc

Bouton copier ne fonctionne pas

  • En local : HTTP devrait fonctionner
  • En production : HTTPS est requis pour l'API Clipboard
  • Vérifier la console (F12) pour erreurs spécifiques

Tests Forgejo ne s'exécutent pas

# Vérifier que le fichier existe
ls -la .forgejo/workflows/tests.yml

# Vérifier que Forgejo Actions est activé (paramètres du dépôt)
# Vérifier que le runner Forgejo est en ligne

Sécurité

  • Content Security Policy (CSP)
  • Protection contre injections HTML (escapeHtml())
  • Pas de eval() ou innerHTML() avec données brutes
  • Headers de sécurité (X-Frame-Options, X-Content-Type-Options, etc.)
  • HTTPS obligatoire en production (Let's Encrypt automatique avec Caddy)
  • Validation du format PGP

Navigateurs supportés

  • Chrome/Edge 90+
  • Firefox 88+
  • Safari 14+
  • Navigateurs mobiles récents

Contribution

  1. Fork le projet
  2. Créer une branche (git checkout -b feature/amelioration)
  3. Commit (git commit -am 'Ajouter amélioration')
  4. Push (git push origin feature/amelioration)
  5. Ouvrir une Pull Request sur Forgejo

License

MIT License - Libre d'utilisation commerciale et personnelle.

Voir le fichier LICENSE pour plus de détails.

Ressources


Version : 1.0.0
Dernière mise à jour : 2025-10-27
Statut : Complet et prêt pour production