Commit 8fef894f authored by Robert Lyon's avatar Robert Lyon Committed by Gerrit Code Review
Browse files

Merge "Bug 1715802: Improve requirements checks for auth/saml"

parents 67cfc92c 0491f2f4
...@@ -31,28 +31,17 @@ foreach ($metadata_files as $file) { ...@@ -31,28 +31,17 @@ foreach ($metadata_files as $file) {
// Fix up session handling config - to match Mahara // Fix up session handling config - to match Mahara
$memcache_config = array(); $memcache_config = array();
if (get_config('memcacheservers') || extension_loaded('memcache')) { if (empty(get_config('ssphpsessionhandler'))) {
if (empty(get_config('ssphpsessionhandler'))) { if (PluginAuthSaml::is_memcache_configured()) {
$sessionhandler = 'memcache'; $sessionhandler = 'memcache';
$memcache_config = PluginAuthSaml::get_memcache_servers();
} }
else { else {
$sessionhandler = get_config('ssphpsessionhandler'); throw new AuthInstanceException(get_string('errornomemcache', 'auth.saml'));
}
$servers = get_config('memcacheservers');
if (empty($servers)) {
$servers = 'localhost';
}
$servers = explode(',', $servers);
foreach ($servers as $server) {
$url = parse_url($server);
$host = !empty($url['host']) ? $url['host'] : $url['path'];
$port = !empty($url['port']) ? $url['port'] : 11211;
$memcache_config[] = array('hostname' => $host, 'port'=> $port);
} }
} }
else { else {
$sessionhandler = 'phpsession'; $sessionhandler = get_config('ssphpsessionhandler');
} }
/* /*
...@@ -222,7 +211,6 @@ $config = array ( ...@@ -222,7 +211,6 @@ $config = array (
*/ */
//'session.phpsession.cookiename' => null, //'session.phpsession.cookiename' => null,
'session.phpsession.cookiename' => 'SSPHP_SESSION', 'session.phpsession.cookiename' => 'SSPHP_SESSION',
'session.phpsession.limitedpath' => false,
'session.phpsession.savepath' => null, 'session.phpsession.savepath' => null,
'session.datastore.timeout' => (4*60*60), // 4 hours 'session.datastore.timeout' => (4*60*60), // 4 hours
// 'session.datastore.timeout' => 60, // 'session.datastore.timeout' => 60,
......
...@@ -46,13 +46,7 @@ if (!extension_loaded('mcrypt')) { ...@@ -46,13 +46,7 @@ if (!extension_loaded('mcrypt')) {
$sp = 'default-sp'; $sp = 'default-sp';
if (!file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php')) { PluginAuthSaml::init_simplesamlphp();
throw new AuthInstanceException(get_string('errorbadlib', 'auth.saml', get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php'));
}
require_once(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
require_once(get_config('docroot') . 'auth/saml/extlib/_autoload.php');
SimpleSAML_Configuration::init(get_config('docroot') . 'auth/saml/config');
// Check the SimpleSAMLphp config is compatible // Check the SimpleSAMLphp config is compatible
$saml_config = SimpleSAML_Configuration::getInstance(); $saml_config = SimpleSAML_Configuration::getInstance();
......
...@@ -24,6 +24,7 @@ $string['errorbadinstitution'] = 'Institution for connecting user not resolved'; ...@@ -24,6 +24,7 @@ $string['errorbadinstitution'] = 'Institution for connecting user not resolved';
$string['errorbadssphp'] = 'Invalid SimpleSAMLphp session handler: Must not be phpsession'; $string['errorbadssphp'] = 'Invalid SimpleSAMLphp session handler: Must not be phpsession';
$string['errorbadssphpmetadata'] = 'Invalid SimpleSAMLphp configuration: No Identity Provider metadata configured'; $string['errorbadssphpmetadata'] = 'Invalid SimpleSAMLphp configuration: No Identity Provider metadata configured';
$string['errorbadssphpspentityid'] = 'Invalid Service Provider entityId'; $string['errorbadssphpspentityid'] = 'Invalid Service Provider entityId';
$string['errorextrarequiredfield'] = 'This field is required when "We auto-create users" is enabled';
$string['errorretryexceeded'] = 'Maximum number of retries exceeded (%s): There is a problem with the identity service'; $string['errorretryexceeded'] = 'Maximum number of retries exceeded (%s): There is a problem with the identity service';
$string['errnosamluser'] = 'No user found'; $string['errnosamluser'] = 'No user found';
$string['errorssphpsetup'] = 'SAML is not set up correctly. You Need to run "make ssphp" from the commandline first.'; $string['errorssphpsetup'] = 'SAML is not set up correctly. You Need to run "make ssphp" from the commandline first.';
...@@ -31,8 +32,8 @@ $string['errorbadlib'] = 'The SimpleSAMLPHP library\'s "autoloader" file was not ...@@ -31,8 +32,8 @@ $string['errorbadlib'] = 'The SimpleSAMLPHP library\'s "autoloader" file was not
$string['errorupdatelib'] = 'Your current SimpleSAMLPHP library version is out of date. You need to run "make cleanssphp && make ssphp"'; $string['errorupdatelib'] = 'Your current SimpleSAMLPHP library version is out of date. You need to run "make cleanssphp && make ssphp"';
$string['errornomcrypt'] = 'The PHP library "mcrypt" must be installed for auth/saml. Make sure you install and activate mcrypt, e.g.:<br>sudo apt-get install php5-mcrypt<br>sudo php5enmod mcrypt<br>Then restart your web server.'; $string['errornomcrypt'] = 'The PHP library "mcrypt" must be installed for auth/saml. Make sure you install and activate mcrypt, e.g.:<br>sudo apt-get install php5-mcrypt<br>sudo php5enmod mcrypt<br>Then restart your web server.';
$string['errornomcrypt7php'] = 'The PHP library "mcrypt" must be installed for auth/saml. Make sure you install and activate mcrypt, e.g.:<br>sudo apt-get install php7.0-mcrypt<br>sudo phpenmod mcrypt<br>Then restart your web server.'; $string['errornomcrypt7php'] = 'The PHP library "mcrypt" must be installed for auth/saml. Make sure you install and activate mcrypt, e.g.:<br>sudo apt-get install php7.0-mcrypt<br>sudo phpenmod mcrypt<br>Then restart your web server.';
$string['errornomemcache'] = 'A memcache server is needed for auth/saml. Either list the paths to your memcache servers in the $cfg->memcacheservers config variable or install memcache locally.<br>To install the PHP library "memcache" locally:<br>sudo apt-get install php5-memcache<br>sudo php5enmod memcache<br>Then restart you web server.'; $string['errornomemcache'] = 'Memcache is misconfigured for auth/saml or a memcache server is currently unavailable.';
$string['errornomemcache7php'] = 'A memcache server is needed for auth/saml. Either list the paths to your memcache servers in the $cfg->memcacheservers config variable or install memcache locally.<br>To install the PHP library "memcache" locally:<br>sudo apt-get install php-memcache<br>sudo phpenmod memcache<br>Then restart you web server.'; $string['errornomemcache7php'] = 'Memcache is misconfigured for auth/saml or a memcache server is currently unavailable.';
$string['errorbadconfig'] = 'The SimpleSAMLPHP config directory %s is incorrect.'; $string['errorbadconfig'] = 'The SimpleSAMLPHP config directory %s is incorrect.';
$string['errorbadmetadata'] = 'Badly formed SAML metadata. Ensure XML contains one valid Identity Provider.'; $string['errorbadmetadata'] = 'Badly formed SAML metadata. Ensure XML contains one valid Identity Provider.';
$string['errorbadinstitutioncombo'] = 'There is already an existing authentication instance with this institution attribute and institution value combination.'; $string['errorbadinstitutioncombo'] = 'There is already an existing authentication instance with this institution attribute and institution value combination.';
...@@ -64,7 +65,7 @@ $string['logo'] = 'Logo'; ...@@ -64,7 +65,7 @@ $string['logo'] = 'Logo';
$string['institutionregex'] = 'Do partial string match with institution shortname'; $string['institutionregex'] = 'Do partial string match with institution shortname';
$string['login'] = 'SSO'; $string['login'] = 'SSO';
$string['newidpentity'] = 'Add new Identity Provider'; $string['newidpentity'] = 'Add new Identity Provider';
$string['notusable'] = 'Please install the SimpleSAMLPHP Service Provider libraries'; $string['notusable'] = 'Please install the SimpleSAMLPHP libraries and configure Memcache server for sessions';
$string['obsoletesamlplugin'] = 'The auth/saml plugin needs to be reconfigured. Please update the plugin via the <a href="%s">plugin configuration</a> form.'; $string['obsoletesamlplugin'] = 'The auth/saml plugin needs to be reconfigured. Please update the plugin via the <a href="%s">plugin configuration</a> form.';
$string['obsoletesamlinstance'] = 'The SAML authentication instance <a href="%s">%s</a> for institution "%s" needs updating.'; $string['obsoletesamlinstance'] = 'The SAML authentication instance <a href="%s">%s</a> for institution "%s" needs updating.';
$string['reallyreallysure1'] = "You are trying to save the Service Provider metadata for Mahara. This cannot be undone. Existing SAML logins will not work until you have reshared your new metadata with all Identity Providers."; $string['reallyreallysure1'] = "You are trying to save the Service Provider metadata for Mahara. This cannot be undone. Existing SAML logins will not work until you have reshared your new metadata with all Identity Providers.";
......
<!-- @license http://www.gnu.org/copyleft/gpl.html GNU GPL version 3 or later -->
<!-- @copyright For copyright information on Mahara, please see the README file distributed with this software. -->
<h3>SAML 2.0 field for email</h3>
<p>Enter the name of the attribute passed by the Identity Provider (IdP)
that contains the user's student ID.</p>
...@@ -568,7 +568,7 @@ class PluginAuthSaml extends PluginAuth { ...@@ -568,7 +568,7 @@ class PluginAuthSaml extends PluginAuth {
$libchecks .= '<li>' . get_string_php_version('errornomcrypt', 'auth.saml') . '</li>'; $libchecks .= '<li>' . get_string_php_version('errornomcrypt', 'auth.saml') . '</li>';
} }
// Make sure the simplesamlphp files have been installed via 'make ssphp' // Make sure the simplesamlphp files have been installed via 'make ssphp'
if (!file_exists(get_config('docroot') .'auth/saml/extlib/simplesamlphp/vendor/autoload.php')) { if (!self::is_simplesamlphp_installed()) {
$libchecks .= '<li>' . get_string('errorbadlib', 'auth.saml', get_config('docroot') .'auth/saml/extlib/simplesamlphp/vendor/autoload.php') . '</li>'; $libchecks .= '<li>' . get_string('errorbadlib', 'auth.saml', get_config('docroot') .'auth/saml/extlib/simplesamlphp/vendor/autoload.php') . '</li>';
} }
else { else {
...@@ -583,8 +583,7 @@ class PluginAuthSaml extends PluginAuth { ...@@ -583,8 +583,7 @@ class PluginAuthSaml extends PluginAuth {
} }
} }
// Make sure we can use 'memcache' with simplesamlphp as 'phpsession' doesn't work correctly in many situations // Make sure we can use 'memcache' with simplesamlphp as 'phpsession' doesn't work correctly in many situations
$memcacheservers_config = get_config('memcacheservers'); if (!self::is_memcache_configured()) {
if (empty($memcacheservers_config) && !extension_loaded('memcache')) {
$libchecks .= '<li>' . get_string_php_version('errornomemcache', 'auth.saml') . '</li>'; $libchecks .= '<li>' . get_string_php_version('errornomemcache', 'auth.saml') . '</li>';
} }
if (!empty($libchecks)) { if (!empty($libchecks)) {
...@@ -624,10 +623,73 @@ class PluginAuthSaml extends PluginAuth { ...@@ -624,10 +623,73 @@ class PluginAuthSaml extends PluginAuth {
} }
public static function is_usable() { public static function is_usable() {
// would be good to be able to detect SimpleSAMLPHP libraries if (!self::is_simplesamlphp_installed()) {
return false;
}
if (empty(get_config('ssphpsessionhandler'))) {
return self::is_memcache_configured();
}
return true; return true;
} }
public static function is_simplesamlphp_installed() {
return file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
}
public static function init_simplesamlphp() {
if (!self::is_simplesamlphp_installed()) {
throw new AuthInstanceException(get_string('errorbadlib', 'auth.saml', get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php'));
}
require_once(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
require_once(get_config('docroot') . 'auth/saml/extlib/_autoload.php');
SimpleSAML_Configuration::init(get_config('docroot') . 'auth/saml/config');
}
public static function is_memcache_configured() {
$is_configured = false;
if (extension_loaded('memcache')) {
foreach (self::get_memcache_servers() as $server) {
$memcache = new Memcache;
if (!empty($server['hostname']) && !empty($server['port'])) {
if ($memcache->connect($server['hostname'], $server['port'])) {
$is_configured = true;
break;
}
}
}
}
return $is_configured;
}
public static function get_memcache_servers() {
$memcache_servers = array();
$servers = get_config('memcacheservers');
if (empty($servers)) {
$servers = 'localhost';
}
$servers = explode(',', $servers);
foreach ($servers as $server) {
$url = parse_url($server);
$host = !empty($url['host']) ? $url['host'] : $url['path'];
$port = !empty($url['port']) ? $url['port'] : 11211;
$memcache_servers[] = array('hostname' => $host, 'port' => $port);
}
return $memcache_servers;
}
public static function get_idps($xml) { public static function get_idps($xml) {
$xml = new SimpleXMLElement($xml); $xml = new SimpleXMLElement($xml);
$xml->registerXPathNamespace('md', 'urn:oasis:names:tc:SAML:2.0:metadata'); $xml->registerXPathNamespace('md', 'urn:oasis:names:tc:SAML:2.0:metadata');
...@@ -645,9 +707,7 @@ class PluginAuthSaml extends PluginAuth { ...@@ -645,9 +707,7 @@ class PluginAuthSaml extends PluginAuth {
if (empty($lang)) { if (empty($lang)) {
$lang = current_language(); $lang = current_language();
} }
require_once(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php'); PluginAuthSaml::init_simplesamlphp();
require_once(get_config('docroot') . 'auth/saml/extlib/_autoload.php');
SimpleSAML_Configuration::init(get_config('docroot') . 'auth/saml/config');
$discoHandler = new PluginAuthSaml_IdPDisco(array('saml20-idp-remote', 'shib13-idp-remote'), 'saml'); $discoHandler = new PluginAuthSaml_IdPDisco(array('saml20-idp-remote', 'shib13-idp-remote'), 'saml');
$disco = $discoHandler->getTheIdPs(); $disco = $discoHandler->getTheIdPs();
if (count($disco['list']) > 0) { if (count($disco['list']) > 0) {
...@@ -947,6 +1007,17 @@ EOF; ...@@ -947,6 +1007,17 @@ EOF;
if ((!$values['remoteuser']) && ($values['weautocreateusers']) && ($institutions = get_column('institution', 'name', 'registerallowed', '1'))) { if ((!$values['remoteuser']) && ($values['weautocreateusers']) && ($institutions = get_column('institution', 'name', 'registerallowed', '1'))) {
$form->set_error('weautocreateusers', get_string('errorregistrationenabledwithautocreate1', 'auth.saml')); $form->set_error('weautocreateusers', get_string('errorregistrationenabledwithautocreate1', 'auth.saml'));
} }
// If enabled "We auto-create users" check that all required fields for that are set.
if ($values['weautocreateusers']) {
$required= array('firstnamefield', 'surnamefield', 'emailfield');
foreach ($required as $required_field) {
if (empty($values[$required_field])) {
$form->set_error($required_field, get_string('errorextrarequiredfield', 'auth.saml'));
}
}
}
$dup = get_records_sql_array('SELECT COUNT(instance) AS instance FROM {auth_instance_config} $dup = get_records_sql_array('SELECT COUNT(instance) AS instance FROM {auth_instance_config}
WHERE ((field = \'institutionattribute\' AND value = ?) OR WHERE ((field = \'institutionattribute\' AND value = ?) OR
(field = \'institutionvalue\' AND value = ?)) AND (field = \'institutionvalue\' AND value = ?)) AND
...@@ -1134,7 +1205,6 @@ if (file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/lib/Simp ...@@ -1134,7 +1205,6 @@ if (file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/lib/Simp
// initialize standard classes // initialize standard classes
$this->config = SimpleSAML_Configuration::getInstance(); $this->config = SimpleSAML_Configuration::getInstance();
$this->metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler(); $this->metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler();
$this->session = SimpleSAML_Session::getSessionFromRequest();
$this->instance = $instance; $this->instance = $instance;
$this->metadataSets = $metadataSets; $this->metadataSets = $metadataSets;
$this->isPassive = false; $this->isPassive = false;
......
...@@ -44,11 +44,6 @@ if (!extension_loaded('mcrypt')) { ...@@ -44,11 +44,6 @@ if (!extension_loaded('mcrypt')) {
throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml')); throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml'));
} }
if (!file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php')) { PluginAuthSaml::init_simplesamlphp();
throw new AuthInstanceException(get_string('errorbadlib', 'auth.saml', get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php'));
}
require_once(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
require_once(get_config('docroot') . 'auth/saml/extlib/_autoload.php');
SimpleSAML_Configuration::init(get_config('docroot') . 'auth/saml/config');
require('../extlib/simplesamlphp/modules/saml/www/disco.php'); require('../extlib/simplesamlphp/modules/saml/www/disco.php');
...@@ -45,17 +45,7 @@ if (!extension_loaded('mcrypt')) { ...@@ -45,17 +45,7 @@ if (!extension_loaded('mcrypt')) {
throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml')); throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml'));
} }
if (!file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php')) { PluginAuthSaml::init_simplesamlphp();
throw new AuthInstanceException(get_string('errorbadlib', 'auth.saml', get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php'));
}
require_once(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
require_once(get_config('docroot') . 'auth/saml/extlib/_autoload.php');
// get all the things that we will need from the SAML authentication
// and then shutdown the session control
// echo $samlconfig;
// die();
SimpleSAML_Configuration::init(get_config('docroot') . 'auth/saml/config');
$config = SimpleSAML_Configuration::getInstance(); $config = SimpleSAML_Configuration::getInstance();
if ($config->getBoolean('admin.protectmetadata', false)) { if ($config->getBoolean('admin.protectmetadata', false)) {
......
...@@ -44,11 +44,6 @@ if (!extension_loaded('mcrypt')) { ...@@ -44,11 +44,6 @@ if (!extension_loaded('mcrypt')) {
throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml')); throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml'));
} }
if (!file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php')) { PluginAuthSaml::init_simplesamlphp();
throw new AuthInstanceException(get_string('errorbadlib', 'auth.saml', get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php'));
}
require_once(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
require_once(get_config('docroot') . 'auth/saml/extlib/_autoload.php');
SimpleSAML_Configuration::init(get_config('docroot') . 'auth/saml/config');
require('../extlib/simplesamlphp/modules/saml/www/sp/saml1-acs.php'); require('../extlib/simplesamlphp/modules/saml/www/sp/saml1-acs.php');
...@@ -44,11 +44,6 @@ if (!extension_loaded('mcrypt')) { ...@@ -44,11 +44,6 @@ if (!extension_loaded('mcrypt')) {
throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml')); throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml'));
} }
if (!file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php')) { PluginAuthSaml::init_simplesamlphp();
throw new AuthInstanceException(get_string('errorbadlib', 'auth.saml', get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php'));
}
require_once(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
require_once(get_config('docroot') . 'auth/saml/extlib/_autoload.php');
SimpleSAML_Configuration::init(get_config('docroot') . 'auth/saml/config');
require('../extlib/simplesamlphp/modules/saml/www/sp/saml2-acs.php'); require('../extlib/simplesamlphp/modules/saml/www/sp/saml2-acs.php');
...@@ -44,12 +44,7 @@ if (!extension_loaded('mcrypt')) { ...@@ -44,12 +44,7 @@ if (!extension_loaded('mcrypt')) {
throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml')); throw new AuthInstanceException(get_string_php_version('errornomcrypt', 'auth.saml'));
} }
if (!file_exists(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php')) { PluginAuthSaml::init_simplesamlphp();
throw new AuthInstanceException(get_string('errorbadlib', 'auth.saml', get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php'));
}
require_once(get_config('docroot') . 'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
require_once(get_config('docroot') . 'auth/saml/extlib/_autoload.php');
SimpleSAML_Configuration::init(get_config('docroot') . 'auth/saml/config');
// Bug #1693426: destroy mahara session when Single Logout is initiated by IdP // Bug #1693426: destroy mahara session when Single Logout is initiated by IdP
if ($USER->is_logged_in()) { if ($USER->is_logged_in()) {
......
...@@ -716,6 +716,13 @@ $cfg->passwordsaltalt1 = 'old salt value'; ...@@ -716,6 +716,13 @@ $cfg->passwordsaltalt1 = 'old salt value';
*/ */
$cfg->openbadgedisplayer_source = '{"backpack":"https://backpack.openbadges.org/","passport":"https://openbadgepassport.com/"}'; $cfg->openbadgedisplayer_source = '{"backpack":"https://backpack.openbadges.org/","passport":"https://openbadgepassport.com/"}';
/**
* @global string $cfg->memcacheservers
* A comma separated list of memcache servers to store user sessions for SimpleSAMLphp.
* localhost:11211 will be used by default.
*/
// $cfg->memcacheservers = 'hostname1:port1,hostname2:port2,hostname3:port3';
/** /**
* @global string $cfg->ssphpsessionhandler * @global string $cfg->ssphpsessionhandler
* An alternative session handler for SimpleSAMLphp if you do not wish to use memcache. * An alternative session handler for SimpleSAMLphp if you do not wish to use memcache.
...@@ -723,7 +730,6 @@ $cfg->openbadgedisplayer_source = '{"backpack":"https://backpack.openbadges.org/ ...@@ -723,7 +730,6 @@ $cfg->openbadgedisplayer_source = '{"backpack":"https://backpack.openbadges.org/
*/ */
// $cfg->ssphpsessionhandler = 'memcached'; // $cfg->ssphpsessionhandler = 'memcached';
/** /**
* @global array $cfg->saml_custommappingfile * @global array $cfg->saml_custommappingfile
* A list of paths to custom attribute mapping files for SimpleSAMLphp IDP and SP * A list of paths to custom attribute mapping files for SimpleSAMLphp IDP and SP
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment