commit 34963e0
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
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
M
httpd.c
+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);