jmontoya 10 роки тому
батько
коміт
5954036365
100 змінених файлів з 0 додано та 15852 видалено
  1. 0 39
      config/routing.yml
  2. 0 13
      custompages/README
  3. 0 106
      custompages/first_login.php
  4. BIN
      custompages/images/footer.png
  5. BIN
      custompages/images/header.png
  6. BIN
      custompages/images/login-form-submit-bg.jpg
  7. BIN
      custompages/images/page-background.png
  8. 0 16
      custompages/index-logged.php
  9. 0 109
      custompages/index-unlogged.php
  10. 0 80
      custompages/language.inc.php
  11. 0 56
      custompages/language.php
  12. 0 64
      custompages/loggedout.php
  13. 0 74
      custompages/lostpassword.php
  14. 0 41
      custompages/registration-feedback.php
  15. 0 119
      custompages/registration.php
  16. 0 218
      custompages/style-ie6.css
  17. 0 198
      custompages/style.css
  18. 0 5
      custompages/url-images/README
  19. 0 2
      inc/global.inc.php
  20. 0 172
      main/auth/cas/authcas.php
  21. 0 21
      main/auth/cas/cas_var.inc.php
  22. 0 1610
      main/auth/cas/lib/CAS.php
  23. 0 214
      main/auth/cas/lib/CAS/PGTStorage/pgt-db.php
  24. 0 276
      main/auth/cas/lib/CAS/PGTStorage/pgt-file.php
  25. 0 215
      main/auth/cas/lib/CAS/PGTStorage/pgt-main.php
  26. 0 2700
      main/auth/cas/lib/CAS/client.php
  27. 0 499
      main/auth/cas/lib/CAS/domxml-php4-to-php5.php
  28. 0 27
      main/auth/cas/lib/CAS/languages/catalan.php
  29. 0 27
      main/auth/cas/lib/CAS/languages/english.php
  30. 0 28
      main/auth/cas/lib/CAS/languages/french.php
  31. 0 27
      main/auth/cas/lib/CAS/languages/german.php
  32. 0 27
      main/auth/cas/lib/CAS/languages/greek.php
  33. 0 27
      main/auth/cas/lib/CAS/languages/japanese.php
  34. 0 24
      main/auth/cas/lib/CAS/languages/languages.php
  35. 0 27
      main/auth/cas/lib/CAS/languages/spanish.php
  36. 0 45
      main/auth/cas/logincas.php
  37. 0 12
      main/auth/cas/logout.php
  38. 0 32
      main/auth/conditional_login/complete_phone_number.php
  39. 0 64
      main/auth/conditional_login/conditional_login.php
  40. 0 1269
      main/auth/external_login/facebook-php-sdk/src/base_facebook.php
  41. 0 93
      main/auth/external_login/facebook-php-sdk/src/facebook.php
  42. 0 121
      main/auth/external_login/facebook-php-sdk/src/fb_ca_chain_bundle.crt
  43. 0 106
      main/auth/external_login/facebook.inc.php
  44. 0 35
      main/auth/external_login/facebook.init.php
  45. 0 179
      main/auth/external_login/functions.inc.php
  46. 0 321
      main/auth/external_login/ldap.inc.php
  47. 0 22
      main/auth/external_login/ldap_import_all_users.php
  48. 0 77
      main/auth/external_login/login.ldap.php
  49. 0 69
      main/auth/external_login/newUser.ldap.php
  50. 0 59
      main/auth/external_login/newUser.php
  51. 0 43
      main/auth/external_login/updateUser.php
  52. 0 8
      main/auth/key/index.php
  53. 0 261
      main/auth/key/key_auth.class.php
  54. 0 642
      main/auth/ldap/authldap.php
  55. 0 6
      main/auth/ldap/index.html
  56. 0 46
      main/auth/ldap/ldap_var.inc.php
  57. 0 45
      main/auth/ldap/login.php
  58. 0 40
      main/auth/ldap/newUser.php
  59. 0 8
      main/auth/ldap/syncro_users.php
  60. 0 454
      main/auth/openid/login.php
  61. 0 404
      main/auth/openid/openid.lib.php
  62. 0 14
      main/auth/openid/whatis.php
  63. 0 85
      main/auth/openid/xrds.lib.php
  64. 0 10
      main/auth/shibboleth/_readme.txt
  65. 0 156
      main/auth/shibboleth/app/controller/shibboleth_controller.class.php
  66. 0 44
      main/auth/shibboleth/app/model/admin.class.php
  67. 0 134
      main/auth/shibboleth/app/model/scaffold/admin.class.php
  68. 0 188
      main/auth/shibboleth/app/model/scaffold/user.class.php
  69. 0 197
      main/auth/shibboleth/app/model/shibboleth_store.class.php
  70. 0 33
      main/auth/shibboleth/app/model/shibboleth_user.class.php
  71. 0 92
      main/auth/shibboleth/app/model/user.class.php
  72. 0 265
      main/auth/shibboleth/app/shibboleth.class.php
  73. 0 20
      main/auth/shibboleth/app/view/admin_login.php
  74. 0 20
      main/auth/shibboleth/app/view/request.php
  75. 0 60
      main/auth/shibboleth/app/view/shibboleth_display.class.php
  76. 0 51
      main/auth/shibboleth/app/view/shibboleth_email_form.class.php
  77. 0 97
      main/auth/shibboleth/app/view/shibboleth_status_request_form.class.php
  78. 0 16
      main/auth/shibboleth/config-dist.php
  79. 0 69
      main/auth/shibboleth/config/aai.class.php
  80. 0 85
      main/auth/shibboleth/db/shibboleth_upgrade.class.php
  81. 0 8
      main/auth/shibboleth/index.php
  82. 0 25
      main/auth/shibboleth/init.php
  83. 0 14
      main/auth/shibboleth/lib/model.class.php
  84. 0 64
      main/auth/shibboleth/lib/scaffolder/scaffolder.class.php
  85. 0 146
      main/auth/shibboleth/lib/scaffolder/template/default.php
  86. 0 146
      main/auth/shibboleth/lib/scaffolder/template/model.php
  87. 0 39
      main/auth/shibboleth/lib/scaffolder/template/public.php
  88. 0 61
      main/auth/shibboleth/lib/shibboleth_config.class.php
  89. 0 101
      main/auth/shibboleth/lib/shibboleth_session.class.php
  90. 0 354
      main/auth/shibboleth/lib/store.class.php
  91. 0 35
      main/auth/shibboleth/login.php
  92. 0 36
      main/auth/shibboleth/script/scaffold.php
  93. 0 217
      main/auth/shibboleth/test/shibboleth_test.class.php
  94. 0 133
      main/auth/shibboleth/test/shibboleth_test_helper.class.php
  95. 0 32
      main/auth/shibboleth/test/test.php
  96. 0 20
      main/auth/shibboleth/test/test_no_email.php
  97. 0 234
      main/auth/sso/sso.class.php
  98. 0 100
      main/auth/sso/sso_server_test.php
  99. 0 578
      main/exercice/export/qti/qti_classes.php
  100. 0 351
      main/exercice/export/qti/qti_export.php

+ 0 - 39
config/routing.yml

@@ -1,39 +0,0 @@
-secured_login_check:
-    pattern:   /secured/login_check
-
-secured_logout:
-    pattern:   /secured/logout
-
-logout:
-    pattern:   /secured/logout
-
-home:
-    path:      /
-    defaults:  { _controller: index.controller:indexAction, culture: en }
-
-index:
-    path:      /
-    defaults:  { _controller: index.controller:indexAction, culture: en }
-
-root:
-    path:      /
-    defaults:  { _controller: index.controller:indexAction, culture: en }
-
-homepage:
-    path:      /
-    defaults:  { _controller: index.controller:indexAction, culture: en }
-
-userportal:
-    path:      /
-    defaults:  { _controller: index.controller:userportalAction, culture: en }
-
-example:
-    resource: "src/ChamiloLMS/Resources/config/route_example.yml"
-    prefix:   /example-route
-
-javascript:
-    path:      /ChamiloLMS/js
-
-css:
-    path:      /ChamiloLMS/css
-

+ 0 - 13
custompages/README

@@ -1,13 +0,0 @@
-CustomPages looks for alternatives in this directory, and displays them if present. The user-provided custom pages must exactly be named as such :
-
-- index-logged.php for the general landing page before login
-- index-unlogged.php for the general landing page when already logged-in
-- registration.php for the registration form
-- registration-feedback.php for the registration success feedback
-- lostpassword.php for the password recovery form
-- lostpassword-feedback.php for the password recovery feedback page
-
-Important note :
-Enable the use_custom_pages setting
-
-If you pull this feature from a repo, not through an upgrade or install process, you have to exectute the following SQL statements in the main database or this option won't appear in the admin interface :

+ 0 - 106
custompages/first_login.php

@@ -1,106 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * Quick page to react to first login cases
- * @package chamilo.custompages
- */
-/**
- * Initialization
- */
-require_once 'language.php';
-require_once dirname(__FILE__).'/../main/inc/global.inc.php';
-
-/**
- * Security checks
- */
-if (! isset($_SESSION['conditional_login']['uid']))
-  die("Not Authorised");
-
-if (isset($_POST['password'])) {
-  $u = UserManager::get_user_info_by_id($_SESSION['conditional_login']['uid']);
-  if ($_POST['password'] != $_POST['password2']) {
-    header('Location: '. api_get_self().'?invalid=2');
-    exit();
-  }
-  if (empty($_POST['password'])){ //|| !api_check_password($password)) { //Pass must be at least 5 char long with 2 digits and 3 letters
-    header('Location: '. api_get_self().'?invalid=1');
-    exit();
-  }
-  $password = $_POST['password'];
-  $updated = UserManager::update_user($u['user_id'], $u['firstname'], $u['lastname'], $u['username'], $password, $u['auth_source'], $u['email'], $u['status'], $u['official_code'], $u['phone'], $u['picture_uri'], $u['expiration_date'], $u['active'], $u['creator_id'], $u['hr_dept_id'], null, $u['language'],'');
-
-  if ($updated) {
-    UserManager::update_extra_field_value($u['user_id'], 'already_logged_in', 'true');
-    ConditionalLogin::login();
-  }
-}
-if ($_GET['invalid'] == 1) {
-  $error_message = get_lang('CurrentPasswordEmptyOrIncorrect');
-}
-if ($_GET['invalid'] == 2) {
-  $error_message = get_lang('PassTwo');
-}
-/**
- * HTML output
- */
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
-<head>
-	<title>Custompage - login</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-	<!--[if !IE 6]><!-->
-	<link rel="stylesheet" type="text/css" href="/custompages/style.css" />
-	<!--<![endif]-->
-	<!--[if IE 6]>
-	<link rel="stylesheet" type="text/css" href="/custompages/style-ie6.css" />
-	<![endif]-->
-
-	<script type="text/javascript" src="/main/inc/lib/javascript/jquery.min.js"></script>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			if (top.location != location)
-				top.location.href = document.location.href ;
-
-			// Handler pour la touche retour
-			$('input').keyup(function(e) {
-				if (e.keyCode == 13) {
-					$('#changepassword-form').submit();
-				}
-			});
-		});
-	</script>
-</head>
-<body>
-	<div id="backgroundimage">
-		<img src="/custompages/images/page-background.png" class="backgroundimage" />
-	</div>
-	<div id="wrapper">
-		<div id="header">
-			<img src="/custompages/images/header.png" alt="Logo" />
-		</div> <!-- #header -->
-    <h2> <?php echo custompages_get_lang('FirstLogin');?> </h2>
-
-		<div id="changepassword-form-box" class="form-box">
-      <div class="info"> <?php echo custompages_get_lang('FirstLoginChangePassword');?> </div>
-		<?php if (isset($error_message)) {
-			echo '<div id="changepassword-form-error" class="form-error">'.$error_message.'</div>';
-		}?>
-			<form id="changepassword-form" class="form" method="post">
-				<div>
-          <label for="password">*<?php echo custompages_get_lang('langPass');?></label>
-					<input name="password" type="password" /><br />
-          <label for="password2">*<?php echo custompages_get_lang('langPass');?></label>
-					<input name="password2" type="password" /><br />
-				</div>
-			</form>
-			<div id="changepassword-form-submit" class="form-submit" onclick="document.forms['changepassword-form'].submit();">
-      <span><?php echo custompages_get_lang('LoginEnter');?></span>
-			</div> <!-- #form-submit -->
-		</div> <!-- #form -->
-		<div id="footer">
-			<img src="/custompages/images/footer.png" />
-		</div> <!-- #footer -->
-	</div> <!-- #wrapper -->
-</body>
-</html>

BIN
custompages/images/footer.png


BIN
custompages/images/header.png


BIN
custompages/images/login-form-submit-bg.jpg


BIN
custompages/images/page-background.png


+ 0 - 16
custompages/index-logged.php

@@ -1,16 +0,0 @@
-<?php 
-/* For licensing terms, see /license.txt */
-/**
- * Redirect to normal Chamilo
- * @package chamilo.custompages
- */
-/**
- * Initialization
- */
-require_once(dirname(__FILE__).'/../main/inc/global.inc.php');
-
-$www = api_get_path('WEB_PATH');
-/**
- * Redirect
- */
-header("Location: $www/user_portal.php");

+ 0 - 109
custompages/index-unlogged.php

@@ -1,109 +0,0 @@
-<?php 
-/* For licensing terms, see /license.txt */
-/**
- * Redirect script
- * @package chamilo.custompages
- */
-/**
- * Initialization
- */
-//require_once('main/inc/global.inc.php'); 
-require_once('language.php');
-/**
- * Homemade micro-controller
- */
-if (isset($_GET['loginFailed'])){
-  if (isset($_GET['error'])) {
-    switch ($_GET['error']) {
-    case 'account_expired':
-      $error_message = custompages_get_lang('AccountExpired');
-      break;
-    case 'account_inactive':
-      $error_message = custompages_get_lang('AccountInactive');
-      break;
-    case 'user_password_incorrect':
-      $error_message = custompages_get_lang('InvalidId');
-      break;
-    case 'access_url_inactive':
-      $error_message = custompages_get_lang('AccountURLInactive');
-      break;
-    default : 
-      $error_message = custompages_get_lang('InvalidId');
-    }
-  } else { 
-    $error_message = get_lang('InvalidId');
-  }
-}
-
-    $rootWeb = api_get_path('WEB_PATH');
-/**
- * HTML output
- */
-?>
-<html>
-<head>
-	<title>Custompage - login</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-	<!--[if !IE 6]><!-->
-	<link rel="stylesheet" type="text/css" href="<?php echo $rootWeb ?>custompages/style.css" />
-	<!--<![endif]-->
-	<!--[if IE 6]>
-	<link rel="stylesheet" type="text/css" href="/custompages/style-ie6.css" />
-	<![endif]-->
-
-	<script type="text/javascript" src="<?php echo $rootWeb ?>main/inc/lib/javascript/jquery.min.js"></script>
-        
-	<script type="text/javascript">
-		$(document).ready(function() {
-			if (top.location != location) 
-				top.location.href = document.location.href ;
-
-			// Handler pour la touche retour
-			$('input').keyup(function(e) { 
-				if (e.keyCode == 13) {
-					$('#login-form').submit();
-				}
-			});
-		});
-	</script>
-</head>
-<body>
-	<div id="backgroundimage">
-		<img src="<?php echo api_get_path(WEB_PATH)?>/custompages/images/page-background.png" class="backgroundimage" />
-	</div>
-	<div id="wrapper">
-		<div id="header">
-			<img src="<?php echo api_get_path(WEB_PATH)?>/custompages/images/header.png" alt="Logo" />
-		</div> <!-- #header -->
-		<div id="login-form-box" class="form-box">
-      <div id="login-form-info" class="form-info">
-        <?php if (isset($content['info']) && !empty($content['info'] )) {
-          echo $content['info'];
-        }?>
-      </div>
-		<?php if (isset($error_message)) {
-			echo '<div id="login-form-info" class="form-error">'.$error_message.'</div>';
-		}?> 
-			<form id="login-form" class="form" action="<?php echo api_get_path(WEB_PATH)?>index.php" method="post">
-				<div>
-        <label for="login">*<?php echo custompages_get_lang('User');?></label>
-					<input name="login" type="text" /><br />
-          <label for="password">*<?php echo custompages_get_lang('langPass');?></label>
-					<input name="password" type="password" /><br />
-				</div>
-			</form>
-			<div id="login-form-submit" class="form-submit" onclick="document.forms['login-form'].submit();">
-      <span><?php echo custompages_get_lang('LoginEnter');?></span>
-			</div> <!-- #form-submit -->
-			<div id="links">
-      <a href="<?php echo api_get_path(WEB_PATH)?>main/auth/inscription.php"><?php echo custompages_get_lang('langReg')?></a><br />
-      <a href="<?php echo api_get_path(WEB_PATH)?>main/auth/lostPassword.php"><?php echo custompages_get_lang('langLostPassword')?></a>
-			</div>
-		</div> <!-- #form -->
-		<div id="footer">
-			<img src="<?php echo api_get_path(WEB_PATH)?>/custompages/images/footer.png" />
-		</div> <!-- #footer -->
-	</div> <!-- #wrapper -->
-        
-</body>
-</html>

+ 0 - 80
custompages/language.inc.php

@@ -1,80 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * CustomPages : Browser language detection
- * Include this file in your custom page if you want to set the language variable of the Chamilo session to the best pick according to the visitor's browser's options.
- * 2011, Jean-Karim Bockstael, CBlue <jeankarim@cblue.be>
- * This requires the Chamilo system to be initialized
- * (note that it's easier to do the following include in the parent page)
- * @package chamilo.custompages
- */
-/**
- * Returns the best match between available languages and visitor preferences
- * @return string the best match as 2-chars code, null when none match
-*/
-function get_preferred_language($available_langs) {
-    // Parsing the Accept-languages HTTP header
-    $langs = array();
-    foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $httplang) {
-        $rawlang = explode(';q=', $httplang);
-        if (strpos($rawlang[0], '-') !== FALSE) {
-            // We ignore the locale part, as in en-GB vs en-US
-            $rawlang[0] = substr($rawlang[0], 0, strpos($rawlang[0], '-'));
-        }
-        if (count($rawlang) == 1) {
-            $rawlang[1] = 1.0; // The absence of weighting means a weight of 1 (max)
-        }
-        $langs[$rawlang[1]][] = $rawlang[0];
-    }
-    krsort($langs, SORT_NUMERIC);
-    // Choosing the best match
-    foreach($langs as $weight => $codes) {
-		foreach ($codes as $code) {
-        	if (in_array($code, $available_langs)) {
-            	return $code;
-        	}
-		}
-    }
-    // No match
-    return null;
-}
-
-/**
- * Wrapper function for the get_lang function
- * use this if you want to avoid translation caching issues
- */
-function cp_get_lang($variable) {
-	return get_lang($variable, null, $_SESSION['user_language_choice']);
-}
-/**
- * Code
- */
-// Note that Chamilo languages are expressed as full english names, not 2-characters codes
-// e.g. 'english' instead of 'en', 'french' instead of 'fr', ...
-// We need a matching array. Note the value for the null key, which is the default language.
-// Also note that this is an example matchin array, not all languages are present.
-$chamilo_langs = array(null => 'english', 'en' => 'english', 'fr' => 'french', 'es' => 'spanish');
-
-// Which of these can we actually pick from ?
-$available_langs = array('en','fr');
-
-// Which language files will we need ?
-$language_file = array('courses', 'index', 'registration', 'admin','userInfo');
-
-// Let's find out which language to serve to this particular browser
-$lang_match = $chamilo_langs[get_preferred_language($available_langs)];
-
-// Chamilo overrides this parameters at some places, e.g. in the logout link
-if (isset($_REQUEST['language']) && !empty($_REQUEST['language']) && in_array($_REQUEST['language'], $chamilo_langs)) {
-	$lang_match = $_REQUEST['language'];
-}
-
-// Maybe a language had already been selected, we should honor this
-if (isset($_SESSION['user_language_choice']) && in_array($_SESSION['user_language_choice'], $chamilo_langs)) {
-	$lang_match = $_SESSION['user_language_choice'];
-}
-
-// We need to set the relevant session variables to the best match, to use Chamilo's i18n lib.
-$_user['language'] = $lang_match;
-$_SESSION['user_language_choice'] = $lang_match;
-?>

+ 0 - 56
custompages/language.php

@@ -1,56 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * Definition of language-related functions for cases where th user isn't 
- * logged in yet
- * @package chamilo.custompages
- */
-/**
- * Get the preferred language base on the browser headers
- */
-function get_preferred_language($available_langs) {
-	$langs = array();
-	foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $httplang) {
-		$rawlang = explode(';q=', $httplang);
-		if (strpos($rawlang[0], '-') !== FALSE) {
-			$rawlang[0] = substr($rawlang[0], 0, strpos($rawlang[0], '-'));
-		}
-		if (count($rawlang) == 1) {
-			$rawlang[1] = 1.0;
-		}
-		$langs[$rawlang[1]] = $rawlang[0];
-	}
-	krsort($langs, SORT_NUMERIC);
-	foreach($langs as $weight => $code) {
-		if (in_array($code, $available_langs)) {
-			return $code;
-		}
-	}
-	return null;
-}
-/**
- * Get a language variable in a specific language
- */
-function custompages_get_lang($variable) {
-	return get_lang($variable, null, $_SESSION['user_language_choice']);
-}
-
-$language_file = array('courses', 'index', 'registration', 'admin','userInfo');
-$available_langs = array('en','fr');
-$chamilo_langs = array(null => 'english', 'en' => 'english', 'fr' => 'french', 'nl' => 'dutch', 'de' => 'german', 'es' => 'spanish');
-$lang_match = $chamilo_langs[get_preferred_language($available_langs)];
-// recover previous value ... 
-if (isset($_SESSION['user_language_choice']))
-	$lang_match = $_SESSION['user_language_choice'];
-
-// Chamilo parameter, on logout
-if (isset($_REQUEST['language']) && !empty($_REQUEST['language']) && in_array($_REQUEST['language'], $chamilo_langs)) {
-	$lang_match = $_REQUEST['language'];
-}
-// Incoming link parameter
-if (isset($_REQUEST['lang']) && !empty($_REQUEST['lang']) && in_array($_REQUEST['lang'], $available_langs)) {
-	$lang_match = $chamilo_langs[$_REQUEST['lang']];
-}
-$_user['language'] = $lang_match;
-$_SESSION['user_language_choice'] = $lang_match;
-?>

+ 0 - 64
custompages/loggedout.php

@@ -1,64 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * Displayed after the user has been logged out.
- * @package chamilo.custompages
- */
-/**
- * Init
- */
-$called_direcly = !function_exists('api_get_path');
-if ($called_direcly)
-{
-    return '';
-}
-
-require_once('language.php');
-$www = api_get_path('WEB_PATH');
-
-/**
- * HTML output
- */
-?>
-<!DOCTYPE html>
-<html>
-    <head>
-        <title>Custompage - logged out</title>
-        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-        <!--[if !IE 6]><!-->
-        <link rel="stylesheet" type="text/css" href="<?php echo $www ?>custompages/style.css" />
-        <!--<![endif]-->
-        <!--[if IE 6]>
-        <link rel="stylesheet" type="text/css" href="/custompages/style-ie6.css" />
-        <![endif]-->
-
-        <script type="text/javascript" src="<?php echo $www ?>main/inc/lib/javascript/jquery.min.js"></script>
-
-        <script type="text/javascript">
-            $(document).ready(function() {
-                if (top.location != location) 
-                    top.location.href = document.location.href ;
-            });
-        </script>
-    </head>
-    <body>
-        <div id="backgroundimage">
-            <img src="<?php echo $www ?>/custompages/images/page-background.png" class="backgroundimage" alt="background"/>
-        </div>
-        <div id="wrapper">
-            <div id="header">
-                <img src="<?php echo $www ?>/custompages/images/header.png" alt="Logo" />
-            </div>
-
-            <div id="login-form-box" class="form-box">
-                <div id="login-form-info" class="form-info">
-                    You have been logged out.
-                </div>
-            </div>
-            <a href="<?php echo $www . 'user_portal.php'; ?>">Go to your portal</a>
-            <div id="footer">
-                <img src="<?php echo $www ?>/custompages/images/footer.png" alt="footer"/>
-            </div> 
-        </div> 
-    </body>
-</html>

+ 0 - 74
custompages/lostpassword.php

@@ -1,74 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * Quick form to ask for password reminder.
- * @package chamilo.custompages
- */ 
-/**
- * Initialization
- */
-require_once('../../main/inc/global.inc.php'); 
-require_once('language.php');
-/**
- * HTML
- */
-?>
-<html>
-<head>
-	<title>Password recovery</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-	<!--[if !IE 6]><!-->
-	<link rel="stylesheet" type="text/css" href="../../custompages/style.css" />
-	<!--<![endif]-->
-	<!--[if IE 6]>
-	<link rel="stylesheet" type="text/css" href="../../custompages/style-ie6.css" />
-	<![endif]-->
-	<script type="text/javascript" src="../../main/inc/lib/javascript/jquery.min.js"></script>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			// Handler pour la touche retour
-			$('input').keyup(function(e) { 
-				if (e.keyCode == 13) {
-					$('#lostpassword-form').submit();
-				}
-			});
-		});
-	</script>
-</head>
-<body>
-	<div id="backgroundimage">
-		<img src="/custompages/images/page-background.png" class="backgroundimage" />
-	</div>
-	<div id="wrapper">
-		<div id="header">
-			<img src="../../custompages/images/header.png" alt="Ambassador logo" />
-		</div> <!-- #header -->
-      <div id="registration-form-info" class="form-info">
-        <?php if(isset($content['error']) && !empty($content['error'])){
-          echo $content['info'];
-        } else {
-          echo custompages_get_lang('lang_enter_email_and_well_send_you_password');
-        }?>
-      </div>
-		<div id="lostpassword-form-box" class="form-box">
-		<?php if (isset($content['error']) && !empty($content['error'])) {
-			echo '<div id="registration-form-error" class="form-error"><ul>'.$content['error'].'</ul></div>';
-		}?>
-			<form id="lostpassword-form" class="form" action="lostPassword.php" method="post">
-				<div>
-        <label for="user">*<?php echo custompages_get_lang('UserName');?></label>
-					<input name="user" type="text" /><br />
-          <label for="email">*<?php echo custompages_get_lang('Email');?></label>
-					<input name="email" type="text" /><br />
-				</div>
-			</form>
-			<div id="lostpassword-form-submit" class="form-submit" onclick="document.forms['lostpassword-form'].submit();">
-      <span><?php echo custompages_get_lang('langSend'); ?> </span>
-			</div> <!-- #form-submit -->
-		</div> <!-- #form -->
-		<div id="footer">
-			<img src="../../custompages/images/footer.png" />
-		</div> <!-- #footer -->
-	</div> <!-- #wrapper -->
-</body>
-</html>

+ 0 - 41
custompages/registration-feedback.php

@@ -1,41 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * Quick display for user registration
- * @package chamilo.custompages
- */ 
-/**
- * HTML output
- */
-?>
-<html>
-<head>
-	<title>Registration</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-	<!--[if !IE 6]><!-->
-	<link rel="stylesheet" type="text/css" href="../../custompages/style.css" />
-	<!--<![endif]-->
-	<!--[if IE 6]>
-	<link rel="stylesheet" type="text/css" href="../../custompages/style-ie6.css" />
-	<![endif]-->
-	<script type="text/javascript" src="../../main/inc/lib/javascript/jquery.min.js"></script>
-</head>
-<body>
-	<div id="backgroundimage">
-		<img src="/custompages/images/page-background.png" class="backgroundimage" />
-	</div>
-	<div id="wrapper">
-		<div id="header">
-			<img src="../../custompages/images/header.png" alt="Ambassador logo" />
-		</div> <!-- #header -->
-		<div id="registration-feedback-box">
-      <?php
-      echo $content['info'];
-      ?>
-		</div> <!-- #feedback -->
-		<div id="footer">
-			<img src="../../custompages/images/footer.png" />
-		</div> <!-- #footer -->
-	</div> <!-- #wrapper -->
-</body>
-</html>

+ 0 - 119
custompages/registration.php

@@ -1,119 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * This script allows for specific registration rules (see CustomPages feature of Chamilo)
- * Please contact CBlue regarding any licences issues.
- * Author: noel@cblue.be
- * Copyright: CBlue SPRL, 20XX (GNU/GPLv3)
- * @package chamilo.custompages
- **/
-/**
- * Initialization
- */
-require_once('language.php');
-require_once('../inc/global.inc.php');
-
-/**
- * Removes some unwanted elementend of the form object
- */
-$content['form']->removeElement('extra_mail_notify_invitation');
-$content['form']->removeElement('extra_mail_notify_message');
-$content['form']->removeElement('extra_mail_notify_group_message');
-$content['form']->removeElement('official_code');
-$content['form']->removeElement('phone');
-$content['form']->removeElement('submit');
-$content['form']->removeElement('status');
-$content['form']->removeElement('status');
-/**
- * Code to change the way QuickForm render html
- */
-/*
-$renderer = & $content['form']->defaultRenderer();
-$form_template = <<<EOT
-
-<form {attributes}>
-{content}
-  <div class="clear">
-    &nbsp;
-  </div>
-  <p><a href="#" class="btn" onclick="$('#registration-form').submit()"><span>S'inscrire</span></a></p>
-</form>
-
-EOT;
-$renderer->setFormTemplate($form_template);
-
-$element_template = <<<EOT
-  <div class="field decalle">
-    <label>
-      <!-- BEGIN required --><span class="form_required">*</span> <!-- END required -->{label}
-    </label>
-    <div class="formw">
-      <!-- BEGIN error --><span class="form_error">{error}</span><br /><!-- END error --> {element}
-    </div>
-  </div>
-
-EOT;
-$element_template_wimage = <<<EOT
-  <div class="field decalle display">
-    <label>
-      <!-- BEGIN required --><span class="form_required">*</span> <!-- END required -->{label}
-    </label>
-    <div class="formw">
-      <!-- BEGIN error --><span class="form_error">{error}</span><br /><!-- END error --> {element}
-      <img src="/custompages/images/perso.jpg" alt="" />
-    </div>
-  </div>
-
-EOT;
-$renderer->setElementTemplate($element_template_wimage,'pass1');
-$renderer->setElementTemplate($element_template);
-
-$header_template = <<<EOT
-  <div class="row">
-    <div class="form_header">{header}</div>
-  </div>
-
-EOT;
-
- */
-?>
-<html>
-<head>
-	<title>Registration</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-	<!--[if !IE 6]><!-->
-	<link rel="stylesheet" type="text/css" href="../../custompages/style.css" />
-	<!--<![endif]-->
-	<!--[if IE 6]>
-	<link rel="stylesheet" type="text/css" href="../../custompages/style-ie6.css" />
-	<![endif]-->
-	<script type="text/javascript" src="../../main/inc/lib/javascript/jquery.min.js"></script>
-</head>
-<body>
-	<div id="backgroundimage">
-		<img src="/custompages/images/page-background.png" class="backgroundimage" />
-	</div>
-	<div id="wrapper">
-		<div id="header">
-			<img src="../../custompages/images/header.png" alt="Ambassador logo" />
-		</div> <!-- #header -->
-		<div id="registration-form-box" class="form-box">
-		<?php if (isset($form_error) && !empty($form_error)) {
-			echo '<div id="registration-form-error" class="form-error"><ul>'.$form_error.'</ul></div>';
-		}?>
-      <?php
-      $content['form']->display();
-      ?>
-			<div id="registration-form-submit" class="form-submit" onclick="document.forms['registration'].submit();">
-				<span><?php echo custompages_get_lang('Subscribe');?></span>
-			</div> <!-- #form-submit -->
-			<div id="links">
-      <!--<a href="mailto: support@cblue.be"><?php echo custompages_get_lang('NeedContactAdmin')?></a><br />-->
-			</div>
-		</div> <!-- #form -->
-		<div id="footer">
-			<img src="../../custompages/images/footer.png" />
-		</div> <!-- #footer -->
-	</div> <!-- #wrapper -->
-</body>
-</html>

+ 0 - 218
custompages/style-ie6.css

@@ -1,218 +0,0 @@
-/* Color easy change */
-body, .form, #links a, .form-info {
-  color: #DF002A;
-}
-.form-submit, input, select {
-  background-color: #DF002A;
-}
-.form-error {
-	color: red;
-	font-size: 9pt;
-}
-.form-submit {
-	margin: 0;
-	padding: 0;
-	width: 310px;
-	height: 27px;
-	background-color: #DF002A;
-	/*background-image: url(/custompages/images/login-form-submit-bg.jpg);*/
-	color: white;
-	cursor: pointer;
-	cursor: hand;
-}
-/* end easy change */
-/* Registration form */
-#registration-form-box {
-	width: 400px;
-	margin-left: auto;
-	margin-right: auto;
-	margin-top: 50px;
-	border: solid 1px #CCCCCC;
-	text-align: left;
-	background-color: white;
-}
-#registration-form-box .form-submit{
-  width: 400px;
-}
-div.row {
-  clear: both;
-  padding-top: 5px;
-}
-div.row div.form_header {
-  white-space: nowrap;
-  padding: 2px;
-  background-color: #f0f0f0;
-  border: 1px solid #bbb;
-}
-div.row div.label {
-  float: left;
-  width: 53%;
-  text-align: right;
-  padding-right:1%
-}
-div.row div.formw {
-  width: 46%;
-  float:left;
-}
-[dir=ltr] div.row div.label, [dir=rtl] div.row div.formw {
-  float: left;
-  text-align: right;
-}
-[dir=rtl] div.row div.label, [dir=ltr] div.row div.formw {
-  float: right;
-  text-align: left;
-}
-span.form_required {
-  color: #f00;
-}
-span.form_error {
-  color: #f00;
-  font-size: x-small;
-  margin: 2px;
-}
-html, body {
-	margin: 0;
-	padding: 0;
-}
-
-body {
-	font-family: "Arial Black",sans-serif;
-	font-size: 10pt;
-	width: 100%;
-	text-align: center;
-	color: #1F3660;
-	/*background-image: url(images/page-background.png);
-	background-repeat: no-repeat;
-	background-size: 100%;
-	*/
-}
-
-#backgroundimage {
-	background-attachment:fixed;
-	width: 100%;
-	height: 100%;
-	position: absolute;
-	left: 0;
-	top: 30px;
-	z-index:-1;
-}
-
-.backgroundimage {
-	width: 100%;
-	height: auto;
-}
-
-#wrapper {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	z-index: 1;
-}
-
-#header {
-	width: 520px;
-	margin-left: auto;
-	margin-right: auto;
-	margin-top: 30px;
-}
-
-#footer {
-	position: relative;
-	/*margin-top: 50px;*/
-	text-align: center;
-}
-
-.form-box {
-	width: 310px;
-	margin-left: auto;
-	margin-right: auto;
-	margin-top: 50px;
-	border: solid 1px #CCCCCC;
-	text-align: left;
-	/*background-color: white;*/
-}
-
-.form {
-	margin-left: 15px;
-	margin-right: 15px;
-	margin-top: 30px;
-	/*color: #1F3660;*/
-	/*position: relative;*/
-	text-align: left;
-}
-
-
-label {
-	width: 100px;
-	float: left;
-	margin-right: 1em;
-	display: block;
-	text-align: right;
-	line-height: 2ex;
-}
-
-input {
-	text-align: left;
-	vertical-align: baseline;
-	margin-bottom: 2em;
-	width: 150px;
-	color: white;
-	/*background-color: #1F3660;*/
-	border: none;
-}
-.radiobutton {
-  width: 20px;
-  background-color: white;
-  margin: 0;  
-} 
-.radiogroup { 
-   margin-bottom: 2em;
- } 
-
-select {
-	width: 150px;
-	color: white;
-	/*background-color: #1F3660;*/
-	border: none;
-	margin-bottom: 2em;
-  width: 150px;
-}
-label {
-  clear: both;
-}
-input, select, .radiogroup {
-  float: right;
-  clear: both;
-}
-.radiogroup input, .radiogroup label {
-   float: none;
- }
-
-#links {
-	margin-left: 15px;
-	margin-right: 15px;
-	margin-top: 10px;
-	margin-bottom: 50px;
-	/*color: #1F3660;*/
-}
-
-
-#links a {
-	text-decoration: none;
-}
-
-#links a:hover {
-	text-decoration: underline;
-}
-
-span {
-	margin-right: 30px;
-	margin-top: 3px;
-	float: right;
-}
-
-.form-info {
-	/*color: #1F3660;*/
-	font-size: 9pt;
-}

+ 0 - 198
custompages/style.css

@@ -1,198 +0,0 @@
-/* Color easy change */
-body, .form, #links a, .form-info {
-  color: #DF002A;
-}
-.form-submit, input, select {
-  background-color: #DF002A;
-}
-.form-error {
-	color: red;
-	font-size: 9pt;
-}
-.form-submit {
-	margin: 0;
-	padding: 0;
-	width: 310px;
-	height: 27px;
-	background-color: #DF002A;
-	/*background-image: url(/custompages/images/login-form-submit-bg.jpg);*/
-	color: white;
-	cursor: pointer;
-	cursor: hand;
-}
-/* end easy change */
-/* Registration form */
-#registration-form-box {
-	width: 400px;
-	margin-left: auto;
-	margin-right: auto;
-	margin-top: 50px;
-	border: solid 1px #CCCCCC;
-	text-align: left;
-	background-color: white;
-}
-#registration-form-box .form-submit{
-  width: 400px;
-}
-div.row {
-  clear: both;
-  padding-top: 5px;
-}
-div.row div.form_header {
-  white-space: nowrap;
-  padding: 2px;
-  background-color: #f0f0f0;
-  border: 1px solid #bbb;
-}
-div.row div.label {
-  float: left;
-  width: 53%;
-  text-align: right;
-  padding-right:1%
-}
-div.row div.formw {
-  width: 46%;
-  float:left;
-}
-[dir=ltr] div.row div.label, [dir=rtl] div.row div.formw {
-  float: left;
-  text-align: right;
-}
-[dir=rtl] div.row div.label, [dir=ltr] div.row div.formw {
-  float: right;
-  text-align: left;
-}
-span.form_required {
-  color: #f00;
-}
-span.form_error {
-  color: #f00;
-  font-size: x-small;
-  margin: 2px;
-}
-html, body {
-	margin: 0;
-	padding: 0;
-}
-
-body {
-	font-family: "Arial Black",sans-serif;
-	font-size: 10pt;
-	width: 100%;
-	text-align: center;
-	/*color: #1F3660;*/
-	/*background-image: url(images/page-background.png);
-	background-repeat: no-repeat;
-	background-size: 100%;
-	*/
-}
-
-#backgroundimage {        
-	background-attachment:fixed;
-	width: 100%;
-	height: 100%;
-	position: absolute;
-	left: 0;
-	top: 30px;
-	z-index:-1;
-}
-
-.backgroundimage {
-	width: 100%;
-	height: auto;
-}
-
-#wrapper {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	z-index: 1;
-}
-
-#header {
-	width: 520px;
-	margin-left: auto;
-	margin-right: auto;
-	margin-top: 30px;
-}
-
-#footer {
-	position: relative;
-	margin-top: 50px;
-	text-align: center;
-}
-
-.form-box {
-	width: 310px;
-	margin-left: auto;
-	margin-right: auto;
-	margin-top: 50px;
-	border: solid 1px #CCCCCC;
-	text-align: left;
-	background-color: white;
-}
-
-.form {
-	margin-left: 15px;
-	margin-right: 15px;
-	margin-top: 30px;
-	/*color: #1F3660;*/
-	position: relative;
-	text-align: left;
-}
-
-
-label {
-	width: 100px;
-	float: left;
-	margin-right: 1em;
-	display: block;
-	text-align: right;
-	line-height: 2ex;
-}
-
-input {
-	text-align: left;
-	vertical-align: baseline;
-	margin-bottom: 2em;
-	width: 150px;
-	color: white;
-	/*background-color: #1F3660;*/
-	border: none;
-}
-
-select {
-	width: 150px;
-	color: white;
-	/*background-color: #1F3660;*/
-	border: none;
-	margin-bottom: 2em;
-}
-#links {
-	margin-left: 15px;
-	margin-right: 15px;
-	margin-top: 10px;
-	margin-bottom: 50px;
-	/*color: #1F3660;*/
-}
-
-
-#links a {
-	text-decoration: none;
-}
-
-#links a:hover {
-	text-decoration: underline;
-}
-
-span {
-	margin-right: 30px;
-	margin-top: 3px;
-	float: right;
-}
-
-.form-info {
-	/*color: #1F3660;*/
-	font-size: 9pt;
-}

+ 0 - 5
custompages/url-images/README

@@ -1,5 +0,0 @@
-Custom Pages : URL Images
-
-This features allows each access URL to have a number of images (currently three) specific to this URL. This allows easier customization of landing pages by access URL.
-
-You can access a URL's images by calling the static function CustomPages::getURLImages() in your custom page.

+ 0 - 2
inc/global.inc.php

@@ -1,2 +0,0 @@
-<?php
-/*  File needed because all files include the "require_once '../inc/global.inc.php'" */

+ 0 - 172
main/auth/cas/authcas.php

@@ -1,172 +0,0 @@
-<?php
-/* Written by Noel Dieschburg <noel@cblue.be> for the paris5 university
-
-* Checks if the user is already logged in via the cas system
-* Gets all the info via the ldap module (ldap has to work)
-
-*/
-require_once(api_get_path(SYS_PATH).'main/auth/cas/cas_var.inc.php');
-require_once(api_get_path(SYS_PATH).'main/auth/external_login/ldap.inc.php');
-require_once(api_get_path(SYS_PATH).'main/auth/external_login/functions.inc.php');
-
-
-
-/**
-* @return true if cas is configured
-*
-**/
-function cas_configured() {
-	global $cas_auth_ver, $cas_auth_server, $cas_auth_port, $cas_auth_uri; 
-    $res = false;
-    if (!empty($cas_auth_ver) && !empty($cas_auth_server) && !empty($cas_auth_port)) {
-        $res = true;
-    }
-    return $res;
-}
-
-
-
-/**
-* checks if the user already get a session
-* @return the user login if the user already has a session ,false otherwise
-**/
-
-function cas_is_authenticated()
-{
-	global $cas_auth_ver, $cas_auth_server, $cas_auth_port, $cas_auth_uri; 
-	global $PHPCAS_CLIENT;
-	global $logout;
-
-    if (!cas_configured()) {
-        return;
-    }
-
-
-	if (!is_object($PHPCAS_CLIENT) ) 
-	{
-		phpCAS::client($cas_auth_ver,$cas_auth_server,$cas_auth_port,$cas_auth_uri);
-		phpCAS::setNoCasServerValidation();
-	}
-	$auth = phpCAS::checkAuthentication(); 
-  
-	if ($auth) {
-		$login= trim(phpCAS::getUser());
-		/*
-		   Get user  attributes. Here are the attributes for crdp platform
-		   sn => name
-		   ENTPersonMailInterne => mail
-		   ENTPersonAlias => login
-		   ENTPersonProfils => profil
-		   givenName => first name
-		 */
-		/*$user=phpCAS::getAttributes();
-		$firstName = trim($user['givenName']);
-		$lastName = trim($user['sn']);
-		$login = trim($user['ENTPersonAlias']);
-		$profil = trim($user['ENTPersonProfils']);
-		$email = trim($user['ENTPersonMailInterne']);
-		$satus=5;
-		switch ($profil){
-			case 'admin_etab':
-				$status=3; //Session admin
-				break;
-			case 'admin_sie':
-				$status=3; //Session admin
-				break;
-			case 'National_3':
-				$status=1; // Teacher
-				break;
-			case 'National_1':
-				$status=5; // Student
-				break;
-			default:
-				$status=5; // Student
-		}*/
-		if (!$logout){
-		    // get user info from username
-		    $tab_user_info = UserManager::get_user_info($login);
-		    
-		    // user found in the chamilo database
-		    if (is_array($tab_user_info)) {
-		        // if option is on we update user automatically from ldap server
-		        if (api_get_setting("update_user_info_cas_with_ldap") == "true") {
-                    $ldapuser = extldap_authenticate($login, 'nopass', true);
-                    if ($ldap_user !== false) {
-                        $chamilo_user = extldap_get_chamilo_user($ldapuser);
-                        $chamilo_user['user_id'] = $tab_user_info['user_id'];
-                        $chamilo_user['status'] = $tab_user_info['status'];
-        				UserManager::update_user ($chamilo_user["user_id"], $chamilo_user["firstname"], $chamilo_user["lastname"], $login, null, null, $chamilo_user["email"], $chamilo_user["status"], '', '', '', '', 1, null, 0, null,'') ;
-		            }
-		        }
-		        return $login;
-		    }
-		    // user not found
-		    else {
-		        // if option is on we can ADD user automatically from ldap server or by modify own profil
-		        $user_added = false;
-		        switch (api_get_setting("cas_add_user_activate")) {
-		            case PLATFORM_AUTH_SOURCE : 
-		                // user will have to modify firstname, lastname, email in chamilo profil edit
-		                $userdata = get_lang("EditInProfil");
-          				UserManager::create_user($userdata, $userdata, '5', $userdata, $login, 'casplaceholder', '','','','',CAS_AUTH_SOURCE);
-          				$user_added = $login;
-		                break;
-		            case LDAP_AUTH_SOURCE : 
-		                // user info are read from ldap connexion
-	                    // get user info from ldap server
-	                    // user has already been authenticated by CAS
-	                    // If user not found in LDAP, user not created
-	                    $ldapuser = extldap_authenticate($login, 'nopass', true);
-	                    if ($ldap_user !== false) {
-	                        $chamilo_user = extldap_get_chamilo_user($ldapuser);
-                            $chamilo_user['username'] = $login;
-                            $chamilo_user['auth_source'] = CAS_AUTH_SOURCE;
-                            $chamilo_uid = external_add_user($chamilo_user);
-          				    $user_added = $login;
-          				}
-		                break;
-		            default : break;
-		        }
-		        return $user_added;
-		    }
-		}
-//		//If the user is in the dokeos database and we are ,not in a logout request, we upgrade his infomration by ldap
-//		if (! $logout){
-//			$user_table = Database::get_main_table(TABLE_MAIN_USER);
-//			$sql = "SELECT user_id, username, password, auth_source, active, expiration_date ".
-//				"FROM $user_table ".
-//				"WHERE username = '$login' ";
-//
-//			$result = api_sql_query($sql,__FILE__,__LINE__);
-//			if(mysql_num_rows($result) == 0) { 
-//				require_once(api_get_path(SYS_PATH).'main/inc/lib/usermanager.lib.php');
-//				$rnumber=rand(0,256000);
-//				UserManager::create_user($firstName, $lastName, $status, $email, $login, md5('casplaceholder'.$rnumber), $official_code='',$language='',$phone='',$picture_uri='',$auth_source = PLATFORM_AUTH_SOURCE);
-//			}
-//			else {
-//				$user = mysql_fetch_assoc($result);
-//				$user_id = intval($user['user_id']);
-//				//echo "deb : $status";
-//				UserManager::update_user ($user_id, $firstname, $lastname, $login, null, null, $email, $status, '', '', '', '', 1, null, 0, null,'') ;
-//
-//			}
-//		}
-		return $login;
-	}
-	else 
-	{ 
-		return false;
-	}
-}
-
-/**
-* Logs out the user of the cas 
-* The user MUST be logged in with cas to use this function 
-**/ 
-function cas_logout()
-{
-	//phpCAS::logoutWithRedirectService("fmc.univ-paris5.fr");		
-	phpCAS::logoutWithRedirectService(api_get_path(WEB_PATH));		
-}
-
-?>

+ 0 - 21
main/auth/cas/cas_var.inc.php

@@ -1,21 +0,0 @@
-<?php
-/* This file contains all the configuration variable for the cas module
- * In the future, these will be in the database
-*/
-require_once('lib/CAS.php');
-
-global $cas_auth_ver, $cas_auth_server, $cas_auth_port, $cas_auth_uri; 
-
-$cas_auth_server = api_get_setting('cas_server');
-$cas_auth_uri = api_get_setting('cas_server_uri');
-$cas_auth_port = intval(api_get_setting('cas_port'));
-switch (api_get_setting('cas_protocol')) {
-    case 'CAS1': $cas_auth_ver = CAS_VERSION_1_0; break;
-    case 'CAS2': $cas_auth_ver = CAS_VERSION_2_0; break;
-    case 'SAML': $cas_auth_ver = SAML_VERSION_1_1; break;
-    default : $cas_auth_ver = CAS_VERSION_2_0; break;
-}
-
-$cas_auth_uri = api_get_setting('cas_server_uri');
-if ( ! is_string($cas_auth_uri)) $cas_auth_uri = ''; 
-?>

+ 0 - 1610
main/auth/cas/lib/CAS.php

@@ -1,1610 +0,0 @@
-<?php
-
-/*
- * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
- *       Collaborative nor the names of its contributors may be used to endorse or
- *       promote products derived from this software without specific prior
- *       written permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-//
-// hack by Vangelis Haniotakis to handle the absence of $_SERVER['REQUEST_URI'] in IIS
-//
-if (!$_SERVER['REQUEST_URI']) {
-	$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . '?' . $_SERVER['QUERY_STRING'];
-}
-
-//
-// another one by Vangelis Haniotakis also to make phpCAS work with PHP5
-//
-if (version_compare(PHP_VERSION, '5', '>=')) {
-	require_once (dirname(__FILE__) . '/CAS/domxml-php4-to-php5.php');
-}
-
-/**
- * @file CAS/CAS.php
- * Interface class of the phpCAS library
- *
- * @ingroup public
- */
-
-// ########################################################################
-//  CONSTANTS
-// ########################################################################
-
-// ------------------------------------------------------------------------
-//  CAS VERSIONS
-// ------------------------------------------------------------------------
-
-/**
- * phpCAS version. accessible for the user by phpCAS::getVersion().
- */
-define('PHPCAS_VERSION', '1.1.1');
-
-// ------------------------------------------------------------------------
-//  CAS VERSIONS
-// ------------------------------------------------------------------------
-/**
- * @addtogroup public
- * @{
- */
-
-/**
- * CAS version 1.0
- */
-define("CAS_VERSION_1_0", '1.0');
-/*!
- * CAS version 2.0
- */
-define("CAS_VERSION_2_0", '2.0');
-
-// ------------------------------------------------------------------------
-//  SAML defines
-// ------------------------------------------------------------------------
-
-/**
- * SAML protocol
- */
-define("SAML_VERSION_1_1", 'S1');
-
-/**
- * XML header for SAML POST
- */
-define("SAML_XML_HEADER", '<?xml version="1.0" encoding="UTF-8"?>');
-
-/**
- * SOAP envelope for SAML POST
- */
-define("SAML_SOAP_ENV", '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/>');
-
-/**
- * SOAP body for SAML POST
- */
-define("SAML_SOAP_BODY", '<SOAP-ENV:Body>');
-
-/**
- * SAMLP request
- */
-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">');
-define("SAMLP_REQUEST_CLOSE", '</samlp:Request>');
-
-/**
- * SAMLP artifact tag (for the ticket)
- */
-define("SAML_ASSERTION_ARTIFACT", '<samlp:AssertionArtifact>');
-
-/**
- * SAMLP close
- */
-define("SAML_ASSERTION_ARTIFACT_CLOSE", '</samlp:AssertionArtifact>');
-
-/**
- * SOAP body close
- */
-define("SAML_SOAP_BODY_CLOSE", '</SOAP-ENV:Body>');
-
-/**
- * SOAP envelope close
- */
-define("SAML_SOAP_ENV_CLOSE", '</SOAP-ENV:Envelope>');
-
-/**
- * SAML Attributes
- */
-define("SAML_ATTRIBUTES", 'SAMLATTRIBS');
-
-/** @} */
-/**
- * @addtogroup publicPGTStorage
- * @{
- */
-// ------------------------------------------------------------------------
-//  FILE PGT STORAGE
-// ------------------------------------------------------------------------
-/**
- * Default path used when storing PGT's to file
- */
-define("CAS_PGT_STORAGE_FILE_DEFAULT_PATH", '/tmp');
-/**
- * phpCAS::setPGTStorageFile()'s 2nd parameter to write plain text files
- */
-define("CAS_PGT_STORAGE_FILE_FORMAT_PLAIN", 'plain');
-/**
- * phpCAS::setPGTStorageFile()'s 2nd parameter to write xml files
- */
-define("CAS_PGT_STORAGE_FILE_FORMAT_XML", 'xml');
-/**
- * Default format used when storing PGT's to file
- */
-define("CAS_PGT_STORAGE_FILE_DEFAULT_FORMAT", CAS_PGT_STORAGE_FILE_FORMAT_PLAIN);
-// ------------------------------------------------------------------------
-//  DATABASE PGT STORAGE
-// ------------------------------------------------------------------------
-/**
- * default database type when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_DATABASE_TYPE", 'mysql');
-/**
- * default host when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_HOSTNAME", 'localhost');
-/**
- * default port when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_PORT", '');
-/**
- * default database when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_DATABASE", 'phpCAS');
-/**
- * default table when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_TABLE", 'pgt');
-
-/** @} */
-// ------------------------------------------------------------------------
-// SERVICE ACCESS ERRORS
-// ------------------------------------------------------------------------
-/**
- * @addtogroup publicServices
- * @{
- */
-
-/**
- * phpCAS::service() error code on success
- */
-define("PHPCAS_SERVICE_OK", 0);
-/**
- * phpCAS::service() error code when the PT could not retrieve because
- * the CAS server did not respond.
- */
-define("PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE", 1);
-/**
- * phpCAS::service() error code when the PT could not retrieve because
- * the response of the CAS server was ill-formed.
- */
-define("PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE", 2);
-/**
- * phpCAS::service() error code when the PT could not retrieve because
- * the CAS server did not want to.
- */
-define("PHPCAS_SERVICE_PT_FAILURE", 3);
-/**
- * phpCAS::service() error code when the service was not available.
- */
-define("PHPCAS_SERVICE_NOT AVAILABLE", 4);
-
-/** @} */
-// ------------------------------------------------------------------------
-//  LANGUAGES
-// ------------------------------------------------------------------------
-/**
- * @addtogroup publicLang
- * @{
- */
-
-define("PHPCAS_LANG_ENGLISH", 'english');
-define("PHPCAS_LANG_FRENCH", 'french');
-define("PHPCAS_LANG_GREEK", 'greek');
-define("PHPCAS_LANG_GERMAN", 'german');
-define("PHPCAS_LANG_JAPANESE", 'japanese');
-define("PHPCAS_LANG_SPANISH", 'spanish');
-define("PHPCAS_LANG_CATALAN", 'catalan');
-
-/** @} */
-
-/**
- * @addtogroup internalLang
- * @{
- */
-
-/**
- * phpCAS default language (when phpCAS::setLang() is not used)
- */
-define("PHPCAS_LANG_DEFAULT", PHPCAS_LANG_ENGLISH);
-
-/** @} */
-// ------------------------------------------------------------------------
-//  DEBUG
-// ------------------------------------------------------------------------
-/**
- * @addtogroup publicDebug
- * @{
- */
-
-/**
- * The default directory for the debug file under Unix.
- */
-define('DEFAULT_DEBUG_DIR', '/tmp/');
-
-/** @} */
-// ------------------------------------------------------------------------
-//  MISC
-// ------------------------------------------------------------------------
-/**
- * @addtogroup internalMisc
- * @{
- */
-
-/**
- * This global variable is used by the interface class phpCAS.
- *
- * @hideinitializer
- */
-$GLOBALS['PHPCAS_CLIENT'] = null;
-
-/**
- * This global variable is used to store where the initializer is called from
- * (to print a comprehensive error in case of multiple calls).
- *
- * @hideinitializer
- */
-$GLOBALS['PHPCAS_INIT_CALL'] = array (
-	'done' => FALSE,
-	'file' => '?',
-	'line' => -1,
-	'method' => '?'
-);
-
-/**
- * This global variable is used to store where the method checking
- * the authentication is called from (to print comprehensive errors)
- *
- * @hideinitializer
- */
-$GLOBALS['PHPCAS_AUTH_CHECK_CALL'] = array (
-	'done' => FALSE,
-	'file' => '?',
-	'line' => -1,
-	'method' => '?',
-	'result' => FALSE
-);
-
-/**
- * This global variable is used to store phpCAS debug mode.
- *
- * @hideinitializer
- */
-$GLOBALS['PHPCAS_DEBUG'] = array (
-	'filename' => '/tmp/cas.log',
-	'indent' => 0,
-	'unique_id' => ''
-);
-
-/** @} */
-
-// ########################################################################
-//  CLIENT CLASS
-// ########################################################################
-
-// include client class
-include_once (dirname(__FILE__) . '/CAS/client.php');
-
-// ########################################################################
-//  INTERFACE CLASS
-// ########################################################################
-
-/**
- * @class phpCAS
- * The phpCAS class is a simple container for the phpCAS library. It provides CAS
- * authentication for web applications written in PHP.
- *
- * @ingroup public
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- *
- * \internal All its methods access the same object ($PHPCAS_CLIENT, declared
- * at the end of CAS/client.php).
- */
-
-class phpCAS {
-
-	// ########################################################################
-	//  INITIALIZATION
-	// ########################################################################
-
-	/**
-	 * @addtogroup publicInit
-	 * @{
-	 */
-
-	/**
-	 * phpCAS client initializer.
-	 * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be
-	 * called, only once, and before all other methods (except phpCAS::getVersion()
-	 * and phpCAS::setDebug()).
-	 *
-	 * @param $server_version the version of the CAS server
-	 * @param $server_hostname the hostname of the CAS server
-	 * @param $server_port the port the CAS server is running on
-	 * @param $server_uri the URI the CAS server is responding on
-	 * @param $start_session Have phpCAS start PHP sessions (default true)
-	 *
-	 * @return a newly created CASClient object
-	 */
-	function client($server_version, $server_hostname, $server_port, $server_uri, $start_session = true) {
-		global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
-
-		phpCAS :: traceBegin();
-		if (is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error($PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . $PHPCAS_INIT_CALL['file'] . ':' . $PHPCAS_INIT_CALL['line'] . ')');
-		}
-		if (gettype($server_version) != 'string') {
-			phpCAS :: error('type mismatched for parameter $server_version (should be `string\')');
-		}
-		if (gettype($server_hostname) != 'string') {
-			phpCAS :: error('type mismatched for parameter $server_hostname (should be `string\')');
-		}
-		if (gettype($server_port) != 'integer') {
-			phpCAS :: error('type mismatched for parameter $server_port (should be `integer\')');
-		}
-		if (gettype($server_uri) != 'string') {
-			phpCAS :: error('type mismatched for parameter $server_uri (should be `string\')');
-		}
-
-		// store where the initializer is called from
-		$dbg = phpCAS :: backtrace();
-		$PHPCAS_INIT_CALL = array (
-			'done' => TRUE,
-			'file' => $dbg[0]['file'],
-			'line' => $dbg[0]['line'],
-			'method' => __CLASS__ . '::' . __FUNCTION__
-		);
-
-		// initialize the global object $PHPCAS_CLIENT
-		$PHPCAS_CLIENT = new CASClient($server_version, FALSE /*proxy*/
-		, $server_hostname, $server_port, $server_uri, $start_session);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * phpCAS proxy initializer.
-	 * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be
-	 * called, only once, and before all other methods (except phpCAS::getVersion()
-	 * and phpCAS::setDebug()).
-	 *
-	 * @param $server_version the version of the CAS server
-	 * @param $server_hostname the hostname of the CAS server
-	 * @param $server_port the port the CAS server is running on
-	 * @param $server_uri the URI the CAS server is responding on
-	 * @param $start_session Have phpCAS start PHP sessions (default true)
-	 *
-	 * @return a newly created CASClient object
-	 */
-	function proxy($server_version, $server_hostname, $server_port, $server_uri, $start_session = true) {
-		global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
-
-		phpCAS :: traceBegin();
-		if (is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error($PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . $PHPCAS_INIT_CALL['file'] . ':' . $PHPCAS_INIT_CALL['line'] . ')');
-		}
-		if (gettype($server_version) != 'string') {
-			phpCAS :: error('type mismatched for parameter $server_version (should be `string\')');
-		}
-		if (gettype($server_hostname) != 'string') {
-			phpCAS :: error('type mismatched for parameter $server_hostname (should be `string\')');
-		}
-		if (gettype($server_port) != 'integer') {
-			phpCAS :: error('type mismatched for parameter $server_port (should be `integer\')');
-		}
-		if (gettype($server_uri) != 'string') {
-			phpCAS :: error('type mismatched for parameter $server_uri (should be `string\')');
-		}
-
-		// store where the initialzer is called from
-		$dbg = phpCAS :: backtrace();
-		$PHPCAS_INIT_CALL = array (
-			'done' => TRUE,
-			'file' => $dbg[0]['file'],
-			'line' => $dbg[0]['line'],
-			'method' => __CLASS__ . '::' . __FUNCTION__
-		);
-
-		// initialize the global object $PHPCAS_CLIENT
-		$PHPCAS_CLIENT = new CASClient($server_version, TRUE /*proxy*/
-		, $server_hostname, $server_port, $server_uri, $start_session);
-		phpCAS :: traceEnd();
-	}
-
-	/** @} */
-	// ########################################################################
-	//  DEBUGGING
-	// ########################################################################
-
-	/**
-	 * @addtogroup publicDebug
-	 * @{
-	 */
-
-	/**
-	 * Set/unset debug mode
-	 *
-	 * @param $filename the name of the file used for logging, or FALSE to stop debugging.
-	 */
-	function setDebug($filename = '') {
-		global $PHPCAS_DEBUG;
-
-		if ($filename != FALSE && gettype($filename) != 'string') {
-			phpCAS :: error('type mismatched for parameter $dbg (should be FALSE or the name of the log file)');
-		}
-
-		if (empty ($filename)) {
-			if (preg_match('/^Win.*/', getenv('OS'))) {
-				if (isset ($_ENV['TMP'])) {
-					$debugDir = $_ENV['TMP'] . '/';
-				} else
-					if (isset ($_ENV['TEMP'])) {
-						$debugDir = $_ENV['TEMP'] . '/';
-					} else {
-						$debugDir = '';
-					}
-			} else {
-				$debugDir = DEFAULT_DEBUG_DIR;
-			}
-			$filename = $debugDir . 'phpCAS.log';
-		}
-
-		if (empty ($PHPCAS_DEBUG['unique_id'])) {
-			$PHPCAS_DEBUG['unique_id'] = substr(strtoupper(md5(uniqid(''))), 0, 4);
-		}
-
-		$PHPCAS_DEBUG['filename'] = $filename;
-
-		phpCAS :: trace('START ******************');
-	}
-
-	/** @} */
-	/**
-	 * @addtogroup internalDebug
-	 * @{
-	 */
-
-	/**
-	 * This method is a wrapper for debug_backtrace() that is not available
-	 * in all PHP versions (>= 4.3.0 only)
-	 */
-	function backtrace() {
-		if (function_exists('debug_backtrace')) {
-			return debug_backtrace();
-		} else {
-			// poor man's hack ... but it does work ...
-			return array ();
-		}
-	}
-
-	/**
-	 * Logs a string in debug mode.
-	 *
-	 * @param $str the string to write
-	 *
-	 * @private
-	 */
-	function log($str) {
-		$indent_str = ".";
-		global $PHPCAS_DEBUG;
-
-		if ($PHPCAS_DEBUG['filename']) {
-			for ($i = 0; $i < $PHPCAS_DEBUG['indent']; $i++) {
-				$indent_str .= '|    ';
-			}
-			error_log($PHPCAS_DEBUG['unique_id'] . ' ' . $indent_str . $str . "\n", 3, $PHPCAS_DEBUG['filename']);
-		}
-
-	}
-
-	/**
-	 * This method is used by interface methods to print an error and where the function
-	 * was originally called from.
-	 *
-	 * @param $msg the message to print
-	 *
-	 * @private
-	 */
-	function error($msg) {
-		$dbg = phpCAS :: backtrace();
-		$function = '?';
-		$file = '?';
-		$line = '?';
-		if (is_array($dbg)) {
-			for ($i = 1; $i < sizeof($dbg); $i++) {
-				if (is_array($dbg[$i])) {
-					if ($dbg[$i]['class'] == __CLASS__) {
-						$function = $dbg[$i]['function'];
-						$file = $dbg[$i]['file'];
-						$line = $dbg[$i]['line'];
-					}
-				}
-			}
-		}
-		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";
-		phpCAS :: trace($msg);
-		phpCAS :: traceExit();
-		exit ();
-	}
-
-	/**
-	 * This method is used to log something in debug mode.
-	 */
-	function trace($str) {
-		$dbg = phpCAS :: backtrace();
-		phpCAS :: log($str . ' [' . basename($dbg[1]['file']) . ':' . $dbg[1]['line'] . ']');
-	}
-
-	/**
-	 * This method is used to indicate the start of the execution of a function in debug mode.
-	 */
-	function traceBegin() {
-		global $PHPCAS_DEBUG;
-
-		$dbg = phpCAS :: backtrace();
-		$str = '=> ';
-		if (!empty ($dbg[2]['class'])) {
-			$str .= $dbg[2]['class'] . '::';
-		}
-		$str .= $dbg[2]['function'] . '(';
-		if (is_array($dbg[2]['args'])) {
-			foreach ($dbg[2]['args'] as $index => $arg) {
-				if ($index != 0) {
-					$str .= ', ';
-				}
-				$str .= str_replace("\n", "", var_export($arg, TRUE));
-			}
-		}
-		$str .= ') [' . basename($dbg[2]['file']) . ':' . $dbg[2]['line'] . ']';
-		phpCAS :: log($str);
-		$PHPCAS_DEBUG['indent']++;
-	}
-
-	/**
-	 * This method is used to indicate the end of the execution of a function in debug mode.
-	 *
-	 * @param $res the result of the function
-	 */
-	function traceEnd($res = '') {
-		global $PHPCAS_DEBUG;
-
-		$PHPCAS_DEBUG['indent']--;
-		$dbg = phpCAS :: backtrace();
-		$str = '';
-		$str .= '<= ' . str_replace("\n", "", var_export($res, TRUE));
-		phpCAS :: log($str);
-	}
-
-	/**
-	 * This method is used to indicate the end of the execution of the program
-	 */
-	function traceExit() {
-		global $PHPCAS_DEBUG;
-
-		phpCAS :: log('exit()');
-		while ($PHPCAS_DEBUG['indent'] > 0) {
-			phpCAS :: log('-');
-			$PHPCAS_DEBUG['indent']--;
-		}
-	}
-
-	/** @} */
-	// ########################################################################
-	//  INTERNATIONALIZATION
-	// ########################################################################
-	/**
-	 * @addtogroup publicLang
-	 * @{
-	 */
-
-	/**
-	 * This method is used to set the language used by phpCAS.
-	 * @note Can be called only once.
-	 *
-	 * @param $lang a string representing the language.
-	 *
-	 * @sa PHPCAS_LANG_FRENCH, PHPCAS_LANG_ENGLISH
-	 */
-	function setLang($lang) {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($lang) != 'string') {
-			phpCAS :: error('type mismatched for parameter $lang (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setLang($lang);
-	}
-
-	/** @} */
-	// ########################################################################
-	//  VERSION
-	// ########################################################################
-	/**
-	 * @addtogroup public
-	 * @{
-	 */
-
-	/**
-	 * This method returns the phpCAS version.
-	 *
-	 * @return the phpCAS version.
-	 */
-	function getVersion() {
-		return PHPCAS_VERSION;
-	}
-
-	/** @} */
-	// ########################################################################
-	//  HTML OUTPUT
-	// ########################################################################
-	/**
-	 * @addtogroup publicOutput
-	 * @{
-	 */
-
-	/**
-	 * This method sets the HTML header used for all outputs.
-	 *
-	 * @param $header the HTML header.
-	 */
-	function setHTMLHeader($header) {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($header) != 'string') {
-			phpCAS :: error('type mismatched for parameter $header (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setHTMLHeader($header);
-	}
-
-	/**
-	 * This method sets the HTML footer used for all outputs.
-	 *
-	 * @param $footer the HTML footer.
-	 */
-	function setHTMLFooter($footer) {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($footer) != 'string') {
-			phpCAS :: error('type mismatched for parameter $footer (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setHTMLFooter($footer);
-	}
-
-	/** @} */
-	// ########################################################################
-	//  PGT STORAGE
-	// ########################################################################
-	/**
-	 * @addtogroup publicPGTStorage
-	 * @{
-	 */
-
-	/**
-	 * This method is used to tell phpCAS to store the response of the
-	 * CAS server to PGT requests onto the filesystem.
-	 *
-	 * @param $format the format used to store the PGT's (`plain' and `xml' allowed)
-	 * @param $path the path where the PGT's should be stored
-	 */
-	function setPGTStorageFile($format = '', $path = '') {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_CLIENT->isProxy()) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if ($PHPCAS_AUTH_CHECK_CALL['done']) {
-			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'] . ')');
-		}
-		if (gettype($format) != 'string') {
-			phpCAS :: error('type mismatched for parameter $format (should be `string\')');
-		}
-		if (gettype($path) != 'string') {
-			phpCAS :: error('type mismatched for parameter $format (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setPGTStorageFile($format, $path);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * This method is used to tell phpCAS to store the response of the
-	 * CAS server to PGT requests into a database.
-	 * @note The connection to the database is done only when needed.
-	 * As a consequence, bad parameters are detected only when
-	 * initializing PGT storage, except in debug mode.
-	 *
-	 * @param $user the user to access the data with
-	 * @param $password the user's password
-	 * @param $database_type the type of the database hosting the data
-	 * @param $hostname the server hosting the database
-	 * @param $port the port the server is listening on
-	 * @param $database the name of the database
-	 * @param $table the name of the table storing the data
-	 */
-	function setPGTStorageDB($user, $password, $database_type = '', $hostname = '', $port = 0, $database = '', $table = '') {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_CLIENT->isProxy()) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if ($PHPCAS_AUTH_CHECK_CALL['done']) {
-			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'] . ')');
-		}
-		if (gettype($user) != 'string') {
-			phpCAS :: error('type mismatched for parameter $user (should be `string\')');
-		}
-		if (gettype($password) != 'string') {
-			phpCAS :: error('type mismatched for parameter $password (should be `string\')');
-		}
-		if (gettype($database_type) != 'string') {
-			phpCAS :: error('type mismatched for parameter $database_type (should be `string\')');
-		}
-		if (gettype($hostname) != 'string') {
-			phpCAS :: error('type mismatched for parameter $hostname (should be `string\')');
-		}
-		if (gettype($port) != 'integer') {
-			phpCAS :: error('type mismatched for parameter $port (should be `integer\')');
-		}
-		if (gettype($database) != 'string') {
-			phpCAS :: error('type mismatched for parameter $database (should be `string\')');
-		}
-		if (gettype($table) != 'string') {
-			phpCAS :: error('type mismatched for parameter $table (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setPGTStorageDB($user, $password, $database_type, $hostname, $port, $database, $table);
-		phpCAS :: traceEnd();
-	}
-
-	/** @} */
-	// ########################################################################
-	// ACCESS TO EXTERNAL SERVICES
-	// ########################################################################
-	/**
-	 * @addtogroup publicServices
-	 * @{
-	 */
-
-	/**
-	 * This method is used to access an HTTP[S] service.
-	 *
-	 * @param $url the service to access.
-	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
-	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
-	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT AVAILABLE.
-	 * @param $output the output of the service (also used to give an error
-	 * message on failure).
-	 *
-	 * @return TRUE on success, FALSE otherwise (in this later case, $err_code
-	 * gives the reason why it failed and $output contains an error message).
-	 */
-	function serviceWeb($url, & $err_code, & $output) {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_CLIENT->isProxy()) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
-			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()');
-		}
-		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
-			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');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
-		}
-
-		$res = $PHPCAS_CLIENT->serviceWeb($url, $err_code, $output);
-
-		phpCAS :: traceEnd($res);
-		return $res;
-	}
-
-	/**
-	 * This method is used to access an IMAP/POP3/NNTP service.
-	 *
-	 * @param $url a string giving the URL of the service, including the mailing box
-	 * for IMAP URLs, as accepted by imap_open().
-	 * @param $service a string giving for CAS retrieve Proxy ticket
-	 * @param $flags options given to imap_open().
-	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
-	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
-	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT AVAILABLE.
-	 * @param $err_msg an error message on failure
-	 * @param $pt the Proxy Ticket (PT) retrieved from the CAS server to access the URL
-	 * on success, FALSE on error).
-	 *
-	 * @return an IMAP stream on success, FALSE otherwise (in this later case, $err_code
-	 * gives the reason why it failed and $err_msg contains an error message).
-	 */
-	function serviceMail($url, $service, $flags, & $err_code, & $err_msg, & $pt) {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_CLIENT->isProxy()) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
-			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()');
-		}
-		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
-			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');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
-		}
-
-		if (gettype($flags) != 'integer') {
-			phpCAS :: error('type mismatched for parameter $flags (should be `integer\')');
-		}
-
-		$res = $PHPCAS_CLIENT->serviceMail($url, $service, $flags, $err_code, $err_msg, $pt);
-
-		phpCAS :: traceEnd($res);
-		return $res;
-	}
-
-	/** @} */
-	// ########################################################################
-	//  AUTHENTICATION
-	// ########################################################################
-	/**
-	 * @addtogroup publicAuth
-	 * @{
-	 */
-
-	/**
-	 * Set the times authentication will be cached before really accessing the CAS server in gateway mode:
-	 * - -1: check only once, and then never again (until you pree login)
-	 * - 0: always check
-	 * - n: check every "n" time
-	 *
-	 * @param $n an integer.
-	 */
-	function setCacheTimesForAuthRecheck($n) {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($n) != 'integer') {
-			phpCAS :: error('type mismatched for parameter $header (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setCacheTimesForAuthRecheck($n);
-	}
-
-	/**
-	 * This method is called to check if the user is authenticated (use the gateway feature).
-	 * @return TRUE when the user is authenticated; otherwise FALSE.
-	 */
-	function checkAuthentication() {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-
-		$auth = $PHPCAS_CLIENT->checkAuthentication();
-
-		// store where the authentication has been checked and the result
-		$dbg = phpCAS :: backtrace();
-		$PHPCAS_AUTH_CHECK_CALL = array (
-			'done' => TRUE,
-			'file' => $dbg[0]['file'],
-			'line' => $dbg[0]['line'],
-			'method' => __CLASS__ . '::' . __FUNCTION__,
-			'result' => $auth
-		);
-		phpCAS :: traceEnd($auth);
-		return $auth;
-	}
-
-	/**
-	 * This method is called to force authentication if the user was not already
-	 * authenticated. If the user is not authenticated, halt by redirecting to
-	 * the CAS server.
-	 */
-	function forceAuthentication() {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-
-		$auth = $PHPCAS_CLIENT->forceAuthentication();
-
-		// store where the authentication has been checked and the result
-		$dbg = phpCAS :: backtrace();
-		$PHPCAS_AUTH_CHECK_CALL = array (
-			'done' => TRUE,
-			'file' => $dbg[0]['file'],
-			'line' => $dbg[0]['line'],
-			'method' => __CLASS__ . '::' . __FUNCTION__,
-			'result' => $auth
-		);
-
-		if (!$auth) {
-			phpCAS :: trace('user is not authenticated, redirecting to the CAS server');
-			$PHPCAS_CLIENT->forceAuthentication();
-		} else {
-			phpCAS :: trace('no need to authenticate (user `' . phpCAS :: getUser() . '\' is already authenticated)');
-		}
-
-		phpCAS :: traceEnd();
-		return $auth;
-	}
-
-	/**
-	 * This method is called to renew the authentication.
-	 **/
-	function renewAuthentication() {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-
-		// store where the authentication has been checked and the result
-		$dbg = phpCAS :: backtrace();
-		$PHPCAS_AUTH_CHECK_CALL = array (
-			'done' => TRUE,
-			'file' => $dbg[0]['file'],
-			'line' => $dbg[0]['line'],
-			'method' => __CLASS__ . '::' . __FUNCTION__,
-			'result' => $auth
-		);
-
-		$PHPCAS_CLIENT->renewAuthentication();
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * This method has been left from version 0.4.1 for compatibility reasons.
-	 */
-	function authenticate() {
-		phpCAS :: error('this method is deprecated. You should use ' . __CLASS__ . '::forceAuthentication() instead');
-	}
-
-	/**
-	 * This method is called to check if the user is authenticated (previously or by
-	 * tickets given in the URL).
-	 *
-	 * @return TRUE when the user is authenticated.
-	 */
-	function isAuthenticated() {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-
-		// call the isAuthenticated method of the global $PHPCAS_CLIENT object
-		$auth = $PHPCAS_CLIENT->isAuthenticated();
-
-		// store where the authentication has been checked and the result
-		$dbg = phpCAS :: backtrace();
-		$PHPCAS_AUTH_CHECK_CALL = array (
-			'done' => TRUE,
-			'file' => $dbg[0]['file'],
-			'line' => $dbg[0]['line'],
-			'method' => __CLASS__ . '::' . __FUNCTION__,
-			'result' => $auth
-		);
-		phpCAS :: traceEnd($auth);
-		return $auth;
-	}
-
-	/**
-	 * Checks whether authenticated based on $_SESSION. Useful to avoid
-	 * server calls.
-	 * @return true if authenticated, false otherwise.
-	 * @since 0.4.22 by Brendan Arnold
-	 */
-	function isSessionAuthenticated() {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		return ($PHPCAS_CLIENT->isSessionAuthenticated());
-	}
-
-	/**
-	 * This method returns the CAS user's login name.
-	 * @warning should not be called only after phpCAS::forceAuthentication()
-	 * or phpCAS::checkAuthentication().
-	 *
-	 * @return the login name of the authenticated user
-	 */
-	function getUser() {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
-		}
-		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
-			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');
-		}
-		return $PHPCAS_CLIENT->getUser();
-	}
-
-	/**
-	 * This method returns the CAS user's login name.
-	 * @warning should not be called only after phpCAS::forceAuthentication()
-	 * or phpCAS::checkAuthentication().
-	 *
-	 * @return the login name of the authenticated user
-	 */
-	function getAttributes() {
-		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
-		}
-		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
-			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');
-		}
-		return $PHPCAS_CLIENT->getAttributes();
-	}
-	/**
-	 * Handle logout requests.
-	 */
-	function handleLogoutRequests($check_client = true, $allowed_clients = false) {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		return ($PHPCAS_CLIENT->handleLogoutRequests($check_client, $allowed_clients));
-	}
-
-	/**
-	 * This method returns the URL to be used to login.
-	 * or phpCAS::isAuthenticated().
-	 *
-	 * @return the login name of the authenticated user
-	 */
-	function getServerLoginURL() {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		return $PHPCAS_CLIENT->getServerLoginURL();
-	}
-
-	/**
-	 * Set the login URL of the CAS server.
-	 * @param $url the login URL
-	 * @since 0.4.21 by Wyman Chan
-	 */
-	function setServerLoginURL($url = '') {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after
-							' . __CLASS__ . '::client()');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be
-						`string\')');
-		}
-		$PHPCAS_CLIENT->setServerLoginURL($url);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * Set the serviceValidate URL of the CAS server.
-	 * Used only in CAS 1.0 validations
-	 * @param $url the serviceValidate URL
-	 * @since 1.1.0 by Joachim Fritschi
-	 */
-	function setServerServiceValidateURL($url = '') {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after
-							' . __CLASS__ . '::client()');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be
-						`string\')');
-		}
-		$PHPCAS_CLIENT->setServerServiceValidateURL($url);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * Set the proxyValidate URL of the CAS server.
-	 * Used for all CAS 2.0 validations
-	 * @param $url the proxyValidate URL
-	 * @since 1.1.0 by Joachim Fritschi
-	 */
-	function setServerProxyValidateURL($url = '') {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after
-							' . __CLASS__ . '::client()');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be
-						`string\')');
-		}
-		$PHPCAS_CLIENT->setServerProxyValidateURL($url);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * Set the samlValidate URL of the CAS server.
-	 * @param $url the samlValidate URL
-	 * @since 1.1.0 by Joachim Fritschi
-	 */
-	function setServerSamlValidateURL($url = '') {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after
-							' . __CLASS__ . '::client()');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be
-						`string\')');
-		}
-		$PHPCAS_CLIENT->setServerSamlValidateURL($url);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * This method returns the URL to be used to login.
-	 * or phpCAS::isAuthenticated().
-	 *
-	 * @return the login name of the authenticated user
-	 */
-	function getServerLogoutURL() {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-		}
-		return $PHPCAS_CLIENT->getServerLogoutURL();
-	}
-
-	/**
-	 * Set the logout URL of the CAS server.
-	 * @param $url the logout URL
-	 * @since 0.4.21 by Wyman Chan
-	 */
-	function setServerLogoutURL($url = '') {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after
-							' . __CLASS__ . '::client()');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be
-						`string\')');
-		}
-		$PHPCAS_CLIENT->setServerLogoutURL($url);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * This method is used to logout from CAS.
-	 * @params $params an array that contains the optional url and service parameters that will be passed to the CAS server
-	 * @public
-	 */
-	function logout($params = "") {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-		}
-		$parsedParams = array ();
-		if ($params != "") {
-			if (is_string($params)) {
-				phpCAS :: error('method `phpCAS::logout($url)\' is now deprecated, use `phpCAS::logoutWithUrl($url)\' instead');
-			}
-			if (!is_array($params)) {
-				phpCAS :: error('type mismatched for parameter $params (should be `array\')');
-			}
-			foreach ($params as $key => $value) {
-				if ($key != "service" && $key != "url") {
-					phpCAS :: error('only `url\' and `service\' parameters are allowed for method `phpCAS::logout($params)\'');
-				}
-				$parsedParams[$key] = $value;
-			}
-		}
-		$PHPCAS_CLIENT->logout($parsedParams);
-		// never reached
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * This method is used to logout from CAS. Halts by redirecting to the CAS server.
-	 * @param $service a URL that will be transmitted to the CAS server
-	 */
-	function logoutWithRedirectService($service) {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-		}
-		if (!is_string($service)) {
-			phpCAS :: error('type mismatched for parameter $service (should be `string\')');
-		}
-		$PHPCAS_CLIENT->logout(array (
-			"service" => $service
-		));
-		// never reached
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * This method is used to logout from CAS. Halts by redirecting to the CAS server.
-	 * @param $url a URL that will be transmitted to the CAS server
-	 */
-	function logoutWithUrl($url) {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-		}
-		if (!is_string($url)) {
-			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
-		}
-		$PHPCAS_CLIENT->logout(array (
-			"url" => $url
-		));
-		// never reached
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * This method is used to logout from CAS. Halts by redirecting to the CAS server.
-	 * @param $service a URL that will be transmitted to the CAS server
-	 * @param $url a URL that will be transmitted to the CAS server
-	 */
-	function logoutWithRedirectServiceAndUrl($service, $url) {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-		}
-		if (!is_string($service)) {
-			phpCAS :: error('type mismatched for parameter $service (should be `string\')');
-		}
-		if (!is_string($url)) {
-			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
-		}
-		$PHPCAS_CLIENT->logout(array (
-			"service" => $service,
-			"url" => $url
-		));
-		// never reached
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * Set the fixed URL that will be used by the CAS server to transmit the PGT.
-	 * When this method is not called, a phpCAS script uses its own URL for the callback.
-	 *
-	 * @param $url the URL
-	 */
-	function setFixedCallbackURL($url = '') {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (!$PHPCAS_CLIENT->isProxy()) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setCallbackURL($url);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * Set the fixed URL that will be set as the CAS service parameter. When this
-	 * method is not called, a phpCAS script uses its own URL.
-	 *
-	 * @param $url the URL
-	 */
-	function setFixedServiceURL($url) {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($url) != 'string') {
-			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setURL($url);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * Get the URL that is set as the CAS service parameter.
-	 */
-	function getServiceURL() {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		return ($PHPCAS_CLIENT->getURL());
-	}
-
-	/**
-	 * Retrieve a Proxy Ticket from the CAS server.
-	 */
-	function retrievePT($target_service, & $err_code, & $err_msg) {
-		global $PHPCAS_CLIENT;
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($target_service) != 'string') {
-			phpCAS :: error('type mismatched for parameter $target_service(should be `string\')');
-		}
-		return ($PHPCAS_CLIENT->retrievePT($target_service, $err_code, $err_msg));
-	}
-
-	/**
-	 * Set the certificate of the CAS server.
-	 *
-	 * @param $cert the PEM certificate
-	 */
-	function setCasServerCert($cert) {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($cert) != 'string') {
-			phpCAS :: error('type mismatched for parameter $cert (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setCasServerCert($cert);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * Set the certificate of the CAS server CA.
-	 *
-	 * @param $cert the CA certificate
-	 */
-	function setCasServerCACert($cert) {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-		}
-		if (gettype($cert) != 'string') {
-			phpCAS :: error('type mismatched for parameter $cert (should be `string\')');
-		}
-		$PHPCAS_CLIENT->setCasServerCACert($cert);
-		phpCAS :: traceEnd();
-	}
-
-	/**
-	 * Set no SSL validation for the CAS server.
-	 */
-	function setNoCasServerValidation() {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-		}
-		$PHPCAS_CLIENT->setNoCasServerValidation();
-		phpCAS :: traceEnd();
-	}
-
-	/** @} */
-
-	/**
-	 * Change CURL options.
-	 * CURL is used to connect through HTTPS to CAS server
-	 * @param $key the option key
-	 * @param $value the value to set
-	 */
-	function setExtraCurlOption($key, $value) {
-		global $PHPCAS_CLIENT;
-		phpCAS :: traceBegin();
-		if (!is_object($PHPCAS_CLIENT)) {
-			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-		}
-		$PHPCAS_CLIENT->setExtraCurlOption($key, $value);
-		phpCAS :: traceEnd();
-	}
-
-}
-
-// ########################################################################
-// DOCUMENTATION
-// ########################################################################
-
-// ########################################################################
-//  MAIN PAGE
-
-/**
- * @mainpage
- *
- * The following pages only show the source documentation.
- *
- */
-
-// ########################################################################
-//  MODULES DEFINITION
-
-/** @defgroup public User interface */
-
-/** @defgroup publicInit Initialization
- *  @ingroup public */
-
-/** @defgroup publicAuth Authentication
- *  @ingroup public */
-
-/** @defgroup publicServices Access to external services
- *  @ingroup public */
-
-/** @defgroup publicConfig Configuration
- *  @ingroup public */
-
-/** @defgroup publicLang Internationalization
- *  @ingroup publicConfig */
-
-/** @defgroup publicOutput HTML output
- *  @ingroup publicConfig */
-
-/** @defgroup publicPGTStorage PGT storage
- *  @ingroup publicConfig */
-
-/** @defgroup publicDebug Debugging
- *  @ingroup public */
-
-/** @defgroup internal Implementation */
-
-/** @defgroup internalAuthentication Authentication
- *  @ingroup internal */
-
-/** @defgroup internalBasic CAS Basic client features (CAS 1.0, Service Tickets)
- *  @ingroup internal */
-
-/** @defgroup internalProxy CAS Proxy features (CAS 2.0, Proxy Granting Tickets)
- *  @ingroup internal */
-
-/** @defgroup internalPGTStorage PGT storage
- *  @ingroup internalProxy */
-
-/** @defgroup internalPGTStorageDB PGT storage in a database
- *  @ingroup internalPGTStorage */
-
-/** @defgroup internalPGTStorageFile PGT storage on the filesystem
- *  @ingroup internalPGTStorage */
-
-/** @defgroup internalCallback Callback from the CAS server
- *  @ingroup internalProxy */
-
-/** @defgroup internalProxied CAS proxied client features (CAS 2.0, Proxy Tickets)
- *  @ingroup internal */
-
-/** @defgroup internalConfig Configuration
- *  @ingroup internal */
-
-/** @defgroup internalOutput HTML output
- *  @ingroup internalConfig */
-
-/** @defgroup internalLang Internationalization
- *  @ingroup internalConfig
- *
- * To add a new language:
- * - 1. define a new constant PHPCAS_LANG_XXXXXX in CAS/CAS.php
- * - 2. copy any file from CAS/languages to CAS/languages/XXXXXX.php
- * - 3. Make the translations
- */
-
-/** @defgroup internalDebug Debugging
- *  @ingroup internal */
-
-/** @defgroup internalMisc Miscellaneous
- *  @ingroup internal */
-
-// ########################################################################
-//  EXAMPLES
-
-/**
- * @example example_simple.php
- */
-/**
- * @example example_proxy.php
- */
-/**
- * @example example_proxy2.php
- */
-/**
- * @example example_lang.php
- */
-/**
- * @example example_html.php
- */
-/**
- * @example example_file.php
- */
-/**
- * @example example_db.php
- */
-/**
- * @example example_service.php
- */
-/**
- * @example example_session_proxy.php
- */
-/**
- * @example example_session_service.php
- */
-/**
- * @example example_gateway.php
- */
-/**
- * @example example_custom_urls.php
- */
-?>

+ 0 - 214
main/auth/cas/lib/CAS/PGTStorage/pgt-db.php

@@ -1,214 +0,0 @@
-<?php
-/*
- * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
- *       Collaborative nor the names of its contributors may be used to endorse or
- *       promote products derived from this software without specific prior
- *       written permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file CAS/PGTStorage/pgt-db.php
- * Basic class for PGT database storage
- */
-
-/**
- * @class PGTStorageDB
- * The PGTStorageDB class is a class for PGT database storage. An instance of
- * this class is returned by CASClient::SetPGTStorageDB().
- *
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- *
- * @ingroup internalPGTStorageDB
- */
-
-class PGTStorageDB extends PGTStorage
-{
-  /**
-   * @addtogroup internalPGTStorageDB
-   * @{
-   */
-
-  /**
-   * a string representing a PEAR DB URL to connect to the database. Written by
-   * PGTStorageDB::PGTStorageDB(), read by getURL().
-   *
-   * @hideinitializer
-   * @private
-   */
-  var $_url='';
-
-  /**
-   * This method returns the PEAR DB URL to use to connect to the database.
-   *
-   * @return a PEAR DB URL
-   *
-   * @private
-   */
-  function getURL()
-    {
-      return $this->_url;
-    }
-
-  /**
-   * The handle of the connection to the database where PGT's are stored. Written by
-   * PGTStorageDB::init(), read by getLink().
-   *
-   * @hideinitializer
-   * @private
-   */
-  var $_link = null;
-
-  /**
-   * This method returns the handle of the connection to the database where PGT's are
-   * stored.
-   *
-   * @return a handle of connection.
-   *
-   * @private
-   */
-  function getLink()
-    {
-      return $this->_link;
-    }
-
-  /**
-   * The name of the table where PGT's are stored. Written by
-   * PGTStorageDB::PGTStorageDB(), read by getTable().
-   *
-   * @hideinitializer
-   * @private
-   */
-  var $_table = '';
-
-  /**
-   * This method returns the name of the table where PGT's are stored.
-   *
-   * @return the name of a table.
-   *
-   * @private
-   */
-  function getTable()
-    {
-      return $this->_table;
-    }
-
-  // ########################################################################
-  //  DEBUGGING
-  // ########################################################################
-
-  /**
-   * This method returns an informational string giving the type of storage
-   * used by the object (used for debugging purposes).
-   *
-   * @return an informational string.
-   * @public
-   */
-  function getStorageType()
-    {
-      return "database";
-    }
-
-  /**
-   * This method returns an informational string giving informations on the
-   * parameters of the storage.(used for debugging purposes).
-   *
-   * @public
-   */
-  function getStorageInfo()
-    {
-      return 'url=`'.$this->getURL().'\', table=`'.$this->getTable().'\'';
-    }
-
-  // ########################################################################
-  //  CONSTRUCTOR
-  // ########################################################################
-
-  /**
-   * The class constructor, called by CASClient::SetPGTStorageDB().
-   *
-   * @param $cas_parent the CASClient instance that creates the object.
-   * @param $user the user to access the data with
-   * @param $password the user's password
-   * @param $database_type the type of the database hosting the data
-   * @param $hostname the server hosting the database
-   * @param $port the port the server is listening on
-   * @param $database the name of the database
-   * @param $table the name of the table storing the data
-   *
-   * @public
-   */
-  function PGTStorageDB($cas_parent,$user,$password,$database_type,$hostname,$port,$database,$table)
-    {
-      phpCAS::traceBegin();
-
-      // call the ancestor's constructor
-      $this->PGTStorage($cas_parent);
-
-      if ( empty($database_type) ) $database_type = CAS_PGT_STORAGE_DB_DEFAULT_DATABASE_TYPE;
-      if ( empty($hostname) ) $hostname = CAS_PGT_STORAGE_DB_DEFAULT_HOSTNAME;
-      if ( $port==0 ) $port = CAS_PGT_STORAGE_DB_DEFAULT_PORT;
-      if ( empty($database) ) $database = CAS_PGT_STORAGE_DB_DEFAULT_DATABASE;
-      if ( empty($table) ) $table = CAS_PGT_STORAGE_DB_DEFAULT_TABLE;
-
-      // build and store the PEAR DB URL
-      $this->_url = $database_type.':'.'//'.$user.':'.$password.'@'.$hostname.':'.$port.'/'.$database;
-
-      // XXX should use setURL and setTable
-      phpCAS::traceEnd();
-    }
-
-  // ########################################################################
-  //  INITIALIZATION
-  // ########################################################################
-
-  /**
-   * This method is used to initialize the storage. Halts on error.
-   *
-   * @public
-   */
-  function init()
-    {
-      phpCAS::traceBegin();
-      // if the storage has already been initialized, return immediatly
-      if ( $this->isInitialized() )
-		return;
-      // call the ancestor's method (mark as initialized)
-      parent::init();
-
-	  //include phpDB library (the test was introduced in release 0.4.8 for
-	  //the integration into Tikiwiki).
-	  if (!class_exists('DB')) {
-		include_once('DB.php');
-	  }
-
-      // try to connect to the database
-      $this->_link = DB::connect($this->getURL());
-      if ( DB::isError($this->_link) ) {
-	    phpCAS::error('could not connect to database ('.DB::errorMessage($this->_link).')');
-      }
-
-      phpCAS::traceBEnd();
-    }
-}

+ 0 - 276
main/auth/cas/lib/CAS/PGTStorage/pgt-file.php

@@ -1,276 +0,0 @@
-<?php
-/*
- * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
- *       Collaborative nor the names of its contributors may be used to endorse or
- *       promote products derived from this software without specific prior
- *       written permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * @file CAS/PGTStorage/pgt-file.php
- * Basic class for PGT file storage
- */
-
-/**
- * @class PGTStorageFile
- * The PGTStorageFile class is a class for PGT file storage. An instance of 
- * this class is returned by CASClient::SetPGTStorageFile().
- *
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- *
- * @ingroup internalPGTStorageFile
- */
-
-class PGTStorageFile extends PGTStorage
-{
-  /** 
-   * @addtogroup internalPGTStorageFile 
-   * @{ 
-   */
-
-  /**
-   * a string telling where PGT's should be stored on the filesystem. Written by
-   * PGTStorageFile::PGTStorageFile(), read by getPath().
-   *
-   * @private
-   */
-  var $_path;
-
-  /**
-   * This method returns the name of the directory where PGT's should be stored 
-   * on the filesystem.
-   *
-   * @return the name of a directory (with leading and trailing '/')
-   *
-   * @private
-   */
-  function getPath()
-    {
-      return $this->_path;
-    }
-
-  /**
-   * a string telling the format to use to store PGT's (plain or xml). Written by
-   * PGTStorageFile::PGTStorageFile(), read by getFormat().
-   *
-   * @private
-   */
-  var $_format;
-
-  /**
-   * This method returns the format to use when storing PGT's on the filesystem.
-   *
-   * @return a string corresponding to the format used (plain or xml).
-   *
-   * @private
-   */
-  function getFormat()
-    {
-      return $this->_format;
-    }
-
-  // ########################################################################
-  //  DEBUGGING
-  // ########################################################################
-  
-  /**
-   * This method returns an informational string giving the type of storage
-   * used by the object (used for debugging purposes).
-   *
-   * @return an informational string.
-   * @public
-   */
-  function getStorageType()
-    {
-      return "file";
-    }
-
-  /**
-   * This method returns an informational string giving informations on the
-   * parameters of the storage.(used for debugging purposes).
-   *
-   * @return an informational string.
-   * @public
-   */
-  function getStorageInfo()
-    {
-      return 'path=`'.$this->getPath().'\', format=`'.$this->getFormat().'\'';
-    }
-
-  // ########################################################################
-  //  CONSTRUCTOR
-  // ########################################################################
-  
-  /**
-   * The class constructor, called by CASClient::SetPGTStorageFile().
-   *
-   * @param $cas_parent the CASClient instance that creates the object.
-   * @param $format the format used to store the PGT's (`plain' and `xml' allowed).
-   * @param $path the path where the PGT's should be stored
-   *
-   * @public
-   */
-  function PGTStorageFile($cas_parent,$format,$path)
-    {
-      phpCAS::traceBegin();
-      // call the ancestor's constructor
-      $this->PGTStorage($cas_parent);
-
-      if (empty($format) ) $format = CAS_PGT_STORAGE_FILE_DEFAULT_FORMAT;
-      if (empty($path) ) $path = CAS_PGT_STORAGE_FILE_DEFAULT_PATH;
-
-      // check that the path is an absolute path
-      if (getenv("OS")=="Windows_NT"){
-      	
-      	 if (!preg_match('`^[a-zA-Z]:`', $path)) {
-	     	phpCAS::error('an absolute path is needed for PGT storage to file');
-      	}
-      	
-      }
-      else
-      {
-      
-      	if ( $path[0] != '/' ) {
-			phpCAS::error('an absolute path is needed for PGT storage to file');
-      	}
-
-      	// store the path (with a leading and trailing '/')      
-      	$path = preg_replace('|[/]*$|','/',$path);
-      	$path = preg_replace('|^[/]*|','/',$path);
-      }
-      
-      $this->_path = $path;
-      // check the format and store it
-      switch ($format) {
-      case CAS_PGT_STORAGE_FILE_FORMAT_PLAIN:
-      case CAS_PGT_STORAGE_FILE_FORMAT_XML:
-	$this->_format = $format;
-	break;
-      default:
-	phpCAS::error('unknown PGT file storage format (`'.CAS_PGT_STORAGE_FILE_FORMAT_PLAIN.'\' and `'.CAS_PGT_STORAGE_FILE_FORMAT_XML.'\' allowed)');
-      }
-      phpCAS::traceEnd();      
-    }
-
-  // ########################################################################
-  //  INITIALIZATION
-  // ########################################################################
-  
-  /**
-   * This method is used to initialize the storage. Halts on error.
-   *
-   * @public
-   */
-  function init()
-    {
-      phpCAS::traceBegin();
-      // if the storage has already been initialized, return immediatly
-      if ( $this->isInitialized() )
-	return;
-      // call the ancestor's method (mark as initialized)
-      parent::init();
-      phpCAS::traceEnd();      
-    }
-
-  // ########################################################################
-  //  PGT I/O
-  // ########################################################################
-
-  /**
-   * This method returns the filename corresponding to a PGT Iou.
-   *
-   * @param $pgt_iou the PGT iou.
-   *
-   * @return a filename
-   * @private
-   */
-  function getPGTIouFilename($pgt_iou)
-    {
-      phpCAS::traceBegin();
-      $filename = $this->getPath().$pgt_iou.'.'.$this->getFormat();
-      phpCAS::traceEnd($filename);
-      return $filename;
-    }
-  
-  /**
-   * This method stores a PGT and its corresponding PGT Iou into a file. Echoes a
-   * warning on error.
-   *
-   * @param $pgt the PGT
-   * @param $pgt_iou the PGT iou
-   *
-   * @public
-   */
-  function write($pgt,$pgt_iou)
-    {
-      phpCAS::traceBegin();
-      $fname = $this->getPGTIouFilename($pgt_iou);
-      if ( $f=fopen($fname,"w") ) {
-	if ( fputs($f,$pgt) === FALSE ) {
-	  phpCAS::error('could not write PGT to `'.$fname.'\'');
-	}
-	fclose($f);
-      } else {
-	phpCAS::error('could not open `'.$fname.'\'');
-      }
-      phpCAS::traceEnd();      
-    }
-
-  /**
-   * This method reads a PGT corresponding to a PGT Iou and deletes the 
-   * corresponding file.
-   *
-   * @param $pgt_iou the PGT iou
-   *
-   * @return the corresponding PGT, or FALSE on error
-   *
-   * @public
-   */
-  function read($pgt_iou)
-    {
-      phpCAS::traceBegin();
-      $pgt = FALSE;
-      $fname = $this->getPGTIouFilename($pgt_iou);
-      if ( !($f=fopen($fname,"r")) ) {
-	phpCAS::trace('could not open `'.$fname.'\'');
-      } else {
-	if ( ($pgt=fgets($f)) === FALSE ) {
-	  phpCAS::trace('could not read PGT from `'.$fname.'\'');
-	} 
-	fclose($f);
-      }
-
-      // delete the PGT file
-      @unlink($fname);
-
-      phpCAS::traceEnd($pgt);
-      return $pgt;
-    }
-  
-  /** @} */
-  
-}
-
-  
-?>

+ 0 - 215
main/auth/cas/lib/CAS/PGTStorage/pgt-main.php

@@ -1,215 +0,0 @@
-<?php
-/*
- * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
- *       Collaborative nor the names of its contributors may be used to endorse or
- *       promote products derived from this software without specific prior
- *       written permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * @file CAS/PGTStorage/pgt-main.php
- * Basic class for PGT storage
- */
-
-/**
- * @class PGTStorage
- * The PGTStorage class is a generic class for PGT storage. This class should
- * not be instanciated itself but inherited by specific PGT storage classes.
- *
- * @author   Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- *
- * @ingroup internalPGTStorage
- */
-
-class PGTStorage
-{
-  /** 
-   * @addtogroup internalPGTStorage
-   * @{ 
-   */
-
-  // ########################################################################
-  //  CONSTRUCTOR
-  // ########################################################################
-  
-  /**
-   * The constructor of the class, should be called only by inherited classes.
-   *
-   * @param $cas_parent the CASclient instance that creates the current object.
-   *
-   * @protected
-   */
-  function PGTStorage($cas_parent)
-    {
-      phpCAS::traceBegin();
-      if ( !$cas_parent->isProxy() ) {
-	phpCAS::error('defining PGT storage makes no sense when not using a CAS proxy'); 
-      }
-      phpCAS::traceEnd();
-    }
-
-  // ########################################################################
-  //  DEBUGGING
-  // ########################################################################
-  
-  /**
-   * This virtual method returns an informational string giving the type of storage
-   * used by the object (used for debugging purposes).
-   *
-   * @public
-   */
-  function getStorageType()
-    {
-      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); 
-    }
-
-  /**
-   * This virtual method returns an informational string giving informations on the
-   * parameters of the storage.(used for debugging purposes).
-   *
-   * @public
-   */
-  function getStorageInfo()
-    {
-      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); 
-    }
-
-  // ########################################################################
-  //  ERROR HANDLING
-  // ########################################################################
-  
-  /**
-   * string used to store an error message. Written by PGTStorage::setErrorMessage(),
-   * read by PGTStorage::getErrorMessage().
-   *
-   * @hideinitializer
-   * @private
-   * @deprecated not used.
-   */
-  var $_error_message=FALSE;
-
-  /**
-   * This method sets en error message, which can be read later by 
-   * PGTStorage::getErrorMessage().
-   *
-   * @param $error_message an error message
-   *
-   * @protected
-   * @deprecated not used.
-   */
-  function setErrorMessage($error_message)
-    {
-      $this->_error_message = $error_message;
-    }
-
-  /**
-   * This method returns an error message set by PGTStorage::setErrorMessage().
-   *
-   * @return an error message when set by PGTStorage::setErrorMessage(), FALSE
-   * otherwise.
-   *
-   * @public
-   * @deprecated not used.
-   */
-  function getErrorMessage()
-    {
-      return $this->_error_message;
-    }
-
-  // ########################################################################
-  //  INITIALIZATION
-  // ########################################################################
-
-  /**
-   * a boolean telling if the storage has already been initialized. Written by 
-   * PGTStorage::init(), read by PGTStorage::isInitialized().
-   *
-   * @hideinitializer
-   * @private
-   */
-  var $_initialized = FALSE;
-
-  /**
-   * This method tells if the storage has already been intialized.
-   *
-   * @return a boolean
-   *
-   * @protected
-   */
-  function isInitialized()
-    {
-      return $this->_initialized;
-    }
-
-  /**
-   * This virtual method initializes the object.
-   *
-   * @protected
-   */
-  function init()
-    {
-      $this->_initialized = TRUE;
-    }
-
-  // ########################################################################
-  //  PGT I/O
-  // ########################################################################
-
-  /**
-   * This virtual method stores a PGT and its corresponding PGT Iuo.
-   * @note Should never be called.
-   *
-   * @param $pgt the PGT
-   * @param $pgt_iou the PGT iou
-   *
-   * @protected
-   */
-  function write($pgt,$pgt_iou)
-    {
-      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); 
-    }
-
-  /**
-   * This virtual method reads a PGT corresponding to a PGT Iou and deletes
-   * the corresponding storage entry.
-   * @note Should never be called.
-   *
-   * @param $pgt_iou the PGT iou
-   *
-   * @protected
-   */
-  function read($pgt_iou)
-    {
-      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); 
-    }
-
-  /** @} */
-  
-} 
-
-// include specific PGT storage classes
-include_once(dirname(__FILE__).'/pgt-file.php'); 
-include_once(dirname(__FILE__).'/pgt-db.php');
-  
-?>

+ 0 - 2700
main/auth/cas/lib/CAS/client.php

@@ -1,2700 +0,0 @@
-<?php
-
-/*
- * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
- *       Collaborative nor the names of its contributors may be used to endorse or
- *       promote products derived from this software without specific prior
- *       written permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file CAS/client.php
- * Main class of the phpCAS library
- */
-
-// include internationalization stuff
-include_once(dirname(__FILE__).'/languages/languages.php');
-
-// include PGT storage classes
-include_once(dirname(__FILE__).'/PGTStorage/pgt-main.php');
-
-/**
- * @class CASClient
- * The CASClient class is a client interface that provides CAS authentication
- * to PHP applications.
- *
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- */
-
-class CASClient
-{
-	
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	// XX                                                                    XX
-	// XX                          CONFIGURATION                             XX
-	// XX                                                                    XX
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	
-	// ########################################################################
-	//  HTML OUTPUT
-	// ########################################################################
-	/**
-	 * @addtogroup internalOutput
-	 * @{
-	 */  
-	
-	/**
-	 * This method filters a string by replacing special tokens by appropriate values
-	 * and prints it. The corresponding tokens are taken into account:
-	 * - __CAS_VERSION__
-	 * - __PHPCAS_VERSION__
-	 * - __SERVER_BASE_URL__
-	 *
-	 * Used by CASClient::PrintHTMLHeader() and CASClient::printHTMLFooter().
-	 *
-	 * @param $str the string to filter and output
-	 *
-	 * @private
-	 */
-	function HTMLFilterOutput($str)
-		{
-		$str = str_replace('__CAS_VERSION__',$this->getServerVersion(),$str);
-		$str = str_replace('__PHPCAS_VERSION__',phpCAS::getVersion(),$str);
-		$str = str_replace('__SERVER_BASE_URL__',$this->getServerBaseURL(),$str);
-		echo $str;
-		}
-	
-	/**
-	 * A string used to print the header of HTML pages. Written by CASClient::setHTMLHeader(),
-	 * read by CASClient::printHTMLHeader().
-	 *
-	 * @hideinitializer
-	 * @private
-	 * @see CASClient::setHTMLHeader, CASClient::printHTMLHeader()
-	 */
-	var $_output_header = '';
-	
-	/**
-	 * This method prints the header of the HTML output (after filtering). If
-	 * CASClient::setHTMLHeader() was not used, a default header is output.
-	 *
-	 * @param $title the title of the page
-	 *
-	 * @see HTMLFilterOutput()
-	 * @private
-	 */
-	function printHTMLHeader($title)
-		{
-		$this->HTMLFilterOutput(str_replace('__TITLE__',
-			$title,
-			(empty($this->_output_header)
-					? '<html><head><title>__TITLE__</title></head><body><h1>__TITLE__</h1>'
-							: $this->_output_header)
-		)
-		);
-		}
-	
-	/**
-	 * A string used to print the footer of HTML pages. Written by CASClient::setHTMLFooter(),
-	 * read by printHTMLFooter().
-	 *
-	 * @hideinitializer
-	 * @private
-	 * @see CASClient::setHTMLFooter, CASClient::printHTMLFooter()
-	 */
-	var $_output_footer = '';
-	
-	/**
-	 * This method prints the footer of the HTML output (after filtering). If
-	 * CASClient::setHTMLFooter() was not used, a default footer is output.
-	 *
-	 * @see HTMLFilterOutput()
-	 * @private
-	 */
-	function printHTMLFooter()
-		{
-		$this->HTMLFilterOutput(empty($this->_output_footer)
-			?('<hr><address>phpCAS __PHPCAS_VERSION__ '.$this->getString(CAS_STR_USING_SERVER).' <a href="__SERVER_BASE_URL__">__SERVER_BASE_URL__</a> (CAS __CAS_VERSION__)</a></address></body></html>')
-					:$this->_output_footer);
-		}
-	
-	/**
-	 * This method set the HTML header used for all outputs.
-	 *
-	 * @param $header the HTML header.
-	 *
-	 * @public
-	 */
-	function setHTMLHeader($header)
-		{
-		$this->_output_header = $header;
-		}
-	
-	/**
-	 * This method set the HTML footer used for all outputs.
-	 *
-	 * @param $footer the HTML footer.
-	 *
-	 * @public
-	 */
-	function setHTMLFooter($footer)
-		{
-		$this->_output_footer = $footer;
-		}
-	
-	/** @} */
-	// ########################################################################
-	//  INTERNATIONALIZATION
-	// ########################################################################
-	/**
-	 * @addtogroup internalLang
-	 * @{
-	 */  
-	/**
-	 * A string corresponding to the language used by phpCAS. Written by 
-	 * CASClient::setLang(), read by CASClient::getLang().
-	 
-	 * @note debugging information is always in english (debug purposes only).
-	 *
-	 * @hideinitializer
-	 * @private
-	 * @sa CASClient::_strings, CASClient::getString()
-	 */
-	var $_lang = '';
-	
-	/**
-	 * This method returns the language used by phpCAS.
-	 *
-	 * @return a string representing the language
-	 *
-	 * @private
-	 */
-	function getLang()
-		{
-		if ( empty($this->_lang) )
-			$this->setLang(PHPCAS_LANG_DEFAULT);
-		return $this->_lang;
-		}
-	
-	/**
-	 * array containing the strings used by phpCAS. Written by CASClient::setLang(), read by 
-	 * CASClient::getString() and used by CASClient::setLang().
-	 *
-	 * @note This array is filled by instructions in CAS/languages/<$this->_lang>.php
-	 *
-	 * @private
-	 * @see CASClient::_lang, CASClient::getString(), CASClient::setLang(), CASClient::getLang()
-	 */
-	var $_strings;
-	
-	/**
-	 * This method returns a string depending on the language.
-	 *
-	 * @param $str the index of the string in $_string.
-	 *
-	 * @return the string corresponding to $index in $string.
-	 *
-	 * @private
-	 */
-	function getString($str)
-		{
-		// call CASclient::getLang() to be sure the language is initialized
-		$this->getLang();
-		
-		if ( !isset($this->_strings[$str]) ) {
-			trigger_error('string `'.$str.'\' not defined for language `'.$this->getLang().'\'',E_USER_ERROR);
-		}
-		return $this->_strings[$str];
-		}
-	
-	/**
-	 * This method is used to set the language used by phpCAS. 
-	 * @note Can be called only once.
-	 *
-	 * @param $lang a string representing the language.
-	 *
-	 * @public
-	 * @sa CAS_LANG_FRENCH, CAS_LANG_ENGLISH
-	 */
-	function setLang($lang)
-		{
-		// include the corresponding language file
-		include_once(dirname(__FILE__).'/languages/'.$lang.'.php');
-		
-		if ( !is_array($this->_strings) ) {
-			trigger_error('language `'.$lang.'\' is not implemented',E_USER_ERROR);
-		}
-		$this->_lang = $lang;
-		}
-	
-	/** @} */
-	// ########################################################################
-	//  CAS SERVER CONFIG
-	// ########################################################################
-	/**
-	 * @addtogroup internalConfig
-	 * @{
-	 */  
-	
-	/**
-	 * a record to store information about the CAS server.
-	 * - $_server["version"]: the version of the CAS server
-	 * - $_server["hostname"]: the hostname of the CAS server
-	 * - $_server["port"]: the port the CAS server is running on
-	 * - $_server["uri"]: the base URI the CAS server is responding on
-	 * - $_server["base_url"]: the base URL of the CAS server
-	 * - $_server["login_url"]: the login URL of the CAS server
-	 * - $_server["service_validate_url"]: the service validating URL of the CAS server
-	 * - $_server["proxy_url"]: the proxy URL of the CAS server
-	 * - $_server["proxy_validate_url"]: the proxy validating URL of the CAS server
-	 * - $_server["logout_url"]: the logout URL of the CAS server
-	 *
-	 * $_server["version"], $_server["hostname"], $_server["port"] and $_server["uri"]
-	 * are written by CASClient::CASClient(), read by CASClient::getServerVersion(), 
-	 * CASClient::getServerHostname(), CASClient::getServerPort() and CASClient::getServerURI().
-	 *
-	 * The other fields are written and read by CASClient::getServerBaseURL(), 
-	 * CASClient::getServerLoginURL(), CASClient::getServerServiceValidateURL(), 
-	 * CASClient::getServerProxyValidateURL() and CASClient::getServerLogoutURL().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_server = array(
-		'version' => -1,
-		'hostname' => 'none',
-		'port' => -1,
-		'uri' => 'none'
-	);
-	
-	/**
-	 * This method is used to retrieve the version of the CAS server.
-	 * @return the version of the CAS server.
-	 * @private
-	 */
-	function getServerVersion()
-		{ 
-		return $this->_server['version']; 
-		}
-	
-	/**
-	 * This method is used to retrieve the hostname of the CAS server.
-	 * @return the hostname of the CAS server.
-	 * @private
-	 */
-	function getServerHostname()
-		{ return $this->_server['hostname']; }
-	
-	/**
-	 * This method is used to retrieve the port of the CAS server.
-	 * @return the port of the CAS server.
-	 * @private
-	 */
-	function getServerPort()
-		{ return $this->_server['port']; }
-	
-	/**
-	 * This method is used to retrieve the URI of the CAS server.
-	 * @return a URI.
-	 * @private
-	 */
-	function getServerURI()
-		{ return $this->_server['uri']; }
-	
-	/**
-	 * This method is used to retrieve the base URL of the CAS server.
-	 * @return a URL.
-	 * @private
-	 */
-	function getServerBaseURL()
-		{ 
-		// the URL is build only when needed
-		if ( empty($this->_server['base_url']) ) {
-			$this->_server['base_url'] = 'https://'
-				.$this->getServerHostname()
-				.':'
-				.$this->getServerPort()
-				.$this->getServerURI();
-		}
-		return $this->_server['base_url']; 
-		}
-	
-	/**
-	 * This method is used to retrieve the login URL of the CAS server.
-	 * @param $gateway true to check authentication, false to force it
-	 * @param $renew true to force the authentication with the CAS server
-	 * NOTE : It is recommended that CAS implementations ignore the
-	 "gateway" parameter if "renew" is set
-	 * @return a URL.
-	 * @private
-	 */
-	function getServerLoginURL($gateway=false,$renew=false) {
-		phpCAS::traceBegin();
-		// the URL is build only when needed
-		if ( empty($this->_server['login_url']) ) {
-			$this->_server['login_url'] = $this->getServerBaseURL();
-			$this->_server['login_url'] .= 'login?service=';
-			// $this->_server['login_url'] .= preg_replace('/&/','%26',$this->getURL());
-			$this->_server['login_url'] .= urlencode($this->getURL());
-			if($renew) {
-				// It is recommended that when the "renew" parameter is set, its value be "true"
-				$this->_server['login_url'] .= '&renew=true';
-			} elseif ($gateway) {
-				// It is recommended that when the "gateway" parameter is set, its value be "true"
-				$this->_server['login_url'] .= '&gateway=true';
-			}
-		}
-		phpCAS::traceEnd($this->_server['login_url']);
-		return $this->_server['login_url'];
-	} 
-	
-	/**
-	 * This method sets the login URL of the CAS server.
-	 * @param $url the login URL
-	 * @private
-	 * @since 0.4.21 by Wyman Chan
-	 */
-	function setServerLoginURL($url)
-		{
-		return $this->_server['login_url'] = $url;
-		}
-	
-	
-	/**
-	 * This method sets the serviceValidate URL of the CAS server.
-	 * @param $url the serviceValidate URL
-	 * @private
-	 * @since 1.1.0 by Joachim Fritschi
-	 */
-	function setServerServiceValidateURL($url)
-		{
-		return $this->_server['service_validate_url'] = $url;
-		}
-	
-	
-	/**
-	 * This method sets the proxyValidate URL of the CAS server.
-	 * @param $url the proxyValidate URL
-	 * @private
-	 * @since 1.1.0 by Joachim Fritschi
-	 */
-	function setServerProxyValidateURL($url)
-		{
-		return $this->_server['proxy_validate_url'] = $url;
-		}
-	
-	
-	/**
-	 * This method sets the samlValidate URL of the CAS server.
-	 * @param $url the samlValidate URL
-	 * @private
-	 * @since 1.1.0 by Joachim Fritschi
-	 */
-	function setServerSamlValidateURL($url)
-		{
-		return $this->_server['saml_validate_url'] = $url;
-		}
-	
-	
-	/**
-	 * This method is used to retrieve the service validating URL of the CAS server.
-	 * @return a URL.
-	 * @private
-	 */
-	function getServerServiceValidateURL()
-		{ 
-		// the URL is build only when needed
-		if ( empty($this->_server['service_validate_url']) ) {
-			switch ($this->getServerVersion()) {
-				case CAS_VERSION_1_0:
-					$this->_server['service_validate_url'] = $this->getServerBaseURL().'validate';
-					break;
-				case CAS_VERSION_2_0:
-					$this->_server['service_validate_url'] = $this->getServerBaseURL().'serviceValidate';
-					break;
-			}
-		}
-		//      return $this->_server['service_validate_url'].'?service='.preg_replace('/&/','%26',$this->getURL()); 
-		return $this->_server['service_validate_url'].'?service='.urlencode($this->getURL()); 
-		}
-	/**
-	 * This method is used to retrieve the SAML validating URL of the CAS server.
-	 * @return a URL.
-	 * @private
-	 */
-	function getServerSamlValidateURL()
-		{
-		phpCAS::traceBegin();
-		// the URL is build only when needed
-		if ( empty($this->_server['saml_validate_url']) ) {
-			switch ($this->getServerVersion()) {
-				case SAML_VERSION_1_1:
-					$this->_server['saml_validate_url'] = $this->getServerBaseURL().'samlValidate';
-					break;
-			}
-		}
-		phpCAS::traceEnd($this->_server['saml_validate_url'].'?TARGET='.urlencode($this->getURL()));
-		return $this->_server['saml_validate_url'].'?TARGET='.urlencode($this->getURL());
-		}
-	/**
-	 * This method is used to retrieve the proxy validating URL of the CAS server.
-	 * @return a URL.
-	 * @private
-	 */
-	function getServerProxyValidateURL()
-		{ 
-		// the URL is build only when needed
-		if ( empty($this->_server['proxy_validate_url']) ) {
-			switch ($this->getServerVersion()) {
-				case CAS_VERSION_1_0:
-					$this->_server['proxy_validate_url'] = '';
-					break;
-				case CAS_VERSION_2_0:
-					$this->_server['proxy_validate_url'] = $this->getServerBaseURL().'proxyValidate';
-					break;
-			}
-		}
-		//      return $this->_server['proxy_validate_url'].'?service='.preg_replace('/&/','%26',$this->getURL()); 
-		return $this->_server['proxy_validate_url'].'?service='.urlencode($this->getURL()); 
-		}
-	
-	/**
-	 * This method is used to retrieve the proxy URL of the CAS server.
-	 * @return a URL.
-	 * @private
-	 */
-	function getServerProxyURL()
-		{ 
-		// the URL is build only when needed
-		if ( empty($this->_server['proxy_url']) ) {
-			switch ($this->getServerVersion()) {
-				case CAS_VERSION_1_0:
-					$this->_server['proxy_url'] = '';
-					break;
-				case CAS_VERSION_2_0:
-					$this->_server['proxy_url'] = $this->getServerBaseURL().'proxy';
-					break;
-			}
-		}
-		return $this->_server['proxy_url']; 
-		}
-	
-	/**
-	 * This method is used to retrieve the logout URL of the CAS server.
-	 * @return a URL.
-	 * @private
-	 */
-	function getServerLogoutURL()
-		{ 
-		// the URL is build only when needed
-		if ( empty($this->_server['logout_url']) ) {
-			$this->_server['logout_url'] = $this->getServerBaseURL().'logout';
-		}
-		return $this->_server['logout_url']; 
-		}
-	
-	/**
-	 * This method sets the logout URL of the CAS server.
-	 * @param $url the logout URL
-	 * @private
-	 * @since 0.4.21 by Wyman Chan
-	 */
-	function setServerLogoutURL($url)
-		{
-		return $this->_server['logout_url'] = $url;
-		}
-	
-	/**
-	 * An array to store extra curl options.
-	 */	
-	var $_curl_options = array();
-	
-	/**
-	 * This method is used to set additional user curl options.
-	 */
-	function setExtraCurlOption($key, $value)
-		{
-		$this->_curl_options[$key] = $value;
-		}
-	
-	/**
-	 * This method checks to see if the request is secured via HTTPS
-	 * @return true if https, false otherwise
-	 * @private
-	 */
-	function isHttps() {
-		//if ( isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ) {
-		//0.4.24 by Hinnack
-		if ( isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
-			return true;
-		} else {
-			return false;
-		}
-	}
-	
-	// ########################################################################
-	//  CONSTRUCTOR
-	// ########################################################################
-	/**
-	 * CASClient constructor.
-	 *
-	 * @param $server_version the version of the CAS server
-	 * @param $proxy TRUE if the CAS client is a CAS proxy, FALSE otherwise
-	 * @param $server_hostname the hostname of the CAS server
-	 * @param $server_port the port the CAS server is running on
-	 * @param $server_uri the URI the CAS server is responding on
-	 * @param $start_session Have phpCAS start PHP sessions (default true)
-	 *
-	 * @return a newly created CASClient object
-	 *
-	 * @public
-	 */
-	function CASClient(
-					   $server_version,
-					   $proxy,
-					   $server_hostname,
-					   $server_port,
-					   $server_uri,
-					   $start_session = true) {
-		
-		phpCAS::traceBegin();
-		
-		// the redirect header() call and DOM parsing code from domxml-php4-php5.php won't work in PHP4 compatibility mode
-		if (version_compare(PHP_VERSION,'5','>=') && ini_get('zend.ze1_compatibility_mode')) {
-			phpCAS::error('phpCAS cannot support zend.ze1_compatibility_mode. Sorry.');
-		}
-		// skip Session Handling for logout requests and if don't want it'
-		if ($start_session && !$this->isLogoutRequest()) {
-			phpCAS::trace("Starting session handling");
-			// Check for Tickets from the CAS server
-			if (empty($_GET['ticket'])){
-				phpCAS::trace("No ticket found");
-				// only create a session if necessary
-				if (!session_id()) {
-					phpCAS::trace("No session found, creating new session");
-					session_start();
-				}
-			}else{
-				phpCAS::trace("Ticket found");
-				// We have to copy any old data before renaming the session
-				if (session_id()) {
-					phpCAS::trace("Old active session found, saving old data and destroying session");
-					$old_session = $_SESSION;
-					session_destroy();	
-				}else{
-					session_start();
-					phpCAS::trace("Starting possible old session to copy variables");
-					$old_session = $_SESSION;
-					session_destroy();	
-				}
-				// set up a new session, of name based on the ticket
-				$session_id = preg_replace('/[^\w]/','',$_GET['ticket']);
-				phpCAS::LOG("Session ID: " . $session_id);
-				session_id($session_id);
-				session_start();
-				// restore old session vars
-				if(isset($old_session)){
-					phpCAS::trace("Restoring old session vars");
-					$_SESSION = $old_session;
-				}
-			}
-		}else{
-			phpCAS::trace("Skipping session creation");
-		}
-		
-		
-		// are we in proxy mode ?
-		$this->_proxy = $proxy;
-		
-		//check version
-		switch ($server_version) {
-			case CAS_VERSION_1_0:
-				if ( $this->isProxy() )
-					phpCAS::error('CAS proxies are not supported in CAS '
-						.$server_version);
-				break;
-			case CAS_VERSION_2_0:
-				break;
-			case SAML_VERSION_1_1:
-				break;
-			default:
-				phpCAS::error('this version of CAS (`'
-					.$server_version
-					.'\') is not supported by phpCAS '
-					.phpCAS::getVersion());
-		}
-		$this->_server['version'] = $server_version;
-		
-		// check hostname
-		if ( empty($server_hostname) 
-				|| !preg_match('/[\.\d\-abcdefghijklmnopqrstuvwxyz]*/',$server_hostname) ) {
-			phpCAS::error('bad CAS server hostname (`'.$server_hostname.'\')');
-		}
-		$this->_server['hostname'] = $server_hostname;
-		
-		// check port
-		if ( $server_port == 0 
-			|| !is_int($server_port) ) {
-			phpCAS::error('bad CAS server port (`'.$server_hostname.'\')');
-		}
-		$this->_server['port'] = $server_port;
-		
-		// check URI
-		if ( !preg_match('/[\.\d\-_abcdefghijklmnopqrstuvwxyz\/]*/',$server_uri) ) {
-			phpCAS::error('bad CAS server URI (`'.$server_uri.'\')');
-		}
-		// add leading and trailing `/' and remove doubles      
-		$server_uri = preg_replace('/\/\//','/','/'.$server_uri.'/');
-		$this->_server['uri'] = $server_uri;
-		
-		// set to callback mode if PgtIou and PgtId CGI GET parameters are provided 
-		if ( $this->isProxy() ) {
-			$this->setCallbackMode(!empty($_GET['pgtIou'])&&!empty($_GET['pgtId']));
-		}
-		
-		if ( $this->isCallbackMode() ) {
-			//callback mode: check that phpCAS is secured
-			if ( !$this->isHttps() ) {
-				phpCAS::error('CAS proxies must be secured to use phpCAS; PGT\'s will not be received from the CAS server');
-			}
-		} else {
-			//normal mode: get ticket and remove it from CGI parameters for developpers
-			$ticket = (isset($_GET['ticket']) ? $_GET['ticket'] : null);
-			switch ($this->getServerVersion()) {
-				case CAS_VERSION_1_0: // check for a Service Ticket
-					if( preg_match('/^ST-/',$ticket) ) {
-						phpCAS::trace('ST \''.$ticket.'\' found');
-						//ST present
-						$this->setST($ticket);
-						//ticket has been taken into account, unset it to hide it to applications
-						unset($_GET['ticket']);
-					} else if ( !empty($ticket) ) {
-						//ill-formed ticket, halt
-						phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
-					}
-					break;
-				case CAS_VERSION_2_0: // check for a Service or Proxy Ticket
-					if( preg_match('/^[SP]T-/',$ticket) ) {
-						phpCAS::trace('ST or PT \''.$ticket.'\' found');
-						$this->setPT($ticket);
-						unset($_GET['ticket']);
-					} else if ( !empty($ticket) ) {
-						//ill-formed ticket, halt
-						phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
-					} 
-					break;
-				case SAML_VERSION_1_1: // SAML just does Service Tickets
-					if( preg_match('/^[SP]T-/',$ticket) ) {
-						phpCAS::trace('SA \''.$ticket.'\' found');
-						$this->setSA($ticket);
-						unset($_GET['ticket']);
-					} else if ( !empty($ticket) ) {
-						//ill-formed ticket, halt
-						phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
-					}
-					break;
-			}
-		}
-		phpCAS::traceEnd();
-	}
-	
-	/** @} */
-	
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	// XX                                                                    XX
-	// XX                           AUTHENTICATION                           XX
-	// XX                                                                    XX
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	
-	/**
-	 * @addtogroup internalAuthentication
-	 * @{
-	 */  
-	
-	/**
-	 * The Authenticated user. Written by CASClient::setUser(), read by CASClient::getUser().
-	 * @attention client applications should use phpCAS::getUser().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_user = '';
-	
-	/**
-	 * This method sets the CAS user's login name.
-	 *
-	 * @param $user the login name of the authenticated user.
-	 *
-	 * @private
-	 */
-	function setUser($user)
-		{
-		$this->_user = $user;
-		}
-	
-	/**
-	 * This method returns the CAS user's login name.
-	 * @warning should be called only after CASClient::forceAuthentication() or 
-	 * CASClient::isAuthenticated(), otherwise halt with an error.
-	 *
-	 * @return the login name of the authenticated user
-	 */
-	function getUser()
-		{
-		if ( empty($this->_user) ) {
-			phpCAS::error('this method should be used only after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');
-		}
-		return $this->_user;
-		}
-	
-	
-	
-	/***********************************************************************************************************************
-	 * Atrributes section
-	 * 
-	 * @author Matthias Crauwels <matthias.crauwels@ugent.be>, Ghent University, Belgium
-	 * 
-	 ***********************************************************************************************************************/
-	/**
-	 * The Authenticated users attributes. Written by CASClient::setAttributes(), read by CASClient::getAttributes().
-	 * @attention client applications should use phpCAS::getAttributes().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */	
-	var $_attributes = array();
-	
-	function setAttributes($attributes)	
-		{ $this->_attributes = $attributes; }
-	
-	function getAttributes() {
-		if ( empty($this->_user) ) { // if no user is set, there shouldn't be any attributes also...
-			phpCAS::error('this method should be used only after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');
-		}
-		return $this->_attributes;
-	}
-	
-	function hasAttributes()
-		{ return !empty($this->_attributes); }
-	
-	function hasAttribute($key)
-		{ return (is_array($this->_attributes) && array_key_exists($key, $this->_attributes)); }
-	
-	function getAttribute($key)	{
-		if($this->hasAttribute($key)) {
-			return $this->_attributes[$key];
-		}
-	}
-	
-	/**
-	 * This method is called to renew the authentication of the user
-	 * If the user is authenticated, renew the connection
-	 * If not, redirect to CAS
-	 * @public
-	 */
-	function renewAuthentication(){
-		phpCAS::traceBegin();
-		// Either way, the user is authenticated by CAS
-		if( isset( $_SESSION['phpCAS']['auth_checked'] ) )
-			unset($_SESSION['phpCAS']['auth_checked']);
-		if ( $this->isAuthenticated() ) {
-			phpCAS::trace('user already authenticated; renew');
-			$this->redirectToCas(false,true);
-		} else {
-			$this->redirectToCas();
-		}
-		phpCAS::traceEnd();
-	}
-	
-	/**
-	 * This method is called to be sure that the user is authenticated. When not 
-	 * authenticated, halt by redirecting to the CAS server; otherwise return TRUE.
-	 * @return TRUE when the user is authenticated; otherwise halt.
-	 * @public
-	 */
-	function forceAuthentication()
-		{
-		phpCAS::traceBegin();
-		
-		if ( $this->isAuthenticated() ) {
-			// the user is authenticated, nothing to be done.
-			phpCAS::trace('no need to authenticate');
-			$res = TRUE;
-		} else {
-			// the user is not authenticated, redirect to the CAS server
-			if (isset($_SESSION['phpCAS']['auth_checked'])) {
-				unset($_SESSION['phpCAS']['auth_checked']);
-			}
-			$this->redirectToCas(FALSE/* no gateway */);	
-			// never reached
-			$res = FALSE;
-		}
-		phpCAS::traceEnd($res);
-		return $res;
-		}
-	
-	/**
-	 * An integer that gives the number of times authentication will be cached before rechecked.
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_cache_times_for_auth_recheck = 0;
-	
-	/**
-	 * Set the number of times authentication will be cached before rechecked.
-	 *
-	 * @param $n an integer.
-	 *
-	 * @public
-	 */
-	function setCacheTimesForAuthRecheck($n)
-		{
-		$this->_cache_times_for_auth_recheck = $n;
-		}
-	
-	/**
-	 * This method is called to check whether the user is authenticated or not.
-	 * @return TRUE when the user is authenticated, FALSE otherwise.
-	 * @public
-	 */
-	function checkAuthentication()
-		{
-		phpCAS::traceBegin();
-		
-		if ( $this->isAuthenticated() ) {
-			phpCAS::trace('user is authenticated');
-			$res = TRUE;
-		} else if (isset($_SESSION['phpCAS']['auth_checked'])) {
-			// the previous request has redirected the client to the CAS server with gateway=true
-			unset($_SESSION['phpCAS']['auth_checked']);
-			$res = FALSE;
-		} else {
-			//        $_SESSION['phpCAS']['auth_checked'] = true;
-			//	    $this->redirectToCas(TRUE/* gateway */);	
-			//	    // never reached
-			//	    $res = FALSE;
-			// avoid a check against CAS on every request
-			if (! isset($_SESSION['phpCAS']['unauth_count']) )
-				$_SESSION['phpCAS']['unauth_count'] = -2; // uninitialized
-			
-			if (($_SESSION['phpCAS']['unauth_count'] != -2 && $this->_cache_times_for_auth_recheck == -1) 
-					|| ($_SESSION['phpCAS']['unauth_count'] >= 0 && $_SESSION['phpCAS']['unauth_count'] < $this->_cache_times_for_auth_recheck))
-			{
-				$res = FALSE;
-				
-				if ($this->_cache_times_for_auth_recheck != -1)
-				{
-					$_SESSION['phpCAS']['unauth_count']++;
-					phpCAS::trace('user is not authenticated (cached for '.$_SESSION['phpCAS']['unauth_count'].' times of '.$this->_cache_times_for_auth_recheck.')');
-				}
-				else
-				{
-					phpCAS::trace('user is not authenticated (cached for until login pressed)');
-				}
-			}
-			else
-			{
-				$_SESSION['phpCAS']['unauth_count'] = 0;
-				$_SESSION['phpCAS']['auth_checked'] = true;
-				phpCAS::trace('user is not authenticated (cache reset)');
-				$this->redirectToCas(TRUE/* gateway */);	
-				// never reached
-				$res = FALSE;
-			}
-		}
-		phpCAS::traceEnd($res);
-		return $res;
-		}
-	
-	/**
-	 * This method is called to check if the user is authenticated (previously or by
-	 * tickets given in the URL).
-	 *
-	 * @return TRUE when the user is authenticated. Also may redirect to the same URL without the ticket.
-	 *
-	 * @public
-	 */
-	function isAuthenticated()
-		{
-		phpCAS::traceBegin();
-		$res = FALSE;
-		$validate_url = '';
-		
-		if ( $this->wasPreviouslyAuthenticated() ) {
-			// the user has already (previously during the session) been
-			// authenticated, nothing to be done.
-			phpCAS::trace('user was already authenticated, no need to look for tickets');
-			$res = TRUE;
-		}
-		else {
-			if ( $this->hasST() ) {
-				// if a Service Ticket was given, validate it
-				phpCAS::trace('ST `'.$this->getST().'\' is present');
-				$this->validateST($validate_url,$text_response,$tree_response); // if it fails, it halts
-				phpCAS::trace('ST `'.$this->getST().'\' was validated');
-				if ( $this->isProxy() ) {
-					$this->validatePGT($validate_url,$text_response,$tree_response); // idem
-					phpCAS::trace('PGT `'.$this->getPGT().'\' was validated');
-					$_SESSION['phpCAS']['pgt'] = $this->getPGT();
-				}
-				$_SESSION['phpCAS']['user'] = $this->getUser();
-				$res = TRUE;
-			}
-			elseif ( $this->hasPT() ) {
-				// if a Proxy Ticket was given, validate it
-				phpCAS::trace('PT `'.$this->getPT().'\' is present');
-				$this->validatePT($validate_url,$text_response,$tree_response); // note: if it fails, it halts
-				phpCAS::trace('PT `'.$this->getPT().'\' was validated');
-				if ( $this->isProxy() ) {
-					$this->validatePGT($validate_url,$text_response,$tree_response); // idem
-					phpCAS::trace('PGT `'.$this->getPGT().'\' was validated');
-					$_SESSION['phpCAS']['pgt'] = $this->getPGT();
-				}
-				$_SESSION['phpCAS']['user'] = $this->getUser();
-				$res = TRUE;
-			}
-			elseif ( $this->hasSA() ) {
-				// if we have a SAML ticket, validate it.
-				phpCAS::trace('SA `'.$this->getSA().'\' is present');
-				$this->validateSA($validate_url,$text_response,$tree_response); // if it fails, it halts
-				phpCAS::trace('SA `'.$this->getSA().'\' was validated');
-				$_SESSION['phpCAS']['user'] = $this->getUser();
-				$_SESSION['phpCAS']['attributes'] = $this->getAttributes();
-				$res = TRUE;
-			}
-			else {
-				// no ticket given, not authenticated
-				phpCAS::trace('no ticket found');
-			}
-			if ($res) {
-				// if called with a ticket parameter, we need to redirect to the app without the ticket so that CAS-ification is transparent to the browser (for later POSTS)
-				// most of the checks and errors should have been made now, so we're safe for redirect without masking error messages.
-				header('Location: '.$this->getURL());
-				phpCAS::log( "Prepare redirect to : ".$this->getURL() );
-			}
-		}
-		
-		phpCAS::traceEnd($res);
-		return $res;
-		}
-	
-	/**
-	 * This method tells if the current session is authenticated.
-	 * @return true if authenticated based soley on $_SESSION variable
-	 * @since 0.4.22 by Brendan Arnold
-	 */
-	function isSessionAuthenticated ()
-		{
-		return !empty($_SESSION['phpCAS']['user']);
-		}
-	
-	/**
-	 * This method tells if the user has already been (previously) authenticated
-	 * by looking into the session variables.
-	 *
-	 * @note This function switches to callback mode when needed.
-	 *
-	 * @return TRUE when the user has already been authenticated; FALSE otherwise.
-	 *
-	 * @private
-	 */
-	function wasPreviouslyAuthenticated()
-		{
-		phpCAS::traceBegin();
-		
-		if ( $this->isCallbackMode() ) {
-			$this->callback();
-		}
-		
-		$auth = FALSE;
-		
-		if ( $this->isProxy() ) {
-			// CAS proxy: username and PGT must be present
-			if ( $this->isSessionAuthenticated() && !empty($_SESSION['phpCAS']['pgt']) ) {
-				// authentication already done
-				$this->setUser($_SESSION['phpCAS']['user']);
-				$this->setPGT($_SESSION['phpCAS']['pgt']);
-				phpCAS::trace('user = `'.$_SESSION['phpCAS']['user'].'\', PGT = `'.$_SESSION['phpCAS']['pgt'].'\''); 
-				$auth = TRUE;
-			} elseif ( $this->isSessionAuthenticated() && empty($_SESSION['phpCAS']['pgt']) ) {
-				// these two variables should be empty or not empty at the same time
-				phpCAS::trace('username found (`'.$_SESSION['phpCAS']['user'].'\') but PGT is empty');
-				// unset all tickets to enforce authentication
-				unset($_SESSION['phpCAS']);
-				$this->setST('');
-				$this->setPT('');
-			} elseif ( !$this->isSessionAuthenticated() && !empty($_SESSION['phpCAS']['pgt']) ) {
-				// these two variables should be empty or not empty at the same time
-				phpCAS::trace('PGT found (`'.$_SESSION['phpCAS']['pgt'].'\') but username is empty'); 
-				// unset all tickets to enforce authentication
-				unset($_SESSION['phpCAS']);
-				$this->setST('');
-				$this->setPT('');
-			} else {
-				phpCAS::trace('neither user not PGT found'); 
-			}
-		} else {
-			// `simple' CAS client (not a proxy): username must be present
-			if ( $this->isSessionAuthenticated() ) {
-				// authentication already done
-				$this->setUser($_SESSION['phpCAS']['user']);
-				if(isset($_SESSION['phpCAS']['attributes'])){
-					$this->setAttributes($_SESSION['phpCAS']['attributes']);
-				}
-				phpCAS::trace('user = `'.$_SESSION['phpCAS']['user'].'\''); 
-				$auth = TRUE;
-			} else {
-				phpCAS::trace('no user found');
-			}
-		}
-		
-		phpCAS::traceEnd($auth);
-		return $auth;
-		}
-	
-	/**
-	 * This method is used to redirect the client to the CAS server.
-	 * It is used by CASClient::forceAuthentication() and CASClient::checkAuthentication().
-	 * @param $gateway true to check authentication, false to force it
-	 * @param $renew true to force the authentication with the CAS server
-	 * @public
-	 */
-	function redirectToCas($gateway=false,$renew=false){
-		phpCAS::traceBegin();
-		$cas_url = $this->getServerLoginURL($gateway,$renew);
-		header('Location: '.$cas_url);
-		phpCAS::log( "Redirect to : ".$cas_url );
-		
-		$this->printHTMLHeader($this->getString(CAS_STR_AUTHENTICATION_WANTED));
-		
-		printf('<p>'.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);
-		$this->printHTMLFooter();
-		
-		phpCAS::traceExit();
-		exit();
-	}
-	
-	
-	/**
-	 * This method is used to logout from CAS.
-	 * @params $params an array that contains the optional url and service parameters that will be passed to the CAS server
-	 * @public
-	 */
-	function logout($params) {
-		phpCAS::traceBegin();
-		$cas_url = $this->getServerLogoutURL();
-		$paramSeparator = '?';
-		if (isset($params['url'])) {
-			$cas_url = $cas_url . $paramSeparator . "url=" . urlencode($params['url']); 
-			$paramSeparator = '&';
-		}
-		if (isset($params['service'])) {
-			$cas_url = $cas_url . $paramSeparator . "service=" . urlencode($params['service']); 
-		}
-		header('Location: '.$cas_url);
-		phpCAS::log( "Prepare redirect to : ".$cas_url );
-		
-		session_unset();
-		session_destroy();
-		
-		$this->printHTMLHeader($this->getString(CAS_STR_LOGOUT));
-		printf('<p>'.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);
-		$this->printHTMLFooter();
-		
-		phpCAS::traceExit();
-		exit();
-	}
-	
-	/**
-	 * @return true if the current request is a logout request.
-	 * @private
-	 */
-	function isLogoutRequest() {
-		return !empty($_POST['logoutRequest']);
-	}
-	
-	/**
-	 * @return true if a logout request is allowed.
-	 * @private
-	 */
-	function isLogoutRequestAllowed() {
-	}
-	
-	/**
-	 * This method handles logout requests.
-	 * @param $check_client true to check the client bofore handling the request, 
-	 * false not to perform any access control. True by default.
-	 * @param $allowed_clients an array of host names allowed to send logout requests. 
-	 * By default, only the CAs server (declared in the constructor) will be allowed.
-	 * @public
-	 */
-	function handleLogoutRequests($check_client=true, $allowed_clients=false) {
-		phpCAS::traceBegin();
-		if (!$this->isLogoutRequest()) {
-			phpCAS::log("Not a logout request");
-			phpCAS::traceEnd();
-			return;
-		}
-		phpCAS::log("Logout requested");
-		phpCAS::log("SAML REQUEST: ".$_POST['logoutRequest']);
-		if ($check_client) {
-			if (!$allowed_clients) {
-				$allowed_clients = array( $this->getServerHostname() ); 
-			}
-			$client_ip = $_SERVER['REMOTE_ADDR'];
-			$client = gethostbyaddr($client_ip);
-			phpCAS::log("Client: ".$client."/".$client_ip); 
-			$allowed = false;
-			foreach ($allowed_clients as $allowed_client) {
-				if (($client == $allowed_client) or ($client_ip == $allowed_client)) { 
-					phpCAS::log("Allowed client '".$allowed_client."' matches, logout request is allowed");
-					$allowed = true;
-					break;
-				} else {
-					phpCAS::log("Allowed client '".$allowed_client."' does not match");
-				}
-			}
-			if (!$allowed) {
-				phpCAS::error("Unauthorized logout request from client '".$client."'");
-				printf("Unauthorized!");
-				phpCAS::traceExit();
-				exit();
-			}
-		} else {
-			phpCAS::log("No access control set");
-		}
-		// Extract the ticket from the SAML Request
-		preg_match("|<samlp:SessionIndex>(.*)</samlp:SessionIndex>|", $_POST['logoutRequest'], $tick, PREG_OFFSET_CAPTURE, 3);
-		$wrappedSamlSessionIndex = preg_replace('|<samlp:SessionIndex>|','',$tick[0][0]);
-		$ticket2logout = preg_replace('|</samlp:SessionIndex>|','',$wrappedSamlSessionIndex);
-		phpCAS::log("Ticket to logout: ".$ticket2logout);
-		$session_id = preg_replace('/[^\w]/','',$ticket2logout);
-		phpCAS::log("Session id: ".$session_id);
-		
-		// destroy a possible application session created before phpcas
-		if(session_id()){
-			session_unset();
-			session_destroy();
-		}
-		// fix session ID
-		session_id($session_id);
-		$_COOKIE[session_name()]=$session_id;
-		$_GET[session_name()]=$session_id;
-		
-		// Overwrite session
-		session_start();	
-		session_unset();
-		session_destroy();
-		printf("Disconnected!");
-		phpCAS::traceExit();
-		exit();
-	}
-	
-	/** @} */
-	
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	// XX                                                                    XX
-	// XX                  BASIC CLIENT FEATURES (CAS 1.0)                   XX
-	// XX                                                                    XX
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	
-	// ########################################################################
-	//  ST
-	// ########################################################################
-	/**
-	 * @addtogroup internalBasic
-	 * @{
-	 */  
-	
-	/**
-	 * the Service Ticket provided in the URL of the request if present
-	 * (empty otherwise). Written by CASClient::CASClient(), read by 
-	 * CASClient::getST() and CASClient::hasPGT().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_st = '';
-	
-	/**
-	 * This method returns the Service Ticket provided in the URL of the request.
-	 * @return The service ticket.
-	 * @private
-	 */
-	function getST()
-		{ return $this->_st; }
-	
-	/**
-	 * This method stores the Service Ticket.
-	 * @param $st The Service Ticket.
-	 * @private
-	 */
-	function setST($st)
-		{ $this->_st = $st; }
-	
-	/**
-	 * This method tells if a Service Ticket was stored.
-	 * @return TRUE if a Service Ticket has been stored.
-	 * @private
-	 */
-	function hasST()
-		{ return !empty($this->_st); }
-	
-	/** @} */
-	
-	// ########################################################################
-	//  ST VALIDATION
-	// ########################################################################
-	/**
-	 * @addtogroup internalBasic
-	 * @{
-	 */  
-	
-	/**
-	 * the certificate of the CAS server.
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_cas_server_cert = '';
-	
-	/**
-	 * the certificate of the CAS server CA.
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_cas_server_ca_cert = '';
-	
-	/**
-	 * Set to true not to validate the CAS server.
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_no_cas_server_validation = false;
-	
-	/**
-	 * Set the certificate of the CAS server.
-	 *
-	 * @param $cert the PEM certificate
-	 */
-	function setCasServerCert($cert)
-		{
-		$this->_cas_server_cert = $cert;
-		}
-	
-	/**
-	 * Set the CA certificate of the CAS server.
-	 *
-	 * @param $cert the PEM certificate of the CA that emited the cert of the server
-	 */
-	function setCasServerCACert($cert)
-		{
-		$this->_cas_server_ca_cert = $cert;
-		}
-	
-	/**
-	 * Set no SSL validation for the CAS server.
-	 */
-	function setNoCasServerValidation()
-		{
-		$this->_no_cas_server_validation = true;
-		}
-	
-	/**
-	 * This method is used to validate a ST; halt on failure, and sets $validate_url,
-	 * $text_reponse and $tree_response on success. These parameters are used later
-	 * by CASClient::validatePGT() for CAS proxies.
-	 * Used for all CAS 1.0 validations
-	 * @param $validate_url the URL of the request to the CAS server.
-	 * @param $text_response the response of the CAS server, as is (XML text).
-	 * @param $tree_response the response of the CAS server, as a DOM XML tree.
-	 *
-	 * @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
-	 *
-	 * @private
-	 */
-	function validateST($validate_url,&$text_response,&$tree_response)
-		{
-		phpCAS::traceBegin();
-		// build the URL to validate the ticket
-		$validate_url = $this->getServerServiceValidateURL().'&ticket='.$this->getST();
-		if ( $this->isProxy() ) {
-			// pass the callback url for CAS proxies
-			$validate_url .= '&pgtUrl='.$this->getCallbackURL();
-		}
-		
-		// open and read the URL
-		if ( !$this->readURL($validate_url,''/*cookies*/,$headers,$text_response,$err_msg) ) {
-			phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
-			$this->authError('ST not validated',
-				$validate_url,
-				TRUE/*$no_response*/);
-		}
-		
-		// analyze the result depending on the version
-		switch ($this->getServerVersion()) {
-			case CAS_VERSION_1_0:
-				if (preg_match('/^no\n/',$text_response)) {
-					phpCAS::trace('ST has not been validated');
-					$this->authError('ST not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						FALSE/*$bad_response*/,
-						$text_response);
-				}
-				if (!preg_match('/^yes\n/',$text_response)) {
-					phpCAS::trace('ill-formed response');
-					$this->authError('ST not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				// ST has been validated, extract the user name
-				$arr = preg_split('/\n/',$text_response);
-				$this->setUser(trim($arr[1]));
-				break;
-			case CAS_VERSION_2_0:
-				// read the response of the CAS server into a DOM object
-				if ( !($dom = domxml_open_mem($text_response))) {
-					phpCAS::trace('domxml_open_mem() failed');
-					$this->authError('ST not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				// read the root node of the XML tree
-				if ( !($tree_response = $dom->document_element()) ) {
-					phpCAS::trace('document_element() failed');
-					$this->authError('ST not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				// insure that tag name is 'serviceResponse'
-				if ( $tree_response->node_name() != 'serviceResponse' ) {
-					phpCAS::trace('bad XML root node (should be `serviceResponse\' instead of `'.$tree_response->node_name().'\'');
-					$this->authError('ST not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				if ( sizeof($success_elements = $tree_response->get_elements_by_tagname("authenticationSuccess")) != 0) {
-					// authentication succeded, extract the user name
-					if ( sizeof($user_elements = $success_elements[0]->get_elements_by_tagname("user")) == 0) {
-						phpCAS::trace('<authenticationSuccess> found, but no <user>');
-						$this->authError('ST not validated',
-							$validate_url,
-							FALSE/*$no_response*/,
-							TRUE/*$bad_response*/,
-							$text_response);
-					}
-					$user = trim($user_elements[0]->get_content());
-					phpCAS::trace('user = `'.$user);
-					$this->setUser($user);
-					
-				} else if ( sizeof($failure_elements = $tree_response->get_elements_by_tagname("authenticationFailure")) != 0) {
-					phpCAS::trace('<authenticationFailure> found');
-					// authentication failed, extract the error code and message
-					$this->authError('ST not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						FALSE/*$bad_response*/,
-						$text_response,
-						$failure_elements[0]->get_attribute('code')/*$err_code*/,
-						trim($failure_elements[0]->get_content())/*$err_msg*/);
-				} else {
-					phpCAS::trace('neither <authenticationSuccess> nor <authenticationFailure> found');
-					$this->authError('ST not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				break;
-		}
-		
-		// at this step, ST has been validated and $this->_user has been set,
-		phpCAS::traceEnd(TRUE);
-		return TRUE;
-		}
-	
-	// ########################################################################
-	//  SAML VALIDATION
-	// ########################################################################
-	/**
-	 * @addtogroup internalBasic
-	 * @{
-	 */
-	
-	/**
-	 * This method is used to validate a SAML TICKET; halt on failure, and sets $validate_url,
-	 * $text_reponse and $tree_response on success. These parameters are used later
-	 * by CASClient::validatePGT() for CAS proxies.
-	 *
-	 * @param $validate_url the URL of the request to the CAS server.
-	 * @param $text_response the response of the CAS server, as is (XML text).
-	 * @param $tree_response the response of the CAS server, as a DOM XML tree.
-	 *
-	 * @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
-	 *
-	 * @private
-	 */
-	function validateSA($validate_url,&$text_response,&$tree_response)
-		{
-		phpCAS::traceBegin();
-		
-		// build the URL to validate the ticket
-		$validate_url = $this->getServerSamlValidateURL();
-		
-		// open and read the URL
-		if ( !$this->readURL($validate_url,''/*cookies*/,$headers,$text_response,$err_msg) ) {
-			phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
-			$this->authError('SA not validated', $validate_url, TRUE/*$no_response*/);
-		}
-		
-		phpCAS::trace('server version: '.$this->getServerVersion());
-		
-		// analyze the result depending on the version
-		switch ($this->getServerVersion()) {
-			case SAML_VERSION_1_1:
-				
-				// read the response of the CAS server into a DOM object
-				if ( !($dom = domxml_open_mem($text_response))) {
-					phpCAS::trace('domxml_open_mem() failed');
-					$this->authError('SA not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				// read the root node of the XML tree
-				if ( !($tree_response = $dom->document_element()) ) {
-					phpCAS::trace('document_element() failed');
-					$this->authError('SA not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				// insure that tag name is 'Envelope'
-				if ( $tree_response->node_name() != 'Envelope' ) {
-					phpCAS::trace('bad XML root node (should be `Envelope\' instead of `'.$tree_response->node_name().'\'');
-					$this->authError('SA not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				// check for the NameIdentifier tag in the SAML response
-				if ( sizeof($success_elements = $tree_response->get_elements_by_tagname("NameIdentifier")) != 0) {
-					phpCAS::trace('NameIdentifier found');
-					$user = trim($success_elements[0]->get_content());
-					phpCAS::trace('user = `'.$user.'`');
-					$this->setUser($user);
-					$this->setSessionAttributes($text_response);
-				} else {
-					phpCAS::trace('no <NameIdentifier> tag found in SAML payload');
-					$this->authError('SA not validated',
-						$validate_url,
-						FALSE/*$no_response*/,
-						TRUE/*$bad_response*/,
-						$text_response);
-				}
-				break;
-		}
-		
-		// at this step, ST has been validated and $this->_user has been set,
-		phpCAS::traceEnd(TRUE);
-		return TRUE;
-		}
-	
-	/**
-	 * This method will parse the DOM and pull out the attributes from the SAML
-	 * payload and put them into an array, then put the array into the session.
-	 *
-	 * @param $text_response the SAML payload.
-	 * @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
-	 *
-	 * @private
-	 */
-	function setSessionAttributes($text_response)
-		{
-		phpCAS::traceBegin();
-		
-		$result = FALSE;
-		
-		if (isset($_SESSION[SAML_ATTRIBUTES])) {
-			phpCAS::trace("session attrs already set.");  //testbml - do we care?
-		}
-		
-		$attr_array = array();
-		
-		if (($dom = domxml_open_mem($text_response))) {
-			$xPath = $dom->xpath_new_context();
-			$xPath->xpath_register_ns('samlp', 'urn:oasis:names:tc:SAML:1.0:protocol');
-			$xPath->xpath_register_ns('saml', 'urn:oasis:names:tc:SAML:1.0:assertion');
-			$nodelist = $xPath->xpath_eval("//saml:Attribute");
-			$attrs = $nodelist->nodeset;
-			phpCAS::trace($text_response);
-			foreach($attrs as $attr){
-				$xres = $xPath->xpath_eval("saml:AttributeValue", $attr);
-				$name = $attr->get_attribute("AttributeName");
-				$value_array = array();
-				foreach($xres->nodeset as $node){
-					$value_array[] = $node->get_content();
-					
-				}
-				phpCAS::trace("* " . $name . "=" . $value_array);
-				$attr_array[$name] = $value_array;
-			}
-			$_SESSION[SAML_ATTRIBUTES] = $attr_array;
-			// UGent addition...
-			foreach($attr_array as $attr_key => $attr_value) {
-				if(count($attr_value) > 1) {
-					$this->_attributes[$attr_key] = $attr_value;
-				}
-				else {
-					$this->_attributes[$attr_key] = $attr_value[0];
-				}
-			}
-			$result = TRUE;
-		}
-		phpCAS::traceEnd($result);
-		return $result;
-		}
-	
-	/** @} */
-	
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	// XX                                                                    XX
-	// XX                     PROXY FEATURES (CAS 2.0)                       XX
-	// XX                                                                    XX
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	
-	// ########################################################################
-	//  PROXYING
-	// ########################################################################
-	/**
-	 * @addtogroup internalProxy
-	 * @{
-	 */
-	
-	/**
-	 * A boolean telling if the client is a CAS proxy or not. Written by CASClient::CASClient(), 
-	 * read by CASClient::isProxy().
-	 *
-	 * @private
-	 */
-	var $_proxy;
-	
-	/**
-	 * Tells if a CAS client is a CAS proxy or not
-	 *
-	 * @return TRUE when the CAS client is a CAs proxy, FALSE otherwise
-	 *
-	 * @private
-	 */
-	function isProxy()
-		{
-		return $this->_proxy;
-		}
-	
-	/** @} */
-	// ########################################################################
-	//  PGT
-	// ########################################################################
-	/**
-	 * @addtogroup internalProxy
-	 * @{
-	 */  
-	
-	/**
-	 * the Proxy Grnting Ticket given by the CAS server (empty otherwise). 
-	 * Written by CASClient::setPGT(), read by CASClient::getPGT() and CASClient::hasPGT().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_pgt = '';
-	
-	/**
-	 * This method returns the Proxy Granting Ticket given by the CAS server.
-	 * @return The Proxy Granting Ticket.
-	 * @private
-	 */
-	function getPGT()
-		{ return $this->_pgt; }
-	
-	/**
-	 * This method stores the Proxy Granting Ticket.
-	 * @param $pgt The Proxy Granting Ticket.
-	 * @private
-	 */
-	function setPGT($pgt)
-		{ $this->_pgt = $pgt; }
-	
-	/**
-	 * This method tells if a Proxy Granting Ticket was stored.
-	 * @return TRUE if a Proxy Granting Ticket has been stored.
-	 * @private
-	 */
-	function hasPGT()
-		{ return !empty($this->_pgt); }
-	
-	/** @} */
-	
-	// ########################################################################
-	//  CALLBACK MODE
-	// ########################################################################
-	/**
-	 * @addtogroup internalCallback
-	 * @{
-	 */  
-	/**
-	 * each PHP script using phpCAS in proxy mode is its own callback to get the
-	 * PGT back from the CAS server. callback_mode is detected by the constructor
-	 * thanks to the GET parameters.
-	 */
-	
-	/**
-	 * a boolean to know if the CAS client is running in callback mode. Written by
-	 * CASClient::setCallBackMode(), read by CASClient::isCallbackMode().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_callback_mode = FALSE;
-	
-	/**
-	 * This method sets/unsets callback mode.
-	 *
-	 * @param $callback_mode TRUE to set callback mode, FALSE otherwise.
-	 *
-	 * @private
-	 */
-	function setCallbackMode($callback_mode)
-		{
-		$this->_callback_mode = $callback_mode;
-		}
-	
-	/**
-	 * This method returns TRUE when the CAs client is running i callback mode, 
-	 * FALSE otherwise.
-	 *
-	 * @return A boolean.
-	 *
-	 * @private
-	 */
-	function isCallbackMode()
-		{
-		return $this->_callback_mode;
-		}
-	
-	/**
-	 * the URL that should be used for the PGT callback (in fact the URL of the 
-	 * current request without any CGI parameter). Written and read by 
-	 * CASClient::getCallbackURL().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_callback_url = '';
-	
-	/**
-	 * This method returns the URL that should be used for the PGT callback (in
-	 * fact the URL of the current request without any CGI parameter, except if
-	 * phpCAS::setFixedCallbackURL() was used).
-	 *
-	 * @return The callback URL
-	 *
-	 * @private
-	 */
-	function getCallbackURL()
-		{
-		// the URL is built when needed only
-		if ( empty($this->_callback_url) ) {
-			$final_uri = '';
-			// remove the ticket if present in the URL
-			$final_uri = 'https://';
-			/* replaced by Julien Marchal - v0.4.6
-			 * $this->uri .= $_SERVER['SERVER_NAME'];
-			 */
-			if(empty($_SERVER['HTTP_X_FORWARDED_SERVER'])){
-				/* replaced by teedog - v0.4.12
-				 * $final_uri .= $_SERVER['SERVER_NAME'];
-				 */
-				if (empty($_SERVER['SERVER_NAME'])) {
-					$final_uri .= $_SERVER['HTTP_HOST'];
-				} else {
-					$final_uri .= $_SERVER['SERVER_NAME'];
-				}
-			} else {
-				$final_uri .= $_SERVER['HTTP_X_FORWARDED_SERVER'];
-			}
-			if ( ($this->isHttps() && $_SERVER['SERVER_PORT']!=443)
-					|| (!$this->isHttps() && $_SERVER['SERVER_PORT']!=80) ) {
-				$final_uri .= ':';
-				$final_uri .= $_SERVER['SERVER_PORT'];
-			}
-			$request_uri = $_SERVER['REQUEST_URI'];
-			$request_uri = preg_replace('/\?.*$/','',$request_uri);
-			$final_uri .= $request_uri;
-			$this->setCallbackURL($final_uri);
-		}
-		return $this->_callback_url;
-		}
-	
-	/**
-	 * This method sets the callback url.
-	 *
-	 * @param $callback_url url to set callback 
-	 *
-	 * @private
-	 */
-	function setCallbackURL($url)
-		{
-		return $this->_callback_url = $url;
-		}
-	
-	/**
-	 * This method is called by CASClient::CASClient() when running in callback
-	 * mode. It stores the PGT and its PGT Iou, prints its output and halts.
-	 *
-	 * @private
-	 */
-	function callback()
-		{
-		phpCAS::traceBegin();
-		$this->printHTMLHeader('phpCAS callback');
-		$pgt_iou = $_GET['pgtIou'];
-		$pgt = $_GET['pgtId'];
-		phpCAS::trace('Storing PGT `'.$pgt.'\' (id=`'.$pgt_iou.'\')');
-		echo '<p>Storing PGT `'.$pgt.'\' (id=`'.$pgt_iou.'\').</p>';
-		$this->storePGT($pgt,$pgt_iou);
-		$this->printHTMLFooter();
-		phpCAS::traceExit();
-		exit();
-		}
-	
-	/** @} */
-	
-	// ########################################################################
-	//  PGT STORAGE
-	// ########################################################################
-	/**
-	 * @addtogroup internalPGTStorage
-	 * @{
-	 */  
-	
-	/**
-	 * an instance of a class inheriting of PGTStorage, used to deal with PGT
-	 * storage. Created by CASClient::setPGTStorageFile() or CASClient::setPGTStorageDB(), used 
-	 * by CASClient::setPGTStorageFile(), CASClient::setPGTStorageDB() and CASClient::initPGTStorage().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_pgt_storage = null;
-	
-	/**
-	 * This method is used to initialize the storage of PGT's.
-	 * Halts on error.
-	 *
-	 * @private
-	 */
-	function initPGTStorage()
-		{
-		// if no SetPGTStorageXxx() has been used, default to file
-		if ( !is_object($this->_pgt_storage) ) {
-			$this->setPGTStorageFile();
-		}
-		
-		// initializes the storage
-		$this->_pgt_storage->init();
-		}
-	
-	/**
-	 * This method stores a PGT. Halts on error.
-	 *
-	 * @param $pgt the PGT to store
-	 * @param $pgt_iou its corresponding Iou
-	 *
-	 * @private
-	 */
-	function storePGT($pgt,$pgt_iou)
-		{
-		// ensure that storage is initialized
-		$this->initPGTStorage();
-		// writes the PGT
-		$this->_pgt_storage->write($pgt,$pgt_iou);
-		}
-	
-	/**
-	 * This method reads a PGT from its Iou and deletes the corresponding storage entry.
-	 *
-	 * @param $pgt_iou the PGT Iou
-	 *
-	 * @return The PGT corresponding to the Iou, FALSE when not found.
-	 *
-	 * @private
-	 */
-	function loadPGT($pgt_iou)
-		{
-		// ensure that storage is initialized
-		$this->initPGTStorage();
-		// read the PGT
-		return $this->_pgt_storage->read($pgt_iou);
-		}
-	
-	/**
-	 * This method is used to tell phpCAS to store the response of the
-	 * CAS server to PGT requests onto the filesystem. 
-	 *
-	 * @param $format the format used to store the PGT's (`plain' and `xml' allowed)
-	 * @param $path the path where the PGT's should be stored
-	 *
-	 * @public
-	 */
-	function setPGTStorageFile($format='',
-		$path='')
-		{
-		// check that the storage has not already been set
-		if ( is_object($this->_pgt_storage) ) {
-			phpCAS::error('PGT storage already defined');
-		}
-		
-		// create the storage object
-		$this->_pgt_storage = new PGTStorageFile($this,$format,$path);
-		}
-	
-	/**
-	 * This method is used to tell phpCAS to store the response of the
-	 * CAS server to PGT requests into a database. 
-	 * @note The connection to the database is done only when needed. 
-	 * As a consequence, bad parameters are detected only when 
-	 * initializing PGT storage.
-	 *
-	 * @param $user the user to access the data with
-	 * @param $password the user's password
-	 * @param $database_type the type of the database hosting the data
-	 * @param $hostname the server hosting the database
-	 * @param $port the port the server is listening on
-	 * @param $database the name of the database
-	 * @param $table the name of the table storing the data
-	 *
-	 * @public
-	 */
-	function setPGTStorageDB($user,
-							 $password,
-							 $database_type,
-							 $hostname,
-							 $port,
-							 $database,
-							 $table)
-		{
-		// check that the storage has not already been set
-		if ( is_object($this->_pgt_storage) ) {
-			phpCAS::error('PGT storage already defined');
-		}
-		
-		// warn the user that he should use file storage...
-		trigger_error('PGT storage into database is an experimental feature, use at your own risk',E_USER_WARNING);
-		
-		// create the storage object
-		$this->_pgt_storage = new PGTStorageDB($this,$user,$password,$database_type,$hostname,$port,$database,$table);
-		}
-	
-	// ########################################################################
-	//  PGT VALIDATION
-	// ########################################################################
-	/**
-	 * This method is used to validate a PGT; halt on failure.
-	 * 
-	 * @param $validate_url the URL of the request to the CAS server.
-	 * @param $text_response the response of the CAS server, as is (XML text); result
-	 * of CASClient::validateST() or CASClient::validatePT().
-	 * @param $tree_response the response of the CAS server, as a DOM XML tree; result
-	 * of CASClient::validateST() or CASClient::validatePT().
-	 *
-	 * @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
-	 *
-	 * @private
-	 */
-	function validatePGT(&$validate_url,$text_response,$tree_response)
-		{
-		// here cannot use phpCAS::traceBegin(); alongside domxml-php4-to-php5.php
-		phpCAS::log('start validatePGT()');
-		if ( sizeof($arr = $tree_response->get_elements_by_tagname("proxyGrantingTicket")) == 0) {
-			phpCAS::trace('<proxyGrantingTicket> not found');
-			// authentication succeded, but no PGT Iou was transmitted
-			$this->authError('Ticket validated but no PGT Iou transmitted',
-				$validate_url,
-				FALSE/*$no_response*/,
-				FALSE/*$bad_response*/,
-				$text_response);
-		} else {
-			// PGT Iou transmitted, extract it
-			$pgt_iou = trim($arr[0]->get_content());
-			$pgt = $this->loadPGT($pgt_iou);
-			if ( $pgt == FALSE ) {
-				phpCAS::trace('could not load PGT');
-				$this->authError('PGT Iou was transmitted but PGT could not be retrieved',
-					$validate_url,
-					FALSE/*$no_response*/,
-					FALSE/*$bad_response*/,
-					$text_response);
-			}
-			$this->setPGT($pgt);
-		}
-		// here, cannot use	phpCAS::traceEnd(TRUE); alongside domxml-php4-to-php5.php
-		phpCAS::log('end validatePGT()');
-		return TRUE;
-		}
-	
-	// ########################################################################
-	//  PGT VALIDATION
-	// ########################################################################
-	
-	/**
-	 * This method is used to retrieve PT's from the CAS server thanks to a PGT.
-	 * 
-	 * @param $target_service the service to ask for with the PT.
-	 * @param $err_code an error code (PHPCAS_SERVICE_OK on success).
-	 * @param $err_msg an error message (empty on success).
-	 *
-	 * @return a Proxy Ticket, or FALSE on error.
-	 *
-	 * @private
-	 */
-	function retrievePT($target_service,&$err_code,&$err_msg)
-		{
-		phpCAS::traceBegin();
-		
-		// by default, $err_msg is set empty and $pt to TRUE. On error, $pt is
-		// set to false and $err_msg to an error message. At the end, if $pt is FALSE 
-		// and $error_msg is still empty, it is set to 'invalid response' (the most
-		// commonly encountered error).
-		$err_msg = '';
-		
-		// build the URL to retrieve the PT
-		//      $cas_url = $this->getServerProxyURL().'?targetService='.preg_replace('/&/','%26',$target_service).'&pgt='.$this->getPGT();
-		$cas_url = $this->getServerProxyURL().'?targetService='.urlencode($target_service).'&pgt='.$this->getPGT();
-		
-		// open and read the URL
-		if ( !$this->readURL($cas_url,''/*cookies*/,$headers,$cas_response,$err_msg) ) {
-			phpCAS::trace('could not open URL \''.$cas_url.'\' to validate ('.$err_msg.')');
-			$err_code = PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE;
-			$err_msg = 'could not retrieve PT (no response from the CAS server)';
-			phpCAS::traceEnd(FALSE);
-			return FALSE;
-		}
-		
-		$bad_response = FALSE;
-		
-		if ( !$bad_response ) {
-			// read the response of the CAS server into a DOM object
-			if ( !($dom = @domxml_open_mem($cas_response))) {
-				phpCAS::trace('domxml_open_mem() failed');
-				// read failed
-				$bad_response = TRUE;
-			} 
-		}
-		
-		if ( !$bad_response ) {
-			// read the root node of the XML tree
-			if ( !($root = $dom->document_element()) ) {
-				phpCAS::trace('document_element() failed');
-				// read failed
-				$bad_response = TRUE;
-			} 
-		}
-		
-		if ( !$bad_response ) {
-			// insure that tag name is 'serviceResponse'
-			if ( $root->node_name() != 'serviceResponse' ) {
-				phpCAS::trace('node_name() failed');
-				// bad root node
-				$bad_response = TRUE;
-			} 
-		}
-		
-		if ( !$bad_response ) {
-			// look for a proxySuccess tag
-			if ( sizeof($arr = $root->get_elements_by_tagname("proxySuccess")) != 0) {
-				// authentication succeded, look for a proxyTicket tag
-				if ( sizeof($arr = $root->get_elements_by_tagname("proxyTicket")) != 0) {
-					$err_code = PHPCAS_SERVICE_OK;
-					$err_msg = '';
-					phpCAS::trace('original PT: '.trim($arr[0]->get_content()));
-					$pt = trim($arr[0]->get_content());
-					phpCAS::traceEnd($pt);
-					return $pt;
-				} else {
-					phpCAS::trace('<proxySuccess> was found, but not <proxyTicket>');
-				}
-			} 
-			// look for a proxyFailure tag
-			else if ( sizeof($arr = $root->get_elements_by_tagname("proxyFailure")) != 0) {
-				// authentication failed, extract the error
-				$err_code = PHPCAS_SERVICE_PT_FAILURE;
-				$err_msg = 'PT retrieving failed (code=`'
-					.$arr[0]->get_attribute('code')
-					.'\', message=`'
-					.trim($arr[0]->get_content())
-					.'\')';
-				phpCAS::traceEnd(FALSE);
-				return FALSE;
-			} else {
-				phpCAS::trace('neither <proxySuccess> nor <proxyFailure> found');
-			}
-		}
-		
-		// at this step, we are sure that the response of the CAS server was ill-formed
-		$err_code = PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE;
-		$err_msg = 'Invalid response from the CAS server (response=`'.$cas_response.'\')';
-		
-		phpCAS::traceEnd(FALSE);
-		return FALSE;
-		}
-	
-	// ########################################################################
-	// ACCESS TO EXTERNAL SERVICES
-	// ########################################################################
-	
-	/**
-	 * This method is used to acces a remote URL.
-	 *
-	 * @param $url the URL to access.
-	 * @param $cookies an array containing cookies strings such as 'name=val'
-	 * @param $headers an array containing the HTTP header lines of the response
-	 * (an empty array on failure).
-	 * @param $body the body of the response, as a string (empty on failure).
-	 * @param $err_msg an error message, filled on failure.
-	 *
-	 * @return TRUE on success, FALSE otherwise (in this later case, $err_msg
-	 * contains an error message).
-	 *
-	 * @private
-	 */
-	function readURL($url,$cookies,&$headers,&$body,&$err_msg)
-		{
-		phpCAS::traceBegin();
-		$headers = '';
-		$body = '';
-		$err_msg = '';
-		
-		$res = TRUE;
-		
-		// initialize the CURL session
-		$ch = curl_init($url);
-		
-		if (version_compare(PHP_VERSION,'5.1.3','>=')) {
-			//only avaible in php5
-			curl_setopt_array($ch, $this->_curl_options);
-		} else {
-			foreach ($this->_curl_options as $key => $value) {
-				curl_setopt($ch, $key, $value);
-			}
-		}
-		
-		if ($this->_cas_server_cert == '' && $this->_cas_server_ca_cert == '' && !$this->_no_cas_server_validation) {
-			phpCAS::error('one of the methods phpCAS::setCasServerCert(), phpCAS::setCasServerCACert() or phpCAS::setNoCasServerValidation() must be called.');
-		}
-		if ($this->_cas_server_cert != '' && $this->_cas_server_ca_cert != '') {
-			// This branch added by IDMS. Seems phpCAS implementor got a bit confused about the curl options CURLOPT_SSLCERT and CURLOPT_CAINFO
-			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
-			curl_setopt($ch, CURLOPT_SSLCERT, $this->_cas_server_cert);
-			curl_setopt($ch, CURLOPT_CAINFO, $this->_cas_server_ca_cert);
-			curl_setopt($ch, CURLOPT_VERBOSE, '1');
-			phpCAS::trace('CURL: Set all required opts for mutual authentication ------');
-		} else if ($this->_cas_server_cert != '' ) {
-			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-			curl_setopt($ch, CURLOPT_SSLCERT, $this->_cas_server_cert);
-		} else if ($this->_cas_server_ca_cert != '') {
-			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-			curl_setopt($ch, CURLOPT_CAINFO, $this->_cas_server_ca_cert);
-		} else {
-			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
-			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
-		}
-		
-		// return the CURL output into a variable
-		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-		// get the HTTP header with a callback
-		$this->_curl_headers = array(); // empty the headers array
-		curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, '_curl_read_headers'));
-		// add cookies headers
-		if ( is_array($cookies) ) {
-			curl_setopt($ch,CURLOPT_COOKIE,implode(';',$cookies));
-		}
-		// add extra stuff if SAML
-		if ($this->hasSA()) {
-			$more_headers = array ("soapaction: http://www.oasis-open.org/committees/security",
-				"cache-control: no-cache",
-				"pragma: no-cache",
-				"accept: text/xml",
-				"connection: keep-alive",
-			"content-type: text/xml");
-			
-			curl_setopt($ch, CURLOPT_HTTPHEADER, $more_headers);
-			curl_setopt($ch, CURLOPT_POST, 1);
-			$data = $this->buildSAMLPayload();
-			//phpCAS::trace('SAML Payload: '.print_r($data, TRUE));
-			curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
-		}
-		// perform the query
-		$buf = curl_exec ($ch);
-		//phpCAS::trace('CURL: Call completed. Response body is: \''.$buf.'\'');
-		if ( $buf === FALSE ) {
-			phpCAS::trace('curl_exec() failed');
-			$err_msg = 'CURL error #'.curl_errno($ch).': '.curl_error($ch);
-			//phpCAS::trace('curl error: '.$err_msg);
-			// close the CURL session
-			curl_close ($ch);
-			$res = FALSE;
-		} else {
-			// close the CURL session
-			curl_close ($ch);
-			
-			$headers = $this->_curl_headers;
-			$body = $buf;
-		}
-		
-		phpCAS::traceEnd($res);
-		return $res;
-		}
-	
-	/**
-	 * This method is used to build the SAML POST body sent to /samlValidate URL.
-	 *
-	 * @return the SOAP-encased SAMLP artifact (the ticket).
-	 *
-	 * @private
-	 */
-	function buildSAMLPayload()
-		{
-		phpCAS::traceBegin();
-		
-		//get the ticket
-		$sa = $this->getSA();
-		//phpCAS::trace("SA: ".$sa);
-		
-		$body=SAML_SOAP_ENV.SAML_SOAP_BODY.SAMLP_REQUEST.SAML_ASSERTION_ARTIFACT.$sa.SAML_ASSERTION_ARTIFACT_CLOSE.SAMLP_REQUEST_CLOSE.SAML_SOAP_BODY_CLOSE.SAML_SOAP_ENV_CLOSE;
-		
-		phpCAS::traceEnd($body);
-		return ($body);
-		}
-	
-	/**
-	 * This method is the callback used by readURL method to request HTTP headers.
-	 */
-	var $_curl_headers = array();
-	function _curl_read_headers($ch, $header)
-		{
-		$this->_curl_headers[] = $header;
-		return strlen($header);
-		}
-	
-	/**
-	 * This method is used to access an HTTP[S] service.
-	 * 
-	 * @param $url the service to access.
-	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
-	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
-	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT AVAILABLE.
-	 * @param $output the output of the service (also used to give an error
-	 * message on failure).
-	 *
-	 * @return TRUE on success, FALSE otherwise (in this later case, $err_code
-	 * gives the reason why it failed and $output contains an error message).
-	 *
-	 * @public
-	 */
-	function serviceWeb($url,&$err_code,&$output)
-		{
-		phpCAS::traceBegin();
-		// at first retrieve a PT
-		$pt = $this->retrievePT($url,$err_code,$output);
-		
-		$res = TRUE;
-		
-		// test if PT was retrieved correctly
-		if ( !$pt ) {
-			// note: $err_code and $err_msg are filled by CASClient::retrievePT()
-			phpCAS::trace('PT was not retrieved correctly');
-			$res = FALSE;
-		} else {
-			// add cookies if necessary
-			if ( is_array($_SESSION['phpCAS']['services'][$url]['cookies']) ) {
-				foreach ( $_SESSION['phpCAS']['services'][$url]['cookies'] as $name => $val ) { 
-					$cookies[] = $name.'='.$val;
-				}
-			}
-			
-			// build the URL including the PT
-			if ( strstr($url,'?') === FALSE ) {
-				$service_url = $url.'?ticket='.$pt;
-			} else {
-				$service_url = $url.'&ticket='.$pt;
-			}
-			
-			phpCAS::trace('reading URL`'.$service_url.'\'');
-			if ( !$this->readURL($service_url,$cookies,$headers,$output,$err_msg) ) {
-				phpCAS::trace('could not read URL`'.$service_url.'\'');
-				$err_code = PHPCAS_SERVICE_NOT_AVAILABLE;
-				// give an error message
-				$output = sprintf($this->getString(CAS_STR_SERVICE_UNAVAILABLE),
-					$service_url,
-					$err_msg);
-				$res = FALSE;
-			} else {
-				// URL has been fetched, extract the cookies
-				phpCAS::trace('URL`'.$service_url.'\' has been read, storing cookies:');
-				foreach ( $headers as $header ) {
-					// test if the header is a cookie
-					if ( preg_match('/^Set-Cookie:/',$header) ) {
-						// the header is a cookie, remove the beginning
-						$header_val = preg_replace('/^Set-Cookie: */','',$header);
-						// extract interesting information
-						$name_val = strtok($header_val,'; ');
-						// extract the name and the value of the cookie
-						$cookie_name = strtok($name_val,'=');
-						$cookie_val = strtok('=');
-						// store the cookie 
-						$_SESSION['phpCAS']['services'][$url]['cookies'][$cookie_name] = $cookie_val;
-						phpCAS::trace($cookie_name.' -> '.$cookie_val);
-					}
-				}
-			}
-		}
-		
-		phpCAS::traceEnd($res);
-		return $res;
-		}
-	
-	/**
-	 * This method is used to access an IMAP/POP3/NNTP service.
-	 * 
-	 * @param $url a string giving the URL of the service, including the mailing box
-	 * for IMAP URLs, as accepted by imap_open().
-	 * @param $service a string giving for CAS retrieve Proxy ticket
-	 * @param $flags options given to imap_open().
-	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
-	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
-	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT AVAILABLE.
-	 * @param $err_msg an error message on failure
-	 * @param $pt the Proxy Ticket (PT) retrieved from the CAS server to access the URL
-	 * on success, FALSE on error).
-	 *
-	 * @return an IMAP stream on success, FALSE otherwise (in this later case, $err_code
-	 * gives the reason why it failed and $err_msg contains an error message).
-	 *
-	 * @public
-	 */
-	function serviceMail($url,$service,$flags,&$err_code,&$err_msg,&$pt)
-		{
-		phpCAS::traceBegin();
-		// at first retrieve a PT
-		$pt = $this->retrievePT($service,$err_code,$output);
-		
-		$stream = FALSE;
-		
-		// test if PT was retrieved correctly
-		if ( !$pt ) {
-			// note: $err_code and $err_msg are filled by CASClient::retrievePT()
-			phpCAS::trace('PT was not retrieved correctly');
-		} else {
-			phpCAS::trace('opening IMAP URL `'.$url.'\'...');
-			$stream = @imap_open($url,$this->getUser(),$pt,$flags);
-			if ( !$stream ) {
-				phpCAS::trace('could not open URL');
-				$err_code = PHPCAS_SERVICE_NOT_AVAILABLE;
-				// give an error message
-				$err_msg = sprintf($this->getString(CAS_STR_SERVICE_UNAVAILABLE),
-					$service_url,
-					var_export(imap_errors(),TRUE));
-				$pt = FALSE;
-				$stream = FALSE;
-			} else {
-				phpCAS::trace('ok');
-			}
-		}
-		
-		phpCAS::traceEnd($stream);
-		return $stream;
-		}
-	
-	/** @} */
-	
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	// XX                                                                    XX
-	// XX                  PROXIED CLIENT FEATURES (CAS 2.0)                 XX
-	// XX                                                                    XX
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	
-	// ########################################################################
-	//  PT
-	// ########################################################################
-	/**
-	 * @addtogroup internalProxied
-	 * @{
-	 */  
-	
-	/**
-	 * the Proxy Ticket provided in the URL of the request if present
-	 * (empty otherwise). Written by CASClient::CASClient(), read by 
-	 * CASClient::getPT() and CASClient::hasPGT().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_pt = '';
-	
-	/**
-	 * This method returns the Proxy Ticket provided in the URL of the request.
-	 * @return The proxy ticket.
-	 * @private
-	 */
-	function getPT()
-		{
-		//      return 'ST'.substr($this->_pt, 2);
-		return $this->_pt;
-		}
-	
-	/**
-	 * This method stores the Proxy Ticket.
-	 * @param $pt The Proxy Ticket.
-	 * @private
-	 */
-	function setPT($pt)
-		{ $this->_pt = $pt; }
-	
-	/**
-	 * This method tells if a Proxy Ticket was stored.
-	 * @return TRUE if a Proxy Ticket has been stored.
-	 * @private
-	 */
-	function hasPT()
-		{ return !empty($this->_pt); }
-	/**
-	 * This method returns the SAML Ticket provided in the URL of the request.
-	 * @return The SAML ticket.
-	 * @private
-	 */
-	function getSA()
-		{ return 'ST'.substr($this->_sa, 2); }
-	
-	/**
-	 * This method stores the SAML Ticket.
-	 * @param $sa The SAML Ticket.
-	 * @private
-	 */
-	function setSA($sa)
-		{ $this->_sa = $sa; }
-	
-	/**
-	 * This method tells if a SAML Ticket was stored.
-	 * @return TRUE if a SAML Ticket has been stored.
-	 * @private
-	 */
-	function hasSA()
-		{ return !empty($this->_sa); }
-	
-	/** @} */
-	// ########################################################################
-	//  PT VALIDATION
-	// ########################################################################
-	/**
-	 * @addtogroup internalProxied
-	 * @{
-	 */  
-	
-	/**
-	 * This method is used to validate a ST or PT; halt on failure
-	 * Used for all CAS 2.0 validations
-	 * @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
-	 *
-	 * @private
-	 */
-	function validatePT(&$validate_url,&$text_response,&$tree_response)
-		{
-		phpCAS::traceBegin();
-		// build the URL to validate the ticket
-		$validate_url = $this->getServerProxyValidateURL().'&ticket='.$this->getPT();
-		
-		if ( $this->isProxy() ) {
-			// pass the callback url for CAS proxies
-			$validate_url .= '&pgtUrl='.$this->getCallbackURL();
-		}
-		
-		// open and read the URL
-		if ( !$this->readURL($validate_url,''/*cookies*/,$headers,$text_response,$err_msg) ) {
-			phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
-			$this->authError('PT not validated',
-				$validate_url,
-				TRUE/*$no_response*/);
-		}
-		
-		// read the response of the CAS server into a DOM object
-		if ( !($dom = domxml_open_mem($text_response))) {
-			// read failed
-			$this->authError('PT not validated',
-				$validate_url,
-				FALSE/*$no_response*/,
-				TRUE/*$bad_response*/,
-				$text_response);
-		}
-		// read the root node of the XML tree
-		if ( !($tree_response = $dom->document_element()) ) {
-			// read failed
-			$this->authError('PT not validated',
-				$validate_url,
-				FALSE/*$no_response*/,
-				TRUE/*$bad_response*/,
-				$text_response);
-		}
-		// insure that tag name is 'serviceResponse'
-		if ( $tree_response->node_name() != 'serviceResponse' ) {
-			// bad root node
-			$this->authError('PT not validated',
-				$validate_url,
-				FALSE/*$no_response*/,
-				TRUE/*$bad_response*/,
-				$text_response);
-		}
-		if ( sizeof($arr = $tree_response->get_elements_by_tagname("authenticationSuccess")) != 0) {
-			// authentication succeded, extract the user name
-			if ( sizeof($arr = $tree_response->get_elements_by_tagname("user")) == 0) {
-				// no user specified => error
-				$this->authError('PT not validated',
-					$validate_url,
-					FALSE/*$no_response*/,
-					TRUE/*$bad_response*/,
-					$text_response);
-			}
-			$this->setUser(trim($arr[0]->get_content()));
-			
-		} else if ( sizeof($arr = $tree_response->get_elements_by_tagname("authenticationFailure")) != 0) {
-			// authentication succeded, extract the error code and message
-			$this->authError('PT not validated',
-				$validate_url,
-				FALSE/*$no_response*/,
-				FALSE/*$bad_response*/,
-				$text_response,
-				$arr[0]->get_attribute('code')/*$err_code*/,
-				trim($arr[0]->get_content())/*$err_msg*/);
-		} else {
-			$this->authError('PT not validated',
-				$validate_url,	
-				FALSE/*$no_response*/,
-				TRUE/*$bad_response*/,
-				$text_response);
-		}
-		
-		// at this step, PT has been validated and $this->_user has been set,
-		
-		phpCAS::traceEnd(TRUE);
-		return TRUE;
-		}
-	
-	/** @} */
-	
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	// XX                                                                    XX
-	// XX                               MISC                                 XX
-	// XX                                                                    XX
-	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-	
-	/**
-	 * @addtogroup internalMisc
-	 * @{
-	 */  
-	
-	// ########################################################################
-	//  URL
-	// ########################################################################
-	/**
-	 * the URL of the current request (without any ticket CGI parameter). Written 
-	 * and read by CASClient::getURL().
-	 *
-	 * @hideinitializer
-	 * @private
-	 */
-	var $_url = '';
-	
-	/**
-	 * This method returns the URL of the current request (without any ticket
-	 * CGI parameter).
-	 *
-	 * @return The URL
-	 *
-	 * @private
-	 */
-	function getURL()
-		{
-		phpCAS::traceBegin();
-		// the URL is built when needed only
-		if ( empty($this->_url) ) {
-			$final_uri = '';
-			// remove the ticket if present in the URL
-			$final_uri = ($this->isHttps()) ? 'https' : 'http';
-			$final_uri .= '://';
-			/* replaced by Julien Marchal - v0.4.6
-			 * $this->_url .= $_SERVER['SERVER_NAME'];
-			 */
-			if(empty($_SERVER['HTTP_X_FORWARDED_SERVER'])){
-				/* replaced by teedog - v0.4.12
-				 * $this->_url .= $_SERVER['SERVER_NAME'];
-				 */
-				if (empty($_SERVER['SERVER_NAME'])) {
-					$server_name = $_SERVER['HTTP_HOST'];
-				} else {
-					$server_name = $_SERVER['SERVER_NAME'];
-				}
-			} else {
-				$server_name = $_SERVER['HTTP_X_FORWARDED_SERVER'];
-			}
-			$final_uri .= $server_name;
-			if (!strpos($server_name, ':')) {
-				if ( ($this->isHttps() && $_SERVER['SERVER_PORT']!=443)
-						|| (!$this->isHttps() && $_SERVER['SERVER_PORT']!=80) ) {
-					$final_uri .= ':';
-					$final_uri .= $_SERVER['SERVER_PORT'];
-				}
-			}
-			
-			$request_uri	= explode('?', $_SERVER['REQUEST_URI'], 2);
-			$final_uri		.= $request_uri[0];
-			
-			if (isset($request_uri[1]) && $request_uri[1])
-			{
-				$query_string	= $this->removeParameterFromQueryString('ticket', $request_uri[1]);
-				
-				// If the query string still has anything left, append it to the final URI
-				if ($query_string !== '')
-					$final_uri	.= "?$query_string";
-				
-			}
-			
-			phpCAS::trace("Final URI: $final_uri");
-			$this->setURL($final_uri);
-		}
-		phpCAS::traceEnd($this->_url);
-		return $this->_url;
-	}
-	
-
-		
-	/**
-	 * Removes a parameter from a query string
-	 * 
-	 * @param string $parameterName 
-	 * @param string $queryString
-	 * @return string
-	 *
-	 * @link http://stackoverflow.com/questions/1842681/regular-expression-to-remove-one-parameter-from-query-string
-	 */
-	function removeParameterFromQueryString($parameterName, $queryString)
-	{
-		$parameterName	= preg_quote($parameterName);
-		return preg_replace("/&$parameterName(=[^&]*)?|^$parameterName(=[^&]*)?&?/", '', $queryString);
-	}
-
-	
-	/**
-	 * This method sets the URL of the current request 
-	 *
-	 * @param $url url to set for service
-	 *
-	 * @private
-	 */
-	function setURL($url)
-		{
-		$this->_url = $url;
-		}
-	
-	// ########################################################################
-	//  AUTHENTICATION ERROR HANDLING
-	// ########################################################################
-	/**
-	 * This method is used to print the HTML output when the user was not authenticated.
-	 *
-	 * @param $failure the failure that occured
-	 * @param $cas_url the URL the CAS server was asked for
-	 * @param $no_response the response from the CAS server (other 
-	 * parameters are ignored if TRUE)
-	 * @param $bad_response bad response from the CAS server ($err_code
-	 * and $err_msg ignored if TRUE)
-	 * @param $cas_response the response of the CAS server
-	 * @param $err_code the error code given by the CAS server
-	 * @param $err_msg the error message given by the CAS server
-	 *
-	 * @private
-	 */
-	function authError($failure,$cas_url,$no_response,$bad_response='',$cas_response='',$err_code='',$err_msg='')
-		{
-		phpCAS::traceBegin();
-		
-		$this->printHTMLHeader($this->getString(CAS_STR_AUTHENTICATION_FAILED));
-		printf($this->getString(CAS_STR_YOU_WERE_NOT_AUTHENTICATED),htmlentities($this->getURL()),$_SERVER['SERVER_ADMIN']);
-		phpCAS::trace('CAS URL: '.$cas_url);
-		phpCAS::trace('Authentication failure: '.$failure);
-		if ( $no_response ) {
-			phpCAS::trace('Reason: no response from the CAS server');
-		} else {
-			if ( $bad_response ) {
-				phpCAS::trace('Reason: bad response from the CAS server');
-			} else {
-				switch ($this->getServerVersion()) {
-					case CAS_VERSION_1_0:
-						phpCAS::trace('Reason: CAS error');
-						break;
-					case CAS_VERSION_2_0:
-						if ( empty($err_code) )
-							phpCAS::trace('Reason: no CAS error');
-						else
-							phpCAS::trace('Reason: ['.$err_code.'] CAS error: '.$err_msg);
-						break;
-				}
-			}
-			phpCAS::trace('CAS response: '.$cas_response);
-		}
-		$this->printHTMLFooter();
-		phpCAS::traceExit();
-		exit();
-		}
-	
-	/** @} */
-}
-
-?>

+ 0 - 499
main/auth/cas/lib/CAS/domxml-php4-to-php5.php

@@ -1,499 +0,0 @@
-<?php
-/*
-	Requires PHP5, uses built-in DOM extension.
-	To be used in PHP4 scripts using DOMXML extension: allows PHP4/DOMXML scripts to run on PHP5/DOM.
-	(Optional: requires PHP5/XSL extension for domxml_xslt functions, PHP>=5.1 for XPath evaluation functions, and PHP>=5.1/libxml for DOMXML error reports)
-
-	Typical use:
-	{
-		if (PHP_VERSION>='5')
-			require_once('domxml-php4-to-php5.php');
-	}
-
-	Version 1.21, 2008-12-05, http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
-
-	------------------------------------------------------------------
-	Written by Alexandre Alapetite, http://alexandre.alapetite.net/cv/
-
-	Copyright 2004-2008, GNU Lesser General Public License,
-	http://www.gnu.org/licenses/lgpl.html
-
-	This program is free software: you can redistribute it and/or modify
-	it under the terms of the GNU Lesser General Public License as published by
-	the Free Software Foundation, either version 3 of the License, or
-	(at your option) any later version.
-	This program 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 Lesser General Public License for more details.
-	You should have received a copy of the GNU Lesser General Public License
-	along with this program. If not, see <http://www.gnu.org/licenses/lgpl.html>
-
-	== Rights and obligations ==
-	- Attribution: You must give the original author credit.
-	- Share Alike: If you alter or transform this library,
-	   you may distribute the resulting library only under the same license GNU/LGPL.
-	- In case of jurisdiction dispute, the French law is authoritative.
-	- Any of these conditions can be waived if you get permission from Alexandre Alapetite.
-	- Not required, but please send to Alexandre Alapetite the modifications you make,
-	   in order to improve this file for the benefit of everybody.
-
-	If you want to distribute this code, please do it as a link to:
-	http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
-*/
-
-define('DOMXML_LOAD_PARSING',0);
-define('DOMXML_LOAD_VALIDATING',1);
-define('DOMXML_LOAD_RECOVERING',2);
-define('DOMXML_LOAD_SUBSTITUTE_ENTITIES',4);
-//define('DOMXML_LOAD_COMPLETE_ATTRS',8);
-define('DOMXML_LOAD_DONT_KEEP_BLANKS',16);
-
-function domxml_new_doc($version) {return new php4DOMDocument();}
-function domxml_new_xmldoc($version) {return new php4DOMDocument();}
-function domxml_open_file($filename,$mode=DOMXML_LOAD_PARSING,&$error=null)
-{
-	$dom=new php4DOMDocument($mode);
-	$errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION');
-	if ($errorMode) libxml_use_internal_errors(true);
-	if (!$dom->myDOMNode->load($filename)) $dom=null;
-	if ($errorMode)
-	{
-		$error=array_map('_error_report',libxml_get_errors());
-		libxml_clear_errors();
-	}
-	return $dom;
-}
-function domxml_open_mem($str,$mode=DOMXML_LOAD_PARSING,&$error=null)
-{
-	$dom=new php4DOMDocument($mode);
-	$errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION');
-	if ($errorMode) libxml_use_internal_errors(true);
-	if (!$dom->myDOMNode->loadXML($str)) $dom=null;
-	if ($errorMode)
-	{
-		$error=array_map('_error_report',libxml_get_errors());
-		libxml_clear_errors();
-	}
-	return $dom;
-}
-function html_doc($html_doc,$from_file=false)
-{
-	$dom=new php4DOMDocument();
-	if ($from_file) $result=$dom->myDOMNode->loadHTMLFile($html_doc);
-	else $result=$dom->myDOMNode->loadHTML($html_doc);
-	return $result ? $dom : null;
-}
-function html_doc_file($filename) {return html_doc($filename,true);}
-function xmldoc($str) {return domxml_open_mem($str);}
-function xmldocfile($filename) {return domxml_open_file($filename);}
-function xpath_eval($xpath_context,$eval_str,$contextnode=null) {return $xpath_context->xpath_eval($eval_str,$contextnode);}
-function xpath_new_context($dom_document) {return new php4DOMXPath($dom_document);}
-function xpath_register_ns($xpath_context,$prefix,$namespaceURI) {return $xpath_context->myDOMXPath->registerNamespace($prefix,$namespaceURI);}
-function _entityDecode($text) {return html_entity_decode(strtr($text,array('&apos;'=>'\'')),ENT_QUOTES,'UTF-8');}
-function _error_report($error) {return array('errormessage'=>$error->message,'nodename'=>'','line'=>$error->line,'col'=>$error->column)+($error->file==''?array():array('directory'=>dirname($error->file),'file'=>basename($error->file)));}
-
-class php4DOMAttr extends php4DOMNode
-{
-	function __get($name)
-	{
-		if ($name==='name') return $this->myDOMNode->name;
-		else return parent::__get($name);
-	}
-	function name() {return $this->myDOMNode->name;}
-	function set_content($text) {}
-	//function set_value($content) {return $this->myDOMNode->value=htmlspecialchars($content,ENT_QUOTES);}
-	function specified() {return $this->myDOMNode->specified;}
-	function value() {return $this->myDOMNode->value;}
-}
-
-class php4DOMDocument extends php4DOMNode
-{
-	function php4DOMDocument($mode=DOMXML_LOAD_PARSING)
-	{
-		$this->myDOMNode=new DOMDocument();
-		$this->myOwnerDocument=$this;
-		if ($mode & DOMXML_LOAD_VALIDATING) $this->myDOMNode->validateOnParse=true;
-		if ($mode & DOMXML_LOAD_RECOVERING) $this->myDOMNode->recover=true;
-		if ($mode & DOMXML_LOAD_SUBSTITUTE_ENTITIES) $this->myDOMNode->substituteEntities=true;
-		if ($mode & DOMXML_LOAD_DONT_KEEP_BLANKS) $this->myDOMNode->preserveWhiteSpace=false;
-	}
-	function add_root($name)
-	{
-		if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild);
-		return new php4DOMElement($this->myDOMNode->appendChild($this->myDOMNode->createElement($name)),$this->myOwnerDocument);
-	}
-	function create_attribute($name,$value)
-	{
-		$myAttr=$this->myDOMNode->createAttribute($name);
-		$myAttr->value=htmlspecialchars($value,ENT_QUOTES);
-		return new php4DOMAttr($myAttr,$this);
-	}
-	function create_cdata_section($content) {return new php4DOMNode($this->myDOMNode->createCDATASection($content),$this);}
-	function create_comment($data) {return new php4DOMNode($this->myDOMNode->createComment($data),$this);}
-	function create_element($name) {return new php4DOMElement($this->myDOMNode->createElement($name),$this);}
-	function create_element_ns($uri,$name,$prefix=null)
-	{
-		if ($prefix==null) $prefix=$this->myDOMNode->lookupPrefix($uri);
-		if (($prefix==null)&&(($this->myDOMNode->documentElement==null)||(!$this->myDOMNode->documentElement->isDefaultNamespace($uri)))) $prefix='a'.sprintf('%u',crc32($uri));
-		return new php4DOMElement($this->myDOMNode->createElementNS($uri,$prefix==null ? $name : $prefix.':'.$name),$this);
-	}
-	function create_entity_reference($content) {return new php4DOMNode($this->myDOMNode->createEntityReference($content),$this);} //By Walter Ebert 2007-01-22
-	function create_processing_instruction($target,$data=''){return new php4DomProcessingInstruction($this->myDOMNode->createProcessingInstruction($target,$data),$this);}
-	function create_text_node($content) {return new php4DOMText($this->myDOMNode->createTextNode($content),$this);}
-	function document_element() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);}
-	function dump_file($filename,$compressionmode=false,$format=false)
-	{
-		$format0=$this->myDOMNode->formatOutput;
-		$this->myDOMNode->formatOutput=$format;
-		$res=$this->myDOMNode->save($filename);
-		$this->myDOMNode->formatOutput=$format0;
-		return $res;
-	}
-	function dump_mem($format=false,$encoding=false)
-	{
-		$format0=$this->myDOMNode->formatOutput;
-		$this->myDOMNode->formatOutput=$format;
-		$encoding0=$this->myDOMNode->encoding;
-		if ($encoding) $this->myDOMNode->encoding=$encoding;
-		$dump=$this->myDOMNode->saveXML();
-		$this->myDOMNode->formatOutput=$format0;
-		if ($encoding) $this->myDOMNode->encoding= $encoding0=='' ? 'UTF-8' : $encoding0; //UTF-8 is XML default encoding
-		return $dump;
-	}
-	function free()
-	{
-		if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild);
-		$this->myDOMNode=null;
-		$this->myOwnerDocument=null;
-	}
-	function get_element_by_id($id) {return parent::_newDOMElement($this->myDOMNode->getElementById($id),$this);}
-	function get_elements_by_tagname($name)
-	{
-		$myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
-		$nodeSet=array();
-		$i=0;
-		if (isset($myDOMNodeList))
-			while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this);
-		return $nodeSet;
-	}
-	function html_dump_mem() {return $this->myDOMNode->saveHTML();}
-	function root() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);}
-	function xinclude() {return $this->myDOMNode->xinclude();}
-	function xpath_new_context() {return new php4DOMXPath($this);}
-}
-
-class php4DOMElement extends php4DOMNode
-{
-	function add_namespace($uri,$prefix)
-	{
-		if ($this->myDOMNode->hasAttributeNS('http://www.w3.org/2000/xmlns/',$prefix)) return false;
-		else
-		{
-			$this->myDOMNode->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$prefix,$uri); //By Daniel Walker 2006-09-08
-			return true;
-		}
-	}
-	function get_attribute($name) {return $this->myDOMNode->getAttribute($name);}
-	function get_attribute_node($name) {return parent::_newDOMElement($this->myDOMNode->getAttributeNode($name),$this->myOwnerDocument);}
-	function get_elements_by_tagname($name)
-	{
-		$myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
-		$nodeSet=array();
-		$i=0;
-		if (isset($myDOMNodeList))
-			while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument);
-		return $nodeSet;
-	}
-	function has_attribute($name) {return $this->myDOMNode->hasAttribute($name);}
-	function remove_attribute($name) {return $this->myDOMNode->removeAttribute($name);}
-	function set_attribute($name,$value)
-	{
-		//return $this->myDOMNode->setAttribute($name,$value); //Does not return a DomAttr
-		$myAttr=$this->myDOMNode->ownerDocument->createAttribute($name);
-		$myAttr->value=htmlspecialchars($value,ENT_QUOTES); //Entity problem reported by AL-DesignWorks 2007-09-07
-		$this->myDOMNode->setAttributeNode($myAttr);
-		return new php4DOMAttr($myAttr,$this->myOwnerDocument);
-	}
-	/*function set_attribute_node($attr)
-	{
-		$this->myDOMNode->setAttributeNode($this->_importNode($attr));
-		return $attr;
-	}*/
-	function set_name($name)
-	{
-		if ($this->myDOMNode->prefix=='') $newNode=$this->myDOMNode->ownerDocument->createElement($name);
-		else $newNode=$this->myDOMNode->ownerDocument->createElementNS($this->myDOMNode->namespaceURI,$this->myDOMNode->prefix.':'.$name);
-		$myDOMNodeList=$this->myDOMNode->attributes;
-		$i=0;
-		if (isset($myDOMNodeList))
-			while ($node=$myDOMNodeList->item($i++))
-				if ($node->namespaceURI=='') $newNode->setAttribute($node->name,$node->value);
-				else $newNode->setAttributeNS($node->namespaceURI,$node->nodeName,$node->value);
-		$myDOMNodeList=$this->myDOMNode->childNodes;
-		if (isset($myDOMNodeList))
-			while ($node=$myDOMNodeList->item(0)) $newNode->appendChild($node);
-		$this->myDOMNode->parentNode->replaceChild($newNode,$this->myDOMNode);
-		$this->myDOMNode=$newNode;
-		return true;
-	}
-	function tagname() {return $this->tagname;}
-}
-
-class php4DOMNode
-{
-	public $myDOMNode;
-	public $myOwnerDocument;
-	function php4DOMNode($aDomNode,$aOwnerDocument)
-	{
-		$this->myDOMNode=$aDomNode;
-		$this->myOwnerDocument=$aOwnerDocument;
-	}
-	function __get($name)
-	{
-		switch ($name)
-		{
-			case 'type': return $this->myDOMNode->nodeType;
-			case 'tagname': return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->tagName; //Avoid namespace prefix for DOMElement
-			case 'content': return $this->myDOMNode->textContent;
-			case 'value': return $this->myDOMNode->value;
-			default:
-				$myErrors=debug_backtrace();
-				trigger_error('Undefined property: '.get_class($this).'::$'.$name.' ['.$myErrors[0]['file'].':'.$myErrors[0]['line'].']',E_USER_NOTICE);
-				return false;
-		}
-	}
-	function add_child($newnode) {return append_child($newnode);}
-	function add_namespace($uri,$prefix) {return false;}
-	function append_child($newnode) {return self::_newDOMElement($this->myDOMNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);}
-	function append_sibling($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);}
-	function attributes()
-	{
-		$myDOMNodeList=$this->myDOMNode->attributes;
-		if (!(isset($myDOMNodeList)&&$this->myDOMNode->hasAttributes())) return null;
-		$nodeSet=array();
-		$i=0;
-		while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMAttr($node,$this->myOwnerDocument);
-		return $nodeSet;
-	}
-	function child_nodes()
-	{
-		$myDOMNodeList=$this->myDOMNode->childNodes;
-		$nodeSet=array();
-		$i=0;
-		if (isset($myDOMNodeList))
-			while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=self::_newDOMElement($node,$this->myOwnerDocument);
-		return $nodeSet;
-	}
-	function children() {return $this->child_nodes();}
-	function clone_node($deep=false) {return self::_newDOMElement($this->myDOMNode->cloneNode($deep),$this->myOwnerDocument);}
-	//dump_node($node) should only be called on php4DOMDocument
-	function dump_node($node=null) {return $node==null ? $this->myOwnerDocument->myDOMNode->saveXML($this->myDOMNode) : $this->myOwnerDocument->myDOMNode->saveXML($node->myDOMNode);}
-	function first_child() {return self::_newDOMElement($this->myDOMNode->firstChild,$this->myOwnerDocument);}
-	function get_content() {return $this->myDOMNode->textContent;}
-	function has_attributes() {return $this->myDOMNode->hasAttributes();}
-	function has_child_nodes() {return $this->myDOMNode->hasChildNodes();}
-	function insert_before($newnode,$refnode) {return self::_newDOMElement($this->myDOMNode->insertBefore($this->_importNode($newnode),$refnode==null?null:$refnode->myDOMNode),$this->myOwnerDocument);}
-	function is_blank_node() {return ($this->myDOMNode->nodeType===XML_TEXT_NODE)&&preg_match('%^\s*$%',$this->myDOMNode->nodeValue);}
-	function last_child() {return self::_newDOMElement($this->myDOMNode->lastChild,$this->myOwnerDocument);}
-	function new_child($name,$content)
-	{
-		$mySubNode=$this->myDOMNode->ownerDocument->createElement($name);
-		$mySubNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($content)));
-		$this->myDOMNode->appendChild($mySubNode);
-		return new php4DOMElement($mySubNode,$this->myOwnerDocument);
-	}
-	function next_sibling() {return self::_newDOMElement($this->myDOMNode->nextSibling,$this->myOwnerDocument);}
-	function node_name() {return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->nodeName;} //Avoid namespace prefix for DOMElement
-	function node_type() {return $this->myDOMNode->nodeType;}
-	function node_value() {return $this->myDOMNode->nodeValue;}
-	function owner_document() {return $this->myOwnerDocument;}
-	function parent_node() {return self::_newDOMElement($this->myDOMNode->parentNode,$this->myOwnerDocument);}
-	function prefix() {return $this->myDOMNode->prefix;}
-	function previous_sibling() {return self::_newDOMElement($this->myDOMNode->previousSibling,$this->myOwnerDocument);}
-	function remove_child($oldchild) {return self::_newDOMElement($this->myDOMNode->removeChild($oldchild->myDOMNode),$this->myOwnerDocument);}
-	function replace_child($newnode,$oldnode) {return self::_newDOMElement($this->myDOMNode->replaceChild($this->_importNode($newnode),$oldnode->myDOMNode),$this->myOwnerDocument);}
-	function replace_node($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->replaceChild($this->_importNode($newnode),$this->myDOMNode),$this->myOwnerDocument);}
-	function set_content($text) {return $this->myDOMNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($text)));} //Entity problem reported by AL-DesignWorks 2007-09-07
-	//function set_name($name) {return $this->myOwnerDocument->renameNode($this->myDOMNode,$this->myDOMNode->namespaceURI,$name);}
-	function set_namespace($uri,$prefix=null)
-	{//Contributions by Daniel Walker 2006-09-08
-		$nsprefix=$this->myDOMNode->lookupPrefix($uri);
-		if ($nsprefix==null)
-		{
-			$nsprefix= $prefix==null ? $nsprefix='a'.sprintf('%u',crc32($uri)) : $prefix;
-			if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE)
-			{
-				if (($prefix!=null)&&$this->myDOMNode->ownerElement->hasAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)&&
-					($this->myDOMNode->ownerElement->getAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)!=$uri))
-				{//Remove namespace
-					$parent=$this->myDOMNode->ownerElement;
-					$parent->removeAttributeNode($this->myDOMNode);
-					$parent->setAttribute($this->myDOMNode->localName,$this->myDOMNode->nodeValue);
-					$this->myDOMNode=$parent->getAttributeNode($this->myDOMNode->localName);
-					return;
-				}
-				$this->myDOMNode->ownerElement->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$nsprefix,$uri);
-			}
-		}
-		if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE)
-		{
-			$parent=$this->myDOMNode->ownerElement;
-			$parent->removeAttributeNode($this->myDOMNode);
-			$parent->setAttributeNS($uri,$nsprefix.':'.$this->myDOMNode->localName,$this->myDOMNode->nodeValue);
-			$this->myDOMNode=$parent->getAttributeNodeNS($uri,$this->myDOMNode->localName);
-		}
-		elseif ($this->myDOMNode->nodeType===XML_ELEMENT_NODE)
-		{
-			$NewNode=$this->myDOMNode->ownerDocument->createElementNS($uri,$nsprefix.':'.$this->myDOMNode->localName);
-			foreach ($this->myDOMNode->attributes as $n) $NewNode->appendChild($n->cloneNode(true));
-			foreach ($this->myDOMNode->childNodes as $n) $NewNode->appendChild($n->cloneNode(true));
-			$xpath=new DOMXPath($this->myDOMNode->ownerDocument);
-			$myDOMNodeList=$xpath->query('namespace::*[name()!="xml"]',$this->myDOMNode); //Add old namespaces
-			foreach ($myDOMNodeList as $n) $NewNode->setAttributeNS('http://www.w3.org/2000/xmlns/',$n->nodeName,$n->nodeValue); 
-			$this->myDOMNode->parentNode->replaceChild($NewNode,$this->myDOMNode);
-			$this->myDOMNode=$NewNode;
-		}
-	}
-	function unlink_node()
-	{
-		if ($this->myDOMNode->parentNode!=null)
-		{
-			if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) $this->myDOMNode->parentNode->removeAttributeNode($this->myDOMNode);
-			else $this->myDOMNode->parentNode->removeChild($this->myDOMNode);
-		}
-	}
-	protected function _importNode($newnode) {return $this->myOwnerDocument===$newnode->myOwnerDocument ? $newnode->myDOMNode : $this->myOwnerDocument->myDOMNode->importNode($newnode->myDOMNode,true);} //To import DOMNode from another DOMDocument
-	static function _newDOMElement($aDOMNode,$aOwnerDocument)
-	{//Check the PHP5 DOMNode before creating a new associated PHP4 DOMNode wrapper
-		if ($aDOMNode==null) return null;
-		switch ($aDOMNode->nodeType)
-		{
-			case XML_ELEMENT_NODE: return new php4DOMElement($aDOMNode,$aOwnerDocument);
-			case XML_TEXT_NODE: return new php4DOMText($aDOMNode,$aOwnerDocument);
-			case XML_ATTRIBUTE_NODE: return new php4DOMAttr($aDOMNode,$aOwnerDocument);
-			case XML_PI_NODE: return new php4DomProcessingInstruction($aDOMNode,$aOwnerDocument);
-			default: return new php4DOMNode($aDOMNode,$aOwnerDocument);
-		}
-	}
-}
-
-class php4DomProcessingInstruction extends php4DOMNode
-{
-	function data() {return $this->myDOMNode->data;}
-	function target() {return $this->myDOMNode->target;}
-}
-
-class php4DOMText extends php4DOMNode
-{
-	function __get($name)
-	{
-		if ($name==='tagname') return '#text';
-		else return parent::__get($name);
-	}
-	function tagname() {return '#text';}
-	function set_content($text) {$this->myDOMNode->nodeValue=$text; return true;}
-}
-
-if (!defined('XPATH_NODESET'))
-{
-	define('XPATH_UNDEFINED',0);
-	define('XPATH_NODESET',1);
-	define('XPATH_BOOLEAN',2);
-	define('XPATH_NUMBER',3);
-	define('XPATH_STRING',4);
-	/*define('XPATH_POINT',5);
-	define('XPATH_RANGE',6);
-	define('XPATH_LOCATIONSET',7);
-	define('XPATH_USERS',8);
-	define('XPATH_XSLT_TREE',9);*/
-}
-
-class php4DOMNodelist
-{
-	private $myDOMNodelist;
-	public $nodeset;
-	public $type=XPATH_UNDEFINED;
-	public $value;
-	function php4DOMNodelist($aDOMNodelist,$aOwnerDocument)
-	{
-		if (!isset($aDOMNodelist)) return; 
-		elseif (is_object($aDOMNodelist)||is_array($aDOMNodelist))
-		{
-			if ($aDOMNodelist->length>0)
-			{
-				$this->myDOMNodelist=$aDOMNodelist;
-				$this->nodeset=array();
-				$this->type=XPATH_NODESET;
-				$i=0;
-				while ($node=$this->myDOMNodelist->item($i++)) $this->nodeset[]=php4DOMNode::_newDOMElement($node,$aOwnerDocument);
-			}
-		}
-		elseif (is_int($aDOMNodelist)||is_float($aDOMNodelist))
-		{
-			$this->type=XPATH_NUMBER;
-			$this->value=$aDOMNodelist;
-		}
-		elseif (is_bool($aDOMNodelist))
-		{
-			$this->type=XPATH_BOOLEAN;
-			$this->value=$aDOMNodelist;
-		}
-		elseif (is_string($aDOMNodelist))
-		{
-			$this->type=XPATH_STRING;
-			$this->value=$aDOMNodelist;
-		}
-	}
-}
-
-class php4DOMXPath
-{
-	public $myDOMXPath;
-	private $myOwnerDocument;
-	function php4DOMXPath($dom_document)
-	{
-		//TODO: If $dom_document is a DomElement, make that default $contextnode and modify XPath. Ex: '/test'
-		$this->myOwnerDocument=$dom_document->myOwnerDocument;
-		$this->myDOMXPath=new DOMXPath($this->myOwnerDocument->myDOMNode);
-	}
-	function xpath_eval($eval_str,$contextnode=null)
-	{
-		if (method_exists($this->myDOMXPath,'evaluate')) $xp=isset($contextnode) ? $this->myDOMXPath->evaluate($eval_str,$contextnode->myDOMNode) : $this->myDOMXPath->evaluate($eval_str);
-		else $xp=isset($contextnode) ? $this->myDOMXPath->query($eval_str,$contextnode->myDOMNode) : $this->myDOMXPath->query($eval_str);
-		$xp=new php4DOMNodelist($xp,$this->myOwnerDocument);
-		return ($xp->type===XPATH_UNDEFINED) ? false : $xp;
-	}
-	function xpath_register_ns($prefix,$namespaceURI) {return $this->myDOMXPath->registerNamespace($prefix,$namespaceURI);}
-}
-
-if (extension_loaded('xsl'))
-{//See also: http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
-	function domxml_xslt_stylesheet($xslstring) {return new php4DomXsltStylesheet(DOMDocument::loadXML($xslstring));}
-	function domxml_xslt_stylesheet_doc($dom_document) {return new php4DomXsltStylesheet($dom_document);}
-	function domxml_xslt_stylesheet_file($xslfile) {return new php4DomXsltStylesheet(DOMDocument::load($xslfile));}
-	class php4DomXsltStylesheet
-	{
-		private $myxsltProcessor;
-		function php4DomXsltStylesheet($dom_document)
-		{
-			$this->myxsltProcessor=new xsltProcessor();
-			$this->myxsltProcessor->importStyleSheet($dom_document);
-		}
-		function process($dom_document,$xslt_parameters=array(),$param_is_xpath=false)
-		{
-			foreach ($xslt_parameters as $param=>$value) $this->myxsltProcessor->setParameter('',$param,$value);
-			$myphp4DOMDocument=new php4DOMDocument();
-			$myphp4DOMDocument->myDOMNode=$this->myxsltProcessor->transformToDoc($dom_document->myDOMNode);
-			return $myphp4DOMDocument;
-		}
-		function result_dump_file($dom_document,$filename)
-		{
-			$html=$dom_document->myDOMNode->saveHTML();
-			file_put_contents($filename,$html);
-			return $html;
-		}
-		function result_dump_mem($dom_document) {return $dom_document->myDOMNode->saveHTML();}
-	}
-}
-?>

+ 0 - 27
main/auth/cas/lib/CAS/languages/catalan.php

@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file languages/spanish.php
- * @author Iván-Benjamín García Torà <ivaniclixx AT gmail DOT com>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'usant servidor',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'Autentificació CAS necessària!',
- CAS_STR_LOGOUT 
- => 'Sortida de CAS necessària!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'Ja hauria d\ haver estat redireccionat al servidor CAS. Feu click <a href="%s">aquí</a> per a continuar.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'Autentificació CAS fallida!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>No estàs autentificat.</p><p>Pots tornar a intentar-ho fent click <a href="%s">aquí</a>.</p><p>Si el problema persisteix hauría de contactar amb l\'<a href="mailto:%s">administrador d\'aquest llocc</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'El servei `<b>%s</b>\' no està disponible (<b>%s</b>).'
-);
-
-?>

+ 0 - 27
main/auth/cas/lib/CAS/languages/english.php

@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file languages/english.php
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'using server',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'CAS Authentication wanted!',
- CAS_STR_LOGOUT 
- => 'CAS logout wanted!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'You should already have been redirected to the CAS server. Click <a href="%s">here</a> to continue.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'CAS Authentication failed!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>You were not authenticated.</p><p>You may submit your request again by clicking <a href="%s">here</a>.</p><p>If the problem persists, you may contact <a href="mailto:%s">the administrator of this site</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'The service `<b>%s</b>\' is not available (<b>%s</b>).'
-);
-
-?>

+ 0 - 28
main/auth/cas/lib/CAS/languages/french.php

@@ -1,28 +0,0 @@
-<?php
-
-/**
- * @file languages/english.php
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'utilisant le serveur',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'Authentication CAS n�cessaire&nbsp;!',
- CAS_STR_LOGOUT 
- => 'D�connexion demand�e&nbsp;!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'Vous auriez du etre redirig�(e) vers le serveur CAS. Cliquez <a href="%s">ici</a> pour continuer.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'Authentification CAS infructueuse&nbsp;!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>Vous n\'avez pas �t� authentifi�(e).</p><p>Vous pouvez soumettre votre requete � nouveau en cliquant <a href="%s">ici</a>.</p><p>Si le probl�me persiste, vous pouvez contacter <a href="mailto:%s">l\'administrateur de ce site</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'Le service `<b>%s</b>\' est indisponible (<b>%s</b>)'
-
-);
-
-?>

+ 0 - 27
main/auth/cas/lib/CAS/languages/german.php

@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file languages/german.php
- * @author Henrik Genssen <hg at mediafactory.de>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'via Server',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'CAS Authentifizierung erforderlich!',
- CAS_STR_LOGOUT 
- => 'CAS Abmeldung!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'eigentlich h&auml;ten Sie zum CAS Server weitergeleitet werden sollen. Dr&uuml;cken Sie <a href="%s">hier</a> um fortzufahren.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'CAS Anmeldung fehlgeschlagen!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontkatieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'Der Dienst `<b>%s</b>\' ist nicht verf&uuml;gbar (<b>%s</b>).'
-);
-
-?>

+ 0 - 27
main/auth/cas/lib/CAS/languages/greek.php

@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file languages/greek.php
- * @author Vangelis Haniotakis <haniotak at ucnet.uoc.gr>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => '��������������� � ������������',
- CAS_STR_AUTHENTICATION_WANTED 
- => '���������� � ����������� CAS!',
- CAS_STR_LOGOUT 
- => '���������� � ���������� ��� CAS!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => '�� ������ �� ������ �������������� ���� ����������� CAS. ����� ���� <a href="%s">���</a> ��� �� ����������.',
- CAS_STR_AUTHENTICATION_FAILED 
- => '� ����������� CAS �������!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>��� ���������������.</p><p>�������� �� ����������������, �������� ���� <a href="%s">���</a>.</p><p>��� �� �������� ���������, ����� �� ����� �� ��� <a href="mailto:%s">�����������</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => '� �������� `<b>%s</b>\' ��� ����� ��������� (<b>%s</b>).'
-);
-
-?>

+ 0 - 27
main/auth/cas/lib/CAS/languages/japanese.php

@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file languages/japanese.php
- * @author fnorif (fnorif@yahoo.co.jp)
- * 
- * Now Encoding is EUC-JP and LF
- **/
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'using server',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'CAS�ˤ��ǧ�ڤ�Ԥ��ޤ�',
- CAS_STR_LOGOUT 
- => 'CAS����?�����Ȥ��ޤ�!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'CAS�����Ф˹Ԥ�ɬ�פ�����ޤ�����ưŪ��ž������ʤ����� <a href="%s">������</a> �򥯥�å�����³�Ԥ��ޤ���',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'CAS�ˤ��ǧ�ڤ˼��Ԥ��ޤ���',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>ǧ�ڤǤ��ޤ���Ǥ���.</p><p>�⤦���٥ꥯ�����Ȥ������������<a href="%s">������</a>�򥯥�å�.</p><p>���꤬��褷�ʤ����� <a href="mailto:%s">���Υ����Ȥδ����</a>���䤤��碌�Ƥ�������.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => '�����ӥ� `<b>%s</b>\' �����ѤǤ��ޤ��� (<b>%s</b>).'
-);
-
-?>

+ 0 - 24
main/auth/cas/lib/CAS/languages/languages.php

@@ -1,24 +0,0 @@
-<?php
-
-/**
- * @file languages/languages.php
- * Internationalization constants
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-//@{
-/**
- * a phpCAS string index
- */
-define("CAS_STR_USING_SERVER",                1);
-define("CAS_STR_AUTHENTICATION_WANTED",       2);
-define("CAS_STR_LOGOUT",                      3);
-define("CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED", 4);
-define("CAS_STR_AUTHENTICATION_FAILED",       5);
-define("CAS_STR_YOU_WERE_NOT_AUTHENTICATED",  6);
-define("CAS_STR_SERVICE_UNAVAILABLE",         7);
-//@}
-
-?>

+ 0 - 27
main/auth/cas/lib/CAS/languages/spanish.php

@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file languages/spanish.php
- * @author Iván-Benjamín García Torà <ivaniclixx AT gmail DOT com>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'usando servidor',
- CAS_STR_AUTHENTICATION_WANTED 
- => '¡Autentificación CAS necesaria!',
- CAS_STR_LOGOUT 
- => '¡Salida CAS necesaria!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'Ya debería haber sido redireccionado al servidor CAS. Haga click <a href="%s">aquí</a> para continuar.',
- CAS_STR_AUTHENTICATION_FAILED 
- => '¡Autentificación CAS fallida!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>No estás autentificado.</p><p>Puedes volver a intentarlo haciendo click <a href="%s">aquí</a>.</p><p>Si el problema persiste debería contactar con el <a href="mailto:%s">administrador de este sitio</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'El servicio `<b>%s</b>\' no está disponible (<b>%s</b>).'
-);
-
-?>

+ 0 - 45
main/auth/cas/logincas.php

@@ -1,45 +0,0 @@
-<?php
-//----------------------------------------------------------------------
-// CAS PLUGIN
-//----------------------------------------------------------------------
-// Copyright (c) 2006-2007 University Marc Bloch (UMB)
-//----------------------------------------------------------------------
-// This program is under the terms of the GENERAL PUBLIC LICENSE (GPL)
-// as published by the FREE SOFTWARE FOUNDATION. The GPL is available
-// through the world-wide-web at http://www.gnu.org/copyleft/gpl.html
-//----------------------------------------------------------------------
-// Authors: Pierre Cahard
-//----------------------------------------------------------------------
-// Load required
-require('../../inc/global.inc.php');
-require_once('authcas.php');
-use \ChamiloSession as Session;
-global $cas_auth_ver, $cas_auth_server, $cas_auth_port, $cas_auth_uri;
-// phpCAS
-
-/*
-If we are not logged and in our browser enter an URL with a name of a course
-e.g. http://www.chamilo.fr/chamilo/courses/COURSTESTOSETE/?id_session=0
-we go to page api_not_allowed :
-> Vous n'�tes pas autoris� � acc�der � cette page.
-> Soit votre connexion a expir�, soit vous essayez d'acc�der � une page pour laquelle vous ne disposez pas des permissions suffisantes.
-> Veuillez vous identifier � nouveau depuis la page d'accueil
-If we click on the link to go to homepage, some datas are entered in $_SESSION and if we enter our CAS loggin, we go to api_not_allowad_page again
-and again
-As a result, if we are not logged on, we have to destroy the session variables, before calling CAS page
-*/
-if (api_is_anonymous()) {
-    Session::destroy();
-}
-
-if (cas_configured()) {
-    if (!is_object($PHPCAS_CLIENT) ) {
-    	phpCAS::client($cas_auth_ver,$cas_auth_server,$cas_auth_port,$cas_auth_uri);
-    	phpCAS::setNoCasServerValidation();
-    }
-    phpCAS::forceAuthentication();
-    header('Location: '.api_get_path(WEB_PATH).api_get_setting('page_after_login'));
-}
-else {
-    header('Location: '.api_get_path(WEB_PATH));
-}

+ 0 - 12
main/auth/cas/logout.php

@@ -1,12 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/*
-Call this file to disconnect from CAS session.
-logoutWithUrl() not used because with CAS v3 you cannot redirect your logout to a specific URL
-because of security reason.
-*/
-require('../..//inc/global.inc.php');
-require_once('authcas.php');
-global $cas_auth_ver, $cas_auth_server, $cas_auth_port, $cas_auth_uri;
-phpCAS::client($cas_auth_ver,$cas_auth_server,$cas_auth_port,$cas_auth_uri);
-phpCAS::logout();

+ 0 - 32
main/auth/conditional_login/complete_phone_number.php

@@ -1,32 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-
-require_once dirname(__FILE__).'/../../inc/global.inc.php';
-$url =  api_get_path(WEB_PATH).'main/auth/conditional_login/complete_phone_number.php';
-
-if (! isset($_SESSION['conditional_login']['uid']))
-  die("Not Authorised");
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
-  </head>
-  <body>
-  <form id="data_completion" name="data_completion" method="post" action="<?php echo $url?>">
-        Téléphone : <input type="text" name="phone_number" />
-        <input type="submit" name="submit" value="Submit" />
-    </form>
-  </body>
-</html>
-<?php
-if (isset($_POST['submit'])){
-    $u = UserManager::get_user_info_by_id($_SESSION['conditional_login']['uid']);
-    $u['phone'] = $_POST['phone_number'];
-    $password = null; // we don't want to change the password 
-    $updated = UserManager::update_user($u['user_id'], $u['firstname'], $u['lastname'], $u['username'], $password, $u['auth_source'], $u['email'], $u['status'], $u['official_code'], $u['phone'], $u['picture_uri'], $u['expiration_date'], $u['active'], $u['creator_id'], $u['hr_dept_id'], $u['extra'], $u['language'],'');
-    if ($updated) {
-    ConditionalLogin::login();
-    }
-}
-?>

+ 0 - 64
main/auth/conditional_login/conditional_login.php

@@ -1,64 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-
-/*
- This script is included by local.inc.php to redirect users to some url if some conditions are satisfied. 
- * Please populate the $login_conditions array with a conditional function and an url. 
- * If the conditional function returns true the user will be redirected to URL at login.
- * This array must be filled for this module to work. 
- * This is an example asking the user to enter his phone number if it is empty. 
- * Note you can enter more than one condition in the array. They will be checked in the array order.
-*/
-/**
- * Please implements the functions of the $login_conditions array. 
- * Each of these function will take a user array (user_id, username, password (crypted), auth_source, active, expiration_date)
- */
-$login_conditions = array();
-
-//"Term and conditions" condition
-array_push($login_conditions, array(
-    'conditional_function'    => 'check_platform_legal_conditions',
-    'url'                     => api_get_path(WEB_CODE_PATH).'auth/inscription.php'
-));
-
-//array_push($login_conditions, array(
-//  'conditional_function' => 'dc_check_phone_number',
-//  'url' => api_get_path(WEB_PATH).'main/auth/conditional_login/complete_phone_number.php'
-//));
-
-require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php';
-
-function dc_check_phone_number($user){
-    $uInfo = UserManager::get_user_info_by_id($user['user_id']);
-    if (empty($uInfo['phone'])) {
-        return false;
-    }
-    return true;
-}
-
-/**
- * Checks if the user accepted or not the legal conditions 
- * 
- * @param array $user
- * @return boolean true if user pass, false otherwise
- */
-function check_platform_legal_conditions($user) {             
-    if (api_get_setting('allow_terms_conditions') == 'true') {
-        $term_and_condition_status = api_check_term_condition($user['user_id']);
-        // @todo not sure why we need the login password and update_term_status
-        if ($term_and_condition_status == false) {
-            $_SESSION['term_and_condition'] = array('user_id'           => $user['user_id'],
-                                                    //'login'             => $user['username'],
-                                                    //'password'          => $user['password'],
-                                                    //'update_term_status' => true,
-            );
-            return false;
-        } else {
-            unset($_SESSION['term_and_condition']);
-            return true;
-        }
-    } else {
-        //No validation user can pass
-        return true;
-    }
-}

+ 0 - 1269
main/auth/external_login/facebook-php-sdk/src/base_facebook.php

@@ -1,1269 +0,0 @@
-<?php
-/**
- * Copyright 2011 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License. You may obtain
- * a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-if (!function_exists('curl_init')) {
-  throw new Exception('Facebook needs the CURL PHP extension.');
-}
-if (!function_exists('json_decode')) {
-  throw new Exception('Facebook needs the JSON PHP extension.');
-}
-
-/**
- * Thrown when an API call returns an exception.
- *
- * @author Naitik Shah <naitik@facebook.com>
- */
-class FacebookApiException extends Exception
-{
-  /**
-   * The result from the API server that represents the exception information.
-   */
-  protected $result;
-
-  /**
-   * Make a new API Exception with the given result.
-   *
-   * @param array $result The result from the API server
-   */
-  public function __construct($result) {
-    $this->result = $result;
-
-    $code = isset($result['error_code']) ? $result['error_code'] : 0;
-
-    if (isset($result['error_description'])) {
-      // OAuth 2.0 Draft 10 style
-      $msg = $result['error_description'];
-    } else if (isset($result['error']) && is_array($result['error'])) {
-      // OAuth 2.0 Draft 00 style
-      $msg = $result['error']['message'];
-    } else if (isset($result['error_msg'])) {
-      // Rest server style
-      $msg = $result['error_msg'];
-    } else {
-      $msg = 'Unknown Error. Check getResult()';
-    }
-
-    parent::__construct($msg, $code);
-  }
-
-  /**
-   * Return the associated result object returned by the API server.
-   *
-   * @return array The result from the API server
-   */
-  public function getResult() {
-    return $this->result;
-  }
-
-  /**
-   * Returns the associated type for the error. This will default to
-   * 'Exception' when a type is not available.
-   *
-   * @return string
-   */
-  public function getType() {
-    if (isset($this->result['error'])) {
-      $error = $this->result['error'];
-      if (is_string($error)) {
-        // OAuth 2.0 Draft 10 style
-        return $error;
-      } else if (is_array($error)) {
-        // OAuth 2.0 Draft 00 style
-        if (isset($error['type'])) {
-          return $error['type'];
-        }
-      }
-    }
-
-    return 'Exception';
-  }
-
-  /**
-   * To make debugging easier.
-   *
-   * @return string The string representation of the error
-   */
-  public function __toString() {
-    $str = $this->getType() . ': ';
-    if ($this->code != 0) {
-      $str .= $this->code . ': ';
-    }
-    return $str . $this->message;
-  }
-}
-
-/**
- * Provides access to the Facebook Platform.  This class provides
- * a majority of the functionality needed, but the class is abstract
- * because it is designed to be sub-classed.  The subclass must
- * implement the four abstract methods listed at the bottom of
- * the file.
- *
- * @author Naitik Shah <naitik@facebook.com>
- */
-abstract class BaseFacebook
-{
-  /**
-   * Version.
-   */
-  const VERSION = '3.1.1';
-
-  /**
-   * Default options for curl.
-   */
-  public static $CURL_OPTS = array(
-    CURLOPT_CONNECTTIMEOUT => 10,
-    CURLOPT_RETURNTRANSFER => true,
-    CURLOPT_TIMEOUT        => 60,
-    CURLOPT_USERAGENT      => 'facebook-php-3.1',
-  );
-
-  /**
-   * List of query parameters that get automatically dropped when rebuilding
-   * the current URL.
-   */
-  protected static $DROP_QUERY_PARAMS = array(
-    'code',
-    'state',
-    'signed_request',
-  );
-
-  /**
-   * Maps aliases to Facebook domains.
-   */
-  public static $DOMAIN_MAP = array(
-    'api'       => 'https://api.facebook.com/',
-    'api_video' => 'https://api-video.facebook.com/',
-    'api_read'  => 'https://api-read.facebook.com/',
-    'graph'     => 'https://graph.facebook.com/',
-    'graph_video' => 'https://graph-video.facebook.com/',
-    'www'       => 'https://www.facebook.com/',
-  );
-
-  /**
-   * The Application ID.
-   *
-   * @var string
-   */
-  protected $appId;
-
-  /**
-   * The Application App Secret.
-   *
-   * @var string
-   */
-  protected $appSecret;
-
-  /**
-   * The ID of the Facebook user, or 0 if the user is logged out.
-   *
-   * @var integer
-   */
-  protected $user;
-
-  /**
-   * The data from the signed_request token.
-   */
-  protected $signedRequest;
-
-  /**
-   * A CSRF state variable to assist in the defense against CSRF attacks.
-   */
-  protected $state;
-
-  /**
-   * The OAuth access token received in exchange for a valid authorization
-   * code.  null means the access token has yet to be determined.
-   *
-   * @var string
-   */
-  protected $accessToken = null;
-
-  /**
-   * Indicates if the CURL based @ syntax for file uploads is enabled.
-   *
-   * @var boolean
-   */
-  protected $fileUploadSupport = false;
-
-  /**
-   * Initialize a Facebook Application.
-   *
-   * The configuration:
-   * - appId: the application ID
-   * - secret: the application secret
-   * - fileUpload: (optional) boolean indicating if file uploads are enabled
-   *
-   * @param array $config The application configuration
-   */
-  public function __construct($config) {
-    $this->setAppId($config['appId']);
-    $this->setAppSecret($config['secret']);
-    if (isset($config['fileUpload'])) {
-      $this->setFileUploadSupport($config['fileUpload']);
-    }
-
-    $state = $this->getPersistentData('state');
-    if (!empty($state)) {
-      $this->state = $this->getPersistentData('state');
-    }
-  }
-
-  /**
-   * Set the Application ID.
-   *
-   * @param string $appId The Application ID
-   * @return BaseFacebook
-   */
-  public function setAppId($appId) {
-    $this->appId = $appId;
-    return $this;
-  }
-
-  /**
-   * Get the Application ID.
-   *
-   * @return string the Application ID
-   */
-  public function getAppId() {
-    return $this->appId;
-  }
-
-  /**
-   * Set the App Secret.
-   *
-   * @param string $apiSecret The App Secret
-   * @return BaseFacebook
-   * @deprecated
-   */
-  public function setApiSecret($apiSecret) {
-    $this->setAppSecret($apiSecret);
-    return $this;
-  }
-
-  /**
-   * Set the App Secret.
-   *
-   * @param string $appSecret The App Secret
-   * @return BaseFacebook
-   */
-  public function setAppSecret($appSecret) {
-    $this->appSecret = $appSecret;
-    return $this;
-  }
-
-  /**
-   * Get the App Secret.
-   *
-   * @return string the App Secret
-   * @deprecated
-   */
-  public function getApiSecret() {
-    return $this->getAppSecret();
-  }
-
-  /**
-   * Get the App Secret.
-   *
-   * @return string the App Secret
-   */
-  public function getAppSecret() {
-    return $this->appSecret;
-  }
-
-  /**
-   * Set the file upload support status.
-   *
-   * @param boolean $fileUploadSupport The file upload support status.
-   * @return BaseFacebook
-   */
-  public function setFileUploadSupport($fileUploadSupport) {
-    $this->fileUploadSupport = $fileUploadSupport;
-    return $this;
-  }
-
-  /**
-   * Get the file upload support status.
-   *
-   * @return boolean true if and only if the server supports file upload.
-   */
-  public function getFileUploadSupport() {
-    return $this->fileUploadSupport;
-  }
-
-  /**
-   * DEPRECATED! Please use getFileUploadSupport instead.
-   *
-   * Get the file upload support status.
-   *
-   * @return boolean true if and only if the server supports file upload.
-   */
-  public function useFileUploadSupport() {
-    return $this->getFileUploadSupport();
-  }
-
-  /**
-   * Sets the access token for api calls.  Use this if you get
-   * your access token by other means and just want the SDK
-   * to use it.
-   *
-   * @param string $access_token an access token.
-   * @return BaseFacebook
-   */
-  public function setAccessToken($access_token) {
-    $this->accessToken = $access_token;
-    return $this;
-  }
-
-  /**
-   * Determines the access token that should be used for API calls.
-   * The first time this is called, $this->accessToken is set equal
-   * to either a valid user access token, or it's set to the application
-   * access token if a valid user access token wasn't available.  Subsequent
-   * calls return whatever the first call returned.
-   *
-   * @return string The access token
-   */
-  public function getAccessToken() {
-    if ($this->accessToken !== null) {
-      // we've done this already and cached it.  Just return.
-      return $this->accessToken;
-    }
-
-    // first establish access token to be the application
-    // access token, in case we navigate to the /oauth/access_token
-    // endpoint, where SOME access token is required.
-    $this->setAccessToken($this->getApplicationAccessToken());
-    $user_access_token = $this->getUserAccessToken();
-    if ($user_access_token) {
-      $this->setAccessToken($user_access_token);
-    }
-
-    return $this->accessToken;
-  }
-
-  /**
-   * Determines and returns the user access token, first using
-   * the signed request if present, and then falling back on
-   * the authorization code if present.  The intent is to
-   * return a valid user access token, or false if one is determined
-   * to not be available.
-   *
-   * @return string A valid user access token, or false if one
-   *                could not be determined.
-   */
-  protected function getUserAccessToken() {
-    // first, consider a signed request if it's supplied.
-    // if there is a signed request, then it alone determines
-    // the access token.
-    $signed_request = $this->getSignedRequest();
-    if ($signed_request) {
-      // apps.facebook.com hands the access_token in the signed_request
-      if (array_key_exists('oauth_token', $signed_request)) {
-        $access_token = $signed_request['oauth_token'];
-        $this->setPersistentData('access_token', $access_token);
-        return $access_token;
-      }
-
-      // the JS SDK puts a code in with the redirect_uri of ''
-      if (array_key_exists('code', $signed_request)) {
-        $code = $signed_request['code'];
-        $access_token = $this->getAccessTokenFromCode($code, '');
-        if ($access_token) {
-          $this->setPersistentData('code', $code);
-          $this->setPersistentData('access_token', $access_token);
-          return $access_token;
-        }
-      }
-
-      // signed request states there's no access token, so anything
-      // stored should be cleared.
-      $this->clearAllPersistentData();
-      return false; // respect the signed request's data, even
-                    // if there's an authorization code or something else
-    }
-
-    $code = $this->getCode();
-    if ($code && $code != $this->getPersistentData('code')) {
-      $access_token = $this->getAccessTokenFromCode($code);
-      if ($access_token) {
-        $this->setPersistentData('code', $code);
-        $this->setPersistentData('access_token', $access_token);
-        return $access_token;
-      }
-
-      // code was bogus, so everything based on it should be invalidated.
-      $this->clearAllPersistentData();
-      return false;
-    }
-
-    // as a fallback, just return whatever is in the persistent
-    // store, knowing nothing explicit (signed request, authorization
-    // code, etc.) was present to shadow it (or we saw a code in $_REQUEST,
-    // but it's the same as what's in the persistent store)
-    return $this->getPersistentData('access_token');
-  }
-
-  /**
-   * Retrieve the signed request, either from a request parameter or,
-   * if not present, from a cookie.
-   *
-   * @return string the signed request, if available, or null otherwise.
-   */
-  public function getSignedRequest() {
-    if (!$this->signedRequest) {
-      if (isset($_REQUEST['signed_request'])) {
-        $this->signedRequest = $this->parseSignedRequest(
-          $_REQUEST['signed_request']);
-      } else if (isset($_COOKIE[$this->getSignedRequestCookieName()])) {
-        $this->signedRequest = $this->parseSignedRequest(
-          $_COOKIE[$this->getSignedRequestCookieName()]);
-      }
-    }
-    return $this->signedRequest;
-  }
-
-  /**
-   * Get the UID of the connected user, or 0
-   * if the Facebook user is not connected.
-   *
-   * @return string the UID if available.
-   */
-  public function getUser() {
-    if ($this->user !== null) {
-      // we've already determined this and cached the value.
-      return $this->user;
-    }
-
-    return $this->user = $this->getUserFromAvailableData();
-  }
-
-  /**
-   * Determines the connected user by first examining any signed
-   * requests, then considering an authorization code, and then
-   * falling back to any persistent store storing the user.
-   *
-   * @return integer The id of the connected Facebook user,
-   *                 or 0 if no such user exists.
-   */
-  protected function getUserFromAvailableData() {
-    // if a signed request is supplied, then it solely determines
-    // who the user is.
-    $signed_request = $this->getSignedRequest();
-    if ($signed_request) {
-      if (array_key_exists('user_id', $signed_request)) {
-        $user = $signed_request['user_id'];
-        $this->setPersistentData('user_id', $signed_request['user_id']);
-        return $user;
-      }
-
-      // if the signed request didn't present a user id, then invalidate
-      // all entries in any persistent store.
-      $this->clearAllPersistentData();
-      return 0;
-    }
-
-    $user = $this->getPersistentData('user_id', $default = 0);
-    $persisted_access_token = $this->getPersistentData('access_token');
-
-    // use access_token to fetch user id if we have a user access_token, or if
-    // the cached access token has changed.
-    $access_token = $this->getAccessToken();
-    if ($access_token &&
-        $access_token != $this->getApplicationAccessToken() &&
-        !($user && $persisted_access_token == $access_token)) {
-      $user = $this->getUserFromAccessToken();
-      if ($user) {
-        $this->setPersistentData('user_id', $user);
-      } else {
-        $this->clearAllPersistentData();
-      }
-    }
-
-    return $user;
-  }
-
-  /**
-   * Get a Login URL for use with redirects. By default, full page redirect is
-   * assumed. If you are using the generated URL with a window.open() call in
-   * JavaScript, you can pass in display=popup as part of the $params.
-   *
-   * The parameters:
-   * - redirect_uri: the url to go to after a successful login
-   * - scope: comma separated list of requested extended perms
-   *
-   * @param array $params Provide custom parameters
-   * @return string The URL for the login flow
-   */
-  public function getLoginUrl($params=array()) {
-    $this->establishCSRFTokenState();
-    $currentUrl = $this->getCurrentUrl();
-
-    // if 'scope' is passed as an array, convert to comma separated list
-    $scopeParams = isset($params['scope']) ? $params['scope'] : null;
-    if ($scopeParams && is_array($scopeParams)) {
-      $params['scope'] = implode(',', $scopeParams);
-    }
-
-    return $this->getUrl(
-      'www',
-      'dialog/oauth',
-      array_merge(array(
-                    'client_id' => $this->getAppId(),
-                    'redirect_uri' => $currentUrl, // possibly overwritten
-                    'state' => $this->state),
-                  $params));
-  }
-
-  /**
-   * Get a Logout URL suitable for use with redirects.
-   *
-   * The parameters:
-   * - next: the url to go to after a successful logout
-   *
-   * @param array $params Provide custom parameters
-   * @return string The URL for the logout flow
-   */
-  public function getLogoutUrl($params=array()) {
-    return $this->getUrl(
-      'www',
-      'logout.php',
-      array_merge(array(
-        'next' => $this->getCurrentUrl(),
-        'access_token' => $this->getAccessToken(),
-      ), $params)
-    );
-  }
-
-  /**
-   * Get a login status URL to fetch the status from Facebook.
-   *
-   * The parameters:
-   * - ok_session: the URL to go to if a session is found
-   * - no_session: the URL to go to if the user is not connected
-   * - no_user: the URL to go to if the user is not signed into facebook
-   *
-   * @param array $params Provide custom parameters
-   * @return string The URL for the logout flow
-   */
-  public function getLoginStatusUrl($params=array()) {
-    return $this->getUrl(
-      'www',
-      'extern/login_status.php',
-      array_merge(array(
-        'api_key' => $this->getAppId(),
-        'no_session' => $this->getCurrentUrl(),
-        'no_user' => $this->getCurrentUrl(),
-        'ok_session' => $this->getCurrentUrl(),
-        'session_version' => 3,
-      ), $params)
-    );
-  }
-
-  /**
-   * Make an API call.
-   *
-   * @return mixed The decoded response
-   */
-  public function api(/* polymorphic */) {
-    $args = func_get_args();
-    if (is_array($args[0])) {
-      return $this->_restserver($args[0]);
-    } else {
-      return call_user_func_array(array($this, '_graph'), $args);
-    }
-  }
-
-  /**
-   * Constructs and returns the name of the cookie that
-   * potentially houses the signed request for the app user.
-   * The cookie is not set by the BaseFacebook class, but
-   * it may be set by the JavaScript SDK.
-   *
-   * @return string the name of the cookie that would house
-   *         the signed request value.
-   */
-  protected function getSignedRequestCookieName() {
-    return 'fbsr_'.$this->getAppId();
-  }
-
-  /**
-   * Constructs and returns the name of the coookie that potentially contain
-   * metadata. The cookie is not set by the BaseFacebook class, but it may be
-   * set by the JavaScript SDK.
-   *
-   * @return string the name of the cookie that would house metadata.
-   */
-  protected function getMetadataCookieName() {
-    return 'fbm_'.$this->getAppId();
-  }
-
-  /**
-   * Get the authorization code from the query parameters, if it exists,
-   * and otherwise return false to signal no authorization code was
-   * discoverable.
-   *
-   * @return mixed The authorization code, or false if the authorization
-   *               code could not be determined.
-   */
-  protected function getCode() {
-    if (isset($_REQUEST['code'])) {
-      if ($this->state !== null &&
-          isset($_REQUEST['state']) &&
-          $this->state === $_REQUEST['state']) {
-
-        // CSRF state has done its job, so clear it
-        $this->state = null;
-        $this->clearPersistentData('state');
-        return $_REQUEST['code'];
-      } else {
-        self::errorLog('CSRF state token does not match one provided.');
-        return false;
-      }
-    }
-
-    return false;
-  }
-
-  /**
-   * Retrieves the UID with the understanding that
-   * $this->accessToken has already been set and is
-   * seemingly legitimate.  It relies on Facebook's Graph API
-   * to retrieve user information and then extract
-   * the user ID.
-   *
-   * @return integer Returns the UID of the Facebook user, or 0
-   *                 if the Facebook user could not be determined.
-   */
-  protected function getUserFromAccessToken() {
-    try {
-      $user_info = $this->api('/me');
-      return $user_info['id'];
-    } catch (FacebookApiException $e) {
-      return 0;
-    }
-  }
-
-  /**
-   * Returns the access token that should be used for logged out
-   * users when no authorization code is available.
-   *
-   * @return string The application access token, useful for gathering
-   *                public information about users and applications.
-   */
-  protected function getApplicationAccessToken() {
-    return $this->appId.'|'.$this->appSecret;
-  }
-
-  /**
-   * Lays down a CSRF state token for this process.
-   *
-   * @return void
-   */
-  protected function establishCSRFTokenState() {
-    if ($this->state === null) {
-      $this->state = md5(uniqid(mt_rand(), true));
-      $this->setPersistentData('state', $this->state);
-    }
-  }
-
-  /**
-   * Retrieves an access token for the given authorization code
-   * (previously generated from www.facebook.com on behalf of
-   * a specific user).  The authorization code is sent to graph.facebook.com
-   * and a legitimate access token is generated provided the access token
-   * and the user for which it was generated all match, and the user is
-   * either logged in to Facebook or has granted an offline access permission.
-   *
-   * @param string $code An authorization code.
-   * @return mixed An access token exchanged for the authorization code, or
-   *               false if an access token could not be generated.
-   */
-  protected function getAccessTokenFromCode($code, $redirect_uri = null) {
-    if (empty($code)) {
-      return false;
-    }
-
-    if ($redirect_uri === null) {
-      $redirect_uri = $this->getCurrentUrl();
-    }
-
-    try {
-      // need to circumvent json_decode by calling _oauthRequest
-      // directly, since response isn't JSON format.
-      $access_token_response =
-        $this->_oauthRequest(
-          $this->getUrl('graph', '/oauth/access_token'),
-          $params = array('client_id' => $this->getAppId(),
-                          'client_secret' => $this->getAppSecret(),
-                          'redirect_uri' => $redirect_uri,
-                          'code' => $code));
-    } catch (FacebookApiException $e) {
-      // most likely that user very recently revoked authorization.
-      // In any event, we don't have an access token, so say so.
-      return false;
-    }
-
-    if (empty($access_token_response)) {
-      return false;
-    }
-
-    $response_params = array();
-    parse_str($access_token_response, $response_params);
-    if (!isset($response_params['access_token'])) {
-      return false;
-    }
-
-    return $response_params['access_token'];
-  }
-
-  /**
-   * Invoke the old restserver.php endpoint.
-   *
-   * @param array $params Method call object
-   *
-   * @return mixed The decoded response object
-   * @throws FacebookApiException
-   */
-  protected function _restserver($params) {
-    // generic application level parameters
-    $params['api_key'] = $this->getAppId();
-    $params['format'] = 'json-strings';
-
-    $result = json_decode($this->_oauthRequest(
-      $this->getApiUrl($params['method']),
-      $params
-    ), true);
-
-    // results are returned, errors are thrown
-    if (is_array($result) && isset($result['error_code'])) {
-      $this->throwAPIException($result);
-    }
-
-    if ($params['method'] === 'auth.expireSession' ||
-        $params['method'] === 'auth.revokeAuthorization') {
-      $this->destroySession();
-    }
-
-    return $result;
-  }
-
-  /**
-   * Return true if this is video post.
-   *
-   * @param string $path The path
-   * @param string $method The http method (default 'GET')
-   *
-   * @return boolean true if this is video post
-   */
-  protected function isVideoPost($path, $method = 'GET') {
-    if ($method == 'POST' && preg_match("/^(\/)(.+)(\/)(videos)$/", $path)) {
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Invoke the Graph API.
-   *
-   * @param string $path The path (required)
-   * @param string $method The http method (default 'GET')
-   * @param array $params The query/post data
-   *
-   * @return mixed The decoded response object
-   * @throws FacebookApiException
-   */
-  protected function _graph($path, $method = 'GET', $params = array()) {
-    if (is_array($method) && empty($params)) {
-      $params = $method;
-      $method = 'GET';
-    }
-    $params['method'] = $method; // method override as we always do a POST
-
-    if ($this->isVideoPost($path, $method)) {
-      $domainKey = 'graph_video';
-    } else {
-      $domainKey = 'graph';
-    }
-
-    $result = json_decode($this->_oauthRequest(
-      $this->getUrl($domainKey, $path),
-      $params
-    ), true);
-
-    // results are returned, errors are thrown
-    if (is_array($result) && isset($result['error'])) {
-      $this->throwAPIException($result);
-    }
-
-    return $result;
-  }
-
-  /**
-   * Make a OAuth Request.
-   *
-   * @param string $url The path (required)
-   * @param array $params The query/post data
-   *
-   * @return string The decoded response object
-   * @throws FacebookApiException
-   */
-  protected function _oauthRequest($url, $params) {
-    if (!isset($params['access_token'])) {
-      $params['access_token'] = $this->getAccessToken();
-    }
-
-    // json_encode all params values that are not strings
-    foreach ($params as $key => $value) {
-      if (!is_string($value)) {
-        $params[$key] = json_encode($value);
-      }
-    }
-
-    return $this->makeRequest($url, $params);
-  }
-
-  /**
-   * Makes an HTTP request. This method can be overridden by subclasses if
-   * developers want to do fancier things or use something other than curl to
-   * make the request.
-   *
-   * @param string $url The URL to make the request to
-   * @param array $params The parameters to use for the POST body
-   * @param CurlHandler $ch Initialized curl handle
-   *
-   * @return string The response text
-   */
-  protected function makeRequest($url, $params, $ch=null) {
-    if (!$ch) {
-      $ch = curl_init();
-    }
-
-    $opts = self::$CURL_OPTS;
-    if ($this->getFileUploadSupport()) {
-      $opts[CURLOPT_POSTFIELDS] = $params;
-    } else {
-      $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
-    }
-    $opts[CURLOPT_URL] = $url;
-
-    // disable the 'Expect: 100-continue' behaviour. This causes CURL to wait
-    // for 2 seconds if the server does not support this header.
-    if (isset($opts[CURLOPT_HTTPHEADER])) {
-      $existing_headers = $opts[CURLOPT_HTTPHEADER];
-      $existing_headers[] = 'Expect:';
-      $opts[CURLOPT_HTTPHEADER] = $existing_headers;
-    } else {
-      $opts[CURLOPT_HTTPHEADER] = array('Expect:');
-    }
-
-    curl_setopt_array($ch, $opts);
-    $result = curl_exec($ch);
-
-    if (curl_errno($ch) == 60) { // CURLE_SSL_CACERT
-      self::errorLog('Invalid or no certificate authority found, '.
-                     'using bundled information');
-      curl_setopt($ch, CURLOPT_CAINFO,
-                  dirname(__FILE__) . '/fb_ca_chain_bundle.crt');
-      $result = curl_exec($ch);
-    }
-
-    if ($result === false) {
-      $e = new FacebookApiException(array(
-        'error_code' => curl_errno($ch),
-        'error' => array(
-        'message' => curl_error($ch),
-        'type' => 'CurlException',
-        ),
-      ));
-      curl_close($ch);
-      throw $e;
-    }
-    curl_close($ch);
-    return $result;
-  }
-
-  /**
-   * Parses a signed_request and validates the signature.
-   *
-   * @param string $signed_request A signed token
-   * @return array The payload inside it or null if the sig is wrong
-   */
-  protected function parseSignedRequest($signed_request) {
-    list($encoded_sig, $payload) = explode('.', $signed_request, 2);
-
-    // decode the data
-    $sig = self::base64UrlDecode($encoded_sig);
-    $data = json_decode(self::base64UrlDecode($payload), true);
-
-    if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
-      self::errorLog('Unknown algorithm. Expected HMAC-SHA256');
-      return null;
-    }
-
-    // check sig
-    $expected_sig = hash_hmac('sha256', $payload,
-                              $this->getAppSecret(), $raw = true);
-    if ($sig !== $expected_sig) {
-      self::errorLog('Bad Signed JSON signature!');
-      return null;
-    }
-
-    return $data;
-  }
-
-  /**
-   * Build the URL for api given parameters.
-   *
-   * @param $method String the method name.
-   * @return string The URL for the given parameters
-   */
-  protected function getApiUrl($method) {
-    static $READ_ONLY_CALLS =
-      array('admin.getallocation' => 1,
-            'admin.getappproperties' => 1,
-            'admin.getbannedusers' => 1,
-            'admin.getlivestreamvialink' => 1,
-            'admin.getmetrics' => 1,
-            'admin.getrestrictioninfo' => 1,
-            'application.getpublicinfo' => 1,
-            'auth.getapppublickey' => 1,
-            'auth.getsession' => 1,
-            'auth.getsignedpublicsessiondata' => 1,
-            'comments.get' => 1,
-            'connect.getunconnectedfriendscount' => 1,
-            'dashboard.getactivity' => 1,
-            'dashboard.getcount' => 1,
-            'dashboard.getglobalnews' => 1,
-            'dashboard.getnews' => 1,
-            'dashboard.multigetcount' => 1,
-            'dashboard.multigetnews' => 1,
-            'data.getcookies' => 1,
-            'events.get' => 1,
-            'events.getmembers' => 1,
-            'fbml.getcustomtags' => 1,
-            'feed.getappfriendstories' => 1,
-            'feed.getregisteredtemplatebundlebyid' => 1,
-            'feed.getregisteredtemplatebundles' => 1,
-            'fql.multiquery' => 1,
-            'fql.query' => 1,
-            'friends.arefriends' => 1,
-            'friends.get' => 1,
-            'friends.getappusers' => 1,
-            'friends.getlists' => 1,
-            'friends.getmutualfriends' => 1,
-            'gifts.get' => 1,
-            'groups.get' => 1,
-            'groups.getmembers' => 1,
-            'intl.gettranslations' => 1,
-            'links.get' => 1,
-            'notes.get' => 1,
-            'notifications.get' => 1,
-            'pages.getinfo' => 1,
-            'pages.isadmin' => 1,
-            'pages.isappadded' => 1,
-            'pages.isfan' => 1,
-            'permissions.checkavailableapiaccess' => 1,
-            'permissions.checkgrantedapiaccess' => 1,
-            'photos.get' => 1,
-            'photos.getalbums' => 1,
-            'photos.gettags' => 1,
-            'profile.getinfo' => 1,
-            'profile.getinfooptions' => 1,
-            'stream.get' => 1,
-            'stream.getcomments' => 1,
-            'stream.getfilters' => 1,
-            'users.getinfo' => 1,
-            'users.getloggedinuser' => 1,
-            'users.getstandardinfo' => 1,
-            'users.hasapppermission' => 1,
-            'users.isappuser' => 1,
-            'users.isverified' => 1,
-            'video.getuploadlimits' => 1);
-    $name = 'api';
-    if (isset($READ_ONLY_CALLS[strtolower($method)])) {
-      $name = 'api_read';
-    } else if (strtolower($method) == 'video.upload') {
-      $name = 'api_video';
-    }
-    return self::getUrl($name, 'restserver.php');
-  }
-
-  /**
-   * Build the URL for given domain alias, path and parameters.
-   *
-   * @param $name string The name of the domain
-   * @param $path string Optional path (without a leading slash)
-   * @param $params array Optional query parameters
-   *
-   * @return string The URL for the given parameters
-   */
-  protected function getUrl($name, $path='', $params=array()) {
-    $url = self::$DOMAIN_MAP[$name];
-    if ($path) {
-      if ($path[0] === '/') {
-        $path = substr($path, 1);
-      }
-      $url .= $path;
-    }
-    if ($params) {
-      $url .= '?' . http_build_query($params, null, '&');
-    }
-
-    return $url;
-  }
-
-  /**
-   * Returns the Current URL, stripping it of known FB parameters that should
-   * not persist.
-   *
-   * @return string The current URL
-   */
-  protected function getCurrentUrl() {
-    if (isset($_SERVER['HTTPS']) &&
-        ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
-        isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
-        $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
-      $protocol = 'https://';
-    }
-    else {
-      $protocol = 'http://';
-    }
-    $currentUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
-    $parts = parse_url($currentUrl);
-
-    $query = '';
-    if (!empty($parts['query'])) {
-      // drop known fb params
-      $params = explode('&', $parts['query']);
-      $retained_params = array();
-      foreach ($params as $param) {
-        if ($this->shouldRetainParam($param)) {
-          $retained_params[] = $param;
-        }
-      }
-
-      if (!empty($retained_params)) {
-        $query = '?'.implode($retained_params, '&');
-      }
-    }
-
-    // use port if non default
-    $port =
-      isset($parts['port']) &&
-      (($protocol === 'http://' && $parts['port'] !== 80) ||
-       ($protocol === 'https://' && $parts['port'] !== 443))
-      ? ':' . $parts['port'] : '';
-
-    // rebuild
-    return $protocol . $parts['host'] . $port . $parts['path'] . $query;
-  }
-
-  /**
-   * Returns true if and only if the key or key/value pair should
-   * be retained as part of the query string.  This amounts to
-   * a brute-force search of the very small list of Facebook-specific
-   * params that should be stripped out.
-   *
-   * @param string $param A key or key/value pair within a URL's query (e.g.
-   *                     'foo=a', 'foo=', or 'foo'.
-   *
-   * @return boolean
-   */
-  protected function shouldRetainParam($param) {
-    foreach (self::$DROP_QUERY_PARAMS as $drop_query_param) {
-      if (strpos($param, $drop_query_param.'=') === 0) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-  /**
-   * Analyzes the supplied result to see if it was thrown
-   * because the access token is no longer valid.  If that is
-   * the case, then we destroy the session.
-   *
-   * @param $result array A record storing the error message returned
-   *                      by a failed API call.
-   */
-  protected function throwAPIException($result) {
-    $e = new FacebookApiException($result);
-    switch ($e->getType()) {
-      // OAuth 2.0 Draft 00 style
-      case 'OAuthException':
-        // OAuth 2.0 Draft 10 style
-      case 'invalid_token':
-        // REST server errors are just Exceptions
-      case 'Exception':
-        $message = $e->getMessage();
-        if ((strpos($message, 'Error validating access token') !== false) ||
-            (strpos($message, 'Invalid OAuth access token') !== false) ||
-            (strpos($message, 'An active access token must be used') !== false)
-        ) {
-          $this->destroySession();
-        }
-        break;
-    }
-
-    throw $e;
-  }
-
-
-  /**
-   * Prints to the error log if you aren't in command line mode.
-   *
-   * @param string $msg Log message
-   */
-  protected static function errorLog($msg) {
-    // disable error log if we are running in a CLI environment
-    // @codeCoverageIgnoreStart
-    if (php_sapi_name() != 'cli') {
-      error_log($msg);
-    }
-    // uncomment this if you want to see the errors on the page
-    // print 'error_log: '.$msg."\n";
-    // @codeCoverageIgnoreEnd
-  }
-
-  /**
-   * Base64 encoding that doesn't need to be urlencode()ed.
-   * Exactly the same as base64_encode except it uses
-   *   - instead of +
-   *   _ instead of /
-   *
-   * @param string $input base64UrlEncoded string
-   * @return string
-   */
-  protected static function base64UrlDecode($input) {
-    return base64_decode(strtr($input, '-_', '+/'));
-  }
-
-  /**
-   * Destroy the current session
-   */
-  public function destroySession() {
-    $this->accessToken = null;
-    $this->signedRequest = null;
-    $this->user = null;
-    $this->clearAllPersistentData();
-
-    // Javascript sets a cookie that will be used in getSignedRequest that we
-    // need to clear if we can
-    $cookie_name = $this->getSignedRequestCookieName();
-    if (array_key_exists($cookie_name, $_COOKIE)) {
-      unset($_COOKIE[$cookie_name]);
-      if (!headers_sent()) {
-        // The base domain is stored in the metadata cookie if not we fallback
-        // to the current hostname
-        $base_domain = '.'. $_SERVER['HTTP_HOST'];
-
-        $metadata = $this->getMetadataCookie();
-        if (array_key_exists('base_domain', $metadata) &&
-            !empty($metadata['base_domain'])) {
-          $base_domain = $metadata['base_domain'];
-        }
-
-        setcookie($cookie_name, '', 0, '/', $base_domain);
-      } else {
-        self::errorLog(
-          'There exists a cookie that we wanted to clear that we couldn\'t '.
-          'clear because headers was already sent. Make sure to do the first '.
-          'API call before outputing anything'
-        );
-      }
-    }
-  }
-
-  /**
-   * Parses the metadata cookie that our Javascript API set
-   *
-   * @return  an array mapping key to value
-   */
-  protected function getMetadataCookie() {
-    $cookie_name = $this->getMetadataCookieName();
-    if (!array_key_exists($cookie_name, $_COOKIE)) {
-      return array();
-    }
-
-    // The cookie value can be wrapped in "-characters so remove them
-    $cookie_value = trim($_COOKIE[$cookie_name], '"');
-
-    if (empty($cookie_value)) {
-      return array();
-    }
-
-    $parts = explode('&', $cookie_value);
-    $metadata = array();
-    foreach ($parts as $part) {
-      $pair = explode('=', $part, 2);
-      if (!empty($pair[0])) {
-        $metadata[urldecode($pair[0])] =
-          (count($pair) > 1) ? urldecode($pair[1]) : '';
-      }
-    }
-
-    return $metadata;
-  }
-
-  /**
-   * Each of the following four methods should be overridden in
-   * a concrete subclass, as they are in the provided Facebook class.
-   * The Facebook class uses PHP sessions to provide a primitive
-   * persistent store, but another subclass--one that you implement--
-   * might use a database, memcache, or an in-memory cache.
-   *
-   * @see Facebook
-   */
-
-  /**
-   * Stores the given ($key, $value) pair, so that future calls to
-   * getPersistentData($key) return $value. This call may be in another request.
-   *
-   * @param string $key
-   * @param array $value
-   *
-   * @return void
-   */
-  abstract protected function setPersistentData($key, $value);
-
-  /**
-   * Get the data for $key, persisted by BaseFacebook::setPersistentData()
-   *
-   * @param string $key The key of the data to retrieve
-   * @param boolean $default The default value to return if $key is not found
-   *
-   * @return mixed
-   */
-  abstract protected function getPersistentData($key, $default = false);
-
-  /**
-   * Clear the data with $key from the persistent storage
-   *
-   * @param string $key
-   * @return void
-   */
-  abstract protected function clearPersistentData($key);
-
-  /**
-   * Clear all data from the persistent storage
-   *
-   * @return void
-   */
-  abstract protected function clearAllPersistentData();
-}

+ 0 - 93
main/auth/external_login/facebook-php-sdk/src/facebook.php

@@ -1,93 +0,0 @@
-<?php
-/**
- * Copyright 2011 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License. You may obtain
- * a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-require_once "base_facebook.php";
-
-/**
- * Extends the BaseFacebook class with the intent of using
- * PHP sessions to store user ids and access tokens.
- */
-class Facebook extends BaseFacebook
-{
-  /**
-   * Identical to the parent constructor, except that
-   * we start a PHP session to store the user ID and
-   * access token if during the course of execution
-   * we discover them.
-   *
-   * @param Array $config the application configuration.
-   * @see BaseFacebook::__construct in facebook.php
-   */
-  public function __construct($config) {
-    if (!session_id()) {
-      session_start();
-    }
-    parent::__construct($config);
-  }
-
-  protected static $kSupportedKeys =
-    array('state', 'code', 'access_token', 'user_id');
-
-  /**
-   * Provides the implementations of the inherited abstract
-   * methods.  The implementation uses PHP sessions to maintain
-   * a store for authorization codes, user ids, CSRF states, and
-   * access tokens.
-   */
-  protected function setPersistentData($key, $value) {
-    if (!in_array($key, self::$kSupportedKeys)) {
-      self::errorLog('Unsupported key passed to setPersistentData.');
-      return;
-    }
-
-    $session_var_name = $this->constructSessionVariableName($key);
-    $_SESSION[$session_var_name] = $value;
-  }
-
-  protected function getPersistentData($key, $default = false) {
-    if (!in_array($key, self::$kSupportedKeys)) {
-      self::errorLog('Unsupported key passed to getPersistentData.');
-      return $default;
-    }
-
-    $session_var_name = $this->constructSessionVariableName($key);
-    return isset($_SESSION[$session_var_name]) ?
-      $_SESSION[$session_var_name] : $default;
-  }
-
-  protected function clearPersistentData($key) {
-    if (!in_array($key, self::$kSupportedKeys)) {
-      self::errorLog('Unsupported key passed to clearPersistentData.');
-      return;
-    }
-
-    $session_var_name = $this->constructSessionVariableName($key);
-    unset($_SESSION[$session_var_name]);
-  }
-
-  protected function clearAllPersistentData() {
-    foreach (self::$kSupportedKeys as $key) {
-      $this->clearPersistentData($key);
-    }
-  }
-
-  protected function constructSessionVariableName($key) {
-    return implode('_', array('fb',
-                              $this->getAppId(),
-                              $key));
-  }
-}

+ 0 - 121
main/auth/external_login/facebook-php-sdk/src/fb_ca_chain_bundle.crt

@@ -1,121 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFgjCCBGqgAwIBAgIQDKKbZcnESGaLDuEaVk6fQjANBgkqhkiG9w0BAQUFADBm
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSUwIwYDVQQDExxEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBDQS0zMB4XDTEwMDExMzAwMDAwMFoXDTEzMDQxMTIzNTk1OVowaDELMAkGA1UE
-BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEX
-MBUGA1UEChMORmFjZWJvb2ssIEluYy4xFzAVBgNVBAMUDiouZmFjZWJvb2suY29t
-MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9rzj7QIuLM3sdHu1HcI1VcR3g
-b5FExKNV646agxSle1aQ/sJev1mh/u91ynwqd2BQmM0brZ1Hc3QrfYyAaiGGgEkp
-xbhezyfeYhAyO0TKAYxPnm2cTjB5HICzk6xEIwFbA7SBJ2fSyW1CFhYZyo3tIBjj
-19VjKyBfpRaPkzLmRwIDAQABo4ICrDCCAqgwHwYDVR0jBBgwFoAUUOpzidsp+xCP
-nuUBINTeeZlIg/cwHQYDVR0OBBYEFPp+tsFBozkjrHlEnZ9J4cFj2eM0MA4GA1Ud
-DwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMF8GA1UdHwRYMFYwKaAnoCWGI2h0dHA6
-Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9jYTMtZmIuY3JsMCmgJ6AlhiNodHRwOi8vY3Js
-NC5kaWdpY2VydC5jb20vY2EzLWZiLmNybDCCAcYGA1UdIASCAb0wggG5MIIBtQYL
-YIZIAYb9bAEDAAEwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0
-LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIB
-UgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkA
-YwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEA
-bgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMA
-UABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkA
-IABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwA
-aQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8A
-cgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMA
-ZQAuMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQUF
-AAOCAQEACOkTIdxMy11+CKrbGNLBSg5xHaTvu/v1wbyn3dO/mf68pPfJnX6ShPYy
-4XM4Vk0x4uaFaU4wAGke+nCKGi5dyg0Esg7nemLNKEJaFAJZ9enxZm334lSCeARy
-wlDtxULGOFRyGIZZPmbV2eNq5xdU/g3IuBEhL722mTpAye9FU/J8Wsnw54/gANyO
-Gzkewigua8ip8Lbs9Cht399yAfbfhUP1DrAm/xEcnHrzPr3cdCtOyJaM6SRPpRqH
-ITK5Nc06tat9lXVosSinT3KqydzxBYua9gCFFiR3x3DgZfvXkC6KDdUlDrNcJUub
-a1BHnLLP4mxTHL6faAXYd05IxNn/IA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGVTCCBT2gAwIBAgIQCFH5WYFBRcq94CTiEsnCDjANBgkqhkiG9w0BAQUFADBs
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBFViBSb290IENBMB4XDTA3MDQwMzAwMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
-LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
-Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR
-CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv
-KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5
-BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf
-1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs
-zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d
-32duXvsCAwEAAaOCAvcwggLzMA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w
-ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3
-LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH
-AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy
-AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj
-AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg
-AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ
-AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt
-AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj
-AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl
-AHIAZQBuAGMAZQAuMA8GA1UdEwEB/wQFMAMBAf8wNAYIKwYBBQUHAQEEKDAmMCQG
-CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSBhzCB
-hDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGlnaEFz
-c3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQu
-Y29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSMEGDAW
-gBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUBINTe
-eZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAF1PhPGoiNOjsrycbeUpSXfh59bcqdg1
-rslx3OXb3J0kIZCmz7cBHJvUV5eR13UWpRLXuT0uiT05aYrWNTf58SHEW0CtWakv
-XzoAKUMncQPkvTAyVab+hA4LmzgZLEN8rEO/dTHlIxxFVbdpCJG1z9fVsV7un5Tk
-1nq5GMO41lJjHBC6iy9tXcwFOPRWBW3vnuzoYTYMFEuFFFoMg08iXFnLjIpx2vrF
-EIRYzwfu45DC9fkpx1ojcflZtGQriLCnNseaIGHr+k61rmsb5OPs4tk8QUmoIKRU
-9ZKNu8BVIASm2LAXFszj0Mi0PeXZhMbT9m5teMl5Q+h6N/9cNUm/ocU=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEQjCCA6ugAwIBAgIEQoclDjANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
-ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
-ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEy
-MjIxNTI3MjdaFw0xNDA3MjIxNTU3MjdaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
-EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV
-BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD
-1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt
-cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46
-OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd
-HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm
-t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET
-MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr
-BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo
-dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v
-Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU
-mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7
-UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF
-BQADgYEAUuVY7HCc/9EvhaYzC1rAIo348LtGIiMduEl5Xa24G8tmJnDioD2GU06r
-1kjLX/ktCdpdBgXadbjtdrZXTP59uN0AXlsdaTiFufsqVLPvkp5yMnqnuI3E2o6p
-NpAkoQSbB6kUCNnXcW26valgOjDLZFOnr241QiwdBAJAAE/rRa8=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
-ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
-ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
-MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
-b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
-U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
-I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
-wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
-AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
-oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
-BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
-dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
-MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
-b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
-MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
-E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
-MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
-hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
-95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
-2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----

+ 0 - 106
main/auth/external_login/facebook.inc.php

@@ -1,106 +0,0 @@
-<?php
-
-/**
- * Licence: GPL
- * Please contact CBlue regarding any licences issues.
- * Author: noel@cblue.be
- *  Copyright: CBlue SPRL, 20XX
- *
- * External login module : FACEBOOK
- *
- * This files provides the facebook_connect()  and facebook_get_url functions
- * Please edit the facebook.conf.php file to adapt it to your fb application parameter
- * */
-require_once dirname(__FILE__) . '/../../inc/global.inc.php';
-require_once dirname(__FILE__) . '/facebook.init.php';
-require_once dirname(__FILE__) . '/facebook-php-sdk/src/facebook.php';
-require_once dirname(__FILE__) . '/functions.inc.php';
-
-/**
- * This function connect to facebook and retrieves the user info
- * If user does not exist in chamilo, it creates it and logs in
- * If user already exists, it updates his info
- * */
-function facebook_connect() {
-    global $facebook;
-    // See if there is a user from a cookie
-    $user = $facebook->getUser();
-    if ($user) {
-        try {
-            //Gets facebook user info
-            $fu = $facebook->api('/me');
-            $username = $fu['username'];
-            if (api_get_setting('login_is_email') == 'true' || empty($fu['username'])) {
-                $username = change_to_valid_chamilo_login($fu['email']);
-            }
-            //Checks if user already exists in chamilo
-            $u = array(
-                'firstname' => $fu['first_name'],
-                'lastname' => $fu['last_name'],
-                'status' => STUDENT,
-                'email' => $fu['email'],
-                'username' => $username,
-                'language' => 'french',
-                'password' => DEFAULT_PASSWORD,
-                'auth_source' => 'facebook',
-                //'courses' => $user_info['courses'],
-                //'profile_link' => $user_info['profile_link'],
-                //'worldwide_bu' => $user_info['worlwide_bu'],
-                //'manager' => $user_info['manager'],
-                'extra' => array()
-            );
-            $cu = api_get_user_info_from_username($username);
-            $chamilo_uinfo = api_get_user_info_from_username($username);
-            if ($chamilo_uinfo === false) {
-                //we have to create the user
-                $chamilo_uid = external_add_user($u);
-                if ($chamilo_uid !== false) {
-                    $_user['user_id'] = $chamilo_uid;
-                    $_user['uidReset'] = true;
-                    $_SESSION['_user'] = $_user;
-                    header('Location:' . api_get_path(WEB_PATH));
-                    exit();
-                } else {
-                    return false;
-                }
-            } else {//User already exists, update info and login
-                $chamilo_uid = $chamilo_uinfo['user_id'];
-                $u['user_id'] = $chamilo_uid;
-                external_update_user($u);
-                $_user['user_id'] = $chamilo_uid;
-                $_user['uidReset'] = true;
-                $_SESSION['_user'] = $_user;
-                header('Location:' . api_get_path(WEB_PATH));
-                exit();
-            }
-        } catch (FacebookApiException $e) {
-            echo '<pre>' . htmlspecialchars(print_r($e, true)) . '</pre>';
-            $user = null;
-        }
-    }
-}
-
-/**
- * Get facebook login url for the platform
- * */
-function facebook_get_login_url() {
-    global $facebook, $facebook_config;
-
-    $login_url = $facebook->getLoginUrl(
-            array(
-                'scope' => 'email,publish_stream',
-                'redirect_uri' => $facebook_config['return_url']
-            )
-    );
-    return $login_url;
-}
-
-/**
- * @input : a string
- * @return : a string containing valid chamilo login characters
- * Chamilo login only use characters lettres, des chiffres et les signes _ . -
- * */
-function change_to_valid_chamilo_login($in_txt) {
-    return preg_replace("/[^a-zA-Z1-9_\-.]/", "_", $in_txt);
-    exit;
-}

+ 0 - 35
main/auth/external_login/facebook.init.php

@@ -1,35 +0,0 @@
-<?php
-
-/**
- * Licence: GPL
- * Please contact CBlue regarding any licences issues.
- * Author: noel@cblue.be
- *  Copyright: CBlue SPRL, 20XX
- *
- * External login module : FACEBOOK
- *
- * Configuration file
- * Please edit this file to match with your FACEBOOK settings
- * */
-/**
- * Facebook application setting
- * */
-
-require_once dirname(__FILE__) . '/../../inc/global.inc.php';
-
-require_once dirname(__FILE__) . '/facebook-php-sdk/src/facebook.php';
-
-global $facebook_config;
-
-//Loads the portal facebook settings
-//$conf = dirname(__FILE__) . '../../inc/conf/auth.conf.php';
-
-/**
- * See facebook section of the auth.conf.php file
- */
-global $facebook;
-$facebook = new Facebook(array(
-            'appId' => $facebook_config['appId'],
-            'secret' => $facebook_config['secret']
-        ));
-require_once dirname(__FILE__) . '/facebook.inc.php';

+ 0 - 179
main/auth/external_login/functions.inc.php

@@ -1,179 +0,0 @@
-<?php
-
-require_once api_get_path(LIBRARY_PATH) . 'usermanager.lib.php';
-require_once api_get_path(LIBRARY_PATH) . 'course.lib.php';
-
-//define('USERINFO_TABLE', 'danone_userinfo');
-//define('DEFAULT_PASSWORD', 'danonelearning');
-//TODO : Please implements this function for this module to work.
-/**
- * Gets user info from external source 
- * @param string login
- * @param string password
- * @return user array with at least the following fields:
- *       firstname
- *       lastname
- *       status
- *       email
- *       login
- *       password
- *   or false if no data
- * */
-function external_get_user_info($login, $password) {
-    //Those are the mandatory fields for user creation.
-    //See external_add_user function for all the fields you can have.
-    $table = USERINFO_TABLE;
-    $sql = "SELECT * from $table where username='" . Database::escape_string($login) . "'";
-    $result = Database::query($sql);
-
-    if (Database::num_rows($result) == 0) { //false password
-        return false;
-    }
-    $user_info = Database::fetch_assoc($result);
-    // User status
-    $admin = false;
-    switch ($user_info['status']) {
-        case 'admin':
-            $status = COURSEMANAGER;
-            $admin = true;
-            break;
-        case 'teacher':
-            $status = COURSEMANAGER;
-            break;
-        case 'user':
-            $status = STUDENT;
-            break;
-        default:
-            $status = STUDENT;
-    }
-    // Language
-    switch ($user_info['language']) {
-        case 'FR' :
-            $language = 'french';
-            break;
-        case 'EN' :
-            $language = 'english';
-            break;
-        default :
-            $language = 'english';
-            break;
-    }
-    //Can Send Message ?
-    $can_send_message = ($user_info['can_send_message'] == 1) ? 'yes' : 'no';
-
-
-    $u = array(
-        'firstname' => $user_info['firstname'],
-        'lastname' => $user_info['lastname'],
-        'status' => $status,
-        'admin' => $admin,
-        'email' => $user_info['email'],
-        'username' => $user_info['username'],
-        'language' => $language,
-        'password' => DEFAULT_PASSWORD,
-        'courses' => $user_info['courses'],
-        'profile_link' => $user_info['profile_link'],
-        'worldwide_bu' => $user_info['worlwide_bu'],
-        'manager' => $user_info['manager'],
-        'extra' => array(
-            'position_title' => $user_info['position_title'],
-            'country' => $user_info['country'],
-            'job_family' => $user_info['job_family'],
-            'country_bu' => $user_info['country_bu'],
-            'worldwide_bu' => $user_info['worldwide_bu'],
-            'profile_link' => $user_info['profile_link'],
-            'can_send_message' => $can_send_message,
-            'update_type' => 'external_logininfo')
-    );
-
-    return $u; //Please return false if user does not exist
-    //return false;
-}
-
-/**
- * Return an array with all user info
- * @param associative array with at least thes fields setted :
-  firstname, lastname, status, email, login, password
- * @return mixed   new user id - if the new user creation succeeds, false otherwise
- * */
-function external_add_user($u) {
-    //Setting default
-    if (empty($u['password']))
-        $u['password'] = null;
-    if (empty($u['status']))
-        $u['status'] = 5;
-    if (!isset($u['official_code']))
-        $u['official_code'] = '';
-    if (!isset($u['language']))
-        $u['language'] = '';
-    if (!isset($u['phone']))
-        $u['phone'] = '';
-    if (!isset($u['picture_uri']))
-        $u['picture_uri'] = '';
-    if (!isset($u['auth_source']))
-        $u['auth_source'] = PLATFORM_AUTH_SOURCE;
-    if (!isset($u['expiration_date']))
-        $u['expiration_date'] = '0000-00-00 00:00:00';
-    if (!isset($u['active']))
-        $u['active'] = 1;
-    if (!isset($u['hr_dept_id']))
-        $u['hr_dept_id'] = 0; //id of responsible HR
-    if (!isset($u['extra']))
-        $u['extra'] = null;
-    if (!isset($u['encrypt_method']))
-        $u['encrypt_method'] = '';
-
-    $chamilo_uid = UserManager::create_user($u['firstname'], $u['lastname'], $u['status'], $u['email'], $u['username'], $u['password'], $u['official_code'], $u['language'], $u['phone'], $u['picture_uri'], $u['auth_source'], $u['expiration_date'], $u['active'], $u['hr_dept_id'], $u['extra'], $u['encrypt_method']);
-    return $chamilo_uid;
-}
-
-/**
- * Update the user in chamilo database. It upgrade only info that is present in the 
- * new_user array
- *
- * @param $new_user associative array with the value to upgrade
- *    WARNING user_id key is MANDATORY
- *    Possible keys are :
- *      - firstname
- *      - lastname
- *      - username
- *      - auth_source
- *      - email
- *      - status
- *      - official_code
- *      - phone
- *      - picture_uri
- *      - expiration_date
- *      - active
- *      - creator_id
- *      - hr_dept_id
- *      - extra : array of custom fields
- *      - language
- *      - courses : string of all courses code separated by '|'
- *      - admin : boolean 
- * @return boolean
- * @author ndiechburg <noel@cblue.be>
- * */
-function external_update_user($new_user) {
-    $old_user = UserManager::get_user_info_by_id($new_user['user_id']);
-    $u = array_merge($old_user, $new_user);
-    $updated = UserManager::update_user($u['user_id'], $u['firstname'], $u['lastname'], $u['username'], null, $u['auth_source'], $u['email'], $u['status'], $u['official_code'], $u['phone'], $u['picture_uri'], $u['expiration_date'], $u['active'], $u['creator_id'], $u['hr_dept_id'], $u['extra'], $u['language'], '');
-    if (isset($u['courses']) && !empty($u['courses'])) {
-        $autoSubscribe = explode('|', $u['courses']);
-        foreach ($autoSubscribe as $code) {
-            if (CourseManager::course_exists($code)) {
-                CourseManager::subscribe_user($u['user_id'], $code);
-            }
-        }
-    }
-    // Is User Admin ?
-    //TODO decomments and check that user_is is not already in admin table
-    /*
-      if (isset($u['admin']) && $u['admin']){
-
-      $table = Database::get_main_table(TABLE_MAIN_ADMIN);
-      $res = Database::query("SELECT * from $table WHERE user_id = ".$u['user_id']);
-      } */
-}
-
-?>

+ 0 - 321
main/auth/external_login/ldap.inc.php

@@ -1,321 +0,0 @@
-<?php
-
-// External login module : LDAP
-/**
- * This files is included by newUser.ldap.php and login.ldap.php
- * It implements the functions nedded by both files
- * */
-//Includes the configuration file
-require_once dirname(__FILE__) . '/../../inc/global.inc.php';
-
-/**
- * Returns a transcoded and trimmed string
- *
- * @param string
- * @return string
- * @author ndiechburg <noel@cblue.be>
- * */
-function extldap_purify_string($string) {
-    global $extldap_config;
-    if (isset($extldap_config['encoding'])) {
-        return trim(api_to_system_encoding($string, $extldap_config['encoding']));
-    } else {
-        return trim($string);
-    }
-}
-
-/**
- * Establishes a connection to the LDAP server and sets the protocol version
- *
- * @return resource ldap link identifier or false
- * @author ndiechburg <noel@cblue.be>
- * */
-function extldap_connect() {
-    global $extldap_config;
-
-    if (!is_array($extldap_config['host']))
-        $extldap_config['host'] = array($extldap_config['host']);
-
-    foreach ($extldap_config['host'] as $host) {
-        //Trying to connect
-        if (isset($extldap_config['port'])) {
-            $ds = ldap_connect($host, $extldap_config['port']);
-        } else {
-            $ds = ldap_connect($host);
-        }
-        if (!$ds) {
-            $port = isset($extldap_config['port']) ? $ldap_config['port'] : 389;
-            error_log('EXTLDAP ERROR : cannot connect to ' . $extldap_config['host'] . ':' . $port);
-        } else
-            break;
-    }
-    if (!$ds) {
-        error_log('EXTLDAP ERROR : no valid server found');
-        return false;
-    }
-    //Setting protocol version
-    if (isset($extldap_config['protocol_version'])) {
-        if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $extldap_config['protocol_version'])) {
-            ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 2);
-        }
-    }
-
-    //Setting protocol version
-    if (isset($extldap_config['referrals'])) {
-        if (!ldap_set_option($ds, LDAP_OPT_REFERRALS, $extldap_config['referrals'])) {
-            ldap_set_option($ds, LDAP_OPT_REFERRALS, $extldap_config['referrals']);
-        }
-    }
-
-    return $ds;
-}
-
-/**
- * Authenticate user on external ldap server and return user ldap entry if that succeeds
- *
- * @return mixed false if user cannot authenticate on ldap, user ldap entry if tha succeeds
- * @author ndiechburg <noel@cblue.be>
- * Modified by hubert.borderiou@grenet.fr
- * Add possibility to get user info from LDAP without check password (if CAS auth and LDAP profil update)
- *
- * */
-function extldap_authenticate($username, $password, $in_auth_with_no_password = false) {
-    global $extldap_config;
-
-    if (empty($username) or empty($password)) {
-        return false;
-    }
-
-    $ds = extldap_connect();
-    if (!$ds) {
-        return false;
-    }
-
-    //Connection as admin to search dn of user
-    $ldapbind = @ldap_bind($ds, $extldap_config['admin_dn'], $extldap_config['admin_password']);
-    if ($ldapbind === false) {
-        error_log('EXTLDAP ERROR : cannot connect with admin login/password');
-        return false;
-    }
-    $user_search = extldap_get_user_search_string($username);
-    //Search distinguish name of user
-    $sr = ldap_search($ds, $extldap_config['base_dn'], $user_search);
-    if (!$sr) {
-        error_log('EXTLDAP ERROR : ldap_search(' . $ds . ', ' . $extldap_config['base_dn'] . ", $user_search) failed");
-        return false;
-    }
-    $entries_count = ldap_count_entries($ds, $sr);
-
-    if ($entries_count > 1) {
-        error_log('EXTLDAP ERROR : more than one entry for that user ( ldap_search(ds, ' . $extldap_config['base_dn'] . ", $user_search) )");
-        return false;
-    }
-    if ($entries_count < 1) {
-        error_log('EXTLDAP ERROR :  No entry for that user ( ldap_search(ds, ' . $extldap_config['base_dn'] . ", $user_search) )");
-        return false;
-    }
-    $users = ldap_get_entries($ds, $sr);
-    $user = $users[0];
-
-    // If we just want to have user info from LDAP and not to check password
-    if ($in_auth_with_no_password) {
-        return $user;
-    }
-    //now we try to autenthicate the user in the ldap
-    $ubind = @ldap_bind($ds, $user['dn'], $password);
-    if ($ubind !== false) {
-        return $user;
-    } else {
-        error_log('EXTLDAP : Wrong password for ' . $user['dn']);
-        return false;
-    }
-}
-
-/**
- * Return an array with userinfo compatible with chamilo using $extldap_user_correspondance
- * configuration array declared in ldap.conf.php file
- *
- * @param array ldap user
- * @param array correspondance array (if not set use extldap_user_correspondance declared in auth.conf.php
- * @return array userinfo array
- * @author ndiechburg <noel@cblue.be>
- * */
-function extldap_get_chamilo_user($ldap_user, $cor = null) {
-    global $extldap_user_correspondance;
-    if (is_null($cor)) {
-        $cor = $extldap_user_correspondance;
-    }
-
-    $chamilo_user = array();
-    foreach ($cor as $chamilo_field => $ldap_field) {
-        if (is_array($ldap_field)) {
-            $chamilo_user[$chamilo_field] = extldap_get_chamilo_user($ldap_user, $ldap_field);
-            continue;
-        }
-
-        switch ($ldap_field) {
-            case 'func':
-                $func = "extldap_get_$chamilo_field";
-                if (function_exists($func)) {
-                    $chamilo_user[$chamilo_field] = extldap_purify_string($func($ldap_user));
-                } else {
-                    error_log("EXTLDAP WARNING : You forgot to declare $func");
-                }
-                break;
-            default:
-                //if string begins with "!", then this is a constant
-                if ($ldap_field[0] === '!') {
-                    $chamilo_user[$chamilo_field] = trim($ldap_field, "!\t\n\r\0");
-                    break;
-                }
-                if (isset($ldap_user[$ldap_field][0])) {
-                    $chamilo_user[$chamilo_field] = extldap_purify_string($ldap_user[$ldap_field][0]);
-                } else {
-                    error_log('EXTLDAP WARNING : ' . $ldap_field . '[0] field is not set in ldap array');
-                }
-                break;
-        }
-    }
-    return $chamilo_user;
-}
-
-/**
- * Please declare here all the function you use in extldap_user_correspondance
- * All these functions must have an $ldap_user parameter. This parameter is the
- * array returned by the ldap for the user
- * */
-
-/**
- * example function for email
- * */
-/*
-  function extldap_get_email($ldap_user){
-  return $ldap_user['cn'].$ldap['sn'].'@gmail.com';
-  }
- */
-function extldap_get_status($ldap_user) {
-    return STUDENT;
-}
-
-function extldap_get_admin($ldap_user) {
-    return false;
-}
-
-/**
- * return the string used to search a user in ldap
- *
- * @param string username
- * @return string the serach string
- * @author ndiechburg <noel@cblue.be>
- * */
-function extldap_get_user_search_string($username) {
-    global $extldap_config;
-    // init
-    $filter = '(' . $extldap_config['user_search'] . ')';
-    // replacing %username% by the actual username
-    $filter = str_replace('%username%', $username, $filter);
-    // append a global filter if needed
-    if (isset($extldap_config['filter']) && $extldap_config['filter'] != "")
-        $filter = '(&' . $filter . '(' . $extldap_config['filter'] . '))';
-
-    return $filter;
-}
-/**
- * Imports all LDAP users into Chamilo
- * @return bool false on error, true otherwise
- */
-function extldap_import_all_users() {
-    global $extldap_config;
-    //echo "Connecting...\n";
-    $ds = extldap_connect();
-    if (!$ds) {
-        return false;
-    }
-    //echo "Binding...\n";
-    $ldapbind = false;
-    //Connection as admin to search dn of user
-    $ldapbind = @ldap_bind($ds, $extldap_config['admin_dn'], $extldap_config['admin_password']);
-    if ($ldapbind === false) {
-        error_log('EXTLDAP ERROR : cannot connect with admin login/password');
-        return false;
-    }
-    //browse ASCII values from a to z to avoid 1000 results limit of LDAP
-    $count = 0;
-    $alphanum = array('0','1','2','3','4','5','6','7','8','9');
-    for ($a=97;$a<=122;$a++) {
-        $alphanum[] = chr($a);
-    }
-    foreach ($alphanum as $char1) {
-        foreach ($alphanum as $char2) {
-            //$user_search = "uid=*";
-            $user_search = "sAMAccountName=$char1$char2*";
-            //Search distinguish name of user
-            $sr = ldap_search($ds, $extldap_config['base_dn'], $user_search);
-            if (!$sr) {
-                error_log('EXTLDAP ERROR : ldap_search(' . $ds . ', ' . $extldap_config['base_dn'] . ", $user_search) failed");
-                return false;
-            }
-            //echo "Getting entries\n";
-            $users = ldap_get_entries($ds, $sr);
-            //echo "Entries: ".$users['count']."\n";
-            for ($key = 0; $key < $users['count']; $key ++) {
-                $user_id = extldap_add_user_by_array($users[$key], true);
-                $count ++;
-                if ($user_id) {
-                    // echo "User #$user_id created or updated\n";
-                } else {
-                    // echo "User was not created\n";
-                }
-            }
-        }
-    }
-    //echo "Found $count users in total\n";
-    @ldap_close($ds);
-}
-/**
- * Insert users from an array of user fields
- */
-function extldap_add_user_by_array($data, $update_if_exists = true) {
-    $lastname = api_convert_encoding($data['sn'][0], api_get_system_encoding(), 'UTF-8');
-    $firstname = api_convert_encoding($data['cn'][0], api_get_system_encoding(), 'UTF-8');
-    $email = $data['mail'][0];
-    // Get uid from dn
-    $dn_array=ldap_explode_dn($data['dn'],1);
-    $username = $dn_array[0]; // uid is first key
-    $outab[] = $data['edupersonprimaryaffiliation'][0]; // Here, "student"
-    //$val = ldap_get_values_len($ds, $entry, "userPassword");
-    //$val = ldap_get_values_len($ds, $data, "userPassword");
-    //$password = $val[0];
-    // TODO the password, if encrypted at the source, will be encrypted twice, which makes it useless. Try to fix that.
-    $password = $data['userPassword'][0];
-    $structure=$data['edupersonprimaryorgunitdn'][0];
-    $array_structure=explode(",", $structure);
-    $array_val=explode("=", $array_structure[0]);
-    $etape=$array_val[1];
-    $array_val=explode("=", $array_structure[1]);
-    $annee=$array_val[1];
-    // To ease management, we add the step-year (etape-annee) code
-    $official_code=$etape."-".$annee;
-    $auth_source='ldap';
-    // No expiration date for students (recover from LDAP's shadow expiry)
-    $expiration_date='0000-00-00 00:00:00';
-    $active=1;
-    if(empty($status)){$status = 5;}
-    if(empty($phone)){$phone = '';}
-    if(empty($picture_uri)){$picture_uri = '';}
-    // Adding user
-    $user_id = 0;
-    if (UserManager::is_username_available($username)) {
-        //echo "$username\n";
-        $user_id = UserManager::create_user($firstname,$lastname,$status,$email,$username,$password,$official_code,api_get_setting('platformLanguage'),$phone,$picture_uri,$auth_source,$expiration_date,$active);
-    } else {
-        if ($update_if_exists) {
-            $user = UserManager::get_user_info($username);
-            $user_id=$user['user_id'];
-            //echo "$username\n";
-            UserManager::update_user($user_id, $firstname, $lastname, $username, null, null, $email, $status, $official_code, $phone, $picture_uri, $expiration_date, $active);
-        }
-    }
-    return $user_id;
-}
-

+ 0 - 22
main/auth/external_login/ldap_import_all_users.php

@@ -1,22 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * This script executes the importation of all users in the LDAP repository
- * into Chamilo
- * @package chamilo.auth.ldap
- */
-/**
- * Init
- */
-if (PHP_SAPI != 'cli') {
-    die ('For security reasons, this script can only be launched from cron or from the command line');
-}
-use \ChamiloSession as Session;
-
-require dirname(__FILE__) . '/../../inc/global.inc.php';
-require dirname(__FILE__) . '/ldap.inc.php';
-
-/**
- * Code execution
- */
-extldap_import_all_users();

+ 0 - 77
main/auth/external_login/login.ldap.php

@@ -1,77 +0,0 @@
-<?php
-
-// External login module : LDAP
-/**
- *
- * This file is included in main/inc/local.inc.php at user login if the user have 'external_ldap' in
- * his auth_source field insted of platform
- *
- * Variables that can be used :
- *    - $login : string containing the username posted by the user
- *    - $password : string containing the password posted by the user
- *    - $uData : associative array with those keys :
- *           -username
- *           -password
- *           -auth_source
- *           -active
- *           -expiration_date
- *
- * If login succeeds, we have 2 choices :
- *    1.  - set $loginFailed to false,
- *        - set $_SESSION['_user']['user_id'] with the dokeos user_id
- *        - set $uidReset to true
- *        - upgrade user info in dokeos database if needeed
- *        - let the script local.inc.php continue
- *
- *    2.  - set $_SESSION['_user']['user_id'] with the dokeos user_id
- *        - set $_SESSION['_user']['uidReset'] to true
- *        - upgrade user info in dokeos database if needeed
- *        - redirect to any page and let local.inc.php do the magic
- *
- * If login fails we have to redirect to index.php with the right message
- * Possible messages are :
- *  - index.php?loginFailed=1&error=access_url_inactive
- *  - index.php?loginFailed=1&error=account_expired
- *  - index.php?loginFailed=1&error=account_inactive
- *  - index.php?loginFailed=1&error=user_password_incorrect
- *  - index.php?loginFailed=1&error=unrecognize_sso_origin');
- *
- * */
-
-use \ChamiloSession as Session;
-
-require_once dirname(__FILE__) . '/ldap.inc.php';
-require_once dirname(__FILE__) . '/functions.inc.php';
-error_log('Entering login.ldap.php');
-$ldap_user = extldap_authenticate($login, $password);
-if ($ldap_user !== false) {
-    error_log('extldap_authenticate works');
-    $chamilo_user = extldap_get_chamilo_user($ldap_user);
-    //userid is not on the ldap, we have to use $uData variable from local.inc.php
-    $chamilo_user['user_id'] = $uData['user_id'];
-
-    error_log("chamilo_user found user_id: {$uData['user_id']}");
-
-    //Update user info
-    if (isset($extldap_config['update_userinfo']) && $extldap_config['update_userinfo']) {
-        external_update_user($chamilo_user);
-        error_log("Calling external_update_user");
-    }
-
-    $loginFailed = false;
-    $_user['user_id'] = $chamilo_user['user_id'];
-    $_user['status'] = (isset($chamilo_user['status']) ? $chamilo_user['status'] : 5);
-    $_user['uidReset'] = true;
-    Session::write('_user', $_user);
-    $uidReset = true;
-    $logging_in = true;
-    event_login();
-    error_log("Calling event_login");
-} else {
-    error_log('extldap_authenticate error');
-    $loginFailed = true;
-    $uidReset = false;
-    if (isset($_user) && isset($_user['user_id'])) {
-        unset($_user['user_id']);
-    }
-}

+ 0 - 69
main/auth/external_login/newUser.ldap.php

@@ -1,69 +0,0 @@
-<?php
-
-// External login module : LDAP
-/**
- * This file is included by main/inc/local.inc.php when extldap is activated, a user try to login 
- * and chamilo does not find his user
- * Variables that can be used : 
- *    - $login : string containing the username posted by the user
- *    - $password : string containing the password posted by the user
- *
- * Please configure the exldap module in main/auth/external_login/ldap.conf.php
- * 
- * If login succeeds, we have to add the user in the chamilo database and then 
- * we have 2 choices : 
- *    1.  - set $loginFailed to false, 
- *        - set $_SESSION['_user']['user_id'] with the dokeos user_id 
- *        - set $uidReset to true
- *        - let the script local.inc.php continue
- *
- *    2.  - set $_SESSION['_user']['user_id'] with the dokeos user_id 
- *        - set $_SESSION['_user']['uidReset'] to true
- *        - upgrade user info in dokeos database if needeed
- *        - redirect to any page and let local.inc.php do the magic
- * 
- * If login fails we have also 2 choices :
- *    1.  - unset $_user['user_id'] 
- *        - set $loginFailed=true  
- *        - set $uidReset =  false
- *        User wil then have the user password incorrect message
- *
- *    2. We redirect the user to index.php with appropriate message : 
- *        Possible messages are : 
- *          - index.php?loginFailed=1&error=access_url_inactive
- *          - index.php?loginFailed=1&error=account_expired
- *          - index.php?loginFailed=1&error=account_inactive
- *          - index.php?loginFailed=1&error=user_password_incorrect 
- *          - index.php?loginFailed=1&error=unrecognize_sso_origin');
- * */
-
-use \ChamiloSession as Session;
-
-require_once dirname(__FILE__) . '/ldap.inc.php';
-require_once dirname(__FILE__) . '/functions.inc.php';
-
-$ldap_user = extldap_authenticate($login, $password);
-if ($ldap_user !== false) {
-    $chamilo_user = extldap_get_chamilo_user($ldap_user);
-    //username is not on the ldap, we have to use $login variable
-    $chamilo_user['username'] = $login;
-    $chamilo_uid = external_add_user($chamilo_user);
-    if ($chamilo_uid !== false) {
-        $loginFailed = false;
-        $_user['user_id'] = $chamilo_uid;
-        $_user['status'] = (isset($chamilo_user['status']) ? $chamilo_user['status'] : 5);
-        $_user['uidReset'] = true;
-        Session::write('_user', $_user);
-        $uidReset = true;
-        // Is user admin? 
-        if ($chamilo_user['admin'] === true) {
-            $is_platformAdmin = true;
-            Database::query("INSERT INTO admin values ('$chamilo_uid')");
-        }
-    }
-    event_login();
-} else {
-    $loginFailed = true;
-    $uidReset = false;
-    unset($_user['user_id']);
-}

+ 0 - 59
main/auth/external_login/newUser.php

@@ -1,59 +0,0 @@
-<?php
-
-/*
-  Template to automatically create a new user with information from anywhere.
-  This file is loaded by main/inc/local.inc.php
-  To use it please add this line to main/inc/conf/configuration.php :
-  $extAuthSource["external_logininfo"]["newUser"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_logininfo/newUser.php";
-
-  You also have to implements the external_get_user_info function in functions.inc.php
- */
-
-use \ChamiloSession as Session;
-
-require_once(api_get_path(LIBRARY_PATH) . 'usermanager.lib.php');
-require_once(api_get_path(LIBRARY_PATH) . 'course.lib.php');
-require_once(dirname(__FILE__) . '/functions.inc.php');
-
-
-//MAIN CODE
-//$login and $password variables are setted in main/inc/local.inc.php
-
-if ($password != DEFAULT_PASSWORD) {
-    $user = false;
-} else {
-    $user = external_get_user_info($login, $password);
-}
-
-if ($user !== false && ($chamilo_uid = external_add_user($user)) !== false) {
-    //log in the user
-    $loginFailed = false;
-    $_user['user_id'] = $chamilo_uid;
-    $_user['uidReset'] = true;
-    Session::write('_user', $_user);
-    $uidReset = true;
-
-    //Autosubscribe to courses
-    if (!empty($user['courses'])) {
-        $autoSubscribe = explode('|', $user['courses']);
-        foreach ($autoSubscribe as $code) {
-            if (CourseManager::course_exists($code)) {
-                CourseManager::subscribe_user($_user['user_id'], $code);
-            }
-        }
-    }
-    // Is User Admin ?
-    if ($user['admin']) {
-        $is_platformAdmin = true;
-        Database::query("INSERT INTO admin values ('$chamilo_uid')");
-    }
-    // Can user create course
-    $is_allowedCreateCourse = (bool) (($user['status'] == COURSEMANAGER) or (api_get_setting('drhCourseManagerRights') and $user['status'] == SESSIONADMIN));
-
-    event_login();
-} else {
-    $loginFailed = true;
-    unset($_user['user_id']);
-    $uidReset = false;
-}
-?>

+ 0 - 43
main/auth/external_login/updateUser.php

@@ -1,43 +0,0 @@
-<?php
-
-//Script loaded by local.inc.php providing update user information of type external_logininfo.
-/*
-  This script must not exit.
- */
-
-use \ChamiloSession as Session;
-
-require_once(api_get_path(LIBRARY_PATH) . 'usermanager.lib.php');
-require_once(api_get_path(LIBRARY_PATH) . 'course.lib.php');
-require_once(dirname(__FILE__) . '/functions.inc.php');
-
-//MAIN CODE
-//$uData variable is set in local.inc.php
-$user = UserManager::get_user_info_by_id($uData['user_id']);
-$new_user = external_get_user_info($login);
-$user['firstname'] = $new_user['firstname'];
-$user['lastname'] = $new_user['lastname'];
-$user['status'] = $new_user['status'];
-$user['admin'] = $new_user['admin'];
-$user['email'] = $new_user['email'];
-$user['username'] = $new_user['username'];
-$user['profile_link'] = $new_user['profile_link'];
-$user['worldwide_bu'] = $new_user['worldwide_bu'];
-$user['manager'] = $new_user['manager'];
-$user['country_bu'] = $new_user['country_bu'];
-$user['extra'] = $new_user['extra'];
-
-if ($new_user !== false) { //User can login    
-    external_update_user($user);
-    $loginFailed = false;
-    $_user['user_id'] = $user['user_id'];
-    $_user['uidReset'] = true;
-    $uidReset = true;
-    Session::write('_user', $_user);
-} else { //User cannot login
-    $loginFailed = true;
-    Session::erase('_uid');
-    header('Location: ' . api_get_path(WEB_PATH) . 'index.php?loginFailed=1&error=user_password_incorrect');
-    exit;
-}
-?>

+ 0 - 8
main/auth/key/index.php

@@ -1,8 +0,0 @@
-<?php
-/**
- * Display nothing. This ensure Apache doesn't display the list of files and folders
- * when it is not propertly configured.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */

+ 0 - 261
main/auth/key/key_auth.class.php

@@ -1,261 +0,0 @@
-<?php
-
-use \ChamiloSession as Session;
-
-/**
- * Used to authenticate user with an access token. By default this method is disabled.
- * Method used primarily to make API calls: Rss, file upload.
- *
- * Access is granted only for the services that are enabled.
- *
- * To be secured this method must
- *
- *      1) be called through httpS to avoid sniffing (note that this is the case anyway with other methods such as cookies)
- *      2) the url/access token must be secured
- *
- * This authentication method is session less. This is to ensure that the navigator
- * do not receive an access cookie that will grant it access to other parts of the
- * application.
- *
- *
- * Usage:
- *
- * Enable KeyAuth for a specific service. Add the following lines so that
- * the key authentication method is enabled for a specific service before
- * calling global.inc.php.
- * 
- *      KeyAuth::enable_services('my_service');
- *      include_once '.../main/inc/global.inc.php';
- *
- *
- * Enable url access for a short period of time:
- *
- *      token = KeyAuth::create_temp_token();
- *      url = '...?access_token=' . $token ;
- *
- * @see AccessToken
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Geneva
- */
-class KeyAuth
-{
-
-    const PARAM_ACCESS_TOKEN = 'access_token';
-
-    protected static $services = array();
-
-    public static function create_temp_token($service = null, $duration = 60, $user_id = null)
-    {
-        return UserApiKeyManager::create_temp_token($service, $duration, $user_id);
-    }
-
-    /**
-     * Returns enabled services
-     *
-     * @return array
-     */
-    public static function get_services()
-    {
-        return self::$services;
-    }
-
-    /**
-     * Name of the service for which we are goint to check the API Key.
-     * If empty it disables authentication.
-     *
-     * !! 10 chars max !!
-     */
-    public static function enable_services($_)
-    {
-        $args = func_get_args();
-        $names = array();
-        foreach ($args as $arg) {
-            if (is_object($arg)) {
-                $f = array($arg, 'get_service_name');
-                $name = call_user_func($f);
-            } else {
-                $name = $arg;
-            }
-            $name = substr($name, 0, 10);
-            self::$services[$name] = $name;
-        }
-    }
-
-    public static function disable_services($_)
-    {
-        $args = func_get_args();
-        $names = array();
-        foreach ($args as $name) {
-            $name = substr($name, 0, 10);
-            unset(self::$services[$name]);
-        }
-    }
-
-    public static function is_service_enabled($service)
-    {
-        $services = self::get_services();
-        foreach ($services as $s) {
-            if ($s == $service) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static function clear_services()
-    {
-        self::$services[$name] = array();
-    }
-
-    /**
-     * Enable key authentication for the default service - i.e. chamilo
-     */
-    public static function enable()
-    {
-        self::enable_services(UserApiKeyManager::default_service());
-    }
-
-    public static function disable()
-    {
-        self::$services[$name] = array();
-    }
-
-    /**
-     * Returns true if the key authentication method is enabled. False otherwise.
-     * Default to false.
-     *
-     * @return bool
-     */
-    public static function is_enabled()
-    {
-        return !empty(self::$services);
-    }
-
-    /**
-     * @return KeyAuth
-     */
-    public static function instance()
-    {
-        static $result = null;
-        if (empty($result)) {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    protected function __construct()
-    {
-
-    }
-
-    /**
-     * Returns true if authentication accepts to run otherwise returns false.
-     *
-     * @return boolean
-     */
-    public function accept()
-    {
-        /**
-         * Authentication method must be enabled
-         */
-        if (!self::is_enabled()) {
-            return false;
-        }
-
-        $token = $this->get_access_token();
-        if ($token->is_empty()) {
-            return false;
-        }
-
-        $key = UserApiKeyManager::get_by_id($token->get_id());
-        if (empty($key)) {
-            return false;
-        }
-
-        /**
-         * The service corresponding to the key must be enabled.
-         */
-        $service = $key['api_service'];
-        if (!self::is_service_enabled($service)) {
-            return false;
-        }
-
-        /**
-         * User associated with the key must be active
-         */
-        $user = UserManager::get_user_info_by_id($token->get_user_id());
-        if (empty($user)) {
-            return false;
-        }
-        if (!$user['active']) {
-            return false;
-        }
-
-        /**
-         * Token must be valid.
-         */
-        return $token->is_valid();
-    }
-
-    /**
-     * If accepted tear down session, log in user and returns true.
-     * If not accepted do nothing and returns false.
-     *
-     * @return boolean
-     */
-    public function login()
-    {
-        if (!$this->accept()) {
-            return false;
-        }
-        /**
-         * ! important this is to ensure we don't grant access for other parts
-         */
-        Session::destroy();
-
-        /**
-         * We don't allow redirection since access is granted only for this call
-         */
-        global $no_redirection, $noredirection;
-        $no_redirection = true;
-        $noredirection = true;
-        Session::write('noredirection', $noredirection);
-
-        $user_id = $this->get_user_id();
-        $course_code = $this->get_course_code();
-        $group_id = $this->get_group_id();
-
-        Login::init_user($user_id, true);
-        Login::init_course($course_code, true);
-        Login::init_group($group_id, true);
-
-        return true;
-    }
-
-    /**
-     * Returns the request access token
-     *
-     * @return AccessToken
-     */
-    public function get_access_token()
-    {
-        $string = Request::get(self::PARAM_ACCESS_TOKEN);
-        return AccessToken::parse($string);
-    }
-
-    public function get_user_id()
-    {
-        return $this->get_access_token()->get_user_id();
-    }
-
-    public function get_course_code()
-    {
-        return Request::get('cidReq', 0);
-    }
-
-    public function get_group_id()
-    {
-        return Request::get('gidReq', 0);
-    }
-
-}

+ 0 - 642
main/auth/ldap/authldap.php

@@ -1,642 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
-*    LDAP module functions
-*
-*    If the application uses LDAP, these functions are used
-*    for logging in, searching user info, adding this info
-*    to the Chamilo database...
-    - function ldap_authentication_check()
-    - function ldap_find_user_info()
-    - function ldap_login()
-    - function ldap_put_user_info_locally()
-    - ldap_set_version()
-
-    known bugs
-    ----------
-    - (fixed 18 june 2003) code has been internationalized
-    - (fixed 07/05/2003) fixed some non-relative urls or includes
-    - (fixed 28/04/2003) we now use global config.inc variables instead of local ones
-    - (fixed 22/04/2003) the last name of a user was restricted to the first part
-    - (fixed 11/04/2003) the user was never registered as a course manager
-
-    version history
-    ---------------
-    This historial has been discontinued. Please use the Mercurial logs for more
-    3.2 - updated to allow for specific term search for teachers identification
-    3.1 - updated code to use database settings, to respect coding conventions as much as possible (camel-case removed) and to allow for non-anonymous login
-    3.0    - updated to use ldap_var.inc.php instead of ldap_var.inc (deprecated)
-        (November 2003)
-    2.9    - further changes for new login procedure
-        - (busy) translating french functions to english
-        (October 2003)
-    2.8    - adapted for new Claroline login procedure
-        - ldap package now becomes a standard, in auth/ldap
-    2.7 - uses more standard LDAP field names: mail, sn, givenname (or cn)
-            instead of mail, preferredsn, preferredgivenname
-            there are still
-        - code cleanup
-        - fixed bug: dc = xx, dc = yy was configured for UGent
-            and put literally in the code, this is now a variable
-            in configuration.php ($LDAPbasedn)
-
-    with thanks to
-    - Stefan De Wannemacker (Ghent University)
-    - Universite Jean Monet (J Dubois / Michel Courbon)
-    - Michel Panckoucke for reporting and fixing a bug
-    - Patrick Cool: fixing security hole
-
-    *    @author Roan Embrechts
-    *    @version 3.0
-    *    @package chamilo.auth.ldap
- * Note:
- * If you are using a firewall, you might need to check port 389 is open in
- * order for Chamilo to communicate with the LDAP server.
- * See http://support.chamilo.org/issues/4675 for details.
- */
-/**
- * Inclusions
- */
-use \ChamiloSession as Session;
-
-/**
- * Code
- */
-require 'ldap_var.inc.php';
-/**
- *    Check login and password with LDAP
- *    @return true when login & password both OK, false otherwise
- *    @author Roan Embrechts (based on code from Universit� Jean Monet)
- */
-
-function ldap_login($login, $password) {
-    //error_log('Entering ldap_login('.$login.','.$password.')',0);
-    $res = ldap_authentication_check($login, $password);
-
-    // res=-1 -> the user does not exist in the ldap database
-    // res=1 -> invalid password (user does exist)
-
-    if ($res==1) { //WRONG PASSWORD
-        //$errorMessage = "LDAP User or password incorrect, try again.<br />";
-        if (isset($log)) unset($log); if (isset($uid)) unset($uid);
-        $loginLdapSucces = false;
-    }
-    if ($res==-1) { //WRONG USERNAME
-        //$errorMessage =  "LDAP User or password incorrect, try again.<br />";
-        $login_ldap_success = false;
-    }
-    if ($res==0) { //LOGIN & PASSWORD OK - SUCCES
-        //$errorMessage = "Successful login w/ LDAP.<br>";
-        $login_ldap_success = true;
-    }
-
-    //$result = "This is the result: $errorMessage";
-    $result = $login_ldap_success;
-    return $result;
-}
-
-/**
- *    Find user info in LDAP
- *    @return array Array with indexes: "firstname", "name", "email", "employeenumber"
- *    @author Stefan De Wannemacker
- *    @author Roan Embrechts
- */
-function ldap_find_user_info ($login) {
-    //error_log('Entering ldap_find_user_info('.$login.')',0);
-    global $ldap_host, $ldap_port, $ldap_basedn, $ldap_rdn, $ldap_pass, $ldap_search_dn;
-    // basic sequence with LDAP is connect, bind, search,
-    // interpret search result, close connection
-
-    //echo "Connecting ...";
-    $ldap_connect = ldap_connect( $ldap_host, $ldap_port);
-    ldap_set_version($ldap_connect);
-    if ($ldap_connect) {
-        //echo " Connect to LDAP server successful ";
-        //echo "Binding ...";
-        $ldap_bind = false;
-        $ldap_bind_res = ldap_handle_bind($ldap_connect,$ldap_bind);
-        if ($ldap_bind_res) {
-            //echo " LDAP bind successful... ";
-            //echo " Searching for uid... ";
-            // Search surname entry
-            //OLD: $sr=ldap_search($ldapconnect,"dc=rug, dc=ac, dc=be", "uid=$login");
-            //echo "<p> ldapDc = '$LDAPbasedn' </p>";
-            if(!empty($ldap_search_dn)) {
-                $sr=ldap_search($ldap_connect, $ldap_search_dn, "uid=$login");
-            } else {
-                $sr=ldap_search($ldap_connect, $ldap_basedn, "uid=$login");
-            }
-            //echo " Search result is ".$sr;
-            //echo " Number of entries returned is ".ldap_count_entries($ldapconnect,$sr);
-            //echo " Getting entries ...";
-            $info = ldap_get_entries($ldap_connect, $sr);
-            //echo "Data for ".$info["count"]." items returned:<p>";
-        } else {
-            //echo "LDAP bind failed...";
-        }
-        //echo "Closing LDAP connection<hr>";
-        ldap_close($ldap_connect);
-    } else {
-        //echo "<h3>Unable to connect to LDAP server</h3>";
-    }
-    //DEBUG: $result["firstname"] = "Jan"; $result["name"] = "De Test"; $result["email"] = "email@ugent.be";
-    $result["firstname"] = $info[0]["cn"][0];
-    $result["name"] = $info[0]["sn"][0];
-    $result["email"] = $info[0]["mail"][0];
-    $tutor_field = api_get_setting('ldap_filled_tutor_field');
-    $result[$tutor_field] = $info[0][$tutor_field]; //employeenumber by default
-
-    return $result;
-}
-
-
-/**
-*    This function uses the data from ldap_find_user_info()
-*    to add the userdata to Chamilo
-*    "firstname", "name", "email", "isEmployee"
-*    @author Roan Embrechts
-*/
-function ldap_put_user_info_locally($login, $info_array) {
-    //error_log('Entering ldap_put_user_info_locally('.$login.',info_array)',0);
-    global $ldap_pass_placeholder;
-    global $submitRegistration, $submit, $uname, $email,
-            $nom, $prenom, $password, $password1, $status;
-    global $platformLanguage;
-    global $loginFailed, $uidReset, $_user;
-
-    /*----------------------------------------------------------
-        1. set the necessary variables
-    ------------------------------------------------------------ */
-    $uname      = $login;
-    $email      = $info_array["email"];
-    $nom        = $info_array["name"];
-    $prenom     = $info_array["firstname"];
-    $password   = $ldap_pass_placeholder;
-    $password1  = $ldap_pass_placeholder;
-    $official_code = '';
-
-    define ("STUDENT",5);
-    define ("COURSEMANAGER",1);
-
-    $tutor_field = api_get_setting('ldap_filled_tutor_field');
-    $tutor_value = api_get_setting('ldap_filled_tutor_field_value');
-    if(empty($tutor_field)) {
-        $status = STUDENT;
-    } else {
-        if(empty($tutor_value)) {
-            //in this case, we are assuming that the admin didn't give a criteria
-            // so that if the field is not empty, it is a tutor
-            if(!empty($info_array[$tutor_field])) {
-                $status = COURSEMANAGER;
-            } else {
-                $status = STUDENT;
-            }
-        } else {
-            //the tutor_value is filled, so we need to check the contents of the LDAP field
-            if (is_array($info_array[$tutor_field]) && in_array($tutor_value,$info_array[$tutor_field])) {
-                $status = COURSEMANAGER;
-            } else {
-                $status = STUDENT;
-            }
-        }
-    }
-    //$official_code = xxx; //example: choose an attribute
-
-    /*----------------------------------------------------------
-        2. add info to Chamilo
-    ------------------------------------------------------------ */
-
-    require_once(api_get_path(LIBRARY_PATH).'usermanager.lib.php');
-    $language = api_get_setting('platformLanguage');
-    if (empty($language)) { $language = 'english'; }
-    $_userId = UserManager::create_user($prenom, $nom, $status,
-                     $email, $uname, $password, $official_code,
-                     $language,'', '', 'ldap');
-
-    //echo "new user added to Chamilo, id = $_userId";
-
-    //user_id, username, password, auth_source
-
-    /*----------------------------------------------------------
-        3. register session
-    ------------------------------------------------------------ */
-
-    $uData['user_id'] = $_userId;
-    $uData['username'] = $uname;
-    $uData['auth_source'] = "ldap";
-
-    $loginFailed = false;
-    $uidReset = true;
-    $_user['user_id'] = $uData['user_id'];
-    Session::write('_uid', $_uid);
-}
-
-/**
- * The code of UGent uses these functions to authenticate.
- * function AuthVerifEnseignant ($uname, $passwd)
- * function AuthVerifEtudiant ($uname, $passwd)
- * function Authentif ($uname, $passwd)
- * @todo translate the comments and code to english
- * @todo let these functions use the variables in config.inc instead of ldap_var.inc
- */
-/**
- * Checks the existence of a member in LDAP
- * @param string username input on keyboard
- * @param string password given by user
- * @return int 0 if authentication succeeded, 1 if password was incorrect, -1 if it didn't belong to LDAP
- */
-function ldap_authentication_check ($uname, $passwd) {
-    //error_log('Entering ldap_authentication_check('.$uname.','.$passwd.')',0);
-    global $ldap_host, $ldap_port, $ldap_basedn, $ldap_host2, $ldap_port2,$ldap_rdn,$ldap_pass;
-    //error_log('Entering ldap_authentication_check('.$uname.','.$passwd.')',0);
-    // Establish anonymous connection with LDAP server
-    // Etablissement de la connexion anonyme avec le serveur LDAP
-    $ds=ldap_connect($ldap_host,$ldap_port);
-    ldap_set_version($ds);
-
-    $test_bind = false;
-    $test_bind_res = ldap_handle_bind($ds,$test_bind);
-    //if problem, use the replica
-    if ($test_bind_res===false) {
-        $ds=ldap_connect($ldap_host2,$ldap_port2);
-        ldap_set_version($ds);
-    } else {
-        //error_log('Connected to server '.$ldap_host);
-    }
-    if ($ds!==false) {
-        //Creation of filter containing values input by the user
-        // Here it might be necessary to use $filter="(samaccountName=$uname)"; - see http://support.chamilo.org/issues/4675
-        $filter="(uid=$uname)";
-        // Open anonymous LDAP connection
-        $result=false;
-        $ldap_bind_res = ldap_handle_bind($ds,$result);
-	// Executing the search with the $filter parametr
-        //error_log('Searching for '.$filter.' on LDAP server',0);
-        $sr=ldap_search($ds,$ldap_basedn,$filter);
-        $info = ldap_get_entries($ds, $sr);
-        $dn=($info[0]["dn"]);
-        // debug !!    echo"<br> dn = $dn<br> pass = $passwd<br>";
-        // closing 1st connection
-        ldap_close($ds);
-    }
-
-    // test the Distinguish Name from the 1st connection
-    if ($dn=="") {
-        return (-1);        // doesn't belong to the addressbook
-    }
-    //bug ldap.. if password empty, return 1!
-    if ($passwd=="") {
-        return(1);
-    }
-    // Opening 2nd LDAP connection : Connection user for password check
-    $ds=ldap_connect($ldap_host,$ldap_port);
-    ldap_set_version($ds);
-    if (!$test_bind) {
-        $ds=ldap_connect($ldap_host2,$ldap_port2);
-        ldap_set_version($ds);
-    }
-    // return in case of wrong password connection error
-    if (@ldap_bind( $ds, $dn , $passwd) === false) {
-        return (1); // invalid password
-    } else {// connection successfull
-        return (0);
-    }
-} // end of check
-/**
- * Set the protocol version with version from config file (enables LDAP version 3)
- * @param    resource    The LDAP connexion resource, passed by reference.
- * @return    void
- */
-function ldap_set_version(&$resource) {
-    //error_log('Entering ldap_set_version(&$resource)',0);
-    global $ldap_version;
-    if ($ldap_version>2) {
-        if (ldap_set_option($resource, LDAP_OPT_PROTOCOL_VERSION, 3)) {
-            //ok - don't do anything
-        } else {
-            //failure - should switch back to version 2 by default
-        }
-    }
-}
-/**
- * Handle bind (whether authenticated or not)
- * @param    resource    The LDAP handler to which we are connecting (by reference)
- * @param    resource    The LDAP bind handler we will be modifying
- * @return    boolean        Status of the bind assignment. True for success, false for failure.
- */
-function ldap_handle_bind(&$ldap_handler,&$ldap_bind) {
-    //error_log('Entering ldap_handle_bind(&$ldap_handler,&$ldap_bind)',0);
-    global $ldap_rdn,$ldap_pass;
-    if (!empty($ldap_rdn) and !empty($ldap_pass)) {
-        //error_log('Trying authenticated login :'.$ldap_rdn.'/'.$ldap_pass,0);
-        $ldap_bind = ldap_bind($ldap_handler,$ldap_rdn,$ldap_pass);
-        if (!$ldap_bind) {
-            //error_log('Authenticated login failed',0);
-            //try in anonymous mode, you never know...
-            $ldap_bind = ldap_bind($ldap_handler);
-        }
-    } else {
-        // this is an "anonymous" bind, typically read-only access:
-        $ldap_bind = ldap_bind($ldap_handler);
-    }
-    if (!$ldap_bind) {
-        return false;
-    } else {
-        //error_log('Login finally OK',0);
-        return true;
-    }
-}
-/**
- * Get the total number of users on the platform
- * @see SortableTable#get_total_number_of_items()
- * @author    Mustapha Alouani
- */
-function ldap_get_users() {
-
-    global $ldap_basedn, $ldap_host, $ldap_port, $ldap_rdn, $ldap_pass;
-
-    $keyword_firstname = trim(Database::escape_string($_GET['keyword_firstname']));
-    $keyword_lastname = trim(Database::escape_string($_GET['keyword_lastname']));
-    $keyword_username = trim(Database::escape_string($_GET['keyword_username']));
-    $keyword_type = Database::escape_string($_GET['keyword_type']);
-
-    $ldap_query=array();
-
-    if ($keyword_username != "") {
-        $ldap_query[]="(uid=".$keyword_username."*)";
-    } else if ($keyword_lastname!=""){
-        $ldap_query[]="(sn=".$keyword_lastname."*)";
-        if ($keyword_firstname!="") {
-            $ldap_query[]="(givenName=".$keyword_firstname."*)";
-        }
-    }
-    if ($keyword_type !="" && $keyword_type !="all") {
-        $ldap_query[]="(employeeType=".$keyword_type.")";
-    }
-
-    if (count($ldap_query)>1){
-        $str_query.="(& ";
-        foreach ($ldap_query as $query){
-            $str_query.=" $query";
-        }
-        $str_query.=" )";
-    } else {
-        $str_query=$ldap_query[0];
-    }
-
-    $ds = ldap_connect($ldap_host, $ldap_port);
-    ldap_set_version($ds);
-    if ($ds && count($ldap_query)>0) {
-        $r = false;
-        $res = ldap_handle_bind($ds, $r);
-        //$sr = ldap_search($ds, "ou=test-ou,$ldap_basedn", $str_query);
-        $sr = ldap_search($ds, $ldap_basedn, $str_query);
-        //echo "Le nombre de resultats est : ".ldap_count_entries($ds,$sr)."<p>";
-        $info = ldap_get_entries($ds, $sr);
-        return $info;
-
-    } else {
-        if (count($ldap_query)!=0)
-            Display :: display_error_message(get_lang('LDAPConnectionError'));
-        return array();
-    }
-}
-
-/**
- * Get the total number of users on the platform
- * @see SortableTable#get_total_number_of_items()
- * @author    Mustapha Alouani
- */
-function ldap_get_number_of_users() {
-    $info = ldap_get_users();
-    if (count($info)>0) {
-        return $info['count'];
-    } else {
-        return 0;
-    }
-}
-
-/**
- * Get the users to display on the current page.
- * @see SortableTable#get_table_data($from)
- * @author    Mustapha Alouani
- */
-function ldap_get_user_data($from, $number_of_items, $column, $direction) {
-    $users = array();
-    $is_western_name_order = api_is_western_name_order();
-    if (isset($_GET['submit'])) {
-        $info = ldap_get_users();
-        if ($info['count']>0) {
-            for ($key = 0; $key < $info["count"]; $key ++) {
-                $user=array();
-                // Get uid from dn
-                //YW: this might be a variation between LDAP 2 and LDAP 3, but in LDAP 3, the uid is in
-                //the corresponding index of the array
-                //$dn_array=ldap_explode_dn($info[$key]["dn"],1);
-                //$user[] = $dn_array[0]; // uid is first key
-                //$user[] = $dn_array[0]; // uid is first key
-                $user[] = $info[$key]['uid'][0];
-                $user[] = $info[$key]['uid'][0];
-                if ($is_western_name_order) {
-                    $user[] = api_convert_encoding($info[$key]['cn'][0], api_get_system_encoding(), 'UTF-8');
-                    $user[] = api_convert_encoding($info[$key]['sn'][0], api_get_system_encoding(), 'UTF-8');
-                } else {
-                    $user[] = api_convert_encoding($info[$key]['sn'][0], api_get_system_encoding(), 'UTF-8');
-                    $user[] = api_convert_encoding($info[$key]['cn'][0], api_get_system_encoding(), 'UTF-8');
-                }
-                $user[] = $info[$key]['mail'][0];
-                $outab[] = $info[$key]['eduPersonPrimaryAffiliation'][0]; // Ici "student"
-                $users[] = $user;
-            }
-        } else {
-            Display :: display_error_message(get_lang('NoUser'));
-        }
-    }
-    return $users;
-}
-
-/**
- * Build the modify-column of the table
- * @param int $user_id The user id
- * @param string $url_params
- * @return string Some HTML-code with modify-buttons
- * @author    Mustapha Alouani
- */
-function modify_filter($user_id,$url_params, $row) {
-    $url_params_id="id[]=".$row[0];
-    //$url_params_id="id=".$row[0];
-    $result .= '<a href="ldap_users_list.php?action=add_user&amp;user_id='.$user_id.'&amp;id_session='.Security::remove_XSS($_GET['id_session']).'&amp;'.$url_params_id.'&amp;sec_token='.Security::getCurrentToken().'"  onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES, api_get_system_encoding()))."'".')) return false;">'.Display::return_icon('add_user.gif', get_lang('AddUsers')).'</a>';
-    return $result;
-}
-
-/**
- * Adds a user to the Chamilo database or updates its data
- * @param    string    username (and uid inside LDAP)
- * @author    Mustapha Alouani
- */
-function ldap_add_user($login) {
-    global $ldap_basedn, $ldap_host, $ldap_port, $ldap_rdn, $ldap_pass;
-    $ds = ldap_connect($ldap_host, $ldap_port);
-    ldap_set_version($ds);
-    $user_id = 0;
-    if ($ds) {
-        $str_query="(uid=".$login.")";
-        $r = false;
-        $res = ldap_handle_bind($ds, $r);
-        $sr = ldap_search($ds, $ldap_basedn, $str_query);
-        //echo "Number of results is : ".ldap_count_entries($ds,$sr)."<p>";
-        $info = ldap_get_entries($ds, $sr);
-
-        for ($key = 0; $key < $info['count']; $key ++) {
-            $user_id = ldap_add_user_by_array($info[$key]);
-        }
-
-    } else {
-        Display :: display_error_message(get_lang('LDAPConnectionError'));
-    }
-    return $user_id;
-}
-
-function ldap_add_user_by_array($data, $update_if_exists = true) {
-
-    $lastname = api_convert_encoding($data['sn'][0], api_get_system_encoding(), 'UTF-8');
-    $firstname = api_convert_encoding($data['cn'][0], api_get_system_encoding(), 'UTF-8');
-    $email = $data['mail'][0];
-    // Get uid from dn
-    $dn_array=ldap_explode_dn($data['dn'],1);
-    $username = $dn_array[0]; // uid is first key
-    $outab[] = $data['edupersonprimaryaffiliation'][0]; // Here, "student"
-    //$val = ldap_get_values_len($ds, $entry, "userPassword");
-    //$val = ldap_get_values_len($ds, $data, "userPassword");
-    //$password = $val[0];
-    // TODO the password, if encrypted at the source, will be encrypted twice, which makes it useless. Try to fix that.
-    $password = $data['userPassword'][0];
-    $structure=$data['edupersonprimaryorgunitdn'][0];
-    $array_structure=explode(",", $structure);
-    $array_val=explode("=", $array_structure[0]);
-    $etape=$array_val[1];
-    $array_val=explode("=", $array_structure[1]);
-    $annee=$array_val[1];
-    // To ease management, we add the step-year (etape-annee) code
-    $official_code=$etape."-".$annee;
-    $auth_source='ldap';
-    // No expiration date for students (recover from LDAP's shadow expiry)
-    $expiration_date='0000-00-00 00:00:00';
-    $active=1;
-    if(empty($status)){$status = 5;}
-    if(empty($phone)){$phone = '';}
-    if(empty($picture_uri)){$picture_uri = '';}
-    // Adding user
-    $user_id = 0;
-    if (UserManager::is_username_available($username)) {
-        $user_id = UserManager::create_user($firstname,$lastname,$status,$email,$username,$password,$official_code,api_get_setting('platformLanguage'),$phone,$picture_uri,$auth_source,$expiration_date,$active);
-    } else {
-        if ($update_if_exists) {
-            $user = UserManager::get_user_info($username);
-            $user_id=$user['user_id'];
-            UserManager::update_user($user_id, $firstname, $lastname, $username, null, null, $email, $status, $official_code, $phone, $picture_uri, $expiration_date, $active);
-        }
-    }
-    return $user_id;
-}
-
-/**
- * Adds a list of users to one session
- * @param    array    Array of user ids
- * @param    string    Course code
- * @return    void
- */
-function ldap_add_user_to_session($UserList, $id_session) {
-
-    // Database Table Definitions
-    $tbl_session                        = Database::get_main_table(TABLE_MAIN_SESSION);
-    $tbl_session_rel_course                = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
-    $tbl_session_rel_course_rel_user    = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
-    $tbl_session_rel_user                = Database::get_main_table(TABLE_MAIN_SESSION_USER);
-
-    $id_session = (int) $id_session;
-    // Once users are imported in the users base, we can assign them to the session
-    $result=Database::query("SELECT c_id FROM $tbl_session_rel_course " .
-            "WHERE id_session='$id_session'");
-    $CourseList=array();
-    while ($row=Database::fetch_array($result)) {
-        $CourseList[]=$row['c_id'];
-    }
-    foreach ($CourseList as $enreg_course) {
-        foreach ($UserList as $enreg_user) {
-            $enreg_user = (int) $enreg_user;
-            Database::query("INSERT IGNORE ".
-              " INTO $tbl_session_rel_course_rel_user ".
-              "(id_session,c_id,id_user) VALUES ".
-              "('$id_session','$enreg_course','$enreg_user')");
-        }
-        $sql = "SELECT COUNT(id_user) as nbUsers ".
-               " FROM $tbl_session_rel_course_rel_user " .
-               " WHERE id_session='$id_session' ".
-               " AND c_id='$enreg_course'";
-        $rs = Database::query($sql);
-        list($nbr_users) = Database::fetch_array($rs);
-        Database::query("UPDATE $tbl_session_rel_course  ".
-               " SET nbr_users=$nbr_users " .
-               " WHERE id_session='$id_session' ".
-               " AND c_id='$enreg_course'");
-    }
-    foreach ($UserList as $enreg_user) {
-        $enreg_user = (int) $enreg_user;
-        Database::query("INSERT IGNORE INTO $tbl_session_rel_user ".
-               " (id_session, id_user) " .
-               " VALUES('$id_session','$enreg_user')");
-    }
-    // We update the number of users in the session
-    $sql = "SELECT COUNT(id_user) as nbUsers FROM $tbl_session_rel_user ".
-           " WHERE id_session='$id_session' ".
-           " AND relation_type<>".SESSION_RELATION_TYPE_RRHH." ";
-    $rs = Database::query($sql);
-    list($nbr_users) = Database::fetch_array($rs);
-    Database::query("UPDATE $tbl_session SET nbr_users=$nbr_users ".
-           " WHERE id='$id_session'");
-}
-
-function syncro_users() {
-    global $ldap_basedn, $ldap_host, $ldap_port, $ldap_rdn, $ldap_pass, $ldap_search_dn;
-    echo "Connecting ...";
-    $ldap_connect = ldap_connect( $ldap_host, $ldap_port);
-    ldap_set_version($ldap_connect);
-    if ($ldap_connect) {
-        //echo " Connect to LDAP server successful ";
-        //echo "Binding ...";
-        $ldap_bind = false;
-        $ldap_bind_res = ldap_handle_bind($ldap_connect,$ldap_bind);
-        if ($ldap_bind_res) {
-            //echo " LDAP bind successful... ";
-            //echo " Searching for uid... ";
-            // Search surname entry
-            //OLD: $sr=ldap_search($ldapconnect,"dc=rug, dc=ac, dc=be", "uid=$login");
-            //echo "<p> ldapDc = '$LDAPbasedn' </p>";
-            $all_user_query = "uid=*";
-            if(!empty($ldap_search_dn)) {
-                $sr = ldap_search($ldap_connect, $ldap_search_dn, $all_user_query);
-            } else {
-                $sr = ldap_search($ldap_connect, $ldap_basedn, $all_user_query);
-            }
-            //echo " Number of entries returned is ".ldap_count_entries($ldapconnect,$sr);
-            //echo " Getting entries ...";
-            $info = ldap_get_entries($ldap_connect, $sr);
-            for ($key = 0; $key < $info['count']; $key ++) {
-                $user_id = ldap_add_user_by_array($info[$key], false);
-                if ($user_id) {
-                    echo "User #$user_id created ";
-                } else {
-                    echo "User was not created ";
-                }
-            }
-            //echo "Data for ".$info["count"]." items returned:<p>";
-        } else {
-            //echo "LDAP bind failed...";
-        }
-        //echo "Closing LDAP connection<hr>";
-        ldap_close($ldap_connect);
-    } else {
-        //echo "<h3>Unable to connect to LDAP server</h3>";
-    }
-}

+ 0 - 6
main/auth/ldap/index.html

@@ -1,6 +0,0 @@
-<html>
-<head>
-</head>
-<body>
-</body>
-</html>

+ 0 - 46
main/auth/ldap/ldap_var.inc.php

@@ -1,46 +0,0 @@
-<?php // $Id: ldap_var.inc.php 14966 2008-04-20 23:03:11Z yannoo $
-/* For licensing terms, see /license.txt */
-/**
-*	LDAP settings
-*	In the older code, there was a distinction between
-*	the teacher and student LDAP server. Later I decided not
-*	to make this distinction. However, it could be built in
-*	in the future but then perhaps in a more general way.
-*
-*	Originally, Thomas and I agreed to store all settings in one file
-*	(configuration.php) to make it easier for claroline admins to make changes.
-*	Since October 2003, this changed: the include directory has been
-*	changed to be called "inc", and all tools should have their own file(s).
-*
-*	This file "ldap_var.inc.php" was already used by the
-*	older french authentification functions. I have moved the new
-*	variables from the configuration.php to here as well.
-*
-*	@author Roan Embrechts
-*	@package chamilo.auth.ldap
-*/
-/**
- * Configuration settings
- */
-// your ldap server
-$ldap_host = api_get_setting('ldap_main_server_address');
-// your ldap server's port number
-$ldap_port = api_get_setting('ldap_main_server_port');
-//domain
-$ldap_basedn = api_get_setting('ldap_domain');
-
-//search term for students
-$ldap_search_dn = api_get_setting('ldap_search_string');
-
-//additional server params for use of replica in case of problems
-$ldap_host2 = api_get_setting('ldap_replicate_server_address');
-$ldap_port2 = api_get_setting('ldap_replicate_server_port');
-
-//protocol version - set to 3 for LDAP 3
-$ldap_version = api_get_setting('ldap_version');
-
-//non-anonymous LDAP mode
-$ldap_rdn = api_get_setting('ldap_authentication_login');
-$ldap_pass = api_get_setting('ldap_authentication_password');
-
-$ldap_pass_placeholder = "PLACEHOLDER";

+ 0 - 45
main/auth/ldap/login.php

@@ -1,45 +0,0 @@
-<?php // $Id: login.php 22201 2009-07-17 19:57:03Z cfasanando $
-/* For licensing terms, see /license.txt */
-/**
-*	Users trying to login, who already exist in the Chamilo database
-*	and have ldap as authentication type get verified here.
-*	@author Roan Embrechts
-*	@package chamilo.auth.ldap
-*/
-/**
- * An external authentification module needs to set
- * - $loginFailed
- * - $uidReset
- * - $_user['user_id']
- * - register the $_user['user_id'] in the session
- *
- * As the LDAP code shows, this is not as difficult as you might think.
- * LDAP authentification module
- * this calls the loginWithLdap function
- * from the LDAP library, and sets a few
- * variables based on the result.
- */
-//require_once('../../inc/global.inc.php'); - this script should be loaded by the /index.php script anyway, so global is already loaded
-
-use \ChamiloSession as Session;
-
-require_once('authldap.php');
-
-$loginLdapSucces = ldap_login($login, $password);
-
-if ($loginLdapSucces)
-{
-	$loginFailed = false;
-	$uidReset = true;
-	$_user['user_id'] = $uData['user_id'];
-	Session::write('_uid',$_uid);
-    // Jand: copied from event_login in events.lib.php to enable login statistics:
-    event_login();
-}
-else
-{
-	$loginFailed = true;
-	unset($_user['user_id']);
-	$uidReset = false;
-}
-?>

+ 0 - 40
main/auth/ldap/newUser.php

@@ -1,40 +0,0 @@
-<?php # $Id: newUser.php 14965 2008-04-20 23:01:17Z yannoo $
-/* For licensing terms, see /license.txt */
-/**
-* Users trying to login, who do not yet exist in the Chamilo database,
-* can be added by this script which tries to retrieve ldap information 
-* about them.
-* @author Roan Embrechts
-* @package chamilo.auth.ldap
-*/
-/**
- * when a user does not exist yet in dokeos,
- * but he or she does exist in the LDAP,
- * we add him to the dokeos database
-*/
-//require_once('../../inc/global.inc.php'); - this script should be loaded by the /index.php script anyway, so global is already loaded
-require_once('authldap.php');
-
-//error_log('Trying to register new user '.$login.' with pass '.$password,0);
-
-$ldap_login_success = ldap_login($login, $password);
-
-if ($ldap_login_success)
-{
-	//error_log('Found user '.$login.' on LDAP server',0);
-	/*
-		In here, we know that
-		- the user does not exist in dokeos
-		- the users login and password are correct
-	*/
-	$info_array = ldap_find_user_info($login);
-	ldap_put_user_info_locally($login, $info_array);
-}
-else
-{
-	//error_log('Could not find '.$login.' on LDAP server',0);
-	$loginFailed = true;
-	unset($_user['user_id']);
-	$uidReset = false;
-}
-?>

+ 0 - 8
main/auth/ldap/syncro_users.php

@@ -1,8 +0,0 @@
-<?php
-
-use \ChamiloSession as Session;
-
-require_once '../../inc/global.inc.php';
-require_once 'authldap.php';
-
-syncro_users();

+ 0 - 454
main/auth/openid/login.php

@@ -1,454 +0,0 @@
-<?php
-
-/* For licensing terms, see /license.txt */
-/**
- * OpenID login method
- *
- * The OpenID login method relies on authentication servers providing a public
- * URL that can confirm the identity of a person, thus avoiding the spread
- * use of password transmissions over non-secure lines (for Dokeos, it is a
- * good way of avoiding password theft)
- * @package chamilo.auth.openid
- */
-/**
- * Initialisation
- */
-require_once 'openid.lib.php';
-require_once 'xrds.lib.php';
-
-function openid_form() {
-    //get_lang('OpenIdAuthentication')
-    $form = new FormValidator('openid_login', 'post', null, null, array('class' => 'form-vertical form_login'));
-    $form->addElement('text', 'openid_url', array(get_lang('OpenIDURL'), Display::url(get_lang('OpenIDWhatIs'), 'main/auth/openid/whatis.php')), array('class' => 'openid_input'));
-    $form->addElement('button', 'submit', get_lang('Login'));
-    return $form->return_form();
-}
-
-/**
- * The initial step of OpenID authentication responsible for the following:
- *  - Perform discovery on the claimed OpenID.
- *  - If possible, create an association with the Provider's endpoint.
- *  - Create the authentication request.
- *  - Perform the appropriate redirect.
- *
- * @param $claimed_id The OpenID to authenticate
- * @param $return_to The endpoint to return to from the OpenID Provider
- */
-function openid_begin($claimed_id, $return_to = '', $form_values = array()) {
-
-    $claimed_id = _openid_normalize($claimed_id);
-    $services = openid_discovery($claimed_id);
-    if (count($services) == 0) {
-        echo 'Sorry, that is not a valid OpenID. Please ensure you have spelled your ID correctly.';
-        return;
-    }
-    $op_endpoint = $services[0]['uri'];
-    // Store the discovered endpoint in the session (so we don't have to rediscover).
-    $_SESSION['openid_op_endpoint'] = $op_endpoint;
-    // Store the claimed_id in the session (for handling delegation).
-    $_SESSION['openid_claimed_id'] = $claimed_id;
-    // Store the login form values so we can pass them to
-    // user_exteral_login later.
-    $_SESSION['openid_user_login_values'] = $form_values;
-
-    // If bcmath is present, then create an association
-    $assoc_handle = '';
-    if (function_exists('bcadd')) {
-        $assoc_handle = openid_association($op_endpoint);
-    }
-    // Now that there is an association created, move on
-    // to request authentication from the IdP
-    $identity = (!empty($services[0]['delegate'])) ? $services[0]['delegate'] : $claimed_id;
-    if (isset($services[0]['types']) && is_array($services[0]['types']) && in_array(OPENID_NS_2_0 . '/server', $services[0]['types'])) {
-        $identity = 'http://openid.net/identifier_select/2.0';
-    }
-    $authn_request = openid_authentication_request($claimed_id, $identity, $return_to, $assoc_handle, $services[0]['version']);
-    if ($services[0]['version'] == 2) {
-        echo openid_redirect($op_endpoint, $authn_request);
-    } else {
-        echo openid_redirect_http($op_endpoint, $authn_request);
-    }
-}
-
-/**
- * Completes OpenID authentication by validating returned data from the OpenID
- * Provider.
- *
- * @param $response Array of returned from the OpenID provider (typically $_REQUEST).
- *
- * @return $response Response values for further processing with
- *   $response['status'] set to one of 'success', 'failed' or 'cancel'.
- */
-function openid_complete($response) {
-    // Default to failed response
-    $response['status'] = 'failed';
-    if (isset($_SESSION['openid_op_endpoint']) && isset($_SESSION['openid_claimed_id'])) {
-        _openid_fix_post($response);
-        $op_endpoint = $_SESSION['openid_op_endpoint'];
-        $claimed_id = $_SESSION['openid_claimed_id'];
-        unset($_SESSION['openid_op_endpoint']);
-        unset($_SESSION['openid_claimed_id']);
-        if (isset($response['openid.mode'])) {
-            if ($response['openid.mode'] == 'cancel') {
-                $response['status'] = 'cancel';
-            } else {
-                if (openid_verify_assertion($op_endpoint, $response)) {
-                    $response['openid.identity'] = $claimed_id;
-                    $response['status'] = 'success';
-                }
-            }
-        }
-    }
-    return $response;
-}
-
-/**
- * Perform discovery on a claimed ID to determine the OpenID provider endpoint.
- *
- * @param $claimed_id The OpenID URL to perform discovery on.
- *
- * @return Array of services discovered (including OpenID version, endpoint
- * URI, etc).
- */
-function openid_discovery($claimed_id) {
-
-    $services = array();
-
-    $xrds_url = $claimed_id;
-    if (_openid_is_xri($claimed_id)) {
-        $xrds_url = 'http://xri.net/' . $claimed_id;
-    }
-    $url = @parse_url($xrds_url);
-    if ($url['scheme'] == 'http' || $url['scheme'] == 'https') {
-        // For regular URLs, try Yadis resolution first, then HTML-based discovery
-        $headers = array('Accept' => 'application/xrds+xml');
-        //TODO
-        $result = openid_http_request($xrds_url, $headers);
-
-        if (!isset($result->error)) {
-            if (isset($result->headers['Content-Type']) && preg_match("/application\/xrds\+xml/", $result->headers['Content-Type'])) {
-                // Parse XML document to find URL
-                $services = xrds_parse($result->data);
-            } else {
-                $xrds_url = NULL;
-                if (isset($result->headers['X-XRDS-Location'])) {
-                    $xrds_url = $result->headers['X-XRDS-Location'];
-                } else {
-                    // Look for meta http-equiv link in HTML head
-                    $xrds_url = _openid_meta_httpequiv('X-XRDS-Location', $result->data);
-                }
-                if (!empty($xrds_url)) {
-                    $headers = array('Accept' => 'application/xrds+xml');
-                    //TODO
-                    $xrds_result = openid_http_request($xrds_url, $headers);
-                    if (!isset($xrds_result->error)) {
-                        $services = xrds_parse($xrds_result->data);
-                    }
-                }
-            }
-
-            // Check for HTML delegation
-            if (count($services) == 0) {
-                // Look for 2.0 links
-                $uri = _openid_link_href('openid2.provider', $result->data);
-                $delegate = _openid_link_href('openid2.local_id', $result->data);
-                $version = 2;
-
-                // 1.0 links
-                if (empty($uri)) {
-                    $uri = _openid_link_href('openid.server', $result->data);
-                    $delegate = _openid_link_href('openid.delegate', $result->data);
-                    $version = 1;
-                }
-                if (!empty($uri)) {
-                    $services[] = array('uri' => $uri, 'delegate' => $delegate, 'version' => $version);
-                }
-            }
-        }
-    }
-    return $services;
-}
-
-/**
- * Attempt to create a shared secret with the OpenID Provider.
- *
- * @param $op_endpoint URL of the OpenID Provider endpoint.
- *
- * @return $assoc_handle The association handle.
- */
-function openid_association($op_endpoint) {
-    //@todo Remove Old Associations:
-    $openid_association = Database::get_main_table(TABLE_MAIN_OPENID_ASSOCIATION);
-    $sql = "DELETE FROM $openid_association WHERE created + expires_in < '" . api_get_utc_datetime() . "'";
-    Database::query($sql);
-
-    // Check to see if we have an association for this IdP already
-    $op_endpoint = Database::escape_string($op_endpoint);
-    $sql = "SELECT assoc_handle FROM $openid_association WHERE idp_endpoint_uri = '$op_endpoint'";
-    $assoc_handle = Database::query($sql);
-    if (Database::num_rows($assoc_handle) <= 1) {
-        $mod = OPENID_DH_DEFAULT_MOD;
-        $gen = OPENID_DH_DEFAULT_GEN;
-        $r = _openid_dh_rand($mod);
-        $private = bcadd($r, 1);
-        $public = bcpowmod($gen, $private, $mod);
-
-        // If there is no existing association, then request one
-        $assoc_request = openid_association_request($public);
-        $assoc_message = _openid_encode_message(_openid_create_message($assoc_request));
-        $assoc_headers = array('Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8');
-        //TODO
-        $assoc_result = openid_http_request($op_endpoint, $assoc_headers, 'POST', $assoc_message);
-        if (isset($assoc_result->error)) {
-            return FALSE;
-        }
-
-        $assoc_response = _openid_parse_message($assoc_result->data);
-        if (isset($assoc_response['mode']) && $assoc_response['mode'] == 'error') {
-            return FALSE;
-        }
-
-        if ($assoc_response['session_type'] == 'DH-SHA1') {
-            $spub = _openid_dh_base64_to_long($assoc_response['dh_server_public']);
-            $enc_mac_key = base64_decode($assoc_response['enc_mac_key']);
-            $shared = bcpowmod($spub, $private, $mod);
-            $assoc_response['mac_key'] = base64_encode(_openid_dh_xorsecret($shared, $enc_mac_key));
-        }
-        //TODO
-        $openid_association = Database::get_main_table(TABLE_MAIN_OPENID_ASSOCIATION);
-        Database::query(sprintf("INSERT INTO $openid_association (idp_endpoint_uri, session_type, assoc_handle, assoc_type, expires_in, mac_key, created) VALUES('%s', '%s', '%s', '%s', %d, '%s', %d)", $op_endpoint, $assoc_response['session_type'], $assoc_response['assoc_handle'], $assoc_response['assoc_type'], $assoc_response['expires_in'], $assoc_response['mac_key'], api_get_utc_datetime()));
-
-        $assoc_handle = $assoc_response['assoc_handle'];
-    }
-    return $assoc_handle;
-}
-
-/**
- * ?
- */
-function openid_association_request($public) {
-
-    $request = array(
-        'openid.ns' => OPENID_NS_2_0,
-        'openid.mode' => 'associate',
-        'openid.session_type' => 'DH-SHA1',
-        'openid.assoc_type' => 'HMAC-SHA1'
-    );
-
-    if ($request['openid.session_type'] == 'DH-SHA1' || $request['openid.session_type'] == 'DH-SHA256') {
-        $cpub = _openid_dh_long_to_base64($public);
-        $request['openid.dh_consumer_public'] = $cpub;
-    }
-    return $request;
-}
-
-/**
- *
- */
-function openid_authentication_request($claimed_id, $identity, $return_to = '', $assoc_handle = '', $version = 2) {
-
-    $realm = ($return_to) ? $return_to : api_get_self();
-
-    $ns = ($version == 2) ? OPENID_NS_2_0 : OPENID_NS_1_0;
-    $request = array(
-        'openid.ns' => $ns,
-        'openid.mode' => 'checkid_setup',
-        'openid.identity' => $identity,
-        'openid.claimed_id' => $claimed_id,
-        'openid.assoc_handle' => $assoc_handle,
-        'openid.return_to' => $return_to,
-    );
-
-    if ($version == 2) {
-        $request['openid.realm'] = $realm;
-    } else {
-        $request['openid.trust_root'] = $realm;
-    }
-
-    // Simple Registration - we don't ask lastname and firstname because the only
-    // available similar data is "fullname" and we would have to guess where to split
-    $request['openid.sreg.required'] = 'nickname,email';
-    $request['openid.ns.sreg'] = "http://openid.net/extensions/sreg/1.1";
-
-    //$request = array_merge($request, module_invoke_all('openid', 'request', $request));
-    //$request = array_merge($request);
-
-    return $request;
-}
-
-/**
- * Attempt to verify the response received from the OpenID Provider.
- *
- * @param $op_endpoint The OpenID Provider URL.
- * @param $response Array of repsonse values from the provider.
- *
- * @return boolean
- */
-function openid_verify_assertion($op_endpoint, $response) {
-
-    $valid = FALSE;
-
-    //TODO
-    $openid_association = Database::get_main_table(TABLE_MAIN_OPENID_ASSOCIATION);
-    $sql = sprintf("SELECT * FROM $openid_association WHERE assoc_handle = '%s'", $response['openid.assoc_handle']);
-    $res = Database::query($sql);
-    $association = Database::fetch_object($res);
-    if ($association && isset($association->session_type)) {
-        $keys_to_sign = explode(',', $response['openid.signed']);
-        $self_sig = _openid_signature($association, $response, $keys_to_sign);
-        if ($self_sig == $response['openid.sig']) {
-            $valid = TRUE;
-        } else {
-            $valid = FALSE;
-        }
-    } else {
-        $request = $response;
-        $request['openid.mode'] = 'check_authentication';
-        $message = _openid_create_message($request);
-        $headers = array('Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8');
-        $result = openid_http_request($op_endpoint, $headers, 'POST', _openid_encode_message($message));
-        if (!isset($result->error)) {
-            $response = _openid_parse_message($result->data);
-            if (strtolower(trim($response['is_valid'])) == 'true') {
-                $valid = TRUE;
-            } else {
-                $valid = FALSE;
-            }
-        }
-    }
-
-    return $valid;
-}
-
-/**
- * Make a HTTP request - This function has been copied straight over from Drupal 6 code (drupal_http_request)
- */
-function openid_http_request($url, $headers = array(), $method = 'GET', $data = NULL, $retry = 3) {
-    $result = new stdClass();
-
-    // Parse the URL and make sure we can handle the schema.
-    $uri = parse_url($url);
-
-    switch ($uri['scheme']) {
-        case 'http':
-            $port = isset($uri['port']) ? $uri['port'] : 80;
-            $host = $uri['host'] . ($port != 80 ? ':' . $port : '');
-            $fp = @fsockopen($uri['host'], $port, $errno, $errstr, 15);
-            break;
-        case 'https':
-            // Note: Only works for PHP 4.3 compiled with OpenSSL.
-            $port = isset($uri['port']) ? $uri['port'] : 443;
-            $host = $uri['host'] . ($port != 443 ? ':' . $port : '');
-            $fp = @fsockopen('ssl://' . $uri['host'], $port, $errno, $errstr, 20);
-            break;
-        default:
-            $result->error = 'invalid schema ' . $uri['scheme'];
-            return $result;
-    }
-
-    // Make sure the socket opened properly.
-    if (!$fp) {
-        // When a network error occurs, we make sure that it is a negative number so
-        // it can clash with the HTTP status codes.
-        $result->code = -$errno;
-        $result->error = trim($errstr);
-        return $result;
-    }
-
-    // Construct the path to act on.
-    $path = isset($uri['path']) ? $uri['path'] : '/';
-    if (isset($uri['query'])) {
-        $path .= '?' . $uri['query'];
-    }
-
-    // Create HTTP request.
-    $defaults = array(
-        // RFC 2616: "non-standard ports MUST, default ports MAY be included".
-        // We don't add the port to prevent from breaking rewrite rules checking the
-        // host that do not take into account the port number.
-        'Host' => "Host: $host",
-        'User-Agent' => 'User-Agent: Chamilo (+http://www.chamilo.org/)',
-        'Content-Length' => 'Content-Length: ' . strlen($data)
-    );
-
-    // If the server url has a user then attempt to use basic authentication
-    if (isset($uri['user'])) {
-        $defaults['Authorization'] = 'Authorization: Basic ' . base64_encode($uri['user'] . (!empty($uri['pass']) ? ":" . $uri['pass'] : ''));
-    }
-
-    foreach ($headers as $header => $value) {
-        $defaults[$header] = $header . ': ' . $value;
-    }
-
-    $request = $method . ' ' . $path . " HTTP/1.0\r\n";
-    $request .= implode("\r\n", $defaults);
-    $request .= "\r\n\r\n";
-    if ($data) {
-        $request .= $data . "\r\n";
-    }
-    $result->request = $request;
-
-    fwrite($fp, $request);
-
-    // Fetch response.
-    $response = '';
-    while (!feof($fp) && $chunk = fread($fp, 1024)) {
-        $response .= $chunk;
-    }
-    fclose($fp);
-
-    // Parse response.
-    list($split, $result->data) = explode("\r\n\r\n", $response, 2);
-    $split = preg_split("/\r\n|\n|\r/", $split);
-
-    list($protocol, $code, $text) = explode(' ', trim(array_shift($split)), 3);
-    $result->headers = array();
-
-    // Parse headers.
-    while ($line = trim(array_shift($split))) {
-        list($header, $value) = explode(':', $line, 2);
-        if (isset($result->headers[$header]) && $header == 'Set-Cookie') {
-            // RFC 2109: the Set-Cookie response header comprises the token Set-
-            // Cookie:, followed by a comma-separated list of one or more cookies.
-            $result->headers[$header] .= ',' . trim($value);
-        } else {
-            $result->headers[$header] = trim($value);
-        }
-    }
-
-    $responses = array(
-        100 => 'Continue', 101 => 'Switching Protocols',
-        200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content',
-        300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect',
-        400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed',
-        500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported'
-    );
-    // RFC 2616 states that all unknown HTTP codes must be treated the same as the
-    // base code in their class.
-    if (!isset($responses[$code])) {
-        $code = floor($code / 100) * 100;
-    }
-
-    switch ($code) {
-        case 200: // OK
-        case 304: // Not modified
-            break;
-        case 301: // Moved permanently
-        case 302: // Moved temporarily
-        case 307: // Moved temporarily
-            $location = $result->headers['Location'];
-
-            if ($retry) {
-                $result = openid_http_request($result->headers['Location'], $headers, $method, $data, --$retry);
-                $result->redirect_code = $result->code;
-            }
-            $result->redirect_url = $location;
-
-            break;
-        default:
-            $result->error = $text;
-    }
-
-    $result->code = $code;
-    return $result;
-}

+ 0 - 404
main/auth/openid/openid.lib.php

@@ -1,404 +0,0 @@
-<?php
-
-/* For licensing terms, see /license.txt */
-/**
- * OpenID utility functions. Taken from Drupal 6 code (from dries)
- * @package chamilo.auth.openid
- */
-/**
- * Code
- */
-// Diffie-Hellman Key Exchange Default Value.
-define('OPENID_DH_DEFAULT_MOD', '155172898181473697471232257763715539915724801' .
-        '966915404479707795314057629378541917580651227423698188993727816152646631' .
-        '438561595825688188889951272158842675419950341258706556549803580104870537' .
-        '681476726513255747040765857479291291572334510643245094715007229621094194' .
-        '349783925984760375594985848253359305585439638443');
-
-// Constants for Diffie-Hellman key exchange computations.
-define('OPENID_DH_DEFAULT_GEN', '2');
-define('OPENID_SHA1_BLOCKSIZE', 64);
-define('OPENID_RAND_SOURCE', '/dev/urandom');
-
-// OpenID namespace URLs
-define('OPENID_NS_2_0', 'http://specs.openid.net/auth/2.0');
-define('OPENID_NS_1_1', 'http://openid.net/signon/1.1');
-define('OPENID_NS_1_0', 'http://openid.net/signon/1.0');
-
-/**
- * Performs an HTTP 302 redirect (for the 1.x protocol).
- * This function should be deprecated for 1.8.6.2 needs documentation
- */
-function openid_redirect_http($url, $message) {
-    $query = array();
-    foreach ($message as $key => $val) {
-        $query[] = $key . '=' . urlencode($val);
-    }
-    $sep = (strpos($url, '?') === FALSE) ? '?' : '&';
-    header('Location: ' . $url . $sep . implode('&', $query), TRUE, 302);
-    //exit;
-}
-
-/**
- * Creates a js auto-submit redirect for (for the 2.x protocol)
- * This function should be deprecated for 1.8.6.2 needs documentation
- */
-function openid_redirect($url, $message) {
-    $output = '<html><head><title>' . get_lang('OpenIDRedirect') . "</title></head>\n<body>";
-    $output .= '<form method="post" action="' . $url . '" id="openid-redirect-form">';
-    foreach ($message as $key => $value) {
-        $output .='<input type="hidden" name="' . $key . '" value="' . $value . '">';
-    }    
-    $output .= '<noscript><input type="submit" name="submit" value="' . get_lang('Send') . '"/></noscript>';
-    $output .= '</form>';
-    $output .= '<script type="text/javascript">document.getElementById("openid-redirect-form").submit();</script>';
-    $output .= "</body></html>";
-    return $output;
-}
-
-/**
- * Determine if the given identifier is an XRI ID.
- */
-function _openid_is_xri($identifier) {
-    $firstchar = substr($identifier, 0, 1);
-    if ($firstchar == "@" || $firstchar == "=")
-        return TRUE;
-
-    if (stristr($identifier, 'xri://') !== FALSE) {
-        return TRUE;
-    }
-
-    return FALSE;
-}
-
-/**
- * Normalize the given identifier as per spec.
- */
-function _openid_normalize($identifier) {
-    if (_openid_is_xri($identifier)) {
-        return _openid_normalize_xri($identifier);
-    } else {
-        return _openid_normalize_url($identifier);
-    }
-}
-
-function _openid_normalize_xri($xri) {
-    $normalized_xri = $xri;
-    if (stristr($xri, 'xri://') !== FALSE) {
-        $normalized_xri = substr($xri, 6);
-    }
-    return $normalized_xri;
-}
-
-function _openid_normalize_url($url) {
-    $normalized_url = $url;
-
-    if (stristr($url, '://') === FALSE) {
-        $normalized_url = 'http://' . $url;
-    }
-
-    if (substr_count($normalized_url, '/') < 3) {
-        $normalized_url .= '/';
-    }
-
-    return $normalized_url;
-}
-
-/**
- * Create a serialized message packet as per spec: $key:$value\n .
- */
-function _openid_create_message($data) {
-    $serialized = '';
-
-    foreach ($data as $key => $value) {
-        if ((strpos($key, ':') !== FALSE) || (strpos($key, "\n") !== FALSE) || (strpos($value, "\n") !== FALSE)) {
-            return null;
-        }
-        $serialized .= "$key:$value\n";
-    }
-    return $serialized;
-}
-
-/**
- * Encode a message from _openid_create_message for HTTP Post
- */
-function _openid_encode_message($message) {
-    $encoded_message = '';
-
-    $items = explode("\n", $message);
-    foreach ($items as $item) {
-        $parts = explode(':', $item, 2);
-
-        if (count($parts) == 2) {
-            if ($encoded_message != '') {
-                $encoded_message .= '&';
-            }
-            $encoded_message .= rawurlencode(trim($parts[0])) . '=' . rawurlencode(trim($parts[1]));
-        }
-    }
-
-    return $encoded_message;
-}
-
-/**
- * Convert a direct communication message
- * into an associative array.
- */
-function _openid_parse_message($message) {
-    $parsed_message = array();
-
-    $items = explode("\n", $message);
-    foreach ($items as $item) {
-        $parts = explode(':', $item, 2);
-
-        if (count($parts) == 2) {
-            $parsed_message[$parts[0]] = $parts[1];
-        }
-    }
-
-    return $parsed_message;
-}
-
-/**
- * Return a nonce value - formatted per OpenID spec.
- */
-function _openid_nonce() {
-    // YYYY-MM-DDThh:mm:ssTZD UTC, plus some optional extra unique chars
-    return gmstrftime('%Y-%m-%dT%H:%M:%S%Z') .
-            chr(mt_rand(0, 25) + 65) .
-            chr(mt_rand(0, 25) + 65) .
-            chr(mt_rand(0, 25) + 65) .
-            chr(mt_rand(0, 25) + 65);
-}
-
-/**
- * Pull the href attribute out of an html link element.
- */
-function _openid_link_href($rel, $html) {
-    $rel = preg_quote($rel);
-    preg_match('|<link\s+rel=["\'](.*)' . $rel . '(.*)["\'](.*)/?>|iU', $html, $matches);
-    if (isset($matches[3])) {
-        preg_match('|href=["\']([^"]+)["\']|iU', $matches[0], $href);
-        return trim($href[1]);
-    }
-    return FALSE;
-}
-
-/**
- * Pull the http-equiv attribute out of an html meta element
- */
-function _openid_meta_httpequiv($equiv, $html) {
-    preg_match('|<meta\s+http-equiv=["\']' . $equiv . '["\'](.*)/?>|iU', $html, $matches);
-    if (isset($matches[1])) {
-        preg_match('|content=["\']([^"]+)["\']|iU', $matches[1], $content);
-        return $content[1];
-    }
-    return FALSE;
-}
-
-/**
- * Sign certain keys in a message
- * @param $association - object loaded from openid_association or openid_server_association table
- *              - important fields are ->assoc_type and ->mac_key
- * @param $message_array - array of entire message about to be sent
- * @param $keys_to_sign - keys in the message to include in signature (without
- *  'openid.' appended)
- */
-function _openid_signature($association, $message_array, $keys_to_sign) {
-    $signature = '';
-    $sign_data = array();
-
-    foreach ($keys_to_sign as $key) {
-        if (isset($message_array['openid.' . $key])) {
-            $sign_data[$key] = $message_array['openid.' . $key];
-        }
-    }
-
-    $message = _openid_create_message($sign_data);
-    $secret = base64_decode($association->mac_key);
-    $signature = _openid_hmac($secret, $message);
-
-    return base64_encode($signature);
-}
-
-function _openid_hmac($key, $text) {
-    if (strlen($key) > OPENID_SHA1_BLOCKSIZE) {
-        $key = _openid_sha1($key, true);
-    }
-
-    $key = str_pad($key, OPENID_SHA1_BLOCKSIZE, chr(0x00));
-    $ipad = str_repeat(chr(0x36), OPENID_SHA1_BLOCKSIZE);
-    $opad = str_repeat(chr(0x5c), OPENID_SHA1_BLOCKSIZE);
-    $hash1 = _openid_sha1(($key ^ $ipad) . $text, true);
-    $hmac = _openid_sha1(($key ^ $opad) . $hash1, true);
-
-    return $hmac;
-}
-
-function _openid_sha1($text) {
-    $hex = sha1($text);
-    $raw = '';
-    for ($i = 0; $i < 40; $i += 2) {
-        $hexcode = substr($hex, $i, 2);
-        $charcode = (int) base_convert($hexcode, 16, 10);
-        $raw .= chr($charcode);
-    }
-    return $raw;
-}
-
-function _openid_dh_base64_to_long($str) {
-    $b64 = base64_decode($str);
-
-    return _openid_dh_binary_to_long($b64);
-}
-
-function _openid_dh_long_to_base64($str) {
-    return base64_encode(_openid_dh_long_to_binary($str));
-}
-
-function _openid_dh_binary_to_long($str) {
-    $bytes = array_merge(unpack('C*', $str));
-
-    $n = 0;
-    foreach ($bytes as $byte) {
-        $n = bcmul($n, pow(2, 8));
-        $n = bcadd($n, $byte);
-    }
-
-    return $n;
-}
-
-function _openid_dh_long_to_binary($long) {
-    $cmp = bccomp($long, 0);
-    if ($cmp < 0) {
-        return FALSE;
-    }
-
-    if ($cmp == 0) {
-        return "\x00";
-    }
-
-    $bytes = array();
-
-    while (bccomp($long, 0) > 0) {
-        array_unshift($bytes, bcmod($long, 256));
-        $long = bcdiv($long, pow(2, 8));
-    }
-
-    if ($bytes && ($bytes[0] > 127)) {
-        array_unshift($bytes, 0);
-    }
-
-    $string = '';
-    foreach ($bytes as $byte) {
-        $string .= pack('C', $byte);
-    }
-
-    return $string;
-}
-
-function _openid_dh_xorsecret($shared, $secret) {
-    $dh_shared_str = _openid_dh_long_to_binary($shared);
-    $sha1_dh_shared = _openid_sha1($dh_shared_str);
-    $xsecret = "";
-    for ($i = 0; $i < strlen($secret); $i++) {
-        $xsecret .= chr(ord($secret[$i]) ^ ord($sha1_dh_shared[$i]));
-    }
-
-    return $xsecret;
-}
-
-function _openid_dh_rand($stop) {
-    static $duplicate_cache = array();
-
-    // Used as the key for the duplicate cache
-    $rbytes = _openid_dh_long_to_binary($stop);
-
-    if (array_key_exists($rbytes, $duplicate_cache)) {
-        list($duplicate, $nbytes) = $duplicate_cache[$rbytes];
-    } else {
-        if ($rbytes[0] == "\x00") {
-            $nbytes = strlen($rbytes) - 1;
-        } else {
-            $nbytes = strlen($rbytes);
-        }
-
-        $mxrand = bcpow(256, $nbytes);
-
-        // If we get a number less than this, then it is in the
-        // duplicated range.
-        $duplicate = bcmod($mxrand, $stop);
-
-        if (count($duplicate_cache) > 10) {
-            $duplicate_cache = array();
-        }
-
-        $duplicate_cache[$rbytes] = array($duplicate, $nbytes);
-    }
-
-    do {
-        $bytes = "\x00" . _openid_get_bytes($nbytes);
-        $n = _openid_dh_binary_to_long($bytes);
-        // Keep looping if this value is in the low duplicated range.
-    } while (bccomp($n, $duplicate) < 0);
-
-    return bcmod($n, $stop);
-}
-
-function _openid_get_bytes($num_bytes) {
-    static $f = null;
-    $bytes = '';
-    if (!isset($f)) {
-        $f = @fopen(OPENID_RAND_SOURCE, "r");
-    }
-    if (!$f) {
-        // pseudorandom used
-        $bytes = '';
-        for ($i = 0; $i < $num_bytes; $i += 4) {
-            $bytes .= pack('L', mt_rand());
-        }
-        $bytes = substr($bytes, 0, $num_bytes);
-    } else {
-        $bytes = fread($f, $num_bytes);
-    }
-    return $bytes;
-}
-
-/**
- * Fix PHP's habit of replacing '.' by '_' in posted data.
- */
-function _openid_fix_post(&$post) {
-    //$extensions = module_invoke_all('openid', 'extension');
-    foreach ($post as $key => $value) {
-        if (strpos($key, 'openid_') === 0) {
-            $fixed_key = str_replace('openid_', 'openid.', $key);
-            $fixed_key = str_replace('openid.ns_', 'openid.ns.', $fixed_key);
-            $fixed_key = str_replace('openid.sreg_', 'openid.sreg.', $fixed_key);
-            //foreach ($extensions as $ext) {
-            //  $fixed_key = str_replace('openid.'.$ext.'_', 'openid.'.$ext.'.', $fixed_key);
-            //}
-            unset($post[$key]);
-            $post[$fixed_key] = $value;
-        }
-    }
-}
-
-/**
- * Provide bcpowmod support for PHP4.
- */
-if (!function_exists('bcpowmod')) {
-
-    function bcpowmod($base, $exp, $mod) {
-        $square = bcmod($base, $mod);
-        $result = 1;
-        while (bccomp($exp, 0) > 0) {
-            if (bcmod($exp, 2)) {
-                $result = bcmod(bcmul($result, $square), $mod);
-            }
-            $square = bcmod(bcmul($square, $square), $mod);
-            $exp = bcdiv($exp, 2);
-        }
-        return $result;
-    }
-
-}

+ 0 - 14
main/auth/openid/whatis.php

@@ -1,14 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * OpenID 
- * @package chamilo.auth.openid
- */
-/**
- * Code
- */
-require_once '../../inc/global.inc.php';
-Display::display_header('OpenID', NULL);
-echo Display::page_header(get_lang('OpenIDWhatIs'));
-echo get_lang('OpenIDDescription');
-Display::display_footer();

+ 0 - 85
main/auth/openid/xrds.lib.php

@@ -1,85 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-/**
- * Parsing library for OpenID
- * @package chamilo.auth.openid
- */
-/**
- * Code
- */
-// Global variables to track parsing state
-$xrds_open_elements = array();
-$xrds_services = array();
-$xrds_current_service = array();
-
-/**
- * Main entry point for parsing XRDS documents
- */
-function xrds_parse($xml) {
-  global $xrds_services;
-
-  $parser = xml_parser_create_ns();
-  xml_set_element_handler($parser, '_xrds_element_start', '_xrds_element_end');
-  xml_set_character_data_handler($parser, '_xrds_cdata');
-
-  xml_parse($parser, $xml);
-  xml_parser_free($parser);
-
-  return $xrds_services;
-}
-
-/**
- * Parser callback functions
- */
-function _xrds_element_start(&$parser, $name, $attribs) {
-  global $xrds_open_elements;
-
-  $xrds_open_elements[] = _xrds_strip_namespace($name);
-}
-
-function _xrds_element_end(&$parser, $name) {
-  global $xrds_open_elements, $xrds_services, $xrds_current_service;
-
-  $name = _xrds_strip_namespace($name);
-  if ($name == 'SERVICE') {
-    if (in_array(OPENID_NS_2_0 .'/signon', $xrds_current_service['types']) ||
-        in_array(OPENID_NS_2_0 .'/server', $xrds_current_service['types'])) {
-      $xrds_current_service['version'] = 2;
-    }
-    elseif (in_array(OPENID_NS_1_1, $xrds_current_service['types']) ||
-            in_array(OPENID_NS_1_0, $xrds_current_service['types'])) {
-      $xrds_current_service['version'] = 1;
-    }
-    if (!empty($xrds_current_service['version'])) {
-      $xrds_services[] = $xrds_current_service;
-    }
-    $xrds_current_service = array();
-  }
-  array_pop($xrds_open_elements);
-}
-
-function _xrds_cdata(&$parser, $data) {
-  global $xrds_open_elements, $xrds_services, $xrds_current_service;
-  $path = strtoupper(implode('/', $xrds_open_elements));
-  switch ($path) {
-    case 'XRDS/XRD/SERVICE/TYPE':
-      $xrds_current_service['types'][] = $data;
-      break;
-    case 'XRDS/XRD/SERVICE/URI':
-      $xrds_current_service['uri'] = $data;
-      break;
-    case 'XRDS/XRD/SERVICE/DELEGATE':
-      $xrds_current_service['delegate'] = $data;
-      break;
-  }
-}
-
-function _xrds_strip_namespace($name) {
-  // Strip namespacing.
-  $pos = strrpos($name, ':');
-  if ($pos !== FALSE) {
-    $name = substr($name, $pos + 1, strlen($name));
-  }
-
-  return $name;
-}

+ 0 - 10
main/auth/shibboleth/_readme.txt

@@ -1,10 +0,0 @@
-Shibboleth authentication module.
-
-@license see /license.txt
-@author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
-
-To use install Shibboleth on your web server and secure the application url
-with a web server security directive.
-
-Modify configuration to your federation's needs.
-

+ 0 - 156
main/auth/shibboleth/app/controller/shibboleth_controller.class.php

@@ -1,156 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-use \Redirect;
-use \Display;
-
-/**
- * Controller for the Shibboleth authentication system.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethController
-{
-
-    /**
-     *
-     * @return ShibbolethController
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    /**
-     * Log user in with Shibboleth authentication
-     */
-    function login()
-    {
-
-        if (Shibboleth::session()->is_logged_in())
-        {
-            Redirect::home();
-        }
-
-        $user = Shibboleth::store()->get_user();
-
-        if ($user->is_empty())
-        {
-            $message = get_lang('no_login');
-            Shibboleth::display()->error_page($message);
-        }
-
-        $is_new_user = !User::store()->shibboleth_id_exists($user->unique_id);
-
-        if ($is_new_user && empty($user->email) && Shibboleth::config()->is_email_mandatory)
-        {
-            $form = ShibbolethEmailForm::instance();
-            if ($email = $form->get_email())
-            {
-                $user->email = $email;
-            }
-            else
-            {
-                $content = $form->display();
-                Shibboleth::display()->page($content);
-            }
-        }
-
-        Shibboleth::save($user);
-        $chamilo_user = User::store()->get_by_shibboleth_id($user->unique_id);
-        Shibboleth::session()->login($chamilo_user->user_id);
-
-        if ($is_new_user && $user->status_request)
-        {
-            Shibboleth::redirect('/main/auth/shibboleth/app/view/request.php');
-        }
-        else
-        {
-            Shibboleth::redirect();
-        }
-    }
-
-    /**
-     * Log user in using the standard Chamilo way of logging in.
-     * Useful when the normal login screen is removed from the user interface
-     * - replaced by Shibboleth login - and user want to login using a standard
-     * account
-     */
-    public function admin_login()
-    {
-        $title = get_lang('internal_login');
-        if (Shibboleth::session()->is_logged_in())
-        {
-            $message = get_lang('already_logged_in');
-            Shibboleth::display()->message_page($message, $title);
-        }
-        /*$html = PageController::displayLoginForm();
-        Shibboleth::display()->page($html, $title);*/
-    }
-
-    /**
-     * Display the request new status page to administrator for new users.
-     */
-    public function request_status()
-    {
-        /*
-         * That may happen if a user visit that url again.
-         */
-        if (!Shibboleth::session()->is_logged_in())
-        {
-            Shibboleth::redirect();
-        }
-        $user = Shibboleth::session()->user();
-        if ($user['status'] == Shibboleth::TEACHER_STATUS)
-        {
-            //Maximum user right is reached.
-            Shibboleth::redirect();
-        }
-
-        $form = ShibbolethStatusRequestForm::instance();
-
-        if ($form->cancelled())
-        {
-            Shibboleth::redirect();
-        }
-
-        if ($reason = $form->get_reason())
-        {
-            $subject = get_lang('request_status');
-            $status = $form->get_status();
-            $status = Shibboleth::format_status($status);
-
-            $message = <<<EOT
-New status: $status
-
-Reason:
-$reason
-EOT;
-
-            $success = Shibboleth::email_admin($subject, $message);
-            if ($success)
-            {
-                $request_submitted = get_lang('request_submitted');
-                Shibboleth::display()->message_page($request_submitted);
-            }
-            else
-            {
-                $request_failed = get_lang('request_failed');
-                Shibboleth::display()->error_page($request_failed);
-            }
-        }
-
-        $title = get_lang('request_status');
-        Display :: display_header($title);
-        echo $form->display();
-        Display :: display_footer();
-    }
-
-}

+ 0 - 44
main/auth/shibboleth/app/model/admin.class.php

@@ -1,44 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-require_once dirname(__FILE__) . '/scaffold/admin.class.php';
-
-/**
- * A Chamilo admin. Model for the Admin table.
- * 
- * Should be moved to the core. It only exists because it is not available through
- * the API.
- * 
- * The _Admin objet is generated by the scaffolder. Admin inherits from it to allow
- * modifications without touching the generated file. Don't modify _Admin as
- * it may change in the future. Instead add modifications to this class.
- * 
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class Admin extends _Admin
-{
-    
-}
-
-/**
- * Store for Admin objects. Interact with the database. Allows to save and retrieve
- * admin objects. 
- * 
- * Should be moved to the core. It only exists because it is not available through
- * the API.
- *  
- * The _AdminStore objet is generated by the scaffolder. This class inherits from it to allow
- * modifications without touching the generated file. Don't modify the _ object as
- * it may change in the future. Instead add modifications to this class.
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class AdminStore extends _AdminStore
-{
-
-
-}

+ 0 - 134
main/auth/shibboleth/app/model/scaffold/admin.class.php

@@ -1,134 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * This file is autogenerated. Do not modifiy it.
- */
-
-/**
- *
- * Model for table admin 
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class _Admin
-{
-
-    /**
-    * Store for Admin objects. Interact with the database.
-    *
-    * @return AdminStore 
-    */
-    public static function store()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new AdminStore();
-        }
-        return $result;
-    }
-        
-    /**
-     *
-     * @return Admin 
-     */
-    public static function create($data = null)
-    {
-        return self::store()->create_object($data);
-    }   
-
-    public $user_id = null;     
- 
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function save()
-    {
-        return self::store()->save($this);
-    }
-    
-}
-
-/**
- * Store for Admin objects. Interact with the database.
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class _AdminStore extends Store
-{
-
-    /**
-     *
-     * @return AdminStore 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-    
-    public function __construct()
-    {
-        parent::__construct('admin', '\Shibboleth\Admin', 'user_id');
-    }
-    
-    /**
-     *
-     * @return Admin 
-     */
-    public function get($w)
-    {
-        $args = func_get_args();
-        $f = array('parent', 'get');
-        return call_user_func_array($f, $args);
-    }    
-    
-    /**
-     *
-     * @return Admin 
-     */
-    public function create_object($data)
-    {
-        return parent::create_object($data);
-    }    
-    
-    /**
-     *
-     * @return Admin 
-     */
-    public function get_by_user_id($value)
-    {
-        return $this->get(array('user_id' => $value));
-    }    
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function user_id_exists($value)
-    {
-        return $this->exist(array('user_id' => $value));
-    }     
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function delete_by_user_id($value)
-    {
-        return $this->delete(array('user_id' => $value));
-    }    
-    
-     
-}

+ 0 - 188
main/auth/shibboleth/app/model/scaffold/user.class.php

@@ -1,188 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * This file is autogenerated. Do not modifiy it.
- */
-
-/**
- *
- * Model for table user 
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class _User
-{
-
-    /**
-    * Store for User objects. Interact with the database.
-    *
-    * @return UserStore 
-    */
-    public static function store()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new UserStore();
-        }
-        return $result;
-    }
-        
-    /**
-     *
-     * @return User 
-     */
-    public static function create($data = null)
-    {
-        return self::store()->create_object($data);
-    }   
-
-    public $user_id = null;    
-    public $lastname = null;    
-    public $firstname = null;    
-    public $username = null;    
-    public $password = null;    
-    public $auth_source = null;    
-    public $shibb_unique_id = null;    
-    public $email = null;    
-    public $status = null;    
-    public $official_code = null;    
-    public $phone = null;    
-    public $picture_uri = null;    
-    public $creator_id = null;    
-    public $competences = null;    
-    public $diplomas = null;    
-    public $openarea = null;    
-    public $teach = null;    
-    public $productions = null;    
-    public $chatcall_user_id = null;    
-    public $chatcall_date = null;    
-    public $chatcall_text = null;    
-    public $language = null;    
-    public $registration_date = null;    
-    public $expiration_date = null;    
-    public $active = null;    
-    public $openid = null;    
-    public $theme = null;    
-    public $hr_dept_id = null;    
-    public $shibb_persistent_id = null;    
- 
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function save()
-    {
-        return self::store()->save($this);
-    }
-    
-}
-
-/**
- * Store for User objects. Interact with the database.
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class _UserStore extends Store
-{
-
-    /**
-     *
-     * @return UserStore 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-    
-    public function __construct()
-    {
-        parent::__construct('user', '\Shibboleth\User', 'user_id');
-    }
-    
-    /**
-     *
-     * @return User 
-     */
-    public function get($w)
-    {
-        $args = func_get_args();
-        $f = array('parent', 'get');
-        return call_user_func_array($f, $args);
-    }    
-    
-    /**
-     *
-     * @return User 
-     */
-    public function create_object($data)
-    {
-        return parent::create_object($data);
-    }    
-    
-    /**
-     *
-     * @return User 
-     */
-    public function get_by_user_id($value)
-    {
-        return $this->get(array('user_id' => $value));
-    }    
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function user_id_exists($value)
-    {
-        return $this->exist(array('user_id' => $value));
-    }     
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function delete_by_user_id($value)
-    {
-        return $this->delete(array('user_id' => $value));
-    }    
-    
-    /**
-     *
-     * @return User 
-     */
-    public function get_by_username($value)
-    {
-        return $this->get(array('username' => $value));
-    }    
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function username_exists($value)
-    {
-        return $this->exist(array('username' => $value));
-    }     
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function delete_by_username($value)
-    {
-        return $this->delete(array('username' => $value));
-    }    
-     
-}

+ 0 - 197
main/auth/shibboleth/app/model/shibboleth_store.class.php

@@ -1,197 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Returns Shibboleth user's values based on Shibboleth's configuration.
- * Shibboleth returns not only whether a user is authenticated but returns as
- * well several paralemeter fields.
- * 
- * If a user is not authenticated nothing is returned.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethStore
-{
-
-    /**
-     *
-     * @return ShibbolethData 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    /**
-     *
-     * @return ShibbolethConfig
-     */
-    public static function config()
-    {
-        return Shibboleth::config();
-    }
-
-    public function get_unique_id()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    /**
-     * If the user has more than one surname, it is possible depending of the user 
-     * home organization that they are all given to the resource.
-     * In the case of the University of Geneva, with two surnames, three different values
-     * for the surname are sent. They are:
-     * 1) "givenname1"
-     * 2) "givenname2"
-     * 3) "givenname1 givenname2"
-     *    meaning the string is as follow: "givenname1;givenname2;givenname1 givenname2"
-     *    
-     * In such a case, the correct surname is the one which is followed by a space.
-     * This function tests if such a situation is encountered, and returns the first given name.
-     *
-     * @author Nicolas Rod
-     */
-    public function get_firstname()
-    {
-        $result = $this->get(__FUNCTION__);
-
-        if (!is_array($result))
-        {
-            $result = ucfirst($result);
-            return $result;
-        }
-        foreach ($result as $name)
-        {
-            $parts = explode(' ', $name);
-
-            if (count($parts) > 1)
-            {
-                $result = reset($parts);
-                $result = ucfirst($result);
-                return $result;
-            }
-        }
-        $result = reset($result);
-        $result = ucfirst($result);
-        return $result;
-    }
-
-    public function get_lastname()
-    {
-        $result = $this->get(__FUNCTION__);
-        $result = ucfirst($result);
-        return $result;
-    }
-
-    public function get_email()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    public function get_language()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    public function get_gender()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    public function get_address()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    public function get_staff_category()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    public function get_home_organization_type()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    public function get_home_organization()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    public function get_affiliation()
-    {
-        return $this->get(__FUNCTION__);
-    }
-
-    /**
-     * @return ShibbolethUser 
-     */
-    public function get_user()
-    {
-        $result = new ShibbolethUser();
-        foreach ($result as $key => $val)
-        {
-            $f = array($this, "get_$key");
-            if (is_callable($f))
-            {
-                $result->{$key} = call_user_func($f);
-            }
-        }
-        return $result;
-    }
-
-    /**
-     * Returns the shibboleth value stored in $_SERVER if it exists or $default if it is not the case.
-     *
-     * @param string $name the generic name. I.e. one of the class const.
-     * @param string $default default value if it is not provided by Shibboleth
-     * @return string
-     */
-    public function get($name = '', $default = '')
-    {
-        $config = (array) Shibboleth::config();
-        if ($name)
-        {
-            $name = str_replace('get_', '', $name);
-            $shib_name = isset($config[$name]) ? $config[$name] : '';
-            if ($shib_name)
-            {
-                $result = isset($_SERVER[$shib_name]) ? $_SERVER[$shib_name] : $default;
-                $result = explode(';', $result);
-                if (empty($result))
-                {
-                    $result = $default;
-                }
-                else if (count($result) == 1)
-                {
-                    $result = reset($result);
-                }
-                else
-                {
-                    $result = $result;
-                }
-                return $result;
-            }
-        }
-
-        $result = array();
-        foreach ($config as $key => $val)
-        {
-            $f = array($this, "get_$key");
-            if (is_callable($f))
-            {
-                $result[$key] = call_user_func($f);
-            }
-        }
-
-        return $result;
-    }
-
-}

+ 0 - 33
main/auth/shibboleth/app/model/shibboleth_user.class.php

@@ -1,33 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Represent a Shibboleth user. Not to be missunderstand with a Chamilo user
- * since they don't have the same attributes.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethUser
-{       
-
-    public $unique_id = '';
-    public $firstname = '';
-    public $lastname = '';
-    public $email = '';
-    public $language = '';
-    public $gender = '';
-    public $address = '';
-    public $staff_category = '';
-    public $home_organization_type = '';
-    public $home_organization = '';
-    public $affiliation = '';
-    public $persistent_id = '';
-
-    public function is_empty()
-    {
-        return empty($this->unique_id);
-    }
-
-}

+ 0 - 92
main/auth/shibboleth/app/model/user.class.php

@@ -1,92 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-require_once dirname(__FILE__) . '/scaffold/user.class.php';
-
-/**
- * A Chamilo user. Model for the User table.
- * 
- * Should be moved to the core. It only exists because it is not available through
- * the API.
- * 
- * The _User objet is generated by the scaffolder. User inherits from it to allow
- * modifications without touching the generated file. Don't modify _User as
- * it may change in the future. Instead add modifications to this class.
- * 
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class User extends _User
-{
-    
-}
-
-/**
- * Store for User objects. Interact with the database. Allows to save and retrieve
- * user objects. 
- * 
- * Should be moved to the core. It only exists because it is not available through
- * the API.
- *  
- * The _UserStore objet is generated by the scaffolder. This class inherits from it to allow
- * modifications without touching the generated file. Don't modify the _ object as
- * it may change in the future. Instead add modifications to this class.
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class UserStore extends _UserStore
-{
-
-    function __construct()
-    {
-        parent::__construct();
-        ShibbolethUpgrade::update();
-    }
-
-    /**
-     *
-     * @param string $id
-     * @return User
-     */
-    public function get_by_shibboleth_id($id)
-    {
-        return $this->get(array('shibb_unique_id' => $id));
-    }
-    
-    public function shibboleth_id_exists($id)
-    {
-        return $this->exist(array('shibb_unique_id' => $id));
-    }
-
-    /**
-     *
-     * @param User $object 
-     */
-    protected function before_save($object)
-    {
-        $object->username = $object->username ? $object->username : $this->generate_username();
-        $object->password = $object->password ? $object->password : api_generate_password();
-        $object->language = $object->language ? $object->language : $this->default_language();
-    }
-    
-    function default_language()
-    {
-        return api_get_setting('platformLanguage');
-    }
-
-    function generate_username()
-    {
-        $result = uniqid('s', true);
-        $result = str_replace('.', '', $result);
-        while ($this->username_exists($result))
-        {
-            $result = uniqid('s', true);
-            $result = str_replace('.', '', $result);
-        }
-        return $result;
-    }
-
-}

+ 0 - 265
main/auth/shibboleth/app/shibboleth.class.php

@@ -1,265 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-use \Redirect;
-
-/**
- * Shibboleth main class. Provides access to various Shibboleth sub components and
- * provides the high level functionalities.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class Shibboleth
-{
-
-    const NAME = 'shibboleth';
-    const UNKNOWN_STATUS = -1;
-    const TEACHER_STATUS = 1;
-    const STUDENT_STATUS = 5;
-
-    static $config = null;
-
-    public static function format_status($status)
-    {
-        if ($status == Shibboleth::TEACHER_STATUS) {
-            return 'Teacher';
-        } else if ($status == Shibboleth::STUDENT_STATUS) {
-            return 'Student';
-        } else if ($status == Shibboleth::UNKNOWN_STATUS) {
-            return 'Unknown';
-        } else {
-            return '???';
-        }
-    }
-
-    /**
-     *
-     * @return ShibbolethConfig
-     */
-    public static function config()
-    {
-        self::$config = self::$config ? self::$config : new ShibbolethConfig();
-        return self::$config;
-    }
-
-    public static function set_config($config)
-    {
-        self::$config = $config;
-    }
-
-    /**
-     *
-     * @return ShibbolethSession
-     */
-    public static function session()
-    {
-        return ShibbolethSession::instance();
-    }
-
-    /**
-     *
-     * @return ShibbolethStore
-     */
-    public static function store()
-    {
-        return ShibbolethStore::instance();
-    }
-
-    /**
-     *
-     * @return ShibbolethDisplay
-     */
-    public static function display()
-    {
-        return ShibbolethDisplay::instance();
-    }
-
-    public static function sys_path()
-    {
-        $path = dirname(__FILE__) . '/../';
-        return $path;
-    }
-
-    public static function url($path = '')
-    {
-        $result = api_get_path('WEB_PATH');
-        $result .= '/main/auth/shibboleth/' . $path;
-        return $result;
-    }
-
-    public static function redirect($url = '')
-    {
-        if (empty($url)) {
-            $url = isset($_SESSION['shibb_direct_url']) ? $_SESSION['shibb_direct_url'] : '';
-            unset($_SESSION['shibb_direct_url']);
-
-            /*
-             * Tests if the user tried to login directly in a protected course before to come here
-             * (this variable could be set in the modified code of /chamilo/inc/lib/api.lib.php)
-             *
-             * Note:
-             *       this part was added to give the possibility to access Chamilo directly on a course URL from a link diplayed in a portal.
-             *       This is not a direct Shibboleth related functionnality, but this could be used in a shibbolethized
-             *       Dokeos installation, mainly if you have a SSO system in your network.
-             *       Please note that the file /claroline/inc/lib/api.lib.php must be adapted to your Shibboleth settings
-             *       If any interest or question, please contact Nicolas.Rod_at_adm.unige.ch
-             *
-             */
-        }
-        if ($url) {
-            //needed to log the user in his courses. Normally it is done by visiting /chamilo/index.php
-//            $include_path = api_get_path(INCLUDE_PATH);
-//            require("$include_path/local.inc.php");
-//
-//            if (strpos($url, '?') === false) {
-//                $url = "$url?";
-//            }
-//
-//            $rootWeb = api_get_path('WEB_PATH');
-//            $first_slash_pos = strpos($rootWeb, '/', 8);
-//            $rootWeb_wo_uri = substr($rootWeb, 0, $first_slash_pos);
-//            $url = $rootWeb_wo_uri . $course_url . '_stop';
-            Redirect::go($url);
-        }
-        Redirect::home();
-    }
-
-    /**
-     *
-     * @param ShibbolethUser $user
-     */
-    public static function save($shibb_user)
-    {
-        $shibb_user->status = self::infer_user_status($shibb_user);
-        $shibb_user->status_request = self::infer_status_request($shibb_user);
-        $shibb_user->shibb_unique_id = $shibb_user->unique_id;
-        $shibb_user->shibb_persistent_id = $shibb_user->persistent_id;
-
-        $user = User::store()->get_by_shibboleth_id($shibb_user->unique_id);
-        if (empty($user)) {
-            $shibb_user->auth_source == self::NAME;
-            return User::create($shibb_user)->save();
-        }
-
-        $shibb_user->status_request = false;
-        $fields = self::config()->update_fields;
-        foreach ($fields as $key => $updatable) {
-            if ($updatable) {
-                $user->{$key} = $shibb_user->{$key};
-            }
-        }
-        $user->auth_source == self::NAME;
-        $user->shibb_unique_id = $shibb_user->shibb_unique_id;
-        $user->shibb_persistent_id = $shibb_user->shibb_persistent_id;
-        $user->save();
-        return $result;
-    }
-
-    /**
-     * Infer the rights/status the user can have in Chamilo based on his affiliation attribute
-     *
-     * @param  ShibbolethUser $user
-     * @return The Chamilo user status, one of TEACHER, STUDENT or UNKNOWN
-     */
-    public static function infer_user_status($user)
-    {
-        $affiliations = $user->affiliation;
-        $affiliations = is_array($affiliations) ? $affiliations : array($affiliations);
-
-        $map = self::config()->affiliation_status;
-
-        $rights = array();
-        foreach ($affiliations as $affiliation) {
-            $affiliation = strtolower($affiliation);
-            if (isset($map[$affiliation])) {
-                $right = $map[$affiliation];
-                $rights[$right] = $right;
-            }
-        }
-
-        $teacher_status = isset($rights[self::TEACHER_STATUS]);
-        $student_status = isset($rights[self::STUDENT_STATUS]);
-
-        //if the user has got teacher rights, we doesn't check anything else
-        if ($teacher_status) {
-            return self::TEACHER_STATUS;
-        }
-
-        if ($student_status) {
-            return self::STUDENT_STATUS;
-        }
-
-        $result = self::config()->default_status;
-        $result = (int) $result;
-        $result = ($result == Shibboleth::TEACHER_STATUS || $result == Shibboleth::STUDENT_STATUS) ? $result : Shibboleth::UNKNOWN_STATUS;
-        return $result;
-    }
-
-    /**
-     * Return true if the user can ask for a greater status than student.
-     * This happens for staff members.
-     *
-     * @param ShibbolethUser $user
-     * @return boolean
-     */
-    public static function infer_status_request($user)
-    {
-        if ($user->status == self::TEACHER_STATUS) {
-            return false;
-        }
-        if ($user->status == self::UNKNOWN_STATUS) {
-            return true;
-        }
-
-        $config = Shibboleth::config();
-        $affiliations = $user->affiliation;
-        $affiliations = is_array($affiliations) ? $affiliations : array($affiliations);
-        foreach ($affiliations as $affiliation) {
-            $result = isset($config->affiliation_status_request[$affiliation]) ? $config->affiliation_status_request[$affiliation] : false;
-            if ($result) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Sends an email to the Chamilo and Shibboleth administrators in the name
-     * of the logged-in user.
-     *
-     */
-    public static function email_admin($subject, $message)
-    {
-        $user = Shibboleth::session()->user();
-        $firstname = $user['firstname'];
-        $lastname = $user['lastname'];
-        $email = $user['email'];
-        $status = $user['status'];
-        $status = self::format_status($status);
-
-        $signagure = <<<EOT
-
-_________________________
-$firstname $lastname
-$email
-$status
-EOT;
-
-        $message .= $signagure;
-
-        $header = "From: $email \n";
-
-        $shibb_admin_email = Shibboleth::config()->admnistrator_email;
-        if ($shibb_admin_email) {
-            $header .= "Cc: $shibb_admin_email";
-        }
-
-        $administrator_email = api_get_setting('emailAdministrator');
-        $result = mail($administrator_email, $subject, $message);
-        return (bool) $result;
-    }
-
-}

+ 0 - 20
main/auth/shibboleth/app/view/admin_login.php

@@ -1,20 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Administratrive login. Useful when the standard login is not available anymore
- * which is usually the case. 
- * 
- * This page allow administrators to log into the application using the standard
- * Chamilo method when Shibboleth is not available.
- * 
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-$dir = dirname(__FILE__);
-include_once("$dir/../../init.php");
-require_once api_get_path(LIBRARY_PATH).'userportal.lib.php';
-
-
-ShibbolethController::instance()->admin_login();

+ 0 - 20
main/auth/shibboleth/app/view/request.php

@@ -1,20 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Display the Request another status/additional rights. The request is emailed
- * to the shibboleth and platform administrators for processing.
- * 
- * Users such as staff that can be either student or teachers are presented with
- * this page upon first login. 
- * 
- * Other users - teachers, students - are directly logged-in.
- * 
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-$dir = dirname(__FILE__);
-include_once("$dir/../../init.php");
-
-ShibbolethController::instance()->request_status();

+ 0 - 60
main/auth/shibboleth/app/view/shibboleth_display.class.php

@@ -1,60 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-use \Display;
-
-/**
- * Utility display functions tailored for the Shibboleth pluging.
- * 
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethDisplay
-{
-
-    /**
-     *
-     * @return ShibbolethDisplay 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    public function error_page($message)
-    {
-        $page_title = get_lang('page_title');
-
-        Display :: display_header($page_title);
-        Display :: display_error_message($message);
-        Display :: display_footer();
-        die;
-    }
-    
-    public function message_page($message, $title = '')
-    {
-        $title = $title ? $title : get_lang('page_title');
-
-        Display :: display_header($title);
-        Display :: display_confirmation_message($message);
-        Display :: display_footer();
-        die;
-    }
-    
-    public function page($content, $title = '')
-    {
-        $title = $title ? $title : get_lang('page_title');
-
-        Display :: display_header($title);
-        echo $content;
-        Display :: display_footer();
-        die;
-    }
-
-}

+ 0 - 51
main/auth/shibboleth/app/view/shibboleth_email_form.class.php

@@ -1,51 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Enter email form. When the email is mandatory and the Shibboleth email user field
- * is empty the system display this form and ask the user to provide an email.
- * 
- * @todo: add email validation
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethEmailForm
-{
-        
-    /**
-     *
-     * @return ShibbolethEmailForm 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    function display()
-    {
-        
-        $email = get_lang('email');
-        $submit = get_lang('submit');
-        return <<<EOT
-        <form id="email_form" action="" method="post">
-            <label for="">$email</label>
-            <input type="text" value="" tabindex="1" name="email" id="email_email" class=""><br/>
-            <input type="submit" value="$submit" tabindex="2" name="submit" id="email_submit" class="submit">
-        </form>
-        
-EOT;
-    }
-    
-    function get_email()
-    {
-        return isset($_POST['email']) ? $_POST['email'] : '';
-    }
-
-}

+ 0 - 97
main/auth/shibboleth/app/view/shibboleth_status_request_form.class.php

@@ -1,97 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-use Display;
-
-/**
- * Status request form. Display a form allowing the user to request additional
- * rights/ another status. 
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethStatusRequestForm
-{
-
-    /**
-     *
-     * @return ShibbolethStatusRequestForm 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    function display()
-    {
-        if ($this->is_submitted() && $this->get_reason() == '')
-        {
-            $reason_is_mandatory = get_lang('reason_is_mandatory');
-            Display::display_error_message($reason_is_mandatory);
-        }
-
-        $status_request_message = get_lang('status_request_message');
-        $label_new_status = get_lang('new_status');
-        $label_reason = get_lang('reason');
-        $label_ok = get_lang('Ok');
-        $label_cancel = get_lang('Cancel');
-
-        $user = Shibboleth::session()->user();
-        $items = array();
-        if ($user['status'] == Shibboleth::UNKNOWN_STATUS)
-        {
-            $items[Shibboleth::STUDENT_STATUS] = get_lang('Student');
-        }
-        $items[Shibboleth::TEACHER_STATUS] = get_lang('Teacher');
-        $status_options = '';
-        foreach ($items as $key => $value)
-        {
-            $status_options.= "<option value=\"$key\">$value</option>";
-        }
-
-        return <<<EOT
-            <div id="askAccountText">
-                <p>$status_request_message</p>
-            </div>
-            <form method="post" action="request.php" id="status_request_form">
-    
-                <input type="hidden" name="formPosted" value="true"/>
-    
-            <label for="status">$label_new_status:</label>
-            <select name="status">
-                    $status_options
-            </select>
-            <label for="reason">$label_reason:</label>
-            <textarea name="reason" style="min-width:400px; min-height:100px;"></textarea>
-            <p><input name="submit" type="submit" value="$label_ok" style="margin-right:10px;"/><input name="cancel" type="submit" value="$label_cancel" /></p>
-            </form>
-EOT;
-    }
-
-    public function is_submitted()
-    {
-        return isset($_POST['submit']) ? $_POST['submit'] : false;
-    }
-
-    public function cancelled()
-    {
-        return isset($_POST['cancel']) ? $_POST['cancel'] : false;
-    }
-
-    function get_reason()
-    {
-        return isset($_POST['reason']) ? $_POST['reason'] : '';
-    }
-
-    function get_status()
-    {
-        return isset($_POST['status']) ? $_POST['status'] : '';
-    }
-
-}

+ 0 - 16
main/auth/shibboleth/config-dist.php

@@ -1,16 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Example of a config.php file. Not used. Configuration must appear in 
- * config.php.
- * 
- * By default set up the aai configuration.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-require_once dirname(__FILE__) . '/config/aai.class.php';
-
-Shibboleth::set_config(aai::config());

+ 0 - 69
main/auth/shibboleth/config/aai.class.php

@@ -1,69 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Shibboleth configuration for the AAI federation.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class aai
-{
-
-    /**
-     *
-     * @return ShibbolethConfig 
-     */
-    public static function config()
-    {
-        $result = new ShibbolethConfig();
-        $result->unique_id = 'Shib-SwissEP-UniqueID';
-        $result->firstname = 'Shib-InetOrgPerson-givenName';
-        $result->lastname = 'Shib-Person-surname';
-        $result->email = 'Shib-InetOrgPerson-mail';
-        $result->language = 'Shib-InetOrgPerson-preferredLanguage';
-        $result->gender = 'Shib-SwissEP-Gender';
-        $result->address = 'Shib-OrgPerson-postalAddress';
-        $result->staff_category = 'Shib-SwissEP-StaffCategory';
-        $result->home_organization_type = 'Shib-SwissEP-HomeOrganizationType';
-        $result->home_organization = 'Shib-SwissEP-HomeOrganization';
-        $result->affiliation = 'Shib-EP-Affiliation';
-        $result->persistent_id = 'persistent-id';
-
-        $result->default_status = Shibboleth::STUDENT_STATUS;
-
-        $result->affiliation_status = array(
-            'faculty' => Shibboleth::TEACHER_STATUS,
-            'member'  => Shibboleth::STUDENT_STATUS,
-            'staff'   => Shibboleth::STUDENT_STATUS,
-            'student' => Shibboleth::STUDENT_STATUS,
-        );
-
-        $result->update_fields = array(
-            'firstname'     => true,
-            'lastname'      => true,
-            'email'         => true,
-            'status'        => false,
-            'persistent_id' => true,
-        );
-        /*
-         * Persistent id should never change but it was introduced after unique id. 
-         * So we update persistent id on login for those users who are still missing it.
-         */
-
-        $result->is_email_mandatory = true;
-
-
-        $result->affiliation_status_request = array(
-            'faculty' => false,
-            'member'  => false,
-            'staff'   => true,
-            'student' => false,
-        );
-        $result->admnistrator_email = '';
-
-        return $result;
-    }
-
-}

+ 0 - 85
main/auth/shibboleth/db/shibboleth_upgrade.class.php

@@ -1,85 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-use \Database;
-
-/**
- * Migrate the datatabase. Adds needed fields by Shibboleth to the User table.
- * Upgrade is checked at each user login so there is no need to manually run
- * an upgrade.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethUpgrade
-{
-
-    /**
-     * Create additional fields required by the shibboleth plugin if those
-     * are missing.
-     */
-    public static function update()
-    {
-        static $done = false;
-        if ($done)
-        {
-            return false;
-        }
-        $done = true;
-        self::create_shibb_unique_id_field_if_missing();
-        self::create_shibb_persistent_id_field_if_missing();
-    }
-
-    /**
-     * Creates the 'shibb_unique_id' field in the table 'user' of the main Chamilo database if it doesn't exist yet
-     *
-     * @author Nicolas Rod
-     * @return void
-     */
-    public static function create_shibb_unique_id_field_if_missing()
-    {
-        $db_name = Database :: get_main_database();
-
-        $sql = "SELECT * FROM `$db_name`.`user` LIMIT 1";
-        $result = Database::query($sql);
-        $row = mysql_fetch_assoc($result);
-
-        $exists = array_key_exists('shibb_unique_id', $row);
-        if ($exists)
-        {
-            return false;
-        }
-
-        //create the 'shibb_unique_id' field
-        $sql = "ALTER TABLE `$db_name`.`user` ADD `shibb_unique_id` VARCHAR( 60 ) AFTER `auth_source`";
-        $result_alter = Database::query($sql);
-
-        /*
-         *  Index cannot be a UNIQUE index as it may exist users which don't log in through Shibboleth
-         *  and therefore don't have any value for 'shibb_unique_id'
-         */
-        $sql = "ALTER TABLE `$db_name`.`user` ADD INDEX ( `shibb_unique_id` )";
-        $result_alter = Database::query($sql);
-    }
-
-    public static function create_shibb_persistent_id_field_if_missing()
-    {        
-        $db_name = Database :: get_main_database();
-
-        $sql = "SELECT * FROM $db_name.user LIMIT 1";
-        $result = Database::query($sql);
-        $row = mysql_fetch_assoc($result);
-        $exists = array_key_exists('shibb_persistent_id', $row);
-
-        if ($exists)
-        {
-            return false;
-        }
-
-        $sql = "ALTER table $db_name.user ADD COLUMN shibb_persistent_id varchar(255) NULL DEFAULT NULL;";
-        $result = api_sql_query($sql);
-        return (bool) $result;
-    }
-
-}

+ 0 - 8
main/auth/shibboleth/index.php

@@ -1,8 +0,0 @@
-<?php
-/**
- * Display nothing. This ensure Apache doesn't display the list of files and folders
- * when it is not propertly configured.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */

+ 0 - 25
main/auth/shibboleth/init.php

@@ -1,25 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Initialize the Shibboleth authentication system. All scripts that can be directly
- * called must include this file
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-
-$__dir = dirname(__FILE__) . '/';
-$no_redirection = true;  //no redirection in global.
-include_once($__dir . '/../../inc/global.inc.php');
-
-require_once $__dir . 'config.php';
-
-if ($app['debug'])
-{
-    include_once $__dir . '/test/shibboleth_test_helper.class.php';
-    include_once $__dir . '/test/shibboleth_test.class.php';
-}
-
-$language_files[] = 'shibboleth';

+ 0 - 14
main/auth/shibboleth/lib/model.class.php

@@ -1,14 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Description of model
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class Model
-{
-    
-}

+ 0 - 64
main/auth/shibboleth/lib/scaffolder/scaffolder.class.php

@@ -1,64 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Scaffolder. Genereate code templates from the database layout.
- * See /template/ for the code being generated
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class Scaffolder
-{
-
-    /**
-     *
-     * @staticvar boolean $result
-     * @return Scaffolder 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    public function scaffold($table_name, $class_name = '', $prefix = '_')
-    {
-        $db_name = Database :: get_main_database();
-        $sql = "SELECT * FROM `$db_name`.`$table_name` LIMIT 1";
-
-        $fields = array();
-        $unique_fields = array();
-        $rs = Database::query($sql, null, __FILE__);
-        while ($field = mysql_fetch_field($rs))
-        {
-            $fields[] = $field;
-            if ($field->primary_key)
-            {
-                /**
-                 * Could move that to an array to support multiple keys
-                 */
-                $id_name = $field->name;
-            }
-            if ($field->unique_key | $field->primary_key)
-            {
-                $keys[] = $field->name;
-            }
-        }
-        $name = $table_name;
-        $class_name = ucfirst($table_name);
-
-
-
-        ob_start();
-        include dirname(__FILE__) . '/template/model.php';
-        $result = ob_get_clean();
-        return $result;
-    }
-
-}

+ 0 - 146
main/auth/shibboleth/lib/scaffolder/template/default.php

@@ -1,146 +0,0 @@
-<?php
-
-/**
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-
-echo '<?php';
-?>
-
-namespace Shibboleth;
-
-/**
- * This file is autogenerated. Do not modifiy it.
- */
-
-/**
- *
- * Model for table <?php echo $table_name ?> 
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class <?php echo $prefix . $class_name ?>
-
-{
-
-    /**
-    * Store for <?php echo $class_name ?> objects. Interact with the database.
-    *
-    * @return <?php echo $class_name ?>Store 
-    */
-    public static function store()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new <?php echo $class_name ?>Store();
-        }
-        return $result;
-    }
-        
-    /**
-     *
-     * @return <?php echo $class_name ?> 
-     */
-    public static function create($data = null)
-    {
-        return self::store()->create_object($data);
-    }   
-
-<?php foreach($fields as $field){?>
-    public $<?php echo $field->name; ?> = <?php echo $field->def ? $field->def : 'null'; ?>;    
-<?php }?> 
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function save()
-    {
-        return self::store()->save($this);
-    }
-    
-}
-
-/**
- * Store for <?php echo $class_name ?> objects. Interact with the database.
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class <?php echo $prefix . $class_name ?>Store extends Store
-{
-
-    /**
-     *
-     * @return <?php echo $class_name ?>Store 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-    
-    public function __construct()
-    {
-        parent::__construct('<?php echo $table_name;?>', '<?php echo $class_name;?>', '<?php echo $id_name;?>');
-    }
-    
-    /**
-     *
-     * @return <?php echo $class_name ?> 
-     */
-    public function get($w)
-    {
-        $args = func_get_args();
-        $f = array('parent', 'get');
-        return call_user_func_array($f, $args);
-    }    
-    
-    /**
-     *
-     * @return <?php echo $class_name ?> 
-     */
-    public function create_object($data)
-    {
-        return parent::create_object($data);
-    }    
-<?php foreach($keys as $key){?>
-    
-    /**
-     *
-     * @return <?php echo $class_name ?> 
-     */
-    public function get_by_<?php echo $key ?>($value)
-    {
-        return $this->get(array('<?php echo $key; ?>' => $value));
-    }    
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function <?php echo $key ?>_exists($value)
-    {
-        return $this->exist(array('<?php echo $key; ?>' => $value));
-    }     
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function delete_by_<?php echo $key ?>($value)
-    {
-        return $this->delete(array('<?php echo $key; ?>' => $value));
-    }    
-<?php }?>     
-}

+ 0 - 146
main/auth/shibboleth/lib/scaffolder/template/model.php

@@ -1,146 +0,0 @@
-<?php
-
-/**
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-
-echo '<?php';
-?>
-
-namespace Shibboleth;
-
-/**
- * This file is autogenerated. Do not modifiy it.
- */
-
-/**
- *
- * Model for table <?php echo $table_name ?> 
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class <?php echo $prefix . $class_name ?>
-
-{
-
-    /**
-    * Store for <?php echo $class_name ?> objects. Interact with the database.
-    *
-    * @return <?php echo $class_name ?>Store 
-    */
-    public static function store()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new <?php echo $class_name ?>Store();
-        }
-        return $result;
-    }
-        
-    /**
-     *
-     * @return <?php echo $class_name ?> 
-     */
-    public static function create($data = null)
-    {
-        return self::store()->create_object($data);
-    }   
-
-<?php foreach($fields as $field){?>
-    public $<?php echo $field->name; ?> = <?php echo $field->def ? $field->def : 'null'; ?>;    
-<?php }?> 
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function save()
-    {
-        return self::store()->save($this);
-    }
-    
-}
-
-/**
- * Store for <?php echo $class_name ?> objects. Interact with the database.
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class <?php echo $prefix . $class_name ?>Store extends Store
-{
-
-    /**
-     *
-     * @return <?php echo $class_name ?>Store 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-    
-    public function __construct()
-    {
-        parent::__construct('<?php echo $table_name;?>', '<?php echo $class_name;?>', '<?php echo $id_name;?>');
-    }
-    
-    /**
-     *
-     * @return <?php echo $class_name ?> 
-     */
-    public function get($w)
-    {
-        $args = func_get_args();
-        $f = array('parent', 'get');
-        return call_user_func_array($f, $args);
-    }    
-    
-    /**
-     *
-     * @return <?php echo $class_name ?> 
-     */
-    public function create_object($data)
-    {
-        return parent::create_object($data);
-    }    
-<?php foreach($keys as $key){?>
-    
-    /**
-     *
-     * @return <?php echo $class_name ?> 
-     */
-    public function get_by_<?php echo $key ?>($value)
-    {
-        return $this->get(array('<?php echo $key; ?>' => $value));
-    }    
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function <?php echo $key ?>_exists($value)
-    {
-        return $this->exist(array('<?php echo $key; ?>' => $value));
-    }     
-    
-    /**
-     *
-     * @return bool 
-     */
-    public function delete_by_<?php echo $key ?>($value)
-    {
-        return $this->delete(array('<?php echo $key; ?>' => $value));
-    }    
-<?php }?>     
-}

+ 0 - 39
main/auth/shibboleth/lib/scaffolder/template/public.php

@@ -1,39 +0,0 @@
-<?php
-
-/**
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-
-echo '<?php';
-?>
-
-namespace Shibboleth;
-
-/**
- *
- * Model for table <?php echo $table_name ?> 
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class <?php echo $class_name ?>
-
-{
-
-    
-}
-
-/**
- * Store for <?php echo $class_name ?> objects. Interact with the database.
- *
- * @copyright (c) 2012 University of Geneva
- * @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
- * @author Laurent Opprecht <laurent@opprecht.info>
- */
-class <?php echo $class_name ?>Store extends Store
-{
-
-}

+ 0 - 61
main/auth/shibboleth/lib/shibboleth_config.class.php

@@ -1,61 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Shibboleth configuration. All configuration for the Shibboleth authentication
- * plugin: field names mapping, etc.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethConfig
-{    
-    public $unique_id = '';
-    public $firstname = '';
-    public $lastname = '';
-    public $email = '';
-    public $language = '';
-    public $gender = '';
-    public $address = '';
-    public $staff_category = '';
-    public $home_organization_type = '';
-    public $home_organization = '';
-    public $affiliation = '';
-    public $persistent_id = '';
-    
-    public $default_status = Shibboleth::UNKNOWN_STATUS;
-    
-    /**
-     * Mapping of affiliation => right
-     * @var array
-     */
-    public $affiliation_status = array();
-    
-    /**
-     * Mapping of affiliation => bool. Display the request status form.
-     * @var array
-     */
-    public $affiliation_status_request = array();
-    
-    /**
-     * List of fields to update when the user already exists field_name => boolean.
-     * @var array
-     */
-    public $update_fields = array();
-    
-    /*
-     * True if email is mandatory. False otherwise.
-     */
-    public $is_email_mandatory = true;
-    
-    /**
-     * The email of the shibboleth administrator.
-     * 
-     * @var string
-     */
-    public $admnistrator_email = '';
-    
-    
-    
-}

+ 0 - 101
main/auth/shibboleth/lib/shibboleth_session.class.php

@@ -1,101 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-use \ChamiloSession as Session;
-use \Chamilo;
-use \Database;
-use \Redirect;
-
-
-/**
- * A Chamilo user session. Used as there is no session object so far provided by the core API.
- * Should be moved to the core library.Prefixed by Shibboleth to avoid name clashes.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethSession
-{
-
-    /**
-     * @return ShibbolethSession
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result)) {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    function is_logged_in()
-    {
-        return isset($_SESSION['_user']['user_id']);
-    }
-
-    function user()
-    {
-        return $_SESSION['_user'];
-    }
-
-    function logout()
-    {
-        $_SESSION['_user'] = array();
-        Online::logout(null, false);
-    }
-
-    /**
-     * Create a Shibboleth session for the user ID
-     *
-     * @param  string $uid - The user ID
-     * @return $_user (array) - The user infos array created when the user logs in
-     */
-    function login($uid)
-    {
-        /* This must be set for local.inc.php to register correctly the global variables in session
-         * This is BAD. Logic should be migrated into a function and stop relying on global variables.
-         */
-        global $_uid, $is_allowedCreateCourse, $_real_cid, $_courseUser;
-        global $is_courseMember, $is_courseTutor, $is_allowed_in_course, $_gid;
-        $_uid = $uid;
-
-        //is_allowedCreateCourse
-        $user = User::store()->get_by_user_id($uid);
-        if (empty($user)) {
-            return;
-        }
-
-        $this->logout();
-
-        Chamilo::session()->start();
-        Session::write('_uid', $_uid);
-
-        global $_user;
-        $_user = (array) $user;
-
-        $_SESSION['_user'] = $_user;
-        $_SESSION['_user']['user_id'] = $_uid;
-        $_SESSION['noredirection'] = true;
-
-        //must be called before 'init_local.inc.php'
-        event_login();
-
-        //used in 'init_local.inc.php' this is BAD but and should be changed
-        $loginFailed = false;
-        $uidReset = true;
-
-        $gidReset = true;
-        $cidReset = false; //FALSE !!
-
-        $mainDbName = Database :: get_main_database();
-        $includePath = api_get_path(INCLUDE_PATH);
-
-        $no_redirection = true;
-        require("$includePath/local.inc.php");
-
-        return $_user;
-    }
-
-}

+ 0 - 354
main/auth/shibboleth/lib/store.class.php

@@ -1,354 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-use \Database;
-
-/**
- * A database store. Used interact with the database - save objects, run queries.
- * 
- * One store = one table.
- * 
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class Store
-{
-
-    /**
-     *
-     * @return Store 
-     */
-    public static function create($table_name, $class_name = '', $id_name = 'id', $db_name = '')
-    {
-        return new self($table_name, $class_name, $id_name, $db_name);
-    }
-
-    protected $db_name = '';
-    protected $table_name = '';
-    protected $id_name = '';
-    protected $class_name = '';
-
-    function __construct($table_name, $class_name = '', $id_name = 'id', $db_name = '')
-    {
-        $this->db_name = $db_name ? $db_name : Database::get_main_database();
-        $this->table_name = $table_name;
-        $this->class_name = $class_name;
-        $this->id_name = $id_name;
-    }
-
-    function get_db_name($object = '')
-    {
-        if ($this->db_name)
-        {
-            return $this->db_name;
-        }
-        if ($object)
-        {
-            $result = isset($object->{db_name}) ? $object->{db_name} : '';
-            $result = $result ? $result : Database :: get_main_database();
-            return $result;
-        }
-
-        return Database::get_main_database();
-    }
-
-    function get($w)
-    {
-        $args = func_get_args();
-        $f = array($this, 'get_where');
-        $db_name = $this->get_db_name();
-        $where = call_user_func_array($f, $args);
-        $sql = "SELECT * 
-                FROM `{$db_name}`.`{$this->table_name}`
-                WHERE $where";
-
-        $items = $this->query($sql);
-        return (count($items) == 1) ? reset($items) : null;
-    }
-
-    function select($w)
-    {
-        $args = func_get_args();
-        $f = array($this, 'get_where');
-        $db_name = $this->get_db_name();
-        $where = call_user_func_array($f, $args);
-        $sql = "SELECT * 
-                FROM `{$db_name}`.`{$this->table_name}`
-                WHERE $where";
-
-        $result = $this->query($sql);
-        return $result;
-    }
-
-    function exist($w)
-    {
-        $args = func_get_args();
-        $f = array($this, 'get');
-        $object = call_user_func_array($f, $args);
-        return !empty($object);
-    }
-
-    function is_new($object)
-    {
-        $id_name = $this->id_name;
-        $id = isset($object->{$id_name}) ? $object->{$id_name} : false;
-        return empty($id);
-    }
-
-    function save($object)
-    {
-        if (empty($object))
-        {
-            return false;
-        }
-        $object = is_array($object) ? $this->create_object($object) : $object;
-        $this->before_save($object);
-        if ($this->is_new($object))
-        {
-            $result = $this->insert($object);
-        }
-        else
-        {
-            $result = $this->update($object);
-        }
-        return $result;
-    }
-
-    function delete($object)
-    {
-        $args = func_get_args();
-        $f = array($this, 'get_where');
-        $db_name = $this->get_db_name();
-        $where = call_user_func_array($f, $args);
-        $sql = "DELETE  
-                FROM `{$db_name
-                }
-
-`.`{$this->table_name
-                }
-
-`
-                WHERE $where";
-
-        $result = $this->query($sql);
-        return $result;
-    }
-
-    /**
-     *
-     * @param array|object $data
-     * @return object
-     */
-    public function create_object($data = array())
-    {
-        $data = $data ? $data : array();
-        $data = (object) $data;
-        $class = $this->class_name;
-        if (empty($class))
-        {
-            return clone $data;
-        }
-        $result = new $class();
-
-        foreach ($result as $key => $value)
-        {
-            $result->{$key} = property_exists($data, $key) ? $data->{$key} : null;
-        }
-        return $result;
-    }
-
-    public function fields($object)
-    {
-        static $result = array();
-        if (!empty($result))
-        {
-            return $result;
-        }
-
-        $db_name = $this->get_db_name($object);
-        $sql = "SELECT * 
-                FROM `{$db_name}`.`{$this->table_name}`
-                LIMIT 1";
-        $rs = Database::query($sql, null, __FILE__);
-        while ($field = mysql_fetch_field($rs))
-        {
-            $result[] = $field;
-        }
-        return $result;
-    }
-
-    protected function before_save($object)
-    {
-//hook
-    }
-
-    protected function update($object)
-    {
-        $id = isset($object->{$this->id_name}) ? $object->{$this->id_name} : false;
-        if (empty($id))
-        {
-            return false;
-        }
-        $items = array();
-        $fields = $this->fields($object);
-        foreach ($fields as $field)
-        {
-            $name = $field->name;
-            if ($name != $this->id_name)
-            {
-                if (property_exists($object, $name))
-                {
-                    $value = $object->{$name};
-                    $value = $this->format_value($value);
-                    $items[] = "$name=$value";
-                }
-            }
-        }
-
-        $db_name = $this->get_db_name($object);
-        $sql = "UPDATE `{$db_name}`.`{$this->table_name}` SET ";
-        $sql .= join(', ', $items);
-        $sql .= " WHERE {$this->id_name}=$id";
-
-        $result = $this->execute($sql);
-        if ($result)
-        {
-            $object->{db_name} = $db_name;
-        }
-        return (bool) $result;
-    }
-
-    protected function insert($object)
-    {
-        $id = isset($object->{$this->id_name}) ? $object->{$this->id_name} : false;
-        if (empty($object))
-        {
-            return false;
-        }
-        $values = array();
-        $keys = array();
-        $fields = $this->fields($object);
-        foreach ($fields as $field)
-        {
-            $name = $field->name;
-            if ($name != $this->id_name)
-            {
-                if (property_exists($object, $name))
-                {
-                    $value = $object->{$name};
-                    $value = is_null($value) ? 'DEFAULT' : $this->format_value($value);
-                    $values[] = $value;
-                    $keys[] = $name;
-                }
-            }
-        }
-
-        $db_name = $this->get_db_name($object);
-        $sql = "INSERT INTO `{$db_name}`.`{$this->table_name}` ";
-        $sql .= ' (' . join(', ', $keys) . ') ';
-        $sql .= 'VALUES';
-        $sql .= ' (' . join(', ', $values) . ') ';
-
-        $result = $this->execute($sql);
-        if ($result)
-        {
-            $id = mysql_insert_id();
-            $object->{$this->id_name} = $id;
-            $object->{db_name} = $db_name;
-            return $id;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    protected function get_where($_)
-    {
-        $args = func_get_args();
-        if (count($args) == 1)
-        {
-            $arg = reset($args);
-            if (is_numeric($arg))
-            {
-                $id = (int) $arg;
-                if (empty($id))
-                {
-                    return '';
-                }
-                $args = array($this->pk_name, $arg);
-            }
-            else if (is_string($arg))
-            {
-                return $arg;
-            }
-            else if (is_array($arg))
-            {
-                $args = $arg;
-            }
-            else
-            {
-                return $arg;
-            }
-        }
-        $items = array();
-        foreach ($args as $key => $val)
-        {
-            $items[] = $key . ' = ' . $this->format_value($val);
-        }
-        return implode(' AND ', $items);
-    }
-
-    protected function format_value($value)
-    {
-        if (is_null($value))
-        {
-            return 'NULL';
-        }
-        if (is_bool($var))
-        {
-            return $value ? '1' : '0';
-        }
-        else if (is_numeric($value))
-        {
-            return empty($value) ? '0' : $value;
-        }
-        else if (is_string($value))
-        {
-            $value = mysql_escape_string($value);
-            return "'$value'";
-        }
-        else
-        {
-            return $value;
-        }
-    }
-
-    /**
-     *
-     * @param string $sql
-     * @return array 
-     */
-    protected function query($sql)
-    {
-        $resource = Database::query($sql, null, __FILE__);
-        if ($resource == false)
-        {
-            return array();
-        }
-
-        $result = array();
-        while ($data = mysql_fetch_assoc($resource))
-        {
-            $result[] = $this->create_object($data);
-        }
-        return $result;
-    }
-
-    protected function execute($sql)
-    {
-        return Database::query($sql, null, __FILE__);
-    }
-
-}

+ 0 - 35
main/auth/shibboleth/login.php

@@ -1,35 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Shibboleth login page. 
- * 
- * Actual authentication is provided by the Shibboleth Apache security module. 
- * Shibboleth must be properly installed and configured. Then this page must
- * be secured through an Apache security directive.
- * 
- * When Shibboleth is properly set up this page will only be available for 
- * authenticated users. The plugin ensure those people are created and logged in.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-include_once(dirname(__FILE__) . '/init.php');
-
-/*
-  ==============================================================================
-  TEST SECTION
-  ==============================================================================
- * 
- * @todo: Only for testing. Comment that out for production
- * 
- */
-//Shibboleth::session()->logout();
-//ShibbolethTest::helper()->setup_new_student_no_email();
-//ShibbolethTest::helper()->setup_staff();
-//ShibbolethTest::helper()->setup_new_teacher();
-//ShibbolethTest::helper()->setup_new_student();
-//ShibbolethTest::helper()->setup_new_minimal_data();
-
-ShibbolethController::instance()->login();

+ 0 - 36
main/auth/shibboleth/script/scaffold.php

@@ -1,36 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Scaffold script. Generates the required database models for the Shibboleth
- * plugin. 
- * 
- * Will only run when the server is a test server.
- * 
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-$dir = dirname(__FILE__);
-include_once($dir . '/../init.php');
-include_once($dir . '/../app/lib/scaffolder/scaffolder.class.php');
-
-if (!ShibbolethTest::is_enabled())
-{
-    echo 'This is not a test server';
-    die;
-}
-
-if (!Shibboleth::session()->is_logged_in())
-{
-    echo 'Not authorized';
-    die;
-}
-
-$name = 'user';
-$result = Scaffolder::instance()->scaffold($name);
-
-file_put_contents("$dir/output/$name.class.php", $result);
-
-header('content-type: text/plain');
-echo $result;

+ 0 - 217
main/auth/shibboleth/test/shibboleth_test.class.php

@@ -1,217 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Various Unit Tests. Note that those tests create users in the database but
- * don't delete them.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethTest
-{
-
-    static function is_enabled()
-    {
-        return api_get_setting('server_type') == 'test';
-    }
-
-    /**
-     * @return ShibbolethTestHelper 
-     */
-    static function helper()
-    {
-        return ShibbolethTestHelper::instance();
-    }
-
-    static function init()
-    {
-        if (!self::is_enabled())
-        {
-            die;
-        }
-    }
-
-    static function test_new_teacher()
-    {
-        self::init();
-
-        self::helper()->setup_new_teacher();
-        $shib_user = Shibboleth::store()->get_user();
-        self::assert(!User::store()->shibboleth_id_exists($shib_user->unique_id));
-
-        Shibboleth::save($shib_user);
-
-        $user = User::store()->get_by_shibboleth_id($shib_user->unique_id);
-        self::assert($user->email == $shib_user->email);
-        self::assert($user->firstname == $shib_user->firstname);
-        self::assert($user->lastname == $shib_user->lastname);
-        self::assert($user->persistent_id == $shib_user->persistent_id);
-        self::assert($user->status == Shibboleth::TEACHER_STATUS);
-        self::assert(!empty($user->password));
-        self::assert(!empty($user->username));
-    }
-
-    static function test_new_student()
-    {
-        self::init();
-
-        self::helper()->setup_new_student();
-
-        $shib_user = Shibboleth::store()->get_user();
-        self::assert(!User::store()->shibboleth_id_exists($shib_user->unique_id));
-
-        Shibboleth::save($shib_user);
-
-        $user = User::store()->get_by_shibboleth_id($shib_user->unique_id);
-        self::assert($user->email == $shib_user->email);
-        self::assert($user->firstname == $shib_user->firstname);
-        self::assert($user->lastname == $shib_user->lastname);
-        self::assert($user->persistent_id == $shib_user->persistent_id);
-        self::assert($user->status == Shibboleth::STUDENT_STATUS);
-        self::assert(!empty($user->password));
-        self::assert(!empty($user->username));
-    }
-
-    static function test_new_staff()
-    {
-        self::init();
-
-        self::helper()->setup_new_staff();
-
-        $shib_user = Shibboleth::store()->get_user();
-        self::assert(!User::store()->shibboleth_id_exists($shib_user->unique_id));
-
-        Shibboleth::save($shib_user);
-
-        $user = User::store()->get_by_shibboleth_id($shib_user->unique_id);
-        self::assert($user->email == $shib_user->email);
-        self::assert($user->firstname == $shib_user->firstname);
-        self::assert($user->lastname == $shib_user->lastname);
-        self::assert($user->persistent_id == $shib_user->persistent_id);
-        self::assert($user->status == Shibboleth::STUDENT_STATUS);
-        self::assert(!empty($user->password));
-        self::assert(!empty($user->username));
-    }
-
-    static function test_new_infer_status_request()
-    {
-        self::init();
-
-        self::helper()->setup_new_staff();
-        $shib_user = Shibboleth::store()->get_user();
-        Shibboleth::save($shib_user);
-        self::assert($shib_user->status_request);
-
-        self::helper()->setup_new_teacher();
-        $shib_user = Shibboleth::store()->get_user();
-        Shibboleth::save($shib_user);
-
-        self::assert(!$shib_user->status_request);
-
-        self::helper()->setup_new_student();
-        $shib_user = Shibboleth::store()->get_user();
-        Shibboleth::save($shib_user);
-
-        self::assert(!$shib_user->status_request);
-    }
-
-    static function test_update_teacher()
-    {
-        self::init();
-
-        $fields = Shibboleth::config()->update_fields;
-        self::assert($fields['email']);
-        self::assert($fields['persistent_id']);
-        self::assert($fields['firstname']);
-        self::assert($fields['lastname']);
-        self::assert(!$fields['status']);
-
-        self::helper()->setup_teacher();
-        $shib_user = Shibboleth::store()->get_user();
-        Shibboleth::save($shib_user);
-
-        $new_shib_user = clone($shib_user);
-
-        $new_shib_user->firstname = 'frs';
-        $new_shib_user->lastname = 'ls';
-        $new_shib_user->email = 'em';
-        $new_shib_user->status = 10;
-        $new_shib_user->persistent_id = 'per';
-
-        Shibboleth::save($new_shib_user);
-        $user = User::store()->get_by_shibboleth_id($shib_user->unique_id);
-
-        self::assert($user->email == $new_shib_user->email);
-        self::assert($value = ($user->shibb_persistent_id == $new_shib_user->persistent_id));
-
-        self::assert($user->firstname == $new_shib_user->firstname);
-        self::assert($user->lastname == $new_shib_user->lastname);
-        self::assert($user->status == $shib_user->status);
-        self::assert(!empty($user->password));
-        self::assert(!empty($user->username));
-    }
-
-    static function test_new_student_multiple_givenname()
-    {
-        self::init();
-
-        self::helper()->setup_new_student_multiple_givenname();
-
-        $shib_user = Shibboleth::store()->get_user();
-        self::assert(!User::store()->shibboleth_id_exists($shib_user->unique_id));
-
-        Shibboleth::save($shib_user);
-
-        $user = User::store()->get_by_shibboleth_id($shib_user->unique_id);
-
-        self::assert($user->email == $shib_user->email);
-        self::assert($user->firstname == 'John');
-        self::assert($user->lastname == $shib_user->lastname);
-        self::assert($user->persistent_id == $shib_user->persistent_id);
-        self::assert($user->status == Shibboleth::STUDENT_STATUS);
-        self::assert(!empty($user->password));
-        self::assert(!empty($user->username));
-    }
-
-    static function test_new_no_affiliation_default()
-    {
-        self::init();
-
-        self::helper()->setup_new_no_affiliation();
-        $shib_user = Shibboleth::store()->get_user();
-        self::assert($config = Shibboleth::config()->default_status == Shibboleth::STUDENT_STATUS);
-        self::assert(!User::store()->shibboleth_id_exists($shib_user->unique_id));
-        self::assert($shib_user->affiliation == '');
-
-        Shibboleth::save($shib_user);
-
-        $user = User::store()->get_by_shibboleth_id($shib_user->unique_id);
-
-        self::assert($user->email == $shib_user->email);
-        self::assert($user->firstname == 'John');
-        self::assert($user->lastname == $shib_user->lastname);
-        self::assert($user->persistent_id == $shib_user->persistent_id);
-        self::assert($user->status == Shibboleth::STUDENT_STATUS);
-        self::assert(!empty($user->password));
-        self::assert(!empty($user->username));
-    }
-
-    static function assert($assertion, $message = '')
-    {
-        if (!$assertion)
-        {
-            $message = "Assert failed $message <br/>";
-            echo $message;
-            var_dump(debug_backtrace());
-            die;
-        }
-        else
-        {
-            $message = "Assert successful $message <br/>";
-            echo $message;
-        }
-    }
-
-}

+ 0 - 133
main/auth/shibboleth/test/shibboleth_test_helper.class.php

@@ -1,133 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Helper functions for the tests. Set up various dummy user types: teacher, student, etc.
- *
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-class ShibbolethTestHelper
-{
-
-    /**
-     *
-     * @return ShibbolethTestHelper 
-     */
-    public static function instance()
-    {
-        static $result = false;
-        if (empty($result))
-        {
-            $result = new self();
-        }
-        return $result;
-    }
-
-    public function setup_teacher()
-    {
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_1';
-        $_SERVER['Shib-EP-Affiliation'] = 'member;staff;faculty';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John';
-        $_SERVER['Shib-Person-surname'] = 'Doe';
-        $_SERVER['Shib-InetOrgPerson-mail'] = 'john.doe@localhost.org';
-        $_SERVER['persistent-id'] = 'idp!viewer!drea34çcv3d';
-    }
-
-    public function setup_student()
-    {
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_1';
-        $_SERVER['Shib-EP-Affiliation'] = 'member';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John';
-        $_SERVER['Shib-Person-surname'] = 'Doe';
-        $_SERVER['Shib-InetOrgPerson-mail'] = 'john.doe@localhost.org';
-        $_SERVER['persistent-id'] = 'idp!viewer!drea34çcv3d';
-    }
-
-    public function setup_staff()
-    {
-        $id = uniqid();
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_123456';
-        $_SERVER['Shib-EP-Affiliation'] = 'member;staff';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John Staff';
-        $_SERVER['Shib-Person-surname'] = 'Doe';
-        $_SERVER['Shib-InetOrgPerson-mail'] = 'john.staff.doe@localhost.org';
-        $_SERVER['persistent-id'] = 'idp!viewer!usr_123456';
-    }
-
-    public function setup_new_student()
-    {
-        $id = uniqid();
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_' . $id;
-        $_SERVER['Shib-EP-Affiliation'] = 'member';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John';
-        $_SERVER['Shib-Person-surname'] = 'Doe' . $id;
-        $_SERVER['Shib-InetOrgPerson-mail'] = 'john.' . $id . 'Doe@localhost.org';
-        $_SERVER['persistent-id'] = 'idp!viewer!' . md5($id);
-    }
-
-    public function setup_new_student_no_email()
-    {
-        $id = uniqid();
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_' . $id;
-        $_SERVER['Shib-EP-Affiliation'] = 'member';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John';
-        $_SERVER['Shib-Person-surname'] = 'Doe' . $id;
-        $_SERVER['Shib-InetOrgPerson-mail'] = '';
-        $_SERVER['persistent-id'] = 'idp!viewer!' . md5($id);
-    }
-
-    public function setup_new_student_multiple_givenname()
-    {
-        $id = uniqid();
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_' . $id;
-        $_SERVER['Shib-EP-Affiliation'] = 'member';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John;Alex;John Alex';
-        $_SERVER['Shib-Person-surname'] = 'Doe' . $id;
-        $_SERVER['Shib-InetOrgPerson-mail'] = 'john.' . $id . 'Doe@localhost.org';
-        $_SERVER['persistent-id'] = 'idp!viewer!' . md5($id);
-    }
-
-    public function setup_new_teacher()
-    {
-        $id = uniqid();
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_' . $id;
-        $_SERVER['Shib-EP-Affiliation'] = 'member;staff;faculty';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John';
-        $_SERVER['Shib-Person-surname'] = 'Doe' . $id;
-        $_SERVER['Shib-InetOrgPerson-mail'] = 'john.' . $id . 'Doe@localhost.org';
-        $_SERVER['persistent-id'] = 'idp!viewer!' . md5($id);
-    }
-
-    public function setup_new_staff()
-    {
-        $id = uniqid();
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_' . $id;
-        $_SERVER['Shib-EP-Affiliation'] = 'member;staff';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John';
-        $_SERVER['Shib-Person-surname'] = 'Doe' . $id;
-        $_SERVER['Shib-InetOrgPerson-mail'] = 'john.' . $id . 'Doe@localhost.org';
-        $_SERVER['persistent-id'] = 'idp!viewer!' . md5($id);
-    }
-
-    public function setup_new_no_affiliation()
-    {
-        $id = uniqid();
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_' . $id;
-        $_SERVER['Shib-EP-Affiliation'] = '';
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John';
-        $_SERVER['Shib-Person-surname'] = 'Doe' . $id;
-        $_SERVER['Shib-InetOrgPerson-mail'] = 'john.' . $id . 'Doe@localhost.org';
-        $_SERVER['persistent-id'] = 'idp!viewer!' . md5($id);
-    }
-
-    public function setup_new_minimal_data()
-    {
-        $id = uniqid();
-        $_SERVER['Shib-SwissEP-UniqueID'] = 'usr_' . $id;       
-        $_SERVER['Shib-InetOrgPerson-givenName'] = 'John';
-        $_SERVER['Shib-Person-surname'] = 'Doe' . $id;
-    }
-
-}

+ 0 - 32
main/auth/shibboleth/test/test.php

@@ -1,32 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * Run unit tests. Server needs to be a test server to run those.
- * 
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-include_once(dirname(__FILE__) . '/../init.php');
-
-if (!ShibbolethTest::is_enabled())
-{
-    echo 'This is not a test server';
-    die;
-}
-
-echo 'Test started<br/>-------------------<br/>';
-
-ShibbolethTest::test_new_teacher();
-ShibbolethTest::test_new_student();
-ShibbolethTest::test_update_teacher();
-ShibbolethTest::test_new_student_multiple_givenname();
-ShibbolethTest::test_new_no_affiliation_default();
-ShibbolethTest::test_new_staff();
-ShibbolethTest::test_new_infer_status_request();
-
-echo '-------------------<br/>Done!';
-
-
-

+ 0 - 20
main/auth/shibboleth/test/test_no_email.php

@@ -1,20 +0,0 @@
-<?php
-
-namespace Shibboleth;
-
-/**
- * @license see /license.txt
- * @author Laurent Opprecht <laurent@opprecht.info>, Nicolas Rod for the University of Geneva
- */
-include_once(dirname(__FILE__) . '/../init.php');
-
-if (!ShibbolethTest::is_enabled())
-{
-    echo 'This is not a test server';
-    die;
-}
-
-Shibboleth::session()->logout();
-ShibbolethTest::helper()->setup_new_student_no_email();
-
-require_once dirname(__FILE__) . '/../login.php';

+ 0 - 234
main/auth/sso/sso.class.php

@@ -1,234 +0,0 @@
-<?php
-
-use \ChamiloSession as Session;
-
-/* For licensing terms, see /license.txt */
-/**
- * This file contains the necessary elements to implement a Single Sign On 
- * mechanism with an arbitrary external web application (given some light 
- * development there) and is based on the Drupal-Chamilo module implementation.
- * To develop a new authentication mechanism, please extend this class and
- * overwrite its method, then modify the corresponding calling code in 
- * main/inc/local.inc.php
- * @package chamilo.auth.sso
- */
-/**
- * The SSO class allows for management or remote Single Sign On resources
- */
-class sso {
-    public $protocol; //    'http://',
-    public $domain; //    'localhost/project/drupal5',
-    public $auth_uri; //    '/?q=user',
-    public $deauth_uri; //    '/?q=logout',
-    public $referer; // http://my.chamilo.com/main/auth/profile.php
-
-    /**
-     * Instanciates the object, initializing all relevant URL strings
-     */
-    public function __construct() {
-        $this->protocol   = api_get_setting('sso_authentication_protocol');
-        // There can be multiple domains, so make sure to take only the first
-        // This might be later extended with a decision process
-        $domains          = split(',',api_get_setting('sso_authentication_domain'));
-        $this->domain     = trim($domains[0]);
-        $this->auth_uri   = api_get_setting('sso_authentication_auth_uri');
-        $this->deauth_uri = api_get_setting('sso_authentication_unauth_uri');
-        //cut the string to avoid recursive URL construction in case of failure
-        $this->referer    = $this->protocol.$_SERVER['HTTP_HOST'].substr($_SERVER['REQUEST_URI'],0,strpos($_SERVER['REQUEST_URI'],'sso'));
-        $this->deauth_url = $this->protocol.$this->domain.$this->deauth_uri;
-        $this->master_url = $this->protocol.$this->domain.$this->auth_uri;
-        $this->target     = api_get_path(WEB_PATH);
-    }
-    /**
-     * Unlogs the user from the remote server 
-     */
-    public function logout() {
-        header('Location: '.$this->deauth_url);
-        exit;
-    }
-
-    /**
-     * Sends the user to the master URL for a check of active connection
-     */
-    public function ask_master() {
-        $params = 'sso_referer='.urlencode($this->referer).'&sso_target='.urlencode($this->target);
-        if (strpos($this->master_url, "?") === false) {
-            $params = "?$params";
-        } else {
-            $params = "&$params";
-        }
-        header('Location: '.$this->master_url.$params);
-        exit;
-    }
-    
-    function redirect_to($sso, $user_id, $logged_in) {           
-        if (isset($sso['target']) && !empty($sso['target'])) {
-            header('Location: '. $sso['target']);    
-        } else {
-            //Use this handy function to deal with platform settings
-            Redirect::session_request_uri($logged_in, $user_id);                                            
-        }                                            
-        exit;
-    }
-    
-    /**
-     * Validates the received active connection data with the database
-     * @return	bool	Return the loginFailed variable value to local.inc.php
-     */
-    public function check_user() {
-        global $_user;
-        $loginFailed = false;
-        //change the way we recover the cookie depending on how it is formed
-        $sso = $this->decode_cookie($_GET['sso_cookie']);
-        
-        //error_log('check_user');
-        //error_log('sso decode cookie: '.print_r($sso,1));
-        
-        //lookup the user in the main database
-        $user_table = Database::get_main_table(TABLE_MAIN_USER);
-        $sql = "SELECT user_id, username, password, auth_source, active, expiration_date, status
-                FROM $user_table
-                WHERE username = '".trim(Database::escape_string($sso['username']))."'";
-        $result = Database::query($sql);
-        if (Database::num_rows($result) > 0) {
-            //error_log('user exists');
-            $uData = Database::fetch_array($result);
-            //Check the user's password
-            if ($uData['auth_source'] == PLATFORM_AUTH_SOURCE) {
-             
-                //the authentification of this user is managed by Chamilo itself
-                // check the user's password
-                // password hash comes already parsed in sha1, md5 or none
-                
-                /*
-                error_log($sso['secret']);
-                error_log($uData['password']);
-                error_log($sso['username']);
-                error_log($uData['username']);
-                */
-                
-                if ($sso['secret'] === sha1($uData['password']) 
-                    && ($sso['username'] == $uData['username'])) {
-                    error_log('user n password are ok');                    
-                    //Check if the account is active (not locked)
-                    if ($uData['active']=='1') {
-                        // check if the expiration date has not been reached
-                        if ($uData['expiration_date'] > date('Y-m-d H:i:s') OR $uData['expiration_date']=='0000-00-00 00:00:00') {                            
-                            //If Multiple URL is enabled
-                            if (api_get_multiple_access_url()) {
-                                //Check the access_url configuration setting if the user is registered in the access_url_rel_user table
-                                //Getting the current access_url_id of the platform
-                                $current_access_url_id = api_get_current_access_url_id();
-                                // my user is subscribed in these 
-                                //sites: $my_url_list
-                                $my_url_list = api_get_access_url_from_user($uData['user_id']);
-                            } else {
-                                $current_access_url_id = 1;
-                                $my_url_list = array(1);
-                            }
-                            
-                            $my_user_is_admin = UserManager::is_admin($uData['user_id']);
-                                if ($my_user_is_admin === false) {
-                                    if (is_array($my_url_list) && count($my_url_list)>0 ) {
-                                        if (in_array($current_access_url_id, $my_url_list)) {
-                                            // the user has permission to enter at this site
-                                            $_user['user_id'] = $uData['user_id'];                                            
-                                        $_user = api_get_user_info($_user['user_id']);
-                                            Session::write('_user',$_user);
-                                            event_login();                                            
-                                            // Redirect to homepage
-                                            $sso_target = isset($sso['target']) ? $sso['target'] : api_get_path(WEB_PATH) .'.index.php';
-                                            header('Location: '. $sso_target);
-                                            exit;
-                                        } else {
-                                            // user does not have permission for this site
-                                            $loginFailed = true;
-                                            Session::erase('_uid');
-                                            header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=access_url_inactive');
-                                            exit;
-                                        }
-                                    } else {
-                                        // there is no URL in the multiple 
-                                        // urls list for this user
-                                        $loginFailed = true;
-                                        Session::erase('_uid');
-                                        header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=access_url_inactive');
-                                        exit;
-                                    }
-                                } else { 
-                                    //Only admins of the "main" (first) Chamilo
-                                    // portal can login wherever they want
-                                    if (in_array(1, $my_url_list)) { 
-                                        //Check if this admin is admin on the  
-                                        // principal portal
-                                        $_user['user_id'] = $uData['user_id'];
-                                    $_user = api_get_user_info($_user['user_id']);
-                                    $is_platformAdmin = $uData['status'] == COURSEMANAGER;
-                                    Session::write('is_platformAdmin', $is_platformAdmin);
-                                        Session::write('_user',$_user);
-                                        event_login();
-                                        self::redirect_to($sso, $_user['user_id'], true);
-                                    } else {
-                                        //Secondary URL admin wants to login 
-                                        // so we check as a normal user
-                                        if (in_array($current_access_url_id, $my_url_list)) {
-                                            $_user['user_id'] = $uData['user_id'];
-                                        $_user = api_get_user_info($_user['user_id']);
-                                            Session::write('_user',$_user);
-                                            event_login();
-                                            self::redirect_to($sso, $_user['user_id'], true);
-                                        } else {
-                                            $loginFailed = true;
-                                            Session::erase('_uid');
-                                            header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=access_url_inactive');
-                                            exit;
-                                        }
-                                    }
-                                }
-                            } else {
-                            // user account expired
-                            $loginFailed = true;
-                            Session::erase('_uid');
-                            header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=account_expired');
-                            exit;
-                        }
-                    } else {
-                        //User not active
-                        $loginFailed = true;
-                        Session::erase('_uid');
-                        header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=account_inactive');
-                        exit;
-                    }
-                } else {
-                    //SHA1 of password is wrong
-                    $loginFailed = true;
-                    Session::erase('_uid');
-                    header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=wrong_password');
-                    exit;
-                }
-            } else {
-                //Auth_source is wrong
-                $loginFailed = true;
-                Session::erase('_uid');
-                header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=wrong_authentication_source');
-                exit;
-            }
-        } else {
-            //No user by that login
-            $loginFailed = true;
-            Session::erase('_uid');
-            header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=user_not_found');
-            exit;
-        }
-        return $loginFailed;
-    }
-    /**
-     * Decode the cookie (this function may vary depending on the
-     * Single Sign On implementation
-     * @param	string	Encoded cookie
-     * @return  array   Parsed and unencoded cookie
-     */
-    private function decode_cookie($cookie) {
-        return unserialize(base64_decode($cookie));
-    }
-}

+ 0 - 100
main/auth/sso/sso_server_test.php

@@ -1,100 +0,0 @@
-<?php
-/* 
-  SSO sample
-  
-  This is the "server" of my institution/university authentification "code"
-  
-  1. Active all the SSO option in your Chamilo installation: main/admin/settings.php?category=Security
-  2. Make sure this script is located in the index page of the server you fill in the "Domain of the Single Sign On server" Chamilo setting
-     For example this script must be located in example.com/index.php if you set the "Domain of the Single Sign On server" = example.com
-  3. Create a user in chamilo and in your external system with login = "joe" and password = "doe"  
-  4. Remember this is just a sample! Check the chamilo drupal extension for more information: 
-     http://drupal.org/node/817682
-  5. When activating the settings in step 1, the principal Chamilo file main/inc/local.inc.php will load the class main/auth/sso.class.php library 
- *   that will redirect to this field with some parameters.
- * 
-*/
-
-
-exit; //Uncomment this to execute the page
-
-
-//After you located this file in you new domain and you set the settings in step 2, 
-//this page will be loaded when entering to the Chamilo site if the SSO option was set in step 1.
-
-//Getting the chamilo server
-$my_chamilo_server = filter_xss($_SERVER['HTTP_HOST']);
-
-$account = array();
-
-if (isset($_SESSION['my_server_user_session'])) {
-    //validate if the user is already logged in my external system in order to redirect to chamilo
-}
-
-//Login process
-      
-if (isset($_POST['user']) && isset($_POST['password'])) {
-    
-    //1. Your Server validations
-    $validate = validate_user($_POST['user'], $_POST['password']);
-    
-    if ($validate) {
-    
-        /* 2.Get the chamilo username and password from your system or from webservices */
-        
-        $account['username'] = 'jbrion525';             //username in Chamilo
-        $account['password'] = sha1(sha1('jbrion525')); //encrypted password with assuming that the first encrypted method is sha1 in chamilo
-        
-        $master_auth_uri = $my_chamilo_server.'/?q=user';
-
-        // Creating an array cookie that will be sent to Chamilo
-        $sso = array(
-            'username'          => $account['username'],
-            'secret'            => $account['password'],
-            'master_domain'     => $my_chamilo_server,
-            'master_auth_uri'   => $master_auth_uri,
-            'lifetime'          => time() + 3600,
-            'target'            => filter_xss($_GET['sso_target']),
-        );
-
-        $cookie = base64_encode(serialize($sso));
-        $url = chamilo_sso_protocol() . $master_auth_uri;
-        $params = 'sso_referer='. urlencode($url) .'&sso_cookie='. urlencode($cookie);
-        $final_url = filter_xss($_GET['sso_referer']) .'?'. $params;
-        
-        //If your user exists redirect to chamilo and set the account in a session to check it later        
-        $_SESSION['my_server_user_session'] = $account;
-        
-        //3. After validating the user in the server and getting and setting the user data of chamilo in the sso_cookie variable:
-        // Redirect to this URL
-        header('Location: '.$final_url);
-        exit;
-    } else {
-        echo '<h2>Wrong parameters</h2>';
-    }
-}
-
-if (isset($_POST['logout'])) {
-    //echo do something to logout
-}
-
-function validate_user($user, $pass) {
-    return true;
-}
-function filter_xss($val) {
-    //do some cleaning
-    return $val;
-}
-
-function chamilo_sso_protocol() {
-    //get the sso_protocol from chamilo using webservices
-    return 'http://';
-}
-?>
-<html>
-    <form method="post">
-        User <input name="user"/>
-        Pass <input name="password" />
-        <input type="submit" value="Login">
-    </form>
-</html>

+ 0 - 578
main/exercice/export/qti/qti_classes.php

@@ -1,578 +0,0 @@
-<?php // $Id: $
-/* For licensing terms, see /license.txt */
-/**
- * @copyright (c) 2007 Dokeos
- * @copyright (c) 2001-2006 Universite catholique de Louvain (UCL)
- *
- * @license http://www.gnu.org/copyleft/gpl.html (GPL) GENERAL PUBLIC LICENSE
- *
- * @author Claro Team <cvs@claroline.net>
- * @author Yannick Warnier <yannick.warnier@beeznest.com>
- * @package chamilo.exercise
- */
-/**
- * Code
- */
-if ( count( get_included_files() ) == 1 ) die( '---' );
-require_once '../../exercise.class.php';
-require_once '../../question.class.php';
-require_once '../../answer.class.php';
-require_once '../../unique_answer.class.php';
-require_once '../../multiple_answer.class.php';
-require_once '../../fill_blanks.class.php';
-require_once '../../freeanswer.class.php';
-require_once '../../hotspot.class.php';
-require_once '../../matching.class.php';
-require_once '../../hotspot.class.php';
-
-
-/**
- *
- * @package chamilo.exercise
- */
-class ImsQuestion extends Question
-{
-	/**
-	 * Include the correct answer class and create answer
-	 */
-	function setAnswer()
-	{
-		switch($this->type)
-		{
-			case MCUA :
-				$this->answer = new ImsAnswerMultipleChoice($this->id, false);
-				break;
-			case MCMA :
-				$this->answer = new ImsAnswerMultipleChoice($this->id, true);
-				break;
-			case TF :
-				$this->answer = new ImsAnswerTrueFalse($this->id);
-				break;
-			case FIB :
-				$this->answer = new ImsAnswerFillInBlanks($this->id);
-				break;
-			case MATCHING :
-				$this->answer = new ImsAnswerMatching($this->id);
-				break;
-			default :
-				$this->answer = null;
-				break;
-		}
-
-		return true;
-	}
-
-    /**
-     * allow to import the question
-     *
-     * @param questionArray is an array that must contain all the information needed to build the question
-     * @author Guillaume Lederer <guillaume@claroline.net>
-     */
-
-    function import($questionArray, $exerciseTempPath)
-    {
-        //import answers
-
-        $this->answer->import($questionArray);
-
-        //import attached file, if any
-
-        if (isset($questionArray['attached_file_url']))
-        {
-            $file= array();
-            $file['name'] = $questionArray['attached_file_url'];
-            $file['tmp_name'] = $exerciseTempPath.$file['name'];
-
-            $this->setAttachment($file);
-        }
-    }
-}
-
-/**
- *
- * @package chamilo.exercise
- */
-class ImsAnswerMultipleChoice extends answerMultipleChoice
-{
-	/**
-     * Return the XML flow for the possible answers.
-     * That's one <response_lid>, containing several <flow_label>
-     *
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function imsExportResponses($questionIdent)
-    {
-        // Opening of the response block.
-        if( $this->multipleAnswer )
-        {
-		    $out = '<response_lid ident = "MCM_' . $questionIdent . '" rcardinality = "Multiple" rtiming = "No">' . "\n"
-		         . '<render_choice shuffle = "No" minnumber = "1" maxnumber = "' . count($this->answerList) . '">' . "\n";
-        }
-        else
-        {
-			$out = '<response_lid ident="MCS_' . $questionIdent . '" rcardinality="Single" rtiming="No"><render_choice shuffle="No">' . "\n";
-        }
-
-        // Loop over answers
-        foreach( $this->answerList as $answer )
-        {
-            $responseIdent = $questionIdent . "_A_" . $answer['id'];
-
-            $out.= '  <flow_label><response_label ident="' . $responseIdent . '">'.(!$this->multipleAnswer ? '<flow_mat class="list">':'').'<material>' . "\n"
-                . '    <mattext><![CDATA[' . $answer['answer'] . ']]></mattext>' . "\n"
-                . '  </material>'.(!$this->multipleAnswer ? '</flow_mat>':'').'</response_label></flow_label>' . "\n";
-        }
-        $out.= "</render_choice></response_lid>\n";
-
-        return $out;
-    }
-
-    /**
-     * Return the XML flow of answer processing : a succession of <respcondition>.
-     *
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function imsExportProcessing($questionIdent)
-    {
-        $out = '';
-
-        foreach( $this->answerList as $answer )
-        {
-            $responseIdent = $questionIdent . "_A_" . $answer['id'];
-            $feedbackIdent = $questionIdent . "_F_" . $answer['id'];
-            $conditionIdent = $questionIdent . "_C_" . $answer['id'];
-
-            if( $this->multipleAnswer )
-        	{
-	            $out .= '<respcondition title="' . $conditionIdent . '" continue="Yes"><conditionvar>' . "\n"
-				.	 '  <varequal respident="MCM_' . $questionIdent . '">' . $responseIdent . '</varequal>' . "\n";
-        	}
-        	else
-        	{
-	            $out .= '<respcondition title="' . $conditionIdent . '"><conditionvar>' . "\n"
-				.	 '  <varequal respident="MCS_' . $questionIdent . '">' . $responseIdent . '</varequal>' . "\n";
-        	}
-
-            $out .= "  </conditionvar>\n" . '  <setvar action="Add">' . $answer['grade'] . "</setvar>\n";
-
-            // Only add references for actually existing comments/feedbacks.
-            if( !empty($answer['comment']) )
-            {
-                $out .= '  <displayfeedback feedbacktype="Response" linkrefid="' . $feedbackIdent . '" />' . "\n";
-            }
-            $out .= "</respcondition>\n";
-        }
-        return $out;
-    }
-
-     /**
-      * Export the feedback (comments to selected answers) to IMS/QTI
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function imsExportFeedback($questionIdent)
-     {
-        $out = "";
-        foreach( $this->answerList as $answer )
-        {
-            if( !empty($answer['comment']) )
-            {
-                $feedbackIdent = $questionIdent . "_F_" . $answer['id'];
-                $out.= '<itemfeedback ident="' . $feedbackIdent . '" view="Candidate"><flow_mat><material>' . "\n"
-                    . '  <mattext><![CDATA[' . $answer['comment'] . "]]></mattext>\n"
-                    . "</material></flow_mat></itemfeedback>\n";
-            }
-        }
-        return $out;
-     }
-
-     /**
-     * allow to import the answers, feedbacks, and grades of a question
-     * @param questionArray is an array that must contain all the information needed to build the question
-     * @author Guillaume Lederer <guillaume@claroline.net>
-     */
-
-    function import($questionArray)
-    {
-
-        $answerArray = $questionArray['answer'];
-
-        $this->answerList = array(); //re-initialize answer object content
-
-
-
-        foreach ($answerArray as $key => $answer)
-        {
-            if (!isset($answer['feedback'])) $answer['feedback'] = "";
-            if (!isset($questionArray['weighting'][$key]))
-            {
-                if (isset($questionArray['default_weighting']))
-                {
-                    $grade = $questionArray['default_weighting'];
-                }
-                else
-                {
-                    $grade = 0;
-                }
-            }
-            else
-            {
-                $grade = $questionArray['weighting'][$key];
-            }
-            if (in_array($key,$questionArray['correct_answers'])) $is_correct = true; else $is_correct = false;
-            $addedAnswer = array(
-                            'answer' => $answer['value'],
-                            'correct' => $is_correct,
-                            'grade' => $grade,
-                            'comment' => $answer['feedback'],
-                            );
-
-            $this->answerList[] = $addedAnswer;
-        }
-    }
-}
-
-/**
- *
- * @package chamilo.exercise
- */
-class ImsAnswerTrueFalse extends answerTrueFalse
-{
-	/**
-     * Return the XML flow for the possible answers.
-     * That's one <response_lid>, containing several <flow_label>
-     *
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function imsExportResponses($questionIdent)
-    {
-        // Opening of the response block.
-        $out = '<response_lid ident="TF_' . $questionIdent . '" rcardinality="Single" rtiming="No"><render_choice shuffle="No">' . "\n";
-
-        // true
-        $response_ident = $questionIdent . '_A_true';
-		$out .=
-			'  <flow_label><response_label ident="'.$response_ident.'"><flow_mat class="list"><material>' . "\n"
-		.	'    <mattext><![CDATA[' . get_lang('True') . ']]></mattext>' . "\n"
-		.	'  </material></flow_mat></response_label></flow_label>' . "\n";
-
-		// false
-		$response_ident = $questionIdent . '_A_false';
-        $out .=
-			'  <flow_label><response_label ident="'.$response_ident.'"><flow_mat class="list"><material>' . "\n"
-		.	'    <mattext><![CDATA[' . get_lang('False') . ']]></mattext>' . "\n"
-		.	'  </material></flow_mat></response_label></flow_label>' . "\n";
-
-        $out .= '</render_choice></response_lid>' . "\n";
-
-        return $out;
-    }
-
-    /**
-     * Return the XML flow of answer processing : a succession of <respcondition>.
-     *
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function imsExportProcessing($questionIdent)
-    {
-        $out = '';
-
-        // true
-		$response_ident = $questionIdent. '_A_true';
-        $feedback_ident = $questionIdent . '_F_true';
-        $condition_ident = $questionIdent . '_C_true';
-
-		$out .=
-			'<respcondition title="' . $condition_ident . '"><conditionvar>' . "\n"
-		.	'  <varequal respident="TF_' . $questionIdent . '">' . $response_ident . '</varequal>' . "\n"
-		.	'  </conditionvar>' . "\n" . '  <setvar action="Add">' . $this->trueGrade . '</setvar>' . "\n";
-
-        // Only add references for actually existing comments/feedbacks.
-        if( !empty($this->trueFeedback) )
-        {
-            $out.= '  <displayfeedback feedbacktype="Response" linkrefid="' . $this->trueFeedback . '" />' . "\n";
-        }
-
-		$out .= '</respcondition>' . "\n";
-
-		// false
-		$response_ident = $questionIdent. '_A_false';
-        $feedback_ident = $questionIdent . '_F_false';
-        $condition_ident = $questionIdent . '_C_false';
-
-		$out .=
-			'<respcondition title="' . $condition_ident . '"><conditionvar>' . "\n"
-		.	'  <varequal respident="TF_' . $questionIdent . '">' . $response_ident . '</varequal>' . "\n"
-		.	'  </conditionvar>' . "\n" . '  <setvar action="Add">' . $this->falseGrade . '</setvar>' . "\n";
-
-        // Only add references for actually existing comments/feedbacks.
-        if( !empty($this->falseFeedback) )
-        {
-            $out.= '  <displayfeedback feedbacktype="Response" linkrefid="' . $feedback_ident . '" />' . "\n";
-        }
-
-		$out .= '</respcondition>' . "\n";
-
-        return $out;
-    }
-
-     /**
-      * Export the feedback (comments to selected answers) to IMS/QTI
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function imsExportFeedback($questionIdent)
-     {
-        $out = "";
-
-        if( !empty($this->trueFeedback) )
-        {
-            $feedback_ident = $questionIdent . '_F_true';
-            $out.= '<itemfeedback ident="' . $feedback_ident . '" view="Candidate"><flow_mat><material>' . "\n"
-                . '  <mattext><![CDATA[' . $this->trueFeedback . "]]></mattext>\n"
-                . "</material></flow_mat></itemfeedback>\n";
-        }
-
-		if( !empty($this->falseFeedback) )
-        {
-            $feedback_ident = $questionIdent . '_F_false';
-            $out.= '<itemfeedback ident="' . $feedback_ident . '" view="Candidate"><flow_mat><material>' . "\n"
-                . '  <mattext><![CDATA[' . $this->falseFeedback . "]]></mattext>\n"
-                . "</material></flow_mat></itemfeedback>\n";
-        }
-        return $out;
-     }
-}
-
-/**
- *
- * @package chamilo.exercise
- */
-class ImsAnswerFillInBlanks extends answerFillInBlanks
-{
-	/**
-     * Export the text with missing words.
-     *
-     * As a side effect, it stores two lists in the class :
-     * the missing words and their respective weightings.
-     *
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function imsExportResponses($questionIdent)
-    {
-        global $charset;
-
-        $out = "<flow>\n";
-
-        $responsePart = explode(']', $this->answer);
-        $i = 0; // Used for the reference generation.
-        foreach($responsePart as $part)
-        {
-            $response_ident = $questionIdent . "_A_" . $i;
-
-            if( strpos($part,'[') !== false )
-            {
-                list($rawText, $blank) = explode('[', $part);
-            }
-            else
-            {
-                $rawText = $part;
-                $blank = "";
-            }
-
-            if ($rawText!="")
-            {
-                $out.="  <material><mattext><![CDATA[" . $rawText . "]]></mattext></material>\n";
-            }
-
-            if ($blank!="")
-            {
-                $out.= '  <response_str ident="' . $response_ident . '" rcardinality="Single" rtiming="No">' . "\n"
-                     . '    <render_fib fibtype="String" prompt="Box" encoding="' . $charset . '">' . "\n"
-                     . '      <response_label ident="A"/>' . "\n"
-                     . "     </render_fib>\n"
-                     . "  </response_str>\n";
-            }
-            $i++;
-        }
-        $out.="</flow>\n";
-
-        return $out;
-
-    }
-
-    /**
-     * Exports the response processing.
-     *
-     * It uses the two lists build by export_responses(). This implies that export_responses MUST
-     * be called before.
-     *
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function imsExportProcessing($questionIdent)
-    {
-        $out = "";
-
-		$answerCount = count($this->answerList);
-
-		for( $i = 0; $i < $answerCount ; $i++ )
-        {
-            $response_ident = $questionIdent . "_A_" . $i;
-            $out.= '  <respcondition continue="Yes"><conditionvar>' . "\n"
-                 . '    <varequal respident="' . $response_ident . '" case="No"><![CDATA[' . $this->answerList[$i] . ']]></varequal>' . "\n"
-                 . '  </conditionvar><setvar action="Add">' . $this->gradeList[$i] . "</setvar>\n"
-                 . "  </respcondition>\n";
-        }
-        return $out;
-    }
-
-	/**
-      * Export the feedback (comments to selected answers) to IMS/QTI
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function imsExportFeedback($questionIdent)
-     {
-		// no feedback in this question type
-        return '';
-     }
-
-    /**
-     * allow to import the answers, feedbacks, and grades of a question
-     *
-     * @param questionArray is an array that must contain all the information needed to build the question
-     * @author Guillaume Lederer <guillaume@claroline.net>
-     */
-
-    function import($questionArray)
-    {
-        $answerArray = $questionArray['answer'];
-        $this->answerText = str_replace ("\n","",$questionArray['response_text']);
-        if ($questionArray['subtype'] == "TEXTFIELD_FILL") $this->type = TEXTFIELD_FILL;
-        if ($questionArray['subtype'] == "LISTBOX_FILL")
-        {
-            $this->wrongAnswerList = $questionArray['wrong_answers'];
-            $this->type = LISTBOX_FILL;
-        }
-
-        //build correct_answsers array
-
-        if (isset($questionArray['weighting']))
-        {
-            $this->gradeList = $questionArray['weighting'];
-        }
-    }
-}
-
-/**
- *
- * @package chamilo.exercise
- */
-class ImsAnswerMatching extends answerMatching
-{
-	/**
-     * Export the question part as a matrix-choice, with only one possible answer per line.
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function imsExportResponses($questionIdent)
-    {
-		$out = "";
-        // Now, loop again, finding questions (rows)
-        foreach( $this->leftList as $leftElt )
-        {
-            $responseIdent = $questionIdent . "_A_" . $leftElt['code'];
-            $out.= '<response_lid ident="' . $responseIdent . '" rcardinality="Single" rtiming="No">' . "\n"
-                 . '<material><mattext><![CDATA[' . $leftElt['answer'] . "]]></mattext></material>\n"
-                 . '  <render_choice shuffle="No"><flow_label>' . "\n";
-
-            foreach( $this->rightList as $rightElt )
-            {
-                $out.= '    <response_label ident="' . $rightElt['code'] . '"><material>' . "\n"
-                     . "      <mattext><![CDATA[" . $rightElt['answer'] . "]]></mattext>\n"
-                     . "    </material></response_label>\n";
-            }
-
-            $out.= "</flow_label></render_choice></response_lid>\n";
-        }
-
-       return $out;
-    }
-
-    /**
-     * Export the response processing part
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function imsExportProcessing($questionIdent)
-    {
-        $out = "";
-        foreach( $this->leftList as $leftElt )
-        {
-            $responseIdent = $questionIdent . "_A_" . $leftElt['code'];
-            $out.= '  <respcondition continue="Yes"><conditionvar>' . "\n"
-                 . '    <varequal respident="' . $responseIdent . '">' . $leftElt['match'] . "</varequal>\n"
-                 . '  </conditionvar><setvar action="Add">' . $leftElt['grade'] . "</setvar>\n"
-                 . "  </respcondition>\n";
-        }
-        return $out;
-    }
-
-	/**
-      * Export the feedback (comments to selected answers) to IMS/QTI
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function imsExportFeedback($questionIdent)
-     {
-		// no feedback in this question type
-        return '';
-     }
-
-    /**
-     * allow to import the answers, feedbacks, and grades of a question
-     *
-     * @param questionArray is an array that must contain all the information needed to build the question
-     * @author Guillaume Lederer <guillaume@claroline.net>
-     */
-
-    function import($questionArray)
-    {
-        $answerArray = $questionArray['answer'];
-
-        //This tick to remove examples in the answers!!!!
-        $this->leftList = array();
-        $this->rightList = array();
-
-        //find right and left column
-
-        $right_column = array_pop($answerArray);
-        $left_column  = array_pop($answerArray);
-
-        //1- build answers
-
-        foreach ($right_column as $right_key => $right_element)
-        {
-            $code = $this->addRight($right_element);
-
-            foreach ($left_column as $left_key => $left_element)
-            {
-                $matched_pattern = $left_key." ".$right_key;
-                $matched_pattern_inverted = $right_key." ".$left_key;
-
-
-                if (in_array($matched_pattern, $questionArray['correct_answers']) || in_array($matched_pattern_inverted, $questionArray['correct_answers']))
-                {
-                    if (isset($questionArray['weighting'][$matched_pattern]))
-                    {
-                        $grade = $questionArray['weighting'][$matched_pattern];
-                    }
-                    else
-                    {
-                        $grade = 0;
-                    }
-                    $this->addLeft($left_element, $code, $grade);
-                }
-            }
-        }
-    }
-}
-?>

+ 0 - 351
main/exercice/export/qti/qti_export.php

@@ -1,351 +0,0 @@
-<?php // $Id: $
-/* For licensing terms, see /license.txt */
-/**
- * @author Claro Team <cvs@claroline.net>
- * @author Amand Tihon <amand@alrj.org>
- * @author Sebastien Piraux <pir@cerdecam.be>
- * @author Yannick Warnier <yannick.warnier@beeznest.com>
- * @package chamilo.exercise.qti
- */
-/**
- * Code
- */
-if ( count( get_included_files() ) == 1 ) die( '---' );
-include dirname(__FILE__) . '/qti_classes.php';
-/*--------------------------------------------------------
-      Classes
-  --------------------------------------------------------*/
-
-/**
- * This class represents an entire exercise to be exported in IMS/QTI.
- * It will be represented by a single <section> containing several <item>.
- *
- * Some properties cannot be exported, as IMS does not support them :
- *   - type (one page or multiple pages)
- *   - start_date and end_date
- *   - max_attempts
- *   - show_answer
- *   - anonymous_attempts
- *
- * @author Amand Tihon <amand@alrj.org>
- * @package chamilo.exercise.qti
- */
-class ImsSection
-{
-    var $exercise;
-
-    /**
-     * Constructor.
-     * @param $exe The Exercise instance to export
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function ImsSection($exe)
-    {
-        $this->exercise = $exe;
-    }
-
-    function start_section()
-    {
-        $out = '<section ident="EXO_' . $this->exercise->getId() . '" title="' . $this->exercise->getTitle() . '">' . "\n";
-        return $out;
-    }
-
-    function end_section()
-    {
-        return "</section>\n";
-    }
-
-    function export_duration()
-    {
-        if ($max_time = $this->exercise->getTimeLimit())
-        {
-            // return exercise duration in ISO8601 format.
-            $minutes = floor($max_time / 60);
-            $seconds = $max_time % 60;
-            return '<duration>PT' . $minutes . 'M' . $seconds . "S</duration>\n";
-        }
-        else
-        {
-            return '';
-        }
-    }
-
-    /**
-     * Export the presentation (Exercise's description)
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function export_presentation()
-    {
-        $out = "<presentation_material><flow_mat><material>\n"
-             . "  <mattext><![CDATA[" . $this->exercise->getDescription() . "]]></mattext>\n"
-             . "</material></flow_mat></presentation_material>\n";
-        return $out;
-    }
-
-    /**
-     * Export the ordering information.
-     * Either sequential, through all questions, or random, with a selected number of questions.
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function export_ordering()
-    {
-        $out = '';
-        if ($n = $this->exercise->getShuffle()) {
-            $out.= "<selection_ordering>"
-                 . "  <selection>\n"
-                 . "    <selection_number>" . $n . "</selection_number>\n"
-                 . "  </selection>\n"
-                 . '  <order order_type="Random" />'
-                 . "\n</selection_ordering>\n";
-        }
-        else
-        {
-            $out.= '<selection_ordering sequence_type="Normal">' . "\n"
-                 . "  <selection />\n"
-                 . "</selection_ordering>\n";
-        }
-
-        return $out;
-    }
-
-    /**
-     * Export the questions, as a succession of <items>
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function export_questions()
-    {
-        $out = "";
-        foreach ($this->exercise->getQuestionList() as $q)
-        {
-            $out .= export_question($q['id'], False);
-        }
-        return $out;
-    }
-
-    /**
-     * Export the exercise in IMS/QTI.
-     *
-     * @param bool $standalone Wether it should include XML tag and DTD line.
-     * @return a string containing the XML flow
-     * @author Amand Tihon <amand@alrj.org>
-     */
-    function export($standalone)
-    {
-        global $charset;
-
-        $head = $foot = "";
-        if ($standalone) {
-            $head = '<?xml version = "1.0" encoding = "' . $charset . '" standalone = "no"?>' . "\n"
-                  . '<!DOCTYPE questestinterop SYSTEM "ims_qtiasiv1p2p1.dtd">' . "\n"
-                  . "<questestinterop>\n";
-            $foot = "</questestinterop>\n";
-        }
-
-        $out = $head
-             . $this->start_section()
-             . $this->export_duration()
-             . $this->export_presentation()
-             . $this->export_ordering()
-             . $this->export_questions()
-             . $this->end_section()
-             . $foot;
-
-        return $out;
-    }
-}
-
-/*
-    Some quick notes on identifiers generation.
-    The IMS format requires some blocks, like items, responses, feedbacks, to be uniquely
-    identified.
-    The unicity is mandatory in a single XML, of course, but it's prefered that the identifier stays
-    coherent for an entire site.
-
-    Here's the method used to generate those identifiers.
-    Question identifier :: "QST_" + <Question Id from the DB> + "_" + <Question numeric type>
-    Response identifier :: <Question identifier> + "_A_" + <Response Id from the DB>
-    Condition identifier :: <Question identifier> + "_C_" + <Response Id from the DB>
-    Feedback identifier :: <Question identifier> + "_F_" + <Response Id from the DB>
-*/
-/**
- * An IMS/QTI item. It corresponds to a single question.
- * This class allows export from Claroline to IMS/QTI XML format.
- * It is not usable as-is, but must be subclassed, to support different kinds of questions.
- *
- * Every start_*() and corresponding end_*(), as well as export_*() methods return a string.
- *
- * Warning: Attached files are NOT exported.
- * @package chamilo.exercise.qti
- * @author Amand Tihon <amand@alrj.org>
- */
-class ImsItem
-{
-    var $question;
-    var $question_ident;
-    var $answer;
-
-    /**
-     * Constructor.
-     *
-     * @param $question The Question object we want to export.
-     * @author Anamd Tihon
-     */
-     function ImsItem($question)
-     {
-        $this->question = $question;
-        $this->answer = $question->answer;
-        $this->questionIdent = "QST_" . $question->getId() ;
-     }
-
-     /**
-      * Start the XML flow.
-      *
-      * This opens the <item> block, with correct attributes.
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-      function start_item()
-      {
-        return '<item title="' . htmlspecialchars($this->question->getTitle()) . '" ident="' . $this->questionIdent . '">' . "\n";
-      }
-
-      /**
-       * End the XML flow, closing the </item> tag.
-       *
-       * @author Amand Tihon <amand@alrj.org>
-       */
-      function end_item()
-      {
-        return "</item>\n";
-      }
-
-     /**
-      * Create the opening, with the question itself.
-      *
-      * This means it opens the <presentation> but doesn't close it, as this is the role of end_presentation().
-      * Inbetween, the export_responses from the subclass should have been called.
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function start_presentation()
-     {
-        return '<presentation label="' . $this->questionIdent . '"><flow>' . "\n"
-             . '<material><mattext><![CDATA[' . $this->question->getDescription() . "]]></mattext></material>\n";
-     }
-
-     /**
-      * End the </presentation> part, opened by export_header.
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function end_presentation()
-     {
-        return "</flow></presentation>\n";
-     }
-
-     /**
-      * Start the response processing, and declare the default variable, SCORE, at 0 in the outcomes.
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function start_processing()
-     {
-        return '<resprocessing><outcomes><decvar vartype="Integer" defaultval="0" /></outcomes>' . "\n";
-     }
-
-     /**
-      * End the response processing part.
-      *
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function end_processing()
-     {
-        return "</resprocessing>\n";
-     }
-
-
-     /**
-      * Export the question as an IMS/QTI Item.
-      *
-      * This is a default behaviour, some classes may want to override this.
-      *
-      * @param $standalone: Boolean stating if it should be exported as a stand-alone question
-      * @return A string, the XML flow for an Item.
-      * @author Amand Tihon <amand@alrj.org>
-      */
-     function export($standalone = False)
-     {
-        global $charset;
-        $head = $foot = "";
-
-        if( $standalone )
-        {
-            $head = '<?xml version = "1.0" encoding = "'.$charset.'" standalone = "no"?>' . "\n"
-                  . '<!DOCTYPE questestinterop SYSTEM "ims_qtiasiv1p2p1.dtd">' . "\n"
-                  . "<questestinterop>\n";
-            $foot = "</questestinterop>\n";
-        }
-
-        return $head
-               . $this->start_item()
-                . $this->start_presentation()
-                    . $this->answer->imsExportResponses($this->questionIdent)
-                . $this->end_presentation()
-                . $this->start_processing()
-                    . $this->answer->imsExportProcessing($this->questionIdent)
-                . $this->end_processing()
-                . $this->answer->imsExportFeedback($this->questionIdent)
-               . $this->end_item()
-              . $foot;
-     }
-}
-
-
-
-
-/*--------------------------------------------------------
-      Functions
-  --------------------------------------------------------*/
-
-/**
- * Send a complete exercise in IMS/QTI format, from its ID
- *
- * @param int $exerciseId The exercise to exporte
- * @param boolean $standalone Wether it should include XML tag and DTD line.
- * @return The XML as a string, or an empty string if there's no exercise with given ID.
- * @author Amand Tihon <amand@alrj.org>
- */
-function export_exercise($exerciseId, $standalone=True)
-{
-    $exercise = new Exercise();
-    if (! $exercise->load($exerciseId))
-    {
-        return '';
-    }
-    $ims = new ImsSection($exercise);
-    $xml = $ims->export($standalone);
-    return $xml;
-}
-
-/**
- * Returns the XML flow corresponding to one question
- *
- * @param int The question ID
- * @param bool standalone (ie including XML tag, DTD declaration, etc)
- * @author Amand Tihon <amand@alrj.org>
- */
-function export_question($questionId, $standalone=True)
-{
-    $question = new ImsQuestion();
-    if( !$question->load($questionId) )
-    {
-        return '';
-    }
-
-    $ims = new ImsItem($question);
-
-    return $ims->export($standalone);
-
-}
-
-?>

Деякі файли не було показано, через те що забагато файлів було змінено