From 5da31fd2f30ef357ccedcf495b160007b322ede5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 8 Jul 2013 21:20:36 +0200 Subject: [PATCH] htdocs: improved archive. added edit/setfiledata --- htdocs/archive/addfile.c | 17 -------- htdocs/archive/edit.c | 77 ++++++++++++++++++++++++++++++++ htdocs/archive/setfiledata.c | 85 ++++++++++++++++++++++++++++++++++++ htdocs/archive/webarchive.h | 17 ++++++++ 4 files changed, 179 insertions(+), 17 deletions(-) create mode 100644 htdocs/archive/edit.c create mode 100644 htdocs/archive/setfiledata.c diff --git a/htdocs/archive/addfile.c b/htdocs/archive/addfile.c index e1b6f8af8..c1734622c 100644 --- a/htdocs/archive/addfile.c +++ b/htdocs/archive/addfile.c @@ -5,23 +5,6 @@ #include "webarchive.h" -static void unencode(const char *src, char *dest) -{ - for (; *src; src++, dest++) { - if (*src == '+') - *dest = ' '; - else if (*src == '%') { - int code; - if (sscanf(src+1, "%2x", &code) != 1) - code = '?'; - *dest = code; - src += 2; - } else - *dest = *src; - } - *dest = '\0'; -} - const char *validate(const char *data) { int i; diff --git a/htdocs/archive/edit.c b/htdocs/archive/edit.c new file mode 100644 index 000000000..c0bc78c0b --- /dev/null +++ b/htdocs/archive/edit.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include + +#include "webarchive.h" + +const char *validate(const char *data) +{ + int i; + if (strncmp(data,"name=",5) != 0) + return "invalid query string: must start with 'name='"; + i = 5; + while (isalnum(data[i])) + i++; + if (i == 5) + return "invalid query string: no name"; + if (i > 35) + return "invalid query string: max name size is 32"; + if (data[i] != '\0') + return "invalid edit command"; + + return NULL; +} + +int main() +{ + const char *query_string = getenv("QUERY_STRING"); + if (query_string == NULL) { + generatepage("Internal error: invalid request"); + } else if (NULL != validate(query_string)) { + generatepage(validate(query_string)); + } else { + char *data[MAX_RECORDS] = {0}; + if (!readdata(data, MAX_RECORDS)) { + generatepage("Failed to read file data"); + return EXIT_SUCCESS; + } + + char name[32] = {0}; + strcpy(name, getname(query_string)); + int index = -1; + for (int i = 0; i < MAX_RECORDS && data[i]; i++) { + if (strcmp(name, getname(data[i])) == 0) { + index = i; + break; + } + } + + if (index == -1) { + generatepage("File not found"); + return EXIT_SUCCESS; + } + + const char *olddata = strstr(data[index], "&data="); + if (olddata) { + char *temp = malloc(strlen(olddata+6)); + unencode(olddata+6, temp); + olddata = temp; + } else + olddata = ""; + + puts("Content-type: text/html\r\n\r\n"); + puts(""); + puts(""); + puts("
"); + printf("
\n",name); + printf("
\n",olddata); + puts(" "); + puts("
"); + puts(""); + puts(""); + } + + return EXIT_SUCCESS; +} + diff --git a/htdocs/archive/setfiledata.c b/htdocs/archive/setfiledata.c new file mode 100644 index 000000000..3bbd62055 --- /dev/null +++ b/htdocs/archive/setfiledata.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include + +#include "webarchive.h" + +const char *validate(const char *data) +{ + int i; + + // name + if (strncmp(data,"name=",5) != 0) + return "invalid query string: must start with 'name='"; + i = 5; + while (isalnum(data[i])) + i++; + if (i == 5) + return "invalid query string: no name"; + if (i > 35) + return "invalid query string: max name size is 32"; + + // filedata + if (strncmp(data+i, "&data=", 6) != 0) + return "invalid query string: invalid name / no data"; + + return NULL; +} + +int main() +{ + const char *query_string = getenv("QUERY_STRING"); + if (query_string == NULL) { + generatepage("Internal error: invalid request"); + } else if (NULL != validate(query_string)) { + generatepage(validate(query_string)); + } else { + char *data[MAX_RECORDS] = {0}; + if (!readdata(data, MAX_RECORDS)) { + generatepage("Failed to read file data"); + return EXIT_SUCCESS; + } + + char name[32] = {0}; + strcpy(name, getname(query_string)); + int index = -1; + for (int i = 0; i < MAX_RECORDS && data[i]; i++) { + if (strcmp(name, getname(data[i])) == 0) { + index = i; + break; + } + } + + if (index == -1) { + generatepage("File not found"); + return EXIT_SUCCESS; + } + + // cleanup data... + char str[1000] = {0}; + char *dst = str; + for (const char *src = query_string; *src; src++) { + *dst = *src; + dst++; + if (strncmp(src, "%25", 3) == 0 && isxdigit(src[3]) && isxdigit(src[4])) + src += 2; + } + + data[index] = str; + sortdata(data, MAX_RECORDS); + + FILE *f = fopen("data.txt", "wt"); + if (f == NULL) { + generatepage("Failed to add file (access denied). Try again."); + return EXIT_SUCCESS; + } + for (int i = 0; i < MAX_RECORDS && data[i]; i++) + fprintf(f, "%s\n", data[i]); + fclose(f); + generatepage("saved."); + } + + return EXIT_SUCCESS; +} + diff --git a/htdocs/archive/webarchive.h b/htdocs/archive/webarchive.h index bdd7a9299..a8af76115 100644 --- a/htdocs/archive/webarchive.h +++ b/htdocs/archive/webarchive.h @@ -3,6 +3,23 @@ #define MAX_RECORDS 1000 +static void unencode(const char *src, char *dest) +{ + for (; *src; src++, dest++) { + if (*src == '+') + *dest = ' '; + else if (*src == '%') { + int code; + if (sscanf(src+1, "%2x", &code) != 1) + code = '?'; + *dest = code; + src += 2; + } else + *dest = *src; + } + *dest = '\0'; +} + int readdata(char * * const data, int sz) { FILE *f = fopen("data.txt", "rt");