if (ou == NULL) return -1;
if (cn == NULL) return -1;
- sprintf(this_dn, "cn=%s,ou=%s,%s", cn, ou, config.c_ldap_base_dn);
+ sprintf(this_dn, "euid=%s,ou=%s,%s", cn, ou, config.c_ldap_base_dn);
+
+ lprintf(CTDL_INFO, "LDAP: Calling ldap_add_s() for dn of '%s'\n", this_dn);
/* The last attribute must be a NULL one. */
attrs = (LDAPMod **)*object;
if (attrs)
{
while (attrs[num_attrs])
+ {
+ count = 0;
+ while (attrs[num_attrs]->mod_values[count])
+ {
+ lprintf (CTDL_DEBUG, "LDAP: attribute %d, value %d = \'%s=%s\'\n", num_attrs, count, attrs[num_attrs]->mod_type, attrs[num_attrs]->mod_values[count]);
+ count++;
+ }
num_attrs++;
+ }
+ }
+ else
+ {
+ lprintf(CTDL_ERR, "LDAP: no attributes in CtdlSaveLdapObject\n");
+ return -1;
}
-
- lprintf(CTDL_DEBUG, "LDAP: Calling ldap_add_s() for '%s'\n", this_dn);
begin_critical_section(S_LDAP);
i = ldap_add_s(dirserver, this_dn, attrs);
end_critical_section(S_LDAP);
+
+ if (i == LDAP_SERVER_DOWN)
+ { // failed to connect so try to re init the connection
+ serv_ldap_cleanup();
+ CtdlConnectToLdap();
+ // And try the save again.
+ begin_critical_section(S_LDAP);
+ i = ldap_add_s(dirserver, this_dn, attrs);
+ end_critical_section(S_LDAP);
+ }
/* If the entry already exists, repopulate it instead */
if (i == LDAP_ALREADY_EXISTS) {
for (j=0; j<(num_attrs); ++j) {
attrs[j]->mod_op = LDAP_MOD_REPLACE;
}
- lprintf(CTDL_DEBUG, "LDAP: Calling ldap_modify_s() for '%s'\n", this_dn);
+ lprintf(CTDL_INFO, "LDAP: Calling ldap_modify_s() for dn of '%s'\n", this_dn);
begin_critical_section(S_LDAP);
i = ldap_modify_s(dirserver, this_dn, attrs);
end_critical_section(S_LDAP);
char state[3];
char zipcode[10];
char calFBURL[256];
+ char *EUID=NULL;
if (msg == NULL) return;
if (msg->cm_fields['M'] == NULL) return;
/* Add a "cn" (Common Name) attribute based on the user's screen name,
* but only there was no 'fn' (full name) property in the vCard
*/
- if (!have_cn) {
+ if (!have_cn)
(void) CtdlDoDirectoryServiceFunc("cn", msg->cm_fields['A'], &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
- }
/* Add a "calFBURL" attribute if a calendar free/busy URL exists */
if (!IsEmptyStr(calFBURL)) {
(void) CtdlDoDirectoryServiceFunc("calFBURL", calFBURL, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
}
- (void) CtdlDoDirectoryServiceFunc(msg->cm_fields['A'], msg->cm_fields['N'], &objectlist, "ldap", DIRECTORY_SAVE_OBJECT);
-
+ // Add this messages EUID as the primary key for this entry.
+ EUID=msg->cm_fields['E'];
+ (void) CtdlDoDirectoryServiceFunc("euid", EUID, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
+
+
+ (void) CtdlDoDirectoryServiceFunc(EUID, msg->cm_fields['N'], &objectlist, "ldap", DIRECTORY_SAVE_OBJECT);
+
(void) CtdlDoDirectoryServiceFunc(NULL, NULL, &objectlist, "ldap", DIRECTORY_FREE_OBJECT);
lprintf(CTDL_DEBUG, "LDAP write operation complete.\n");
}
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
+# euid used to provide unique identifier for GAB entries
+attributetype ( 1.3.6.1.4.1.25404.1.1.2
+ NAME 'euid'
+ DESC 'unique GAB entry'
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{256} )
+
##########################
# citadel object classes #
##########################
DESC 'Citadel Internet Organizational Person'
SUP inetOrgPerson
STRUCTURAL
+ MUST ( euid )
MAY ( c $
alias $
calFBURL )