Skip to content
Snippets Groups Projects
Unverified Commit bb2b7ee9 authored by Tim van Dijen's avatar Tim van Dijen Committed by GitHub
Browse files

Merge pull request #867 from tvdijen/master

smartattributes: fix bug
parents 8f5795f1 810e11de
No related branches found
No related tags found
No related merge requests found
<?php <?php
class sspmod_smartattributes_Auth_Process_SmartID extends SimpleSAML_Auth_ProcessingFilter { class sspmod_smartattributes_Auth_Process_SmartID extends SimpleSAML_Auth_ProcessingFilter
{
/** /**
* Which attributes to use as identifiers? * Which attributes to use as identifiers?
* *
* IMPORTANT: If you use the (default) attributemaps (twitter2name, facebook2name, * IMPORTANT: If you use the (default) attributemaps (twitter2name, facebook2name,
* etc., be sure to comment out the entries that map xxx_targetedID to * etc., be sure to comment out the entries that map xxx_targetedID to
* eduPersonTargetedID, or there will be no way to see its origin any more. * eduPersonTargetedID, or there will be no way to see its origin any more.
*/ */
private $_candidates = array( private $_candidates = array(
'eduPersonTargetedID', 'eduPersonTargetedID',
'eduPersonPrincipalName', 'eduPersonPrincipalName',
'openid', 'openid',
'facebook_targetedID', 'facebook_targetedID',
'twitter_targetedID', 'twitter_targetedID',
'windowslive_targetedID', 'windowslive_targetedID',
'linkedin_targetedID', 'linkedin_targetedID',
); );
/** /**
* The name of the generated ID attribute. * The name of the generated ID attribute.
*/ */
private $_id_attribute = 'smart_id'; private $_id_attribute = 'smart_id';
/** /**
* Whether to append the AuthenticatingAuthority, separated by '!' * Whether to append the AuthenticatingAuthority, separated by '!'
* This only works when SSP is used as a gateway. * This only works when SSP is used as a gateway.
*/ */
private $_add_authority = true; private $_add_authority = true;
/** /**
* Whether to prepend the CandidateID, separated by ':' * Whether to prepend the CandidateID, separated by ':'
*/ */
private $_add_candidate = true; private $_add_candidate = true;
/** /**
* Attributes which should be added/appended. * Attributes which should be added/appended.
* *
* Associative array of arrays. * Associative array of arrays.
*/ */
private $attributes = array(); private $attributes = array();
public function __construct($config, $reserved) { public function __construct($config, $reserved)
parent::__construct($config, $reserved); {
parent::__construct($config, $reserved);
assert(is_array($config));
assert(is_array($config));
if (array_key_exists('candidates', $config)) {
$this->_candidates = $config['candidates']; if (array_key_exists('candidates', $config)) {
if (!is_array($this->_candidates)) { $this->_candidates = $config['candidates'];
throw new Exception('SmartID authproc configuration error: \'candidates\' should be an array.'); if (!is_array($this->_candidates)) {
} throw new Exception('SmartID authproc configuration error: \'candidates\' should be an array.');
} }
}
if (array_key_exists('id_attribute', $config)) {
$this->_id_attribute = $config['id_attribute']; if (array_key_exists('id_attribute', $config)) {
if (!is_string($this->_id_attribute)) { $this->_id_attribute = $config['id_attribute'];
throw new Exception('SmartID authproc configuration error: \'id_attribute\' should be a string.'); if (!is_string($this->_id_attribute)) {
} throw new Exception('SmartID authproc configuration error: \'id_attribute\' should be a string.');
} }
}
if (array_key_exists('add_authority', $config)) {
$this->_add_authority = $config['add_authority']; if (array_key_exists('add_authority', $config)) {
if (!is_bool($this->_add_authority)) { $this->_add_authority = $config['add_authority'];
throw new Exception('SmartID authproc configuration error: \'add_authority\' should be a boolean.'); if (!is_bool($this->_add_authority)) {
} throw new Exception('SmartID authproc configuration error: \'add_authority\' should be a boolean.');
} }
}
if (array_key_exists('add_candidate', $config)) {
$this->_add_candidate = $config['add_candidate']; if (array_key_exists('add_candidate', $config)) {
if (!is_bool($this->_add_candidate)) { $this->_add_candidate = $config['add_candidate'];
throw new Exception('SmartID authproc configuration error: \'add_candidate\' should be a boolean.'); if (!is_bool($this->_add_candidate)) {
} throw new Exception('SmartID authproc configuration error: \'add_candidate\' should be a boolean.');
} }
}
} }
private function addID($attributes, $request) { private function addID($attributes, $request)
foreach ($this->_candidates as $idCandidate) { {
if (isset($attributes[$idCandidate][0])) { $state = $request['saml:sp:State'];
if(($this->_add_authority) && (isset($request['saml:AuthenticatingAuthority'][0]))) { foreach ($this->_candidates as $idCandidate) {
return ($this->_add_candidate ? $idCandidate.':' : '').$attributes[$idCandidate][0] . '!' . $request['saml:AuthenticatingAuthority'][0]; if (isset($attributes[$idCandidate][0])) {
} else { if (($this->_add_authority) && (isset($state['saml:AuthenticatingAuthority'][0]))) {
return ($this->_add_candidate ? $idCandidate.':' : '').$attributes[$idCandidate][0]; return ($this->_add_candidate ? $idCandidate.':' : '').$attributes[$idCandidate][0].'!'.$state['saml:AuthenticatingAuthority'][0];
} } else {
} return ($this->_add_candidate ? $idCandidate.':' : '').$attributes[$idCandidate][0];
} }
/* }
* At this stage no usable id_candidate has been detected. }
*/ /*
throw new SimpleSAML_Error_Exception('This service needs at least one of the following * At this stage no usable id_candidate has been detected.
attributes to identity users: '.implode(', ', $this->_candidates).'. Unfortunately not */
one of them was detected. Please ask your institution administrator to release one of throw new SimpleSAML_Error_Exception('This service needs at least one of the following
them, or try using another identity provider.'); attributes to identity users: '.implode(', ', $this->_candidates).'. Unfortunately not
} one of them was detected. Please ask your institution administrator to release one of
them, or try using another identity provider.');
}
/**
* Apply filter to add or replace attributes. /**
* * Apply filter to add or replace attributes.
* Add or replace existing attributes with the configured values. *
* * Add or replace existing attributes with the configured values.
* @param array &$request The current request *
*/ * @param array &$request The current request
public function process(&$request) { */
assert(is_array($request)); public function process(&$request)
assert(array_key_exists('Attributes', $request)); {
assert(is_array($request));
$ID = $this->addID($request['Attributes'], $request); assert(array_key_exists('Attributes', $request));
if(isset($ID)) $request['Attributes'][$this->_id_attribute] = array($ID); $id = $this->addID($request['Attributes'], $request);
}
if (isset($id)) {
$request['Attributes'][$this->_id_attribute] = array($id);
}
}
} }
...@@ -6,71 +6,84 @@ ...@@ -6,71 +6,84 @@
* @author Andreas Åkre Solberg, UNINETT AS. * @author Andreas Åkre Solberg, UNINETT AS.
* @package SimpleSAMLphp * @package SimpleSAMLphp
*/ */
class sspmod_smartattributes_Auth_Process_SmartName extends SimpleSAML_Auth_ProcessingFilter { class sspmod_smartattributes_Auth_Process_SmartName extends SimpleSAML_Auth_ProcessingFilter
{
/**
* Attributes which should be added/appended.
*
* Assiciative array of arrays.
*/
private $attributes = array();
/**
* Attributes which should be added/appended.
*
* Assiciative array of arrays.
*/
private $attributes = array();
private function getFullName($attributes)
{
if (isset($attributes['displayName'])) {
return $attributes['displayName'][0];
}
private function getFullName($attributes) { if (isset($attributes['cn'])) {
if (isset($attributes['displayName'])) if (count(explode(' ', $attributes['cn'][0])) > 1) {
return $attributes['displayName'][0]; return $attributes['cn'][0];
}
if (isset($attributes['cn'])) { }
if (count(explode(' ', $attributes['cn'][0])) > 1)
return $attributes['cn'][0];
}
if (isset($attributes['sn']) && isset($attributes['givenName']))
return $attributes['givenName'][0] . ' ' . $attributes['sn'][0];
if (isset($attributes['cn'])) if (isset($attributes['sn']) && isset($attributes['givenName'])) {
return $attributes['cn'][0]; return $attributes['givenName'][0].' '.$attributes['sn'][0];
}
if (isset($attributes['sn'])) if (isset($attributes['cn'])) {
return $attributes['sn'][0]; return $attributes['cn'][0];
}
if (isset($attributes['givenName'])) if (isset($attributes['sn'])) {
return $attributes['givenName'][0]; return $attributes['sn'][0];
}
if (isset($attributes['eduPersonPrincipalName'])) {
$localname = $this->getLocalUser($attributes['eduPersonPrincipalName'][0]);
if (isset($localname)) return $localname;
}
return NULL;
}
private function getLocalUser($userid) {
if (strpos($userid, '@') === FALSE) return NULL;
$decomposed = explode('@', $userid);
if(count($decomposed) === 2) {
return $decomposed[0];
}
return NULL;
}
/** if (isset($attributes['givenName'])) {
* Apply filter to add or replace attributes. return $attributes['givenName'][0];
* }
* Add or replace existing attributes with the configured values.
*
* @param array &$request The current request
*/
public function process(&$request) {
assert(is_array($request));
assert(array_key_exists('Attributes', $request));
$attributes =& $request['Attributes']; if (isset($attributes['eduPersonPrincipalName'])) {
$localname = $this->getLocalUser($attributes['eduPersonPrincipalName'][0]);
$fullname = $this->getFullName($attributes); if (isset($localname)) {
return $localname;
if(isset($fullname)) $request['Attributes']['smartname-fullname'] = array($fullname); }
}
}
return null;
}
private function getLocalUser($userid)
{
if (strpos($userid, '@') === false) {
return null;
}
$decomposed = explode('@', $userid);
if (count($decomposed) === 2) {
return $decomposed[0];
}
return null;
}
/**
* Apply filter to add or replace attributes.
*
* Add or replace existing attributes with the configured values.
*
* @param array &$request The current request
*/
public function process(&$request)
{
assert(is_array($request));
assert(array_key_exists('Attributes', $request));
$attributes =& $request['Attributes'];
$fullname = $this->getFullName($attributes);
if (isset($fullname)) {
$request['Attributes']['smartname-fullname'] = array($fullname);
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment