expiration date for Windows
This commit is contained in:
parent
89421417fe
commit
54a5672bc2
|
@ -399,6 +399,10 @@ class shadowAccount extends baseModule implements passwordService {
|
|||
$this->getAccountContainer()->getAccountModule('sambaSamAccount')->setExpirationDate(
|
||||
$_POST['shadowExpire_yea'], $_POST['shadowExpire_mon'], $_POST['shadowExpire_day']);
|
||||
}
|
||||
if (isset($_POST['syncWindows']) && ($_POST['syncWindows'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('windowsUser')->setExpirationDate(
|
||||
$_POST['shadowExpire_yea'], $_POST['shadowExpire_mon'], $_POST['shadowExpire_day']);
|
||||
}
|
||||
if (isset($_POST['syncHeimdal']) && ($_POST['syncHeimdal'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('heimdalKerberos')->setExpirationDate(
|
||||
$_POST['shadowExpire_yea'], $_POST['shadowExpire_mon'], $_POST['shadowExpire_day']);
|
||||
|
@ -416,6 +420,10 @@ class shadowAccount extends baseModule implements passwordService {
|
|||
elseif (isset($_POST['form_subpage_shadowAccount_attributes_del'])) {
|
||||
unset($this->attributes['shadowExpire']);
|
||||
// sync other modules
|
||||
if (isset($_POST['syncWindows']) && ($_POST['syncWindows'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('windowsUser')->setExpirationDate(
|
||||
null, null, null);
|
||||
}
|
||||
if (isset($_POST['syncSamba']) && ($_POST['syncSamba'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('sambaSamAccount')->setExpirationDate(
|
||||
null, null, null);
|
||||
|
@ -461,6 +469,9 @@ class shadowAccount extends baseModule implements passwordService {
|
|||
if ($this->getAccountContainer()->getAccountModule('sambaSamAccount') != null) {
|
||||
$return->addElement(new htmlTableExtendedInputCheckbox('syncSamba', false, _('Set also for Samba 3')), true);
|
||||
}
|
||||
if ($this->getAccountContainer()->getAccountModule('windowsUser') != null) {
|
||||
$return->addElement(new htmlTableExtendedInputCheckbox('syncWindows', false, _('Set also for Windows')), true);
|
||||
}
|
||||
if ($this->getAccountContainer()->getAccountModule('heimdalKerberos') != null) {
|
||||
$return->addElement(new htmlTableExtendedInputCheckbox('syncHeimdal', false, _('Set also for Kerberos')), true);
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ class windowsUser extends baseModule implements passwordService {
|
|||
'l', 'mail', 'otherTelephone', 'physicalDeliveryOfficeName', 'postalCode', 'postOfficeBox', 'sn', 'st',
|
||||
'streetAddress', 'telephoneNumber', 'url', 'wWWHomePage', 'userAccountControl', 'profilePath', 'scriptPath',
|
||||
'pwdLastSet', 'otherMailbox', 'homeDirectory', 'homeDrive', 'msSFU30Name', 'msSFU30NisDomain', 'pwdLastSet',
|
||||
'lastLogonTimestamp'
|
||||
'lastLogonTimestamp', 'accountExpires'
|
||||
);
|
||||
// help Entries
|
||||
$return['help'] = array(
|
||||
|
@ -266,6 +266,18 @@ class windowsUser extends baseModule implements passwordService {
|
|||
"Headline" => _('Last login'), 'attr' => 'lastLogonTimestamp',
|
||||
"Text" => _('Time of user\'s last login.')
|
||||
),
|
||||
'accountExpires' => array(
|
||||
"Headline" => _('Account expiration date'), 'attr' => 'accountExpires',
|
||||
"Text" => _('This is the date when the account will expire.')
|
||||
),
|
||||
'accountExpiresUpload' => array(
|
||||
"Headline" => _('Account expiration date'), 'attr' => 'accountExpires',
|
||||
"Text" => _('This is the date when the account will expire. Format: DD-MM-YYYY')
|
||||
),
|
||||
'accountExpiresProfile' => array(
|
||||
"Headline" => _('Account expiration'), 'attr' => 'accountExpires',
|
||||
"Text" => _('Number of days after which the account will expire.')
|
||||
),
|
||||
);
|
||||
// upload fields
|
||||
$return['upload_columns'] = array(
|
||||
|
@ -407,6 +419,12 @@ class windowsUser extends baseModule implements passwordService {
|
|||
'default' => _('no'),
|
||||
'values' => _('yes') . ', ' . _('no')
|
||||
),
|
||||
array(
|
||||
'name' => 'windowsUser_accountExpires',
|
||||
'description' => _('Account expiration date'),
|
||||
'help' => 'accountExpiresUpload',
|
||||
'example' => _('21-11-2030'),
|
||||
),
|
||||
array(
|
||||
'name' => 'windowsUser_requireCard',
|
||||
'description' => _('Require smartcard'),
|
||||
|
@ -490,7 +508,13 @@ class windowsUser extends baseModule implements passwordService {
|
|||
if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30NisDomain', true)) {
|
||||
$profileContainer->addElement(new htmlTableExtendedInputField(_('NIS domain'), 'windowsUser_msSFU30NisDomain', null, 'msSFU30NisDomain'), true);
|
||||
}
|
||||
$profileContainer->addElement(new htmlTableExtendedInputField(_('Account expiration'), 'windowsUser_accountExpires', null, 'accountExpiresProfile'), true);
|
||||
$return['profile_options'] = $profileContainer;
|
||||
// profile checks
|
||||
$return['profile_checks']['windowsUser_accountExpires'] = array(
|
||||
'type' => 'ext_preg',
|
||||
'regex' => 'digit',
|
||||
'error_message' => $this->messages['accountExpires'][0]);
|
||||
// profile mappings
|
||||
$return['profile_mappings'] = array(
|
||||
'windowsUser_displayName' => 'displayName',
|
||||
|
@ -534,6 +558,7 @@ class windowsUser extends baseModule implements passwordService {
|
|||
'password' => _('Password'),
|
||||
'homeDrive' => _('Home drive'),
|
||||
'homeDirectory' => _('Home directory'),
|
||||
'accountExpires' => _('Account expiration date'),
|
||||
);
|
||||
if (!$this->isBooleanConfigOptionSet('windowsUser_hidesAMAccountName', true)) {
|
||||
$return['PDF_fields']['sAMAccountName'] = _('User name (pre W2K)');
|
||||
|
@ -563,7 +588,8 @@ class windowsUser extends baseModule implements passwordService {
|
|||
'postOfficeBox' => _('Post office box'),
|
||||
'postalCode' => _('Postal code'),
|
||||
'unicodePwd' => _('Password'),
|
||||
'pwdLastSet' => _('Last password change (read-only)')
|
||||
'pwdLastSet' => _('Last password change (read-only)'),
|
||||
'accountExpires' => _('Account expiration date (read-only)'),
|
||||
);
|
||||
// possible self service read-only fields
|
||||
$return['selfServiceReadOnlyFields'] = array('physicalDeliveryOfficeName', 'telephoneNumber',
|
||||
|
@ -638,6 +664,8 @@ class windowsUser extends baseModule implements passwordService {
|
|||
$this->messages['homeDirectory'][1] = array('ERROR', _('Account %s:') . ' windowsUser_homeDirectory', _('Homedirectory contains invalid characters.'));
|
||||
$this->messages['msSFU30Name'][0] = array('ERROR', _('NIS name'), _('NIS name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !'));
|
||||
$this->messages['msSFU30Name'][1] = array('ERROR', _('Account %s:') . ' windowsUser_msSFU30Name', _('NIS name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !'));
|
||||
$this->messages['accountExpires'][0] = array('ERROR', _('Account expiration'), _('Please enter a number.'));
|
||||
$this->messages['accountExpires'][1] = array('ERROR', _('Account %s:') . ' windowsUser_accountExpires', _('Please enter a valid date in format DD-MM-YYYY.'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -767,6 +795,14 @@ class windowsUser extends baseModule implements passwordService {
|
|||
// require smartcard
|
||||
$requireCard = windowsUser::isSmartCardRequired($this->attributes);
|
||||
$containerLeft->addElement(new htmlTableExtendedInputCheckbox('requireCard', $requireCard, _("Require smartcard"), 'requireCard'), true);
|
||||
// account expiration
|
||||
$containerLeft->addElement(new htmlOutputText(_('Account expiration date')));
|
||||
$accountExpiresGroup = new htmlGroup();
|
||||
$accountExpiresGroup->addElement(new htmlOutputText($this->formatAccountExpires()));
|
||||
$accountExpiresGroup->addElement(new htmlSpacer('5px', null));
|
||||
$accountExpiresGroup->addElement(new htmlAccountPageButton(get_class($this), 'accountExpires', 'edit', _('Change')));
|
||||
$containerLeft->addElement($accountExpiresGroup);
|
||||
$containerLeft->addElement(new htmlHelpLink('accountExpires'), true);
|
||||
// last password change
|
||||
if (!$this->isBooleanConfigOptionSet('windowsUser_hidepwdLastSet')) {
|
||||
$containerLeft->addElement(new htmlOutputText(_('Last password change')));
|
||||
|
@ -1048,6 +1084,115 @@ class windowsUser extends baseModule implements passwordService {
|
|||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will create the meta HTML code to show a page to change account expiration.
|
||||
*
|
||||
* @return htmlElement meta HTML code
|
||||
*/
|
||||
function display_html_accountExpires() {
|
||||
$return = new htmlTable();
|
||||
$attr = 'accountExpires';
|
||||
$text = _('Account expiration date');
|
||||
$help = "accountExpires";
|
||||
$datetime = new DateTime('now', getTimeZone());
|
||||
if (!empty($this->attributes[$attr][0]) && !($this->attributes[$attr][0] == '0')) {
|
||||
$datetime = $this->getFileTime($this->attributes[$attr][0]);
|
||||
}
|
||||
for ( $i=1; $i<=31; $i++ ) $mday[] = $i;
|
||||
for ( $i=1; $i<=12; $i++ ) $mon[] = $i;
|
||||
for ( $i=2003; $i<=2050; $i++ ) $year[] = $i;
|
||||
$return->addElement(new htmlOutputText($text));
|
||||
$return->addElement(new htmlSelect('expire_day', $mday, array($datetime->format('d'))));
|
||||
$return->addElement(new htmlSelect('expire_mon', $mon, array($datetime->format('m'))));
|
||||
$return->addElement(new htmlSelect('expire_yea', $year, array($datetime->format('Y'))));
|
||||
$return->addElement(new htmlHelpLink($help), true);
|
||||
if ($this->getAccountContainer()->getAccountModule('shadowAccount') != null) {
|
||||
$return->addElement(new htmlTableExtendedInputCheckbox('syncShadow', false, _('Set also for Shadow')), true);
|
||||
}
|
||||
if ($this->getAccountContainer()->getAccountModule('heimdalKerberos') != null) {
|
||||
$return->addElement(new htmlTableExtendedInputCheckbox('syncHeimdal', false, _('Set also for Kerberos')), true);
|
||||
}
|
||||
if ($this->getAccountContainer()->getAccountModule('mitKerberos') != null) {
|
||||
$return->addElement(new htmlTableExtendedInputCheckbox('syncMIT', false, _('Set also for Kerberos')), true);
|
||||
}
|
||||
if ($this->getAccountContainer()->getAccountModule('mitKerberosStructural') != null) {
|
||||
$return->addElement(new htmlTableExtendedInputCheckbox('syncMITStructural', false, _('Set also for Kerberos')), true);
|
||||
}
|
||||
$return->addElement(new htmlSpacer(null, '10px'), true);
|
||||
$buttons = new htmlTable();
|
||||
$buttons->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'change' . $attr, _('Change')));
|
||||
if (isset($this->attributes[$attr][0])) {
|
||||
$buttons->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'del' . $attr, _('Remove')));
|
||||
}
|
||||
$buttons->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'back' . $attr, _('Cancel')));
|
||||
$buttons->colspan = 6;
|
||||
$return->addElement($buttons);
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes user input of the account expiration page.
|
||||
*
|
||||
* @return array list of info/error messages
|
||||
*/
|
||||
function process_accountExpires() {
|
||||
$return = array();
|
||||
// find button name
|
||||
$buttonName = '';
|
||||
$postKeys = array_keys($_POST);
|
||||
for ($i = 0; $i < sizeof($postKeys); $i++) {
|
||||
if (strpos($postKeys[$i], 'form_subpage_windowsUser_attributes_') !== false) {
|
||||
$buttonName = $postKeys[$i];
|
||||
}
|
||||
}
|
||||
if (($buttonName == '') || (strpos($buttonName, '_back') !== false)) return array();
|
||||
$attr = 'accountExpires';
|
||||
// determine action
|
||||
if (strpos($buttonName, '_change') !== false) {
|
||||
// set new time
|
||||
$this->setExpirationDate($_POST['expire_yea'], $_POST['expire_mon'], $_POST['expire_day']);
|
||||
// sync other modules
|
||||
if (isset($_POST['syncShadow']) && ($_POST['syncShadow'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('shadowAccount')->setExpirationDate(
|
||||
$_POST['expire_yea'], $_POST['expire_mon'], $_POST['expire_day']);
|
||||
}
|
||||
if (isset($_POST['syncHeimdal']) && ($_POST['syncHeimdal'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('heimdalKerberos')->setExpirationDate(
|
||||
$_POST['expire_yea'], $_POST['expire_mon'], $_POST['expire_day']);
|
||||
}
|
||||
if (isset($_POST['syncMIT']) && ($_POST['syncMIT'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('mitKerberos')->setExpirationDate(
|
||||
$_POST['expire_yea'], $_POST['expire_mon'], $_POST['expire_day']);
|
||||
}
|
||||
if (isset($_POST['syncMITStructural']) && ($_POST['syncMITStructural'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('mitKerberosStructural')->setExpirationDate(
|
||||
$_POST['expire_yea'], $_POST['expire_mon'], $_POST['expire_day']);
|
||||
}
|
||||
}
|
||||
elseif (strpos($buttonName, '_del') !== false) {
|
||||
// remove attribute value
|
||||
unset($this->attributes[$attr]);
|
||||
// sync other modules
|
||||
if (isset($_POST['syncShadow']) && ($_POST['syncShadow'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('shadowAccount')->setExpirationDate(
|
||||
null, null, null);
|
||||
}
|
||||
if (isset($_POST['syncHeimdal']) && ($_POST['syncHeimdal'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('heimdalKerberos')->setExpirationDate(
|
||||
null, null, null);
|
||||
}
|
||||
if (isset($_POST['syncMIT']) && ($_POST['syncMIT'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('mitKerberos')->setExpirationDate(
|
||||
null, null, null);
|
||||
}
|
||||
if (isset($_POST['syncMITStructural']) && ($_POST['syncMITStructural'] == 'on')) {
|
||||
$this->getAccountContainer()->getAccountModule('mitKerberosStructural')->setExpirationDate(
|
||||
null, null, null);
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the group selection.
|
||||
*
|
||||
|
@ -1388,6 +1533,18 @@ class windowsUser extends baseModule implements passwordService {
|
|||
$this->setIsNeverExpiring($userAccountControlAttr, $booleanOptions[$rawAccounts[$i][$ids['windowsUser_noExpire']]]);
|
||||
}
|
||||
}
|
||||
// account expiration
|
||||
if (!empty($rawAccounts[$i][$ids['windowsUser_accountExpires']])) {
|
||||
if (get_preg($rawAccounts[$i][$ids['windowsUser_accountExpires']], 'date')) {
|
||||
$dateParts = explode('-', $rawAccounts[$i][$ids['windowsUser_accountExpires']]);
|
||||
$partialAccounts[$i]['accountExpires'] = $this->buildExpirationDate($dateParts[2], $dateParts[1], $dateParts[0]);
|
||||
}
|
||||
else {
|
||||
$errMsg = $this->messages['accountExpires'][1];
|
||||
array_push($errMsg, array($i));
|
||||
$errors[] = $errMsg;
|
||||
}
|
||||
}
|
||||
// require smartcard
|
||||
if ($rawAccounts[$i][$ids['windowsUser_requireCard']] != "") {
|
||||
if (!isset($booleanOptions[$rawAccounts[$i][$ids['windowsUser_requireCard']]])) {
|
||||
|
@ -1641,6 +1798,7 @@ class windowsUser extends baseModule implements passwordService {
|
|||
$noExpire = _('yes');
|
||||
}
|
||||
$this->addPDFKeyValue($return, 'noExpire', _('Password does not expire'), $noExpire);
|
||||
$this->addPDFKeyValue($return, 'accountExpires', _('Account expiration date'), $this->formatAccountExpires());
|
||||
$requireCard = _('no');
|
||||
if ($this->isSmartCardRequired($this->attributes)) {
|
||||
$requireCard = _('yes');
|
||||
|
@ -1721,6 +1879,14 @@ class windowsUser extends baseModule implements passwordService {
|
|||
if (!empty($profile['windowsUser_otherMailbox'][0])) {
|
||||
$this->attributes['otherMailbox'] = preg_split('/;[ ]*/', $profile['windowsUser_otherMailbox'][0]);
|
||||
}
|
||||
// account expiration date
|
||||
if (!empty($profile['windowsUser_accountExpires'][0]) && is_numeric($profile['windowsUser_accountExpires'][0])) {
|
||||
$numDays = $profile['windowsUser_accountExpires'][0];
|
||||
$date = new DateTime('now', getTimeZone());
|
||||
$toAdd = new DateInterval('P' . $numDays . 'D');
|
||||
$dateTarget = $date->add($toAdd);
|
||||
$this->setExpirationDate($dateTarget->format('Y'), $dateTarget->format('m'), $dateTarget->format('d'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1769,6 +1935,11 @@ class windowsUser extends baseModule implements passwordService {
|
|||
$row->addLabel(new htmlOutputText($this->getSelfServiceLabel('pwdLastSet', _('Last password change'))));
|
||||
$row->addField(new htmlOutputText($this->formatPwdLastSet($attributes)));
|
||||
$return['pwdLastSet'] = $row;
|
||||
// account expiration
|
||||
$row = new htmlResponsiveRow();
|
||||
$row->addLabel(new htmlOutputText($this->getSelfServiceLabel('accountExpires', _('Account expiration date'))));
|
||||
$row->addField(new htmlOutputText($this->formatAccountExpires($attributes)));
|
||||
$return['accountExpires'] = $row;
|
||||
return $return;
|
||||
}
|
||||
|
||||
|
@ -2190,6 +2361,23 @@ class windowsUser extends baseModule implements passwordService {
|
|||
return $this->formatFileTime($this->attributes['lastLogonTimestamp'][0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the formatted value for the account expiration date.
|
||||
*
|
||||
* @param array $attributes user attributes ($this->attributes if null)
|
||||
* @return String date or -
|
||||
*/
|
||||
private function formatAccountExpires($attributes = null) {
|
||||
if ($attributes == null) {
|
||||
$attributes = &$this->attributes;
|
||||
}
|
||||
if (empty($attributes['accountExpires'][0]) || ($attributes['accountExpires'][0] == '0')
|
||||
|| ($attributes['accountExpires'][0] == '9223372036854775807')) {
|
||||
return ' - ';
|
||||
}
|
||||
return $this->formatFileTime($attributes['accountExpires'][0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a value in file time (100 ns since 1601-01-01).
|
||||
*
|
||||
|
@ -2207,6 +2395,55 @@ class windowsUser extends baseModule implements passwordService {
|
|||
return $time->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a value in file time (100 ns since 1601-01-01).
|
||||
*
|
||||
* @param integer $value time value as int
|
||||
* @return DateTime time value
|
||||
*/
|
||||
private function getFileTime($value) {
|
||||
if (empty($value)) {
|
||||
return null;
|
||||
}
|
||||
$seconds = substr($value, 0, -7);
|
||||
$time = new DateTime('1601-01-01', new DateTimeZone('UTC'));
|
||||
$time->add(new DateInterval('PT' . $seconds . 'S'));
|
||||
$time->setTimezone(getTimeZone());
|
||||
return $time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the expiration date of this account.
|
||||
* If all parameters are null the expiration date will be removed.
|
||||
*
|
||||
* @param String $year year (e.g. 2040)
|
||||
* @param String $month month (e.g. 8)
|
||||
* @param String $day day (e.g. 27)
|
||||
*/
|
||||
public function setExpirationDate($year, $month, $day) {
|
||||
if (($year == null) && ($month == null) && ($day == null)) {
|
||||
unset($this->attributes['accountExpires']);
|
||||
return;
|
||||
}
|
||||
$this->attributes['accountExpires'][0] = $this->buildExpirationDate($year, $month, $day);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the value for the expiration date.
|
||||
*
|
||||
* @param int $year year
|
||||
* @param int $month month
|
||||
* @param int $day day
|
||||
*/
|
||||
private function buildExpirationDate($year, $month, $day) {
|
||||
$timeBase = new DateTime('1601-01-01', getTimeZone());
|
||||
$time = new DateTime("$year-$month-$day", getTimeZone());
|
||||
$timeDiff = $time->diff($timeBase);
|
||||
$days = $timeDiff->format('%a');
|
||||
$seconds = $days * 24 * 3600 - ($time->getOffset());
|
||||
return $seconds . '0000000';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
Loading…
Reference in New Issue