浏览代码

added force sync user mail aliases button; fixed mail aliases sync

Piotr Labudda 10 年之前
父节点
当前提交
6abb0609a8
共有 3 个文件被更改,包括 91 次插入30 次删除
  1. 53 23
      SE/se-lib/Route/Users.php
  2. 12 0
      SE/se-lib/SyncUsers.php
  3. 26 7
      SE/se-lib/UserStorageMacOSX.php

+ 53 - 23
SE/se-lib/Route/Users.php

@@ -877,22 +877,6 @@ class Route_Users extends RouteBase {
 
 		$synUsers = new SyncUsers($usrStorageDB, $usrStorageLdap);
 
-		$syncTodoList = $synUsers->getSyncUserTodoList($userName);
-		?>
-		<?php if (empty($syncTodoList)) : ?>
-			<div class="alert alert-info">Brak zadań do wykonania - użytkownik zsynchronizowany</div>
-		<?php else : ?>
-			<div class="well">
-				<p>Lista zadań do wykonania:</p>
-				<ul>
-					<?php foreach ($syncTodoList as $vTask) : ?>
-						<li><?php echo $vTask; ?></li>
-					<?php endforeach; ?>
-				</ul>
-			</div>
-		<?php endif; ?>
-		<?php
-
 		if ('1' == V::get('_runSync', '', $_POST)) {
 			$synced = $synUsers->syncUser($userName, $syncGroups = true, $syncDisabled = true);
 			if (!$synced) {
@@ -916,14 +900,60 @@ class Route_Users extends RouteBase {
 				<?php
 			}
 		}
-		else {
-			?>
-			<form action="" method="POST">
-				<input type="hidden" name="_runSync" value="1">
-				<input type="submit" value="Synchronizuj" class="btn btn-primary btn-big">
-			</form>
-			<?php
+		if ('1' == V::get('_forceSyncAliasList', '', $_POST)) {
+			$synced = $synUsers->forceSyncUserAliasList($userName);
+			if (!$synced) {
+				?>
+				<div class="alert alert-danger">
+					Nie udało się poprawić aliasów <?php echo $userName; ?>.
+				</div>
+				<?php
+				$errorsList = $synUsers->getErrorsMsgListWithDbg();
+				if (!empty($errorsList)) {
+					echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">';
+						echo "Błędy:\n" . implode("\n", $errorsList);
+					echo '</pre>';
+				}
+			}
+			else {
+				?>
+				<div class="alert alert-success">
+					Synchronizacja listy aliasów pocztowych użytkownika <?php echo $userName; ?> zakończona powodzeniem.
+				</div>
+				<?php
+			}
 		}
+
+		$syncTodoList = $synUsers->getSyncUserTodoList($userName);
+		?>
+		<?php if (empty($syncTodoList)) : ?>
+			<div class="alert alert-info">Brak zadań do wykonania - użytkownik zsynchronizowany</div>
+		<?php else : ?>
+			<div class="well">
+				<p>Lista zadań do wykonania:</p>
+				<ul>
+					<?php foreach ($syncTodoList as $vTask) : ?>
+						<li><?php echo $vTask; ?></li>
+					<?php endforeach; ?>
+				</ul>
+			</div>
+		<?php endif; ?>
+		<div class="row">
+			<div class="col-md-2">
+				<form action="" method="POST">
+					<input type="hidden" name="_runSync" value="1">
+					<input type="submit" value="Synchronizuj" class="btn btn-primary btn-big">
+				</form>
+			</div>
+			<div class="col-md-10" style="text-align: right;">
+				<form action="" method="POST">
+					<input type="hidden" name="_forceSyncAliasList" value="1">
+					W razie problemów z aliasami pocztowymi:
+					<input type="submit" value="Popraw aliasy" class="btn btn-xs btn-warning">
+				</form>
+			</div>
+		</div>
+		<?php
 	}
 
 }

+ 12 - 0
SE/se-lib/SyncUsers.php

@@ -104,6 +104,18 @@ class SyncUsers {
 		return true;
 	}
 
+	public function forceSyncUserAliasList($usrLogin) {
+		$usrFrom = $this->_fromStorage->getUser($usrLogin);
+		$usrTo = $this->_toStorage->getUser($usrLogin);
+		if (!$usrFrom) throw new Exception("Użytkownik '{$usrLogin}' nie istnieje w bazie danych");
+		if (!$usrTo) throw new Exception("Użytkownik '{$usrLogin}' nie istnieje w bazie LDAP");
+
+		DBG::_('DBG_SU', true, 'usrFrom', $usrFrom, __CLASS__, __FUNCTION__, __LINE__);
+		DBG::_('DBG_SU', true, 'usrTo', $usrTo, __CLASS__, __FUNCTION__, __LINE__);
+		$this->_toStorage->forceReplaceAliasList($usrLogin, $usrFrom->aliasesList);
+		return true;
+	}
+
 	public function syncExistingUser($usrLogin, ObjectUser $usrFrom, ObjectUser $usrTo) {
 		if (!$usrFrom) return false;
 		if (!$usrTo) return false;

+ 26 - 7
SE/se-lib/UserStorageMacOSX.php

@@ -53,10 +53,10 @@ class UserStorageMacOSX extends UserStorageBase {
 		if (isset($usrLdap->$fldPassPolicy)) unset($usrLdap->$fldPassPolicy);
 		if (isset($usrLdap->authAuthority)) unset($usrLdap->authAuthority);
 		if (isset($usrLdap->altSecurityIdentities)) unset($usrLdap->altSecurityIdentities);
-		if (!empty($usrLdap->mail) && is_array($usrLdap->mail)) {
+		if (!empty($usrLdap->mail)) {
 			$usrLdap->aliasesList = array();
 			{
-				$aliasesEx = $usrLdap->mail;
+				$aliasesEx = (is_array($usrLdap->mail))? $usrLdap->mail : array($usrLdap->mail);
 				foreach ($aliasesEx as $emailAlias) {
 					$emailAlias = trim($emailAlias);
 					if (!empty($emailAlias) && filter_var($emailAlias, FILTER_VALIDATE_EMAIL)) {
@@ -862,20 +862,20 @@ class UserStorageMacOSX extends UserStorageBase {
 	}
 
 	public function _addMailAliases($usrLogin, $aliasList) {
-		if (empty($usrLogin)) throw new Exception("Cannot add mail alias: Unknown user login!");
-		if (empty($aliasList)) throw new Exception("Cannot add mail alias: Empty alias list!");
+		if (empty($usrLogin)) throw new Exception("Cannot add mail alias list: Unknown user login!");
+		if (empty($aliasList)) throw new Exception("Cannot add mail alias list: Empty alias list!");
 
 		$aliasListFlat = implode(' ', $aliasList);
 		$cmdDsclAuth = "dscl -u {$this->_rootUser} -P {$this->_rootPass} /LDAPv3/127.0.0.1 ";
 		$cmd = "{$cmdDsclAuth} -append /Users/{$usrLogin} EMailAddress {$aliasListFlat} ";
 		$cmdOut = null; $cmdRet = null;
 		exec($cmd, $cmdOut, $cmdRet);
-		if ($cmdRet != 0) throw new Exception("Nie udało się dodać aliasów: {$aliasListFlat}");
+		if ($cmdRet != 0) throw new Exception("Nie udało się dodać aliasów: {$aliasListFlat}!");
 	}
 
 	public function _removeMailAliases($usrLogin, $aliasList) {
-		if (empty($usrLogin)) throw new Exception("Cannot remove mail alias: Unknown user login!");
-		if (empty($aliasList)) throw new Exception("Cannot remove mail alias: Empty alias list!");
+		if (empty($usrLogin)) throw new Exception("Cannot remove mail alias list: Unknown user login!");
+		if (empty($aliasList)) throw new Exception("Cannot remove mail alias list: Empty alias list!");
 
 		$aliasListFlat = implode(' ', $aliasList);
 		$cmdDsclAuth = "dscl -u {$this->_rootUser} -P {$this->_rootPass} /LDAPv3/127.0.0.1 ";
@@ -885,5 +885,24 @@ class UserStorageMacOSX extends UserStorageBase {
 		if ($cmdRet != 0) throw new Exception("Nie udało się usunąć aliasów: {$aliasListFlat}");
 	}
 
+	public function forceReplaceAliasList($usrLogin, $aliasList) {
+		if (empty($usrLogin)) throw new Exception("Cannot replace mail alias list: Unknown user login!");
+
+		$aliasListFlat = implode(' ', $aliasList);
+		$cmdDsclAuth = "dscl -u {$this->_rootUser} -P {$this->_rootPass} /LDAPv3/127.0.0.1 ";
+		$cmd = "{$cmdDsclAuth} -delete /Users/{$usrLogin} EMailAddress";
+		$cmdOut = null; $cmdRet = null;
+		exec($cmd, $cmdOut, $cmdRet);
+		if ($cmdRet != 0) throw new Exception("Nie udało się usunąć wszystkich aliasów");
+
+		if (!empty($aliasList)) {
+			sleep(1);
+			$cmd = "{$cmdDsclAuth} -append /Users/{$usrLogin} EMailAddress {$aliasListFlat}";
+			$cmdOut = null; $cmdRet = null;
+			exec($cmd, $cmdOut, $cmdRet);
+			if ($cmdRet != 0) throw new Exception("Nie udało się dodać aliasów: {$aliasListFlat}");
+		}
+	}
+
 }