diff --git a/src/elogd.c b/src/elogd.c index b05e8eb5..9e0be281 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -5135,7 +5135,7 @@ void rsputs(const char *str) char *key_list[] = { "http://", "https://", "ftp://", "mailto:", "elog:", "file://", "" }; -void rsputs2(LOGBOOK * lbs, const char *str) +void rsputs2(LOGBOOK * lbs, int absolute_link, const char *str) { int i, j, k, l, m, n; char *p, *pd, link[1000], link_text[1000], tmp[1000], base_url[256]; @@ -5228,15 +5228,25 @@ void rsputs2(LOGBOOK * lbs, const char *str) if (m < (int) strlen(tmp)) { /* if link contains reference to other logbook, put logbook explicitly */ - compose_base_url(NULL, base_url, sizeof(base_url)); + if (absolute_link) + compose_base_url(NULL, base_url, sizeof(base_url)); + else + strcpy(base_url, "../"); sprintf(return_buffer + j, "elog:%s", base_url, link, link_text); } else if (link[0] == '/') { - compose_base_url(lbs, base_url, sizeof(base_url)); - sprintf(return_buffer + j, "elog:%s", base_url, + if (absolute_link) + compose_base_url(NULL, base_url, sizeof(base_url)); + else + base_url[0] = 0; + sprintf(return_buffer + j, "elog:%s", base_url, lbs->name_enc, _current_message_id, link, link_text); } else { - compose_base_url(lbs, base_url, sizeof(base_url)); - sprintf(return_buffer + j, "elog:%s", base_url, link, link_text); + if (absolute_link) + compose_base_url(lbs, base_url, sizeof(base_url)); + else + base_url[0] = 0; + sprintf(return_buffer + j, "elog:%s", base_url, + link, link_text); } } else if (strcmp(key_list[l], "mailto:") == 0) { @@ -5247,7 +5257,7 @@ void rsputs2(LOGBOOK * lbs, const char *str) strlen_retbuf = j; /* link can contain special characters */ - rsputs2(lbs, link); + rsputs2(lbs, absolute_link, link); j = strlen_retbuf; sprintf(return_buffer + j, "\">%s", key_list[l]); @@ -5255,7 +5265,7 @@ void rsputs2(LOGBOOK * lbs, const char *str) strlen_retbuf = j; /* link_text can contain special characters */ - rsputs2(lbs, link_text); + rsputs2(lbs, absolute_link, link_text); j = strlen_retbuf; sprintf(return_buffer + j, ""); } @@ -5510,14 +5520,23 @@ void rsputs_elcode(LOGBOOK * lbs, BOOL email_notify, const char *str) if (m < (int) strlen(tmp)) { /* if link contains reference to other logbook, put logbook explicitly */ - compose_base_url(NULL, base_url, sizeof(base_url)); + if (email_notify) + compose_base_url(NULL, base_url, sizeof(base_url)); + else + strcpy(base_url, "../"); sprintf(return_buffer + j, "elog:%s", base_url, link, link_text); } else if (link[0] == '/') { - compose_base_url(lbs, base_url, sizeof(base_url)); - sprintf(return_buffer + j, "elog:%s", base_url, + if (email_notify) + compose_base_url(NULL, base_url, sizeof(base_url)); + else + base_url[0] = 0; + sprintf(return_buffer + j, "elog:%s", base_url, lbs->name_enc, _current_message_id, link, link_text); } else { - compose_base_url(lbs, base_url, sizeof(base_url)); + if (email_notify) + compose_base_url(lbs, base_url, sizeof(base_url)); + else + base_url[0] = 0; sprintf(return_buffer + j, "elog:%s", base_url, link, link_text); } } else if (strcmp(key_list[l], "mailto:") == 0) { @@ -5528,7 +5547,7 @@ void rsputs_elcode(LOGBOOK * lbs, BOOL email_notify, const char *str) strlen_retbuf = j; /* link can contain special characters */ - rsputs2(lbs, link); + rsputs2(lbs, email_notify, link); j = strlen_retbuf; sprintf(return_buffer + j, "\">%s", key_list[l]); @@ -5536,7 +5555,7 @@ void rsputs_elcode(LOGBOOK * lbs, BOOL email_notify, const char *str) strlen_retbuf = j; /* link_text can contain special characters */ - rsputs2(lbs, link_text); + rsputs2(lbs, email_notify, link_text); j = strlen_retbuf; sprintf(return_buffer + j, ""); } @@ -5653,7 +5672,10 @@ void rsputs_elcode(LOGBOOK * lbs, BOOL email_notify, const char *str) p = link; sprintf(hattrib, "cid:att%d@%s", m, p); } else { - compose_base_url(lbs, hattrib, sizeof(hattrib)); + if (email_notify) + compose_base_url(lbs, hattrib, sizeof(hattrib)); + else + strlcpy(hattrib, lbs->name_enc, sizeof(hattrib)); if (attrib[5] == '/') { if (_current_message_id == 0) { sprintf(param, "attachment%d", atoi(attrib + 6) - 1); @@ -5693,7 +5715,10 @@ void rsputs_elcode(LOGBOOK * lbs, BOOL email_notify, const char *str) strcpy(link, pattern_list[l].subst); if (strstr(link, "%s")) { strcpy(tmp, link); - compose_base_url(lbs, base_url, sizeof(base_url)); + if (email_notify) + compose_base_url(NULL, base_url, sizeof(base_url)); + else + strlcpy(base_url, lbs->name_enc, sizeof(base_url)); sprintf(link, tmp, base_url); } @@ -5998,22 +6023,30 @@ void extract_host(char *str) /*------------------------------------------------------------------*/ -void compose_base_url(LOGBOOK * lbs, char *base_url, int size) +void compose_base_url(LOGBOOK *lbs, char *base_url, int size) +/* return URL for elogd with optional logbook subdirectory */ { - /* try to get URL from referer */ if (!getcfg("global", "URL", base_url, size)) { - if (referer[0] && stristr(referer, "https:")) - strcpy(base_url, "https://"); - else + + if (referer[0]) { + /* get URL from referer */ + strlcpy(base_url, referer, size); + if (strchr(base_url, '?')) + *strchr(base_url, '?') = 0; + if (strrchr(base_url, '/')) + *(strrchr(base_url, '/')+1) = 0; + } else { strcpy(base_url, "http://"); - if (elog_tcp_port == 80) - sprintf(base_url + strlen(base_url), "%s/", host_name); - else - sprintf(base_url + strlen(base_url), "%s:%d/", host_name, elog_tcp_port); - if (lbs) { - strlcat(base_url, lbs->name_enc, size); - strlcat(base_url, "/", size); + if (elog_tcp_port == 80) + sprintf(base_url + strlen(base_url), "%s/", host_name); + else + sprintf(base_url + strlen(base_url), "%s:%d/", host_name, elog_tcp_port); + + if (lbs) { + strlcat(base_url, lbs->name_enc, size); + strlcat(base_url, "/", size); + } } } else { if (base_url[strlen(base_url) - 1] != '/') @@ -6443,7 +6476,8 @@ void show_plain_header(int size, char *file_name) rsprintf("\r\n"); } -void show_html_header(LOGBOOK * lbs, BOOL expires, char *title, BOOL close_head, BOOL rss_feed, char *cookie) +void show_html_header(LOGBOOK * lbs, BOOL expires, char *title, BOOL close_head, BOOL rss_feed, char *cookie, + int absolute_css) { char css[256], str[256]; @@ -6458,7 +6492,10 @@ void show_html_header(LOGBOOK * lbs, BOOL expires, char *title, BOOL close_head, rsprintf("%s\n", title); /* Cascading Style Sheet */ - compose_base_url(lbs, css, sizeof(css)); + if (absolute_css) + compose_base_url(lbs, css, sizeof(css)); + else + css[0] = 0; if (lbs != NULL && getcfg(lbs->name, "CSS", str, sizeof(str))) strlcat(css, str, sizeof(css)); @@ -6483,7 +6520,7 @@ void show_html_header(LOGBOOK * lbs, BOOL expires, char *title, BOOL close_head, void show_standard_header(LOGBOOK * lbs, BOOL expires, char *title, char *path, BOOL rss_feed, char *cookie) { - show_html_header(lbs, expires, title, TRUE, rss_feed, cookie); + show_html_header(lbs, expires, title, TRUE, rss_feed, cookie, FALSE); rsprintf("\n"); @@ -6501,7 +6538,7 @@ void show_upgrade_page(LOGBOOK * lbs) { char str[1000]; - show_html_header(lbs, FALSE, "ELOG Upgrade Information", TRUE, FALSE, NULL); + show_html_header(lbs, FALSE, "ELOG Upgrade Information", TRUE, FALSE, NULL, FALSE); rsprintf("\n"); @@ -7032,7 +7069,7 @@ void show_bottom_text(LOGBOOK * lbs) void show_error(char *error) { /* header */ - show_html_header(NULL, FALSE, "ELOG error", TRUE, FALSE, NULL); + show_html_header(NULL, FALSE, "ELOG error", TRUE, FALSE, NULL, FALSE); rsprintf("
\n"); rsprintf("

Not Found

\r\n"); rsprintf("The requested file %s was not found on this server

\r\n", file_name); @@ -8329,7 +8366,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL } else sprintf(str, "ELOG %s", lbs->name); - show_html_header(lbs, FALSE, str, FALSE, FALSE, cookie); + show_html_header(lbs, FALSE, str, FALSE, FALSE, cookie, FALSE); /* java script for checking required attributes and to check for cancelled edits */ rsprintf("\n\n");