]> err.no Git - scalable-opengroupware.org/commitdiff
some LDAP stuff
authorznek <znek@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 19 Oct 2004 17:53:46 +0000 (17:53 +0000)
committerznek <znek@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 19 Oct 2004 17:53:46 +0000 (17:53 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@411 d1b88da0-ebda-0310-925b-ed51d893ca5b

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

index 2198a063b9f6b831115e22e4e7d32b31851102af..e9d301e3f6baf4d2ae63054fa6f29f748cad93ca 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-19  Marcus Mueller  <znek@mulle-kybernetik.com>
+
+       * SOGoMailAccounts.m: values for toManyRelationshipKeys are constructed
+         from information retrieved by the AgenorUserManager now. (v0.9.34)
+
 2004-10-11  Helge Hess  <helge.hess@opengroupware.org>
 
        * SOGoDraftsFolder.m: added methods to deal with new draft objects
index 0682a40a4c119d6f0e4b752582cfea1175181e21..078269c10e59739cf1b79f9685b465c1ffa5ace1 100644 (file)
 #include "SOGoMailAccounts.h"
 #include "common.h"
 #include <NGObjWeb/SoObject+SoDAV.h>
+#include <SOGoLogic/AgenorUserManager.h>
 
 @implementation SOGoMailAccounts
 
 /* listing the available mailboxes */
 
 - (NSArray *)toManyRelationshipKeys {
-  // TODO: hardcoded, need to implement the Agenor Anais LDAP query?
-  return [NSArray arrayWithObjects:
-                   @"agenortest@mail.opengroupware.org",
-                 nil];
+  static AgenorUserManager *um = nil;
+  NSString *uid, *server, *account;
+
+  if(!um)
+    um = [AgenorUserManager sharedUserManager];
+  uid = [[self container] davDisplayName];
+  server = [um getIMAPServerForUID:uid];
+  if(!server)
+    return nil;
+  account = [NSString stringWithFormat:@"%@@%@",
+                                       uid,
+                                       server];
+  return [NSArray arrayWithObject:account];
 }
 
 /* name lookup */
index a416fb2da5b737d088c2e68031da10b3fd57ee26..8d1e9bd6bf0563028ada61e19a231d8cfede140f 100644 (file)
@@ -1,3 +1,3 @@
 # $Id$
 
-SUBMINOR_VERSION:=33
+SUBMINOR_VERSION:=34
index 2d9177e285e3eeb24d4ff12c40ccb5c52589b6b3..910ded38aff70224521c8cde1f503ee68c0c1ec1 100644 (file)
@@ -40,6 +40,8 @@
 
 - (NSString *)getCNForUID:(NSString *)_uid;
 
+- (NSString *)getIMAPServerForUID:(NSString *)_uid;
+
 @end
 
 #endif /* __AgenorUserManager_H_ */
index 60842b44afed50b421217225e320e8fd13079587..062aa26265f2aaf9c531887c1c7eb83576efb97e 100644 (file)
 // $Id$
 
 
-#import "AgenorUserManager.h"
+#include "AgenorUserManager.h"
+#include <NGLdap/NGLdap.h>
+
+
+@interface AgenorUserManager (PrivateAPI)
+- (NGLdapConnection *)ldapConnection;
+@end
 
 
 @implementation AgenorUserManager
 
+static BOOL     debugOn     = NO;
+static BOOL     useLDAP     = NO;
+static NSString *ldapHost   = nil;
+static NSString *ldapBaseDN = nil;
+
++ (void)initialize {
+  static BOOL didInit = NO;
+  NSUserDefaults *ud;
+
+  if(didInit)
+    return;
+  didInit = YES;
+  ud = [NSUserDefaults standardUserDefaults];
+  debugOn = [ud boolForKey:@"SOGoUserManagerDebugEnabled"];
+  useLDAP = [ud boolForKey:@"SOGoUserManagerUsesLDAP"];
+  if(useLDAP) {
+    ldapHost   = [[ud stringForKey:@"SOGoLDAPHost"] retain];
+    ldapBaseDN = [[ud stringForKey:@"SOGoLDAPBaseDN"] retain];
+  }
+}
+
 + (id)sharedUserManager {
   static id mgr = nil;
   if(mgr == nil) {
   [super dealloc];
 }
 
+- (NGLdapConnection *)ldapConnection {
+  static NGLdapConnection *ldapConnection = nil;
+  if(!ldapConnection) {
+    ldapConnection = [[NGLdapConnection alloc] initWithHostName:ldapHost];
+#if 0
+    [ldapConnection setUseCache:YES];
+#endif
+  }
+  return ldapConnection;
+}
 
 - (NSString *)getUIDForEmail:(NSString *)_email {
   NSRange r;
 }
 
 - (NSString *)getCNForUID:(NSString *)_uid {
-#warning !! IMPLEMENT ME!!
-  NSString *s;
-  NSRange  r;
-  
-  s = _uid;
-  if ([s length] < 10)
+  if(useLDAP) {
+    static NSArray   *cnAttrs = nil;
+    NGLdapConnection *conn;
+    EOQualifier      *q;
+    NSEnumerator     *resultEnum;
+    NGLdapEntry      *entry;
+    NGLdapAttribute  *cnAttr;
+
+    if(!cnAttrs) {
+      cnAttrs = [[NSArray alloc] initWithObjects:@"cn", nil];
+    }
+    q = [EOQualifier qualifierWithQualifierFormat:@"uid = %@", _uid];
+    
+    conn = [self ldapConnection];
+    resultEnum = [conn deepSearchAtBaseDN:ldapBaseDN
+                       qualifier:q
+                       attributes:cnAttrs];
+    entry = [resultEnum nextObject];
+    if(!entry) {
+      if(debugOn) {
+        NSLog(@"Didn't find LDAP entry for uid '%@'!", _uid);
+      }
+      return nil;
+    }
+    cnAttr = [entry attributeWithName:@"cn"];
+    if(!cnAttr && debugOn) {
+      NSLog(@"LDAP entry for uid '%@' has no common name?", _uid);
+    }
+    return [cnAttr stringValueAtIndex:0];
+  }
+  else {
+    NSString *s;
+    NSRange  r;
+    
+    s = _uid;
+    if ([s length] < 10)
       return s;
-  
-  // TODO: algorithm might be inappropriate, depends on the actual UID
-  r = [s rangeOfString:@"."];
-  if (r.length == 0)
+    
+    // TODO: algorithm might be inappropriate, depends on the actual UID
+    r = [s rangeOfString:@"."];
+    if (r.length == 0)
       return s;
-  
-  return [s substringToIndex:r.location];
+    
+    return [s substringToIndex:r.location];
+  }
+}
+
+- (NSString *)getIMAPServerForUID:(NSString *)_uid {
+  /*
+   First of all : for a particular user IMAP and SMTP are served on the same
+   host.
+   
+   The name of the machine is determined by applying a regex on every values of
+   the mineqMelRoutage LDAP attribute.
+   The regex is :   .*%.*@(.*\.melanie2\.i2$)
+   It extracts the substring that follows '@', ends with 'melanie2', on
+   adresses which have a '%' before the '@'
+   
+   Example: helge.hesse%opengroupware.org@servername1.melanie2.i2
+   -> servername1.melanie2.i2
+   
+   If only one server name is found by applying the regex on every value of the
+   attribute, then this name is the IMAP/SMTP server for that user.
+   Note that this is the case when we got a unique (well formed) value for the
+   attribute.
+   If the regex finds more than one servername when applied to the differents
+   values, then the IMAP/SMTP server name is to be found in the
+   mineqMelServeurPrincipal attribute of the user.
+   */
+  return @"mail.opengroupware.org";
 }
 
 @end
index 5e2ddc316e0654f78802d4496f3f95ed9acebb89..7d9cc6ebd04030e626f96a369311419465b76e43 100644 (file)
@@ -1,3 +1,9 @@
+2004-10-19  Marcus Mueller  <znek@mulle-kybernetik.com>
+
+       * AgenorUserManager.[hm]: added an interface to retrieve the IMAP
+         server for a particular UID. Also, AgenorUserManager uses LDAP
+         now *if* certain defaults are set. (v0.9.22)
+
 2004-10-19  Helge Hess  <helge.hess@opengroupware.org>
 
        * v0.9.21
index c331e5f9560a9c8ac40eac5083db40271f964a2b..79ebcd59330ff69b78e6289cd06ea317d3956040 100644 (file)
@@ -1,6 +1,6 @@
 # $Id$
 
-SUBMINOR_VERSION:=20
+SUBMINOR_VERSION:=22
 
 # v0.9.18 requires NGExtensions  v4.3.123
 # v0.9.13 requires libFoundation v1.0.62