diff options
| author | Vincent Douillet <vincent@vdouillet.fr> | 2024-01-12 18:14:17 +0100 | 
|---|---|---|
| committer | Vincent Douillet <vincent@vdouillet.fr> | 2024-01-12 18:26:22 +0100 | 
| commit | 760031b4a74d70bdeaab4ce9aedfe772acd05bd3 (patch) | |
| tree | 443a456770d5db052a3dfe3d2f1a8e5f66604ccb /browse.c | |
| parent | 43f65c76152017420ce723b4d4ef4230ff072818 (diff) | |
browse: build download url for files
Diffstat (limited to 'browse.c')
| -rw-r--r-- | browse.c | 106 | 
1 files changed, 44 insertions, 62 deletions
| @@ -41,81 +41,52 @@  #include "browse.h"  #include "cgi.h"  #include "config.h" +#include "download.h" +#include "file.h"  #include "http.h"  #include "url.h"  #include "util.h"  /* - * list of files for current directory + * a list of files   */  SLIST_HEAD(, file) list; -struct file { -	char   *name; -	char   *url; -	SLIST_ENTRY(file) files; -};  /* - * should be able to free incomplete files as per file_new usage + * browse url = r->pname / BROWSE_URL / file->path / file->name   */ -static void -file_free(struct file * file) +static 	size_t +build_browse_url(struct kreq * r, struct file * file)  { -	if (file == NULL) -		return; - -	if (file->name != NULL) { -		free(file->name); -		file->name = NULL; -	} -	if (file->url != NULL) { -		free(file->url); -		file->url = NULL; -	} -	free(file); -} +	char 	action_url[PATH_MAX]; +	size_t 	action_url_len; -static struct file * -file_new(char *name, size_t name_len, char *url, size_t url_len) -{ -	struct file *file; +	if (!file->is_dir) +		return 0; -	file = calloc(1, sizeof(struct file)); -	if (file == NULL) -		return NULL; -	file->name = malloc(sizeof(char) * (name_len + 1)); -	if (strlcpy(file->name, name, name_len + 1) >= name_len + 1) { -		free(file); -		return NULL; +	action_url_len = url_build(action_url, PATH_MAX, r->pname, BROWSE_URL, +				   file->path, file->name, NULL); +	if (action_url_len == 0 || action_url_len >= PATH_MAX) { +		kutil_warn(r, NULL, +			   "browse: action URL overflow: %s", action_url); +		return 0;  	} -	file->url = malloc(sizeof(char) * (url_len + 1)); -	if (strlcpy(file->url, url, url_len + 1) >= url_len + 1) { -		free(file); -		return NULL; +	file->action_url = v_strcpy(action_url, action_url_len); +	if (file->action_url == NULL) { +		kutil_warn(r, NULL, +			   "browse: unable to allocate file url buffer: %s", +			   action_url); +		return 0;  	} -	return file; -} - -/* - * file url = r->pname / r->pagename / r->path / file_name - */ -static 	size_t -build_browse_url(struct kreq * r, char *url, size_t url_len, const char *file) -{ -	char   *page_name; - -	page_name = strlen(r->pagename) == 0 ? BROWSE_URL : r->pagename; -	return url_build(url, url_len, r->pname, page_name, r->path, file, -			 NULL); +	return action_url_len;  }  static int -build_file_list(struct kreq * r, char *request_dir) +build_file_list(struct kreq * r, const char *request_dir)  { +	bool 	action_url_ok;  	char   *file_name; -	char 	url[PATH_MAX];  	DIR    *data_dir; -	size_t 	url_len;  	struct dirent *dir;  	struct file *file;  	struct file *last_file; @@ -131,17 +102,28 @@ build_file_list(struct kreq * r, char *request_dir)  		file_name = dir->d_name;  		if (strcmp(".", file_name) == 0 || strcmp("..", file_name) == 0)  			continue; -		url_len = build_browse_url(r, url, PATH_MAX, file_name); -		if (url_len == 0 || url_len >= PATH_MAX) { -			kutil_warn(r, NULL, "browse: Detected URL overflow: %s", url); +		/* build file */ +		file = file_new(r->path, strlen(r->path), dir->d_name, +				dir->d_namlen); +		if (file == NULL) { +			kutil_warn(r, NULL, +			      "browse: unable to allocate file, skipping %s", +				   file_name);  			continue;  		} -		/* build file and add to list */ -		file = file_new(dir->d_name, dir->d_namlen, url, url_len); -		if (file == NULL) { -			kutil_warn(r, NULL, "browse: unable to build file info"); +		/* build action url */ +		if (file->is_dir) +			action_url_ok = build_browse_url(r, file) > 0; +		else +			action_url_ok = build_download_url(r, file) > 0; +		if (!action_url_ok) { +			kutil_warn(r, NULL, +			   "browse: unable to build action url, skipping %s", +				   file_name); +			file_free(file);  			continue;  		} +		/* add file to list */  		if (last_file == NULL)  			SLIST_INSERT_HEAD(&list, file, files);  		else @@ -183,7 +165,7 @@ template_callback(size_t index, void *arg)  		break;  	case 1:  		/* url */ -		K_OK(khttp_puts(r, data->f->url), r); +		K_OK(khttp_puts(r, data->f->action_url), r);  		break;  	default:  		kutil_warnx(r, NULL, "Invalid key index for browse template: %zd", index); | 
