From e40ba85133cf6401bda3d6b81a1d144d73d25074 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 22 Nov 2011 12:13:11 +0100 Subject: [PATCH] work on a way to output the success / failure state for editing a user vcard to the user editing his personal vcard. --- citadel/context.c | 2 +- citadel/context.h | 1 + citadel/internet_addressing.c | 10 +++-- citadel/internet_addressing.h | 4 +- citadel/modules/vcard/serv_vcard.c | 59 ++++++++++++++++++++++------ citadel/msgbase.c | 63 ++++++++++++++++++------------ webcit/vcard_edit.c | 21 +++++----- 7 files changed, 108 insertions(+), 52 deletions(-) diff --git a/citadel/context.c b/citadel/context.c index dd51112cc..7993ce08c 100644 --- a/citadel/context.c +++ b/citadel/context.c @@ -374,7 +374,7 @@ void RemoveContext (CitContext *con) free(con->ldap_dn); con->ldap_dn = NULL; } - + FreeStrBuf(&con->StatusMessage); FreeStrBuf(&con->MigrateBuf); FreeStrBuf(&con->RecvBuf.Buf); if (con->cached_msglist) { diff --git a/citadel/context.h b/citadel/context.h index e0cad917b..5e9d998ac 100644 --- a/citadel/context.h +++ b/citadel/context.h @@ -58,6 +58,7 @@ struct CitContext { int is_local_socket; /* set to 1 if client is on unix domain sock */ /* Redirect this session's output to a memory buffer? */ StrBuf *redirect_buffer; /* the buffer */ + StrBuf *StatusMessage; #ifdef HAVE_OPENSSL SSL *ssl; int redirect_ssl; diff --git a/citadel/internet_addressing.c b/citadel/internet_addressing.c index 116e57e24..38671ddc4 100644 --- a/citadel/internet_addressing.c +++ b/citadel/internet_addressing.c @@ -959,13 +959,15 @@ void CtdlDirectoryInit(void) { /* * Add an Internet e-mail address to the directory for a user */ -void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) { +int CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) { char key[SIZ]; - if (IsDirectory(internet_addr, 0) == 0) return; + if (IsDirectory(internet_addr, 0) == 0) + return 0; syslog(LOG_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr); directory_key(key, internet_addr); cdb_store(CDB_DIRECTORY, key, strlen(key), citadel_addr, strlen(citadel_addr)+1 ); + return 1; } @@ -975,12 +977,12 @@ void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) { * (NOTE: we don't actually use or need the citadel_addr variable; it's merely * here because the callback API expects to be able to send it.) */ -void CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) { +int CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) { char key[SIZ]; syslog(LOG_DEBUG, "Delete directory entry: %s --> %s\n", internet_addr, citadel_addr); directory_key(key, internet_addr); - cdb_delete(CDB_DIRECTORY, key, strlen(key) ); + return cdb_delete(CDB_DIRECTORY, key, strlen(key) ) == 0; } diff --git a/citadel/internet_addressing.h b/citadel/internet_addressing.h index 244110955..706231e83 100644 --- a/citadel/internet_addressing.h +++ b/citadel/internet_addressing.h @@ -15,8 +15,8 @@ char *rfc822_fetch_field(const char *rfc822, const char *fieldname); int IsDirectory(char *addr, int allow_masq_domains); void CtdlDirectoryInit(void); -void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr); -void CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr); +int CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr); +int CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr); int CtdlDirectoryLookup(char *target, char *internet_addr, size_t targbuflen); struct CtdlMessage *convert_internet_message(char *rfc822); struct CtdlMessage *convert_internet_message_buf(StrBuf **rfc822); diff --git a/citadel/modules/vcard/serv_vcard.c b/citadel/modules/vcard/serv_vcard.c index 8efae6578..a467c9f22 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,31 @@ void vcard_directory_add_user(char *internet_addr, char *citadel_addr) { * Bail out silently without saving. */ syslog(LOG_DEBUG, "DOOP!\n"); - return; + StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress again."), -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 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)) + { + StrBufAppendBufPlain(CCC->StatusMessage, _("successfully addded emailaddress."), -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + return 1; + } + else + { + StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress; its not matching our domain."), -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + return 0; + } } @@ -198,6 +218,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 +234,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 +252,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 +270,14 @@ void extract_inet_email_addrs(char *emailaddrbuf, size_t emailaddrbuf_len, } } } + if (!IsDirectoryAddress && local_addrs_only) + { + StrBufAppendBufPlain(CCC->StatusMessage, + _("unable to add this emailaddress; its not matching our domain."), -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + StrBufAppendBufPlain(CCC->StatusMessage, addr, -1, 0); + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0); + } } free(addr); } @@ -510,6 +544,9 @@ int vcard_upload_aftersave(struct CtdlMessage *msg) { ptr = msg->cm_fields['M']; if (ptr == NULL) return(0); + + NewStrBufDupAppendFlush(&CC->StatusMessage, NULL, NULL, 0); + while (ptr != NULL) { linelen = strcspn(ptr, "\n"); diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 83b859b2c..d88bef4a6 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -4255,6 +4255,7 @@ void free_recipients(struct recptypes *valid) { */ void cmd_ent0(char *entargs) { + struct CitContext *CCC = CC; int post = 0; char recp[SIZ]; char cc[SIZ]; @@ -4275,6 +4276,7 @@ void cmd_ent0(char *entargs) char subject[SIZ]; int subject_required = 0; int do_confirm = 0; + int verbose_reply = 0; long msgnum; int i, j; char buf[256]; @@ -4293,6 +4295,7 @@ void cmd_ent0(char *entargs) do_confirm = extract_int(entargs, 6); extract_token(cc, entargs, 7, '|', sizeof cc); extract_token(bcc, entargs, 8, '|', sizeof bcc); + verbose_reply = extract_int(entargs, 9); switch(CC->room.QRdefaultview) { case VIEW_NOTES: case VIEW_WIKI: @@ -4326,11 +4329,11 @@ void cmd_ent0(char *entargs) /* Check some other permission type things. */ if (IsEmptyStr(newusername)) { - strcpy(newusername, CC->user.fullname); + strcpy(newusername, CCC->user.fullname); } - if ( (CC->user.axlevel < AxAideU) - && (strcasecmp(newusername, CC->user.fullname)) - && (strcasecmp(newusername, CC->cs_inet_fn)) + if ( (CCC->user.axlevel < AxAideU) + && (strcasecmp(newusername, CCC->user.fullname)) + && (strcasecmp(newusername, CCC->cs_inet_fn)) ) { cprintf("%d You don't have permission to author messages as '%s'.\n", ERROR + HIGHER_ACCESS_REQUIRED, @@ -4345,13 +4348,13 @@ void cmd_ent0(char *entargs) } if (!IsEmptyStr(newuseremail)) { - if (!strcasecmp(newuseremail, CC->cs_inet_email)) { + if (!strcasecmp(newuseremail, CCC->cs_inet_email)) { newuseremail_ok = 1; } - else if (!IsEmptyStr(CC->cs_inet_other_emails)) { - j = num_tokens(CC->cs_inet_other_emails, '|'); + else if (!IsEmptyStr(CCC->cs_inet_other_emails)) { + j = num_tokens(CCC->cs_inet_other_emails, '|'); for (i=0; ics_inet_other_emails, i, '|', sizeof buf); + extract_token(buf, CCC->cs_inet_other_emails, i, '|', sizeof buf); if (!strcasecmp(newuseremail, buf)) { newuseremail_ok = 1; } @@ -4367,7 +4370,7 @@ void cmd_ent0(char *entargs) return; } - CC->cs_flags |= CS_POSTING; + CCC->cs_flags |= CS_POSTING; /* In mailbox rooms we have to behave a little differently -- * make sure the user has specified at least one recipient. Then @@ -4376,10 +4379,10 @@ void cmd_ent0(char *entargs) * is the DRAFTS room which does not require recipients */ - if ( ( ( (CC->room.QRflags & QR_MAILBOX) && (!strcasecmp(&CC->room.QRname[11], MAILROOM)) ) - || ( (CC->room.QRflags & QR_MAILBOX) && (CC->curr_view == VIEW_MAILBOX) ) - ) && (strcasecmp(&CC->room.QRname[11], USERDRAFTROOM)) !=0 ) { - if (CC->user.axlevel < AxProbU) { + if ( ( ( (CCC->room.QRflags & QR_MAILBOX) && (!strcasecmp(&CCC->room.QRname[11], MAILROOM)) ) + || ( (CCC->room.QRflags & QR_MAILBOX) && (CCC->curr_view == VIEW_MAILBOX) ) + ) && (strcasecmp(&CCC->room.QRname[11], USERDRAFTROOM)) !=0 ) { + if (CCC->user.axlevel < AxProbU) { strcpy(recp, "sysop"); strcpy(cc, ""); strcpy(bcc, ""); @@ -4419,7 +4422,7 @@ void cmd_ent0(char *entargs) } if (valid_to->num_internet + valid_cc->num_internet + valid_bcc->num_internet > 0) { - if (CtdlCheckInternetMailPermission(&CC->user)==0) { + if (CtdlCheckInternetMailPermission(&CCC->user)==0) { cprintf("%d You do not have permission " "to send Internet mail.\n", ERROR + HIGHER_ACCESS_REQUIRED); @@ -4431,7 +4434,7 @@ void cmd_ent0(char *entargs) } if ( ( (valid_to->num_internet + valid_to->num_ignet + valid_cc->num_internet + valid_cc->num_ignet + valid_bcc->num_internet + valid_bcc->num_ignet) > 0) - && (CC->user.axlevel < AxNetU) ) { + && (CCC->user.axlevel < AxNetU) ) { cprintf("%d Higher access required for network mail.\n", ERROR + HIGHER_ACCESS_REQUIRED); free_recipients(valid_to); @@ -4442,8 +4445,8 @@ void cmd_ent0(char *entargs) if ((RESTRICT_INTERNET == 1) && (valid_to->num_internet + valid_cc->num_internet + valid_bcc->num_internet > 0) - && ((CC->user.flags & US_INTERNET) == 0) - && (!CC->internal_pgm)) { + && ((CCC->user.flags & US_INTERNET) == 0) + && (!CCC->internal_pgm)) { cprintf("%d You don't have access to Internet mail.\n", ERROR + HIGHER_ACCESS_REQUIRED); free_recipients(valid_to); @@ -4456,16 +4459,16 @@ void cmd_ent0(char *entargs) /* Is this a room which has anonymous-only or anonymous-option? */ anonymous = MES_NORMAL; - if (CC->room.QRflags & QR_ANONONLY) { + if (CCC->room.QRflags & QR_ANONONLY) { anonymous = MES_ANONONLY; } - if (CC->room.QRflags & QR_ANONOPT) { + if (CCC->room.QRflags & QR_ANONOPT) { if (anon_flag == 1) { /* only if the user requested it */ anonymous = MES_ANONOPT; } } - if ((CC->room.QRflags & QR_MAILBOX) == 0) { + if ((CCC->room.QRflags & QR_MAILBOX) == 0) { recp[0] = 0; } @@ -4473,7 +4476,7 @@ void cmd_ent0(char *entargs) * strongly recommended in this room, if either the SUBJECTREQ flag * is set, or if there is one or more Internet email recipients. */ - if (CC->room.QRflags2 & QR2_SUBJECTREQ) subject_required = 1; + if (CCC->room.QRflags2 & QR2_SUBJECTREQ) subject_required = 1; if ((valid_to) && (valid_to->num_internet > 0)) subject_required = 1; if ((valid_cc) && (valid_cc->num_internet > 0)) subject_required = 1; if ((valid_bcc) && (valid_bcc->num_internet > 0)) subject_required = 1; @@ -4503,8 +4506,8 @@ void cmd_ent0(char *entargs) cprintf("%d send message\n", SEND_LISTING); } - msg = CtdlMakeMessage(&CC->user, recp, cc, - CC->room.QRname, anonymous, format_type, + msg = CtdlMakeMessage(&CCC->user, recp, cc, + CCC->room.QRname, anonymous, format_type, newusername, newuseremail, subject, ((!IsEmptyStr(supplied_euid)) ? supplied_euid : NULL), NULL, references); @@ -4536,14 +4539,24 @@ void cmd_ent0(char *entargs) if (msg != NULL) { msgnum = CtdlSubmitMsg(msg, valid, "", QP_EADDR); + if (verbose_reply) + { + if (StrLength(CCC->StatusMessage)>0) + { + StrBufAppendBufPlain(CCC->StatusMessage, HKEY("\n"), 0); + cputbuf(CCC->StatusMessage); + } + else + client_write(HKEY("\n")); + } if (do_confirm) { cprintf("%ld\n", msgnum); if (msgnum >= 0L) { - cprintf("Message accepted.\n"); + client_write(HKEY("Message accepted.\n")); } else { - cprintf("Internal error.\n"); + client_write(HKEY("Internal error.\n")); } if (msg->cm_fields['E'] != NULL) { cprintf("%s\n", msg->cm_fields['E']); diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c index a794dddd3..3b9629d64 100644 --- a/webcit/vcard_edit.c +++ b/webcit/vcard_edit.c @@ -1280,24 +1280,23 @@ void submit_vcard(void) { } } - sprintf(buf, "ENT0 1|||4||"); - serv_puts(buf); - serv_getln(buf, sizeof buf); - if (buf[0] != '4') { + Buf = NewStrBuf(); + serv_write(HKEY("ENT0 1|||4||||||1\n")); + if (!StrBuf_ServGetln(Buf) && (GetServerStatus(Buf, NULL) != 4)) + { edit_vcard(); return; } /* Make a vCard structure out of the data supplied in the form */ - Buf = NewStrBuf(); StrBufPrintf(Buf, "begin:vcard\r\n%s\r\nend:vcard\r\n", bstr("extrafields") ); v = VCardLoad(Buf); /* Start with the extra fields */ - FreeStrBuf(&Buf); if (v == NULL) { AppendImportantMessage(_("An error has occurred."), -1); edit_vcard(); + FreeStrBuf(&Buf); return; } @@ -1341,15 +1340,18 @@ void submit_vcard(void) { if (serialized_vcard == NULL) { AppendImportantMessage(_("An error has occurred."), -1); edit_vcard(); + FreeStrBuf(&Buf); return; } - serv_puts("Content-type: text/x-vcard; charset=UTF-8"); - serv_puts(""); + serv_write(HKEY("Content-type: text/x-vcard; charset=UTF-8\n")); + serv_write(HKEY("\n")); serv_printf("%s\r\n", serialized_vcard); - serv_puts("000"); + serv_write(HKEY("000\n")); free(serialized_vcard); + StrBuf_ServGetln(Buf); + if (!strcmp(bstr("return_to"), "select_user_to_edit")) { select_user_to_edit(NULL); } @@ -1362,6 +1364,7 @@ void submit_vcard(void) { else { readloop(readnew, eUseDefault); } + FreeStrBuf(&Buf); } -- 2.30.2