]> err.no Git - scalable-opengroupware.org/commitdiff
complete LDAP support
authorznek <znek@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 20 Oct 2004 17:02:36 +0000 (17:02 +0000)
committerznek <znek@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 20 Oct 2004 17:02:36 +0000 (17:02 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@416 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/SOGo.xcode/project.pbxproj
SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoMailAccounts.m
SOGo/SoObjects/Mailer/Version
SOGoLogic/AgenorUserManager.h
SOGoLogic/AgenorUserManager.m
SOGoLogic/ChangeLog
SOGoLogic/Version

index a5a783e804ae5b345dd8771425743391534393cd..d7333037cda1bc13fb4c97679c59372c326736db 100644 (file)
                                AD071D1206CD2BCB00A9EEF4,
                                AD071D1306CD2BCB00A9EEF4,
                                ADA6333607140E0D0058C21C,
-                               ADA6333707140E0D0058C21C,
                        );
                        isa = PBXGroup;
                        name = Classes;
                        refType = 4;
                        sourceTree = "<group>";
                };
-               ADA6333707140E0D0058C21C = {
-                       fileEncoding = 5;
-                       indentWidth = 2;
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.objc;
-                       path = "NSString+iCal.m";
-                       refType = 4;
-                       sourceTree = "<group>";
-               };
                ADBE3C490726AF4C000FEA6A = {
                        fileEncoding = 5;
                        indentWidth = 2;
index e9d301e3f6baf4d2ae63054fa6f29f748cad93ca..954effab0d1006640faad0d4a77d91de7b5ebeef 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-20  Marcus Mueller  <znek@mulle-kybernetik.com>
+
+       * SOGoMailAccounts.m: changed methods according to new API of
+         AgenorUserManager (v0.9.35)
+
 2004-10-19  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * SOGoMailAccounts.m: values for toManyRelationshipKeys are constructed
index 078269c10e59739cf1b79f9685b465c1ffa5ace1..27e9355ddde28bdf20d407149257301f4ffe284e 100644 (file)
 
 - (NSArray *)toManyRelationshipKeys {
   static AgenorUserManager *um = nil;
-  NSString *uid, *server, *account;
+  NSString *uid, *account;
 
   if(!um)
     um = [AgenorUserManager sharedUserManager];
   uid = [[self container] davDisplayName];
-  server = [um getIMAPServerForUID:uid];
-  if(!server)
+  account = [um getIMAPAccountStringForUID:uid];
+  if(!account)
     return nil;
-  account = [NSString stringWithFormat:@"%@@%@",
-                                       uid,
-                                       server];
   return [NSArray arrayWithObject:account];
 }
 
index 8d1e9bd6bf0563028ada61e19a231d8cfede140f..79d695bdd74ffdf1f55a3e404e0b303a1ca31a54 100644 (file)
@@ -1,3 +1,6 @@
 # $Id$
 
-SUBMINOR_VERSION:=34
+SUBMINOR_VERSION:=35
+
+# v0.9.35 requires SOGoLogic v0.9.24
+# v0.9.34 requires SOGoLogic v0.9.22
index 910ded38aff70224521c8cde1f503ee68c0c1ec1..3ca73558577bb801e1b5074e177cacb9903e89dc 100644 (file)
@@ -30,7 +30,6 @@
 
 @interface AgenorUserManager : NSObject
 {
-
 }
 
 + (id)sharedUserManager;
 - (NSString *)getUIDForEmail:(NSString *)_email;
 - (NSString *)getEmailForUID:(NSString *)_uid;
 
+/* i.e. BUTTO Hercule, CETE Lyon/DI/ET/TEST */
 - (NSString *)getCNForUID:(NSString *)_uid;
-
-- (NSString *)getIMAPServerForUID:(NSString *)_uid;
+/* i.e. hercule.butto@amelie-ida01.melanie2.i2 */
+- (NSString *)getIMAPAccountStringForUID:(NSString *)_uid;
+/* i.e. amelie-ida01.melanie2.i2 */
+- (NSString *)getServerForUID:(NSString *)_uid;
 
 @end
 
index 062aa26265f2aaf9c531887c1c7eb83576efb97e..158808276da818b112eb67518ae958ae7ebeefb6 100644 (file)
 
 @interface AgenorUserManager (PrivateAPI)
 - (NGLdapConnection *)ldapConnection;
+
+- (void)_cacheCN:(NSString *)_cn forUID:(NSString *)_uid;
+- (NSString *)_cachedCNForUID:(NSString *)_uid;
+- (void)_cacheServer:(NSString *)_server forUID:(NSString *)_uid;
+- (NSString *)_cachedServerForUID:(NSString *)_uid;
+  
 @end
 
 
@@ -83,6 +89,21 @@ static NSString *ldapBaseDN = nil;
   return ldapConnection;
 }
 
