commit c9279e2
grunfink
·
2026-04-02 13:50:12 +0000 UTC
parent 8ccd23c
New function purge_static() (still dummy).
1 files changed,
+97,
-0
M
data.c
M
data.c
+97,
-0
1@@ -4259,6 +4259,101 @@ void delete_purged_posts(snac *user, int days)
2 }
3
4
5+void purge_static(snac *user)
6+/* purges the static directory of a user */
7+{
8+ xs *spec = xs_fmt("%s/static/""*", user->basedir);
9+ xs *fns = xs_glob(spec, 1, 0);
10+ xs *files = xs_dict_new();
11+ const char *v;
12+ int cnt = 0;
13+
14+ /* fill a dict with the static resource urls */
15+ xs_list_foreach(fns, v) {
16+ xs *s = xs_fmt("%s/s/%s", user->actor, v);
17+
18+ xs *fn = xs_fmt("%s/static/%s", user->basedir, v);
19+ struct stat st;
20+
21+ /* exclude non-files */
22+ if (stat(fn, &st) == -1 || (st.st_mode & S_IFMT) != S_IFREG)
23+ continue;
24+
25+ files = xs_dict_set(files, s, v);
26+ cnt++;
27+ }
28+
29+ /* don't purge avatars nor headers */
30+ if (xs_is_string(v = xs_dict_get(user->config, "avatar")) && xs_dict_get(files, v)) {
31+ files = xs_dict_del(files, v);
32+ cnt--;
33+
34+ snac_debug(user, 2, xs_fmt("purge_static: excluding '%s'", v));
35+ }
36+ if (xs_is_string(v = xs_dict_get(user->config, "header")) && xs_dict_get(files, v)) {
37+ files = xs_dict_del(files, v);
38+ cnt--;
39+
40+ snac_debug(user, 2, xs_fmt("purge_static: excluding '%s'", v));
41+ }
42+
43+ if (cnt <= 0)
44+ return;
45+
46+ xs *tl = timeline_simple_list(user, "public", 0, XS_ALL, NULL);
47+ const char *md5;
48+
49+ xs_list_foreach(tl, md5) {
50+ if (cnt <= 0)
51+ break;
52+
53+ xs *msg = NULL;
54+
55+ if (!valid_status(object_get_by_md5(md5, &msg)))
56+ continue;
57+
58+ if (!is_msg_mine(user, xs_dict_get_def(msg, "id", "")))
59+ continue;
60+
61+ const xs_list *atts = xs_dict_get(msg, "attachment");
62+ if (!xs_is_list(atts))
63+ continue;
64+
65+ const xs_dict *d;
66+
67+ xs_list_foreach(atts, d) {
68+ const char *url;
69+
70+ if (xs_is_dict(d) && xs_is_string(url = xs_dict_get(d, "url"))) {
71+ if (xs_dict_get(files, url)) {
72+ files = xs_dict_del(files, url);
73+ cnt--;
74+
75+ snac_debug(user, 2, xs_fmt("purge_static: excluding '%s'", url));
76+
77+ xs *alt_text = xs_fmt("%s.txt", url);
78+
79+ if (xs_dict_get(files, alt_text)) {
80+ files = xs_dict_del(files, alt_text);
81+ cnt--;
82+
83+ snac_debug(user, 2, xs_fmt("purge_static: excluding alt_text '%s'", alt_text));
84+ }
85+ }
86+ }
87+ }
88+ }
89+
90+ /* what is left in the files dict is not referenced anywhere */
91+ const char *k;
92+
93+ xs_dict_foreach(files, k, v) {
94+ xs *s = xs_fmt("%s/static/%s", user->basedir, v);
95+ snac_debug(user, 1, xs_fmt("purge_static: %s", s));
96+ }
97+}
98+
99+
100 void purge_user(snac *snac)
101 /* do the purge for this user */
102 {
103@@ -4313,6 +4408,8 @@ void purge_user(snac *snac)
104 }
105 }
106
107+ purge_static(snac);
108+
109 /* unrelated to purging, but it's a janitorial process, so what the hell */
110 verify_links(snac);
111 }