steffen: server/kolab-webadmin/kolab-webadmin/www/admin/distributionlist list.php, 1.2, 1.3

cvs at intevation.de cvs at intevation.de
Fri May 28 17:49:54 CEST 2004


Author: steffen

Update of /kolabrepository/server/kolab-webadmin/kolab-webadmin/www/admin/distributionlist
In directory doto:/tmp/cvs-serv9790/kolab-webadmin/www/admin/distributionlist

Modified Files:
	list.php 
Log Message:
anal nameclash checking + bugfixing for dist lists

Index: list.php
===================================================================
RCS file: /kolabrepository/server/kolab-webadmin/kolab-webadmin/www/admin/distributionlist/list.php,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- list.php	21 May 2004 13:03:09 -0000	1.2
+++ list.php	28 May 2004 15:49:52 -0000	1.3
@@ -28,6 +28,22 @@
   return '';
 }
 
+function checkuniquemail( $form, $key, $value ) {
+  global $ldap;
+  if( $key == 'cn' ) {
+	// Here we have the required hack again:
+	// email address is <value of cn>@default-domain
+	$kolab = $ldap->read( 'k=kolab,'.$_SESSION['base_dn'] );
+	for( $i = 0; $i < $kolab['postfix-mydomain']['count']; $i++ ) {
+	  $domain = $kolab['postfix-mydomain'][$i];
+	  if( $ldap->countMail( $_SESSION['base_dn'], $value.'@'.$domain ) > 0 ) {	
+		return 'User or distribution list with this email address already exists';
+	  }
+	}
+  }
+  return '';	  
+}
+
 function fill_form_for_modify( &$form, &$ldap_object ) {
   if (is_array($ldap_object['cn'])) $cn = $ldap_object['cn'][0];
   else $cn = $ldap_object['cn'];
@@ -85,6 +101,7 @@
 	$content = $form->outputForm();
 	break;
   case 'firstsave':
+	$form->entries['cn']['validation'] = 'checkuniquemail';
   case 'save':	
 	if( $form->isSubmitted() ) {
 	  if( !$form->validate() ) {
@@ -101,6 +118,7 @@
 		foreach( $lst as $a ) {
 		  $ldap_object['member'][] = $a;
 		}
+		if( !$ldap_object['member'] ) unset($ldap_object['member']); 
 
 		if ($action == "save") {
 		  if (!$errors) {
@@ -112,39 +130,67 @@
 				  ($oldattrs=ldap_get_attributes($ldap->connection,$entry))) {
 				if (!ldap_add($ldap->connection,$newdn, $ldap_object) 
 					|| !ldap_delete($ldap->connection,$dn)) {
-				  array_push($errors, "LDAP Error: could not rename ".$dn.
+				  array_push($errors, "LDAP Error: Could not rename ".$dn.
 							 " to ".$newdn." ".ldap_error($ldap->connection));
 				} else {
 				  $messages[] = 'Distribution List updated';
 				}
 				$dn = $newdn;
-			  } else array_push($errors,"LDAP Error: could not read ".$dn." ".ldap_error($ldap->connection));
+			  } else array_push($errors,"LDAP Error: Could not read ".$dn." ".ldap_error($ldap->connection));
 			} else {
 			  if (!ldap_modify($ldap->connection, $dn, $ldap_object))
-				array_push($errors, "LDAP Error: could not modify object ".$dn." ".ldap_error($ldap->connection)); 
+				array_push($errors, "LDAP Error: Could not modify object ".$dn." ".ldap_error($ldap->connection)); 
 			  else $messages[] = 'Distribution List updated';
 			}
 		  } 
 		} else {
+		  // firstsave
 		  if (!$errors) {
+			if( !$ldap_object['member'] ) unset($ldap_object['member']); 
 			$dn = "cn=".$ldap_object['cn'].",".$sf_root;
-			if ($dn && !ldap_add($ldap->connection, $dn, $ldap_object)) 
-			  array_push($errors, "LDAP Error: could not add object ".$dn." ".ldap_error($ldap->connection));
-			else $messages[] = 'Distribution List '.$cn.' added';
+			if ($dn && !ldap_add($ldap->connection, $dn, $ldap_object)) {
+			  array_push($errors, "LDAP Error: Could not add object ".$dn." ".ldap_error($ldap->connection));
+			  debug("dn is $dn");
+			  debug_var_dump( $ldap_object );
+			}
+
+			if( !$errors ) {
+			  // Check for mid-air collisions on mail
+			  $kolab = $ldap->read( 'k=kolab,'.$_SESSION['base_dn'] );
+			  for( $i = 0; $i < $kolab['postfix-mydomain']['count']; $i++ ) {
+				$domain = $kolab['postfix-mydomain'][$i];
+				if( $ldap->countMail( $_SESSION['base_dn'], $ldap_object['cn'].'@'.$domain, $dn ) > 0 ) {
+				  // Ups!!!
+				  $cn = $ldap_object['cn'];
+				  $newcn = md5sum( $dn.$cn );
+				  $ldap_object['cn'] = $newcn; 
+				  $ldap_object['dn'] = 'cn='.$ldap->escape($newcn).','.$sf_root;
+				  if (!ldap_rename($ldap->connection, $dn, 'cn='.$ldap->escape($newcn), $sf_root,true)) {
+					$errors[] = "LDAP Error: Could not modify object $dn ".ldap_error($ldap->connection);
+				  }
+				  $error[] = "Mid-air collision detected, email address $mail renamed to $newmail";
+				  break;
+				}
+			  }
+			}
 		  }
-		  if ($errors) {
-			//print("<div class=\"maintitle\"> Create New Address Book Entry </div>\n");
-			$form->entries['action']['value'] = 'create';
-			break;
+		  if( !$errors ) {
+			$messages[] = 'Distribution List '.$cn.' added';
 		  }
 		}
-		$form->entries['action']['value'] = 'save';
-		$form->entries['dn'] = array( 'type' => 'hidden', 'value' => $dn );
-		$form->entries['cn']['attrs'] = 'readonly';
-		$heading = 'Modify Distribution List';
-		fill_form_for_modify( $form, $ldap_object );
-		$content = $form->outputForm();		
-		
+		if ($errors) {
+		  //print("<div class=\"maintitle\"> Create New Address Book Entry </div>\n");
+		  $form->entries['action']['value'] = 'create';
+		  fill_form_for_modify( $form, $ldap_object );
+		  $content = $form->outputForm();		
+		} else {
+		  $form->entries['action']['value'] = 'save';
+		  $form->entries['dn'] = array( 'type' => 'hidden', 'value' => $dn );
+		  $form->entries['cn']['attrs'] = 'readonly';
+		  $heading = 'Modify Distribution List';
+		  fill_form_for_modify( $form, $ldap_object );
+		  $content = $form->outputForm();		
+		}
 	  }
 	}
 	break;
@@ -200,7 +246,7 @@
 
 /**** Insert into template and output ***/
 $smarty =& new MySmarty();
-$smarty->assign( 'errors', $errors );
+$smarty->assign( 'errors', array_merge($errors,$form->errors) );
 $smarty->assign( 'heading', $heading );
 $smarty->assign( 'uid', $auth->uid() );
 $smarty->assign( 'group', $auth->group() );





More information about the commits mailing list