Whether to manage the popup * @GET[ticket] CAS callback @ticket * * @return headers|body 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...
Vous allez être redirigés"; /* (3) Else -> redirection */ }else{ $homepage = ($_SERVER['SERVER_NAME'] == 'ptut.com' ) ? 'http' : 'https'; $homepage .= '://'.$_SERVER['HTTP_HOST'].'/home'; $body_start = "Veuillez patienter...
Vous allez être redirigés"; } /* (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 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 Whether you have been logged out * ---------------------------------------------------------*/ public function delete(){ \session_destroy(); /* (3) Return if logged out */ return ['logged_out' => true]; } }