#include <sys/wait.h>
#include <string.h>
#include <limits.h>
+#include <libcitadel.h>
#include "citadel.h"
#include "server.h"
#include "citserver.h"
#include "database.h"
#include "msgbase.h"
#include "internet_addressing.h"
-#include "tools.h"
-#include "mime_parser.h"
-#include "vcard.h"
#include "serv_vcard.h"
#include "ctdl_module.h"
void ctdl_vcard_to_directory(struct CtdlMessage *msg, int op) {
struct vCard *v = NULL;
int i;
- int num_emails = 0;
- int num_phones = 0;
int have_addr = 0;
int have_cn = 0;
char state[3];
char zipcode[10];
char calFBURL[256];
- char *EUID=NULL;
+ char ldap_dn[SIZ];
if (msg == NULL) return;
if (msg->cm_fields['M'] == NULL) return;
msg->cm_fields['N']
);
+ sprintf(ldap_dn, "euid=%s,ou=%s", msg->cm_fields['E'], msg->cm_fields['N']);
+
/* Are we just deleting? If so, it's simple... */
if (op == V2L_DELETE) {
- (void) CtdlDoDirectoryServiceFunc (msg->cm_fields['A'], msg->cm_fields['N'], NULL, "ldap", DIRECTORY_USER_DEL);
+ (void) CtdlDoDirectoryServiceFunc (ldap_dn, NULL, NULL, "ldap", DIRECTORY_USER_DEL);
return;
}
extract_token(state, v->prop[i].value, 4, ';', sizeof state);
extract_token(zipcode, v->prop[i].value, 5, ';', sizeof zipcode);
+ // ldap requires these fields to be something
+ if (IsEmptyStr(street)) strcpy(street, "_");
+ if (IsEmptyStr(zipcode)) strcpy(zipcode, "_");
+ if (IsEmptyStr(city)) strcpy(city, "_");
+ if (IsEmptyStr(state)) strcpy(state, "_");
+
(void) CtdlDoDirectoryServiceFunc("street", street, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
(void) CtdlDoDirectoryServiceFunc("l", city, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
(void) CtdlDoDirectoryServiceFunc("st", state, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
}
}
+ if (!strcasecmp(v->prop[i].name, "tel;home"))
+ (void) CtdlDoDirectoryServiceFunc("homePhone", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
+ else
+ if (!strcasecmp(v->prop[i].name, "tel;fax"))
+ (void) CtdlDoDirectoryServiceFunc("facsimileTelephoneNumber", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
+ else
+ if (!strcasecmp(v->prop[i].name, "tel;cell"))
+ (void) CtdlDoDirectoryServiceFunc("mobile", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
+ else
if ( (!strcasecmp(v->prop[i].name, "tel"))
||(!strncasecmp(v->prop[i].name, "tel;", 4)) ) {
- ++num_phones;
- /* The first 'tel' property creates the 'telephoneNumber' attribute */
- if (num_phones == 1) {
- (void) CtdlDoDirectoryServiceFunc("telephoneNumber", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
- }
- /* Subsequent 'tel' properties *add to* the 'telephoneNumber' attribute */
- else {
- (void) CtdlDoDirectoryServiceFunc("telephoneNumber", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
- }
+ (void) CtdlDoDirectoryServiceFunc("telephoneNumber", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
}
if ( (!strcasecmp(v->prop[i].name, "email"))
||(!strcasecmp(v->prop[i].name, "email;internet")) ) {
-
- ++num_emails;
- lprintf(CTDL_DEBUG, "email addr %d\n", num_emails);
-
- /* The first email address creates the 'mail' attribute */
- if (num_emails == 1) {
- (void) CtdlDoDirectoryServiceFunc("mail", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
- }
- /* The second and subsequent email address creates the 'alias' attribute */
- else if (num_emails >= 2) {
- (void) CtdlDoDirectoryServiceFunc("alias", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
- }
+ (void) CtdlDoDirectoryServiceFunc("mail", v->prop[i].value, &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
}
/* Calendar free/busy URL (take the first one we find, but if a subsequent
}
// 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['E'], &objectlist, "ldap", DIRECTORY_ATTRIB_ADD);
- (void) CtdlDoDirectoryServiceFunc(EUID, msg->cm_fields['N'], &objectlist, "ldap", DIRECTORY_SAVE_OBJECT);
+ (void) CtdlDoDirectoryServiceFunc(ldap_dn, NULL, &objectlist, "ldap", DIRECTORY_SAVE_OBJECT);
(void) CtdlDoDirectoryServiceFunc(NULL, NULL, &objectlist, "ldap", DIRECTORY_FREE_OBJECT);
- lprintf(CTDL_DEBUG, "LDAP write operation complete.\n");
+ lprintf(CTDL_DEBUG, "Directory Services write operation complete.\n");
}
char *argbuf = &cmdbuf[4];
extract_token(internet_addr, argbuf, 0, '|', sizeof internet_addr);
- rcpt = validate_recipients(internet_addr);
+ rcpt = validate_recipients(internet_addr, CHECK_EXISTANCE);
if ((rcpt != NULL)&&
(
(*rcpt->recp_local != '\0')||
char filename[256];
FILE *fp;
- CtdlRegisterSessionHook(vcard_session_login_hook, EVT_LOGIN);
- CtdlRegisterMessageHook(vcard_upload_beforesave, EVT_BEFORESAVE);
- CtdlRegisterMessageHook(vcard_upload_aftersave, EVT_AFTERSAVE);
- CtdlRegisterDeleteHook(vcard_delete_remove);
- CtdlRegisterProtoHook(cmd_regi, "REGI", "Enter registration info");
- CtdlRegisterProtoHook(cmd_greg, "GREG", "Get registration info");
- CtdlRegisterProtoHook(cmd_igab, "IGAB",
- "Initialize Global Address Book");
- CtdlRegisterProtoHook(cmd_qdir, "QDIR", "Query Directory");
- CtdlRegisterProtoHook(cmd_gvsn, "GVSN", "Get Valid Screen Names");
- CtdlRegisterProtoHook(cmd_gvea, "GVEA", "Get Valid Email Addresses");
- CtdlRegisterProtoHook(cmd_dvca, "DVCA", "Dump VCard Addresses");
- CtdlRegisterUserHook(vcard_newuser, EVT_NEWUSER);
- CtdlRegisterUserHook(vcard_purge, EVT_PURGEUSER);
- CtdlRegisterNetprocHook(vcard_extract_from_network);
- CtdlRegisterSessionHook(store_harvested_addresses, EVT_TIMER);
- CtdlRegisterFixedOutputHook("text/x-vcard", vcard_fixed_output);
- CtdlRegisterFixedOutputHook("text/vcard", vcard_fixed_output);
-
- /* Create the Global ADdress Book room if necessary */
- create_room(ADDRESS_BOOK_ROOM, 3, "", 0, 1, 0, VIEW_ADDRESSBOOK);
+ if (!threading)
+ {
+ CtdlRegisterSessionHook(vcard_session_login_hook, EVT_LOGIN);
+ CtdlRegisterMessageHook(vcard_upload_beforesave, EVT_BEFORESAVE);
+ CtdlRegisterMessageHook(vcard_upload_aftersave, EVT_AFTERSAVE);
+ CtdlRegisterDeleteHook(vcard_delete_remove);
+ CtdlRegisterProtoHook(cmd_regi, "REGI", "Enter registration info");
+ CtdlRegisterProtoHook(cmd_greg, "GREG", "Get registration info");
+ CtdlRegisterProtoHook(cmd_igab, "IGAB",
+ "Initialize Global Address Book");
+ CtdlRegisterProtoHook(cmd_qdir, "QDIR", "Query Directory");
+ CtdlRegisterProtoHook(cmd_gvsn, "GVSN", "Get Valid Screen Names");
+ CtdlRegisterProtoHook(cmd_gvea, "GVEA", "Get Valid Email Addresses");
+ CtdlRegisterProtoHook(cmd_dvca, "DVCA", "Dump VCard Addresses");
+ CtdlRegisterUserHook(vcard_newuser, EVT_NEWUSER);
+ CtdlRegisterUserHook(vcard_purge, EVT_PURGEUSER);
+ CtdlRegisterNetprocHook(vcard_extract_from_network);
+ CtdlRegisterSessionHook(store_harvested_addresses, EVT_TIMER);
+ CtdlRegisterFixedOutputHook("text/x-vcard", vcard_fixed_output);
+ CtdlRegisterFixedOutputHook("text/vcard", vcard_fixed_output);
+
+ /* Create the Global ADdress Book room if necessary */
+ create_room(ADDRESS_BOOK_ROOM, 3, "", 0, 1, 0, VIEW_ADDRESSBOOK);
+
+ /* Set expiration policy to manual; otherwise objects will be lost! */
+ if (!lgetroom(&qr, ADDRESS_BOOK_ROOM)) {
+ qr.QRep.expire_mode = EXPIRE_MANUAL;
+ qr.QRdefaultview = VIEW_ADDRESSBOOK; /* 2 = address book view */
+ lputroom(&qr);
- /* Set expiration policy to manual; otherwise objects will be lost! */
- if (!lgetroom(&qr, ADDRESS_BOOK_ROOM)) {
- qr.QRep.expire_mode = EXPIRE_MANUAL;
- qr.QRdefaultview = VIEW_ADDRESSBOOK; /* 2 = address book view */
- lputroom(&qr);
-
- /*
- * Also make sure it has a netconfig file, so the networker runs
- * on this room even if we don't share it with any other nodes.
- * This allows the CANCEL messages (i.e. "Purge this vCard") to be
- * purged.
- */
- assoc_file_name(filename, sizeof filename, &qr, ctdl_netcfg_dir);
- fp = fopen(filename, "a");
- if (fp != NULL) fclose(fp);
- chown(filename, CTDLUID, (-1));
- }
+ /*
+ * Also make sure it has a netconfig file, so the networker runs
+ * on this room even if we don't share it with any other nodes.
+ * This allows the CANCEL messages (i.e. "Purge this vCard") to be
+ * purged.
+ */
+ assoc_file_name(filename, sizeof filename, &qr, ctdl_netcfg_dir);
+ fp = fopen(filename, "a");
+ if (fp != NULL) fclose(fp);
+ chown(filename, CTDLUID, (-1));
+ }
- /* for postfix tcpdict */
- CtdlRegisterServiceHook(config.c_pftcpdict_port, /* Postfix */
- NULL,
- check_get_greeting,
- check_get,
- NULL,
- CitadelServiceDICT_TCP);
+ /* for postfix tcpdict */
+ CtdlRegisterServiceHook(config.c_pftcpdict_port, /* Postfix */
+ NULL,
+ check_get_greeting,
+ check_get,
+ NULL,
+ CitadelServiceDICT_TCP);
+ }
/* return our Subversion id for the Log */
return "$Id$";