]> code.citadel.org Git - citadel.git/commitdiff
* More work on LDAP connector
authorArt Cancro <ajc@citadel.org>
Wed, 4 Feb 2004 04:07:57 +0000 (04:07 +0000)
committerArt Cancro <ajc@citadel.org>
Wed, 4 Feb 2004 04:07:57 +0000 (04:07 +0000)
citadel/ChangeLog
citadel/serv_ldap.c

index 4090c92c35e23efa64ed9e52de1bcaea2a788d82..f86be0e3aa48ce56edbbaeb3a28eb39fe7428a69 100644 (file)
@@ -1,4 +1,7 @@
  $Log$
+ Revision 614.13  2004/02/04 04:07:56  ajc
+ * More work on LDAP connector
+
  Revision 614.12  2004/02/01 06:19:22  ajc
  * policy.c: fix bug in GetExpirePolicy() that was causing the default
    mailbox purge policy to be misinterpreted if it was set to "use
@@ -5258,4 +5261,3 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
-
index b581cef889c314e1b77297fc57ef38a46b82283b..11ebc6c90d13079ceb11930ebdcf6cbd0405a9cc 100644 (file)
@@ -209,9 +209,12 @@ void ctdl_vcard_to_ldap(struct CtdlMessage *msg) {
        char this_dn[SIZ];
        LDAPMod **attrs = NULL;
        int num_attrs = 0;
+       int num_emails = 0;
+       int alias_attr = (-1);
 
        char givenname[SIZ];
        char sn[SIZ];
+       char uid[SIZ];
 
        if (dirserver == NULL) return;
        if (msg == NULL) return;
@@ -231,6 +234,11 @@ void ctdl_vcard_to_ldap(struct CtdlMessage *msg) {
                msg->cm_fields['N'],
                config.c_ldap_base_dn
        );
+               
+       sprintf(uid, "%s@%s",
+               msg->cm_fields['A'],
+               msg->cm_fields['N']
+       );
 
        /* The first LDAP attribute will be an 'objectclass' list.  Citadel
         * doesn't do anything with this.  It's just there for compatibility
@@ -268,6 +276,59 @@ void ctdl_vcard_to_ldap(struct CtdlMessage *msg) {
                        extract_token(givenname,        v->prop[i].value, 1, ';');
                }
 
+               if (!strcasecmp(v->prop[i].name, "title")) {
+                       attrs = reallok(attrs, (sizeof(LDAPMod *) * ++num_attrs) );
+                       attrs[num_attrs-1] = mallok(sizeof(LDAPMod));
+                       memset(attrs[num_attrs-1], 0, sizeof(LDAPMod));
+                       attrs[num_attrs-1]->mod_op              = LDAP_MOD_ADD;
+                       attrs[num_attrs-1]->mod_type            = "title";
+                       attrs[num_attrs-1]->mod_values          = mallok(2 * sizeof(char *));
+                       attrs[num_attrs-1]->mod_values[0]       = strdoop(v->prop[i].value);
+                       attrs[num_attrs-1]->mod_values[1]       = NULL;
+               }
+
+               if ( (!strcasecmp(v->prop[i].name, "email"))
+                  ||(!strcasecmp(v->prop[i].name, "email;internet")) ) {
+       
+                       ++num_emails;
+                       lprintf(9, "email addr %d\n", num_emails);
+
+                       /* The first email address creates the 'mail' attribute */
+                       if (num_emails == 1) {
+                               attrs = reallok(attrs, (sizeof(LDAPMod *) * ++num_attrs) );
+                               attrs[num_attrs-1] = mallok(sizeof(LDAPMod));
+                               memset(attrs[num_attrs-1], 0, sizeof(LDAPMod));
+                               attrs[num_attrs-1]->mod_op              = LDAP_MOD_ADD;
+                               attrs[num_attrs-1]->mod_type            = "mail";
+                               attrs[num_attrs-1]->mod_values          = mallok(2 * sizeof(char *));
+                               attrs[num_attrs-1]->mod_values[0]       = strdoop(v->prop[i].value);
+                               attrs[num_attrs-1]->mod_values[1]       = NULL;
+                       }
+                       /* The second email address creates the 'alias' attribute */
+                       else if (num_emails == 2) {
+                               attrs = reallok(attrs, (sizeof(LDAPMod *) * ++num_attrs) );
+                               alias_attr = num_attrs-1;
+                               attrs[alias_attr] = mallok(sizeof(LDAPMod));
+                               memset(attrs[alias_attr], 0, sizeof(LDAPMod));
+                               attrs[alias_attr]->mod_op               = LDAP_MOD_ADD;
+                               attrs[alias_attr]->mod_type             = "alias";
+                               attrs[alias_attr]->mod_values           = mallok(2 * sizeof(char *));
+                               attrs[alias_attr]->mod_values[0]        = strdoop(v->prop[i].value);
+                               attrs[alias_attr]->mod_values[1]        = NULL;
+                       }
+                       /* Subsequent email addresses *add to* the 'alias' attribute */
+                       else if (num_emails > 2) {
+                               attrs[alias_attr]->mod_values = reallok(attrs[alias_attr]->mod_values,
+                                                                    num_emails * sizeof(char *));
+                               attrs[alias_attr]->mod_values[num_emails-2]
+                                                                       = strdoop(v->prop[i].value);
+                               attrs[alias_attr]->mod_values[num_emails-1]
+                                                                       = NULL;
+                       }
+
+
+               }
+
        }
        vcard_free(v);  /* Don't need this anymore. */
 
@@ -280,7 +341,7 @@ void ctdl_vcard_to_ldap(struct CtdlMessage *msg) {
        attrs[num_attrs-1]->mod_values          = mallok(2 * sizeof(char *));
        attrs[num_attrs-1]->mod_values[0]       = strdoop(sn);
        attrs[num_attrs-1]->mod_values[1]       = NULL;
-       
+
        /* "givenname" (first name) based on info in vCard */
        attrs = reallok(attrs, (sizeof(LDAPMod *) * ++num_attrs) );
        attrs[num_attrs-1] = mallok(sizeof(LDAPMod));
@@ -291,12 +352,20 @@ void ctdl_vcard_to_ldap(struct CtdlMessage *msg) {
        attrs[num_attrs-1]->mod_values[0]       = strdoop(givenname);
        attrs[num_attrs-1]->mod_values[1]       = NULL;
 
+       /* "uid" is a Kolab compatibility thing.  We just do cituser@citnode */
+       attrs = reallok(attrs, (sizeof(LDAPMod *) * ++num_attrs) );
+       attrs[num_attrs-1] = mallok(sizeof(LDAPMod));
+       memset(attrs[num_attrs-1], 0, sizeof(LDAPMod));
+       attrs[num_attrs-1]->mod_op              = LDAP_MOD_ADD;
+       attrs[num_attrs-1]->mod_type            = "uid";
+       attrs[num_attrs-1]->mod_values          = mallok(2 * sizeof(char *));
+       attrs[num_attrs-1]->mod_values[0]       = strdoop(uid);
+       attrs[num_attrs-1]->mod_values[1]       = NULL;
+
        /* The last attribute must be a NULL one. */
        attrs = realloc(attrs, (sizeof(LDAPMod *) * ++num_attrs) );
        attrs[num_attrs - 1] = NULL;
        
-       lprintf(9, "this_dn: <%s>\n", this_dn);
-
        lprintf(9, "Calling ldap_add_s()\n");
        begin_critical_section(S_LDAP);
        i = ldap_add_s(dirserver, this_dn, attrs);