Browse Source

Mise en place de la création à distance du user gitea à partir de l'inscription.

master
Eric Lupinacci 2 years ago
parent
commit
0c2eb09c54
  1. 2
      contrib_autorisations.php
  2. 51
      contrib_fonctions.php
  3. 33
      contrib_pipelines.php
  4. 1
      paquet.xml
  5. 6
      prive/objets/liste/inscriptions.html
  6. 34
      services/gitea.php

2
contrib_autorisations.php

@ -237,7 +237,7 @@ function autoriser_inscription_iconifier_dist($faire, $type, $id, $qui, $opt) {
* @return bool true s'il a le droit, false sinon
**/
function autoriser_inscription_instituer_dist($faire, $type, $id, $qui, $opt) {
return false;
return autoriser('webmestre');
}
/**

51
contrib_fonctions.php

@ -1,5 +1,10 @@
<?php
/**
* @param $email
*
* @return bool
*/
function gitea_user_existe($email) {
// Par défaut on considère que le user n'existe pas
@ -21,6 +26,11 @@ function gitea_user_existe($email) {
return $user_existe;
}
/**
* @param $email
*
* @return array|mixed
*/
function gitea_user_lire($email) {
// Par défaut on considère que le user n'existe pas
@ -41,3 +51,44 @@ function gitea_user_lire($email) {
return $user;
}
/**
* @param $username
* @param $email
* @param array $parametres
*
* @return bool
*/
function gitea_user_creer($username, $email, $parametres = array()) {
// Par défaut on considère que le user n'existe pas
$retour = false;
if (
$username
and $email
) {
// Construction de l'url de la requête de récupération de tous les users de la forge
include_spip('services/gitea');
$parametres = array('admin', 'users');
$url = gitea_construire_url($parametres);
// Requête, gestion des erreurs et traitement des users
$user = array(
'email' => $email,
'full_name' => '',
'login_name' => $username,
'must_change_password' => true,
'password' => 'BonjourGitSpip',
'send_notify' => true,
'source_id' => 0,
'username' => $username,
);
$reponse = gitea_requeter($url, null, $user);
if (empty($reponse['erreur'])) {
$retour = true;
}
}
return $retour;
}

33
contrib_pipelines.php

@ -115,3 +115,36 @@ function contrib_boite_infos($flux) {
return $flux;
}
function contrib_pre_edition($flux) {
if (
($flux['args']['table'] === 'spip_inscriptions')
and ($flux['args']['action'] === 'instituer')
and !empty($flux['args']['id_objet'])
and !empty($flux['data']['statut'])
) {
// On récupère le nouveau statut
$statut_nouveau = $flux['data']['statut'];
// On récupère les informations sur l'inscription
$id = intval($flux['args']['id_objet']);
$inscription = objet_lire('inscription', $id);
if ($inscription) {
if ($statut_nouveau === 'publie') {
// Accepter une demande d'inscription : passage au statut publie
// -- on crée le compte user demandé via l'API de Gitea, c'est Gitea qui préviendra le user
include_spip('contrib_fonctions');
if (!gitea_user_creer($inscription['username'], $inscription['email'])) {
// On fait en sorte que l'institution ne se fasse pas en mettant à vide l'index data
$flux['data'] = array();
}
} elseif ($statut_nouveau === 'refuser') {
// Refuser une demande d'inscription : passage au statut refuse
// -- on prévient le user même si cela n'a pas grand sens si c'est du spam
}
}
}
return $flux;
}

1
paquet.xml

@ -30,6 +30,7 @@
<pipeline nom="formulaire_charger" inclure="contrib_pipelines.php" />
<pipeline nom="affiche_droite" inclure="contrib_pipelines.php" />
<pipeline nom="boite_infos" inclure="contrib_pipelines.php" />
<pipeline nom="pre_edition" inclure="contrib_pipelines.php" />
<menu nom="contrib" titre="contrib:dashboard_menu" parent="menu_administration" icone="images/dashboard-16.png" action="dashboard" parametres="identifiant=contrib" />
</paquet>

6
prive/objets/liste/inscriptions.html

@ -37,12 +37,12 @@
(#AUTORISER{modifier,inscription,#ID_INSCRIPTION}|oui)
[(#STATUT|=={prop}|oui)
<div class="groupe-btns">
[(#BOUTON_ACTION{<:contrib:inscription_btn_accepter_label:>, #URL_ACTION_AUTEUR{instituer,#ID_INSCRIPTION, #SELF}, btn_mini btn_secondaire, ''})]
[(#BOUTON_ACTION{<:contrib:inscription_btn_refuser_label:>, #URL_ACTION_AUTEUR{instituer,#ID_INSCRIPTION, #SELF}, btn_mini btn_secondaire, ''})]
[(#BOUTON_ACTION{<:contrib:inscription_btn_accepter_label:>, #URL_ACTION_AUTEUR{instituer_objet,inscription:#ID_INSCRIPTION:publie, #SELF}, btn_mini btn_secondaire, ''})]
[(#BOUTON_ACTION{<:contrib:inscription_btn_refuser_label:>, #URL_ACTION_AUTEUR{instituer_objet,inscription:#ID_INSCRIPTION:refuse, #SELF}, btn_mini btn_secondaire, ''})]
</div>
]
[(#STATUT|=={publie}|oui)
[(#BOUTON_ACTION{<:contrib:inscription_btn_supprimer_label:>, #URL_ACTION_AUTEUR{instituer,#ID_INSCRIPTION, #SELF}, btn_mini btn_secondaire, ''})]
[(#BOUTON_ACTION{<:contrib:inscription_btn_supprimer_label:>, #URL_ACTION_AUTEUR{instituer_objet,inscription:#ID_INSCRIPTION:poubelle, #SELF}, btn_mini btn_secondaire, ''})]
]
]</td>
</tr>

34
services/gitea.php

@ -16,13 +16,13 @@ if (!defined('_GITEA_SPIP_ENDPOINT_BASE_URL')) {
/**
* Construit l'URL de la requête Gitea correspondant à la demande utilisateur.
*
* @param array $parametres Liste des paramètres de l'url à accoler dans l'ordre fourni.
* @param array $parametres_url Liste des paramètres de l'url à accoler dans l'ordre fourni.
*
* @return string L'URL de la requête au service
* @internal
*
*/
function gitea_construire_url($parametres = array()) {
function gitea_construire_url($parametres_url) {
// Récupération du token d'autorisation d'accès à l'API
include_spip('inc/config');
@ -30,7 +30,7 @@ function gitea_construire_url($parametres = array()) {
// Construire l'URL de l'api sollicitée
$url = _GITEA_SPIP_ENDPOINT_BASE_URL
. implode('/', $parametres)
. implode('/', $parametres_url)
. "?access_token=${token}";
return $url;
@ -47,32 +47,41 @@ function gitea_construire_url($parametres = array()) {
* @param string $url URL complète de la requête au service web concerné.
* @param null|int $taille_max Taille maximale du flux récupéré suite à la requête.
* `null` désigne la taille par défaut.
* @param array $data Données à fournir en POST.
*
* @return array
*/
function gitea_requeter($url, $taille_max = null) {
function gitea_requeter($url, $taille_max = null, $data = array()) {
// Initialisation de la réponse
$reponse = array(
'donnees' => array(),
'erreur' => ''
);
$reponse = array();
// Acquisition des données spécifiées par l'url
include_spip('inc/distant');
$options = array(
'transcoder' => true,
'taille_max' => $taille_max);
'taille_max' => $taille_max
);
if ($data) {
// Requête POST, il suffit de passer l'index mal nommé datas
$options['datas'] = $data;
}
$flux = recuperer_url($url, $options);
$reponse = array();
if (empty($flux['page'])) {
spip_log("URL indiponible : ${url}", 'contrib');
$reponse['erreur'] = 'url_indisponible';
} else {
// Transformation de la chaîne json reçue en tableau associatif
try {
$reponse['donnees'] = json_decode($flux['page'], true);
$retour = json_decode($flux['page'], true);
if (!empty($retour['message'])) {
// Le traitement renvoie une erreur qui est défini dans le message
$reponse['erreur'] = 'gitea_nok';
spip_log("Erreur de traitement Gitea `{$retour['message']}` pour l'url `{$retour['url']}`", 'contrib' . _LOG_ERREUR);
} else {
$reponse['donnees'] = json_decode($flux['page'], true);
}
} catch (Exception $erreur) {
$reponse['erreur'] = 'analyse_json';
spip_log("Erreur d'analyse JSON pour l'URL `${url}` : " . $erreur->getMessage(), 'contrib' . _LOG_ERREUR);
@ -82,6 +91,9 @@ function gitea_requeter($url, $taille_max = null) {
return $reponse;
}
/**
* @return array|bool|mixed|string
*/
function gitea_user_repertorier() {
// Initialisation de l'erreur à chaine vide soit 'aucune erreur'.

Loading…
Cancel
Save