mirror of
https://gitea.psi.ch/ELOG/elog.git
synced 2026-09-08 17:13:56 +00:00
Fixed potential buffer overflows
SVN revision: 1635
This commit is contained in:
parent
96f4118b40
commit
9dc7982f0d
221
src/elogd.c
221
src/elogd.c
@ -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(" <a href=\"last%d?mode=%s\">%s</a> |\n", last_n * 2, mode, str);
|
rsprintf(" <a href=\"last%d?mode=%s\">%s</a> |\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> |\n", loc("Select"));
|
rsprintf("\">%s</a> |\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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user