Projet

Général

Profil

Révision bfbe6619

Ajouté par Florent Torregrosa il y a environ 10 ans

Remove old and unused libraries cas.dgeo and superfish.

Voir les différences:

drupal7/sites/all/libraries/CAS.dgeo/CAS.php
1
<?php
2

  
3

  
4
/*
5
 * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
6
 * All rights reserved.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions are met:
10
 *
11
 *     * Redistributions of source code must retain the above copyright notice,
12
 *       this list of conditions and the following disclaimer.
13
 *     * Redistributions in binary form must reproduce the above copyright notice,
14
 *       this list of conditions and the following disclaimer in the documentation
15
 *       and/or other materials provided with the distribution.
16
 *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
17
 *       Collaborative nor the names of its contributors may be used to endorse or
18
 *       promote products derived from this software without specific prior
19
 *       written permission.
20

  
21
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
22
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
25
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
28
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
 */
32

  
33
//
34
// hack by Vangelis Haniotakis to handle the absence of $_SERVER['REQUEST_URI'] in IIS
35
//
36
if (php_sapi_name() != 'cli') {
37
	if (!isset($_SERVER['REQUEST_URI'])) {
38
		$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . '?' . $_SERVER['QUERY_STRING'];
39
	}
40
}
41

  
42
// Add a E_USER_DEPRECATED for php versions <= 5.2
43
if (!defined('E_USER_DEPRECATED')){
44
	define('E_USER_DEPRECATED', E_USER_NOTICE);
45
}
46

  
47
/**
48
 * @file CAS/CAS.php
49
 * Interface class of the phpCAS library
50
 *
51
 * @ingroup public
52
 */
53

  
54
// ########################################################################
55
//  CONSTANTS
56
// ########################################################################
57

  
58
// ------------------------------------------------------------------------
59
//  CAS VERSIONS
60
// ------------------------------------------------------------------------
61

  
62
/**
63
 * phpCAS version. accessible for the user by phpCAS::getVersion().
64
 */
65
define('PHPCAS_VERSION', '1.2.2');
66

  
67
// ------------------------------------------------------------------------
68
//  CAS VERSIONS
69
// ------------------------------------------------------------------------
70
/**
71
 * @addtogroup public
72
 * @{
73
 */
74

  
75
/**
76
 * CAS version 1.0
77
 */
78
define("CAS_VERSION_1_0", '1.0');
79
/*!
80
 * CAS version 2.0
81
 */
82
define("CAS_VERSION_2_0", '2.0');
83

  
84
// ------------------------------------------------------------------------
85
//  SAML defines
86
// ------------------------------------------------------------------------
87

  
88
/**
89
 * SAML protocol
90
 */
91
define("SAML_VERSION_1_1", 'S1');
92

  
93
/**
94
 * XML header for SAML POST
95
 */
96
define("SAML_XML_HEADER", '<?xml version="1.0" encoding="UTF-8"?>');
97

  
98
/**
99
 * SOAP envelope for SAML POST
100
 */
101
define("SAML_SOAP_ENV", '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/>');
102

  
103
/**
104
 * SOAP body for SAML POST
105
 */
106
define("SAML_SOAP_BODY", '<SOAP-ENV:Body>');
107

  
108
/**
109
 * SAMLP request
110
 */
111
define("SAMLP_REQUEST", '<samlp:Request xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"  MajorVersion="1" MinorVersion="1" RequestID="_192.168.16.51.1024506224022" IssueInstant="2002-06-19T17:03:44.022Z">');
112
define("SAMLP_REQUEST_CLOSE", '</samlp:Request>');
113

  
114
/**
115
 * SAMLP artifact tag (for the ticket)
116
 */
117
define("SAML_ASSERTION_ARTIFACT", '<samlp:AssertionArtifact>');
118

  
119
/**
120
 * SAMLP close
121
 */
122
define("SAML_ASSERTION_ARTIFACT_CLOSE", '</samlp:AssertionArtifact>');
123

  
124
/**
125
 * SOAP body close
126
 */
127
define("SAML_SOAP_BODY_CLOSE", '</SOAP-ENV:Body>');
128

  
129
/**
130
 * SOAP envelope close
131
 */
132
define("SAML_SOAP_ENV_CLOSE", '</SOAP-ENV:Envelope>');
133

  
134
/**
135
 * SAML Attributes
136
 */
137
define("SAML_ATTRIBUTES", 'SAMLATTRIBS');
138

  
139
/** @} */
140
/**
141
 * @addtogroup publicPGTStorage
142
 * @{
143
 */
144
// ------------------------------------------------------------------------
145
//  FILE PGT STORAGE
146
// ------------------------------------------------------------------------
147
/**
148
 * Default path used when storing PGT's to file
149
 */
150
define("CAS_PGT_STORAGE_FILE_DEFAULT_PATH", '/tmp');
151
/** @} */
152
// ------------------------------------------------------------------------
153
// SERVICE ACCESS ERRORS
154
// ------------------------------------------------------------------------
155
/**
156
 * @addtogroup publicServices
157
 * @{
158
 */
159

  
160
/**
161
 * phpCAS::service() error code on success
162
 */
163
define("PHPCAS_SERVICE_OK", 0);
164
/**
165
 * phpCAS::service() error code when the PT could not retrieve because
166
 * the CAS server did not respond.
167
 */
168
define("PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE", 1);
169
/**
170
 * phpCAS::service() error code when the PT could not retrieve because
171
 * the response of the CAS server was ill-formed.
172
 */
173
define("PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE", 2);
174
/**
175
 * phpCAS::service() error code when the PT could not retrieve because
176
 * the CAS server did not want to.
177
 */
178
define("PHPCAS_SERVICE_PT_FAILURE", 3);
179
/**
180
 * phpCAS::service() error code when the service was not available.
181
 */
182
define("PHPCAS_SERVICE_NOT_AVAILABLE", 4);
183

  
184
// ------------------------------------------------------------------------
185
// SERVICE TYPES
186
// ------------------------------------------------------------------------
187
/**
188
 * phpCAS::getProxiedService() type for HTTP GET
189
 */
190
define("PHPCAS_PROXIED_SERVICE_HTTP_GET", 'CAS_ProxiedService_Http_Get');
191
/**
192
 * phpCAS::getProxiedService() type for HTTP POST
193
 */
194
define("PHPCAS_PROXIED_SERVICE_HTTP_POST", 'CAS_ProxiedService_Http_Post');
195
/**
196
 * phpCAS::getProxiedService() type for IMAP
197
 */
198
define("PHPCAS_PROXIED_SERVICE_IMAP", 'CAS_ProxiedService_Imap');
199

  
200

  
201
/** @} */
202
// ------------------------------------------------------------------------
203
//  LANGUAGES
204
// ------------------------------------------------------------------------
205
/**
206
 * @addtogroup publicLang
207
 * @{
208
 */
