work on a way to output the success / failure state for editing a user vcard to the...
authorWilfried Goesgens <dothebart@citadel.org>
Tue, 22 Nov 2011 11:13:11 +0000 (12:13 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Tue, 22 Nov 2011 11:13:11 +0000 (12:13 +0100)
citadel/context.c
citadel/context.h
citadel/internet_addressing.c
citadel/internet_addressing.h
citadel/modules/vcard/serv_vcard.c
citadel/msgbase.c
webcit/vcard_edit.c

index dd51112ccbd09fa272d159cbc9081acbd4a39ee7..7993ce08c930b27b3d40f3002eb197b5b56eb5da 100644 (file)
@@ -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) {
index e0cad917b5d0c375858307ec03c7317432e01ce1..5e9d998acb9d8a9e4798da2e6a4fc9df15ae9636 100644 (file)
@@ -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;
index 116e57e249b3900c9e697400e47dccab76040960..38671ddc4a655c8c666bc79f785281ae8732ea5b 100644 (file)
@@ -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;
 }
 
 
index 24411095584a4bc5b3adf1f2187d3c8d2e01f385..706231e8317c9b9feaedb168f2c64632f4e19911 100644 (file)
@@ -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);
index 8efae6578f5748da50c9d6fe8e4e1b45fe05c17b..a467c9f22bec961d53d169125224eb31494c6aff 100644 (file)
@@ -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");
index 83b859b2cd53b6f0e5fa9a61ed56a83a66a8d3e0..d88bef4a6f3e041ac082a8f9c07ff4e22634d29e 100644 (file)
@@ -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; i<j; ++i) {
-                               extract_token(buf, CC->cs_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']);
index a794dddd3b9de05d199e7986dd6ac54544f55880..3b9629d64582d2d5ce6060369bddc7080f734b80 100644 (file)
@@ -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);
 }