ctdl_printf(c, "MSGS %s", which_msgs);
ctdl_readline(c, buf, sizeof(buf));
- if (buf[0] == '1')
+ if (buf[0] == '1') {
do {
if (num_msgs >= num_alloc) {
if (num_alloc == 0) {
ctdl_readline(c, buf, sizeof(buf));
msglist[num_msgs++] = atol(buf);
} while (strcmp(buf, "000")); // this makes the last element a "0" terminator
+ }
return msglist;
}
int i = 0;
char tag[1024];
- if (msgnum <= 0) // no msgnum? no match.
- {
+ if (msgnum <= 0) { // no msgnum? no match.
return (0);
}
striplt(tag);
char *lq = (strchr(tag, '"'));
char *rq = (strrchr(tag, '"'));
- if (lq < rq) // has two double quotes
- {
+ if (lq < rq) { // has two double quotes
strcpy(rq, "");
strcpy(tag, ++lq);
}
striplt(tag);
- if (!strcmp(tag, "*")) // wildcard match
- {
+ if (!strcmp(tag, "*")) { // wildcard match
return (1);
}
long tagmsgnum = atol(tag);
- if ((tagmsgnum > 0) && (tagmsgnum == msgnum)) // match
- {
+ if ((tagmsgnum > 0) && (tagmsgnum == msgnum)) { // match
return (1);
}
}
- return (0); // no match
+ return (0); // no match
}
/*
* 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
}
/*
* 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;
}
* 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);
}
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);
}