/**
* This file is part of Sesatheque.
* Copyright 2014-2015, Association Sésamath
*
* Sesatheque 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.
*
* Sesatheque 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 Sesatheque (LICENCE.txt).
* @see http://www.gnu.org/licenses/agpl.txt
*
*
* Ce fichier fait partie de l'application Sésathèque, créée par l'association Sésamath.
*
* Sésathèque 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.
* Sésathèque 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 Sésathèque
* (cf LICENCE.txt et http://vvlibri.org/fr/Analyse/gnu-affero-general-public-license-v3-analyse
* pour une explication en français)
*/
'use strict'
// un module avec des méthodes communes pour le service et le controleur du client
const { defaultPrefix } = require('./common')
const { getBaseConfig } = require('./helper')
/** @type {sesalabSsoServer} */
let server
/**
* Initialise client
* @private
*/
function init (componentConfig, baseUrl) {
server = getBaseConfig(componentConfig, baseUrl)
// params serveur
if (!componentConfig.clients || !componentConfig.clients.length) {
throw new Error('Impossible d’initialiser $sesalabSsoServer sans préciser les clients en configuration')
}
// on est serveur, il faut fournir ça
;['afterClientsPage', 'errorPage', 'loginPage', 'logoutPage'].forEach(function (prop) {
if (typeof componentConfig[prop] !== 'string') throw new Error('config incorrecte, ' + prop + ' manquant)')
server[prop] = componentConfig[prop]
})
// lui est déduit
server.validate = server.prefix + '/validate'
server.afterlogin = server.prefix + '/afterlogin'
// on passe aux params des clients
server.clients = componentConfig.clients.map(function (client) {
if (!client.baseUrl) throw new Error('Chaque client sesalabSSo configuré doit avoir une baseUrl')
/**
* @private
* @type {Client}
*/
const cleanClient = {}
cleanClient.baseUrl = client.baseUrl
const clientPrefix = client.prefix || defaultPrefix
cleanClient.login = clientPrefix + '/login'
cleanClient.logout = clientPrefix + '/logout'
if (client.ip) cleanClient.ip = client.ip
return cleanClient
})
// console.log('après init on a server', server)
}
module.exports = {
// méthodes internes au server
getBaseUrl: () => server.baseUrl,
getClients: () => server.clients,
getProp: (prop) => server[prop],
getTtl: () => server.timeout * 2,
init
}
/**
* @typedef {Object} sesalabSsoServer
* @property {string} baseUrl
* @property {number} [timeout=10] Timeout des appels du validate (en s), la durée de mise en cache des token sera du double
* @property {string} [prefix=sesalabSso] Préfixe des routes de ce module (client et serveur)
* @property {Client[]} clients La liste des applis clientes (donc on est serveur)
* @property {string} afterClientsPage url de redirect sur l'appli serveur après login sso chez les clients
* @property {string} errorPage
* @property {string} loginPage
* @property {string} logoutPage
* @property {string} validate
* @property {string} afterlogin
* @property {AuthServer[]} authServers La liste des serveurs d'authentification (donc on est client)
*/