]> code.citadel.org Git - citadel.git/blobdiff - webcit/messages.c
* The 'delete' button on sticky notes now works.
[citadel.git] / webcit / messages.c
index 4178a91a018006d30e932fd6401d293925c2fdc2..212734d237bef082d6c77e1793107c5a68d90fce 100644 (file)
@@ -332,20 +332,23 @@ int webcit_rfc2047encode(char *target, int maxlen, char *source, long SourceLen)
 
 
 
-/**
- * \brief Look for URL's embedded in a buffer and make them linkable.  We use a
- * target window in order to keep the BBS session in its own window.
- * \param buf the message buffer
+/*
+ * Look for URL's embedded in a buffer and make them linkable.  We use a
+ * target window in order to keep the Citadel session in its own window.
  */
-void url(char *buf)
+void url(char *buf, size_t bufsize)
 {
-       int len;
+       int len, UrlLen, Offset, TrailerLen, outpos;
        char *start, *end, *pos;
        char urlbuf[SIZ];
-       char outbuf[1024];
+       char outbuf[SIZ];
 
        start = NULL;
        len = strlen(buf);
+       if (len > bufsize) {
+               lprintf(1, "URL: content longer than buffer!");
+               return;
+       }
        end = buf + len;
        for (pos = buf; (pos < end) && (start == NULL); ++pos) {
                if (!strncasecmp(pos, "http://", 7))
@@ -376,17 +379,35 @@ void url(char *buf)
                        end = pos;
                }
        }
+       
+       UrlLen = end - start;
+       if (UrlLen > sizeof(urlbuf)){
+               lprintf(1, "URL: content longer than buffer!");
+               return;
+       }
+       memcpy(urlbuf, start, UrlLen);
+       urlbuf[UrlLen] = '\0';
+
+       Offset = start - buf;
+       if ((Offset != 0) && (Offset < sizeof(outbuf)))
+               memcpy(outbuf, buf, Offset);
+       outpos = snprintf(&outbuf[Offset], sizeof(outbuf) - Offset,  
+                         "%ca href=%c%s%c TARGET=%c%s%c%c%s%c/A%c",
+                         LB, QU, urlbuf, QU, QU, TARGET, QU, RB, urlbuf, LB, RB);
+       if (outpos >= sizeof(outbuf) - Offset) {
+               lprintf(1, "URL: content longer than buffer!");
+               return;
+       }
 
-       strncpy(urlbuf, start, end - start);
-       urlbuf[end - start] = '\0';
-
-       if (start != buf)
-               strncpy(outbuf, buf, start - buf );
-       sprintf(&outbuf[start-buf], "%ca href=%c%s%c TARGET=%c%s%c%c%s%c/A%c",
-               LB, QU, urlbuf, QU, QU, TARGET, QU, RB, urlbuf, LB, RB);
-       strcat(outbuf, end);
-       if ( strlen(outbuf) < 250 )
-               strcpy(buf, outbuf);
+       TrailerLen = len - (end - start);
+       if (TrailerLen > 0)
+               memcpy(outbuf + Offset + outpos, end, TrailerLen);
+       if (Offset + outpos + TrailerLen > bufsize) {
+               lprintf(1, "URL: content longer than buffer!");
+               return;
+       }
+       memcpy (buf, outbuf, Offset + outpos + TrailerLen);
+       *(buf + Offset + outpos + TrailerLen) = '\0';
 }
 
 
