Source: component/helperServer.js

/**
 * 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)
 */