209

  
210
define("PHPCAS_LANG_ENGLISH", 'english');
211
define("PHPCAS_LANG_FRENCH", 'french');
212
define("PHPCAS_LANG_GREEK", 'greek');
213
define("PHPCAS_LANG_GERMAN", 'german');
214
define("PHPCAS_LANG_JAPANESE", 'japanese');
215
define("PHPCAS_LANG_SPANISH", 'spanish');
216
define("PHPCAS_LANG_CATALAN", 'catalan');
217

  
218
/** @} */
219

  
220
/**
221
 * @addtogroup internalLang
222
 * @{
223
 */
224

  
225
/**
226
 * phpCAS default language (when phpCAS::setLang() is not used)
227
 */
228
define("PHPCAS_LANG_DEFAULT", PHPCAS_LANG_ENGLISH);
229

  
230
/** @} */
231
// ------------------------------------------------------------------------
232
//  DEBUG
233
// ------------------------------------------------------------------------
234
/**
235
 * @addtogroup publicDebug
236
 * @{
237
 */
238

  
239
/**
240
 * The default directory for the debug file under Unix.
241
 */
242
define('DEFAULT_DEBUG_DIR', '/tmp/');
243

  
244
/** @} */
245
// ------------------------------------------------------------------------
246
//  MISC
247
// ------------------------------------------------------------------------
248
/**
249
 * @addtogroup internalMisc
250
 * @{
251
 */
252

  
253
/**
254
 * This global variable is used by the interface class phpCAS.
255
 *
256
 * @hideinitializer
257
 */
258
$GLOBALS['PHPCAS_CLIENT'] = null;
259

  
260
/**
261
 * This global variable is used to store where the initializer is called from
262
 * (to print a comprehensive error in case of multiple calls).
263
 *
264
 * @hideinitializer
265
 */
266
$GLOBALS['PHPCAS_INIT_CALL'] = array (
267
	'done' => FALSE,
268
	'file' => '?',
269
	'line' => -1,
270
	'method' => '?'
271
);
272

  
273
/**
274
 * This global variable is used to store where the method checking
275
 * the authentication is called from (to print comprehensive errors)
276
 *
277
 * @hideinitializer
278
 */
279
$GLOBALS['PHPCAS_AUTH_CHECK_CALL'] = array (
280
	'done' => FALSE,
281
	'file' => '?',
282
	'line' => -1,
283
	'method' => '?',
284
	'result' => FALSE
285
);
286

  
287
/**
288
 * This global variable is used to store phpCAS debug mode.
289
 *
290
 * @hideinitializer
291
 */
292
$GLOBALS['PHPCAS_DEBUG'] = array (
293
	'filename' => FALSE,
294
	'indent' => 0,
295
	'unique_id' => ''
296
);
297

  
298
/** @} */
299

  
300
// ########################################################################
301
//  CLIENT CLASS
302
// ########################################################################
303

  
304
// include client class
305
include_once (dirname(__FILE__) . '/CAS/Client.php');
306

  
307
// ########################################################################
308
//  INTERFACE CLASS
309
// ########################################################################
310

  
311
/**
312
 * @class phpCAS
313
 * The phpCAS class is a simple container for the phpCAS library. It provides CAS
314
 * authentication for web applications written in PHP.
315
 *
316
 * @ingroup public
317
 * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
318
 *
319
 * \internal All its methods access the same object ($PHPCAS_CLIENT, declared
320
 * at the end of CAS/Client.php).
321
 */
