From a8868de361d8af6fb577a643c99ffb9236266f35 Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Sun, 23 Sep 2012 17:59:14 +0000 Subject: [PATCH] suggest free user name in file upload if already exists --- lam/lib/modules/posixAccount.inc | 110 ++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 38 deletions(-) diff --git a/lam/lib/modules/posixAccount.inc b/lam/lib/modules/posixAccount.inc index 10523efd..f4a599c0 100644 --- a/lam/lib/modules/posixAccount.inc +++ b/lam/lib/modules/posixAccount.inc @@ -102,8 +102,8 @@ class posixAccount extends baseModule implements passwordService { $this->messages['uid'][6] = array('WARN', _('Host name'), _('Host name in use. Selected next free host name.')); $this->messages['uid'][7] = array('ERROR', _('Account %s:') . ' posixAccount_userName', _('User name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !')); $this->messages['uid'][8] = array('ERROR', _('Account %s:') . ' posixAccount_hostName', _('Host name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !')); - $this->messages['uid'][9] = array('ERROR', _('Account %s:') . ' posixAccount_userName', _('User name already exists!')); - $this->messages['uid'][10] = array('ERROR', _('Account %s:') . ' posixAccount_hostName', _('Host name already exists!')); + $this->messages['uid'][9] = array('ERROR', _('Account %s:') . ' posixAccount_userName', _('User name already exists!') . ' ' . _('You might want to use %s instead of %s.')); + $this->messages['uid'][10] = array('ERROR', _('Account %s:') . ' posixAccount_hostName', _('Host name already exists!') . ' ' . _('You might want to use %s instead of %s.')); $this->messages['gidNumber'][0] = array('ERROR', _('Account %s:') . ' posixAccount_group', _('LAM was unable to find a group with this name!')); $this->messages['gidNumber'][1] = array('ERROR', _('Account %s:') . ' posixAccount_group', _('This GID number is invalid! Please provide either a number or a group name.')); $this->messages['gidNumber'][2] = array('INFO', _('GID number'), _('GID number has changed. To keep file ownership you have to run the following command as root: \'find / -gid %s -uid %s -exec chgrp %s {} \;\'')); @@ -882,39 +882,7 @@ class posixAccount extends baseModule implements passwordService { else { // Change uid to a new uid until a free uid is found while ($this->userNameExists($this->attributes['uid'][0])) { - if ($this->get_scope()=='host') $this->attributes['uid'][0] = substr($this->attributes['uid'][0], 0, -1); - // get last character of username - $lastchar = substr($this->attributes['uid'][0], strlen($this->attributes['uid'][0])-1, 1); - // Last character is no number - if ( !preg_match('/^([0-9])+$/', $lastchar)) { - // Last character is no number. Therefore we only have to add "2" to it. - if ($this->get_scope()=='host') { - $this->attributes['uid'][0] = $this->attributes['uid'][0] . '2$'; - } - else { - $this->attributes['uid'][0] = $this->attributes['uid'][0] . '2'; - } - } - else { - /* Last character is a number -> we have to increase the number until we've - * found a groupname with trailing number which is not in use. - * - * $i will show us were we have to split groupname so we get a part - * with the groupname and a part with the trailing number - */ - $i=strlen($this->attributes['uid'][0])-1; - $mark = false; - // Set $i to the last character which is a number in $account_new->general_username - while (!$mark) - if (preg_match('/^([0-9])+$/',substr($this->attributes['uid'][0], $i, strlen($this->attributes['uid'][0])-$i))) $i--; - else $mark=true; - // increase last number with one - $firstchars = substr($this->attributes['uid'][0], 0, $i+1); - $lastchars = substr($this->attributes['uid'][0], $i+1, strlen($this->attributes['uid'][0])-$i); - // Put username together - if ($this->get_scope()=='host') $this->attributes['uid'][0] = $firstchars . (intval($lastchars)+1)."$"; - else $this->attributes['uid'][0] = $firstchars . (intval($lastchars)+1); - } + $this->attributes['uid'][0] = $this->getNextUserName($this->attributes['uid'][0]); } } // Show warning if LAM has changed username @@ -1730,8 +1698,12 @@ class posixAccount extends baseModule implements passwordService { } // user name if (in_array($rawAccounts[$i][$ids['posixAccount_userName']], $existingUsers)) { + $userName = $rawAccounts[$i][$ids['posixAccount_userName']]; + while (in_array($userName, $existingUsers)) { + $userName = $this->getNextUserName($userName); + } $errMsg = $this->messages['uid'][9]; - array_push($errMsg, array($i)); + array_push($errMsg, array($i, $userName, $rawAccounts[$i][$ids['posixAccount_userName']])); $errors[] = $errMsg; } elseif (get_preg($rawAccounts[$i][$ids['posixAccount_userName']], 'username')) { @@ -1817,8 +1789,12 @@ class posixAccount extends baseModule implements passwordService { elseif ($this->get_scope() == 'host') { // host name if (in_array($rawAccounts[$i][$ids['posixAccount_hostName']], $existingUsers)) { + $userName = $rawAccounts[$i][$ids['posixAccount_hostName']]; + while (in_array($userName, $existingUsers)) { + $userName = $this->getNextUserName($userName); + } $errMsg = $this->messages['uid'][10]; - array_push($errMsg, array($i)); + array_push($errMsg, array($i, $userName, $rawAccounts[$i][$ids['posixAccount_hostName']])); $errors[] = $errMsg; } elseif (get_preg($rawAccounts[$i][$ids['posixAccount_hostName']], 'hostname')) { @@ -1831,7 +1807,7 @@ class posixAccount extends baseModule implements passwordService { $errors[] = $errMsg; } // description - if ($rawAccounts[$i][$ids['posixAccount_description']] && ($rawAccounts[$i][$ids['posixAccount_description']] != '')) { + if (isset($ids['posixAccount_description']) && isset($rawAccounts[$i][$ids['posixAccount_description']]) && ($rawAccounts[$i][$ids['posixAccount_description']] != '')) { $partialAccounts[$i]['description'] = $rawAccounts[$i][$ids['posixAccount_description']]; } else { @@ -2553,6 +2529,64 @@ class posixAccount extends baseModule implements passwordService { $this->gonList = array(); } + /** + * Returns the next possible user name based on the given one. + * If the user name does not end with a number then a "2" is added. + * User names with numbers at the end are simply increased by one. + *
+ *
Attention: This user name might still be in use. This needs to be checked separately. + * + * @param String $userName user name + * @return String new user name + */ + protected function getNextUserName($userName) { + if ($this->get_scope()=='host') { + $userName = substr($userName, 0, -1); + } + // get last character of username + $lastchar = substr($userName, strlen($userName) - 1, 1); + // Last character is no number + if ( !preg_match('/^([0-9])+$/', $lastchar)) { + // Last character is no number. Therefore we only have to add "2" to it. + if ($this->get_scope()=='host') { + $userName = $userName . '2$'; + } + else { + $userName = $userName . '2'; + } + } + else { + /* Last character is a number -> we have to increase the number until we've + * found a groupname with trailing number which is not in use. + * + * $i will show us were we have to split groupname so we get a part + * with the groupname and a part with the trailing number + */ + $i = strlen($userName) - 1; + $mark = false; + // Set $i to the last character which is a number in $account_new->general_username + while (!$mark) { + if (preg_match('/^([0-9])+$/', substr($userName, $i, strlen($userName) - $i))) { + $i--; + } + else { + $mark=true; + } + } + // increase last number with one + $firstchars = substr($userName, 0, $i + 1); + $lastchars = substr($userName, $i + 1, strlen($userName) - $i); + // Put username together + if ($this->get_scope()=='host') { + $userName = $firstchars . (intval($lastchars) + 1) . "$"; + } + else { + $userName = $firstchars . (intval($lastchars) + 1); + } + } + return $userName; + } + } ?>