52 parent::__construct($metadataSets,
$instance);
56 $this->cdcDomain = $this->discoconfig->getString(
'cdc.domain', null);
57 if ($this->cdcDomain !== null && $this->cdcDomain[0] !==
'.') {
59 $this->cdcDomain =
'.'.$this->cdcDomain;
62 $this->cdcLifetime = $this->discoconfig->getInteger(
'cdc.lifetime', null);
92 if (isset($a[
'name'][
'en']) && isset($b[
'name'][
'en'])) {
93 return strcasecmp($a[
'name'][
'en'], $b[
'name'][
'en']);
94 } elseif (isset($a[
'name'][
'en'])) {
96 } elseif (isset($b[
'name'][
'en'])) {
99 return strcasecmp($a[
'entityid'], $b[
'entityid']);
115 $order = $this->discoconfig->getValue(
'taborder');
116 if (is_array($order)) {
117 foreach ($order as $oe) {
122 $enableTabs = $this->discoconfig->getValue(
'tabs', null);
126 if (array_key_exists(
'tags', $val)) {
127 $tags = $val[
'tags'];
130 if (!empty($enableTabs) && !in_array($tag, $enableTabs,
true)) {
138 uasort(
$slist[
$tab],
array(
'sspmod_discopower_PowerIdPDisco',
'mcmp'));
156 if (in_array($entry[
'entityid'], $filter[
'entities.include'],
true)) {
159 if (in_array($entry[
'entityid'], $filter[
'entities.exclude'],
true)) {
163 if (array_key_exists(
'tags', $entry)) {
164 foreach ($filter[
'tags.include'] as $fe) {
165 if (in_array($fe, $entry[
'tags'],
true)) {
169 foreach ($filter[
'tags.exclude'] as $fe) {
170 if (in_array($fe, $entry[
'tags'],
true)) {
192 $spmd = $this->metadata->getMetaData($this->spEntityId,
'saml20-sp-remote');
200 if (!array_key_exists(
'discopower.filter',
$spmd)) {
203 $filter =
$spmd[
'discopower.filter'];
205 if (!array_key_exists(
'entities.include', $filter)) {
206 $filter[
'entities.include'] =
array();
208 if (!array_key_exists(
'entities.exclude', $filter)) {
209 $filter[
'entities.exclude'] =
array();
211 if (!array_key_exists(
'tags.include', $filter)) {
212 $filter[
'tags.include'] =
array();
214 if (!array_key_exists(
'tags.exclude', $filter)) {
215 $filter[
'tags.exclude'] =
array();
219 if (array_key_exists(
'entities.include',
$spmd[
'discopower.filter']) ||
220 array_key_exists(
'tags.include',
$spmd[
'discopower.filter'])
223 $defaultrule =
false;
226 $returnlist =
array();
229 $returnlist[
$key] = $entry;
251 if (!empty($preferredIdP) && array_key_exists($preferredIdP,
$slist)) {
252 $faventry =
$slist[$preferredIdP];
257 $discoPowerTabs =
array(
258 'denmark' =>
$t->noop(
'{discopower:tabs:denmark}'),
259 'edugain' =>
$t->noop(
'{discopower:tabs:edugain}'),
260 'finland' =>
$t->noop(
'{discopower:tabs:finland}'),
261 'greece' =>
$t->noop(
'{discopower:tabs:greece}'),
262 'southafrica' =>
$t->noop(
'{discopower:tabs:southafrica}'),
263 'iceland' =>
$t->noop(
'{discopower:tabs:iceland}'),
264 'incommon' =>
$t->noop(
'{discopower:tabs:incommon}'),
265 'kalmar' =>
$t->noop(
'{discopower:tabs:kalmar}'),
266 'misc' =>
$t->noop(
'{discopower:tabs:misc}'),
267 'norway' =>
$t->noop(
'{discopower:tabs:norway}'),
268 'sweden' =>
$t->noop(
'{discopower:tabs:sweden}'),
269 'switzerland' =>
$t->noop(
'{discopower:tabs:switzerland}'),
270 'ukacessfederation' =>
$t->noop(
'{discopower:tabs:ukacessfederation}'),
272 $t->data[
'faventry'] = $faventry;
273 $t->data[
'tabNames'] = $discoPowerTabs;
274 $t->data[
'idplist'] = $idpList;
275 $t->data[
'preferredidp'] = $preferredIdP;
279 $t->data[
'urlpattern'] = htmlspecialchars(\
SimpleSAML\Utils\HTTP::getSelfURLNoQuery());
280 $t->data[
'rememberenabled'] = $this->config->getBoolean(
'idpdisco.enableremember',
false);
281 $t->data[
'rememberchecked'] = $this->config->getBoolean(
'idpdisco.rememberchecked',
false);
282 $t->data[
'defaulttab'] = $this->discoconfig->getValue(
'defaulttab', 0);
283 $t->data[
'score'] = $this->discoconfig->getValue(
'score',
'quicksilver');
295 if (!isset(
$_COOKIE[
'_saml_idp'])) {
302 $idp = base64_decode($idp);
303 if ($idp ===
false) {
322 assert(
'is_string($idp)');
324 if ($this->cdcDomain === null) {
325 parent::setPreviousIdP(
$idp);
331 $prevIndex = array_search(
$idp,
$list,
true);
332 if ($prevIndex !==
false) {
333 unset(
$list[$prevIndex]);
337 foreach (
$list as &$value) {
338 $value = base64_encode($value);
340 $newCookie = implode(
' ',
$list);
342 while (strlen($newCookie) > 4000) {
344 $tmp = explode(
' ', $newCookie, 2);
345 if (count($tmp) === 1) {
349 $newCookie = $tmp[1];
353 'lifetime' => $this->cdcLifetime,
354 'domain' => $this->cdcDomain,
371 if ($this->cdcDomain === null) {
372 return parent::getPreviousIdP();
375 $prevIdPs = $this->
getCDC();
376 while (count($prevIdPs) > 0) {
377 $idp = array_pop($prevIdPs);
idplistStructured($list)
Structure the list of IdPs in a hierarchy based upon the tags.
setPreviousIdP($idp)
Save the current IdP choice to a cookie.
if(isset($_REQUEST['delete'])) $list
start()
Check if an IdP is set or if the request is passive, and redirect accordingly.
handleRequest()
Handles a request to this discovery service.
getCDC()
Get the IdP entities saved in the common domain cookie.
Attribute-related utility methods.
catch(Exception $e) $message
static setCookie($name, $value, $params=null, $throw=true)
Set a cookie.
__construct(array $metadataSets, $instance)
Initializes this discovery service.
getIdPList()
Retrieve the list of IdPs which are stored in the metadata.
log($message)
Log a message.
filterList($list)
Filter a list of entities according to any filters defined in the parent class, plus discopower confi...
static getConfig($filename='config.php', $configSet='simplesaml')
Load a configuration file from a configuration set.
Create styles array
The data for the language used.
getPreviousIdP()
Retrieve the previous IdP the user used.
getRecommendedIdP()
Try to determine which IdP the user should most likely use.
processFilter($filter, $entry, $default=true)
Do the actual filtering according the rules defined.
static mcmp(array $a, array $b)
Compare two entities.
validateIdP($idp)
Validates the given IdP entity id.
if(function_exists('posix_getuid') &&posix_getuid()===0) if(!array_key_exists('t', $options)) $tag