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 }