3 // Copyright (c) 1996-2022 by the citadel.org team
5 // This program is open source software. Use, duplication, or
6 // disclosure are subject to the GNU General Public License v3.
11 // Fetch a user photo (avatar)
12 void fetch_user_photo(struct http_transaction *h, struct ctdlsession *c, char *username) {
14 int content_length = 0;
15 char content_type[1024];
17 int actual_length = 0;
19 ctdl_printf(c, "DLUI %s", username);
20 ctdl_readline(c, buf, sizeof(buf));
22 content_length = extract_int(&buf[4], 0);
23 extract_token(content_type, &buf[4], 3, '|', sizeof content_type);
25 image = malloc(content_length);
30 actual_length = ctdl_read_binary(c, image, content_length);
32 add_response_header(h, strdup("Content-type"), strdup(content_type));
33 h->response_code = 200;
34 h->response_string = strdup("OK");
35 h->response_body_length = actual_length;
36 h->response_body = image;
40 // The user has no avatar on file. Redirect to a generic avatar.
41 http_redirect(h, "/ctdl/s/images/generic-user-icon-32px.png");
43 // Sending a 404 makes the browser request the same thing over and over again.
48 // Fetch a user bio (profile)
49 void fetch_user_bio(struct http_transaction *h, struct ctdlsession *c, char *username) {
50 do_404(h); // FIXME finish this
54 // Client requested an object related to a user.
55 void object_in_user(struct http_transaction *h, struct ctdlsession *c, char *requested_username) {
56 char object_name[1024];
58 extract_token(object_name, h->url, 4, '/', sizeof object_name);
60 if (!strcasecmp(object_name, "userpic")) { // user photo (avatar)
61 fetch_user_photo(h, c, requested_username);
65 if (!strcasecmp(object_name, "bio")) { // user bio (profile)
66 fetch_user_bio(h, c, requested_username);
70 do_404(h); // unknown object
75 // Handle REST/DAV requests for the user itself (such as /ctdl/u/username
76 // or /ctdl/i/username/ but *not* specific properties of the user)
77 void the_user_itself(struct http_transaction *h, struct ctdlsession *c, char *username) {
82 // Dispatcher for "/ctdl/u" and "/ctdl/u/" for the user list
83 void user_list(struct http_transaction *h, struct ctdlsession *c) {
88 // Dispatcher for paths starting with /ctdl/u/
89 void ctdl_u(struct http_transaction *h, struct ctdlsession *c) {
90 char requested_username[128];
93 // All user-related functions require accessing the user in question.
94 extract_token(requested_username, h->url, 3, '/', sizeof requested_username);
95 unescape_input(requested_username);
97 if (IsEmptyStr(requested_username)) { // /ctdl/u/
102 // At this point we have extracted the name of the user we're interested in.
103 // FIXME should we validate it?
105 if (num_tokens(h->url, '/') == 4) { // /ctdl/u/username
106 the_user_itself(h, c, requested_username);
110 extract_token(buf, h->url, 4, '/', sizeof buf);
111 if (num_tokens(h->url, '/') == 5) {
112 if (IsEmptyStr(buf)) {
113 the_user_itself(h, c, requested_username); // /ctdl/u/username/ (same as /ctdl/u/username)
116 object_in_user(h, c, requested_username); // /ctdl/u/username/object
121 if (num_tokens(h->url, '/') == 6) {
122 object_in_user(h, c, requested_username); // /ctdl/u/username/object/ or possibly /ctdl/u/username/object/component
126 // If we get to this point, the client requested an action we don't know how to perform.