X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fvcard%2Fserv_vcard.c;h=2dcd127191c5fb787662538ef8b79fff8b90b8b5;hb=545c8447253a4d6281d89674074623f04ce55b36;hp=8efae6578f5748da50c9d6fe8e4e1b45fe05c17b;hpb=e26a8dee20d1726b4995821f717f867f50fc5659;p=citadel.git diff --git a/citadel/modules/vcard/serv_vcard.c b/citadel/modules/vcard/serv_vcard.c index 8efae6578..2dcd12719 100644 --- a/citadel/modules/vcard/serv_vcard.c +++ b/citadel/modules/vcard/serv_vcard.c @@ -91,7 +91,7 @@ void set_mm_valid(void) { * 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 *) ) { +void vcard_extract_internet_addresses(struct CtdlMessage *msg, int (*callback)(char *, char *) ) { struct vCard *v; char *s; char *k; @@ -132,20 +132,21 @@ void vcard_extract_internet_addresses(struct CtdlMessage *msg, void (*callback)( vcard_free(v); } - - +///TODO: gettext! +#define _(a) a /* * Callback for vcard_add_to_directory() * (Lotsa ugly nested callbacks. Oh well.) */ -void vcard_directory_add_user(char *internet_addr, char *citadel_addr) { +int vcard_directory_add_user(char *internet_addr, char *citadel_addr) { + struct CitContext *CCC = CC; 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) { + if (CCC->logged_in) { syslog(LOG_DEBUG, "Checking for <%s>...\n", internet_addr); if (CtdlDirectoryLookup(buf, internet_addr, sizeof buf) == 0) { if (strcasecmp(buf, citadel_addr)) { @@ -153,12 +154,33 @@ void vcard_directory_add_user(char *internet_addr, char *citadel_addr) { * Bail out silently without saving. */ syslog(LOG_DEBUG, "DOOP!\n"); - return; + + StrBufAppendPrintf(CCC->StatusMessage, "\n%d|", ERROR+ALREADY_EXISTS); + StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress again."), -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("\n"), 0); + return 0; } } } syslog(LOG_INFO, "Adding %s (%s) to directory\n", citadel_addr, internet_addr); - CtdlDirectoryAddUser(internet_addr, citadel_addr); + if (CtdlDirectoryAddUser(internet_addr, citadel_addr)) + { + StrBufAppendPrintf(CCC->StatusMessage, "\n%d|", CIT_OK); + StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + StrBufAppendBufPlain(CCC->StatusMessage, _("successfully addded emailaddress."), -1, 0); + return 1; + } + else + { + StrBufAppendPrintf(CCC->StatusMessage, "\n%d|", ERROR+ ILLEGAL_VALUE); + StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress; its not matching our domain."), -1, 0); + return 0; + } } @@ -198,6 +220,7 @@ void cmd_igab(char *argbuf) { CtdlDirectoryInit(); /* We want *all* vCards in this room */ + NewStrBufDupAppendFlush(&CC->StatusMessage, NULL, NULL, 0); CtdlForEachMessage(MSGS_ALL, 0, NULL, "[Tt][Ee][Xx][Tt]/.*[Vv][Cc][Aa][Rr][Dd]$", NULL, vcard_add_to_directory, NULL); @@ -213,10 +236,14 @@ void cmd_igab(char *argbuf) { * Internet messages. If there is, stick it in the buffer. */ void extract_inet_email_addrs(char *emailaddrbuf, size_t emailaddrbuf_len, - char *secemailaddrbuf, size_t secemailaddrbuf_len, - struct vCard *v, int local_addrs_only) { + char *secemailaddrbuf, size_t secemailaddrbuf_len, + struct vCard *v, + int local_addrs_only) +{ + struct CitContext *CCC = CC; /* put this on the stack, just for speed */ char *s, *k, *addr; int instance = 0; + int IsDirectoryAddress; int saved_instance = 0; /* Go through the vCard searching for *all* Internet email addresses @@ -227,8 +254,9 @@ void extract_inet_email_addrs(char *emailaddrbuf, size_t emailaddrbuf_len, addr = strdup(s); striplt(addr); if (!IsEmptyStr(addr)) { - if ( (IsDirectory(addr, 1)) || - (!local_addrs_only) ) { + IsDirectoryAddress = IsDirectory(addr, 1); + if ( IsDirectoryAddress || !local_addrs_only) + { ++saved_instance; if ((saved_instance == 1) && (emailaddrbuf != NULL)) { safestrncpy(emailaddrbuf, addr, emailaddrbuf_len); @@ -244,6 +272,13 @@ void extract_inet_email_addrs(char *emailaddrbuf, size_t emailaddrbuf_len, } } } + if (!IsDirectoryAddress && local_addrs_only) + { + StrBufAppendPrintf(CCC->StatusMessage, "\n%d|", ERROR+ ILLEGAL_VALUE); + StrBufAppendBufPlain(CCC->StatusMessage, addr, -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress; its not matching our domain."), -1, 0); + } } free(addr); } @@ -318,6 +353,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { && (!strcasecmp(&CC->room.QRname[11], USERCONFIGROOM)) ) { /* Yes, we want to do this */ yes_my_citadel_config = 1; + syslog(LOG_DEBUG, "GAB: user config room detected"); #ifdef VCARD_SAVES_BY_AIDES_ONLY /* Prevent non-aides from performing registration changes */ @@ -331,6 +367,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { /* Is this a room with an address book in it? */ if (CC->room.QRdefaultview == VIEW_ADDRESSBOOK) { yes_any_vcard_room = 1; + syslog(LOG_DEBUG, "GAB: address book room detected"); } /* If neither condition exists, don't run this hook. */ @@ -362,7 +399,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { } s = vcard_get_prop(v, "fn", 1, 0, 0); - if (s) syslog(LOG_DEBUG, "vCard beforesave hook running for <%s>\n", s); + if (s) syslog(LOG_DEBUG, "GAB: vCard beforesave hook running for <%s>\n", s); if (yes_my_citadel_config) { /* Bingo! The user is uploading a new vCard, so @@ -393,6 +430,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { * vCard in the user's config room at all times. * */ + syslog(LOG_DEBUG, "GAB: deleting old vCard for user"); CtdlDeleteMessages(CC->room.QRname, NULL, 0, "[Tt][Ee][Xx][Tt]/.*[Vv][Cc][Aa][Rr][Dd]$"); /* Make the author of the message the name of the user. */ @@ -468,6 +506,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { /* Now allow the save to complete. */ vcard_free(v); + syslog(LOG_DEBUG, "GAB: save will proceed"); return(0); } @@ -496,20 +535,28 @@ int vcard_upload_aftersave(struct CtdlMessage *msg) { if ( (strlen(CC->room.QRname) >= 12) && (!strcasecmp(&CC->room.QRname[11], USERCONFIGROOM)) ) { is_UserConf = 1; /* It's someone's config room */ + syslog(LOG_DEBUG, "GAB: this is someone's config room"); } CtdlMailboxName(roomname, sizeof roomname, &CC->user, USERCONFIGROOM); if (!strcasecmp(CC->room.QRname, roomname)) { is_UserConf = 1; is_MY_UserConf = 1; /* It's MY config room */ + syslog(LOG_DEBUG, "GAB: this is MY config room"); } if (!strcasecmp(CC->room.QRname, ADDRESS_BOOK_ROOM)) { is_GAB = 1; /* It's the Global Address Book */ + syslog(LOG_DEBUG, "GAB: this is the Global Address Book"); } if (!is_UserConf && !is_GAB) return(0); ptr = msg->cm_fields['M']; if (ptr == NULL) return(0); + + NewStrBufDupAppendFlush(&CC->StatusMessage, NULL, NULL, 0); + + StrBufPrintf(CC->StatusMessage, "%d\n", LISTING_FOLLOWS); + while (ptr != NULL) { linelen = strcspn(ptr, "\n"); @@ -538,6 +585,7 @@ int vcard_upload_aftersave(struct CtdlMessage *msg) { if (!is_GAB) { // This is not the GAB /* Put it in the Global Address Book room... */ + syslog(LOG_DEBUG, "GAB: copying to Global Address Book"); CtdlSaveMsgPointerInRoom(ADDRESS_BOOK_ROOM, I, 1, msg); }