diff options
| author | 2023-06-29 08:07:10 +0200 | |
|---|---|---|
| committer | 2023-06-29 08:07:10 +0200 | |
| commit | 61957a86da212cb0784dfc3de7bfcafe3dc7589b (patch) | |
| tree | 6523ebbfcff60189b30e3402e10f3065fde0830a /data.c | |
| parent | Updated TODO. (diff) | |
| download | snac2-61957a86da212cb0784dfc3de7bfcafe3dc7589b.tar.gz snac2-61957a86da212cb0784dfc3de7bfcafe3dc7589b.tar.xz snac2-61957a86da212cb0784dfc3de7bfcafe3dc7589b.zip | |
Added instance blocking to data storage.
Diffstat (limited to 'data.c')
| -rw-r--r-- | data.c | 66 |
1 files changed, 66 insertions, 0 deletions
| @@ -1751,6 +1751,72 @@ xs_list *inbox_list(void) | |||
| 1751 | } | 1751 | } |
| 1752 | 1752 | ||
| 1753 | 1753 | ||
| 1754 | /** instance-wide operations **/ | ||
| 1755 | |||
| 1756 | xs_str *_instance_block_fn(const char *instance) | ||
| 1757 | { | ||
| 1758 | xs *s1 = xs_replace(instance, "https:/" "/", ""); | ||
| 1759 | xs *l = xs_split(s1, "/"); | ||
| 1760 | char *p = xs_list_get(l, 0); | ||
| 1761 | xs *md5 = xs_md5_hex(p, strlen(p)); | ||
| 1762 | |||
| 1763 | return xs_fmt("%s/block/%s", srv_basedir, md5); | ||
| 1764 | } | ||
| 1765 | |||
| 1766 | |||
| 1767 | int is_instance_blocked(const char *instance) | ||
| 1768 | { | ||
| 1769 | xs *fn = _instance_block_fn(instance); | ||
| 1770 | |||
| 1771 | return !!(mtime(fn) != 0.0); | ||
| 1772 | } | ||
| 1773 | |||
| 1774 | |||
| 1775 | int instance_block(const char *instance) | ||
| 1776 | /* blocks a full instance */ | ||
| 1777 | { | ||
| 1778 | int ret; | ||
| 1779 | |||
| 1780 | /* create the subdir */ | ||
| 1781 | xs *dir = xs_fmt("%s/block/", srv_basedir); | ||
| 1782 | mkdirx(dir); | ||
| 1783 | |||
| 1784 | if (!is_instance_blocked(instance)) { | ||
| 1785 | xs *fn = _instance_block_fn(instance); | ||
| 1786 | FILE *f; | ||
| 1787 | |||
| 1788 | if ((f = fopen(fn, "w")) != NULL) { | ||
| 1789 | fprintf(f, "%s\n", instance); | ||
| 1790 | fclose(f); | ||
| 1791 | |||
| 1792 | ret = 0; | ||
| 1793 | } | ||
| 1794 | else | ||
| 1795 | ret = -1; | ||
| 1796 | } | ||
| 1797 | else | ||
| 1798 | ret = -2; | ||
| 1799 | |||
| 1800 | return ret; | ||
| 1801 | } | ||
| 1802 | |||
| 1803 | |||
| 1804 | int instance_unblock(const char *instance) | ||
| 1805 | /* unblocks a full instance */ | ||
| 1806 | { | ||
| 1807 | int ret; | ||
| 1808 | |||
| 1809 | if (is_instance_blocked(instance)) { | ||
| 1810 | xs *fn = _instance_block_fn(instance); | ||
| 1811 | ret = unlink(fn); | ||
| 1812 | } | ||
| 1813 | else | ||
| 1814 | ret = -2; | ||
| 1815 | |||
| 1816 | return ret; | ||
| 1817 | } | ||
| 1818 | |||
| 1819 | |||
| 1754 | /** notifications **/ | 1820 | /** notifications **/ |
| 1755 | 1821 | ||
| 1756 | xs_str *notify_check_time(snac *snac, int reset) | 1822 | xs_str *notify_check_time(snac *snac, int reset) |