262 lines
7.1 KiB
PHP
262 lines
7.1 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: lucas
|
|
* Date: 27/02/18
|
|
* Time: 16:19
|
|
*/
|
|
|
|
namespace api\module;
|
|
|
|
|
|
use database\core\Repo;
|
|
use database\repo\professor;
|
|
use database\repo\meta;
|
|
use error\core\Error;
|
|
use error\core\Err;
|
|
|
|
class casController{
|
|
|
|
|
|
/* (1) Authentication callback
|
|
*
|
|
* @popup_mode<boolean> Whether to manage the popup
|
|
* @GET[ticket]<String> CAS callback @ticket
|
|
*
|
|
* @return headers|body<array> The download content
|
|
*
|
|
---------------------------------------------------------*/
|
|
public static function get($args){
|
|
$popup_mode = false;
|
|
extract($args);
|
|
|
|
// login: https://sso.univ-pau.fr/cas/login?service=http://ptut.com:8080/api/v/1.0/cas
|
|
|
|
|
|
// Communicate over popups
|
|
// ----------------------------
|
|
// window.pop = { closed: false };
|
|
//
|
|
// window.cas_callback = function(cas_login){
|
|
//
|
|
// setTimeout( function(){
|
|
//
|
|
// if( window.pop.closed )
|
|
// console.log('CAS login (null means error): '+cas_login);
|
|
//
|
|
// }, 1);
|
|
//
|
|
// };
|
|
|
|
// Launch PopUp
|
|
// window.pop = window.open('https://sso.univ-pau.fr/cas/login?service=http://ptut.com:8080/api/v/1.0/cas', '_blank', 'location=no,height=1024,width=1024,scrollbars=yes,status=no');
|
|
|
|
/* (0) Initialize
|
|
---------------------------------------------------------*/
|
|
/* (1) Global DOWNLOAD data */
|
|
$headers = ['Content-Type' => 'text/html; charset=UTF-8' ];
|
|
|
|
/* (2) If @popup_mode */
|
|
if( $popup_mode !== 0 ){
|
|
|
|
$body_start = "Veuillez patienter...<br>Vous allez être redirigés<script type='text/javascript'>( typeof window.opener.cas_callback === 'function' ) && window.opener.cas_callback(";
|
|
$body_end = "); window.close();</script>";
|
|
|
|
/* (3) Else -> redirection */
|
|
|
|
}else{
|
|
|
|
$homepage = ($_SERVER['SERVER_NAME'] == 'ptut.com' ) ? 'http' : 'https';
|
|
$homepage .= '://'.$_SERVER['HTTP_HOST'].'/home';
|
|
|
|
$body_start = "Veuillez patienter...<br>Vous allez être redirigés<script type='text/javascript'>console.log(";
|
|
$body_end = "); document.location = '$homepage'; </script>";
|
|
|
|
}
|
|
|
|
/* (4) Reset SESSION */
|
|
// $_SESSION['CAS'] = [];
|
|
|
|
|
|
|
|
/* (1) Check if already connected
|
|
---------------------------------------------------------*/
|
|
/* (1) If already -> return @cas_login */
|
|
if( in_array('cas_user', $_SESSION['AUTH']) ){
|
|
|
|
return [
|
|
'headers' => $headers,
|
|
'body' => $body_start."'".$_SESSION['CAS']['login']."'".$body_end
|
|
];
|
|
|
|
}
|
|
|
|
/* (2) Fail if no ticket */
|
|
if( !isset($_GET['ticket']) || !is_string($_GET['ticket']) || strlen($_GET['ticket']) < 1 )
|
|
return [ 'headers' => $headers, 'body' => $body_start.'-1'.$body_end ];
|
|
|
|
|
|
|
|
/* (2) Check ticket (validate)
|
|
---------------------------------------------------------*/
|
|
/* (1) Build useful variables */
|
|
$service = ($_SERVER['SERVER_NAME'] == 'ptut.com' ) ? 'http' : 'https';
|
|
$service .= '://'.$_SERVER['HTTP_HOST'].'/api/v/1.0/cas/'.$popup_mode;
|
|
$ticket = urlencode($_GET['ticket']);
|
|
$validate_url = "https://sso.univ-pau.fr/cas/serviceValidate?ticket=$ticket&service=$service";
|
|
|
|
/* (2) Configure & Prepare CURL */
|
|
$ch = \curl_init();
|
|
|
|
\curl_setopt($ch, CURLOPT_URL, $validate_url);
|
|
\curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
|
/* (3) Execute CURL & Close it */
|
|
$output = \curl_exec($ch);
|
|
\curl_close($ch);
|
|
|
|
/* (4) Fail if not validated */
|
|
if( strpos($output, 'user') === false )
|
|
return [ 'headers' => $headers, 'body' => $body_start.'-2'.$body_end ];
|
|
|
|
/* (5) Extract cas_login */
|
|
$cas_login = trim(strip_tags($output));
|
|
|
|
/* (6) Check empty */
|
|
if( strlen($cas_login) < 1 )
|
|
return [ 'headers' => $headers, 'body' => $body_start.'-2'.$body_end ];
|
|
|
|
|
|
|
|
/* (3) Meta database: check if @cas_login referenced
|
|
---------------------------------------------------------*/
|
|
/** @var professor $prof_repo */
|
|
$prof_repo = Repo::getRepo('professor');
|
|
/** @var meta $meta_repo */
|
|
$meta_repo = Repo::getRepo('meta');
|
|
|
|
/* (1) Get the list of linked departments for this @cas_login */
|
|
$departments = $meta_repo->get_prof_departments($cas_login);
|
|
|
|
/* (2) Failure: if no department for @cas_login */
|
|
if( count($departments) === 0 )
|
|
return [ 'headers' => $headers, 'body' => $body_start.'-3'.$body_end ];
|
|
|
|
/* (3) Set departments data */
|
|
$_SESSION['AvailableDepartments'] = $departments;
|
|
|
|
/* (4) Choose first department by default */
|
|
$_SESSION['CurrentDepartmentId'] = $departments[0]['idDep'];
|
|
$_SESSION['VERSION'] = [
|
|
'list' => $departments[0]['versions'],
|
|
'current' => null
|
|
];
|
|
|
|
/* (5) select version with default = 1 */
|
|
foreach($_SESSION['VERSION']['list'] as $v){
|
|
if( $v['default'] == 1 ){
|
|
$_SESSION['VERSION']['current'] = intval($v['iddatabase']);
|
|
$_SESSION['CurrentDatabase'] = $v['dbName'];
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* (6) if no default -> select first */
|
|
if( !is_int($_SESSION['VERSION']) ){
|
|
$_SESSION['VERSION']['current'] = intval($_SESSION['VERSION']['list'][0]['iddatabase']);
|
|
$_SESSION['CurrentDatabase'] = $_SESSION['VERSION']['list'][0]['dbName'];
|
|
}
|
|
|
|
/* (7) Use this department's database */
|
|
Repo::switchDatabase($_SESSION['CurrentDatabase']);
|
|
|
|
|
|
|
|
|
|
/* (4) Fetch @cas_login professor data
|
|
---------------------------------------------------------*/
|
|
/* (1) Try to fetch professor */
|
|
$by_login = $prof_repo->getByLogin($cas_login);
|
|
|
|
/* (2) If not found -> reset SESSION */
|
|
if( !is_array($by_login) || !isset($by_login['idProfesseur']) || !isset($by_login['admin']) )
|
|
return [ 'headers' => $headers, 'body' => $body_start.'-4'.$body_end ];
|
|
|
|
|
|
|
|
/* (5) Store data in session
|
|
---------------------------------------------------------*/
|
|
/* (1) Security */
|
|
\session_regenerate_id();
|
|
|
|
/* (2) Store CAS user data in SESSION */
|
|
$_SESSION['CAS'] = [
|
|
'login' => $cas_login,
|
|
'ticket' => $ticket,
|
|
'id' => (int) $by_login['idProfesseur'],
|
|
'admin' => (bool) $by_login['admin']
|
|
];
|
|
|
|
/* (3) Success CAS login */
|
|
return [
|
|
'headers' => $headers,
|
|
'body' => $body_start."'".$_SESSION['CAS']['login']."'".$body_end
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* (2) Logout from CAS server
|
|
*
|
|
* @return logged_out<bool> Whether you have been logged out
|
|
*
|
|
---------------------------------------------------------*/
|
|
public function put(){
|
|
|
|
/* (1) Call logout script
|
|
---------------------------------------------------------*/
|
|
/* (1) Build useful variables */
|
|
$logout_url = "https://sso.univ-pau.fr/cas/logout";
|
|
|
|
/* (2) Configure & Prepare CURL */
|
|
$ch = \curl_init();
|
|
|
|
\curl_setopt($ch, CURLOPT_URL, $logout_url);
|
|
\curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
|
|
\curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
|
/* (3) Execute CURL & Close it */
|
|
$output = \curl_exec($ch);
|
|
\curl_close($ch);
|
|
|
|
/* (4) Error if no output */
|
|
if( strlen($output) < 1 )
|
|
return ['logged_out' => false, 'redirect_url' => $logout_url];
|
|
|
|
/* (4) Destroy session */
|
|
\session_destroy();
|
|
|
|
/* (5) Return if logged out */
|
|
return ['logged_out' => true, 'redirect_url' => $logout_url];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* (3) Logout (not from CAS server)
|
|
*
|
|
* @return logged_out<bool> Whether you have been logged out
|
|
*
|
|
---------------------------------------------------------*/
|
|
public function delete(){
|
|
|
|
\session_destroy();
|
|
|
|
/* (3) Return if logged out */
|
|
return ['logged_out' => true];
|
|
|
|
|
|
}
|
|
|
|
} |