diff --git a/scripts/im.js b/scripts/im.js new file mode 100644 index 00000000..b184c2d4 --- /dev/null +++ b/scripts/im.js @@ -0,0 +1,49 @@ +/********************************************************************\ + + Name: md.js + Created by: Stefan Ritt + + Contents: JavaScript code for ImageMagic interface inside ELOG + + $Id$ + +\********************************************************************/ + +var dummy = 0; + +function im(id, thumb, image, cmd) +{ + var xmlHttp; + + try { + xmlHttp = new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari + } + catch (e) { + try { + xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer + } + catch (e) { + try { + xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); + } + catch (e) { + alert("Your browser does not support AJAX!"); + return false; + } + } + } + + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + if (xmlHttp.responseText != "") + alert(xmlHttp.responseText); + document.getElementById(id).src = thumb+'?'+dummy; + dummy++; + } + } + + xmlHttp.open("GET","?cmd=im&req="+cmd+"&img="+image, true); + xmlHttp.send(null); +} diff --git a/src/elogd.c b/src/elogd.c index a131197e..4cee9d70 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -439,6 +439,7 @@ void strencode2(char *b, const char *text, int size); void load_config_section(char *section, char **buffer, char *error); void remove_crlf(char *buffer); time_t convert_date(char *date_string); +int get_thumb_name(const char *file_name, char *thumb_name, int size, int index); int create_thumbnail(LOGBOOK * lbs, char *file_name); /*---- Funcions from the MIDAS library -----------------------------*/ @@ -1005,79 +1006,7 @@ void redirect_to_stderr(void) /*------------------------------------------------------------------*/ -int my_system(const char *cmd) -/* execute system() command as original user */ -{ -#ifdef OS_UNIX - pid_t child_pid; - int status; - char str[256]; - - if ((child_pid = fork()) < 0) - return 0; - else if (child_pid > 0) { - /* parent process waits for child */ - waitpid(child_pid, &status, 0); - } else { - /* child process */ - - /* restore original UID/GID */ - if (setregid(-1, orig_gid) < 0 || setreuid(-1, orig_uid) < 0) - eprintf("Cannot restore original GID/UID.\n"); - - /* give up root privilege permanently */ - if (geteuid() == 0) { - if (!getcfg("global", "Grp", str, sizeof(str)) || setgroup(str) < 0) { - eprintf("Falling back to default group \"elog\"\n"); - if (setgroup("elog") < 0) { - eprintf("Falling back to default group \"%s\"\n", DEFAULT_GROUP); - if (setgroup(DEFAULT_GROUP) < 0) { - eprintf("Refuse to run as setgid root.\n"); - eprintf("Please consider to define a Grp statement in configuration file\n"); - exit(EXIT_FAILURE); - } - } - } else if (verbose) - eprintf("Falling back to group \"%s\"\n", str); - - if (!getcfg("global", "Usr", str, sizeof(str)) || setuser(str) < 0) { - eprintf("Falling back to default user \"elog\"\n"); - if (setuser("elog") < 0) { - eprintf("Falling back to default user \"%s\"\n", DEFAULT_USER); - if (setuser(DEFAULT_USER) < 0) { - eprintf("Refuse to run as setuid root.\n"); - eprintf("Please consider to define a Usr statement in configuration file\n"); - exit(EXIT_FAILURE); - } - } - } else if (verbose) - eprintf("Falling back to user \"%s\"\n", str); - } - - /* execute shell with redirection to /tmp/elog-shell */ - sprintf(str, "/bin/sh -c \"%s\"", cmd); - - if (verbose) { - efputs("Going to execute: "); - efputs(str); - efputs("\n"); - } - - system(str); - exit(0); - } -#endif - -#ifdef OS_WINNT - system(cmd); -#endif - - return 1; -} - -/*------------------------------------------------------------------*/ - -int subst_shell(char *cmd, char *result, int size) +int my_shell(char *cmd, char *result, int size) { #ifdef OS_WINNT @@ -1394,7 +1323,7 @@ void strsubst_list(char *string, int size, char name[][NAME_LENGTH], char value[ strlcpy(result, loc("Shell execution not enabled via -x flag"), sizeof(result)); eprintf("Shell execution not enabled via -x flag.\n"); } else - subst_shell(str, result, sizeof(result)); + my_shell(str, result, sizeof(result)); strlcpy(pt, result, sizeof(tmp) - (pt - tmp)); pt += strlen(pt); @@ -8938,7 +8867,7 @@ void ricon(char *name, char *comment, char *onclick) rsprintf(" onclick=\"%s\"", onclick); rsprintf(" onmousedown=\"document.images.%s.src='icons/eld_%s.png'\"", name, name); rsprintf(" onmouseup=\"document.images.%s.src='icons/elc_%s.png'\"", name, name); - rsprintf(" onmouseover=\"this.style.cursor='pointer';\" />"); + rsprintf(" onmouseover=\"this.style.cursor='pointer';\" />\n"); } /*------------------------------------------------------------------*/ @@ -8991,7 +8920,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL int i, j, n, index, aindex, size, width, height, fh, length, input_size, input_maxlen, format_flags[MAX_N_ATTR], year, month, day, hour, min, sec, n_attr, n_disp_attr, n_lines, attr_index[MAX_N_ATTR], enc_selected, show_smileys, show_text, n_moptions, display_inline, - allowed_encoding; + allowed_encoding, thumb_status; char str[2 * NAME_LENGTH], str2[NAME_LENGTH], preset[2 * NAME_LENGTH], *p, *pend, star[80], comment[10000], reply_string[256], list[MAX_N_ATTR][NAME_LENGTH], file_name[256], *buffer, format[256], date[80], script_onload[256], script_onfocus[256], script_onunload[256], attrib[MAX_N_ATTR][NAME_LENGTH], *text, @@ -8999,7 +8928,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL slist[MAX_N_ATTR + 10][NAME_LENGTH], svalue[MAX_N_ATTR + 10][NAME_LENGTH], owner[256], locked_by[256], class_value[80], class_name[80], ua[NAME_LENGTH], mid[80], title[256], login_name[256], full_name[256], cookie[256], orig_author[256], attr_moptions[MAX_N_LIST][NAME_LENGTH], ref[256], file_enc[256], - tooltip[10000], enc_attr[NAME_LENGTH], user_email[256]; + tooltip[10000], enc_attr[NAME_LENGTH], user_email[256], cmd[256], thumb_name[256]; time_t now, ltime; char fl[8][NAME_LENGTH]; struct tm *pts; @@ -9700,6 +9629,10 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL rsprintf("//-->\n"); rsprintf("\n"); + /* optionally load ImageMagic JavaScript code */ + if (image_magick_exist) + rsprintf("\n\n"); + /* optionally load ELCode JavaScript code */ if (enc_selected == 0) rsprintf("\n\n"); @@ -11074,41 +11007,101 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL rsprintf("%s %d:\n", loc("Attachment"), index + 1); sprintf(str, "attachment%d", index); rsprintf("\n"); + rsprintf("\n", str, att[index]); if (strlen(att[index]) < 14 || att[index][6] != '_' || att[index][13] != '_') { rsprintf("Error: Invalid attachment \"%s\"
", att); } else { - rsprintf("\n", str, att[index]); - rsprintf("%s\n", att[index] + 14); - rsprintf("  "); - strlcpy(file_name, lbs->data_dir, sizeof(file_name)); strlcat(file_name, att[index], sizeof(file_name)); display_inline = is_image(file_name) || is_ascii(file_name); - if (chkext(file_name, ".PS") || chkext(file_name, ".PDF") || chkext(file_name, ".EPS")) + if (chkext(file_name, ".ps") || chkext(file_name, ".pdf") || chkext(file_name, ".eps")) display_inline = 0; - if ((chkext(file_name, ".HTM") || chkext(file_name, ".HTML")) && is_full_html(file_name)) + if ((chkext(file_name, ".htm") || chkext(file_name, ".html")) && is_full_html(file_name)) display_inline = 0; if (getcfg(lbs->name, "Preview attachments", str, sizeof(str)) && atoi(str) == 0) display_inline = 0; + thumb_status = create_thumbnail(lbs, file_name); + if (thumb_status) + display_inline = 1; + + if (thumb_status) { + get_thumb_name(file_name, thumb_name, sizeof(thumb_name), 0); + if (strrchr(thumb_name, DIR_SEPARATOR)) + strlcpy(str, strrchr(thumb_name, DIR_SEPARATOR)+1, sizeof(str)); + else + strlcpy(str, thumb_name, sizeof(str)); + strlcpy(thumb_name, str, sizeof(str)); + + rsprintf("\n"); + rsprintf("
\n"); + sprintf(str, "im('att'+%d,'%s','%s','smaller');", index, thumb_name, att[index]); + ricon("smaller", loc("Make smaller"), str); + sprintf(str, "im('att'+%d,'%s','%s','larger');", index, thumb_name, att[index]); + ricon("larger", loc("Make larger"), str); + rsprintf(" "); + sprintf(str, "im('att'+%d,'%s','%s','rotleft');", index, thumb_name, att[index]); + ricon("rotleft", loc("Rotate left"), str); + sprintf(str, "im('att'+%d,'%s','%s','rotright');", index, thumb_name, att[index]); + ricon("rotright", loc("Rotate right"), str); + rsprintf(" "); + sprintf(str, "document.form1.jcmd.value='delete';"); + sprintf(str+strlen(str), "document.form1.smcmd.value='delatt%d';", index); + sprintf(str+strlen(str), "document.form1.submit();"); + ricon("delete", loc("Delete attachment"), str); + rsprintf("  "); + + /* ImageMagick available, so get image size */ + rsprintf("%s \n", att[index] + 14); + sprintf(cmd, "identify -format %%P \"%s\"", file_name); + my_shell(cmd, str, sizeof(str)); + if (atoi(str) > 0) + rsprintf("%s: %s\n", loc("Original size"), str); + + rsprintf("
"); + } else { + rsprintf("%s\n", att[index] + 14); + rsprintf("  "); + rsprintf("
\n"); + } + if (display_inline) { - rsprintf("
\n"); - - strlcpy(str, att[index], sizeof(str)); - str[13] = 0; - strcpy(file_enc, att[index] + 14); - url_encode(file_enc, sizeof(file_enc)); /* for file names with special characters like "+" */ - sprintf(ref, "%s/%s", str, file_enc); - if (is_image(att[index])) { - rsprintf("\"%s\"\n", ref, att[index] + 14, - att[index] + 14); + if (thumb_status) { + for (i=0 ; ; i++) { + get_thumb_name(file_name, thumb_name, sizeof(thumb_name), i); + if (thumb_name[0]) { + strlcpy(str, att[index], sizeof(str)); + str[13] = 0; + if (strrchr(thumb_name, DIR_SEPARATOR)) + strlcpy(file_enc, strrchr(thumb_name, DIR_SEPARATOR)+1+14, sizeof(file_enc)); + else + strlcpy(file_enc, thumb_name + 14, sizeof(file_enc)); + url_encode(file_enc, sizeof(file_enc)); /* for file names with special characters like "+" */ + sprintf(ref, "%s/%s", str, file_enc); + + rsprintf("\"%s\"\n", + ref, att[index] + 14, att[index] + 14, index); + } else + break; + } + + } else { + strlcpy(str, att[index], sizeof(str)); + str[13] = 0; + strcpy(file_enc, att[index] + 14); + url_encode(file_enc, sizeof(file_enc)); /* for file names with special characters like "+" */ + sprintf(ref, "%s/%s", str, file_enc); + + rsprintf("\"%s\"\n", + ref, att[index] + 14, att[index] + 14, index); + } } else { if (is_ascii(file_name)) { if (!chkext(att[index], ".HTML")) @@ -11140,6 +11133,9 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL } } } + + if (thumb_status) + rsprintf("
\n"); } rsprintf("\n"); @@ -16917,13 +16913,13 @@ void display_line(LOGBOOK * lbs, int message_id, int number, char *mode, if (thumb_status == 2) { for (i=0 ; ; i++) { strlcpy(str, file_name, sizeof(str)); - if (chkext(str, ".pdf") || chkext(str, ".ps") | chkext(str, ".eps")) + if (chkext(str, ".pdf") || chkext(str, ".ps")) if (strrchr(str, '.')) *strrchr(str, '.') = 0; sprintf(str+strlen(str), "-%d.png", i); if (file_exist(str)) { strlcpy(str, ref, sizeof(str)); - if (chkext(file_name, ".pdf") || chkext(file_name, ".ps") | chkext(file_name, ".eps")) + if (chkext(file_name, ".pdf") || chkext(file_name, ".ps")) if (strrchr(str, '.')) *strrchr(str, '.') = 0; sprintf(str+strlen(str), "-%d.png", i); @@ -17381,6 +17377,9 @@ BOOL is_command_allowed(LOGBOOK * lbs, char *command) else if (command[0] && strieq(command, "GetMD5")) { return TRUE; } + else if (command[0] && strieq(command, "IM")) { + return TRUE; + } /* check if command is present in the menu list */ else if (command[0]) { n = strbreak(menu_str, menu_item, MAX_N_LIST, ",", FALSE); @@ -20839,7 +20838,7 @@ int execute_shell(LOGBOOK * lbs, int message_id, char attrib[MAX_N_ATTR][NAME_LE sprintf(str, "SHELL \"%s\"", shell_cmd); write_logfile(lbs, str); - my_system(shell_cmd); + my_shell(shell_cmd, str, sizeof(str)); return SUCCESS; } @@ -22029,6 +22028,7 @@ int is_inline_attachment(char *encoding, int message_id, char *text, int i, char int create_thumbnail(LOGBOOK * lbs, char *file_name) { char str[MAX_PATH_LENGTH], cmd[2*MAX_PATH_LENGTH], thumb_size[256]; + int status; if (!image_magick_exist) return 0; @@ -22041,32 +22041,16 @@ int create_thumbnail(LOGBOOK * lbs, char *file_name) !chkext(file_name, ".png") && !chkext(file_name, ".ico") && !chkext(file_name, ".tif")) return 0; - /* append .png for all files as thumbnail name, except for PDF files (convert bug!) */ - if (chkext(file_name, ".pdf") || chkext(file_name, ".ps") | chkext(file_name, ".eps")) { - strlcpy(str, file_name, sizeof(str)); + status = get_thumb_name(file_name, str, sizeof(str), 0); + if (status) + return status; + + strlcpy(str, file_name, sizeof(str)); + if (chkext(file_name, ".pdf") || chkext(file_name, ".ps")) { if (strrchr(str, '.')) *strrchr(str, '.') = 0; - strlcat(str, "-0.png", sizeof(str)); - if (file_exist(str)) - return 2; - - strlcpy(str, file_name, sizeof(str)); - if (strrchr(str, '.')) - *strrchr(str, '.') = 0; - strlcat(str, ".png", sizeof(str)); - if (file_exist(str)) - return 1; - } else { - strlcpy(str, file_name, sizeof(str)); - strlcat(str, "-0.png", sizeof(str)); - if (file_exist(str)) - return 2; - - strlcpy(str, file_name, sizeof(str)); - strlcat(str, ".png", sizeof(str)); - if (file_exist(str)) - return 1; } + strlcat(str, ".png", sizeof(str)); #ifdef OS_UNIX if (chkext(file_name, ".pdf") || chkext(file_name, ".ps")) @@ -22082,42 +22066,140 @@ int create_thumbnail(LOGBOOK * lbs, char *file_name) sprintf(str, "SHELL \"%s\"", cmd); write_logfile(lbs, str); - if (verbose) + if (verbose) { eprintf(str); - - my_system(cmd); - - if (chkext(file_name, ".pdf") || chkext(file_name, ".ps") | chkext(file_name, ".eps")) { - strlcpy(str, file_name, sizeof(str)); - if (strrchr(str, '.')) - *strrchr(str, '.') = 0; - strlcat(str, "-0.png", sizeof(str)); - if (file_exist(str)) - return 2; - - strlcpy(str, file_name, sizeof(str)); - if (strrchr(str, '.')) - *strrchr(str, '.') = 0; - strlcat(str, ".png", sizeof(str)); - if (file_exist(str)) - return 1; - } else { - strlcpy(str, file_name, sizeof(str)); - strlcat(str, ".png", sizeof(str)); - if (file_exist(str)) - return 1; - - strlcpy(str, file_name, sizeof(str)); - strlcat(str, "-0.png", sizeof(str)); - if (file_exist(str)) - return 2; + eprintf("\n"); } + my_shell(cmd, str, sizeof(str)); + + status = get_thumb_name(file_name, str, sizeof(str), 0); + if (status) + return status; + return 3; } /*------------------------------------------------------------------*/ +int get_thumb_name(const char *file_name, char *thumb_name, int size, int index) +{ + char str[MAX_PATH_LENGTH]; + + thumb_name[0] = 0; + + /* append .png for all files as thumbnail name, except for PDF files (convert bug!) */ + if (chkext(file_name, ".pdf") || chkext(file_name, ".ps")) { + strlcpy(str, file_name, sizeof(str)); + if (strrchr(str, '.')) + *strrchr(str, '.') = 0; + sprintf(str+strlen(str), "-%d.png", index); + if (file_exist(str)) { + strlcpy(thumb_name, str, size); + return 2; + } + + if (index > 0) + return 0; + + strlcpy(str, file_name, sizeof(str)); + if (strrchr(str, '.')) + *strrchr(str, '.') = 0; + strlcat(str, ".png", sizeof(str)); + if (file_exist(str)) { + strlcpy(thumb_name, str, size); + return 1; + } + } else { + strlcpy(str, file_name, sizeof(str)); + sprintf(str+strlen(str), "-%d.png", index); + if (file_exist(str)) { + strlcpy(thumb_name, str, size); + return 2; + } + + if (index > 0) + return 0; + + strlcpy(str, file_name, sizeof(str)); + strlcat(str, ".png", sizeof(str)); + if (file_exist(str)) { + strlcpy(thumb_name, str, size); + return 1; + } + } + + return 0; +} + +/*------------------------------------------------------------------*/ + +void call_image_magick(LOGBOOK *lbs, int message_id) +{ + char str[256], cmd[256], file_name[256], thumb_name[256]; + int cur_width, cur_height, new_size, cur_rot, new_rot; + + if (!isparam("req") || !isparam("img")) { + show_error("Unknown IM request received"); + return; + } + + strlcpy(file_name, lbs->data_dir, sizeof(file_name)); + strlcat(file_name, getparam("img"), sizeof(file_name)); + get_thumb_name(file_name, thumb_name, sizeof(thumb_name), 0); + + sprintf(cmd, "identify -format %%P%%c \"%s\"", thumb_name); + my_shell(cmd, str, sizeof(str)); + if (atoi(str) > 0) { + cur_width = atoi(str); + if (strchr(str, 'x')) { + cur_height = atoi(strchr(str, 'x')+1); + } else + cur_height = cur_width; + if (strchr(str, ' ')) { + cur_rot = atoi(strchr(str, ' ')+1); + } else + cur_rot = 0; + } else { + show_error(str); + return; + } + + if (strieq(getparam("req"), "rotleft")) { + new_rot = (cur_rot + 360 - 90) % 360; + sprintf(cmd, "convert \"%s\" -rotate %d -thumbnail %d -set comment \" %d\" \"%s\"", + file_name, new_rot, cur_height, new_rot, thumb_name); + my_shell(cmd, str, sizeof(str)); + } + + if (strieq(getparam("req"), "rotright")) { + new_rot = (cur_rot + 90) % 360; + sprintf(cmd, "convert \"%s\" -rotate %d -thumbnail %d -set comment \" %d\" \"%s\"", + file_name, new_rot, cur_height, new_rot, thumb_name); + my_shell(cmd, str, sizeof(str)); + } + + if (strieq(getparam("req"), "smaller")) { + new_size = (int) (cur_width/1.5); + sprintf(cmd, "convert \"%s\" -rotate %d -thumbnail %d -set comment \" %d\" \"%s\"", + file_name, cur_rot, new_size, cur_rot, thumb_name); + my_shell(cmd, str, sizeof(str)); + } + + if (strieq(getparam("req"), "larger")) { + new_size = (int) (cur_width*1.5); + sprintf(cmd, "convert \"%s\" -rotate %d -thumbnail %d -set comment \" %d\" \"%s\"", + file_name, cur_rot, new_size, cur_rot, thumb_name); + my_shell(cmd, str, sizeof(str)); + } + + show_http_header(NULL, FALSE, NULL); + rsputs(str); + return; +} + +/*------------------------------------------------------------------*/ + void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) { int size, i, j, k, n, n_log, status, fh, length, message_error, index, n_hidden, @@ -23079,13 +23161,13 @@ void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) if (thumb_status == 2 && !email) { for (i=0 ; ; i++) { strlcpy(str, file_name, sizeof(str)); - if (chkext(file_name, ".pdf") || chkext(file_name, ".ps") | chkext(file_name, ".eps")) + if (chkext(file_name, ".pdf") || chkext(file_name, ".ps")) if (strrchr(str, '.')) *strrchr(str, '.') = 0; sprintf(str+strlen(str), "-%d.png", i); if (file_exist(str)) { strlcpy(str, ref, sizeof(str)); - if (chkext(file_name, ".pdf") || chkext(file_name, ".ps") | chkext(file_name, ".eps")) + if (chkext(file_name, ".pdf") || chkext(file_name, ".ps")) if (strrchr(str, '.')) *strrchr(str, '.') = 0; sprintf(str+strlen(str), "-%d.png", i); @@ -23099,7 +23181,7 @@ void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) if (!email) { rsprintf("\n", index + 1, ref); strlcpy(str, ref, sizeof(str)); - if (chkext(file_name, ".pdf") || chkext(file_name, ".ps") | chkext(file_name, ".eps")) + if (chkext(file_name, ".pdf") || chkext(file_name, ".ps")) if (strrchr(str, '.')) *strrchr(str, '.') = 0; strlcat(str, ".png", sizeof(str)); @@ -23113,8 +23195,8 @@ void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) if (!email) { rsprintf("\n"); rsprintf("\n", index + 1); - rsprintf("\"%s\"\n", ref, attachment[index] + 14, - attachment[index] + 14); + rsprintf("\"%s\"\n", ref, + attachment[index] + 14, attachment[index] + 14); rsprintf("\n\n"); } } else { @@ -25212,7 +25294,7 @@ void interprete(char *lbook, char *path) /* check for deletion of attachments */ for (i = 0; i < MAX_ATTACHMENTS; i++) { sprintf(str, "delatt%d", i); - if (isparam(str)) { + if (isparam(str) || (isparam("smcmd") && stricmp(getparam("smcmd"), str) == 0)) { sprintf(str, "attachment%d", i); strlcpy(file_name, getparam(str), sizeof(file_name)); el_delete_attachment(lbs, file_name); @@ -25538,6 +25620,11 @@ void interprete(char *lbook, char *path) return; } + if (strieq(command, "IM")) { + call_image_magick(lbs, message_id); + return; + } + /* check for welcome page */ if (!_cmdline[0] && getcfg(lbs->name, "Welcome page", str, sizeof(str)) && str[0]) { /* check if file starts with an absolute directory */ @@ -26781,7 +26868,7 @@ void server_loop(void) eprintf("FCKedit detected\n"); /* check for ImageMagick */ - subst_shell("convert -version", str, sizeof(str)); + my_shell("convert -version", str, sizeof(str)); image_magick_exist = (strstr(str, "ImageMagick") != NULL); if (image_magick_exist) eprintf("ImageMagick detected\n");