diff --git a/src/elogd.c b/src/elogd.c index bd35904e..50df8392 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.745 2005/08/06 19:14:04 ritt + Fixed bug in stristr() + Revision 1.744 2005/08/06 07:22:24 ritt Fixed bug with removing users @@ -1823,11 +1826,14 @@ char *stristr(const char *str, const char *pattern) c2 = *pp; if (my_toupper(c1) == my_toupper(c2)) { while (*pp) { - c1 = *ps++; - c2 = *pp++; + c1 = *ps; + c2 = *pp; if (my_toupper(c1) != my_toupper(c2)) break; + + ps++; + pp++; } if (!*pp) @@ -2195,7 +2201,7 @@ void redirect_to_stderr(void) /*------------------------------------------------------------------*/ -void strsubst(char *string, int size, char name[][NAME_LENGTH], char value[][NAME_LENGTH], int n) +void strsubst_list(char *string, int size, char name[][NAME_LENGTH], char value[][NAME_LENGTH], int n) /* subsitute "$name" with value corresponding to name */ { int i, j; @@ -2247,6 +2253,35 @@ void strsubst(char *string, int size, char name[][NAME_LENGTH], char value[][NAM /*------------------------------------------------------------------*/ +void strsubst(char *string, int size, char *pattern, char *subst) +/* subsitute "pattern" with "subst" in "string" */ +{ + char *tail, *p; + int s; + + p = string; + for (p = stristr(p, pattern); p != NULL; p = stristr(p, pattern)) { + + if (strlen(pattern) == strlen(subst)) { + memcpy(p, subst, strlen(subst)); + } else if (strlen(pattern) > strlen(subst)) { + memcpy(p, subst, strlen(subst)); + strcpy(p+strlen(subst), p+strlen(pattern)); + } else { + tail = xmalloc(strlen(p)-strlen(pattern)+1); + strcpy(tail, p+strlen(pattern)); + s = size - ((int)p - (int)string); + strlcpy(p, subst, s); + strlcat(p, tail, s); + xfree(tail); + } + + p += strlen(subst); + } +} + +/*------------------------------------------------------------------*/ + void url_decode(char *p) /********************************************************************\ Decode the given string in-place by expanding %XX escapes @@ -4301,7 +4336,7 @@ void retrieve_email_from(LOGBOOK * lbs, char *ret, char attrib[MAX_N_ATTR][NAME_ if (attrib) { i = build_subst_list(lbs, slist, svalue, attrib, TRUE); - strsubst(str, sizeof(str), slist, svalue, i); + strsubst_list(str, sizeof(str), slist, svalue, i); /* remove possible 'mailto:' */ if ((p = strstr(str, "mailto:")) != NULL) @@ -6719,15 +6754,19 @@ void rsputs_elcode(LOGBOOK * lbs, const char *str) i += strlen(attrib) - 1; strlcpy(hattrib, attrib, sizeof(hattrib)); - /* change /x to id/x for images */ - if (strnieq(attrib, "elog:/", 6)) { + /* replace elog:x/x for images */ + if (strnieq(attrib, "elog:", 5)) { compose_base_url(lbs, hattrib, sizeof(hattrib)); - if (_current_message_id == 0) { - sprintf(param, "attachment%d", atoi(attrib + 6)-1); - if (isparam(param)) - strlcat(hattrib, getparam(param), sizeof(hattrib)); - } else - sprintf(hattrib+strlen(hattrib), "%d%s", _current_message_id, attrib + 5); + if (attrib[5] == '/') { + if (_current_message_id == 0) { + sprintf(param, "attachment%d", atoi(attrib + 6)-1); + if (isparam(param)) + strlcat(hattrib, getparam(param), sizeof(hattrib)); + } else + sprintf(hattrib+strlen(hattrib), "%d%s", _current_message_id, attrib + 5); + } else { + strlcat(hattrib, attrib+5, sizeof(hattrib)); + } } /* add http:// if missing */ @@ -9101,7 +9140,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL /* do not format date for date attributes */ i = build_subst_list(lbs, slist, svalue, attrib, (attr_flags[index] & (AF_DATE | AF_DATETIME)) == 0); - strsubst(preset, sizeof(preset), slist, svalue, i); + strsubst_list(preset, sizeof(preset), slist, svalue, i); /* check for index substitution */ if (!bedit && strchr(preset, '%')) { @@ -9125,7 +9164,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL /* do not format date for date attributes */ i = build_subst_list(lbs, slist, svalue, attrib, (attr_flags[index] & (AF_DATE | AF_DATETIME)) == 0); - strsubst(preset, sizeof(preset), slist, svalue, i); + strsubst_list(preset, sizeof(preset), slist, svalue, i); /* check for index substitution */ if (!bedit && strchr(preset, '%')) { @@ -9171,7 +9210,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL /* do not format date for date attributes */ i = build_subst_list(lbs, slist, svalue, attrib, (attr_flags[index] & (AF_DATE | AF_DATETIME)) == 0); - strsubst(preset, sizeof(preset), slist, svalue, i); + strsubst_list(preset, sizeof(preset), slist, svalue, i); /* check for index substitution */ if (!bedit && strchr(preset, '%')) { @@ -9195,7 +9234,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL /* do not format date for date attributes */ i = build_subst_list(lbs, slist, svalue, attrib, (attr_flags[index] & (AF_DATE | AF_DATETIME)) == 0); - strsubst(preset, sizeof(preset), slist, svalue, i); + strsubst_list(preset, sizeof(preset), slist, svalue, i); /* check for index substitution */ if (!bedit && strchr(preset, '%')) { @@ -9296,7 +9335,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL sprintf(str, "%d", message_id); add_subst_list(slist, svalue, "message id", str, &i); add_subst_time(lbs, slist, svalue, "entry time", date, &i); - strsubst(preset, sizeof(preset), slist, svalue, i); + strsubst_list(preset, sizeof(preset), slist, svalue, i); strcpy(attrib[index], preset); } } @@ -9317,7 +9356,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL add_subst_list(slist, svalue, "message id", str, &i); add_subst_time(lbs, slist, svalue, "entry time", date, &i); - strsubst(preset, sizeof(preset), slist, svalue, i); + strsubst_list(preset, sizeof(preset), slist, svalue, i); if (strlen(preset) > NAME_LENGTH - 100) { if (strstr(preset + 100, "
")) { strlcpy(str, strstr(preset + 100, "
"), sizeof(str)); @@ -9339,7 +9378,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL if (getcfg(lbs->name, "Edit Page Title", str, sizeof(str))) { i = build_subst_list(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, NULL, TRUE); - strsubst(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, i); + strsubst_list(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, i); strip_html(str); } else sprintf(str, "ELOG %s", lbs->name); @@ -10302,7 +10341,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL if (!bupload) if (getcfg(lbs->name, "Prepend on edit", str, sizeof(str))) { - strsubst(str, sizeof(str), slist, svalue, j); + strsubst_list(str, sizeof(str), slist, svalue, j); while (strstr(str, "\\n")) memcpy(strstr(str, "\\n"), "\r\n", 2); rsputs3(str); @@ -10314,7 +10353,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL if (!bupload) if (getcfg(lbs->name, "Append on edit", str, sizeof(str))) { - strsubst(str, sizeof(str), slist, svalue, j); + strsubst_list(str, sizeof(str), slist, svalue, j); while (strstr(str, "\\n")) memcpy(strstr(str, "\\n"), "\r\n", 2); rsputs3(str); @@ -10333,7 +10372,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL add_subst_list(slist, svalue, "message id", mid, &j); add_subst_time(lbs, slist, svalue, "entry time", date, &j); - strsubst(str, sizeof(str), slist, svalue, j); + strsubst_list(str, sizeof(str), slist, svalue, j); while (strstr(str, "\\n")) memcpy(strstr(str, "\\n"), "\r\n", 2); rsputs3(str); @@ -10394,7 +10433,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL sprintf(mid, "%d", message_id); add_subst_list(slist, svalue, "message id", mid, &j); add_subst_time(lbs, slist, svalue, "entry time", date, &j); - strsubst(str, sizeof(str), slist, svalue, j); + strsubst_list(str, sizeof(str), slist, svalue, j); while (strstr(str, "\\n")) memcpy(strstr(str, "\\n"), "\r\n", 2); rsputs3(str); @@ -10427,7 +10466,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL xfree(buffer); } else { j = build_subst_list(lbs, slist, svalue, attrib, TRUE); - strsubst(str, sizeof(str), slist, svalue, j); + strsubst_list(str, sizeof(str), slist, svalue, j); while (strstr(str, "\\n")) memcpy(strstr(str, "\\n"), "\r\n", 2); rsputs3(str); @@ -15201,7 +15240,7 @@ void display_line(LOGBOOK * lbs, int message_id, int number, char *mode, add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, "entry time", date, &j); - strsubst(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); + strsubst_list(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); if (highlight != message_id) rsprintf("\n\n", ref); @@ -15263,7 +15302,7 @@ void display_line(LOGBOOK * lbs, int message_id, int number, char *mode, add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, "entry time", date, &j); - strsubst(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, + strsubst_list(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); } else @@ -15435,7 +15474,7 @@ void display_line(LOGBOOK * lbs, int message_id, int number, char *mode, add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, "entry time", date, &j); - strsubst(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, + strsubst_list(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); } else @@ -16688,7 +16727,7 @@ void show_rss_feed(LOGBOOK * lbs) add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, "entry time", date, &i); - strsubst(title, sizeof(title), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, i); + strsubst_list(title, sizeof(title), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, i); } else { title[0] = 0; @@ -17232,7 +17271,7 @@ void show_elog_list(LOGBOOK * lbs, INT past_n, INT last_n, INT page_n, char *inf add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, "entry time", date, &j); - strsubst(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); + strsubst_list(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); setparam(attr_list[i], str); } @@ -17341,7 +17380,7 @@ void show_elog_list(LOGBOOK * lbs, INT past_n, INT last_n, INT page_n, char *inf add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, "entry time", date, &j); - strsubst(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, + strsubst_list(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); setparam(attr_list[i], str); } @@ -17515,7 +17554,7 @@ void show_elog_list(LOGBOOK * lbs, INT past_n, INT last_n, INT page_n, char *inf if (getcfg(lbs->name, "List Page Title", str, sizeof(str))) { i = build_subst_list(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, NULL, TRUE); - strsubst(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, i); + strsubst_list(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, i); strip_html(str); } else sprintf(str, "ELOG %s", lbs->name); @@ -18740,7 +18779,7 @@ int compose_email(LOGBOOK * lbs, char *mail_to, int message_id, i = build_subst_list(lbs, slist, svalue, attrib, TRUE); sprintf(str, "%d", message_id); add_subst_list(slist, svalue, "message id", str, &i); - strsubst(subject, sizeof(subject), slist, svalue, i); + strsubst_list(subject, sizeof(subject), slist, svalue, i); } else { if (old_mail) strcpy(subject, "Updated ELOG entry"); @@ -18843,7 +18882,7 @@ int execute_shell(LOGBOOK * lbs, int message_id, char attrib[MAX_N_ATTR][NAME_LE i = build_subst_list(lbs, slist, svalue, attrib, TRUE); sprintf(str, "%d", message_id); add_subst_list(slist, svalue, "message id", str, &i); - strsubst(shell_cmd, sizeof(shell_cmd), slist, svalue, i); + strsubst_list(shell_cmd, sizeof(shell_cmd), slist, svalue, i); if (att_file && stristr(shell_cmd, "$attachments")) { /* substitute attachments */ @@ -19364,7 +19403,7 @@ void submit_elog(LOGBOOK * lbs) if (!*getparam("edit_id")) { sprintf(str, "Subst %s", attr_list[i]); if (getcfg(lbs->name, str, subst_str, sizeof(subst_str))) { - strsubst(subst_str, sizeof(subst_str), slist, svalue, n); + strsubst_list(subst_str, sizeof(subst_str), slist, svalue, n); strcpy(attrib[i], subst_str); } } @@ -19436,6 +19475,15 @@ void submit_elog(LOGBOOK * lbs) if (resubmit_orig) message_id = el_move_message_thread(lbs, resubmit_orig); + /*---- replace relative elog:/x link by elog:n/x link */ + if (stristr(getparam("text"), "elog:/")) { + p = getparam("text"); + sprintf(str, "elog:%d/", message_id); + strsubst(p, TEXT_SIZE, "elog:/", str); + el_submit(lbs, message_id, bedit, date, attr_list, attrib, n_attr, + p, in_reply_to, reply_to, getparam("encoding"), att_file, TRUE, NULL); + } + /*---- email notifications ----*/ suppress = atoi(getparam("suppress")); @@ -19499,7 +19547,7 @@ void submit_elog(LOGBOOK * lbs) sprintf(str, "%d", message_id); add_subst_list(slist, svalue, "message id", str, &j); add_subst_time(lbs, slist, svalue, "entry time", date, &j); - strsubst(mail_list[i], NAME_LENGTH, slist, svalue, j); + strsubst_list(mail_list[i], NAME_LENGTH, slist, svalue, j); /* remove possible 'mailto:' */ if ((p = strstr(mail_list[i], "mailto:")) != NULL) @@ -20071,7 +20119,7 @@ void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) sprintf(mid, "%d", message_id); add_subst_list(slist, svalue, "message id", mid, &i); add_subst_time(lbs, slist, svalue, "entry time", date, &i); - strsubst(str, sizeof(str), slist, svalue, i); + strsubst_list(str, sizeof(str), slist, svalue, i); strip_html(str); } else strcpy(str, "ELOG"); @@ -20310,7 +20358,7 @@ void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, "entry time", date, &j); - strsubst(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); + strsubst_list(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, j); } else sprintf(display, "%d", message_id); @@ -20533,7 +20581,7 @@ void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, "entry time", date, &k); - strsubst(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, + strsubst_list(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH]) svalue, k); } else @@ -20608,9 +20656,12 @@ void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) att_hide[i] = 0; sprintf(str, "[img]elog:/%d[/img]", i + 1); - if (strieq(encoding, "ELCode") && stristr(text, str)) { + if (strieq(encoding, "ELCode") && stristr(text, str)) att_inline[i] = 1; - } + sprintf(str, "[img]elog:%d/%d[/img]", message_id, i + 1); + if (strieq(encoding, "ELCode") && stristr(text, str)) + att_inline[i] = 1; + if (attachment[i][0]) n_attachments++; } @@ -21638,7 +21689,7 @@ void show_logbook_node(LBLIST plb, LBLIST pparent, int level, int btop) sprintf(mid, "%d", message_id); add_subst_list(slist, svalue, "message id", mid, &j); add_subst_time(&lb_list[index], slist, svalue, "entry time", date, &j); - strsubst(str, sizeof(str), slist, svalue, j); + strsubst_list(str, sizeof(str), slist, svalue, j); rsputs(str); } rsprintf("\n");