/**
* This file is part of SesaXXX.
* Copyright 2014-2015, Association Sésamath
*
* SesaXXX is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3
* as published by the Free Software Foundation.
*
* SesaXXX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with SesaReactComponent (LICENCE.txt).
* @see http://www.gnu.org/licenses/agpl.txt
*
*
* Ce fichier fait partie de SesaReactComponent, créée par l'association Sésamath.
*
* SesaXXX est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant
* les termes de la GNU Affero General Public License version 3 telle que publiée par la
* Free Software Foundation.
* SesaXXX est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE,
* sans même la garantie tacite de QUALITÉ MARCHANDE ou d'ADÉQUATION à UN BUT PARTICULIER.
* Consultez la GNU Affero General Public License pour plus de détails.
* Vous devez avoir reçu une copie de la GNU General Public License en même temps que SesaQcm
* (cf LICENCE.txt et http://vvlibri.org/fr/Analyse/gnu-affero-general-public-license-v3-analyse
* pour une explication en français)
*/
'use strict'
const typeEleve = 0
// @todo passer tout ça dans lassi.Context.prototype, quand les méthodes actuelles auront été refactorisées
// (plus de isAuthentifie qui appelle du accessDenied, mais un forceAuthentifie
// qui appelle accessDenied ou une callback, et ce isAuthenticated qui renvoie un booléen,
// idem pour les autres qui mélangent valeur retournée et effect de bord.
module.exports = function (component) {
component.service('$sessionSso', function () {
// on peut pas mettre en dépendance ce service, ni l'appeler ici car il n'est pas encore déclaré quand ce code est exécuté
let $utilisateurAcces
/**
* Ajoute un authBundle en session d'un serveur d'authentification,
* pour que ce serveur connaisse le token à utiliser pour chaque client sesalab-sso
* @param context
* @param authBundle
*/
const addAuthBundle = (context, authBundle) => {
if (!context) throw new Error('contexte manquant')
if (!authBundle) throw new Error('authBundle manquant')
if (!authBundle.baseUrl) throw new Error('baseUrl manquante')
if (!authBundle.token) throw new Error('authToken manquant')
if (!context.session.authBundles) context.session.authBundles = []
context.session.authBundles.push(authBundle)
}
/**
* Ajoute un élève à la session courante
* @param {Context} context
* @param {Utilisateur} eleve
* @throws si y'avait pas déjà un élève en session
*/
const addEleve = (context, eleve) => {
if (!context.session.eleves || !context.session.eleves.length) throw new Error('Aucun élève en session')
context.session.eleves.push(eleve)
}
/**
* Retourne true si loggé
* @param {Context} context
* @returns {boolean}
*/
const isAuthenticated = (context) => context.session.utilisateur || (context.session.eleves && context.session.eleves.length)
/**
* Retourne le login de l'utilisateur identifié (undefined si y'en a pas, 1er élève si y'en a plusieurs)
* @param {Context} context
*/
const getLogin = (context) => (context.session.utilisateur && context.session.utilisateur.login) || (context.session.eleves && context.session.eleves.length && context.session.eleves[0].login)
/**
* Retourne la liste des logins
* @param context
* @returns {string[]}
*/
const getElevesLogins = (context) => {
if (isEleve(context)) return context.eleves.map(e => e.login)
return []
}
const getOid = (context) => (context.session.utilisateur && context.session.utilisateur.oid) || (context.session.eleves && context.session.eleves.length && context.session.eleves[0].oid)
const getElevesOids = (context) => {
if (isEleve(context)) return context.eleves.map(e => e.oid)
return []
}
const getStructureOid = (context) => {
if (!isAuthenticated(context)) return null
try {
// eleve.structures est un array d'un seul oid de structure
return context.session.structureOid || context.session.eleves[0].structures[0]
} catch (error) {
console.error(error)
throw new Error('session corrompue')
}
}
const isEleve = (context) => context.session.eleves && context.session.eleves.length
const isFormateur = (context) => context.session.utilisateur && context.session.utilisateur.type > typeEleve
const isMultiEleves = (context) => context.session.eleves && context.session.eleves.length > 1
/**
* Met un user en session avec une structure (il faut ajouter les autres après ce login qui fait un reset complet de la session)
* @param {Context} context
* @param {Utilisateur} utilisateur
* @param {string} structureOid
*/
const login = (context, utilisateur, structureOid) => {
if (!context) throw new Error('contexte manquant, impossible de mettre en session cet utilisateur')
if (!context.session) throw new Error('session manquante, impossible d’y mettre cet utilisateur')
if (!utilisateur) throw new Error('utilisateur manquant')
if (!structureOid) throw new Error('structure manquante')
if (typeof utilisateur.store !== 'function') throw new Error('utilisateur innvalide')
if (!$utilisateurAcces) $utilisateurAcces = lassi.service('$utilisateurAcces')
// reset
logout(context)
if (utilisateur.type === typeEleve) {
if (utilisateur.structures[0] !== structureOid) throw new Error(`L’élève ${utilisateur.login} n’est pas dans la structure ${structureOid} (mais dans ${utilisateur.structures[0]})`)
context.session.eleves = [utilisateur]
} else {
context.session.utilisateur = utilisateur
context.session.currentStructureOid = structureOid
}
$utilisateurAcces.log(utilisateur)
}
/**
* Efface la session courante
* @param {Context} context
* @returns {boolean} true si y'avait un user authentifié
*/
const logout = (context) => {
const isAuth = isAuthenticated(context)
context.session = {}
return isAuth
}
return {
addAuthBundle,
addEleve,
isAuthenticated,
getElevesLogins,
getElevesOids,
getLogin,
getOid,
getStructureOid,
isEleve,
isFormateur,
isMultiEleves,
login
}
})
}