322

  
323
class phpCAS {
324

  
325
	// ########################################################################
326
	//  INITIALIZATION
327
	// ########################################################################
328

  
329
	/**
330
	 * @addtogroup publicInit
331
	 * @{
332
	 */
333

  
334
	/**
335
	 * phpCAS client initializer.
336
	 * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be
337
	 * called, only once, and before all other methods (except phpCAS::getVersion()
338
	 * and phpCAS::setDebug()).
339
	 *
340
	 * @param $server_version the version of the CAS server
341
	 * @param $server_hostname the hostname of the CAS server
342
	 * @param $server_port the port the CAS server is running on
343
	 * @param $server_uri the URI the CAS server is responding on
344
	 * @param $start_session Have phpCAS start PHP sessions (default true)
345
	 *
346
	 * @return a newly created CAS_Client object
347
	 */
348
	public static function client($server_version, $server_hostname, $server_port, $server_uri, $start_session = true) {
349
		global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
350

  
351
		phpCAS :: traceBegin();
352
		if (is_object($PHPCAS_CLIENT)) {
353
			phpCAS :: error($PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . $PHPCAS_INIT_CALL['file'] . ':' . $PHPCAS_INIT_CALL['line'] . ')');
354
		}
355
		if (gettype($server_version) != 'string') {
356
			phpCAS :: error('type mismatched for parameter $server_version (should be `string\')');
357
		}
358
		if (gettype($server_hostname) != 'string') {
359
			phpCAS :: error('type mismatched for parameter $server_hostname (should be `string\')');
360
		}
361
		if (gettype($server_port) != 'integer') {
362
			phpCAS :: error('type mismatched for parameter $server_port (should be `integer\')');
363
		}
364
		if (gettype($server_uri) != 'string') {
365
			phpCAS :: error('type mismatched for parameter $server_uri (should be `string\')');
366
		}
367

  
368
		// store where the initializer is called from
369
		$dbg = debug_backtrace();
370
		$PHPCAS_INIT_CALL = array (
371
			'done' => TRUE,
372
			'file' => $dbg[0]['file'],
373
			'line' => $dbg[0]['line'],
374
			'method' => __CLASS__ . '::' . __FUNCTION__
375
		);
376

  
377
		// initialize the global object $PHPCAS_CLIENT
378
		$PHPCAS_CLIENT = new CAS_Client($server_version, FALSE /*proxy*/
379
		, $server_hostname, $server_port, $server_uri, $start_session);
380
		phpCAS :: traceEnd();
381
	}
382

  
383
	/**
384
	 * phpCAS proxy initializer.
385
	 * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be
386
	 * called, only once, and before all other methods (except phpCAS::getVersion()
387
	 * and phpCAS::setDebug()).
388
	 *
389
	 * @param $server_version the version of the CAS server
390
	 * @param $server_hostname the hostname of the CAS server
391
	 * @param $server_port the port the CAS server is running on
392
	 * @param $server_uri the URI the CAS server is responding on
393
	 * @param $start_session Have phpCAS start PHP sessions (default true)
394
	 *
395
	 * @return a newly created CAS_Client object
396
	 */
397
	public static function proxy($server_version, $server_hostname, $server_port, $server_uri, $start_session = true) {
398
		global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
399

  
400
		phpCAS :: traceBegin();
401
		if (is_object($PHPCAS_CLIENT)) {
402
			phpCAS :: error($PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . $PHPCAS_INIT_CALL['file'] . ':' . $PHPCAS_INIT_CALL['line'] . ')');
403
		}
404
		if (gettype($server_version) != 'string') {
405
			phpCAS :: error('type mismatched for parameter $server_version (should be `string\')');
406
		}
407
		if (gettype($server_hostname) != 'string') {
408
			phpCAS :: error('type mismatched for parameter $server_hostname (should be `string\')');
409
		}
410
		if (gettype($server_port) != 'integer') {
411
			phpCAS :: error('type mismatched for parameter $server_port (should be `integer\')');
412
		}
413
		if (gettype($server_uri) != 'string') {
414
			phpCAS :: error('type mismatched for parameter $server_uri (should be `string\')');
415
		}
416

  
417
		// store where the initialzer is called from
418
		$dbg = debug_backtrace();
419
		$PHPCAS_INIT_CALL = array (
420
			'done' => TRUE,
421
			'file' => $dbg[0]['file'],
422
			'line' => $dbg[0]['line'],
423
			'method' => __CLASS__ . '::' . __FUNCTION__
424
		);
425

  
426
		// initialize the global object $PHPCAS_CLIENT
427
		$PHPCAS_CLIENT = new CAS_Client($server_version, TRUE /*proxy*/
428
		, $server_hostname, $server_port, $server_uri, $start_session);
429
		phpCAS :: traceEnd();
430
	}
431

  
432
	/** @} */
433
	// ########################################################################
434
	//  DEBUGGING
435
	// ########################################################################
436

  
437
	/**
438
	 * @addtogroup publicDebug
439
	 * @{
440
	 */
441

  
442
	/**
443
	 * Set/unset debug mode
444
	 *
445
	 * @param $filename the name of the file used for logging, or FALSE to stop debugging.
446
	 */
447
	public static function setDebug($filename = '') {
448
		global $PHPCAS_DEBUG;
449

  
450
		if ($filename != FALSE && gettype($filename) != 'string') {
451
			phpCAS :: error('type mismatched for parameter $dbg (should be FALSE or the name of the log file)');
452
		}
453
		if ($filename === FALSE){
454
			unset($PHPCAS_DEBUG['filename']);
455
		}else{
456
			if (empty ($filename)) {
457
				if (preg_match('/^Win.*/', getenv('OS'))) {
458
					if (isset ($_ENV['TMP'])) {
459
						$debugDir = $_ENV['TMP'] . '/';
460
					} else
461
						if (isset ($_ENV['TEMP'])) {
462
							$debugDir = $_ENV['TEMP'] . '/';
463
						} else {
464
							$debugDir = '';
465
						}
466
				} else {
467
					$debugDir = DEFAULT_DEBUG_DIR;
468
				}
469
				$filename = $debugDir . 'phpCAS.log';
470
			}
471
			
472
			if (empty ($PHPCAS_DEBUG['unique_id'])) {
473
				$PHPCAS_DEBUG['unique_id'] = substr(strtoupper(md5(uniqid(''))), 0, 4);
474
			}
475
			
476
			$PHPCAS_DEBUG['filename'] = $filename;
477
			
478
			phpCAS :: trace('START phpCAS-' . PHPCAS_VERSION . ' ******************');
479
		}
480
	}
481

  
482

  
483
	/**
484
	 * Logs a string in debug mode.
485
	 *
486
	 * @param $str the string to write
487
	 *
488
	 * @private
489
	 */
490
	public static function log($str) {
491
		$indent_str = ".";
492
		global $PHPCAS_DEBUG;
493

  
494
		if ($PHPCAS_DEBUG['filename']) {
495
			for ($i = 0; $i < $PHPCAS_DEBUG['indent']; $i++) {
496
				$indent_str .= '|    ';
497
			}
498
			// allow for multiline output with proper identing. Usefull for dumping cas answers etc.
499
			$str2 = str_replace("\n", "\n" . $PHPCAS_DEBUG['unique_id'] . ' ' . $indent_str, $str);
500
			error_log($PHPCAS_DEBUG['unique_id'] . ' ' . $indent_str . $str2 . "\n", 3, $PHPCAS_DEBUG['filename']);
501
		}
502

  
503
	}
504

  
505
	/**
506
	 * This method is used by interface methods to print an error and where the function
507
	 * was originally called from.
508
	 *
509
	 * @param $msg the message to print
510
	 *
511
	 * @private
512
	 */
513
	public static function error($msg) {
514
		$dbg = debug_backtrace();
515
		$function = '?';
516
		$file = '?';
517
		$line = '?';
518
		if (is_array($dbg)) {
519
			for ($i = 1; $i < sizeof($dbg); $i++) {
520
				if (is_array($dbg[$i]) && isset($dbg[$i]['class']) ) {
521
					if ($dbg[$i]['class'] == __CLASS__) {
522
						$function = $dbg[$i]['function'];
523
						$file = $dbg[$i]['file'];
524
						$line = $dbg[$i]['line'];
525
					}
526
				}
527
			}
528
		}
529
		echo "<br />\n<b>phpCAS error</b>: <font color=\"FF0000\"><b>" . __CLASS__ . "::" . $function . '(): ' . htmlentities($msg) . "</b></font> in <b>" . $file . "</b> on line <b>" . $line . "</b><br />\n";
530
		phpCAS :: trace($msg);
531
		phpCAS :: traceExit();
532
		exit ();
533
	}
534

  
535
	/**
536
	 * This method is used to log something in debug mode.
537
	 */
538
	public static function trace($str) {
539
		$dbg = debug_backtrace();
540
		phpCAS :: log($str . ' [' . basename($dbg[0]['file']) . ':' . $dbg[0]['line'] . ']');
541
	}
542

  
543
	/**
544
	 * This method is used to indicate the start of the execution of a function in debug mode.
545
	 */
546
	public static function traceBegin() {
547
		global $PHPCAS_DEBUG;
548

  
549
		$dbg = debug_backtrace();
550
		$str = '=> ';
551
		if (!empty ($dbg[1]['class'])) {
552
			$str .= $dbg[1]['class'] . '::';
553
		}
554
		$str .= $dbg[1]['function'] . '(';
555
		if (is_array($dbg[1]['args'])) {
556
			foreach ($dbg[1]['args'] as $index => $arg) {
557
				if ($index != 0) {
558
					$str .= ', ';
559
				}
560
				if(is_object($arg)){
561
					$str .= get_class($arg);
562
				}else{
563
					$str .= str_replace(array("\r\n", "\n", "\r"), "", var_export($arg, TRUE));
564
				}
565
			}
566
		}
567
		if (isset($dbg[1]['file']))
568
		$file = basename($dbg[1]['file']);
569
		else
570
		$file = 'unknown_file';
571
		if (isset($dbg[1]['line']))
572
		$line = $dbg[1]['line'];
573
		else
574
		$line = 'unknown_line';
575
		$str .= ') [' . $file . ':' . $line . ']';
576
		phpCAS :: log($str);
577
		$PHPCAS_DEBUG['indent']++;
578
	}
579

  
580
	/**
581
	 * This method is used to indicate the end of the execution of a function in debug mode.
582
	 *
583
	 * @param $res the result of the function
584
	 */
585
	public static function traceEnd($res = '') {
586
		global $PHPCAS_DEBUG;
587

  
588
		$PHPCAS_DEBUG['indent']--;
589
		$dbg = debug_backtrace();
590
		$str = '';
591
		if(is_object($res)){
592
			$str .= '<= ' . get_class($arg);
593
		}else{
594
			$str .= '<= ' . str_replace(array("\r\n", "\n", "\r"), "", var_export($res, TRUE));
595
		}
596
		
597
		phpCAS :: log($str);
598
	}
599

  
600
	/**
601
	 * This method is used to indicate the end of the execution of the program
602
	 */
603
	public static function traceExit() {
604
		global $PHPCAS_DEBUG;
605

  
606
		phpCAS :: log('exit()');
607
		while ($PHPCAS_DEBUG['indent'] > 0) {
608
			phpCAS :: log('-');
609
			$PHPCAS_DEBUG['indent']--;
610
		}
611
	}
612

  
613
	/** @} */
614
	// ########################################################################
615
	//  INTERNATIONALIZATION
616
	// ########################################################################
617
	/**
618
	 * @addtogroup publicLang
619
	 * @{
620
	 */
621

  
622
	/**
623
	 * This method is used to set the language used by phpCAS.
624
	 * @note Can be called only once.
625
	 *
626
	 * @param $lang a string representing the language.
627
	 *
628
	 * @sa PHPCAS_LANG_FRENCH, PHPCAS_LANG_ENGLISH
629
	 */
630
	public static function setLang($lang) {
631
		global $PHPCAS_CLIENT;
632
		if (!is_object($PHPCAS_CLIENT)) {
633
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
634
		}
635
		if (gettype($lang) != 'string') {
636
			phpCAS :: error('type mismatched for parameter $lang (should be `string\')');
637
		}
638
		$PHPCAS_CLIENT->setLang($lang);
639
	}
640

  
641
	/** @} */
642
	// ########################################################################
643
	//  VERSION
644
	// ########################################################################
645
	/**
646
	 * @addtogroup public
647
	 * @{
648
	 */
649

  
650
	/**
651
	 * This method returns the phpCAS version.
652
	 *
653
	 * @return the phpCAS version.
654
	 */
655
	public static function getVersion() {
656
		return PHPCAS_VERSION;
657
	}
658

  
659
	/** @} */
660
	// ########################################################################
661
	//  HTML OUTPUT
662
	// ########################################################################
663
	/**
664
	 * @addtogroup publicOutput
665
	 * @{
666
	 */
667

  
668
	/**
669
	 * This method sets the HTML header used for all outputs.
670
	 *
671
	 * @param $header the HTML header.
672
	 */
673
	public static function setHTMLHeader($header) {
674
		global $PHPCAS_CLIENT;
675
		if (!is_object($PHPCAS_CLIENT)) {
676
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
677
		}
678
		if (gettype($header) != 'string') {
679
			phpCAS :: error('type mismatched for parameter $header (should be `string\')');
680
		}
681
		$PHPCAS_CLIENT->setHTMLHeader($header);
682
	}
683

  
684
	/**
685
	 * This method sets the HTML footer used for all outputs.
686
	 *
687
	 * @param $footer the HTML footer.
688
	 */
689
	public static function setHTMLFooter($footer) {
690
		global $PHPCAS_CLIENT;
691
		if (!is_object($PHPCAS_CLIENT)) {
692
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
693
		}
694
		if (gettype($footer) != 'string') {
695
			phpCAS :: error('type mismatched for parameter $footer (should be `string\')');
696
		}
697
		$PHPCAS_CLIENT->setHTMLFooter($footer);
698
	}
699

  
700
	/** @} */
701
	// ########################################################################
702
	//  PGT STORAGE
703
	// ########################################################################
704
	/**
705
	 * @addtogroup publicPGTStorage
706
	 * @{
707
	 */
708

  
709
	/**
710
	 * This method can be used to set a custom PGT storage object.
711
	 *
712
	 * @param $storage a PGT storage object that inherits from the CAS_PGTStorage class
713
	 */
714
	public static function setPGTStorage($storage) {
715
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
716

  
717
		phpCAS :: traceBegin();
718
		if (!is_object($PHPCAS_CLIENT)) {
719
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
720
		}
721
		if (!$PHPCAS_CLIENT->isProxy()) {
722
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
723
		}
724
		if ($PHPCAS_AUTH_CHECK_CALL['done']) {
725
			phpCAS :: error('this method should only be called before ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() (called at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ')');
726
		}
727
		if ( !($storage instanceof CAS_PGTStorage) ) {
728
			phpCAS :: error('type mismatched for parameter $storage (should be a CAS_PGTStorage `object\')');
729
		}
730
		$PHPCAS_CLIENT->setPGTStorage($storage);
731
		phpCAS :: traceEnd();
732
	}
733

  
734
	/**
735
	 * This method is used to tell phpCAS to store the response of the
736
	 * CAS server to PGT requests in a database.
737
	 *
738
	 * @param $dsn_or_pdo a dsn string to use for creating a PDO object or a PDO object
739
	 * @param $username the username to use when connecting to the database
740
	 * @param $password the password to use when connecting to the database
741
	 * @param $table the table to use for storing and retrieving PGT's
742
	 * @param $driver_options any driver options to use when connecting to the database
743
	 */
744
	public static function setPGTStorageDb($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null) {
745
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
746

  
747
		phpCAS :: traceBegin();
748
		if (!is_object($PHPCAS_CLIENT)) {
749
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
750
		}
751
		if (!$PHPCAS_CLIENT->isProxy()) {
752
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
753
		}
754
		if ($PHPCAS_AUTH_CHECK_CALL['done']) {
755
			phpCAS :: error('this method should only be called before ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() (called at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ')');
756
		}
757
		if (gettype($username) != 'string') {
758
			phpCAS :: error('type mismatched for parameter $username (should be `string\')');
759
		}
760
		if (gettype($password) != 'string') {
761
			phpCAS :: error('type mismatched for parameter $password (should be `string\')');
762
		}
763
		if (gettype($table) != 'string') {
764
			phpCAS :: error('type mismatched for parameter $table (should be `string\')');
765
		}
766
		$PHPCAS_CLIENT->setPGTStorageDb($dsn_or_pdo, $username, $password, $table, $driver_options);
767
		phpCAS :: traceEnd();
768
	}
769
	
770
	/**
771
	 * This method is used to tell phpCAS to store the response of the
772
	 * CAS server to PGT requests onto the filesystem.
773
	 * @param $format the format used to store the PGT's. This parameter has no effect and is only for backwards compatibility
774
	 * @param $path the path where the PGT's should be stored
775
	 */
776
	public static function setPGTStorageFile($format = '', $path = '') {
777
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
778

  
779
		phpCAS :: traceBegin();
780
		if (!is_object($PHPCAS_CLIENT)) {
781
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
782
		}
783
		if (!$PHPCAS_CLIENT->isProxy()) {
784
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
785
		}
786
		if ($PHPCAS_AUTH_CHECK_CALL['done']) {
787
			phpCAS :: error('this method should only be called before ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() (called at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ')');
788
		}
789
		if (gettype($format) != 'string') {
790
			phpCAS :: error('type mismatched for parameter $format (should be `string\')');
791
		}
792
		if (gettype($path) != 'string') {
793
			phpCAS :: error('type mismatched for parameter $format (should be `string\')');
794
		}
795
		$PHPCAS_CLIENT->setPGTStorageFile($path);
796
		phpCAS :: traceEnd();
797
	}
798
	
799
	/** @} */
800
	// ########################################################################
801
	// ACCESS TO EXTERNAL SERVICES
802
	// ########################################################################
803
	/**
804
	 * @addtogroup publicServices
805
	 * @{
806
	 */
807
	
808
	/**
809
	 * Answer a proxy-authenticated service handler.
810
	 * 
811
	 * @param string $type The service type. One of:
812
	 *			PHPCAS_PROXIED_SERVICE_HTTP_GET
813
	 *			PHPCAS_PROXIED_SERVICE_HTTP_POST
814
	 *			PHPCAS_PROXIED_SERVICE_IMAP
815
	 *			
816
	 *		
817
	 * @return CAS_ProxiedService
818
	 * @throws InvalidArgumentException If the service type is unknown.
819
	 */
820
	public static function getProxiedService ($type) {
821
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
822

  
823
		phpCAS :: traceBegin();
824
		if (!is_object($PHPCAS_CLIENT)) {
825
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
826
		}
827
		if (!$PHPCAS_CLIENT->isProxy()) {
828
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
829
		}
830
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
831
			phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
832
		}
833
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
834
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
835
		}
