2022-07-04 19:00:31 +00:00
|
|
|
#include "vger.c"
|
2021-11-01 18:17:45 +00:00
|
|
|
|
2020-12-01 22:39:05 +00:00
|
|
|
int
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
2022-08-18 08:54:13 +00:00
|
|
|
char request[GEMINI_REQUEST_MAX] = {'\0'};
|
|
|
|
char user[_SC_LOGIN_NAME_MAX] = {'\0'};
|
|
|
|
char hostname[GEMINI_REQUEST_MAX] = {'\0'};
|
|
|
|
char path[GEMINI_REQUEST_MAX] = {'\0'};
|
|
|
|
char query[GEMINI_REQUEST_MAX] = {'\0'};
|
2022-09-19 20:10:09 +00:00
|
|
|
char cgi_dir[PATH_MAX] = {'\0'};
|
2022-09-20 10:39:09 +00:00
|
|
|
char rel_cgi_dir[PATH_MAX] = {'\0'};
|
2022-08-18 08:54:13 +00:00
|
|
|
char chroot_dir[PATH_MAX] = DEFAULT_CHROOT;
|
2022-09-19 20:10:09 +00:00
|
|
|
char tmp[PATH_MAX] = {'\0'};
|
2022-08-18 08:54:13 +00:00
|
|
|
int option = 0;
|
|
|
|
int virtualhost = 0;
|
2021-03-22 20:44:23 +00:00
|
|
|
|
|
|
|
/*
|
2021-10-21 09:41:22 +00:00
|
|
|
* request : contain the whole request from client : gemini://...\r\n
|
2021-03-22 20:44:23 +00:00
|
|
|
* user : username, used in drop_privileges()
|
|
|
|
* hostname : extracted from hostname. used with virtualhosts and cgi SERVER_NAME
|
2022-08-18 20:23:59 +00:00
|
|
|
* query : after a ? in cgi : gemini://...?query
|
2021-03-22 20:44:23 +00:00
|
|
|
*/
|
2020-12-02 12:32:39 +00:00
|
|
|
|
2021-01-14 12:31:51 +00:00
|
|
|
while ((option = getopt(argc, argv, ":d:l:m:u:c:vi")) != -1) {
|
2020-12-02 12:32:39 +00:00
|
|
|
switch (option) {
|
|
|
|
case 'd':
|
2022-08-20 13:10:05 +00:00
|
|
|
esnprintf(chroot_dir, sizeof(chroot_dir), "%s", optarg);
|
2020-12-02 14:31:21 +00:00
|
|
|
break;
|
2020-12-02 17:07:10 +00:00
|
|
|
case 'l':
|
2022-08-20 13:10:05 +00:00
|
|
|
esnprintf(lang, sizeof(lang), "lang=%s", optarg);
|
2021-01-10 08:30:35 +00:00
|
|
|
break;
|
|
|
|
case 'm':
|
2022-08-20 13:10:05 +00:00
|
|
|
esnprintf(default_mime, sizeof(default_mime), "%s", optarg);
|
2020-12-02 17:07:10 +00:00
|
|
|
break;
|
2020-12-03 21:59:39 +00:00
|
|
|
case 'u':
|
2022-08-20 13:10:05 +00:00
|
|
|
esnprintf(user, sizeof(user), "%s", optarg);
|
2021-01-10 08:30:35 +00:00
|
|
|
break;
|
2021-01-14 12:31:51 +00:00
|
|
|
case 'c':
|
2022-09-19 20:10:09 +00:00
|
|
|
esnprintf(rel_cgi_dir, sizeof(rel_cgi_dir), "%s", optarg);
|
|
|
|
/* remove leading / */
|
|
|
|
while (*rel_cgi_dir == '/')
|
|
|
|
memmove(rel_cgi_dir, rel_cgi_dir+1,
|
|
|
|
strlen(rel_cgi_dir)); // strlen +1-1
|
2021-01-14 12:31:51 +00:00
|
|
|
break;
|
2021-01-10 08:30:35 +00:00
|
|
|
case 'v':
|
|
|
|
virtualhost = 1;
|
|
|
|
break;
|
|
|
|
case 'i':
|
|
|
|
doautoidx = 1;
|
2020-12-03 21:59:39 +00:00
|
|
|
break;
|
2020-12-02 12:32:39 +00:00
|
|
|
}
|
2020-12-01 22:39:05 +00:00
|
|
|
}
|
2020-12-02 18:59:52 +00:00
|
|
|
|
2022-08-18 08:54:13 +00:00
|
|
|
read_request(request);
|
|
|
|
split_request(request, hostname, path, query);
|
2022-08-18 11:59:54 +00:00
|
|
|
|
2022-09-19 20:10:09 +00:00
|
|
|
/* do chroot if an user is supplied */
|
|
|
|
if (*user)
|
|
|
|
drop_privileges(user);
|
|
|
|
|
|
|
|
/* set actual chroot_dir */
|
|
|
|
if (virtualhost) {
|
|
|
|
esnprintf(tmp, sizeof(tmp), "%s/%s", chroot_dir, hostname);
|
|
|
|
esnprintf(chroot_dir, sizeof(chroot_dir), "%s", tmp);
|
|
|
|
}
|
2021-10-21 09:41:22 +00:00
|
|
|
|
2022-09-19 20:10:09 +00:00
|
|
|
/* cgi_dir is in chroot_dir */
|
|
|
|
if (*rel_cgi_dir)
|
|
|
|
esnprintf(cgi_dir, sizeof(cgi_dir),
|
|
|
|
"%s/%s", chroot_dir, rel_cgi_dir);
|
|
|
|
|
|
|
|
set_rootdir(chroot_dir, cgi_dir, user);
|
|
|
|
|
|
|
|
if (strlen(path) == 0) { /* this is root dir */
|
|
|
|
esnprintf(path, sizeof(path), "./");
|
|
|
|
} else {
|
|
|
|
uridecode(path);
|
|
|
|
remove_double_dot(path);
|
|
|
|
}
|
|
|
|
|
|
|
|
uridecode(query);
|
2022-08-22 09:20:24 +00:00
|
|
|
|
2022-08-08 20:57:03 +00:00
|
|
|
/* is it cgi ? */
|
|
|
|
if (*cgi_dir)
|
2022-09-19 20:10:09 +00:00
|
|
|
if (do_cgi(rel_cgi_dir, path, hostname, query) == 0)
|
2022-08-08 20:57:03 +00:00
|
|
|
stop(EXIT_SUCCESS, NULL);
|
2022-08-18 12:12:38 +00:00
|
|
|
/* *** from here, cgi didn't run *** */
|
2021-10-21 09:41:22 +00:00
|
|
|
|
2022-08-18 12:12:38 +00:00
|
|
|
/* check if path available */
|
2022-09-19 20:10:09 +00:00
|
|
|
check_path(path, sizeof(path));
|
2021-01-14 12:31:51 +00:00
|
|
|
|
2022-08-08 20:57:03 +00:00
|
|
|
/* regular file to stdout */
|
2022-08-18 20:23:59 +00:00
|
|
|
display_file(path);
|
2021-03-22 20:44:23 +00:00
|
|
|
|
2022-08-08 20:57:03 +00:00
|
|
|
stop(EXIT_SUCCESS, NULL);
|
2020-12-01 22:39:05 +00:00
|
|
|
}
|