X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit-ng%2Fuser_functions.c;h=10e81211fae477d89ded8489640db3fbe28309cf;hp=b3d360f000b539635acdefdc8ac2cb8caf7b0f46;hb=2dd0ef8fe2953cbdec20f4dcd016c93f12117fad;hpb=b5c457f32fc0d890d24f334d9dcce7987e09885c diff --git a/webcit-ng/user_functions.c b/webcit-ng/user_functions.c index b3d360f00..10e81211f 100644 --- a/webcit-ng/user_functions.c +++ b/webcit-ng/user_functions.c @@ -18,25 +18,44 @@ /* * Fetch a user photo (avatar) */ -void fetch_user_photo(struct http_transaction *h, struct ctdlsession *c) +void fetch_user_photo(struct http_transaction *h, struct ctdlsession *c, char *username) { - char username[1024]; + 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); - extract_token(username, h->uri, 3, '/', sizeof username); + 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); // FIXME finish this + do_404(h); } /* * Fetch a user bio (profile) */ -void fetch_user_bio(struct http_transaction *h, struct ctdlsession *c) +void fetch_user_bio(struct http_transaction *h, struct ctdlsession *c, char *username) { - char username[1024]; - - extract_token(username, h->uri, 3, '/', sizeof username); - do_404(h); // FIXME finish this } @@ -44,21 +63,19 @@ void fetch_user_bio(struct http_transaction *h, struct ctdlsession *c) /* * 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(buf, "userpic")) { // user photo (avatar) - fetch_user_photo(h, c); + if (!strcasecmp(object_name, "userpic")) { // user photo (avatar) + fetch_user_photo(h, c, requested_username); return; } - if (!strcasecmp(buf, "bio")) { // user bio (profile) - fetch_user_bio(h, c); + if (!strcasecmp(object_name, "bio")) { // user bio (profile) + fetch_user_bio(h, c, requested_username); return; } @@ -71,7 +88,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); } @@ -98,40 +115,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); }