Interface honnete sur l'acces aux comptes, fenetre de contribution
build / Garde-fou (push) Successful in 10m21s
build / Images Harbor (catalog-sync, Dockerfile.catalog-sync) (push) Successful in 9m48s
build / Images Harbor (web, Dockerfile) (push) Successful in 9m57s

This commit is contained in:
hcornet committed 2026-09-11 14:05:32 +02:00
1 parent 714470031d
commit ac929c6878
10 files changed
+108 -1

No files matched your search

+4
View File
@@ -29,6 +29,10 @@ ENCLUME_PARTAGE_JOURS=90
ENCLUME_OIDC_METADATA=https://authentik.tips-of-mine.com/application/o/enclume/.well-known/openid-configuration
ENCLUME_OIDC_CLIENT_ID=
ENCLUME_OIDC_CLIENT_SECRET=
# Laisser a 0 tant que le fournisseur d'identite n'accepte pas les inscriptions :
# le site propose alors de contribuer par demande de fusion plutot qu'une
# connexion impossible a obtenir.
ENCLUME_INSCRIPTION_OUVERTE=0
ENCLUME_ADMIN_GROUPE=enclume-admins
# Depannage du premier demarrage, avant le mapping de portee "groups" :
ENCLUME_ADMIN_COMPTES=
+7
View File
@@ -3,6 +3,13 @@
Format : [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/).
Versionnement sémantique, comme décrit dans [docs/CONVENTIONS.md](docs/CONVENTIONS.md).
## 1.5.0
### Ajouté
- `ENCLUME_INSCRIPTION_OUVERTE` : tant que le fournisseur d'identité n'accepte pas les
inscriptions, le site propose « Contribuer » plutôt qu'une connexion impossible à obtenir
- Fenêtre expliquant comment proposer ou vérifier un pack sans compte
## 1.4.2
### Corrigé
+1
View File
@@ -39,6 +39,7 @@ services:
ENCLUME_OIDC_METADATA: ${ENCLUME_OIDC_METADATA:-}
ENCLUME_OIDC_CLIENT_ID: ${ENCLUME_OIDC_CLIENT_ID:-}
ENCLUME_OIDC_CLIENT_SECRET: ${ENCLUME_OIDC_CLIENT_SECRET:-}
ENCLUME_INSCRIPTION_OUVERTE: ${ENCLUME_INSCRIPTION_OUVERTE:-0}
ENCLUME_ADMIN_GROUPE: ${ENCLUME_ADMIN_GROUPE:-enclume-admins}
ENCLUME_ADMIN_COMPTES: ${ENCLUME_ADMIN_COMPTES:-}
# Depot du catalogue : la moderation y ouvre des demandes de fusion.
+12
View File
@@ -75,6 +75,18 @@ Le nom du groupe se règle par `ENCLUME_ADMIN_GROUPE`, il n'a pas à s'appeler
Le temps de mettre ça en place, `[email protected]` donne l'accès
à la modération sur la seule foi de l'adresse. À vider ensuite.
## Qui peut obtenir un compte
Par défaut, `ENCLUME_INSCRIPTION_OUVERTE=0` : le site n'affiche aucun bouton de connexion
public, mais un bouton « Contribuer » qui explique que l'éditeur fonctionne sans compte et
que les packs se proposent par demande de fusion. Un lien discret « Se connecter (équipe) »
reste disponible dans cette fenêtre pour les mainteneurs.
Ce réglage existe parce que promettre une connexion à quelqu'un qui ne peut pas obtenir de
compte — annuaire sans source externe, inscription fermée — est une impasse silencieuse.
Passez-le à `1` une fois les sources et le flux d'enrôlement en place, ci-dessous.
## Ouvrir le site à d'autres que vous
Si Enclume doit accueillir des visiteurs extérieurs, deux points sont à traiter côté
+4
View File
@@ -100,6 +100,10 @@ class Config:
# Le groupe qui donne acces a la moderation. Necessite que le fournisseur
# place la revendication "groups" dans le jeton (mapping de portee dedie
# cote Authentik).
# Les comptes sont-ils ouverts au public, ou reserves a l'equipe ?
# Tant que le fournisseur d'identite n'accepte pas les inscriptions, annoncer
# une connexion ouverte enverrait les visiteurs dans une impasse.
INSCRIPTION_OUVERTE = _bool("ENCLUME_INSCRIPTION_OUVERTE", False)
ADMIN_GROUPE = os.environ.get("ENCLUME_ADMIN_GROUPE", "enclume-admins")
ADMIN_COMPTES = [
c.strip().lower()
+51
View File
@@ -977,6 +977,57 @@ brancher('btn-serveur-ouvrir', function () {
}).catch(function (erreur) { notifier('Lecture impossible : ' + erreur.message, 'erreur'); });
});
// Les comptes ne sont pas ouverts au public : plutot qu'un bouton de connexion
// qui menerait a une impasse, on explique comment contribuer autrement.
brancher('btn-contribuer', function () {
ouvrirModale('Contribuer a Enclume', function (corps) {
corps.appendChild(elt('p', {
className: 'lede',
textContent: "Tout ce qui fait l\u2019interet du site fonctionne sans compte : " +
"l\u2019editeur, la generation, le telechargement et le partage par lien. " +
'Les comptes sont pour le moment reserves a l\u2019equipe qui maintient le catalogue.'
}));
var bloc = elt('div', { className: 'notice' });
bloc.appendChild(elt('b', { textContent: 'Proposer un pack' }));
bloc.appendChild(elt('p', {
textContent: 'Un pack est un fichier YAML d\u2019une trentaine de lignes. Ouvrez une ' +
'demande de fusion sur le depot : le format et les regles sont dans le guide de ' +
'contribution.'
}));
corps.appendChild(bloc);
var second = elt('div', { className: 'notice' });
second.appendChild(elt('b', { textContent: 'Verifier un pack existant' }));
second.appendChild(elt('p', {
textContent: 'Le catalogue signale les packs dont les lignes de commande n\u2019ont pas ' +
'ete eprouvees sur un central reel. Les confronter a une vraie installation vaut ' +
'autant que d\u2019en ecrire un nouveau.'
}));
corps.appendChild(second);
var barre = elt('div', { className: 'barre' });
var depot = CONTEXTE.depot || '';
if (depot) {
var guide = elt('a', {
className: 'btn', href: depot + '/src/branch/main/CONTRIBUTING.md',
textContent: 'Guide de contribution'
});
guide.target = '_blank';
guide.rel = 'noopener';
barre.appendChild(guide);
var source = elt('a', { className: 'btn', href: depot, textContent: 'Depot du projet' });
source.target = '_blank';
source.rel = 'noopener';
barre.appendChild(source);
}
var connexion = elt('a', { className: 'btn', href: '/connexion', textContent: 'Se connecter (equipe)' });
barre.appendChild(connexion);
corps.appendChild(barre);
});
});
brancher('btn-deconnexion', function () {
fetch('/deconnexion', { method: 'POST' }).then(function () { window.location.reload(); });
});
+5
View File
@@ -80,6 +80,11 @@
absente du catalogue, la proposer prend quelques minutes — et vérifier un pack existant
marqué « à valider » vaut tout autant. Le format et les règles sont dans le
<a href="{{ depot }}/src/branch/main/CONTRIBUTING.md">guide de contribution</a>.</p>
{% if not inscription_ouverte %}
<p class="petit">Les comptes du site sont pour l'instant réservés à l'équipe qui maintient
le catalogue : les contributions passent par une demande de fusion sur le dépôt. L'éditeur,
la génération et le partage, eux, ne demandent aucun compte.</p>
{% endif %}
<div class="barre">
<a class="btn" href="{{ depot }}">Code source</a>
<a class="btn" href="/editeur">Ouvrir l'éditeur</a>
+5 -1
View File
@@ -23,8 +23,10 @@
{% if utilisateur %}
<span class="compte">{{ utilisateur.affichage }}{% if utilisateur.administrateur %} <a href="/moderation">moderation</a>{% endif %}</span>
<button type="button" id="btn-deconnexion" class="small">Se deconnecter</button>
{% else %}
{% elif fonctions.comptes and inscription_ouverte %}
<a class="btn" href="/connexion">Se connecter</a>
{% elif fonctions.comptes %}
<button type="button" id="btn-contribuer">Contribuer</button>
{% endif %}
{% endif %}
<button type="button" id="btn-generer" class="primary">Generer le CLAPI</button>
@@ -62,6 +64,8 @@
"fonctions": fonctions,
"connecte": utilisateur is not none,
"partage": partage|default(none),
"inscription_ouverte": inscription_ouverte,
"depot": depot,
}|tojson }}</script>
<script src="{{ url_for('static', filename='editeur.js') }}"></script>
{% endblock %}
+1
View File
@@ -108,6 +108,7 @@ def create_app() -> Flask:
"utilisateur": utilisateur,
"oidc_nom": Config.OIDC_NOM,
"depot": Config.DEPOT,
"inscription_ouverte": Config.INSCRIPTION_OUVERTE,
}
@app.get("/")
+18
View File
@@ -540,3 +540,21 @@ def test_publication_echouee_renvoie_le_motif(app, monkeypatch):
reponse = client.post(f"/api/moderation/soumissions/{identifiant}/publier")
assert reponse.status_code == 502
assert "existe deja" in reponse.get_json()["erreur"]
def test_pas_de_bouton_de_connexion_sans_inscription_ouverte(app_oidc, monkeypatch):
"""Proposer une connexion a qui ne peut pas obtenir de compte est une impasse."""
from enclume.config import Config
monkeypatch.setattr(Config, "INSCRIPTION_OUVERTE", False)
page = app_oidc.test_client().get("/editeur").data.decode()
assert 'href="/connexion"' not in page
assert "btn-contribuer" in page
def test_bouton_de_connexion_si_inscription_ouverte(app_oidc, monkeypatch):
from enclume.config import Config
monkeypatch.setattr(Config, "INSCRIPTION_OUVERTE", True)
page = app_oidc.test_client().get("/editeur").data.decode()
assert 'href="/connexion"' in page