836
		if (gettype($type) != 'string') {
837
			phpCAS :: error('type mismatched for parameter $type (should be `string\')');
838
		}
839

  
840
		$res = $PHPCAS_CLIENT->getProxiedService($type);
841

  
842
		phpCAS :: traceEnd();
843
		return $res;
844
	}
845
	
846
	/**
847
	 * Initialize a proxied-service handler with the proxy-ticket it should use.
848
	 * 
849
	 * @param CAS_ProxiedService $proxiedService
850
	 * @return void
851
	 * @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
852
	 *		The code of the Exception will be one of: 
853
	 *			PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE 
854
	 *			PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
855
	 *			PHPCAS_SERVICE_PT_FAILURE
856
	 */
857
	public static function initializeProxiedService (CAS_ProxiedService $proxiedService) {
858
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
859

  
860
		if (!is_object($PHPCAS_CLIENT)) {
861
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
862
		}
863
		if (!$PHPCAS_CLIENT->isProxy()) {
864
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
865
		}
866
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
867
			phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
868
		}
869
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
870
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
871
		}
872

  
873
		$PHPCAS_CLIENT->initializeProxiedService($proxiedService);
874
	}
875
	
876
	/**
877
	 * This method is used to access an HTTP[S] service.
878
	 *
879
	 * @param $url the service to access.
880
	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
881
	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
882
	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE.
883
	 * @param $output the output of the service (also used to give an error
884
	 * message on failure).
885
	 *
886
	 * @return TRUE on success, FALSE otherwise (in this later case, $err_code
887
	 * gives the reason why it failed and $output contains an error message).
888
	 */
