/* Check if the requested file is a CGI program. */ static t_cgi_type check_target_is_cgi(t_session *session) { t_cgi_handler *cgi; session->cgi_handler = NULL; #ifdef ENABLE_TOOLKIT if ((session->fcgi_server = find_fcgi_server(session->config->fcgi_server, session->toolkit_fastcgi)) != NULL) { session->cgi_type = fastcgi; session->host->execute_cgi = true; } else #endif if ((session->fcgi_server = fcgi_server_match(session->config->fcgi_server, &(session->host->fast_cgi), session->extension)) != NULL) { session->cgi_type = fastcgi; } else if (in_charlist(session->extension, &(session->config->cgi_extension))) { session->cgi_type = binary; } else { session->cgi_type = no_cgi; cgi = session->config->cgi_handler; while (cgi != NULL) { if (in_charlist(session->extension, &(cgi->extension))) { session->cgi_handler = cgi->handler; session->cgi_type = script; break; } cgi = cgi->next; } } return session->cgi_type; }
/* Detect FS type on device and returt pointer to static structure from fstype.c */ const char *detect_fstype(char *device, struct charlist *fl) { int fd; const char *fstype; fd = open(device, O_RDONLY); if (fd < 0) { log_msg(lg, "+ can't open device: %s", ERRMSG); return NULL; } if ( 0 != identify_fs(fd, &fstype, NULL, 0) ) { close(fd); log_msg(lg, "+ can't identify FS type"); return NULL; } close(fd); log_msg(lg, "+ FS type '%s' detected", fstype); /* Check that FS is known */ if (in_charlist(fl, fstype) < 0) { /* whitelist 'ubi', we assume it is ubifs */ if (!strncmp(fstype, "ubi",3)) { log_msg(lg, "+ found %s container: assume ubifs", fstype); } else { log_msg(lg, "+ FS %s is not supported by kernel", fstype); return NULL; } } return(fstype); }
int rproxy_cache_time(t_session *session, char *buffer) { int cache_time; char *value, *no_cache = "no-cache", extension[EXTENSION_SIZE]; if ((cache_time = cgi_cache_time(buffer)) > 0) { return cache_time; } if (extension_from_uri(session->request_uri, extension, EXTENSION_SIZE) == false) { return 0; } if (in_charlist(extension, &(session->config->cache_rproxy_extensions)) == false) { return 0; } if ((value = get_http_header("Cache-Control:", session->http_headers)) != NULL) { if (strstr(value, no_cache) != NULL) { return 0; } } if ((value = get_http_header("Pragma:", session->http_headers)) != NULL) { if (strstr(value, no_cache) != NULL) { return 0; } } return TIME_IN_CACHE; }
/* Copy the settings from a directory-record to the active host-record. */ int copy_directory_settings(t_session *session) { size_t path_length; t_directory *dir; int d, p; if (session->host->directory == NULL) { return 200; } for (d = 0; session->host->directory[d] != NULL; d++) { dir = session->host->directory[d]; for (p = 0; p < dir->path.size; p++) { path_length = strlen(dir->path.item[p]); if (strncmp(session->request_uri, dir->path.item[p], path_length) != 0) { continue; } if (dir->path.item[p][strlen(dir->path.item[p]) - 1] != '/') { if (*(session->request_uri + path_length) != '/') { continue; } } if ((session->extension != NULL) && dir->extensions.size > 0) { if (session->uri_len > 0 ? session->uri[session->uri_len - 1] != '/' : false) { if (in_charlist(session->extension, &(dir->extensions)) == false) { continue; } } } session->directory = dir; if (dir->max_clients > -1) { pthread_mutex_lock(&(dir->client_mutex)); if (dir->nr_of_clients < dir->max_clients) { session->throttle = dir->session_speed = dir->upload_speed / ++dir->nr_of_clients; pthread_mutex_unlock(&(dir->client_mutex)); session->part_of_dirspeed = true; } else { pthread_mutex_unlock(&(dir->client_mutex)); return 503; } } if (dir->wrap_cgi != NULL) { session->host->wrap_cgi = dir->wrap_cgi; } if (dir->start_file != NULL) { session->host->start_file = dir->start_file; } if (dir->execute_cgi_set) { session->host->execute_cgi = dir->execute_cgi; } #ifdef ENABLE_XSLT if (dir->show_index_set) { session->host->show_index = dir->show_index; } #endif if (dir->follow_symlinks_set) { session->host->follow_symlinks = dir->follow_symlinks; } if (dir->access_list != NULL) { session->host->access_list = dir->access_list; } if (dir->alter_list != NULL) { session->host->alter_list = dir->alter_list; } if (dir->alter_fmode != 0) { session->host->alter_fmode = dir->alter_fmode; } if (dir->passwordfile != NULL) { session->host->auth_method = dir->auth_method; session->host->passwordfile = dir->passwordfile; if (dir->groupfile != NULL) { session->host->groupfile = dir->groupfile; } } if (dir->required_group.size > 0) { session->host->required_group.size = dir->required_group.size; session->host->required_group.item = dir->required_group.item; } if (dir->alter_group.size > 0) { session->host->alter_group.size = dir->alter_group.size; session->host->alter_group.item = dir->alter_group.item; } if (dir->time_for_cgi > TIMER_OFF) { session->host->time_for_cgi = dir->time_for_cgi; } if (dir->expires > -1) { session->expires = dir->expires; session->caco_private = dir->caco_private; } break; } } return 200; }
/* Copy the settings from a directory-record to the active host-record. */ int copy_directory_settings(t_session *session) { size_t path_length; t_directory *dir; int i; if (session->file_on_disk == NULL) { return 500; } dir = session->config->directory; while (dir != NULL) { if (in_charlist(dir->dir_id, &(session->host->directory))) { for (i = 0; i < dir->path.size; i++) { path_length = strlen(dir->path.item[i]); if (strncmp(session->request_uri, dir->path.item[i], path_length) != 0) { continue; } if (dir->path.item[i][strlen(dir->path.item[i]) - 1] != '/') { if (*(session->request_uri + path_length) != '/') { continue; } } session->directory = dir; if (dir->max_clients > -1) { pthread_mutex_lock(&(dir->client_mutex)); if (dir->nr_of_clients < dir->max_clients) { session->throttle = dir->session_speed = dir->upload_speed / ++dir->nr_of_clients; pthread_mutex_unlock(&(dir->client_mutex)); session->part_of_dirspeed = true; } else { pthread_mutex_unlock(&(dir->client_mutex)); return 503; } } if (dir->wrap_cgi != NULL) { session->host->wrap_cgi = dir->wrap_cgi; } if (dir->start_file != NULL) { session->host->start_file = dir->start_file; } if (dir->execute_cgiset) { session->host->execute_cgi = dir->execute_cgi; } #ifdef ENABLE_XSLT if (dir->show_index_set) { session->host->show_index = dir->show_index; } #endif if (dir->follow_symlinks_set) { session->host->follow_symlinks = dir->follow_symlinks; } if (dir->access_list != NULL) { session->host->access_list = dir->access_list; } if (dir->alter_list != NULL) { session->host->alter_list = dir->alter_list; } if (dir->alter_fmode != 0) { session->host->alter_fmode = dir->alter_fmode; } if (dir->passwordfile != NULL) { session->host->auth_method = dir->auth_method; session->host->passwordfile = dir->passwordfile; if (dir->groupfile != NULL) { session->host->groupfile = dir->groupfile; } } if (dir->required_group.size > 0) { session->host->required_group.size = dir->required_group.size; session->host->required_group.item = dir->required_group.item; } if (dir->alter_group.size > 0) { session->host->alter_group.size = dir->alter_group.size; session->host->alter_group.item = dir->alter_group.item; } if (dir->time_for_cgi > TIMER_OFF) { session->host->time_for_cgi = dir->time_for_cgi; } if (dir->expires > -1) { session->expires = dir->expires; session->caco_private = dir->caco_private; } break; } } dir = dir->next; } return 200; }