commit 34963e0

grunfink  ·  2023-07-24 14:00:35 +0000 UTC
parents 4003883, e776bf7
Merge pull request 'Web Client: Do not hard link on <a> element' (#75) from yonle/snac2:nohardlink into master

Reviewed-on: https://codeberg.org/grunfink/snac2/pulls/75
2 files changed,  +40, -68
M html.c
M html.c
+39, -67
  1@@ -1,4 +1,4 @@
  2-/* snac - A simple, minimalistic ActivityPub instance */
  3+	/* snac - A simple, minimalistic ActivityPub instance */
  4 /* copyright (c) 2022 - 2023 grunfink / MIT license */
  5 
  6 #include "xs.h"
  7@@ -325,8 +325,8 @@ d_char *html_user_header(snac *snac, d_char *s, int local)
  8             s1 = xs_fmt(
  9                 "<a href=\"%s.rss\">%s</a> - "
 10                 "<a href=\"%s/admin\" rel=\"nofollow\">%s</a></nav>\n",
 11-                snac->actor, L("RSS"),
 12-                snac->actor, L("private"));
 13+                snac->uid, L("RSS"),
 14+                snac->uid, L("private"));
 15         else {
 16             xs *n_list = notify_list(snac, 1);
 17             int n_len  = xs_list_len(n_list);
 18@@ -340,18 +340,14 @@ d_char *html_user_header(snac *snac, d_char *s, int local)
 19                 n_str = xs_str_new("");
 20 
 21             s1 = xs_fmt(
 22-                "<a href=\"%s\">%s</a> - "
 23-                "<a href=\"%s/admin\">%s</a> - "
 24-                "<a href=\"%s/notifications\">%s</a>%s - "
 25-                "<a href=\"%s/people\">%s</a> - "
 26-                "<a href=\"%s/settings\">%s</a>"
 27-                "</nav>\n",
 28-                snac->actor, L("public"),
 29-                snac->actor, L("private"),
 30-                snac->actor, L("notifications"), n_str,
 31-                snac->actor, L("people"),
 32-                snac->actor, L("settings")
 33-            );
 34+                "<a href=\"../%s\">%s</a> - "
 35+                "<a href=\"admin\">%s</a> - "
 36+                "<a href=\"notifications\">%s</a>%s - "
 37+                "<a href=\"people\">%s</a></nav>\n",
 38+                snac->uid, L("public"),
 39+                L("private"),
 40+                L("notifications"), n_str,
 41+                L("people"));
 42         }
 43 
 44         s = xs_str_cat(s, s1);
 45@@ -389,16 +385,16 @@ d_char *html_user_header(snac *snac, d_char *s, int local)
 46 }
 47 
 48 
 49-xs_str *html_top_controls(snac *snac, xs_str *s, int settings)
 50+d_char *html_top_controls(snac *snac, d_char *s)
 51 /* generates the top controls */
 52 {
 53     char *_tmpl =
 54         "<div class=\"snac-top-controls\">\n"
 55 
 56-        "<div class=\"snac-note\" %s>\n"
 57+        "<div class=\"snac-note\">\n"
 58         "<details><summary>%s</summary>\n"
 59         "<form autocomplete=\"off\" method=\"post\" "
 60-        "action=\"%s/admin/note\" enctype=\"multipart/form-data\">\n"
 61+        "action=\"admin/note\" enctype=\"multipart/form-data\">\n"
 62         "<textarea class=\"snac-textarea\" name=\"content\" "
 63         "rows=\"8\" wrap=\"virtual\" required=\"required\" placeholder=\"What's on your mind?\"></textarea>\n"
 64         "<input type=\"hidden\" name=\"in_reply_to\" value=\"\">\n"
 65@@ -432,28 +428,25 @@ xs_str *html_top_controls(snac *snac, xs_str *s, int settings)
 66         "</div>\n"
 67         "</details>\n"
 68 
 69-        "<div class=\"snac-top-controls-more\" %s>\n"
 70-        "<p><details><summary>%s</summary>\n"
 71+        "<div class=\"snac-top-controls-more\">\n"
 72+        "<details><summary>%s</summary>\n"
 73 
 74-        "<form autocomplete=\"off\" method=\"post\" action=\"%s/admin/action\">\n" /** follow **/
 75+        "<form autocomplete=\"off\" method=\"post\" action=\"admin/action\">\n" /** follow **/
 76         "<input type=\"text\" name=\"actor\" required=\"required\" placeholder=\"bob@example.com\">\n"
 77         "<input type=\"submit\" name=\"action\" value=\"%s\"> %s\n"
 78         "</form><p>\n"
 79 
 80-        "<form autocomplete=\"off\" method=\"post\" action=\"%s/admin/action\">\n" /** boost **/
 81+        "<form autocomplete=\"off\" method=\"post\" action=\"admin/action\">\n" /** boost **/
 82         "<input type=\"text\" name=\"id\" required=\"required\" placeholder=\"https://fedi.example.com/bob/....\">\n"
 83         "<input type=\"submit\" name=\"action\" value=\"%s\"> %s\n"
 84         "</form><p>\n"
 85         "</details>\n"
 86-        "</div>\n"
 87 
 88-        "<div class=\"snac-user-settings\" %s>\n"
 89-
 90-        "<h2 class=\"snac-header\">%s</h2>\n"
 91+        "<details><summary>%s</summary>\n"
 92 
 93         "<div class=\"snac-user-setup\">\n" /** user setup **/
 94         "<form autocomplete=\"off\" method=\"post\" "
 95-        "action=\"%s/admin/user-setup\" enctype=\"multipart/form-data\">\n"
 96+        "action=\"admin/user-setup\" enctype=\"multipart/form-data\">\n"
 97         "<p>%s:<br>\n"
 98         "<input type=\"text\" name=\"name\" value=\"%s\" placeholder=\"Your name.\"></p>\n"
 99 
100@@ -491,6 +484,7 @@ xs_str *html_top_controls(snac *snac, xs_str *s, int settings)
101         "</form>\n"
102 
103         "</div>\n"
104+        "</details>\n"
105         "</div>\n"
106         "</div>\n";
107 
108@@ -536,9 +530,7 @@ xs_str *html_top_controls(snac *snac, xs_str *s, int settings)
109     xs *es6 = encode_html(purge_days);
110 
111     xs *s1 = xs_fmt(_tmpl,
112-        settings ? "style=\"display: none\"" : "",
113         L("New Post..."),
114-        snac->actor,
115         L("Sensitive content"),
116         L("Sensitive content description"),
117         L("Only for mentioned people"),
118@@ -557,19 +549,11 @@ xs_str *html_top_controls(snac *snac, xs_str *s, int settings)
119 
120         L("Post"),
121 
122-        settings ? "style=\"display: none\"" : "",
123         L("Operations..."),
124-
125-        snac->actor,
126         L("Follow"), L("(by URL or user@host)"),
127-
128-        snac->actor,
129         L("Boost"), L("(by URL)"),
130 
131-        !settings ? "style=\"display: none\"" : "",
132-
133-        L("User Settings"),
134-        snac->actor,
135+        L("User Settings..."),
136         L("Display name"),
137         es1,
138         L("Avatar"),
139@@ -673,13 +657,13 @@ xs_str *html_entry_controls(snac *snac, xs_str *os, const xs_dict *msg, const ch
140 
141     {
142         xs *s1 = xs_fmt(
143-            "<form autocomplete=\"off\" method=\"post\" action=\"%s/admin/action\">\n"
144+            "<form autocomplete=\"off\" method=\"post\" action=\"admin/action\">\n"
145             "<input type=\"hidden\" name=\"id\" value=\"%s\">\n"
146             "<input type=\"hidden\" name=\"actor\" value=\"%s\">\n"
147             "<input type=\"hidden\" name=\"redir\" value=\"%s_entry\">\n"
148             "\n",
149 
150-            snac->actor, id, actor, md5
151+            id, actor, md5
152         );
153 
154         s = xs_str_cat(s, s1);
155@@ -733,7 +717,7 @@ xs_str *html_entry_controls(snac *snac, xs_str *os, const xs_dict *msg, const ch
156         xs *s1 = xs_fmt(
157             "<p><details><summary>%s</summary>\n"
158             "<p><div class=\"snac-note\" id=\"%s_edit\">\n"
159-            "<form autocomplete=\"off\" method=\"post\" action=\"%s/admin/note\" "
160+            "<form autocomplete=\"off\" method=\"post\" action=\"admin/note\" "
161             "enctype=\"multipart/form-data\" id=\"%s_edit_form\">\n"
162             "<textarea class=\"snac-textarea\" name=\"content\" "
163             "rows=\"4\" wrap=\"virtual\" required=\"required\">%s</textarea>\n"
164@@ -756,7 +740,7 @@ xs_str *html_entry_controls(snac *snac, xs_str *os, const xs_dict *msg, const ch
165 
166             L("Edit..."),
167             md5,
168-            snac->actor, md5,
169+            md5,
170             prev_src,
171             id,
172             L("Sensitive content"),
173@@ -784,7 +768,7 @@ xs_str *html_entry_controls(snac *snac, xs_str *os, const xs_dict *msg, const ch
174         xs *s1 = xs_fmt(
175             "<p><details><summary>%s</summary>\n"
176             "<p><div class=\"snac-note\" id=\"%s_reply\">\n"
177-            "<form autocomplete=\"off\" method=\"post\" action=\"%s/admin/note\" "
178+            "<form autocomplete=\"off\" method=\"post\" action=\"admin/note\" "
179             "enctype=\"multipart/form-data\" id=\"%s_reply_form\">\n"
180             "<textarea class=\"snac-textarea\" name=\"content\" "
181             "rows=\"4\" wrap=\"virtual\" required=\"required\">%s</textarea>\n"
182@@ -807,7 +791,7 @@ xs_str *html_entry_controls(snac *snac, xs_str *os, const xs_dict *msg, const ch
183 
184             L("Reply..."),
185             md5,
186-            snac->actor, md5,
187+            md5,
188             ct,
189             id,
190             L("Sensitive content"),
191@@ -1102,10 +1086,10 @@ xs_str *html_entry(snac *snac, xs_str *os, const xs_dict *msg, int local,
192                 /* poll still active */
193                 xs *s1 = xs_fmt("<div class=\"snac-poll-form\">\n"
194                                 "<form autocomplete=\"off\" "
195-                                "method=\"post\" action=\"%s/admin/vote\">\n"
196+                                "method=\"post\" action=\"admin/vote\">\n"
197                                 "<input type=\"hidden\" name=\"actor\" value= \"%s\">\n"
198                                 "<input type=\"hidden\" name=\"irt\" value=\"%s\">\n",
199-                    snac->actor, actor, id);
200+                    actor, id);
201 
202                 while (xs_list_iter(&p, &v)) {
203                     const char *name = xs_dict_get(v, "name");
204@@ -1386,7 +1370,7 @@ xs_str *html_timeline(snac *snac, const xs_list *list, int local, int skip, int
205     s = html_user_header(snac, s, local);
206 
207     if (!local)
208-        s = html_top_controls(snac, s, list == NULL ? 1 : 0);
209+        s = html_top_controls(snac, s);
210 
211     s = xs_str_cat(s, "<a name=\"snac-posts\"></a>\n");
212     s = xs_str_cat(s, "<div class=\"snac-posts\">\n");
213@@ -1495,11 +1479,11 @@ d_char *html_people_list(snac *snac, d_char *os, d_char *list, const char *heade
214             s = xs_str_cat(s, "<div class=\"snac-controls\">\n");
215 
216             xs *s1 = xs_fmt(
217-                "<p><form autocomplete=\"off\" method=\"post\" action=\"%s/admin/action\">\n"
218+                "<p><form autocomplete=\"off\" method=\"post\" action=\"admin/action\">\n"
219                 "<input type=\"hidden\" name=\"actor\" value=\"%s\">\n"
220                 "<input type=\"hidden\" name=\"actor-form\" value=\"yes\">\n",
221 
222-                snac->actor, actor_id
223+                actor_id
224             );
225             s = xs_str_cat(s, s1);
226 
227@@ -1523,7 +1507,7 @@ d_char *html_people_list(snac *snac, d_char *os, d_char *list, const char *heade
228             xs *s2 = xs_fmt(
229                 "<p><details><summary>%s</summary>\n"
230                 "<p><div class=\"snac-note\" id=\"%s_%s_dm\">\n"
231-                "<form autocomplete=\"off\" method=\"post\" action=\"%s/admin/note\" "
232+                "<form autocomplete=\"off\" method=\"post\" action=\"admin/note\" "
233                 "enctype=\"multipart/form-data\" id=\"%s_reply_form\">\n"
234                 "<textarea class=\"snac-textarea\" name=\"content\" "
235                 "rows=\"4\" wrap=\"virtual\" required=\"required\"></textarea>\n"
236@@ -1535,7 +1519,7 @@ d_char *html_people_list(snac *snac, d_char *os, d_char *list, const char *heade
237 
238                 L("Direct Message..."),
239                 md5, t,
240-                snac->actor, md5,
241+                md5,
242                 actor_id,
243                 L("Post")
244             );
245@@ -1586,9 +1570,9 @@ xs_str *html_notifications(snac *snac)
246 
247     xs *s1 = xs_fmt(
248         "<form autocomplete=\"off\" "
249-        "method=\"post\" action=\"%s/admin/clear-notifications\" id=\"clear\">\n"
250+        "method=\"post\" action=\"admin/clear-notifications\" id=\"clear\">\n"
251         "<input type=\"submit\" class=\"snac-btn-like\" value=\"%s\">\n"
252-        "</form><p>\n", snac->actor, L("Clear all"));
253+        "</form><p>\n", L("Clear all"));
254     s = xs_str_cat(s, s1);
255 
256     while (xs_list_iter(&p, &v)) {
257@@ -1823,18 +1807,6 @@ int html_get_handler(const xs_dict *req, const char *q_path,
258         }
259     }
260     else
261-    if (strcmp(p_path, "settings") == 0) { /** user settings **/
262-        if (!login(&snac, req)) {
263-            *body  = xs_dup(uid);
264-            status = 401;
265-        }
266-        else {
267-            *body   = html_timeline(&snac, NULL, 0, 0, 0, 0);
268-            *b_size = strlen(*body);
269-            status  = 200;
270-        }
271-    }
272-    else
273     if (strcmp(p_path, "notifications") == 0) { /** the list of notifications **/
274         if (!login(&snac, req)) {
275             *body  = xs_dup(uid);
276@@ -2400,9 +2372,9 @@ int html_post_handler(const xs_dict *req, const char *q_path,
277         char *redir = xs_dict_get(p_vars, "redir");
278 
279         if (xs_is_null(redir))
280-            redir = "snac-posts";
281+          redir = "";
282 
283-        *body   = xs_fmt("%s/admin#%s", snac.actor, redir);
284+        *body   = xs_fmt("../admin#%s", redir);
285         *b_size = strlen(*body);
286     }
287 
+1, -1
1@@ -91,7 +91,7 @@ int server_get_handler(xs_dict *req, char *q_path,
2                     if (user_open(&snac, uid)) {
3                         xs *u = xs_fmt(
4                             "<li><a href=\"%s\">@%s@%s (%s)</a></li>\n",
5-                                snac.actor, uid, host,
6+                                uid, uid, host,
7                                 xs_dict_get(snac.config, "name"));
8 
9                         ul = xs_str_cat(ul, u);