Skip to content

Commit

Permalink
Reworked external user name creation (data protection)
Browse files Browse the repository at this point in the history
  • Loading branch information
Fred Neumann committed Mar 12, 2020
1 parent b3a18e4 commit 40265b4
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 16 deletions.
12 changes: 6 additions & 6 deletions classes/class.ilVhbShibAuthConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,18 @@ public function __construct($a_plugin_object)
);

$params[] = ilVhbShibAuthParam::_create(
'external_user_take_login',
'Lange vhb-Kennung als Login für externe Benutzer',
'Externe Benutzer sollen mit der kompletten vhb-Benutzerkenung als Login-Name angelegt werden. Im Standard wird ein Login-Name generiert.'
. '<br />Die vhb-Benutzerkennung hat die Form "[email protected]".',
ilVhbShibAuthParam::TYPE_BOOLEAN
'external_user_login_prefix',
'Login-Präfix für externe Benutzer',
'Externe Benutzer sollen mit diesem Präfix und einer anonymen Nummmer als Login-Name angelegt werden. Das entspricht dem Verfahren der alten vhb-Schnittstelle. Wenn das Feld leer ist ein Login-Name aus Vor- und Nachname generiert.',
ilVhbShibAuthParam::TYPE_TEXT,
'vhb.'
);

$params[] = ilVhbShibAuthParam::_create(
'external_user_matrikulation',
'Kurze vhb-Kennung als Matrikelnummer für externe Benutzer',
'Für externe Benutzer wird die kurze vhb-Kennung ohne Suffix, also z.B. "123457X25" als Matrikelnummer eingetragen.'
. '<br />Das entspricht dem Verfahren der alten vhb-Schnitstelle.',
. '<br />Das entspricht dem Verfahren der alten vhb-Schnittstelle.',
ilVhbShibAuthParam::TYPE_BOOLEAN
);

Expand Down
48 changes: 38 additions & 10 deletions classes/class.ilVhbShibAuthUser.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,8 @@ public function createFields()
{
parent::createFields();

$this->setLogin($this->returnNewLoginName());
$this->setExternalAccount($this->returnNewExtAccount());
$this->setAuthMode($this->returnNewAuthMode());

$this->setMatriculation($this->shibServerData->getMatriculation());
}

Expand All @@ -98,11 +96,14 @@ public function updateFields()
*/
public function create()
{
if ($this->hasToBeCreated) {
return parent::create();
if ($this->hasToBeCreated) {
parent::create();
$this->updateLoginName();
return $this->getId();
}
else {
return parent::update();
parent::update();
return $this->getId();
}
}

Expand All @@ -116,6 +117,7 @@ public function update() {
if ($this->hasToBeCreated) {
// do things normally done in ilAuthProviderShibboleth::doAuthentication when account is created
parent::create();
$this->updateLoginName();
$this->updateOwner();
$this->saveAsNew();
$this->writePrefs();
Expand Down Expand Up @@ -175,16 +177,42 @@ protected function getMatchingUserId()
*/
protected function returnNewLoginName()
{
global $DIC;
$ilDB = $DIC->database();

if ($this->shibServerData->isLocalUser() && $this->config->get('local_user_take_login')) {
return $this->getUniqueLoginName($this->shibServerData->getLocalUserName());
}
if (!$this->shibServerData->isLocalUser() && $this->config->get('external_user_take_login')) {
return $this->getUniqueLoginName($this->shibServerData->getLogin());
if (!$this->shibServerData->isLocalUser() && $this->config->get('external_user_login_prefix')) {
// This may be identical to the created usr_id but does not need
// updateLoginName() handle this after the user is created
$number = $ilDB->nextId('object_data') + 1;
$login = $this->config->get('external_user_login_prefix') . $number;
return $this->getUniqueLoginName($login);
}

return parent::returnNewLoginName();
}

/**
* Update the login name if it should match the
*/
protected function updateLoginName()
{
global $DIC;
$ilDB = $DIC->database();

$prefix = $this->config->get('external_user_login_prefix');
if (!$this->shibServerData->isLocalUser() && !empty($prefix) && $this->getLogin() != $prefix . $this->getId()) {
$this->setLogin($this->getUniqueLoginName($prefix . $this->getId()));
$ilDB->manipulateF('
UPDATE usr_data
SET login = %s
WHERE usr_id = %s',
array('text', 'integer'), array($this->getLogin(), $this->getId()));
}
}

/**
* Return the external account value for new users
* This should be compatible to the search condition in getMatchingUserId()
Expand Down Expand Up @@ -221,10 +249,10 @@ protected function returnNewAuthMode()
*/
protected function getUniqueLoginName($login)
{
$appendix = null;
$login_tmp = $login;
$appendix = 1;
$login_base = $login;
while (self::_loginExists($login, $this->getId())) {
$login = $login_tmp . $appendix;
$login = $login_base . '.' .$appendix;
$appendix ++;
}
return $login;
Expand Down

0 comments on commit 40265b4

Please sign in to comment.