889
	public static function serviceWeb($url, & $err_code, & $output) {
890
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
891

  
892
		phpCAS :: traceBegin();
893
		if (!is_object($PHPCAS_CLIENT)) {
894
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
895
		}
896
		if (!$PHPCAS_CLIENT->isProxy()) {
897
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
898
		}
899
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
900
			phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
901
		}
902
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
903
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
904
		}
905
		if (gettype($url) != 'string') {
906
			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
907
		}
908

  
909
		$res = $PHPCAS_CLIENT->serviceWeb($url, $err_code, $output);
910

  
911
		phpCAS :: traceEnd($res);
912
		return $res;
913
	}
914

  
915
	/**
916
	 * This method is used to access an IMAP/POP3/NNTP service.
917
	 *
918
	 * @param $url a string giving the URL of the service, including the mailing box
919
	 * for IMAP URLs, as accepted by imap_open().
920
	 * @param $service a string giving for CAS retrieve Proxy ticket
921
	 * @param $flags options given to imap_open().
922
	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
923
	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
924
	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE.
925
	 * @param $err_msg an error message on failure
926
	 * @param $pt the Proxy Ticket (PT) retrieved from the CAS server to access the URL
927
	 * on success, FALSE on error).
928
	 *
929
	 * @return an IMAP stream on success, FALSE otherwise (in this later case, $err_code
930
	 * gives the reason why it failed and $err_msg contains an error message).
931
	 */
932
	public static function serviceMail($url, $service, $flags, & $err_code, & $err_msg, & $pt) {
933
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
934

  
935
		phpCAS :: traceBegin();
936
		if (!is_object($PHPCAS_CLIENT)) {
937
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
938
		}
939
		if (!$PHPCAS_CLIENT->isProxy()) {
940
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
941
		}
942
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
943
			phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
944
		}
945
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
946
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
947
		}
948
		if (gettype($url) != 'string') {
949
			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
950
		}
951

  
952
		if (gettype($flags) != 'integer') {
953
			phpCAS :: error('type mismatched for parameter $flags (should be `integer\')');
954
		}
955

  
956
		$res = $PHPCAS_CLIENT->serviceMail($url, $service, $flags, $err_code, $err_msg, $pt);
957

  
958
		phpCAS :: traceEnd($res);
959
		return $res;
960
	}
