diff --git a/blocking.py b/blocking.py
index a2334151d..d047e0311 100644
--- a/blocking.py
+++ b/blocking.py
@@ -475,6 +475,60 @@ def allowed_announce(base_dir: str, nickname: str, domain: str,
return True
+def allowed_announce_add(base_dir: str, nickname: str, domain: str,
+ following_nickname: str,
+ following_domain: str) -> None:
+ """Allow announces for a handle
+ """
+ account_dir = acct_dir(base_dir, nickname, domain)
+ blocking_filename = account_dir + '/noannounce.txt'
+ handle = following_nickname + '@' + following_domain
+ if text_in_file(handle + '\n', blocking_filename):
+ file_text = ''
+ try:
+ with open(blocking_filename, 'r',
+ encoding='utf-8') as fp_noannounce:
+ file_text = fp_noannounce.read()
+ file_text = file_text.replace(handle + '\n', '')
+ except OSError:
+ print('EX: unable to read noannounce: ' +
+ blocking_filename + ' ' + handle)
+ try:
+ with open(blocking_filename, 'w+',
+ encoding='utf-8') as fp_noannounce:
+ fp_noannounce.write(file_text)
+ except OSError:
+ print('EX: unable to write noannounce: ' +
+ blocking_filename + ' ' + handle)
+
+
+def allowed_announce_remove(base_dir: str, nickname: str, domain: str,
+ following_nickname: str,
+ following_domain: str) -> None:
+ """Don't allow announces from a handle
+ """
+ account_dir = acct_dir(base_dir, nickname, domain)
+ blocking_filename = account_dir + '/noannounce.txt'
+ handle = following_nickname + '@' + following_domain
+ file_text = ''
+ if not text_in_file(handle + '\n', blocking_filename):
+ try:
+ with open(blocking_filename, 'r',
+ encoding='utf-8') as fp_noannounce:
+ file_text = fp_noannounce.read()
+ except OSError:
+ print('EX: unable to read noannounce: ' +
+ blocking_filename + ' ' + handle)
+ file_text += handle + '\n'
+ try:
+ with open(blocking_filename, 'w+',
+ encoding='utf-8') as fp_noannounce:
+ fp_noannounce.write(file_text)
+ except OSError:
+ print('EX: unable to write noannounce: ' +
+ blocking_filename + ' ' + handle)
+
+
def outbox_block(base_dir: str, nickname: str, domain: str,
message_json: {}, debug: bool) -> bool:
""" When a block request is received by the outbox from c2s
diff --git a/daemon.py b/daemon.py
index d1c84d1c8..f2d2e7283 100644
--- a/daemon.py
+++ b/daemon.py
@@ -154,6 +154,8 @@ from blocking import remove_global_block
from blocking import is_blocked_hashtag
from blocking import is_blocked_domain
from blocking import get_domain_blocklist
+from blocking import allowed_announce_add
+from blocking import allowed_announce_remove
from roles import set_roles_from_list
from roles import get_actor_roles_list
from blog import path_contains_blog_link
@@ -3046,6 +3048,35 @@ class PubServer(BaseHTTPRequestHandler):
self.server.postreq_busy = False
return
+ # person options screen, allow announces checkbox
+ # See html_person_options
+ if '&submitAllowAnnounce=' in options_confirm_params:
+ allow_announce = None
+ if 'allowAnnounce=' in options_confirm_params:
+ allow_announce = \
+ options_confirm_params.split('allowAnnounce=')[1]
+ if '&' in allow_announce:
+ allow_announce = allow_announce.split('&')[0]
+ if allow_announce == 'on':
+ allowed_announce_add(base_dir,
+ chooser_nickname,
+ domain,
+ options_nickname,
+ options_domain_full)
+ else:
+ allowed_announce_remove(base_dir,
+ chooser_nickname,
+ domain,
+ options_nickname,
+ options_domain_full)
+ users_path_str = \
+ users_path + '/' + self.server.default_timeline + \
+ '?page=' + str(page_number)
+ self._redirect_headers(users_path_str, cookie,
+ calling_domain)
+ self.server.postreq_busy = False
+ return
+
# person options screen, on notify checkbox
# See html_person_options
if '&submitNotifyOnPost=' in options_confirm_params:
diff --git a/webapp_person_options.py b/webapp_person_options.py
index ec543f30f..64f4a7b1e 100644
--- a/webapp_person_options.py
+++ b/webapp_person_options.py
@@ -421,7 +421,7 @@ def html_person_options(default_timeline: str,
'name="allowAnnounce" checked> 🔁' + \
translate['Allow announces'] + \
'\n
\n'
if not allowed_announce(base_dir, nickname, domain,
options_nickname, options_domain_full):