@@ -468,8 +489,9 @@ void fetchname_parsed_vcard(struct vCard *v, char *storename) {
  * understand in a simple two-column name/value format.
  * \param v the vCard to display
  * \param full display all items of the vcard?
+ * \param msgnum Citadel message pointer
  */
-void display_parsed_vcard(struct vCard *v, int full) {
+void display_parsed_vcard(struct vCard *v, int full, long msgnum) {
        int i, j;
        char buf[SIZ];
        char *name;
@@ -638,6 +660,14 @@ void display_parsed_vcard(struct vCard *v, int full) {
                                        wprintf("</TD></TR>\n");
                                }
                        }
+                       else if (!strcasecmp(firsttoken, "photo") && full && pass == 2) { 
+                               // Only output on second pass
+                               wprintf("<tr><td>");
+                               wprintf(_("Photo:"));
+                               wprintf("</td><td>");
+                               wprintf("<img src=\"/vcardphoto/%d/\" alt=\"Contact photo\"/>",msgnum);
+                               wprintf("</td></tr>\n");
+                       }
                        else if (!strcasecmp(firsttoken, "version")) {
                                /* ignore */
                        }
@@ -712,8 +742,10 @@ void display_parsed_vcard(struct vCard *v, int full) {
  * \param alpha what???
  * \param full should we usse all lines?
  * \param storename where to store???
+ * \param msgnum Citadel message pointer
  */
-void display_vcard(char *vcard_source, char alpha, int full, char *storename) {
+void display_vcard(char *vcard_source, char alpha, int full, char *storename, 
+       long msgnum) {
        struct vCard *v;
        char *name;
        char buf[SIZ];
@@ -736,7 +768,7 @@ void display_vcard(char *vcard_source, char alpha, int full, char *storename) {
                        || ((isalpha(alpha)) && (tolower(alpha) == tolower(this_alpha)) )
                        || ((!isalpha(alpha)) && (!isalpha(this_alpha)))
                ) {
-               display_parsed_vcard(v, full);
+               display_parsed_vcard(v, full,msgnum);
        }
 
        vcard_free(v);
@@ -778,6 +810,7 @@ void read_message(long msgnum, int printable_view, char *section) {
        char reply_to[512] = "";
        char reply_all[4096] = "";
        char reply_references[1024] = "";
+       char reply_inreplyto[256] = "";
        char now[64] = "";
        int format_type = 0;
        int nhdr = 0;
@@ -850,15 +883,10 @@ void read_message(long msgnum, int printable_view, char *section) {
                        safestrncpy(m_subject, &buf[5], sizeof m_subject);
                }
                if (!strncasecmp(buf, "msgn=", 5)) {
-                       safestrncpy(reply_references, &buf[5], sizeof reply_references);
+                       safestrncpy(reply_inreplyto, &buf[5], sizeof reply_inreplyto);
                }
                if (!strncasecmp(buf, "wefw=", 5)) {
-                       int rrlen = strlen(reply_references);
-                       if (rrlen > 0) {
-                               strcpy(&reply_references[rrlen++], "|");
-                       }
-                       safestrncpy(&reply_references[rrlen], &buf[5],
-                               (sizeof(reply_references) - rrlen) );
+                       safestrncpy(reply_references, &buf[5], sizeof reply_references);
                }
                if (!strncasecmp(buf, "cccc=", 5)) {
                        int len;
@@ -1001,7 +1029,16 @@ void read_message(long msgnum, int printable_view, char *section) {
 
        }
 
-       /** Generate a reply-to address */
+       /* Trim down excessively long lists of thread references.  We eliminate the
+        * second one in the list so that the thread root remains intact.
+        */
+       int rrtok = num_tokens(reply_references, '|');
+       int rrlen = strlen(reply_references);
+       if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
+               remove_token(reply_references, 1, '|');
+       }
+
+       /* Generate a reply-to address */
        if (!IsEmptyStr(rfca)) {
                if (!IsEmptyStr(from)) {
                        snprintf(reply_to, sizeof(reply_to), "%s <%s>", from, rfca);
@@ -1047,10 +1084,12 @@ void read_message(long msgnum, int printable_view, char *section) {
                                if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%20");
                                urlescputs(m_subject);
                        }
+                       wprintf("?references=");
                        if (!IsEmptyStr(reply_references)) {
-                               wprintf("?references=");
                                urlescputs(reply_references);
+                               urlescputs("|");
                        }
+                       urlescputs(reply_inreplyto);
                        wprintf("\"><span>[</span>%s<span>]</span></a> ", _("Reply"));
                }
 
@@ -1066,10 +1105,12 @@ void read_message(long msgnum, int printable_view, char *section) {
                                        if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%20");
                                        urlescputs(m_subject);
                                }
+                               wprintf("?references=");
                                if (!IsEmptyStr(reply_references)) {
-                                       wprintf("?references=");
                                        urlescputs(reply_references);
+                                       urlescputs("|");
                                }
+                               urlescputs(reply_inreplyto);
                                wprintf("\"><span>[</span>%s<span>]</span></a> ", _("ReplyQuoted"));
                        }
                }
@@ -1087,10 +1128,12 @@ void read_message(long msgnum, int printable_view, char *section) {
                                if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%20");
                                urlescputs(m_subject);
                        }
+                       wprintf("?references=");
                        if (!IsEmptyStr(reply_references)) {
-                               wprintf("?references=");
                                urlescputs(reply_references);
+                               urlescputs("|");
                        }
+                       urlescputs(reply_inreplyto);
                        wprintf("\"><span>[</span>%s<span>]</span></a> ", _("ReplyAll"));
                }
 
@@ -1246,7 +1289,7 @@ void read_message(long msgnum, int printable_view, char *section) {
                                bq = 0;
                        }
                        wprintf("<tt>");
-                       url(buf);
+                       url(buf, sizeof(buf));
                        escputs(buf);
                        wprintf("</tt><br />\n");
                }
@@ -1304,7 +1347,7 @@ ENDBODY:  /* If there are attached submessages, display them now... */
                        }
 
                        /** In all cases, display the full card */
-                       display_vcard(part_source, 0, 1, NULL);
+                       display_vcard(part_source, 0, 1, NULL,msgnum);
                }
        }
 