961

  
962
	/** @} */
963
	// ########################################################################
964
	//  AUTHENTICATION
965
	// ########################################################################
966
	/**
967
	 * @addtogroup publicAuth
968
	 * @{
969
	 */
970

  
971
	/**
972
	 * Set the times authentication will be cached before really accessing the CAS server in gateway mode:
973
	 * - -1: check only once, and then never again (until you pree login)
974
	 * - 0: always check
975
	 * - n: check every "n" time
976
	 *
977
	 * @param $n an integer.
978
	 */
979
	public static function setCacheTimesForAuthRecheck($n) {
980
		global $PHPCAS_CLIENT;
981
		if (!is_object($PHPCAS_CLIENT)) {
982
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
983
		}
984
		if (gettype($n) != 'integer') {
985
			phpCAS :: error('type mismatched for parameter $header (should be `string\')');
986
		}
987
		$PHPCAS_CLIENT->setCacheTimesForAuthRecheck($n);
988
	}
989
	
990
	/**
991
	 * Set a callback function to be run when a user authenticates.
992
	 *
993
	 * The callback function will be passed a $logoutTicket as its first parameter,
994
	 * followed by any $additionalArgs you pass. The $logoutTicket parameter is an
995
	 * opaque string that can be used to map the session-id to logout request in order
996
	 * to support single-signout in applications that manage their own sessions 
997
	 * (rather than letting phpCAS start the session).
998
	 *
999
	 * phpCAS::forceAuthentication() will always exit and forward client unless
1000
	 * they are already authenticated. To perform an action at the moment the user
1001
	 * logs in (such as registering an account, performing logging, etc), register
1002
	 * a callback function here.
1003
	 * 
1004
	 * @param callback $function
1005
	 * @param optional array $additionalArgs
1006
	 * @return void
1007
	 */
1008
	public static function setPostAuthenticateCallback ($function, array $additionalArgs = array()) {
1009
		global $PHPCAS_CLIENT;
1010
		if (!is_object($PHPCAS_CLIENT)) {
1011
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1012
		}
1013
		
1014
		$PHPCAS_CLIENT->setPostAuthenticateCallback($function, $additionalArgs);
1015
	}
1016
	
1017
	/**
1018
	 * Set a callback function to be run when a single-signout request is received.
1019
	 *
1020
	 * The callback function will be passed a $logoutTicket as its first parameter,
1021
	 * followed by any $additionalArgs you pass. The $logoutTicket parameter is an
1022
	 * opaque string that can be used to map a session-id to the logout request in order
1023
	 * to support single-signout in applications that manage their own sessions 
1024
	 * (rather than letting phpCAS start and destroy the session).
1025
	 * 
1026
	 * @param callback $function
1027
	 * @param optional array $additionalArgs
1028
	 * @return void
1029
	 */
1030
	public static function setSingleSignoutCallback ($function, array $additionalArgs = array()) {
1031
		global $PHPCAS_CLIENT;
1032
		if (!is_object($PHPCAS_CLIENT)) {
1033
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1034
		}
1035
		
1036
		$PHPCAS_CLIENT->setSingleSignoutCallback($function, $additionalArgs);
1037
	}
1038

  
1039
	/**
1040
	 * This method is called to check if the user is already authenticated locally or has a global cas session. A already
1041
	 * existing cas session is determined by a cas gateway call.(cas login call without any interactive prompt)
1042
	 * @return TRUE when the user is authenticated, FALSE when a previous gateway login failed or
1043
	 * the function will not return if the user is redirected to the cas server for a gateway login attempt
1044
	 */
1045
	public static function checkAuthentication() {
1046
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1047

  
1048
		phpCAS :: traceBegin();
1049
		if (!is_object($PHPCAS_CLIENT)) {
1050
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1051
		}
1052

  
1053
		$auth = $PHPCAS_CLIENT->checkAuthentication();
1054

  
1055
		// store where the authentication has been checked and the result
1056
		$dbg = debug_backtrace();
1057
		$PHPCAS_AUTH_CHECK_CALL = array (
1058
			'done' => TRUE,
1059
			'file' => $dbg[0]['file'],
1060
			'line' => $dbg[0]['line'],
1061
			'method' => __CLASS__ . '::' . __FUNCTION__,
1062
			'result' => $auth
1063
		);
1064
		phpCAS :: traceEnd($auth);
1065
		return $auth;
1066
	}
1067

  
1068
	/**
1069
	 * This method is called to force authentication if the user was not already
1070
	 * authenticated. If the user is not authenticated, halt by redirecting to
1071
	 * the CAS server.
1072
	 */
1073
	public static function forceAuthentication() {
1074
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1075

  
1076
		phpCAS :: traceBegin();
1077
		if (!is_object($PHPCAS_CLIENT)) {
1078
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1079
		}
1080

  
1081
		$auth = $PHPCAS_CLIENT->forceAuthentication();
1082

  
1083
		// store where the authentication has been checked and the result
1084
		$dbg = debug_backtrace();
1085
		$PHPCAS_AUTH_CHECK_CALL = array (
1086
			'done' => TRUE,
1087
			'file' => $dbg[0]['file'],
1088
			'line' => $dbg[0]['line'],
1089
			'method' => __CLASS__ . '::' . __FUNCTION__,
1090
			'result' => $auth
1091
		);
1092

  
1093
		if (!$auth) {
1094
			phpCAS :: trace('user is not authenticated, redirecting to the CAS server');
1095
			$PHPCAS_CLIENT->forceAuthentication();
1096
		} else {
1097
			phpCAS :: trace('no need to authenticate (user `' . phpCAS :: getUser() . '\' is already authenticated)');
1098
		}
1099

  
1100
		phpCAS :: traceEnd();
1101
		return $auth;
1102
	}
1103

  
1104
	/**
1105
	 * This method is called to renew the authentication.
1106
	 **/
