From c9599ea95195ce14f2873826c07813743d69dd98 Mon Sep 17 00:00:00 2001 From: Nishi Date: Thu, 22 Aug 2024 05:25:09 +0000 Subject: [PATCH] magick works git-svn-id: file:///raid/svn-personal/repoview/trunk@42 7e8b2a19-8934-dd40-8cb3-db22cdd5a80f --- CGI/magick.c | 40 +++++++++++++++++++++++++ CGI/main.c | 8 +++++ CGI/multipart.c | 74 +++++++++++++++++++++++++++++++++++++++++++++- CGI/rv_magick.h | 11 +++++++ CGI/theme/modern.c | 48 ++++++++++++++++++++++++++++-- objs.c | 4 +++ 6 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 CGI/magick.c create mode 100644 CGI/rv_magick.h diff --git a/CGI/magick.c b/CGI/magick.c new file mode 100644 index 0000000..bb45614 --- /dev/null +++ b/CGI/magick.c @@ -0,0 +1,40 @@ +/* $Id$ */ + +#include "rv_magick.h" + +#include "rv_util.h" + +#include "../config.h" + +#include +#include + +#include + +void rv_init_magick(void) {} + +bool rv_resize_picture(const char* input, const char* output, char** reason) { + MagickWand* wand = NULL; + wand = NewMagickWand(); + if(MagickReadImage(wand, input)) { + int width = MagickGetImageWidth(wand); + int height = MagickGetImageHeight(wand); + + double scale = 0; + if(width >= height) { + scale = (double)256 / width; + } else if(width < height) { + scale = (double)256 / height; + } + + MagickResizeImage(wand, width * scale, height * scale, LanczosFilter, 1); + MagickSetCompressionQuality(wand, 80); + MagickWriteImage(wand, output); + + if(wand) DestroyMagickWand(wand); + return true; + } + if(wand) DestroyMagickWand(wand); + *reason = rv_strdup("Magick error"); + return false; +} diff --git a/CGI/main.c b/CGI/main.c index dd7171e..c03f682 100644 --- a/CGI/main.c +++ b/CGI/main.c @@ -12,16 +12,24 @@ #include "rv_auth.h" #include "rv_multipart.h" +#ifdef USE_GRAPHICSMAGICK +#include "rv_magick.h" +#endif + #include #include #include char* postdata; +char* nocache; int main() { srand(time(NULL)); + nocache = malloc(512); + sprintf(nocache, "?time=%llu", (unsigned long long)time(NULL)); rv_check_sanity(); rv_init_db(); + rv_init_magick(); rv_parse_query(getenv("QUERY_STRING")); rv_save_query('Q'); postdata = malloc(1); diff --git a/CGI/multipart.c b/CGI/multipart.c index 0f3f3c4..917cfa7 100644 --- a/CGI/multipart.c +++ b/CGI/multipart.c @@ -39,6 +39,9 @@ void rv_parse_multipart(unsigned char* buffer, char* boundary, unsigned long lon unsigned long long fstart = 0; char* b = rv_strcat3("--", boundary, "\r"); char* eb = rv_strcat3("--", boundary, "--\r"); + multipart_entries = malloc(sizeof(*multipart_entries)); + multipart_entries[0] = NULL; + char* name = NULL; for(i = 0;; i++) { if(i == length || buffer[i] == '\n') { char* line = malloc(i - incr + 1); @@ -52,6 +55,23 @@ void rv_parse_multipart(unsigned char* buffer, char* boundary, unsigned long lon unsigned long long fend = i - strlen(line) - 2; char* data = buffer + fstart; unsigned long long datalen = fend - fstart; + struct multipart_entry* entry = malloc(sizeof(*entry)); + entry->length = datalen; + entry->data = malloc(datalen); + entry->name = rv_strdup(name); + unsigned long long j; + for(j = 0; j < datalen; j++) entry->data[j] = data[j]; + + struct multipart_entry** old_entries = multipart_entries; + for(j = 0; old_entries[j] != NULL; j++) + ; + multipart_entries = malloc(sizeof(*multipart_entries) * (j + 2)); + for(j = 0; old_entries[j] != NULL; j++) { + multipart_entries[j] = old_entries[j]; + } + multipart_entries[j] = entry; + multipart_entries[j + 1] = NULL; + free(old_entries); } phase = 0; if(strcmp(eb, line) == 0) { @@ -60,12 +80,64 @@ void rv_parse_multipart(unsigned char* buffer, char* boundary, unsigned long lon } } else if(phase == 0) { line[strlen(line) - 1] = 0; - fprintf(stderr, "%s\n", line); + int j; + for(j = 0; line[j] != 0; j++) { + if(line[j] == ':') { + line[j] = 0; + char* value = ""; + j++; + for(; line[j] != 0; j++) { + if(line[j] != ' ' && line[j] != '\t') { + value = line + j; + break; + } + } + if(strcasecmp(line, "Content-Disposition") == 0) { + int j; + int incrval = 0; + for(j = 0;; j++) { + if(value[j] == ';' || value[j] == 0) { + char oldc = value[j]; + value[j] = 0; + char* kv = value + incrval; + j++; + for(; value[j] != 0; j++) { + if(value[j] != ' ' && value[j] != '\t') break; + } + incrval = j; + int k; + for(k = 0; kv[k] != 0; k++) { + if(kv[k] == '=') { + kv[k] = 0; + if(strcmp(kv, "name") == 0) { + if(name != NULL) free(name); + name = malloc(strlen(kv + k + 1) + 1); + char* nkv = kv + k + 1; + int l = 0; + int incrn = 0; + for(l = 0; nkv[l] != 0; l++) { + if(nkv[l] != '"') { + name[incrn++] = nkv[l]; + } + } + name[incrn] = 0; + } + break; + } + } + if(oldc == 0) break; + } + } + } + break; + } + } } free(line); incr = i + 1; if(i == length) break; } } + if(name != NULL) free(name); free(b); } diff --git a/CGI/rv_magick.h b/CGI/rv_magick.h new file mode 100644 index 0000000..3fcdf21 --- /dev/null +++ b/CGI/rv_magick.h @@ -0,0 +1,11 @@ +/* $Id$ */ + +#ifndef __RV_MAGICK_H__ +#define __RV_MAGICK_H__ + +#include + +void rv_init_magick(void); +bool rv_resize_picture(const char* input, const char* output, char** reason); + +#endif diff --git a/CGI/theme/modern.c b/CGI/theme/modern.c index df0bd9b..e6ba41b 100644 --- a/CGI/theme/modern.c +++ b/CGI/theme/modern.c @@ -7,6 +7,7 @@ #include "rv_auth.h" #include "rv_db.h" #include "rv_repo.h" +#include "rv_multipart.h" #include "../../config.h" @@ -18,11 +19,16 @@ #include "rv_avatar.h" #endif +#ifdef USE_GRAPHICSMAGICK +#include "rv_magick.h" +#endif + #include #include #include #include +extern char* nocache; extern char* buffer; void add_data(char** data, const char* txt); void render_stuff(); @@ -289,7 +295,7 @@ void render_page(void) { bool reject = false; char* name = rv_get_query("username"); for(i = 0; name[i] != 0; i++) { - if(name[i] == REPO_USER_DELIM || name[i] == '#' || name[i] == '\\' || name[i] == '/') { + if(name[i] == REPO_USER_DELIM || name[i] == '#' || name[i] == '\\' || name[i] == '/' || name[i] == ':' || name[i] == '\n' || name[i] == '\r') { char cbuf[2]; cbuf[0] = REPO_USER_DELIM; cbuf[1] = 0; @@ -388,7 +394,9 @@ void render_page(void) { add_data(&page, WWW_AVATAR_ROOT); add_data(&page, "/"); add_data(&page, user); - add_data(&page, ".png\" alt=\"Your Icon\">"); + add_data(&page, ".png"); + add_data(&page, nocache); + add_data(&page, "\" alt=\"Your Icon\" width=\"50%\">"); add_data(&page, "
\n"); @@ -396,6 +404,40 @@ void render_page(void) { add_data(&page, " \n"); add_data(&page, "
\n"); } +#endif +#ifdef USE_AVATAR + } else if(strcmp(query, "uploadpfp") == 0) { + title = rv_strdup("Uploading Profile Picture Result"); + page = rv_strdup(""); + if(user == NULL) { + add_data(&page, "It looks like you are not logged in.
Want to log in?\n"); + } else if(rv_get_multipart("pfp") == NULL) { + add_data(&page, "Invalid Form."); + } else { + struct multipart_entry* entry = rv_get_multipart("pfp"); + char* tmp = rv_strcat3(AVATAR_ROOT, "/", user); + char* path = rv_strcat(tmp, ".tmp"); + char* outpath = rv_strcat(tmp, ".png"); + free(tmp); + FILE* f = fopen(path, "wb"); + fwrite(entry->data, 1, entry->length, f); + fclose(f); + char* reason; + if(rv_resize_picture(path, outpath, &reason)) { + add_data(&page, "Uploaded the profile picture successfully.\n"); + } else { + add_data(&page, "Failed to upload the profile picture.
\n"); + char* esc = html_escape(reason); + add_data(&page, esc); + free(esc); + add_data(&page, "\n"); + free(reason); + } + free(path); + free(outpath); + } #endif } else if(strcmp(query, "myrepo") == 0) { title = rv_strdup("My Repositories"); @@ -451,7 +493,7 @@ void render_page(void) { bool reject = false; char* name = rv_get_query("name"); for(i = 0; name[i] != 0; i++) { - if(name[i] == REPO_USER_DELIM || name[i] == '#' || name[i] == '\\' || name[i] == '/') { + if(name[i] == REPO_USER_DELIM || name[i] == '#' || name[i] == '\\' || name[i] == '/' || name[i] == ':' || name[i] == '\n' || name[i] == '\r') { char cbuf[2]; cbuf[0] = REPO_USER_DELIM; cbuf[1] = 0; diff --git a/objs.c b/objs.c index d097a95..c6b6d3e 100644 --- a/objs.c +++ b/objs.c @@ -21,6 +21,10 @@ int main() { printf("enscript.o"); #endif printf(" "); +#if defined(USE_AVATAR) + printf("magick.o"); +#endif + printf(" "); #if defined(USE_AVATAR) printf("avatar.o"); #endif -- 2.45.2