summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--html.c147
-rw-r--r--snac.h3
2 files changed, 149 insertions, 1 deletions
diff --git a/html.c b/html.c
index 8745c8b..7f8e990 100644
--- a/html.c
+++ b/html.c
@@ -142,9 +142,154 @@ int login(snac *snac, char *headers)
142} 142}
143 143
144 144
145d_char *html_msg_icon(snac *snac, d_char *s, char *msg)
146{
147 char *actor_id;
148 xs *actor = NULL;
149
150 if ((actor_id = xs_dict_get(msg, "attributedTo")) == NULL)
151 actor_id = xs_dict_get(msg, "actor");
152
153 if (actor_id && valid_status(actor_get(snac, actor_id, &actor))) {
154 xs *name = NULL;
155 xs *avatar = NULL;
156 char *v;
157
158 /* get the name */
159 if ((v = xs_dict_get(actor, "name")) == NULL) {
160 if ((v = xs_dict_get(actor, "preferredUsername")) == NULL) {
161 v = "user";
162 }
163 }
164
165 name = xs_dup(v);
166
167 /* get the avatar */
168 if ((v = xs_dict_get(actor, "icon")) != NULL &&
169 (v = xs_dict_get(v, "url")) != NULL) {
170 avatar = xs_dup(v);
171 }
172
173 if (avatar == NULL)
174 avatar = xs_fmt("data:image/png;base64, %s", susie);
175
176 {
177 xs *s1 = xs_fmt("<p><img class=\"snac-avatar\" src=\"%s\"/>\n", avatar);
178 s = xs_str_cat(s, s1);
179 }
180
181 {
182 xs *s1 = xs_fmt("<a href=\"%s\" class=\"p-author h-card snac-author\">%s</a>",
183 actor, name);
184 s = xs_str_cat(s, s1);
185 }
186
187 if (strcmp(xs_dict_get(msg, "type"), "Note") == 0) {
188 xs *s1 = xs_fmt(" <a href=\"%s\">ยป</a>", xs_dict_get(msg, "id"));
189 s = xs_str_cat(s, s1);
190 }
191
192 if (!is_msg_public(snac, msg))
193 s = xs_str_cat(s, " <span title=\"private\">&#128274;</span>");
194
195 if ((v = xs_dict_get(msg, "published")) == NULL)
196 v = "&nbsp;";
197
198 {
199 xs *s1 = xs_fmt("<br>\n<time class=\"dt-published snac-pubdate\">%s</time>\n", v);
200 s = xs_str_cat(s, s1);
201 }
202
203 s = xs_str_cat(s, "</div>\n");
204 }
205
206 return s;
207}
208
209
210d_char *html_timeline(snac *snac, char *list, int local)
211/* returns the HTML for the timeline */
212{
213 d_char *s = xs_str_new(NULL);
214
215 s = xs_str_cat(s, "<!DOCTYPE html>\n<html>\n");
216
217 s = xs_str_cat(s, "<h1>HI</h1>\n");
218
219 s = xs_str_cat(s, xs_fmt("len() == %d\n", xs_list_len(list)));
220
221 {
222 char *i = xs_list_get(list, 0);
223 xs *msg = timeline_get(snac, i);
224
225 s = html_msg_icon(snac, s, msg);
226 }
227
228 s = xs_str_cat(s, "</html>\n");
229
230 return s;
231}
232
233
145int html_get_handler(d_char *req, char *q_path, char **body, int *b_size, char **ctype) 234int html_get_handler(d_char *req, char *q_path, char **body, int *b_size, char **ctype)
146{ 235{
147 int status = 0; 236 int status = 404;
237 snac snac;
238 char *uid, *p_path;
239
240 xs *l = xs_split_n(q_path, "/", 2);
241
242 uid = xs_list_get(l, 1);
243 if (!uid || !user_open(&snac, uid)) {
244 /* invalid user */
245 srv_log(xs_fmt("html_get_handler bad user %s", uid));
246 return 404;
247 }
248
249 p_path = xs_list_get(l, 2);
250
251 if (p_path == NULL) {
252 /* public timeline */
253 xs *list = local_list(&snac, 0xfffffff);
254
255 *body = html_timeline(&snac, list, 1);
256 *b_size = strlen(*body);
257 status = 200;
258 }
259 else
260 if (strcmp(p_path, "admin") == 0) {
261 /* private timeline */
262
263 if (!login(&snac, req))
264 status = 401;
265 else {
266 xs *list = timeline_list(&snac, 0xfffffff);
267
268 *body = html_timeline(&snac, list, 0);
269 *b_size = strlen(*body);
270 status = 200;
271 }
272 }
273 else
274 if (xs_startswith(p_path, "p/") == 0) {
275 /* a timeline with just one entry */
276 }
277 else
278 if (xs_startswith(p_path, "s/") == 0) {
279 /* a static file */
280 }
281 else
282 if (xs_startswith(p_path, "h/") == 0) {
283 /* an entry from the history */
284 }
285 else
286 status = 404;
287
288 user_free(&snac);
289
290 if (valid_status(status)) {
291 *ctype = "text/html; charset=utf-8";
292 }
148 293
149 return status; 294 return status;
150} 295}
diff --git a/snac.h b/snac.h
index 904f947..b5a5a76 100644
--- a/snac.h
+++ b/snac.h
@@ -12,6 +12,8 @@ extern int srv_running;
12 12
13extern int dbglevel; 13extern int dbglevel;
14 14
15extern const char *susie;
16
15#define valid_status(status) ((status) >= 200 && (status) <= 299) 17#define valid_status(status) ((status) >= 200 && (status) <= 299)
16 18
17d_char *xs_time(char *fmt, int local); 19d_char *xs_time(char *fmt, int local);
@@ -102,6 +104,7 @@ int activitypub_request(snac *snac, char *url, d_char **data);
102int actor_request(snac *snac, char *actor, d_char **data); 104int actor_request(snac *snac, char *actor, d_char **data);
103int send_to_inbox(snac *snac, char *inbox, char *msg, d_char **payload, int *p_size); 105int send_to_inbox(snac *snac, char *inbox, char *msg, d_char **payload, int *p_size);
104int send_to_actor(snac *snac, char *actor, char *msg, d_char **payload, int *p_size); 106int send_to_actor(snac *snac, char *actor, char *msg, d_char **payload, int *p_size);
107int is_msg_public(snac *snac, char *msg);
105void process_queue(snac *snac); 108void process_queue(snac *snac);
106void post(snac *snac, char *msg); 109void post(snac *snac, char *msg);
107int activitypub_get_handler(d_char *req, char *q_path, 110int activitypub_get_handler(d_char *req, char *q_path,