1107
	public static function renewAuthentication() {
1108
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1109

  
1110
		phpCAS :: traceBegin();
1111
		if (!is_object($PHPCAS_CLIENT)) {
1112
			phpCAS :: error('this method should not be called before' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1113
		}
1114
		$auth = $PHPCAS_CLIENT->renewAuthentication();
1115
		// store where the authentication has been checked and the result
1116
		$dbg = debug_backtrace();
1117
		$PHPCAS_AUTH_CHECK_CALL = array (
1118
			'done' => TRUE,
1119
			'file' => $dbg[0]['file'],
1120
			'line' => $dbg[0]['line'],
1121
			'method' => __CLASS__ . '::' . __FUNCTION__,
1122
			'result' => $auth
1123
		);
1124

  
1125
		//$PHPCAS_CLIENT->renewAuthentication();
1126
		phpCAS :: traceEnd();
1127
	}
1128

  
1129
	/**
1130
	 * This method is called to check if the user is authenticated (previously or by
1131
	 * tickets given in the URL).
1132
	 *
1133
	 * @return TRUE when the user is authenticated.
1134
	 */
1135
	public static function isAuthenticated() {
1136
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1137

  
1138
		phpCAS :: traceBegin();
1139
		if (!is_object($PHPCAS_CLIENT)) {
1140
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1141
		}
1142

  
1143
		// call the isAuthenticated method of the global $PHPCAS_CLIENT object
1144
		$auth = $PHPCAS_CLIENT->isAuthenticated();
1145

  
1146
		// store where the authentication has been checked and the result
1147
		$dbg = debug_backtrace();
1148
		$PHPCAS_AUTH_CHECK_CALL = array (
1149
			'done' => TRUE,
1150
			'file' => $dbg[0]['file'],
1151
			'line' => $dbg[0]['line'],
1152
			'method' => __CLASS__ . '::' . __FUNCTION__,
1153
			'result' => $auth
1154
		);
1155
		phpCAS :: traceEnd($auth);
1156
		return $auth;
1157
	}
1158

  
1159
	/**
1160
	 * Checks whether authenticated based on $_SESSION. Useful to avoid
1161
	 * server calls.
1162
	 * @return true if authenticated, false otherwise.
1163
	 * @since 0.4.22 by Brendan Arnold
1164
	 */
1165
	public static function isSessionAuthenticated() {
1166
		global $PHPCAS_CLIENT;
1167
		if (!is_object($PHPCAS_CLIENT)) {
1168
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1169
		}
1170
		return ($PHPCAS_CLIENT->isSessionAuthenticated());
1171
	}
1172

  
1173
	/**
1174
	 * This method returns the CAS user's login name.
1175
	 * @warning should not be called only after phpCAS::forceAuthentication()
1176
	 * or phpCAS::checkAuthentication().
1177
	 *
1178
	 * @return the login name of the authenticated user
1179
	 */
1180
	public static function getUser() {
1181
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1182
		if (!is_object($PHPCAS_CLIENT)) {
1183
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1184
		}
1185
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
1186
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
1187
		}
1188
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
1189
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
1190
		}
1191
		return $PHPCAS_CLIENT->getUser();
1192
	}
1193

  
1194
	/**
1195
	 * Answer attributes about the authenticated user.
1196
	 *
1197
	 * @warning should not be called only after phpCAS::forceAuthentication()
1198
	 * or phpCAS::checkAuthentication().
1199
	 *
1200
	 * @return array
1201
	 */
1202
	public static function getAttributes() {
1203
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1204
		if (!is_object($PHPCAS_CLIENT)) {
1205
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1206
		}
1207
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
1208
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
1209
		}
1210
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
1211
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
1212
		}
1213
		return $PHPCAS_CLIENT->getAttributes();
1214
	}
1215
	
1216
	/**
1217
	 * Answer true if there are attributes for the authenticated user.
1218
	 *
1219
	 * @warning should not be called only after phpCAS::forceAuthentication()
1220
	 * or phpCAS::checkAuthentication().
1221
	 *
1222
	 * @return boolean
1223
	 */
1224
	public static function hasAttributes() {
1225
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1226
		if (!is_object($PHPCAS_CLIENT)) {
1227
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1228
		}
1229
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
1230
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
1231
		}
1232
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
1233
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
1234
		}
1235
		return $PHPCAS_CLIENT->hasAttributes();
1236
	}
1237
	
1238
	/**
1239
	 * Answer true if an attribute exists for the authenticated user.
1240
	 *
1241
	 * @warning should not be called only after phpCAS::forceAuthentication()
1242
	 * or phpCAS::checkAuthentication().
1243
	 *
1244
	 * @param string $key
1245
	 * @return boolean
1246
	 */
1247
	public static function hasAttribute($key) {
1248
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1249
		if (!is_object($PHPCAS_CLIENT)) {
1250
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1251
		}
1252
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
1253
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
1254
		}
1255
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
1256
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
1257
		}
1258
		return $PHPCAS_CLIENT->hasAttribute($key);
1259
	}
1260
	
1261
	/**
1262
	 * Answer an attribute for the authenticated user.
1263
	 *
1264
	 * @warning should not be called only after phpCAS::forceAuthentication()
1265
	 * or phpCAS::checkAuthentication().
1266
	 *
1267
	 * @param string $key
1268
	 * @return mixed string for a single value or an array if multiple values exist.
1269
	 */
1270
	public static function getAttribute($key) {
1271
		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
1272
		if (!is_object($PHPCAS_CLIENT)) {
1273
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1274
		}
1275
		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
1276
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
1277
		}
1278
		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
1279
			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
1280
		}
1281
		return $PHPCAS_CLIENT->getAttribute($key);
1282
	}
1283
	
1284
	/**
1285
	 * Handle logout requests.
1286
	 */
1287
	public static function handleLogoutRequests($check_client = true, $allowed_clients = false) {
1288
		global $PHPCAS_CLIENT;
1289
		if (!is_object($PHPCAS_CLIENT)) {
1290
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1291
		}
1292
		return ($PHPCAS_CLIENT->handleLogoutRequests($check_client, $allowed_clients));
1293
	}
1294

  
1295
	/**
1296
	 * This method returns the URL to be used to login.
1297
	 * or phpCAS::isAuthenticated().
1298
	 *
1299
	 * @return the login name of the authenticated user
1300
	 */
1301
	public static function getServerLoginURL() {
1302
		global $PHPCAS_CLIENT;
1303
		if (!is_object($PHPCAS_CLIENT)) {
1304
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1305
		}
1306
		return $PHPCAS_CLIENT->getServerLoginURL();
1307
	}
1308

  
1309
	/**
1310
	 * Set the login URL of the CAS server.
1311
	 * @param $url the login URL
1312
	 * @since 0.4.21 by Wyman Chan
1313
	 */