+- (void)_cacheCN:(NSString *)_cn forUID:(NSString *)_uid {
+}
+
+- (NSString *)_cachedCNForUID:(NSString *)_uid {
+  return nil;
+}
+
+- (void)_cacheServer:(NSString *)_server forUID:(NSString *)_uid {
+}
+
+- (NSString *)_cachedServerForUID:(NSString *)_uid {
+  return nil;
+}
+
+
 - (NSString *)getUIDForEmail:(NSString *)_email {
   NSRange r;
   NSString *domain;
@@ -91,7 +112,9 @@ static NSString *ldapBaseDN = nil;
     return nil;
 
   r = [_email rangeOfString:@"@"];
-  domain = [_email substringFromIndex:r.location + 1];
+  if(r.length == 0)
+    return nil;
+  domain = [_email substringFromIndex:NSMaxRange(r)];
   if(![domain isEqualToString:@"equipement.gouv.fr"])
       return _email;
   return [_email substringToIndex:r.location];
@@ -116,10 +139,15 @@ static NSString *ldapBaseDN = nil;
     NSEnumerator     *resultEnum;
     NGLdapEntry      *entry;
     NGLdapAttribute  *cnAttr;
+    NSString         *cn;
 
     if(!cnAttrs) {
       cnAttrs = [[NSArray alloc] initWithObjects:@"cn", nil];
     }
+    
+    if((cn = [self _cachedCNForUID:_uid]))
+      return cn;
+
     q = [EOQualifier qualifierWithQualifierFormat:@"uid = %@", _uid];
     
     conn = [self ldapConnection];
@@ -129,15 +157,21 @@ static NSString *ldapBaseDN = nil;
     entry = [resultEnum nextObject];
     if(!entry) {
       if(debugOn) {
-        NSLog(@"Didn't find LDAP entry for uid '%@'!", _uid);
+        NSLog(@"%s Didn't find LDAP entry for uid '%@'!",
+              __PRETTY_FUNCTION__,
+              _uid);
       }
       return nil;
     }
     cnAttr = [entry attributeWithName:@"cn"];
     if(!cnAttr && debugOn) {
-      NSLog(@"LDAP entry for uid '%@' has no common name?", _uid);
+      NSLog(@"%s LDAP entry for uid '%@' has no common name?",
+            __PRETTY_FUNCTION__,
+            _uid);
     }
-    return [cnAttr stringValueAtIndex:0];
+    cn = [cnAttr stringValueAtIndex:0];
+    [self _cacheCN:cn forUID:_uid];
+    return cn;
   }
   else {
     NSString *s;
@@ -156,7 +190,16 @@ static NSString *ldapBaseDN = nil;
   }
 }
 
