summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authorGravatar grunfink2023-07-11 17:11:21 +0000
committerGravatar grunfink2023-07-11 17:11:21 +0000
commita5272a21e6e5d288fd0fc5f6de65051fd40910b3 (patch)
tree1cba1e46167512e9e3a6b8f8e278d84fbdb29bf2 /xs.h
parentMerge pull request 'xs_mime.h: Add various mimetypes for audios & videos' (#6... (diff)
parenthtml.c: Escape XML characters & View unknown type attachment link (diff)
downloadsnac2-a5272a21e6e5d288fd0fc5f6de65051fd40910b3.tar.gz
snac2-a5272a21e6e5d288fd0fc5f6de65051fd40910b3.tar.xz
snac2-a5272a21e6e5d288fd0fc5f6de65051fd40910b3.zip
Merge pull request 'Attempt to prevent XSS.' (#64) from yonle/snac2:master into master
Reviewed-on: https://codeberg.org/grunfink/snac2/pulls/64
Diffstat (limited to 'xs.h')
-rw-r--r--xs.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/xs.h b/xs.h
index ad8a35d..6bf3eb8 100644
--- a/xs.h
+++ b/xs.h
@@ -72,6 +72,7 @@ xs_str *xs_replace_in(xs_str *str, const char *sfrom, const char *sto, int times
72xs_str *xs_fmt(const char *fmt, ...); 72xs_str *xs_fmt(const char *fmt, ...);
73int xs_str_in(const char *haystack, const char *needle); 73int xs_str_in(const char *haystack, const char *needle);
74int _xs_startsorends(const char *str, const char *xfix, int ends); 74int _xs_startsorends(const char *str, const char *xfix, int ends);
75xs_str *xs_encode_html(const xs_str *str);
75#define xs_startswith(str, prefix) _xs_startsorends(str, prefix, 0) 76#define xs_startswith(str, prefix) _xs_startsorends(str, prefix, 0)
76#define xs_endswith(str, postfix) _xs_startsorends(str, postfix, 1) 77#define xs_endswith(str, postfix) _xs_startsorends(str, postfix, 1)
77xs_str *xs_crop_i(xs_str *str, int start, int end); 78xs_str *xs_crop_i(xs_str *str, int start, int end);
@@ -506,6 +507,20 @@ int _xs_startsorends(const char *str, const char *xfix, int ends)
506 return !!(ssz >= psz && memcmp(xfix, str + (ends ? ssz - psz : 0), psz) == 0); 507 return !!(ssz >= psz && memcmp(xfix, str + (ends ? ssz - psz : 0), psz) == 0);
507} 508}
508 509
510xs_str *xs_encode_html(const char *str)
511/* escapes html characters */
512{
513 xs_str *encoded = xs_replace(str, "&", "&");
514 encoded = xs_replace(encoded, "<", "&lt;");
515 encoded = xs_replace(encoded, ">", "&gt;");
516 encoded = xs_replace(encoded, "\"", "&#34;");
517 encoded = xs_replace(encoded, "'", "&#39;");
518
519 // Restore only <br>. Probably safe. Let's hope nothing goes wrong with this.
520 encoded = xs_replace(encoded, "&lt;br&gt;", "<br>");
521
522 return encoded;
523}
509 524
510xs_str *xs_crop_i(xs_str *str, int start, int end) 525xs_str *xs_crop_i(xs_str *str, int start, int end)
511/* crops the d_char to be only from start to end */ 526/* crops the d_char to be only from start to end */