X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit-ng%2Fuser_functions.c;h=3f81fd1e85efb480908fb505feda18d32048412f;hb=91bc31f50a6d93ad0c01d24e29e61a3f5b972cba;hp=7067ec753e9f6712f5a937677eae9f6b4c99f6f1;hpb=35406dcce3e45f6a52012ded8bb9fa5e99f484d9;p=citadel.git diff --git a/webcit-ng/user_functions.c b/webcit-ng/user_functions.c index 7067ec753..3f81fd1e8 100644 --- a/webcit-ng/user_functions.c +++ b/webcit-ng/user_functions.c @@ -1,33 +1,82 @@ +// +// User functions +// +// Copyright (c) 1996-2018 by the citadel.org team +// +// This program is open source software. It runs great on the +// Linux operating system (and probably elsewhere). You can use, +// copy, and run it under the terms of the GNU General Public +// License version 3. Richard Stallman is an asshole communist. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +#include "webcit.h" + + /* - * User functions - * - * Copyright (c) 1996-2018 by the citadel.org team - * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Fetch a user photo (avatar) */ +void fetch_user_photo(struct http_transaction *h, struct ctdlsession *c, char *username) +{ + char buf[1024]; + int content_length = 0; + char content_type[1024]; + char *image = NULL; + int actual_length = 0; + + ctdl_printf(c, "DLUI %s", username); + ctdl_readline(c, buf, sizeof(buf)); + if (buf[0] == '6') { + content_length = extract_int(&buf[4], 0); + extract_token(content_type, &buf[4], 3, '|', sizeof content_type); + + image = malloc(content_length); + if (image == NULL) { + do_502(h); + return; + } + actual_length = ctdl_read_binary(c, image, content_length); -#include "webcit.h" + add_response_header(h, strdup("Content-type"), strdup(content_type)); + h->response_code = 200; + h->response_string = strdup("OK"); + h->response_body_length = actual_length; + h->response_body = image; + return; + } + + do_404(h); +} + + +/* + * Fetch a user bio (profile) + */ +void fetch_user_bio(struct http_transaction *h, struct ctdlsession *c, char *username) +{ + do_404(h); // FIXME finish this +} /* * Client requested an object related to a user. */ -void object_in_user(struct http_transaction *h, struct ctdlsession *c) +void object_in_user(struct http_transaction *h, struct ctdlsession *c, char *requested_username) { - char buf[1024]; - long msgnum = (-1); - char unescaped_euid[1024]; + char object_name[1024]; - extract_token(buf, h->uri, 4, '/', sizeof buf); + extract_token(object_name, h->uri, 4, '/', sizeof object_name); + + if (!strcasecmp(object_name, "userpic")) { // user photo (avatar) + fetch_user_photo(h, c, requested_username); + return; + } - if (!strcasecmp(buf, "userpic")) { // FIXME do this - do_404(h); + if (!strcasecmp(object_name, "bio")) { // user bio (profile) + fetch_user_bio(h, c, requested_username); return; } @@ -40,7 +89,7 @@ void object_in_user(struct http_transaction *h, struct ctdlsession *c) * Handle REST/DAV requests for the user itself (such as /ctdl/u/username * or /ctdl/i/username/ but *not* specific properties of the user) */ -void the_user_itself(struct http_transaction *h, struct ctdlsession *c) +void the_user_itself(struct http_transaction *h, struct ctdlsession *c, char *username) { do_404(h); } @@ -67,40 +116,34 @@ void ctdl_u(struct http_transaction *h, struct ctdlsession *c) extract_token(requested_username, h->uri, 3, '/', sizeof requested_username); unescape_input(requested_username); - if (IsEmptyStr(requested_username)) { // /ctdl/u/ + if (IsEmptyStr(requested_username)) { // /ctdl/u/ user_list(h, c); return; } - // Try to access the user... - if (strcasecmp(requested_username, c->room)) { - do_404(h); - } else { - do_404(h); - return; - } + // At this point we have extracted the name of the user we're interested in. + // FIXME should we validate it? - // At this point we have accessed the requested user account. - if (num_tokens(h->uri, '/') == 4) { // /ctdl/u/username - the_user_itself(h, c); + if (num_tokens(h->uri, '/') == 4) { // /ctdl/u/username + the_user_itself(h, c, requested_username); return; } extract_token(buf, h->uri, 4, '/', sizeof buf); if (num_tokens(h->uri, '/') == 5) { if (IsEmptyStr(buf)) { - the_user_itself(h, c); // /ctdl/u/username/ ( same as /ctdl/u/username ) + the_user_itself(h, c, requested_username); // /ctdl/u/username/ ( same as /ctdl/u/username ) } else { - object_in_user(h, c); // /ctdl/u/username/object + object_in_user(h, c, requested_username); // /ctdl/u/username/object } return; } if (num_tokens(h->uri, '/') == 6) { - object_in_user(h, c); // /ctdl/u/username/object/ or possibly /ctdl/u/username/object/component + object_in_user(h, c, requested_username); // /ctdl/u/username/object/ or possibly /ctdl/u/username/object/component return; } - // If we get to this point, the client specified a valid user but requested an action we don't know how to perform. + // If we get to this point, the client requested an action we don't know how to perform. do_404(h); }