1314
	public static function setServerLoginURL($url = '') {
1315
		global $PHPCAS_CLIENT;
1316
		phpCAS :: traceBegin();
1317
		if (!is_object($PHPCAS_CLIENT)) {
1318
			phpCAS :: error('this method should only be called after
1319
										' . __CLASS__ . '::client()');
1320
		}
1321
		if (gettype($url) != 'string') {
1322
			phpCAS :: error('type mismatched for parameter $url (should be
1323
									`string\')');
1324
		}
1325
		$PHPCAS_CLIENT->setServerLoginURL($url);
1326
		phpCAS :: traceEnd();
1327
	}
1328

  
1329
	/**
1330
	 * Set the serviceValidate URL of the CAS server.
1331
	 * Used only in CAS 1.0 validations
1332
	 * @param $url the serviceValidate URL
1333
	 * @since 1.1.0 by Joachim Fritschi
1334
	 */
1335
	public static function setServerServiceValidateURL($url = '') {
1336
		global $PHPCAS_CLIENT;
1337
		phpCAS :: traceBegin();
1338
		if (!is_object($PHPCAS_CLIENT)) {
1339
			phpCAS :: error('this method should only be called after
1340
										' . __CLASS__ . '::client()');
1341
		}
1342
		if (gettype($url) != 'string') {
1343
			phpCAS :: error('type mismatched for parameter $url (should be
1344
									`string\')');
1345
		}
1346
		$PHPCAS_CLIENT->setServerServiceValidateURL($url);
1347
		phpCAS :: traceEnd();
1348
	}
1349

  
1350
	/**
1351
	 * Set the proxyValidate URL of the CAS server.
1352
	 * Used for all CAS 2.0 validations
1353
	 * @param $url the proxyValidate URL
1354
	 * @since 1.1.0 by Joachim Fritschi
1355
	 */
1356
	public static function setServerProxyValidateURL($url = '') {
1357
		global $PHPCAS_CLIENT;
1358
		phpCAS :: traceBegin();
1359
		if (!is_object($PHPCAS_CLIENT)) {
1360
			phpCAS :: error('this method should only be called after
1361
										' . __CLASS__ . '::client()');
1362
		}
1363
		if (gettype($url) != 'string') {
1364
			phpCAS :: error('type mismatched for parameter $url (should be
1365
									`string\')');
1366
		}
1367
		$PHPCAS_CLIENT->setServerProxyValidateURL($url);
1368
		phpCAS :: traceEnd();
1369
	}
1370

  
1371
	/**
1372
	 * Set the samlValidate URL of the CAS server.
1373
	 * @param $url the samlValidate URL
1374
	 * @since 1.1.0 by Joachim Fritschi
1375
	 */
1376
	public static function setServerSamlValidateURL($url = '') {
1377
		global $PHPCAS_CLIENT;
1378
		phpCAS :: traceBegin();
1379
		if (!is_object($PHPCAS_CLIENT)) {
1380
			phpCAS :: error('this method should only be called after
1381
										' . __CLASS__ . '::client()');
1382
		}
1383
		if (gettype($url) != 'string') {
1384
			phpCAS :: error('type mismatched for parameter $url (should be
1385
									`string\')');
1386
		}
1387
		$PHPCAS_CLIENT->setServerSamlValidateURL($url);
1388
		phpCAS :: traceEnd();
1389
	}
1390

  
1391
	/**
1392
	 * This method returns the URL to be used to login.
1393
	 * or phpCAS::isAuthenticated().
1394
	 *
1395
	 * @return the login name of the authenticated user
1396
	 */
1397
	public static function getServerLogoutURL() {
1398
		global $PHPCAS_CLIENT;
1399
		if (!is_object($PHPCAS_CLIENT)) {
1400
			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
1401
		}
1402
		return $PHPCAS_CLIENT->getServerLogoutURL();
1403
	}
1404

  
1405
	/**
1406
	 * Set the logout URL of the CAS server.
1407
	 * @param $url the logout URL
1408
	 * @since 0.4.21 by Wyman Chan
1409
	 */
1410
	public static function setServerLogoutURL($url = '') {
1411
		global $PHPCAS_CLIENT;
1412
		phpCAS :: traceBegin();
1413
		if (!is_object($PHPCAS_CLIENT)) {
1414
			phpCAS :: error('this method should only be called after
1415
										' . __CLASS__ . '::client()');
1416
		}
1417
		if (gettype($url) != 'string') {
1418
			phpCAS :: error('type mismatched for parameter $url (should be
1419
									`string\')');
1420
		}
1421
		$PHPCAS_CLIENT->setServerLogoutURL($url);
1422
		phpCAS :: traceEnd();
1423
	}
1424

  
1425
	/**
1426
	 * This method is used to logout from CAS.
1427
	 * @params $params an array that contains the optional url and service parameters that will be passed to the CAS server
1428
	 * @public
1429
	 */
1430
	public static function logout($params = "") {
1431
		global $PHPCAS_CLIENT;
1432
		phpCAS :: traceBegin();
1433
		if (!is_object($PHPCAS_CLIENT)) {
1434
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
1435
		}
1436
		$parsedParams = array ();
1437
		if ($params != "") {
1438
			if (is_string($params)) {
1439
				phpCAS :: error('method `phpCAS::logout($url)\' is now deprecated, use `phpCAS::logoutWithUrl($url)\' instead');
1440
			}
1441
			if (!is_array($params)) {
1442
				phpCAS :: error('type mismatched for parameter $params (should be `array\')');
1443
			}
1444
			foreach ($params as $key => $value) {
1445
				if ($key != "service" && $key != "url") {
1446
					phpCAS :: error('only `url\' and `service\' parameters are allowed for method `phpCAS::logout($params)\'');
1447
				}
1448
				$parsedParams[$key] = $value;
1449
			}
1450
		}
1451
		$PHPCAS_CLIENT->logout($parsedParams);
1452
		// never reached
1453
		phpCAS :: traceEnd();
1454
	}
1455

  
1456
	/**
1457
	 * This method is used to logout from CAS. Halts by redirecting to the CAS server.
1458
	 * @param $service a URL that will be transmitted to the CAS server
1459
	 */
1460
	public static function logoutWithRedirectService($service) {
1461
		global $PHPCAS_CLIENT;
1462
		phpCAS :: traceBegin();
1463
		if (!is_object($PHPCAS_CLIENT)) {
1464
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
1465
		}
1466
		if (!is_string($service)) {
1467
			phpCAS :: error('type mismatched for parameter $service (should be `string\')');
1468
		}
1469
		$PHPCAS_CLIENT->logout(array (
1470
			"service" => $service
1471
		));
1472
		// never reached
1473
		phpCAS :: traceEnd();
1474
	}
1475

  
1476
	/**
1477
	 * This method is used to logout from CAS. Halts by redirecting to the CAS server.
1478
	 * @param $url a URL that will be transmitted to the CAS server
1479
	 * @deprecated The url parameter has been removed from the CAS server as of version 3.3.5.1
1480
	 */
1481
	public static function logoutWithUrl($url) {
1482
		trigger_error('Function deprecated for cas servers >= 3.3.5.1', E_USER_DEPRECATED);
1483
		global $PHPCAS_CLIENT;
1484
		phpCAS :: traceBegin();
1485
		if (!is_object($PHPCAS_CLIENT)) {
1486
			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
1487
		}
1488
		if (!is_string($url)) {
1489
			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.

Formats disponibles : Unified diff