Fixed potential buffer overflows

SVN revision: 1635
This commit is contained in:
Stefan Ritt 2006-01-24 19:57:00 +00:00
parent 96f4118b40
commit 9dc7982f0d

View File

@ -1409,13 +1409,15 @@ void base64_decode(char *s, char *d)
*d = 0; *d = 0;
} }
void base64_encode(unsigned char *s, unsigned char *d) void base64_encode(unsigned char *s, unsigned char *d, int size)
{ {
unsigned int t, pad; unsigned int t, pad;
unsigned char *p;
pad = 3 - strlen((char *) s) % 3; pad = 3 - strlen((char *) s) % 3;
if (pad == 3) if (pad == 3)
pad = 0; pad = 0;
p = d;
while (*s) { while (*s) {
t = (*s++) << 16; t = (*s++) << 16;
if (*s) if (*s)
@ -1432,6 +1434,8 @@ void base64_encode(unsigned char *s, unsigned char *d)
*(d + 0) = map[t & 63]; *(d + 0) = map[t & 63];
d += 4; d += 4;
if (d-p >= size-3)
return;
} }
*d = 0; *d = 0;
while (pad--) while (pad--)
@ -1468,12 +1472,12 @@ void base64_bufenc(unsigned char *s, int len, char *d)
*(--d) = '='; *(--d) = '=';
} }
void do_crypt(char *s, char *d) void do_crypt(char *s, char *d, int size)
{ {
#ifdef HAVE_CRYPT #ifdef HAVE_CRYPT
strcpy(d, crypt(s, "el")); strlcpy(d, crypt(s, "el"), size);
#else #else
base64_encode((unsigned char *) s, (unsigned char *) d); base64_encode((unsigned char *) s, (unsigned char *) d, size);
#endif #endif
} }
@ -1981,7 +1985,8 @@ void compose_email_header(LOGBOOK * lbs, char *subject, char *from, char *to,
strlcat(subject_enc, "=?", sizeof(subject_enc)); strlcat(subject_enc, "=?", sizeof(subject_enc));
strlcat(subject_enc, charset, sizeof(subject_enc)); strlcat(subject_enc, charset, sizeof(subject_enc));
strlcat(subject_enc, "?B?", sizeof(subject_enc)); strlcat(subject_enc, "?B?", sizeof(subject_enc));
base64_encode((unsigned char *) buffer, (unsigned char *) (subject_enc + strlen(subject_enc))); base64_encode((unsigned char *) buffer, (unsigned char *) (subject_enc + strlen(subject_enc)),
sizeof(subject_enc)-strlen(subject_enc));
strlcat(subject_enc, "?=", sizeof(subject_enc)); strlcat(subject_enc, "?=", sizeof(subject_enc));
if (strlen(subject + i) < 40) if (strlen(subject + i) < 40)
break; break;
@ -2144,7 +2149,7 @@ int sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, char *text, c
goto smtp_error; goto smtp_error;
getcfg(lbs->name, "SMTP username", decoded, sizeof(decoded)); getcfg(lbs->name, "SMTP username", decoded, sizeof(decoded));
base64_encode((unsigned char *) decoded, (unsigned char *) str); base64_encode((unsigned char *) decoded, (unsigned char *) str, sizeof(str));
strcat(str, "\r\n"); strcat(str, "\r\n");
send(s, str, strlen(str), 0); send(s, str, strlen(str), 0);
if (verbose) if (verbose)
@ -2336,7 +2341,7 @@ int retrieve_url(char *url, char **buffer, char *rpwd)
{ {
struct sockaddr_in bind_addr; struct sockaddr_in bind_addr;
struct hostent *phe; struct hostent *phe;
char str[256], host[256], subdir[256], param[256], auth[256], pwd_enc[256]; char str[1000], unm[256], upwd[256], host[256], subdir[256], param[256], auth[256], pwd_enc[256];
int port, bufsize; int port, bufsize;
int i, n; int i, n;
fd_set readfds; fd_set readfds;
@ -2388,12 +2393,15 @@ int retrieve_url(char *url, char **buffer, char *rpwd)
sprintf(str, "GET %s%s HTTP/1.0\r\nConnection: Close\r\n", subdir, param); sprintf(str, "GET %s%s HTTP/1.0\r\nConnection: Close\r\n", subdir, param);
/* add local username/password */ /* add local username/password */
if (isparam("unm") && isparam("upwd")) if (isparam("unm") && isparam("upwd")) {
strlcpy(unm, getparam("unm"), sizeof(unm));
strlcpy(upwd, getparam("upwd"), sizeof(upwd));
sprintf(str + strlen(str), "Cookie: unm=%s; upwd=%s\r\n", getparam("unm"), getparam("upwd")); sprintf(str + strlen(str), "Cookie: unm=%s; upwd=%s\r\n", getparam("unm"), getparam("upwd"));
}
if (rpwd && rpwd[0]) { if (rpwd && rpwd[0]) {
sprintf(auth, "anybody:%s", rpwd); sprintf(auth, "anybody:%s", rpwd);
base64_encode((unsigned char *) auth, (unsigned char *) pwd_enc); base64_encode((unsigned char *) auth, (unsigned char *) pwd_enc, sizeof(pwd_enc));
sprintf(str + strlen(str), "Authorization: Basic %s\r\n", pwd_enc); sprintf(str + strlen(str), "Authorization: Basic %s\r\n", pwd_enc);
} }
@ -3284,7 +3292,10 @@ void retrieve_email_from(LOGBOOK * lbs, char *ret, char *ret_name, char attrib[M
if (!getcfg(lbs->name, "Use Email from", str, sizeof(str))) { if (!getcfg(lbs->name, "Use Email from", str, sizeof(str))) {
if (isparam("full_name") && isparam("user_email")) { if (isparam("full_name") && isparam("user_email")) {
sprintf(email_from_name, "%s <%s>", getparam("full_name"), getparam("user_email")); strlcpy(email_from_name, getparam("full_name"), sizeof(email_from_name));
strlcat(email_from_name, " <", sizeof(email_from_name));
strlcat(email_from_name, getparam("user_email"), sizeof(email_from_name));
strlcat(email_from_name, ">", sizeof(email_from_name));
strlcpy(email_from, getparam("user_email"), sizeof(email_from)); strlcpy(email_from, getparam("user_email"), sizeof(email_from));
} else { } else {
sprintf(email_from_name, "ELog <ELog@%s>", host_name); sprintf(email_from_name, "ELog <ELog@%s>", host_name);
@ -5020,7 +5031,7 @@ int el_lock_message(LOGBOOK * lbs, int message_id, char *user)
void write_logfile(LOGBOOK * lbs, const char *text) void write_logfile(LOGBOOK * lbs, const char *text)
{ {
char file_name[2000]; char file_name[2000];
char str[10000]; char str[10000], unm[256];
int fh; int fh;
time_t now; time_t now;
char buf[10000]; char buf[10000];
@ -5046,9 +5057,10 @@ void write_logfile(LOGBOOK * lbs, const char *text)
strftime(buf, sizeof(buf), "%d-%b-%Y %H:%M:%S", localtime(&now)); strftime(buf, sizeof(buf), "%d-%b-%Y %H:%M:%S", localtime(&now));
strcat(buf, " "); strcat(buf, " ");
if (isparam("unm") && rem_host[0]) if (isparam("unm") && rem_host[0]) {
sprintf(buf + strlen(buf), "[%s@%s] ", getparam("unm"), rem_host); strlcpy(unm, getparam("unm"), sizeof(unm));
else if (rem_host[0]) sprintf(buf + strlen(buf), "[%s@%s] ", unm, rem_host);
} else if (rem_host[0])
sprintf(buf + strlen(buf), "[%s] ", rem_host); sprintf(buf + strlen(buf), "[%s] ", rem_host);
if (lbs) if (lbs)
@ -6278,7 +6290,7 @@ void set_redir(LOGBOOK * lbs, char *redir)
/* prepare relative path */ /* prepare relative path */
if (redir[0]) if (redir[0])
strcpy(str, redir); strlcpy(str, redir, sizeof(str));
else { else {
if (lbs) if (lbs)
sprintf(str, "../%s/", lbs->name_enc); sprintf(str, "../%s/", lbs->name_enc);
@ -7543,7 +7555,7 @@ int build_subst_list(LOGBOOK * lbs, char list[][NAME_LENGTH], char value[][NAME_
} else } else
strcpy(value[i], attrib[i]); strcpy(value[i], attrib[i]);
} else } else
strcpy(value[i], isparam(attr_list[i]) ? getparam(attr_list[i]) : ""); strlcpy(value[i], isparam(attr_list[i]) ? getparam(attr_list[i]) : "", NAME_LENGTH);
} }
/* add remote host */ /* add remote host */
@ -7680,21 +7692,21 @@ BOOL change_pwd(LOGBOOK * lbs, char *user, char *pwd)
void show_change_pwd_page(LOGBOOK * lbs) void show_change_pwd_page(LOGBOOK * lbs)
{ {
char str[256], old_pwd[32], new_pwd[32], new_pwd2[32], act_pwd[32], user[80]; char str[256], config[80], old_pwd[32], new_pwd[32], new_pwd2[32], act_pwd[32], user[80];
int wrong_pwd; int wrong_pwd;
old_pwd[0] = new_pwd[0] = new_pwd2[0] = 0; old_pwd[0] = new_pwd[0] = new_pwd2[0] = 0;
if (isparam("oldpwd")) if (isparam("oldpwd"))
do_crypt(getparam("oldpwd"), old_pwd); do_crypt(getparam("oldpwd"), old_pwd, sizeof(old_pwd));
if (isparam("newpwd")) if (isparam("newpwd"))
do_crypt(getparam("newpwd"), new_pwd); do_crypt(getparam("newpwd"), new_pwd, sizeof(new_pwd));
if (isparam("newpwd2")) if (isparam("newpwd2"))
do_crypt(getparam("newpwd2"), new_pwd2); do_crypt(getparam("newpwd2"), new_pwd2, sizeof(new_pwd2));
strcpy(user, isparam("unm") ? getparam("unm") : ""); strlcpy(user, isparam("unm") ? getparam("unm") : "", sizeof(user));
if (isparam("config")) if (isparam("config"))
strcpy(user, getparam("config")); strlcpy(user, getparam("config"), sizeof(user));
wrong_pwd = FALSE; wrong_pwd = FALSE;
@ -7727,9 +7739,10 @@ void show_change_pwd_page(LOGBOOK * lbs)
if (!wrong_pwd) { if (!wrong_pwd) {
/* redirect back to configuration page */ /* redirect back to configuration page */
if (isparam("config")) if (isparam("config")) {
sprintf(str, "?cmd=%s&cfg_user=%s", loc("Config"), getparam("config")); strlcpy(config, getparam("config"), sizeof(config));
else sprintf(str, "?cmd=%s&cfg_user=%s", loc("Config"), config);
} else
sprintf(str, "?cmd=%s", loc("Config")); sprintf(str, "?cmd=%s", loc("Config"));
redirect(lbs, str); redirect(lbs, str);
return; return;
@ -8189,7 +8202,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL
if (breedit || bupload) { if (breedit || bupload) {
/* get date from parameter */ /* get date from parameter */
if (isparam("entry_date")) if (isparam("entry_date"))
strcpy(date, getparam("entry_date")); strlcpy(date, getparam("entry_date"), sizeof(date));
/* get attributes from parameters */ /* get attributes from parameters */
attrib_from_param(lbs->n_attr, attrib); attrib_from_param(lbs->n_attr, attrib);
@ -8213,7 +8226,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL
} }
/* get encoding */ /* get encoding */
strcpy(encoding, isparam("encoding") ? getparam("encoding") : ""); strlcpy(encoding, isparam("encoding") ? getparam("encoding") : "", sizeof(encoding));
} else { } else {
if (message_id) { if (message_id) {
/* get message for reply/edit */ /* get message for reply/edit */
@ -8425,9 +8438,9 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL
if (message_id && bedit && !breedit && !bupload) { if (message_id && bedit && !breedit && !bupload) {
if (getcfg(lbs->name, "Use Lock", str, sizeof(str)) && atoi(str) == 1) { if (getcfg(lbs->name, "Use Lock", str, sizeof(str)) && atoi(str) == 1) {
if (isparam("full_name")) if (isparam("full_name"))
strcpy(str, getparam("full_name")); strlcpy(str, getparam("full_name"), sizeof(str));
else else
strcpy(str, loc("user")); strlcpy(str, loc("user"), sizeof(str));
strcat(str, " "); strcat(str, " ");
strcat(str, loc("on")); strcat(str, loc("on"));
@ -10828,12 +10841,12 @@ int save_user_config(LOGBOOK * lbs, char *user, BOOL new_user, BOOL activate)
if (!activate) { if (!activate) {
/* check for hidden password */ /* check for hidden password */
if (isparam("hpwd")) { if (isparam("hpwd")) {
strcpy(new_pwd, getparam("hpwd")); strlcpy(new_pwd, getparam("hpwd"), sizeof(new_pwd));
} else { } else {
/* check if passwords match */ /* check if passwords match */
if (isparam("newpwd") && isparam("newpwd2")) { if (isparam("newpwd") && isparam("newpwd2")) {
do_crypt(getparam("newpwd"), new_pwd); do_crypt(getparam("newpwd"), new_pwd, sizeof(new_pwd));
do_crypt(getparam("newpwd2"), new_pwd2); do_crypt(getparam("newpwd2"), new_pwd2, sizeof(new_pwd2));
} }
if (strcmp(new_pwd, new_pwd2) != 0) { if (strcmp(new_pwd, new_pwd2) != 0) {
@ -11047,7 +11060,7 @@ int save_user_config(LOGBOOK * lbs, char *user, BOOL new_user, BOOL activate)
strcpy(str, isparam("new_full_name") ? getparam("new_full_name") : ""); strcpy(str, isparam("new_full_name") ? getparam("new_full_name") : "");
url_encode(str, sizeof(str)); url_encode(str, sizeof(str));
if (isparam("newpwd")) if (isparam("newpwd"))
do_crypt(getparam("newpwd"), enc_pwd); do_crypt(getparam("newpwd"), enc_pwd, sizeof(enc_pwd));
else else
enc_pwd[0] = 0; enc_pwd[0] = 0;
url_encode(enc_pwd, sizeof(enc_pwd)); url_encode(enc_pwd, sizeof(enc_pwd));
@ -11377,8 +11390,8 @@ void show_forgot_pwd_page(LOGBOOK * lbs)
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
str[i] = 'A' + (rand() % 25); str[i] = 'A' + (rand() % 25);
str[i] = 0; str[i] = 0;
base64_encode((unsigned char *) str, (unsigned char *) pwd); base64_encode((unsigned char *) str, (unsigned char *) pwd, sizeof(pwd));
do_crypt(pwd, pwd_encrypted); do_crypt(pwd, pwd_encrypted, sizeof(pwd_encrypted));
/* send email with new password */ /* send email with new password */
if (!getcfg("global", "SMTP host", smtp_host, sizeof(smtp_host))) { if (!getcfg("global", "SMTP host", smtp_host, sizeof(smtp_host))) {
@ -13417,7 +13430,7 @@ void receive_pwdfile(LOGBOOK * lbs, char *server, char *error_str)
eprintf("\n"); eprintf("\n");
while (str[strlen(str) - 1] == '\r' || str[strlen(str) - 1] == '\n') while (str[strlen(str) - 1] == '\r' || str[strlen(str) - 1] == '\n')
str[strlen(str) - 1] = 0; str[strlen(str) - 1] = 0;
do_crypt(str, pwd); do_crypt(str, pwd, sizeof(pwd));
setparam("upwd", pwd); setparam("upwd", pwd);
status = 0; status = 0;
} }
@ -13661,7 +13674,7 @@ void synchronize_logbook(LOGBOOK * lbs, int mode, BOOL sync_all)
eprintf("\n"); eprintf("\n");
while (str[strlen(str) - 1] == '\r' || str[strlen(str) - 1] == '\n') while (str[strlen(str) - 1] == '\r' || str[strlen(str) - 1] == '\n')
str[strlen(str) - 1] = 0; str[strlen(str) - 1] = 0;
do_crypt(str, pwd); do_crypt(str, pwd, sizeof(pwd));
setparam("upwd", pwd); setparam("upwd", pwd);
} else { } else {
@ -16330,29 +16343,29 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
page_mid_head = 0; page_mid_head = 0;
/* default mode */ /* default mode */
strcpy(mode, "Summary"); strlcpy(mode, "Summary", sizeof(mode));
show_attachments = FALSE; show_attachments = FALSE;
if (past_n || last_n || page_n || page_mid || default_page) { if (past_n || last_n || page_n || page_mid || default_page) {
/* for page display, get mode from config file */ /* for page display, get mode from config file */
if (getcfg(lbs->name, "Display Mode", str, sizeof(str))) if (getcfg(lbs->name, "Display Mode", str, sizeof(str)))
strcpy(mode, str); strlcpy(mode, str, sizeof(mode));
/* supersede mode from cookie */ /* supersede mode from cookie */
if (isparam("elmode")) if (isparam("elmode"))
strcpy(mode, getparam("elmode")); strlcpy(mode, getparam("elmode"), sizeof(mode));
/* supersede mode from direct parameter */ /* supersede mode from direct parameter */
if (isparam("mode")) if (isparam("mode"))
strcpy(mode, getparam("mode")); strlcpy(mode, getparam("mode"), sizeof(mode));
} else { } else {
/* for find result, get mode from find form */ /* for find result, get mode from find form */
if (isparam("mode")) if (isparam("mode"))
strcpy(mode, getparam("mode")); strlcpy(mode, getparam("mode"), sizeof(mode));
else else
strcpy(mode, "Full"); strlcpy(mode, "Full", sizeof(mode));
} }
/* set cookie if mode changed */ /* set cookie if mode changed */
@ -16598,7 +16611,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
/* compile regex for subtext */ /* compile regex for subtext */
if (isparam("subtext")) { if (isparam("subtext")) {
strcpy(str, getparam("subtext")); strlcpy(str, getparam("subtext"), sizeof(str));
flags = REG_EXTENDED; flags = REG_EXTENDED;
if (!isparam("casesensitive")) if (!isparam("casesensitive"))
flags |= REG_ICASE; flags |= REG_ICASE;
@ -16616,7 +16629,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
/* compile regex for attributes */ /* compile regex for attributes */
for (i = 0; i < lbs->n_attr; i++) { for (i = 0; i < lbs->n_attr; i++) {
if (isparam(attr_list[i])) { if (isparam(attr_list[i])) {
strcpy(str, getparam(attr_list[i])); strlcpy(str, getparam(attr_list[i]), sizeof(str));
/* if value starts with '$', substitute it */ /* if value starts with '$', substitute it */
if (str[0] == '$') { if (str[0] == '$') {
@ -16729,7 +16742,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
} else { } else {
strcpy(str, isparam(attr_list[i]) ? getparam(attr_list[i]) : ""); strlcpy(str, isparam(attr_list[i]) ? getparam(attr_list[i]) : "", sizeof(str));
/* if value starts with '$', substitute it */ /* if value starts with '$', substitute it */
if (str[0] == '$') { if (str[0] == '$') {
@ -16817,7 +16830,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
if (j < index) { if (j < index) {
/* set date from current message, if later */ /* set date from current message, if later */
if (strcmp(msg_list[j].string, msg_list[index].string) < 0) if (strcmp(msg_list[j].string, msg_list[index].string) < 0)
strcpy(msg_list[j].string, msg_list[index].string); strlcpy(msg_list[j].string, msg_list[index].string, 256);
msg_list[index].lbs = NULL; // delete current message msg_list[index].lbs = NULL; // delete current message
continue; continue;
@ -16999,7 +17012,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
/*---- title ----*/ /*---- title ----*/
strcpy(str, ", "); strlcpy(str, ", ", sizeof(str));
if (past_n == 1) if (past_n == 1)
strcat(str, loc("Last day")); strcat(str, loc("Last day"));
else if (past_n > 1) else if (past_n > 1)
@ -17024,7 +17037,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
rsprintf("<tr><td class=\"menuframe\"><span class=\"menu1\">\n"); rsprintf("<tr><td class=\"menuframe\"><span class=\"menu1\">\n");
/* current command line for select command */ /* current command line for select command */
strcpy(str, isparam("cmdline") ? getparam("cmdline") : ""); strlcpy(str, isparam("cmdline") ? getparam("cmdline") : "", sizeof(str));
/* remove select switch */ /* remove select switch */
if (strstr(str, "select=1")) { if (strstr(str, "select=1")) {
@ -17052,18 +17065,18 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
/* default menu commands */ /* default menu commands */
if (menu_str[0] == 0) { if (menu_str[0] == 0) {
strcpy(menu_str, "New, Find, Select, CSV Import, "); strlcpy(menu_str, "New, Find, Select, CSV Import, ", sizeof(menu_str));
if (getcfg(lbs->name, "Password file", str, sizeof(str))) if (getcfg(lbs->name, "Password file", str, sizeof(str)))
strcat(menu_str, "Config, Logout, "); strlcat(menu_str, "Config, Logout, ", sizeof(menu_str));
else else
strcat(menu_str, "Config, "); strlcat(menu_str, "Config, ", sizeof(menu_str));
if (getcfg(lbs->name, "Mirror server", str, sizeof(str))) if (getcfg(lbs->name, "Mirror server", str, sizeof(str)))
strcat(menu_str, "Synchronize, "); strlcat(menu_str, "Synchronize, ", sizeof(menu_str));
strcpy(str, loc("Last x")); strlcpy(str, loc("Last x"), sizeof(str));
strcat(menu_str, "Last x, Help, "); strlcat(menu_str, "Last x, Help, ", sizeof(menu_str));
} }
n = strbreak(menu_str, menu_item, MAX_N_LIST, ","); n = strbreak(menu_str, menu_item, MAX_N_LIST, ",");
@ -17081,7 +17094,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
rsprintf("&nbsp;<a href=\"last%d?mode=%s\">%s</a>&nbsp;|\n", last_n * 2, mode, str); rsprintf("&nbsp;<a href=\"last%d?mode=%s\">%s</a>&nbsp;|\n", last_n * 2, mode, str);
} }
} else if (strieq(menu_item[i], "Select")) { } else if (strieq(menu_item[i], "Select")) {
strcpy(str, isparam("cmdline") ? getparam("cmdline") : ""); strlcpy(str, isparam("cmdline") ? getparam("cmdline") : "", sizeof(str));
if (isparam("select") && atoi(getparam("select")) == 1) { if (isparam("select") && atoi(getparam("select")) == 1) {
/* remove select switch */ /* remove select switch */
if (strstr(str, "select=1")) { if (strstr(str, "select=1")) {
@ -17100,7 +17113,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
rsputs3(str); rsputs3(str);
rsprintf("\">%s</a>&nbsp;|\n", loc("Select")); rsprintf("\">%s</a>&nbsp;|\n", loc("Select"));
} else { } else {
strcpy(str, loc(menu_item[i])); strlcpy(str, loc(menu_item[i]), sizeof(str));
url_encode(str, sizeof(str)); url_encode(str, sizeof(str));
if (i < n - 1) if (i < n - 1)
@ -17126,7 +17139,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa
/* check if file starts with an absolute directory */ /* check if file starts with an absolute directory */
if (str[0] == DIR_SEPARATOR || str[1] == ':') if (str[0] == DIR_SEPARATOR || str[1] == ':')
strcpy(file_name, str); strlcpy(file_name, str, sizeof(file_name));
else { else {
strlcpy(file_name, resource_dir, sizeof(file_name)); strlcpy(file_name, resource_dir, sizeof(file_name));
strlcat(file_name, str, sizeof(file_name)); strlcat(file_name, str, sizeof(file_name));
@ -21843,9 +21856,10 @@ void interprete(char *lbook, char *path)
\********************************************************************/ \********************************************************************/
{ {
int status, i, j, n, index, lb_index, message_id; int status, i, j, n, index, lb_index, message_id;
char exp[80], list[1000], section[256], str[NAME_LENGTH], str2[NAME_LENGTH], char exp[80], list[1000], section[256], str[NAME_LENGTH], str2[NAME_LENGTH], edit_id[80],
enc_pwd[80], file_name[256], command[80], ref[256], enc_path[256], dec_path[256], enc_pwd[80], file_name[256], command[256], ref[256], enc_path[256], dec_path[256], uname[80],
logbook[256], logbook_enc[256], *experiment, group[256], css[256], *pfile, attachment[MAX_PATH_LENGTH]; logbook[256], logbook_enc[256], *experiment, group[256], css[256], *pfile, attachment[MAX_PATH_LENGTH],
full_name[256];
BOOL global; BOOL global;
LOGBOOK *lbs; LOGBOOK *lbs;
FILE *f; FILE *f;
@ -21855,8 +21869,8 @@ void interprete(char *lbook, char *path)
url_decode(dec_path); url_decode(dec_path);
strcpy(enc_path, dec_path); strcpy(enc_path, dec_path);
url_encode(enc_path, sizeof(enc_path)); url_encode(enc_path, sizeof(enc_path));
strcpy(command, isparam("cmd") ? getparam("cmd") : ""); strlcpy(command, isparam("cmd") ? getparam("cmd") : "", sizeof(command));
strcpy(group, isparam("group") ? getparam("group") : ""); strlcpy(group, isparam("group") ? getparam("group") : "", sizeof(group));
index = isparam("index") ? atoi(getparam("index")) : 0; index = isparam("index") ? atoi(getparam("index")) : 0;
experiment = getparam("exp"); experiment = getparam("exp");
if (getcfg(lbook, "Logging Level", str, sizeof(str))) if (getcfg(lbook, "Logging Level", str, sizeof(str)))
@ -21867,7 +21881,7 @@ void interprete(char *lbook, char *path)
/* evaluate "jcmd" */ /* evaluate "jcmd" */
if (isparam("jcmd") && *getparam("jcmd")) if (isparam("jcmd") && *getparam("jcmd"))
strcpy(command, getparam("jcmd")); strlcpy(command, getparam("jcmd"), sizeof(command));
/* if experiment given, use it as logbook (for elog!) */ /* if experiment given, use it as logbook (for elog!) */
if (experiment && experiment[0]) { if (experiment && experiment[0]) {
@ -21965,20 +21979,21 @@ void interprete(char *lbook, char *path)
/* if data from login screen, evaluate it and set cookies */ /* if data from login screen, evaluate it and set cookies */
if (isparam("uname") && isparam("upassword")) { if (isparam("uname") && isparam("upassword")) {
/* check if password correct */ /* check if password correct */
do_crypt(getparam("upassword"), enc_pwd); do_crypt(getparam("upassword"), enc_pwd, sizeof(enc_pwd));
/* log logins */ /* log logins */
sprintf(str, "LOGIN user \"%s\" (attempt) for logbook selection page", getparam("uname")); strlcpy(uname, getparam("uname"), sizeof(uname));
sprintf(str, "LOGIN user \"%s\" (attempt) for logbook selection page", uname);
write_logfile(NULL, str); write_logfile(NULL, str);
if (isparam("redir")) if (isparam("redir"))
strcpy(str, getparam("redir")); strlcpy(str, getparam("redir"), sizeof(str));
else else
strcpy(str, isparam("cmdline") ? getparam("cmdline") : ""); strlcpy(str, isparam("cmdline") ? getparam("cmdline") : "", sizeof(str));
if (!check_user_password(NULL, getparam("uname"), enc_pwd, str)) if (!check_user_password(NULL, getparam("uname"), enc_pwd, str))
return; return;
sprintf(str, "LOGIN user \"%s\" (success)", getparam("uname")); sprintf(str, "LOGIN user \"%s\" (success)", uname);
write_logfile(NULL, str); write_logfile(NULL, str);
/* set cookies */ /* set cookies */
set_login_cookies(NULL, getparam("uname"), enc_pwd); set_login_cookies(NULL, uname, enc_pwd);
return; return;
} }
@ -22045,7 +22060,7 @@ void interprete(char *lbook, char *path)
if (isparam("wpassword")) { if (isparam("wpassword")) {
/* check if password correct */ /* check if password correct */
do_crypt(getparam("wpassword"), enc_pwd); do_crypt(getparam("wpassword"), enc_pwd, sizeof(enc_pwd));
if (!check_password(lbs, "Write password", enc_pwd, isparam("redir") ? getparam("redir") : "")) if (!check_password(lbs, "Write password", enc_pwd, isparam("redir") ? getparam("redir") : ""))
return; return;
rsprintf("HTTP/1.1 302 Found\r\n"); rsprintf("HTTP/1.1 302 Found\r\n");
@ -22069,7 +22084,7 @@ void interprete(char *lbook, char *path)
if (isparam("apassword")) { if (isparam("apassword")) {
/* check if password correct */ /* check if password correct */
do_crypt(getparam("apassword"), enc_pwd); do_crypt(getparam("apassword"), enc_pwd, sizeof(enc_pwd));
if (!check_password(lbs, "Admin password", enc_pwd, isparam("redir") ? getparam("redir") : "")) if (!check_password(lbs, "Admin password", enc_pwd, isparam("redir") ? getparam("redir") : ""))
return; return;
rsprintf("HTTP/1.1 302 Found\r\n"); rsprintf("HTTP/1.1 302 Found\r\n");
@ -22093,20 +22108,21 @@ void interprete(char *lbook, char *path)
if (isparam("uname") && isparam("upassword")) { if (isparam("uname") && isparam("upassword")) {
/* check if password correct */ /* check if password correct */
do_crypt(getparam("upassword"), enc_pwd); do_crypt(getparam("upassword"), enc_pwd, sizeof(enc_pwd));
/* log logins */ /* log logins */
sprintf(str, "LOGIN user \"%s\" (attempt)", getparam("uname")); strlcpy(uname, getparam("uname"), sizeof(uname));
sprintf(str, "LOGIN user \"%s\" (attempt)", uname);
write_logfile(lbs, str); write_logfile(lbs, str);
if (isparam("redir")) if (isparam("redir"))
strcpy(str, getparam("redir")); strlcpy(str, getparam("redir"), sizeof(str));
else else
strcpy(str, isparam("cmdline") ? getparam("cmdline") : ""); strlcpy(str, isparam("cmdline") ? getparam("cmdline") : "", sizeof(str));
if (!check_user_password(lbs, getparam("uname"), enc_pwd, str)) if (!check_user_password(lbs, uname, enc_pwd, str))
return; return;
sprintf(str, "LOGIN user \"%s\" (success)", getparam("uname")); sprintf(str, "LOGIN user \"%s\" (success)", uname);
write_logfile(lbs, str); write_logfile(lbs, str);
/* set cookies */ /* set cookies */
set_login_cookies(lbs, getparam("uname"), enc_pwd); set_login_cookies(lbs, uname, enc_pwd);
return; return;
} }
@ -22191,7 +22207,8 @@ void interprete(char *lbook, char *path)
el_lock_message(lbs, atoi(getparam("edit_id")), NULL); el_lock_message(lbs, atoi(getparam("edit_id")), NULL);
/* redirect to message */ /* redirect to message */
sprintf(str, "../%s/%s", logbook_enc, getparam("edit_id")); strlcpy(edit_id, getparam("edit_id"), sizeof(edit_id));
sprintf(str, "../%s/%s", logbook_enc, edit_id);
} else } else
sprintf(str, "../%s/", logbook_enc); sprintf(str, "../%s/", logbook_enc);
@ -22217,17 +22234,19 @@ void interprete(char *lbook, char *path)
} }
/* check for "Last n*2 Entries" */ /* check for "Last n*2 Entries" */
strcpy(str, isparam("last") ? getparam("last") : ""); strlcpy(str, isparam("last") ? getparam("last") : "", sizeof(str));
if (strchr(str, ' ')) { if (strchr(str, ' ')) {
i = atoi(strchr(str, ' ')); i = atoi(strchr(str, ' '));
sprintf(str, "last%d", i); sprintf(str, "last%d", i);
if (isparam("mode")) if (isparam("mode")) {
sprintf(str + strlen(str), "?mode=%s", getparam("mode")); sprintf(str + strlen(str), "?mode=");
strlcat(str, getparam("mode"), sizeof(str));
}
redirect(lbs, str); redirect(lbs, str);
return; return;
} }
strcpy(str, isparam("past") ? getparam("past") : ""); strlcpy(str, isparam("past") ? getparam("past") : "", sizeof(str));
if (strchr(str, ' ')) { if (strchr(str, ' ')) {
i = atoi(strchr(str, ' ')); i = atoi(strchr(str, ' '));
sprintf(str, "past%d", i); sprintf(str, "past%d", i);
@ -22359,8 +22378,12 @@ void interprete(char *lbook, char *path)
strcpy(command, loc("Last")); strcpy(command, loc("Last"));
/* check if command allowed for current user */ /* check if command allowed for current user */
if (command[0] && !is_user_allowed(lbs, command)) { if (command[0] && !is_user_allowed(lbs, command)) {
if (isparam("full_name"))
strlcpy(full_name, getparam("full_name"), sizeof(full_name));
else
full_name[0] = 0;
sprintf(str, loc("Error: Command \"<b>%s</b>\" is not allowed for user \"<b>%s</b>\""), sprintf(str, loc("Error: Command \"<b>%s</b>\" is not allowed for user \"<b>%s</b>\""),
command, isparam("full_name") ? getparam("full_name") : ""); command, full_name);
show_error(str); show_error(str);
return; return;
} }
@ -22632,8 +22655,10 @@ void interprete(char *lbook, char *path)
if (isparam("global")) { if (isparam("global")) {
if (strieq(getparam("global"), "global")) if (strieq(getparam("global"), "global"))
strcpy(section, "global"); strcpy(section, "global");
else else {
sprintf(section, "global %s", getparam("global")); sprintf(section, "global ");
strlcat(section, getparam("global"), sizeof(section));
}
} else } else
strlcpy(section, lbs->name, sizeof(section)); strlcpy(section, lbs->name, sizeof(section));
@ -22646,11 +22671,13 @@ void interprete(char *lbook, char *path)
sprintf(str, "../%s/", lbs->name_enc); sprintf(str, "../%s/", lbs->name_enc);
else else
sprintf(str, "."); sprintf(str, ".");
if (isparam("new_user_name")) if (isparam("new_user_name")) {
sprintf(str + strlen(str), "?cmd=%s&cfg_user=%s", loc("Config"), getparam("new_user_name")); sprintf(str + strlen(str), "?cmd=%s&cfg_user=", loc("Config"));
else if (isparam("cfg_user")) strlcat(str, getparam("new_user_name"), sizeof(str));
sprintf(str + strlen(str), "?cmd=%s&cfg_user=%s", loc("Config"), getparam("cfg_user")); } else if (isparam("cfg_user")) {
else if (getcfg(lbs->name, "password file", str2, sizeof(str2))) sprintf(str + strlen(str), "?cmd=%s&cfg_user=", loc("Config"));
strlcat(str, getparam("cfg_user"), sizeof(str));
} else if (getcfg(lbs->name, "password file", str2, sizeof(str2)))
sprintf(str + strlen(str), "?cmd=%s", loc("Config")); sprintf(str + strlen(str), "?cmd=%s", loc("Config"));
redirect(lbs, str); redirect(lbs, str);
@ -24025,7 +24052,7 @@ void server_loop(void)
base64_decode(str, cl_pwd); base64_decode(str, cl_pwd);
if (strchr(cl_pwd, ':')) { if (strchr(cl_pwd, ':')) {
p = strchr(cl_pwd, ':') + 1; p = strchr(cl_pwd, ':') + 1;
do_crypt(p, str); do_crypt(p, str, sizeof(str));
strcpy(cl_pwd, str); strcpy(cl_pwd, str);
/* check authorization */ /* check authorization */
if (strcmp(str, pwd) == 0) if (strcmp(str, pwd) == 0)
@ -25108,25 +25135,25 @@ int main(int argc, char *argv[])
} }
if (read_pwd[0]) { if (read_pwd[0]) {
do_crypt(read_pwd, str); do_crypt(read_pwd, str, sizeof(str));
create_password(logbook, "Read Password", str); create_password(logbook, "Read Password", str);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
if (write_pwd[0]) { if (write_pwd[0]) {
do_crypt(write_pwd, str); do_crypt(write_pwd, str, sizeof(str));
create_password(logbook, "Write Password", str); create_password(logbook, "Write Password", str);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
if (admin_pwd[0]) { if (admin_pwd[0]) {
do_crypt(admin_pwd, str); do_crypt(admin_pwd, str, sizeof(str));
create_password(logbook, "Admin Password", str); create_password(logbook, "Admin Password", str);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
if (smtp_pwd[0]) { if (smtp_pwd[0]) {
do_crypt(smtp_pwd, str); do_crypt(smtp_pwd, str, sizeof(str));
create_password("global", "SMTP Password", str); create_password("global", "SMTP Password", str);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }