diff --git a/renater-partage/personal/mail/mail-methods/class_mail-methods-renater-partage.inc b/renater-partage/personal/mail/mail-methods/class_mail-methods-renater-partage.inc index 35bbdd21d090b06b853ae63f8408752f684c598c..62d3afdfe70347bbc15b5b67dc183d75fb71d429 100644 --- a/renater-partage/personal/mail/mail-methods/class_mail-methods-renater-partage.inc +++ b/renater-partage/personal/mail/mail-methods/class_mail-methods-renater-partage.inc @@ -358,7 +358,9 @@ class mailMethodRenaterPartage extends mailMethod $account[$partageField] = $mainTab->$fdField; } } - $account['zimbraAccountStatus'] = ($mainTab->attributesAccess['userPassword']->isLocked() ? 'locked' : 'active'); + if (!class_available('supannAccount')) { + $account['zimbraAccountStatus'] = ($mainTab->attributesAccess['userPassword']->isLocked() ? 'locked' : 'active'); + } $account['initials'] = mb_strtoupper(mb_substr($mainTab->givenName, 0, 1).mb_substr($mainTab->sn, 0, 1)); /* Sync fields from SUPANN if tab is active */ @@ -369,6 +371,23 @@ class mailMethodRenaterPartage extends mailMethod $account['zimbraHideInGal'] = ($supannTab->supannListeRouge ? 'TRUE' : 'FALSE'); } + /* Lock zimbra account if MAIL is inactive or suspended in supannRessourceEtatDate */ + if (isset($this->parent->parent->by_object['supannAccountStatus']) && $this->parent->parent->by_object['supannAccountStatus']->is_account) { + $supannStatusTab = $this->parent->parent->by_object['supannAccountStatus']; + + foreach ($supannStatusTab->supannRessourceEtatDate as $line) { + list ($label, $state, $substate, $start, $end) = $supannStatusTab->attributesAccess['supannRessourceEtatDate']->attribute->readValues($line); + if ($label === 'MAIL') { + if ($state !== 'A') { + $account['zimbraAccountStatus'] = 'locked'; + } else { + $account['zimbraAccountStatus'] = 'active'; + } + break; + } + } + } + /* Sync fields from personal if tab is active */ if (isset($this->parent->parent->by_object['personalInfo']) && $this->parent->parent->by_object['personalInfo']->is_account) { $personalTab = $this->parent->parent->by_object['personalInfo']; diff --git a/supann/personal/supann/class_supannAccountStatus.inc b/supann/personal/supann/class_supannAccountStatus.inc index 9298c66ad9bf7053a5a4329f63f1f003176b0fe4..453db502fe1dafad649f515787b77f4986fddd93 100644 --- a/supann/personal/supann/class_supannAccountStatus.inc +++ b/supann/personal/supann/class_supannAccountStatus.inc @@ -32,18 +32,18 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction return []; } return [ - 'plShortName' => _('SupAnn status'), + 'plShortName' => _('SupAnn status'), 'plDescription' => _('SupAnn status management'), - 'plFilter' => '(supannRessourceEtatDate=*)', - 'plIcon' => 'geticon.php?context=applications&icon=supann&size=48', - 'plSmallIcon' => 'geticon.php?context=applications&icon=supann-status&size=16', - 'plSelfModify' => TRUE, - 'plPriority' => 15, + 'plFilter' => '(supannRessourceEtatDate=*)', + 'plIcon' => 'geticon.php?context=applications&icon=supann&size=48', + 'plSmallIcon' => 'geticon.php?context=applications&icon=supann-status&size=16', + 'plSelfModify' => TRUE, + 'plPriority' => 15, 'plObjectClass' => [], - 'plObjectType' => ['user'], - 'plDepends' => ['supannAccount'], + 'plObjectType' => ['user'], + 'plDepends' => ['supannAccount'], - 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) + 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) ]; } @@ -52,7 +52,7 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction { return [ 'status' => [ - 'name' => _('Status'), + 'name' => _('Status'), 'class' => ['fullwidth'], 'attrs' => [ new OrderedArrayAttribute( @@ -63,13 +63,13 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction new SelectAttribute( _('Resource'), _('Which resource this state concerns'), 'supannRessourceEtatDate_label', TRUE, - ['COMPTE','MAIL'], '', + ['COMPTE', 'MAIL'], '', [_('Account'), _('Mail')] ), new SelectAttribute( _('Status'), _('Active status'), 'supannRessourceEtatDate_status', TRUE, - ['A','I','S'], 'A', + ['A', 'I', 'S'], 'A', [_('Active'), _('Inactive'), _('Suspended')] ), new SelectAttribute( @@ -113,9 +113,9 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction $this->substatus = static::getConfiguredSubstates(); - $resources = ['COMPTE' => _('Account'),'MAIL' => _('Mail')]; + $resources = ['COMPTE' => _('Account'), 'MAIL' => _('Mail')]; foreach ($config->get_cfg_value('SupannRessourceLabels', []) as $line) { - list($resource,$label) = explode(':', $line, 2); + list($resource, $label) = explode(':', $line, 2); $resources[$resource] = $label; } $this->attributesAccess['supannRessourceEtatDate']->attribute->attributes[0]->setChoices( @@ -139,12 +139,11 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction /* Import from supannRessourceEtat if needed */ if (!empty($this->supannRessourceEtat) && empty($this->supannRessourceEtatDate)) { $this->supannRessourceEtatDate = array_map( - function ($supannRessourceEtat) - { + function ($supannRessourceEtat) { if (strpos($supannRessourceEtat, ':') === FALSE) { - return $supannRessourceEtat.':::'; + return $supannRessourceEtat . ':::'; } else { - return $supannRessourceEtat.'::'; + return $supannRessourceEtat . '::'; } }, $this->supannRessourceEtat @@ -166,13 +165,12 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction { /* Copy active states over to supannRessourceEtat */ $this->supannRessourceEtat = array_map( - function ($supannRessourceEtatDate) - { - list($labelstate,$substate) = explode(':', $supannRessourceEtatDate); + function ($supannRessourceEtatDate) { + list($labelstate, $substate) = explode(':', $supannRessourceEtatDate); if (empty($substate)) { return $labelstate; } else { - return $labelstate.':'.$substate; + return $labelstate . ':' . $substate; } }, $this->supannRessourceEtatDate @@ -186,7 +184,7 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction $resources = []; foreach ($this->supannRessourceEtatDate as $line) { - $resource = preg_replace('/^\{([^}]+)\}.*$/', '\1', $line); + $resource = preg_replace('/^\{([^}]+)\}.*$/', '\1', $line); if (in_array($resource, $resources)) { $errors[] = new SimplePluginCheckError( $this->attributesAccess['supannRessourceEtatDate'], @@ -200,45 +198,62 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction return $errors; } + /** + * @return void + * The concept is to allow the trigger of password locking when {account} is set to lock or unlock. + * The same mechanism is present for mail allowing to lock the mail account within mail tab for linked web service. + */ protected function post_save () { foreach ($this->supannRessourceEtatDate as $line) { - list ($label, $state, $substate, $start, $end) = $this->attributesAccess['supannRessourceEtatDate']->attribute->readValues($line); - if ($label == 'COMPTE') { - if ($state == 'A') { - /* Unlock account */ - userManagement::lockUser('unlock', $this->parent->getBaseObject()->userPassword, $this->dn); - } elseif (($state == 'S') || ($state == 'I')) { - /* Lock account */ - userManagement::lockUser('lock', $this->parent->getBaseObject()->userPassword, $this->dn); - } - break; + list($label, $state, $substate, $start, $end) = $this->attributesAccess['supannRessourceEtatDate']->attribute->readValues($line); + if ($label === 'COMPTE') { + $this->processAccountState($state); } } + parent::post_save(); } + /** + * @param string $state + * @return void + * Note : The concept of locking account is based on the modification of password hash. + * The passwordMethod class will not trigger fillLockingLDAPAttrs methods of each plugin to lock everything. + * It only locked the account access by password modification - fillLockingLDAPAttrs is only available via general lock. + */ + protected function processAccountState (string $state): void + { + if ($state === 'A') { + // Unlock account + userManagement::lockUser('unlock', $this->parent->getBaseObject()->userPassword, $this->dn); + } elseif (in_array($state, ['S', 'I'], TRUE)) { + // Lock account + userManagement::lockUser('lock', $this->parent->getBaseObject()->userPassword, $this->dn, FALSE); + } + } + public function fillLockingLDAPAttrs (string $mode, array &$modify) { if (empty($this->supannRessourceEtatDate)) { return; } - $modify['supannRessourceEtatDate'] = []; - $modify['supannRessourceEtat'] = []; + $modify['supannRessourceEtatDate'] = []; + $modify['supannRessourceEtat'] = []; foreach ($this->supannRessourceEtatDate as $line) { list ($label, $state, $substate, $start, $end) = $this->attributesAccess['supannRessourceEtatDate']->attribute->readValues($line); if (($state == 'A') && ($mode == 'LOCK')) { /* Lock all resources */ - $modify['supannRessourceEtatDate'][] = '{'.$label.'}S:SupannVerrouille:'.date('Ymd').':'; - $modify['supannRessourceEtat'][] = '{'.$label.'}S:SupannVerrouille'; + $modify['supannRessourceEtatDate'][] = '{' . $label . '}S:SupannVerrouille:' . date('Ymd') . ':'; + $modify['supannRessourceEtat'][] = '{' . $label . '}S:SupannVerrouille'; } elseif ((($state == 'S') || ($state == 'I')) && ($mode == 'UNLOCK')) { /* Unlock account */ - $modify['supannRessourceEtatDate'][] = '{'.$label.'}A:SupannActif:'.date('Ymd').':'; - $modify['supannRessourceEtat'][] = '{'.$label.'}A:SupannActif'; + $modify['supannRessourceEtatDate'][] = '{' . $label . '}A:SupannActif:' . date('Ymd') . ':'; + $modify['supannRessourceEtat'][] = '{' . $label . '}A:SupannActif'; } else { /* Do not touch other fields */ - $modify['supannRessourceEtatDate'][] = $line; - $modify['supannRessourceEtat'][] = '{'.$label.'}'.$state.(empty($substate) ? '' : ':'.$substate); + $modify['supannRessourceEtatDate'][] = $line; + $modify['supannRessourceEtat'][] = '{' . $label . '}' . $state . (empty($substate) ? '' : ':' . $substate); } } } @@ -247,22 +262,22 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction { return [ 'A' => [ - 'SupannAnticipe' => _('Anticipated'), - 'SupannActif' => _('Active'), - 'SupannSursis' => _('Extension'), + 'SupannAnticipe' => _('Anticipated'), + 'SupannActif' => _('Active'), + 'SupannSursis' => _('Extension'), ], 'I' => [ - 'SupannPrecree' => _('Pre-created'), - 'SupannCree' => _('Created'), - 'SupannExpire' => _('Expired'), - 'SupannInactif' => _('Inactive'), - 'SupannSupprDonnees' => _('Data deletion'), - 'SupannSupprCompte' => _('Account deletion'), + 'SupannPrecree' => _('Pre-created'), + 'SupannCree' => _('Created'), + 'SupannExpire' => _('Expired'), + 'SupannInactif' => _('Inactive'), + 'SupannSupprDonnees' => _('Data deletion'), + 'SupannSupprCompte' => _('Account deletion'), ], 'S' => [ - 'SupannVerrouille' => _('Locked'), + 'SupannVerrouille' => _('Locked'), 'SupannVerrouAdministratif' => _('Administrative lock'), - 'SupannVerrouTechnique' => _('Technical lock'), + 'SupannVerrouTechnique' => _('Technical lock'), ], ]; } @@ -282,12 +297,12 @@ class supannAccountStatus extends simplePlugin implements UserTabLockingAction $labels = []; foreach ($config->get_cfg_value('SupannRessourceSubStatesLabels', []) as $line) { - list($substate,$label) = explode(':', $line, 2); + list($substate, $label) = explode(':', $line, 2); $labels[$substate] = $label; } foreach ($config->get_cfg_value('SupannRessourceSubStates', []) as $line) { - list(,$state,$substate) = explode(':', $line, 3); + list(, $state, $substate) = explode(':', $line, 3); if (isset($officialSubstates[$state][$substate])) { $substates[$state][$substate] = $officialSubstates[$state][$substate]; } elseif (isset($labels[$substate])) { diff --git a/zimbra/personal/mail/mail-methods/class_mail-methods-zimbra.inc b/zimbra/personal/mail/mail-methods/class_mail-methods-zimbra.inc index 83cf3ac5d524fc67347d546e8d9df5de69e44ac3..a5ef508f4d35dc9592d4d7eeefce4b6e47c3c904 100644 --- a/zimbra/personal/mail/mail-methods/class_mail-methods-zimbra.inc +++ b/zimbra/personal/mail/mail-methods/class_mail-methods-zimbra.inc @@ -349,7 +349,10 @@ class mailMethodZimbra extends mailMethod $account[$partageField] = $mainTab->$fdField; } } - $account['zimbraAccountStatus'] = ($mainTab->attributesAccess['userPassword']->isLocked() ? 'locked' : 'active'); + if (!class_available('supannAccount')) { + $account['zimbraAccountStatus'] = ($mainTab->attributesAccess['userPassword']->isLocked() ? 'locked' : 'active'); + } + $account['initials'] = mb_strtoupper(mb_substr($mainTab->givenName, 0, 1).mb_substr($mainTab->sn, 0, 1)); /* Sync fields from SUPANN if tab is active */ @@ -368,6 +371,8 @@ class mailMethodZimbra extends mailMethod if ($label === 'MAIL') { if ($state !== 'A') { $account['zimbraAccountStatus'] = 'locked'; + } else { + $account['zimbraAccountStatus'] = 'active'; } break; }