\n\n");
/* scan logbook hierarchy */
phier = get_logbook_hierarchy();
/*---- logbook selection row ----*/
pnode = phier; /* start at root of tree */
pnext = NULL;
if (!printable && getcfg(logbook, "logbook tabs", str)
&& atoi(str) == 1) {
for (level = 0;; level++) {
rsprintf("\n");
if (level == 0 && getcfg("global", "main tab", str) && !getcfg_topgroup())
rsprintf("%s \n", str);
if (level == 1 && getcfg("global", "main tab", str) && getcfg_topgroup())
rsprintf("%s \n",
getcfg_topgroup(), str);
/* iterate through members of this group */
for (i = 0; i < pnode->n_members; i++) {
if (getcfg(pnode->member[i]->name, "Hidden", str) && atoi(str) == 1)
continue;
strlcpy(str, pnode->member[i]->name, sizeof(str));
/* build reference to first logbook in group */
if (pnode->member[i]->member == NULL)
strlcpy(ref, str, sizeof(ref)); // current node is logbook
else {
flb = pnode->member[i]->member[0]; // current node is group
while (flb->member) // so traverse hierarchy
flb = flb->member[0];
strlcpy(ref, flb->name, sizeof(ref));
}
url_encode(ref, sizeof(ref));
if (is_logbook_in_group(pnode->member[i], logbook)) {
/* remember member list of this group for next row */
pnext = pnode->member[i];
if (pnode->member[i]->member == NULL)
/* selected logbook */
strcpy(sclass, "sltab");
else
/* selected group */
strcpy(sclass, "sgtab");
} else {
if (pnode->member[i]->member == NULL)
/* unselected logbook */
strcpy(sclass, "ltab");
else
/* unselected group */
strcpy(sclass, "gtab");
}
if (!pnode->member[i]->is_top) {
rsprintf("", sclass, ref);
strlcpy(str, pnode->member[i]->name, sizeof(str));
for (j = 0; j < (int) strlen(str); j++)
if (str[j] == ' ')
rsprintf(" ");
else
rsprintf("%c", str[j]);
rsprintf(" \n");
}
}
rsprintf(" \n\n");
pnode = pnext;
pnext = NULL;
if (pnode == NULL)
break;
}
}
free_logbook_hierarchy(phier);
/*---- title row ----*/
rsprintf("\n");
/* left cell */
rsprintf("");
/* use comment as title if available, else logbook name */
if (!getcfg(logbook, "Comment", str))
strcpy(str, logbook);
rsprintf(" %s%s \n", str, text);
/* middle cell */
if (*getparam("full_name"))
rsprintf("%s \"%s\" \n", loc("Logged in as"),
getparam("full_name"));
else if (getcfg(logbook, "Guest menu commands", str))
rsprintf("%s \n", loc("Not logged in"));
/* right cell */
rsprintf("");
if (getcfg(logbook, "Title image URL", str))
rsprintf("\n", str);
if (getcfg(logbook, "Title image", str))
rsprintf(str);
else
rsprintf(" ");
if (getcfg(logbook, "Title image URL", str))
rsprintf(" \n");
rsprintf(" \n");
rsprintf("
\n\n");
}
/*------------------------------------------------------------------*/
void show_top_text(LOGBOOK * lbs)
{
char str[NAME_LENGTH];
int size;
if (getcfg(lbs->name, "top text", str)) {
FILE *f;
char file_name[256], *buf;
/* check if file starts with an absolute directory */
if (str[0] == DIR_SEPARATOR || str[1] == ':')
strcpy(file_name, str);
else {
strlcpy(file_name, resource_dir, sizeof(file_name));
strlcat(file_name, str, sizeof(file_name));
}
f = fopen(file_name, "rb");
if (f != NULL) {
fseek(f, 0, SEEK_END);
size = TELL(fileno(f));
fseek(f, 0, SEEK_SET);
buf = malloc(size + 1);
fread(buf, 1, size, f);
buf[size] = 0;
fclose(f);
rsputs(buf);
} else
rsputs(str);
}
}
/*------------------------------------------------------------------*/
void show_bottom_text(LOGBOOK * lbs)
{
char str[NAME_LENGTH];
int size;
if (getcfg(lbs->name, "bottom text", str)) {
FILE *f;
char file_name[256], *buf;
/* check if file starts with an absolute directory */
if (str[0] == DIR_SEPARATOR || str[1] == ':')
strcpy(file_name, str);
else {
strlcpy(file_name, resource_dir, sizeof(file_name));
strlcat(file_name, str, sizeof(file_name));
}
f = fopen(file_name, "rb");
if (f != NULL) {
fseek(f, 0, SEEK_END);
size = TELL(fileno(f));
fseek(f, 0, SEEK_SET);
buf = malloc(size + 1);
fread(buf, 1, size, f);
buf[size] = 0;
fclose(f);
rsputs(buf);
} else
rsputs(str);
} else
/* add little logo */
rsprintf
("ELOG V%s ",
VERSION);
}
/*------------------------------------------------------------------*/
void show_error(char *error)
{
/* header */
show_html_header(NULL, FALSE, "ELOG error", TRUE);
rsprintf("\n");
rsprintf("%s \n", error);
rsprintf("");
/*
rsprintf("\n");
rsprintf("\n");
*/
rsprintf("%s\n", loc("Please use your browser's back button to go back"));
/*
rsprintf(" \n");
*/
rsprintf(" \n
\n");
rsprintf(" \n");
}
/*------------------------------------------------------------------*/
void set_login_cookies(LOGBOOK * lbs, char *user, char *enc_pwd)
{
char str[256], lb_name[256], exp[80];
BOOL global;
rsprintf("HTTP/1.1 302 Found\r\n");
rsprintf("Server: ELOG HTTP %s\r\n", VERSION);
if (use_keepalive) {
rsprintf("Connection: Keep-Alive\r\n");
rsprintf("Keep-Alive: timeout=60, max=10\r\n");
}
if (lbs)
strcpy(lb_name, lbs->name);
else
strcpy(lb_name, "global");
/* get optional expriation from configuration file */
if (isparam("remember")) {
if (!getcfg(lb_name, "Login expiration", exp))
strcpy(exp, "31*24"); /* one month by default */
} else
exp[0] = 0;
/* check if cookies should be global */
global = getcfg("global", "Password file", str);
/* two cookies for password and user name */
set_cookie(lbs, "unm", user, global, exp);
set_cookie(lbs, "upwd", enc_pwd, global, exp);
set_redir(lbs, getparam("redir"));
}
/*------------------------------------------------------------------*/
int exist_file(char *file_name)
{
int fh;
fh = open(file_name, O_RDONLY | O_BINARY);
if (fh > 0) {
close(fh);
return 1;
}
return 0;
}
/*------------------------------------------------------------------*/
void send_file_direct(char *file_name)
{
int fh, i, length, delta;
char str[MAX_PATH_LENGTH], charset[80];
time_t now;
struct tm *gmt;
fh = open(file_name, O_RDONLY | O_BINARY);
if (fh > 0) {
lseek(fh, 0, SEEK_END);
length = TELL(fh);
lseek(fh, 0, SEEK_SET);
rsprintf("HTTP/1.1 200 Document follows\r\n");
rsprintf("Server: ELOG HTTP %s\r\n", VERSION);
rsprintf("Accept-Ranges: bytes\r\n");
/* set expiration time to one day */
time(&now);
now += (int) (3600 * 24);
gmt = gmtime(&now);
strftime(str, sizeof(str), "%A, %d-%b-%y %H:%M:%S GMT", gmt);
rsprintf("Expires: %s\r\n", str);
if (use_keepalive) {
rsprintf("Connection: Keep-Alive\r\n");
rsprintf("Keep-Alive: timeout=60, max=10\r\n");
}
/* return proper header for file type */
for (i = 0; i < (int) strlen(file_name); i++)
str[i] = toupper(file_name[i]);
str[i] = 0;
for (i = 0; filetype[i].ext[0]; i++)
if (strstr(str, filetype[i].ext))
break;
if (!getcfg("global", "charset", charset))
strcpy(charset, "iso-8859-1");
if (filetype[i].ext[0])
rsprintf("Content-Type: %s;charset=%s\r\n", filetype[i].type, charset);
else if (strchr(str, '.') == NULL)
rsprintf("Content-Type: text/plain;charset=%s\r\n", charset);
else
rsprintf("Content-Type: application/octet-stream;charset=%s\r\n", charset);
rsprintf("Content-Length: %d\r\n\r\n", length);
/* increase return buffer size if file too big */
if (length > return_buffer_size - (int) strlen(return_buffer)) {
delta = length - (return_buffer_size - strlen(return_buffer)) + 1000;
return_buffer = realloc(return_buffer, return_buffer_size + delta);
memset(return_buffer + return_buffer_size, 0, delta);
return_buffer_size += delta;
}
return_length = strlen(return_buffer) + length;
read(fh, return_buffer + strlen(return_buffer), length);
close(fh);
} else {
show_html_header(NULL, FALSE, "404 Not Found", TRUE);
rsprintf("Not Found \r\n");
rsprintf("The requested file %s was not found on this server\r\n",
file_name);
rsprintf("
ELOG version %s