Exemple #1
0
/* 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;
}
Exemple #2
0
/* 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);
}
Exemple #3
0
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;
}
Exemple #4
0
/* 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;
}
Exemple #5
0
/* 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;
}