@@ -1665,7 +1708,7 @@ void pullquote_message(long msgnum, int forward_attachments, int include_headers
                                bq = 0;
                        }
                        wprintf("<tt>");
-                       url(buf);
+                       url(buf, sizeof(buf));
                        msgescputs1(buf);
                        wprintf("</tt><br />");
                }
@@ -1827,7 +1870,7 @@ void display_addressbook(long msgnum, char alpha) {
                if (vcard_source != NULL) {
 
                        /** Display the summary line */
-                       display_vcard(vcard_source, alpha, 0, NULL);
+                       display_vcard(vcard_source, alpha, 0, NULL,msgnum);
 
                        /** If it's my vCard I can edit it */
                        if (    (!strcasecmp(WC->wc_roomname, USERCONFIGROOM))
@@ -1918,7 +1961,7 @@ void fetch_ab_name(long msgnum, char *namebuf) {
                if (vcard_source != NULL) {
 
                        /* Grab the name off the card */
-                       display_vcard(vcard_source, 0, 0, namebuf);
+                       display_vcard(vcard_source, 0, 0, namebuf,msgnum);
 
                        free(vcard_source);
                }
@@ -2428,7 +2471,6 @@ void readloop(char *oper)
        }
 
        if (is_notes) {
-               wprintf("<div align=center>%s</div>\n", _("Click on any note to edit it."));
                wprintf("<div id=\"new_notes_here\"></div>\n");
        }
 
@@ -2669,13 +2711,6 @@ void readloop(char *oper)
                /** end bbview scroller */
        }
 
-       if (is_notes)
-       {
-               wprintf ("<script src=\"/static/dragdrop.js\" type=\"text/javascript\"></script>\n");
-       }
-
-
-
        for (a = 0; a < nummsgs; ++a) {
                if ((WCC->msgarr[a] >= startmsg) && (num_displayed < maxmsgs)) {
 
@@ -2839,40 +2874,6 @@ void readloop(char *oper)
                /** end bbview scroller */
        }
        
-       if (is_notes)
-       {
-//             wprintf ("</div>\n");
-               wprintf ("<div id=\"wastebin\" align=middle>Drop notes here to remove them.</div>\n");
-               wprintf ("<script type=\"text/javascript\">\n");
-//             wprintf ("//<![CDATA[\n");
-               wprintf ("Droppables.add(\"wastebin\",\n");
-               wprintf ("\t{\n");
-               wprintf ("\t\taccept:'notes',\n");
-               wprintf ("\t\tonDrop:function(element)\n");
-               wprintf ("\t\t{\n");
-               wprintf ("\t\t\tElement.hide(element);\n");
-               wprintf ("\t\t\tnew Ajax.Updater('notes', 'delnote',\n");
-               wprintf ("\t\t\t{\n");
-               wprintf ("\t\t\t\tasynchronous:true,\n");
-               wprintf ("\t\t\t\tevalScripts:true,\n");
-               wprintf ("\t\t\t\tonComplete:function(request)\n");
-               wprintf ("\t\t\t\t{\n");
-               wprintf ("\t\t\t\t\tElement.hide('indicator')\n");
-               wprintf ("\t\t\t\t},\n");
-               wprintf ("\t\t\t\tonLoading:function(request)\n");
-               wprintf ("\t\t\t\t{\n");
-               wprintf ("\t\t\t\t\tElement.show('indicator')\n");
-               wprintf ("\t\t\t\t},\n");
-               wprintf ("\t\t\t\tparameters:'id=' + encodeURIComponent(element.id)\n");
-               wprintf ("\t\t\t})\n");
-               wprintf ("\t\t}\n");
-               wprintf ("\t})\n");
-//             wprintf ("//]]>\n");
-               wprintf ("</script>\n");
-       }
-
-
-
 DONE:
        if (is_tasks) {
                do_tasks_view();        /** Render the task list */
@@ -3022,7 +3023,7 @@ void post_message(void)
                gotoroom(bstr("force_room"));
        }
 
-       if (GetHash(WCC->urlstrings, HKEY("display_name"), &U)) {
+       if (GetHash(WC->urlstrings, HKEY("display_name"), &U)) {
                u = (urlcontent*) U;
                display_name = u->url_data;
                dpLen = u->url_data_size;