commit 09d2684

default  ·  2024-11-23 16:08:57 +0000 UTC
parent 775fb14
The 'metadata' field in user.json is now a string instead of a dict.
2 files changed,  +69, -30
M html.c
+24, -1
 1@@ -1218,7 +1218,30 @@ xs_dict *msg_actor(snac *snac)
 2     }
 3 
 4     /* add the metadata as attachments of PropertyValue */
 5-    const xs_dict *metadata = xs_dict_get(snac->config, "metadata");
 6+    xs *metadata = NULL;
 7+    const xs_dict *md = xs_dict_get(snac->config, "metadata");
 8+
 9+    if (xs_type(md) == XSTYPE_DICT)
10+        metadata = xs_dup(md);
11+    else
12+    if (xs_type(md) == XSTYPE_STRING) {
13+        metadata = xs_dict_new();
14+        xs *l = xs_split(md, "\r\n");
15+        const char *ll;
16+
17+        xs_list_foreach(l, ll) {
18+            xs *kv = xs_split_n(ll, "=", 1);
19+            const char *k = xs_list_get(kv, 0);
20+            const char *v = xs_list_get(kv, 1);
21+
22+            if (k && v) {
23+                xs *kk = xs_strip_i(xs_dup(k));
24+                xs *vv = xs_strip_i(xs_dup(v));
25+                metadata = xs_dict_set(metadata, kk, vv);
26+            }
27+        }
28+    }
29+
30     if (xs_type(metadata) == XSTYPE_DICT) {
31         xs *attach = xs_list_new();
32         const xs_str *k;
M html.c
+45, -29
 1@@ -843,7 +843,31 @@ static xs_html *html_user_body(snac *user, int read_only)
 2         xs_html_add(top_user,
 3             top_user_bio);
 4 
 5-        const xs_dict *metadata = xs_dict_get(user->config, "metadata");
 6+        xs *metadata = NULL;
 7+        const xs_dict *md = xs_dict_get(user->config, "metadata");
 8+
 9+        if (xs_type(md) == XSTYPE_DICT)
10+            metadata = xs_dup(md);
11+        else
12+        if (xs_type(md) == XSTYPE_STRING) {
13+            /* convert to dict for easier iteration */
14+            metadata = xs_dict_new();
15+            xs *l = xs_split(md, "\r\n");
16+            const char *ll;
17+
18+            xs_list_foreach(l, ll) {
19+                xs *kv = xs_split_n(ll, "=", 1);
20+                const char *k = xs_list_get(kv, 0);
21+                const char *v = xs_list_get(kv, 1);
22+
23+                if (k && v) {
24+                    xs *kk = xs_strip_i(xs_dup(k));
25+                    xs *vv = xs_strip_i(xs_dup(v));
26+                    metadata = xs_dict_set(metadata, kk, vv);
27+                }
28+            }
29+        }
30+
31         if (xs_type(metadata) == XSTYPE_DICT) {
32             const xs_str *k;
33             const xs_str *v;
34@@ -1026,19 +1050,28 @@ xs_html *html_top_controls(snac *snac)
35     const xs_val *auto_boost = xs_dict_get(snac->config, "auto_boost");
36     const xs_val *coll_thrds = xs_dict_get(snac->config, "collapse_threads");
37 
38-    xs *metadata = xs_str_new(NULL);
39+    xs *metadata = NULL;
40     const xs_dict *md = xs_dict_get(snac->config, "metadata");
41-    const xs_str *k;
42-    const xs_str *v;
43 
44-    int c = 0;
45-    while (xs_dict_next(md, &k, &v, &c)) {
46-        xs *kp = xs_fmt("%s=%s", k, v);
47+    if (xs_type(md) == XSTYPE_DICT) {
48+        const xs_str *k;
49+        const xs_str *v;
50+
51+        metadata = xs_str_new(NULL);
52 
53-        if (*metadata)
54-            metadata = xs_str_cat(metadata, "\n");
55-        metadata = xs_str_cat(metadata, kp);
56+        xs_dict_foreach(md, k, v) {
57+            xs *kp = xs_fmt("%s=%s", k, v);
58+
59+            if (*metadata)
60+                metadata = xs_str_cat(metadata, "\n");
61+            metadata = xs_str_cat(metadata, kp);
62+        }
63     }
64+    else
65+    if (xs_type(md) == XSTYPE_STRING)
66+        metadata = xs_dup(md);
67+    else
68+        metadata = xs_str_new(NULL);
69 
70     xs *user_setup_action = xs_fmt("%s/admin/user-setup", snac->actor);
71 
72@@ -3706,25 +3739,8 @@ int html_post_handler(const xs_dict *req, const char *q_path,
73         else
74             snac.config = xs_dict_set(snac.config, "collapse_threads", xs_stock(XSTYPE_FALSE));
75 
76-        if ((v = xs_dict_get(p_vars, "metadata")) != NULL) {
77-            /* split the metadata and store it as a dict */
78-            xs_dict *md = xs_dict_new();
79-            xs *l = xs_split(v, "\n");
80-            xs_list *p = l;
81-            const xs_str *kp;
82-
83-            while (xs_list_iter(&p, &kp)) {
84-                xs *kpl = xs_split_n(kp, "=", 1);
85-                if (xs_list_len(kpl) == 2) {
86-                    xs *k2 = xs_strip_i(xs_dup(xs_list_get(kpl, 0)));
87-                    xs *v2 = xs_strip_i(xs_dup(xs_list_get(kpl, 1)));
88-
89-                    md = xs_dict_set(md, k2, v2);
90-                }
91-            }
92-
93-            snac.config = xs_dict_set(snac.config, "metadata", md);
94-        }
95+        if ((v = xs_dict_get(p_vars, "metadata")) != NULL)
96+            snac.config = xs_dict_set(snac.config, "metadata", v);
97 
98         /* uploads */
99         const char *uploads[] = { "avatar", "header", NULL };