-- (NSString *)getIMAPServerForUID:(NSString *)_uid {
+- (NSString *)getIMAPAccountStringForUID:(NSString *)_uid {
+  NSString *server;
+  
+  server = [self getServerForUID:_uid];
+  if(!server)
+    return nil;
+  return [NSString stringWithFormat:@"%@@%@", _uid, server];
+}
+
+- (NSString *)getServerForUID:(NSString *)_uid {
   /*
    First of all : for a particular user IMAP and SMTP are served on the same
    host.
@@ -178,7 +221,113 @@ static NSString *ldapBaseDN = nil;
    values, then the IMAP/SMTP server name is to be found in the
    mineqMelServeurPrincipal attribute of the user.
    */
-  return @"mail.opengroupware.org";
+  if(useLDAP) {
+    static NSArray   *attrs = nil;
+    NGLdapConnection *conn;
+    EOQualifier      *q;
+    NSEnumerator     *resultEnum;
+    NGLdapEntry      *entry;
+    NGLdapAttribute  *attr;
+    NSMutableArray   *serverCandidates;
+    NSString         *server;
+
+    if(!attrs) {
+      attrs = [[NSArray alloc] initWithObjects:@"mineqMelRoutage",
+                                               @"mineqMelServeurPrincipal",
+                                               nil];
+    }
+
+    if((server = [self _cachedServerForUID:_uid]))
+      return server;
+
+    q = [EOQualifier qualifierWithQualifierFormat:@"uid = %@", _uid];
+    
+    conn = [self ldapConnection];
+    resultEnum = [conn deepSearchAtBaseDN:ldapBaseDN
+                       qualifier:q
+                       attributes:attrs];
+    /* we just expect one entry, thus drop the rest */
+    entry = [resultEnum nextObject];
+    if(!entry) {
+      if(debugOn) {
+        NSLog(@"%s Didn't find LDAP entry for uid '%@'!",
+              __PRETTY_FUNCTION__,
+              _uid);
+      }
+      return nil;
+    }
+    attr = [entry attributeWithName:@"mineqMelRoutage"];
+    if(attr) {
+      unsigned i, count;
+      
+      count = [attr count];
+      serverCandidates = [NSMutableArray arrayWithCapacity:count];
+      for(i = 0; i < count; i++) {
+        NSRange r;
+        NSString *route;
+
+        route = [attr stringValueAtIndex:i];
+        r = [route rangeOfString:@".melanie2.i2" options:NSBackwardsSearch];
+        if(r.length > 0) {
+          unsigned length;
+
+          /* be clever */
+          length = [route length];
+          r = NSMakeRange(0, length - r.length);
+          r = [route rangeOfString:@"@" options:NSBackwardsSearch range:r];
+          if(r.length > 0) {
+            unsigned start;
+            NSRange serverNameRange;
+            
+            start = NSMaxRange(r);
+            serverNameRange = NSMakeRange(start, length - start);
+            r = NSMakeRange(0, length - start);
+            r = [route rangeOfString:@"%" options:NSBackwardsSearch range:r];
+            if(r.length > 0) {
+              NSString *serverName;
+              
+              serverName = [route substringWithRange:serverNameRange];
+              [serverCandidates addObject:serverName];
+            }
+          }
+        }
+      }
+    }
+    else {
+      if(debugOn) {
+      NSLog(@"%s LDAP entry for uid '%@' has no mineqMelRoutage entry?",
+            __PRETTY_FUNCTION__,
+            _uid);
+      }
+      serverCandidates = nil;
+    }
+    if([serverCandidates count] == 1) {
+      server = [serverCandidates objectAtIndex:0];
+    }
+
+    /* last resort */
+    if(!server) {
+      attr = [entry attributeWithName:@"mineqMelServeurPrincipal"];
+      if([attr count] > 0)
+        server = [attr stringValueAtIndex:0];
+    }
+
+    if(!server) {
+      if(debugOn) {
+        NSLog(@"%s no chance of getting at server info for user '%@', "
+              @"tried everything. Sorry.",
+              __PRETTY_FUNCTION__,
+              _uid);
+      }
+      return nil;
+    }
+
+    [self _cacheServer:server forUID:_uid];
+    return server;
+  }
+  else {
+    return @"mail.opengroupware.org";
+  }
 }
 
 @end
index b34384bdc31c030142c8e25c31b244114d073b2f..78bb6dd87d0e1100c492c7ff682fdd18ead93c46 100644 (file)
@@ -1,3 +1,9 @@
+2004-10-20  Marcus Mueller  <znek@mulle-kybernetik.com>
+
+       * AgenorUserManager.[hm]: slightly changed the interface for retrieving
+         the IMAP server, implemented all necessary LDAP functionality
+         (v0.9.24)
+
 2004-10-20  Helge Hess  <helge.hess@opengroupware.org>
 
        * moved NSString+iCal methods to NGiCal (v0.9.23)
index b280814040ad9c9f7d217404b081392f7d2dcace..bd94857084a6dc664a6571b4e993119a2b48354d 100644 (file)
@@ -1,6 +1,6 @@
 # Version file
 
-SUBMINOR_VERSION:=23
+SUBMINOR_VERSION:=24
 
 # v0.9.23 requires NGiCal        v4.3.32
 # v0.9.18 requires NGExtensions  v4.3.123