URL-encode filenames in generated links
This commit is contained in:
parent
2bb32b1cf9
commit
b77e4dcc8b
4
Makefile
4
Makefile
|
@ -5,8 +5,8 @@ CFLAGS+=-g -Wall -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L
|
||||||
LIBS=-lmicrohttpd
|
LIBS=-lmicrohttpd
|
||||||
|
|
||||||
TARGET=fileshare
|
TARGET=fileshare
|
||||||
SOURCE=main.c logger.c dirlisting.c
|
SOURCE=main.c logger.c dirlisting.c util.c
|
||||||
DEPS=logger.h templates.h dirlisting.h
|
DEPS=logger.h templates.h dirlisting.h util.h
|
||||||
|
|
||||||
OBJ=$(patsubst %.c, %.o, $(SOURCE))
|
OBJ=$(patsubst %.c, %.o, $(SOURCE))
|
||||||
|
|
||||||
|
|
14
dirlisting.c
14
dirlisting.c
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#define FLG_USED 1
|
#define FLG_USED 1
|
||||||
#define FLG_ISDIR 2
|
#define FLG_ISDIR 2
|
||||||
|
@ -58,6 +59,7 @@ char* gen_html(const char *url, struct Entry *entries, size_t numentries) {
|
||||||
size_t i;
|
size_t i;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
char fullpath[PATH_MAX];
|
char fullpath[PATH_MAX];
|
||||||
|
char encName[2*PATH_MAX];
|
||||||
|
|
||||||
// allocate a buffer for the result string
|
// allocate a buffer for the result string
|
||||||
allocated = strlen(HEADER1 HEADER2 FOOTER) + 64 * numentries + 4096;
|
allocated = strlen(HEADER1 HEADER2 FOOTER) + 64 * numentries + 4096;
|
||||||
|
@ -134,12 +136,14 @@ char* gen_html(const char *url, struct Entry *entries, size_t numentries) {
|
||||||
result = tmpresult;
|
result = tmpresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
urlencode(entries[i].name, encName);
|
||||||
|
|
||||||
if(isrootdir) {
|
if(isrootdir) {
|
||||||
sprintf(buf, "<li><a href=\"/%s/\">%s/</a></li>\n",
|
sprintf(buf, "<li><a href=\"/%s/\">%s/</a></li>\n",
|
||||||
entries[i].name, entries[i].name);
|
encName, entries[i].name);
|
||||||
} else {
|
} else {
|
||||||
sprintf(buf, "<li><a href=\"%s/%s/\">%s/</a></li>\n",
|
sprintf(buf, "<li><a href=\"%s/%s/\">%s/</a></li>\n",
|
||||||
url, entries[i].name, entries[i].name);
|
url, encName, entries[i].name);
|
||||||
}
|
}
|
||||||
strcat(result, buf);
|
strcat(result, buf);
|
||||||
}
|
}
|
||||||
|
@ -171,12 +175,14 @@ char* gen_html(const char *url, struct Entry *entries, size_t numentries) {
|
||||||
result = tmpresult;
|
result = tmpresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
urlencode(entries[i].name, encName);
|
||||||
|
|
||||||
if(isrootdir) {
|
if(isrootdir) {
|
||||||
sprintf(buf, "<li><a href=\"/%s\">%s</a> [%s]</li>\n",
|
sprintf(buf, "<li><a href=\"/%s\">%s</a> [%s]</li>\n",
|
||||||
entries[i].name, entries[i].name, format_size(entries[i].size));
|
encName, entries[i].name, format_size(entries[i].size));
|
||||||
} else {
|
} else {
|
||||||
sprintf(buf, "<li><a href=\"%s/%s\">%s</a> [%s]</li>\n",
|
sprintf(buf, "<li><a href=\"%s/%s\">%s</a> [%s]</li>\n",
|
||||||
url, entries[i].name, entries[i].name, format_size(entries[i].size));
|
url, encName, entries[i].name, format_size(entries[i].size));
|
||||||
}
|
}
|
||||||
strcat(result, buf);
|
strcat(result, buf);
|
||||||
}
|
}
|
||||||
|
|
8
main.c
8
main.c
|
@ -16,6 +16,7 @@
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
#include "dirlisting.h"
|
#include "dirlisting.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#define DEFAULT_PORT 8888
|
#define DEFAULT_PORT 8888
|
||||||
|
|
||||||
|
@ -32,13 +33,6 @@ struct MHD_Response *error500Response;
|
||||||
|
|
||||||
int running = 1;
|
int running = 1;
|
||||||
|
|
||||||
void remove_trailing_slash(char *str) {
|
|
||||||
size_t offset = strlen(str)-1;
|
|
||||||
if((offset != 0) && (str[offset] == '/')) {
|
|
||||||
str[offset] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void request_completed(void *cls,
|
void request_completed(void *cls,
|
||||||
struct MHD_Connection * connection,
|
struct MHD_Connection * connection,
|
||||||
void **ptr,
|
void **ptr,
|
||||||
|
|
41
util.c
Normal file
41
util.c
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
void remove_trailing_slash(char *str) {
|
||||||
|
size_t offset = strlen(str)-1;
|
||||||
|
if((offset != 0) && (str[offset] == '/')) {
|
||||||
|
str[offset] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void urlencode(const char *str, char *result) {
|
||||||
|
uint8_t c;
|
||||||
|
while(*str) {
|
||||||
|
c = *str;
|
||||||
|
|
||||||
|
if((c >= 'a' && c <= 'z') ||
|
||||||
|
(c >= 'A' && c <= 'Z') ||
|
||||||
|
(c >= '0' && c <= '9') ||
|
||||||
|
c == '-' ||
|
||||||
|
c == '_' ||
|
||||||
|
c == '!' ||
|
||||||
|
c == '(' ||
|
||||||
|
c == ')' ||
|
||||||
|
c == '$' ||
|
||||||
|
c == '*' ||
|
||||||
|
c == '\'' ||
|
||||||
|
c == ',' ||
|
||||||
|
c == '.') {
|
||||||
|
// simply print safe characters
|
||||||
|
result += sprintf(result, "%c", c);
|
||||||
|
} else {
|
||||||
|
// encode all others
|
||||||
|
result += sprintf(result, "%%%02X", c);
|
||||||
|
}
|
||||||
|
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue