<?php
// +-------------------------------------------------+
// | 2002-2007 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
// +-------------------------------------------------+
// $Id: pmbesCairn.class.php,v 1.5.8.2 2026/08/25 09:07:14 rtigero Exp $

if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");

global $base_path, $class_path;
require_once($class_path . "/external_services.class.php");
require_once($class_path . "/external_services_caches.class.php");
require_once($class_path . "/sessions_tokens.class.php");
require_once($base_path . "/admin/connecteurs/in/cairn/cairn.class.php");
require_once($class_path . "/encoding_normalize.class.php");

class pmbesCairn extends external_services_api_class
{

	protected const CAIRN_PATH = "/admin/connecteurs/in/cairn";

	/**
	 * Verifie la validite d'un token transmis par Cairn
	 *
	 * Le token peut avoir ete genere depuis l'OPAC ou depuis un service externe :
	 * l'origine de la session est donc detectee automatiquement.
	 *
	 * @param string $token Token a verifier
	 * @return array Informations de session (SESSID, id_cairn, id_empr, expiration, error, error_message)
	 */
	public function check_token($token)
	{
		/**
		 * On renvoie les infos emprunteur (id persistant, date d'expiration de la session, id empr, id cairn)
		 */
		$response = array(
			'SESSID' => '',
			'id_cairn' => '',
			'id_empr' => '',
			'expiration' => 0,
			'error' => false,
			'error_message' => ''
		);

		$sessions_token = new sessions_tokens('cairn', sessions_tokens::SESSION_TYPE_AUTO);
		$sessions_token->set_token($token);

		if (!$sessions_token->is_valid()) {
			$this->error = true;
			$this->error_message = $this->msg['cairn_error_invalid_token'];
			$response['error'] = $this->error;
			$response['error_message'] = $this->error_message . ' : ' . $token;
			return encoding_normalize::utf8_normalize($response);
		}
		// La récupération du login suffit à valider le token et la session
		$sessid =  md5($sessions_token->get_SESSID());
		$session_expiration = $sessions_token->get_expiration();
		$empr_login = $sessions_token->get_login();
		$cairn_connector = new cairn();
		$empr_id = $cairn_connector->get_empr_id($empr_login);
		$id_cairn = $cairn_connector->get_cairn_id();

		$response['SESSID'] = $sessid;
		$response['id_cairn'] = $id_cairn;
		$response['id_empr'] = $empr_id;
		$response['expiration'] = $session_expiration;

		return encoding_normalize::utf8_normalize($response);
	}

	/**
	 * Genere un token Cairn pour une session de service externe
	 *
	 * @param string $sessionid Identifiant de session du service externe
	 * @return string Token
	 */
	public function get_token($sessionid)
	{
		global $base_path;
		$connector = new cairn($base_path . static::CAIRN_PATH);
		return $connector->get_token($sessionid, sessions_tokens::SESSION_TYPE_WEBSERVICES);
	}

	/**
	 * Genere les parametres SSO Cairn pour une session de service externe
	 *
	 * @param string $sessionid Identifiant de session du service externe
	 * @return string Parametres a ajouter a l'url de la ressource
	 */
	public function get_sso_cairn_link($sessionid)
	{
		global $base_path;
		$connector = new cairn($base_path . static::CAIRN_PATH);
		$token = $connector->get_token($sessionid, sessions_tokens::SESSION_TYPE_WEBSERVICES);
		if ($token) {
			return '&idsso=' . $connector->get_cairn_id() . '&pmbtoken=' . $token;
		}
		return '';
	}
}
