-
-/*
- * Extract Internet e-mail addresses from a message containing a vCard, and
- * perform a callback for any found.
- */
-void vcard_extract_internet_addresses(struct CtdlMessage *msg, void (*callback)(char *, char *) ) {
- struct vCard *v;
- char *s;
- char *k;
- char *addr;
- char citadel_address[SIZ];
- int instance = 0;
- int found_something = 0;
-
- if (msg->cm_fields['A'] == NULL) return;
- if (msg->cm_fields['N'] == NULL) return;
- snprintf(citadel_address, sizeof citadel_address, "%s @ %s",
- msg->cm_fields['A'], msg->cm_fields['N']);
-
- v = vcard_load(msg->cm_fields['M']);
- if (v == NULL) return;
-
- /* Go through the vCard searching for *all* instances of
- * the "email;internet" key
- */
- do {
- s = vcard_get_prop(v, "email", 1, instance, 0); /* get any 'email' field */
- k = vcard_get_prop(v, "email", 1, instance++, 1); /* but also learn it with attrs */
- if ( (s != NULL) && (k != NULL) && (bmstrcasestr(k, "internet")) ) {
- addr = strdup(s);
- striplt(addr);
- if (!IsEmptyStr(addr)) {
- if (callback != NULL) {
- callback(addr, citadel_address);
- }
- }
- free(addr);
- found_something = 1;
- }
- else {
- found_something = 0;
- }
- } while(found_something);
-
- vcard_free(v);
-}
-
-
-/*
- * Callback for vcard_add_to_directory()
- * (Lotsa ugly nested callbacks. Oh well.)
- */
-void vcard_directory_add_user(char *internet_addr, char *citadel_addr) {
- char buf[SIZ];
-
- /* We have to validate that we're not stepping on someone else's
- * email address ... but only if we're logged in. Otherwise it's
- * probably just the networker or something.
- */
- if (CC->logged_in) {
- CtdlLogPrintf(CTDL_DEBUG, "Checking for <%s>...\n", internet_addr);
- if (CtdlDirectoryLookup(buf, internet_addr, sizeof buf) == 0) {
- if (strcasecmp(buf, citadel_addr)) {
- /* This address belongs to someone else.
- * Bail out silently without saving.
- */
- CtdlLogPrintf(CTDL_DEBUG, "DOOP!\n");
- return;
- }
- }
- }
- CtdlLogPrintf(CTDL_INFO, "Adding %s (%s) to directory\n", citadel_addr, internet_addr);
- CtdlDirectoryAddUser(internet_addr, citadel_addr);
-}
-
-
-/*
- * Back end function for cmd_igab()
- */
-void vcard_add_to_directory(long msgnum, void *data) {
- struct CtdlMessage *msg;
-
- msg = CtdlFetchMessage(msgnum, 1);
- if (msg != NULL) {
- vcard_extract_internet_addresses(msg, vcard_directory_add_user);
- }
-
- CtdlFreeMessage(msg);
-}
-
-
-/*
- * Initialize Global Adress Book
- */
-void cmd_igab(char *argbuf) {
- char hold_rm[ROOMNAMELEN];
-
- if (CtdlAccessCheck(ac_aide)) return;
-
- strcpy(hold_rm, CC->room.QRname); /* save current room */
-
- if (CtdlGetRoom(&CC->room, ADDRESS_BOOK_ROOM) != 0) {
- CtdlGetRoom(&CC->room, hold_rm);
- cprintf("%d cannot get address book room\n", ERROR + ROOM_NOT_FOUND);
- return;
- }
-
- /* Empty the existing database first.
- */
- CtdlDirectoryInit();
-
- /* We want *all* vCards in this room */
- CtdlForEachMessage(MSGS_ALL, 0, NULL, "^[Tt][Ee][Xx][Tt]/.*[Vv][Cc][Aa][Rr][Dd]$",
- NULL, vcard_add_to_directory, NULL);
-
- CtdlGetRoom(&CC->room, hold_rm); /* return to saved room */
- cprintf("%d Directory has been rebuilt.\n", CIT_OK);
-}
-
-
-