Interface honnete sur l'acces aux comptes, fenetre de contribution
This commit is contained in:
1 parent
714470031d
commit
ac929c6878
10 files changed
+108
-1
No files matched your search
@@ -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=
|
||||
|
||||
@@ -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é
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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é
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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(); });
|
||||
});
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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("/")
|
||||
|
||||
@@ -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
|
||||
Reference in new issue
Block a user