epicyon/daemon_post_person_options.py

1698 lines
70 KiB
Python
Raw Normal View History

__filename__ = "daemon_post_person_options.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
__version__ = "1.5.0"
__maintainer__ = "Bob Mottram"
__email__ = "bob@libreserver.org"
__status__ = "Production"
2024-03-23 15:11:05 +00:00
__module_group__ = "Core POST"
import os
import errno
import urllib.parse
from socket import error as SocketError
from utils import get_nickname_from_actor
from httpcodes import write2
from httpcodes import http_404
from httpheaders import login_headers
from httpheaders import redirect_headers
from httpheaders import set_headers
from utils import refresh_newswire
from utils import acct_dir
from utils import get_config_param
from utils import get_domain_from_actor
from utils import get_full_domain
from utils import remove_eol
from session import establish_session
from webapp_profile import html_profile_after_search
from petnames import set_pet_name
from person import person_snooze
from person import person_unsnooze
from person import set_person_notes
from followingCalendar import add_person_to_calendar
from followingCalendar import remove_person_from_calendar
from webapp_person_options import person_minimize_images
from webapp_person_options import person_undo_minimize_images
from webapp_confirm import html_confirm_block
from webapp_confirm import html_confirm_unblock
from webapp_confirm import html_confirm_follow
from webapp_confirm import html_confirm_unfollow
from webapp_create_post import html_new_post
from webapp_moderation import html_account_info
from languages import get_understood_languages
from blocking import allowed_announce_add
from blocking import allowed_announce_remove
from blocking import blocked_quote_toots_add
from blocking import blocked_quote_toots_remove
from notifyOnPost import add_notify_on_post
from notifyOnPost import remove_notify_on_post
from posts import is_moderator
2024-05-10 19:29:55 +00:00
def _person_options_page_number(options_confirm_params: str) -> int:
"""Get the page number
"""
page_number = 1
if 'pageNumber=' in options_confirm_params:
page_number_str = options_confirm_params.split('pageNumber=')[1]
if '&' in page_number_str:
page_number_str = page_number_str.split('&')[0]
if len(page_number_str) < 5:
if page_number_str.isdigit():
page_number = int(page_number_str)
2024-05-10 19:29:55 +00:00
return page_number
2024-05-10 19:29:55 +00:00
def _person_options_actor(options_confirm_params: str) -> str:
"""Get the actor
"""
options_actor = options_confirm_params.split('actor=')[1]
if '&' in options_actor:
options_actor = options_actor.split('&')[0]
2024-05-10 19:29:55 +00:00
return options_actor
2024-05-10 19:29:55 +00:00
def _person_options_moved_to(options_confirm_params: str) -> str:
"""actor for movedTo
"""
options_actor_moved = None
if 'movedToActor=' in options_confirm_params:
options_actor_moved = \
options_confirm_params.split('movedToActor=')[1]
if '&' in options_actor_moved:
options_actor_moved = options_actor_moved.split('&')[0]
2024-05-10 19:29:55 +00:00
return options_actor_moved
2024-05-10 19:29:55 +00:00
def _person_options_avatar_url(options_confirm_params: str) -> str:
"""url of the avatar
"""
options_avatar_url = options_confirm_params.split('avatarUrl=')[1]
if '&' in options_avatar_url:
options_avatar_url = options_avatar_url.split('&')[0]
2024-05-10 19:29:55 +00:00
return options_avatar_url
2024-05-10 19:29:55 +00:00
def _person_options_post_url(options_confirm_params: str) -> str:
"""link to a post, which can then be included in reports
"""
post_url = None
if 'postUrl' in options_confirm_params:
post_url = options_confirm_params.split('postUrl=')[1]
if '&' in post_url:
post_url = post_url.split('&')[0]
2024-05-10 19:29:55 +00:00
return post_url
2024-05-10 19:29:55 +00:00
def _person_options_petname(options_confirm_params: str) -> str:
"""petname for this person
"""
petname = None
if 'optionpetname' in options_confirm_params:
petname = options_confirm_params.split('optionpetname=')[1]
if '&' in petname:
petname = petname.split('&')[0]
# Limit the length of the petname
if len(petname) > 20 or \
' ' in petname or '/' in petname or \
'?' in petname or '#' in petname:
petname = None
2024-05-10 19:29:55 +00:00
return petname
2024-05-10 20:03:56 +00:00
def _person_option_receive_petname(self, options_confirm_params: str,
petname: str, debug: bool,
options_nickname: str,
options_domain_full: str,
base_dir: str,
chooser_nickname: str,
domain: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""person options screen, petname submit button
See html_person_options
"""
if '&submitPetname=' in options_confirm_params and petname:
if debug:
print('Change petname to ' + petname)
handle = options_nickname + '@' + options_domain_full
set_pet_name(base_dir,
chooser_nickname,
domain,
handle, petname)
users_path_str = \
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
calling_domain, 303)
self.server.postreq_busy = False
return True
return False
2024-05-10 19:29:55 +00:00
def _person_options_notes(options_confirm_params: str) -> str:
"""notes about this person
"""
person_notes = None
if 'optionnotes' in options_confirm_params:
person_notes = options_confirm_params.split('optionnotes=')[1]
if '&' in person_notes:
person_notes = person_notes.split('&')[0]
person_notes = urllib.parse.unquote_plus(person_notes.strip())
# Limit the length of the notes
if len(person_notes) > 64000:
person_notes = None
2024-05-10 19:29:55 +00:00
return person_notes
2024-05-10 20:03:56 +00:00
def _person_options_receive_notes(self, options_confirm_params: str,
debug: bool,
options_nickname: str,
options_domain_full: str,
person_notes: str,
base_dir: str,
chooser_nickname: str,
domain: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, person notes submit button
See html_person_options
"""
if '&submitPersonNotes=' in options_confirm_params:
if debug:
print('Change person notes')
handle = options_nickname + '@' + options_domain_full
if not person_notes:
person_notes = ''
set_person_notes(base_dir,
chooser_nickname,
domain,
handle, person_notes)
users_path_str = \
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
calling_domain, 303)
self.server.postreq_busy = False
return True
return False
2024-05-10 19:29:55 +00:00
def _person_options_view(self, options_confirm_params: str,
debug: bool,
options_actor: str,
key_shortcuts: {},
chooser_nickname: str,
account_timezone: {},
proxy_type: str,
bold_reading_nicknames: {},
authorized: bool,
recent_posts_cache: {},
max_recent_posts: int,
translate: {},
base_dir: str,
users_path: str,
http_prefix: str,
domain: str,
port: int,
cached_webfingers: {},
person_cache: {},
project_version: str,
yt_replace_domain: str,
twitter_replacement_domain: str,
show_published_date_only: bool,
default_timeline: str,
peertube_instances: [],
allow_local_network_access: bool,
theme_name: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
onion_domain: str,
i2p_domain: str,
dogwhistles: {},
min_images_for_accounts: {},
buy_sites: [],
max_shares_on_profile: int,
no_of_books: int,
auto_cw_cache: {},
cookie: str,
2024-05-11 12:56:11 +00:00
calling_domain: str,
2024-05-11 12:58:42 +00:00
curr_session, access_keys: {}) -> bool:
2024-05-10 19:29:55 +00:00
"""Person options screen, view button
See html_person_options
"""
if '&submitView=' in options_confirm_params:
if debug:
print('Viewing ' + options_actor)
2024-04-14 13:38:28 +00:00
if key_shortcuts.get(chooser_nickname):
access_keys = key_shortcuts[chooser_nickname]
timezone = None
2024-04-14 13:38:28 +00:00
if account_timezone.get(chooser_nickname):
timezone = account_timezone.get(chooser_nickname)
profile_handle = remove_eol(options_actor).strip()
# establish the session
2024-04-14 13:38:28 +00:00
curr_proxy_type = proxy_type
if '.onion/' in profile_handle or \
profile_handle.endswith('.onion'):
curr_proxy_type = 'tor'
curr_session = self.server.session_onion
elif ('.i2p/' in profile_handle or
profile_handle.endswith('.i2p')):
curr_proxy_type = 'i2p'
curr_session = self.server.session_i2p
curr_session = \
establish_session("handle search",
curr_session,
curr_proxy_type,
self.server)
if not curr_session:
self.server.postreq_busy = False
2024-05-10 19:29:55 +00:00
return True
bold_reading = False
2024-04-14 13:38:28 +00:00
if bold_reading_nicknames.get(chooser_nickname):
bold_reading = True
profile_str = \
html_profile_after_search(authorized,
recent_posts_cache,
2024-04-14 13:38:28 +00:00
max_recent_posts,
translate,
base_dir,
users_path,
http_prefix,
chooser_nickname,
domain,
port,
profile_handle,
curr_session,
cached_webfingers,
2024-04-14 13:38:28 +00:00
person_cache,
2024-04-08 14:00:47 +00:00
debug,
2024-04-14 13:38:28 +00:00
project_version,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
2024-04-14 13:38:28 +00:00
default_timeline,
peertube_instances,
allow_local_network_access,
2024-04-14 13:38:28 +00:00
theme_name,
access_keys,
2024-04-14 13:38:28 +00:00
system_language,
max_like_count,
signing_priv_key_pem,
2024-04-14 13:38:28 +00:00
cw_lists,
lists_enabled,
timezone,
2024-04-08 14:00:47 +00:00
onion_domain,
i2p_domain,
bold_reading,
2024-04-14 13:38:28 +00:00
dogwhistles,
min_images_for_accounts,
2024-04-14 13:38:28 +00:00
buy_sites,
max_shares_on_profile,
2024-04-14 13:38:28 +00:00
no_of_books,
auto_cw_cache)
if profile_str:
msg = profile_str.encode('utf-8')
msglen = len(msg)
login_headers(self, 'text/html',
msglen, calling_domain)
write2(self, msg)
self.server.postreq_busy = False
2024-05-10 19:29:55 +00:00
return True
redirect_headers(self, options_actor,
2024-04-16 13:47:21 +00:00
cookie, calling_domain, 303)
self.server.postreq_busy = False
2024-05-10 19:29:55 +00:00
return True
return False
2024-05-10 20:03:56 +00:00
def _person_options_on_calendar(self, options_confirm_params: str,
base_dir: str,
chooser_nickname: str,
domain: str,
options_nickname: str,
options_domain_full: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, on calendar checkbox
See html_person_options
"""
if '&submitOnCalendar=' in options_confirm_params:
on_calendar = None
if 'onCalendar=' in options_confirm_params:
on_calendar = options_confirm_params.split('onCalendar=')[1]
if '&' in on_calendar:
on_calendar = on_calendar.split('&')[0]
if on_calendar == 'on':
add_person_to_calendar(base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full)
else:
remove_person_from_calendar(base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full)
users_path_str = \
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
calling_domain, 303)
self.server.postreq_busy = False
return True
return False
def _person_options_min_images(self, options_confirm_params: str,
base_dir: str,
chooser_nickname: str,
domain: str,
options_nickname: str,
options_domain_full: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, minimize images checkbox
See html_person_options
"""
if '&submitMinimizeImages=' in options_confirm_params:
minimize_images = None
if 'minimizeImages=' in options_confirm_params:
minimize_images = \
options_confirm_params.split('minimizeImages=')[1]
if '&' in minimize_images:
minimize_images = minimize_images.split('&')[0]
if minimize_images == 'on':
person_minimize_images(base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full)
else:
person_undo_minimize_images(base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full)
users_path_str = \
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
calling_domain, 303)
self.server.postreq_busy = False
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_allow_announce(self, options_confirm_params: str,
base_dir: str,
chooser_nickname: str,
domain: str,
options_nickname: str,
options_domain_full: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, allow announces checkbox
See html_person_options
2024-05-10 19:29:55 +00:00
"""
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 = \
2024-04-14 13:38:28 +00:00
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
2024-04-16 13:47:21 +00:00
calling_domain, 303)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_allow_quotes(self, options_confirm_params: str,
base_dir: str,
chooser_nickname: str,
domain: str,
options_nickname: str,
options_domain_full: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, allow quote toots checkbox
See html_person_options
"""
if '&submitAllowQuotes=' in options_confirm_params:
allow_quote_toots = None
if 'allowQuotes=' in options_confirm_params:
allow_quote_toots = \
options_confirm_params.split('allowQuotes=')[1]
if '&' in allow_quote_toots:
allow_quote_toots = allow_quote_toots.split('&')[0]
if allow_quote_toots != 'on':
blocked_quote_toots_add(base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full)
else:
blocked_quote_toots_remove(base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full)
users_path_str = \
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
calling_domain, 303)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_notify(self, options_confirm_params: str,
base_dir: str,
chooser_nickname: str,
domain: str,
options_nickname: str,
options_domain_full: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, on notify checkbox
See html_person_options
"""
if '&submitNotifyOnPost=' in options_confirm_params:
notify = None
if 'notifyOnPost=' in options_confirm_params:
notify = options_confirm_params.split('notifyOnPost=')[1]
if '&' in notify:
notify = notify.split('&')[0]
if notify == 'on':
add_notify_on_post(base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full)
else:
remove_notify_on_post(base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full)
users_path_str = \
2024-04-14 13:38:28 +00:00
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
2024-04-16 13:47:21 +00:00
calling_domain, 303)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_post_to_news(self, options_confirm_params: str,
chooser_nickname: str,
base_dir: str,
options_nickname: str,
options_domain: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, permission to post to newswire
See html_person_options
"""
if '&submitPostToNews=' in options_confirm_params:
2024-04-08 09:33:48 +00:00
admin_nickname = get_config_param(base_dir, 'admin')
if (chooser_nickname != options_nickname and
(chooser_nickname == admin_nickname or
2024-04-08 09:33:48 +00:00
(is_moderator(base_dir, chooser_nickname) and
not is_moderator(base_dir, options_nickname)))):
posts_to_news = None
if 'postsToNews=' in options_confirm_params:
posts_to_news = \
options_confirm_params.split('postsToNews=')[1]
if '&' in posts_to_news:
posts_to_news = posts_to_news.split('&')[0]
2024-04-08 09:33:48 +00:00
account_dir = acct_dir(base_dir,
options_nickname, options_domain)
newswire_blocked_filename = account_dir + '/.nonewswire'
if posts_to_news == 'on':
if os.path.isfile(newswire_blocked_filename):
try:
os.remove(newswire_blocked_filename)
except OSError:
print('EX: _person_options unable to delete ' +
newswire_blocked_filename)
2024-04-08 09:33:48 +00:00
refresh_newswire(base_dir)
else:
if os.path.isdir(account_dir):
nw_filename = newswire_blocked_filename
nw_written = False
try:
with open(nw_filename, 'w+',
2024-07-16 11:21:28 +00:00
encoding='utf-8') as fp_no:
fp_no.write('\n')
nw_written = True
except OSError as ex:
2024-07-02 22:16:13 +00:00
print('EX: _person_options_post_to_news unable ' +
'to write ' + nw_filename + ' ' + str(ex))
if nw_written:
2024-04-08 09:33:48 +00:00
refresh_newswire(base_dir)
users_path_str = \
2024-04-14 13:38:28 +00:00
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
2024-04-16 13:47:21 +00:00
calling_domain, 303)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_post_to_features(self, options_confirm_params: str,
chooser_nickname: str,
options_nickname: str,
base_dir: str,
options_domain: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, permission to post to featured articles
See html_person_options
"""
if '&submitPostToFeatures=' in options_confirm_params:
2024-04-08 09:33:48 +00:00
admin_nickname = get_config_param(base_dir, 'admin')
if (chooser_nickname != options_nickname and
(chooser_nickname == admin_nickname or
2024-04-08 09:33:48 +00:00
(is_moderator(base_dir, chooser_nickname) and
not is_moderator(base_dir, options_nickname)))):
posts_to_features = None
if 'postsToFeatures=' in options_confirm_params:
posts_to_features = \
options_confirm_params.split('postsToFeatures=')[1]
if '&' in posts_to_features:
posts_to_features = posts_to_features.split('&')[0]
2024-04-08 09:33:48 +00:00
account_dir = acct_dir(base_dir,
options_nickname, options_domain)
features_blocked_filename = account_dir + '/.nofeatures'
if posts_to_features == 'on':
if os.path.isfile(features_blocked_filename):
try:
os.remove(features_blocked_filename)
except OSError:
print('EX: _person_options unable to delete ' +
features_blocked_filename)
2024-04-08 09:33:48 +00:00
refresh_newswire(base_dir)
else:
if os.path.isdir(account_dir):
feat_filename = features_blocked_filename
feat_written = False
try:
with open(feat_filename, 'w+',
2024-07-16 11:21:28 +00:00
encoding='utf-8') as fp_no:
fp_no.write('\n')
feat_written = True
except OSError as ex:
2024-07-02 22:16:13 +00:00
print('EX: _person_options_post_to_features ' +
'unable to write ' + feat_filename +
' ' + str(ex))
if feat_written:
2024-04-08 09:33:48 +00:00
refresh_newswire(base_dir)
users_path_str = \
2024-04-14 13:38:28 +00:00
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
2024-04-16 13:47:21 +00:00
calling_domain, 303)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_mod_news(self, options_confirm_params: str,
base_dir: str,
chooser_nickname: str,
options_nickname: str,
options_domain: str,
users_path: str,
default_timeline: str,
page_number: int,
cookie: str,
calling_domain: str) -> bool:
"""Person options screen, permission to post to newswire
See html_person_options
"""
if '&submitModNewsPosts=' in options_confirm_params:
2024-04-08 09:33:48 +00:00
admin_nickname = get_config_param(base_dir, 'admin')
if (chooser_nickname != options_nickname and
(chooser_nickname == admin_nickname or
2024-04-08 09:33:48 +00:00
(is_moderator(base_dir, chooser_nickname) and
not is_moderator(base_dir, options_nickname)))):
mod_posts_to_news = None
if 'modNewsPosts=' in options_confirm_params:
mod_posts_to_news = \
options_confirm_params.split('modNewsPosts=')[1]
if '&' in mod_posts_to_news:
mod_posts_to_news = mod_posts_to_news.split('&')[0]
2024-04-08 09:33:48 +00:00
account_dir = acct_dir(base_dir,
options_nickname, options_domain)
newswire_mod_filename = account_dir + '/.newswiremoderated'
if mod_posts_to_news != 'on':
if os.path.isfile(newswire_mod_filename):
try:
os.remove(newswire_mod_filename)
except OSError:
print('EX: _person_options unable to delete ' +
newswire_mod_filename)
else:
if os.path.isdir(account_dir):
nw_filename = newswire_mod_filename
try:
with open(nw_filename, 'w+',
2024-07-16 11:21:28 +00:00
encoding='utf-8') as fp_mod:
fp_mod.write('\n')
except OSError:
2024-07-02 22:16:13 +00:00
print('EX: _person_options_mod_news ' +
'unable to write ' + nw_filename)
users_path_str = \
2024-04-14 13:38:28 +00:00
users_path + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, users_path_str, cookie,
2024-04-16 13:47:21 +00:00
calling_domain, 303)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_block(self, options_confirm_params: str,
debug: bool,
options_actor: str,
translate: {},
base_dir: str,
users_path: str,
options_avatar_url: str,
cookie: str, calling_domain: str) -> bool:
"""Person options screen, block button
See html_person_options
"""
if '&submitBlock=' in options_confirm_params:
if debug:
print('Blocking ' + options_actor)
msg = \
2024-04-14 13:38:28 +00:00
html_confirm_block(translate,
base_dir,
users_path,
options_actor,
options_avatar_url).encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_unblock(self, options_confirm_params: str,
debug: bool,
options_actor: str,
translate: {},
base_dir: str,
users_path: str,
options_avatar_url: str,
cookie: str, calling_domain: str) -> bool:
"""Person options screen, unblock button
See html_person_options
"""
if '&submitUnblock=' in options_confirm_params:
if debug:
print('Unblocking ' + options_actor)
msg = \
2024-04-14 13:38:28 +00:00
html_confirm_unblock(translate,
base_dir,
users_path,
options_actor,
options_avatar_url).encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_follow(self, options_confirm_params: str,
debug: bool, options_actor: str,
translate: {},
base_dir: str,
users_path: str,
options_avatar_url: str,
chooser_nickname: str,
domain: str,
cookie: str, calling_domain: str) -> bool:
"""Person options screen, follow button
See html_person_options followStr
"""
if '&submitFollow=' in options_confirm_params or \
'&submitJoin=' in options_confirm_params:
if debug:
print('Following ' + options_actor)
msg = \
2024-04-14 13:38:28 +00:00
html_confirm_follow(translate,
base_dir,
users_path,
options_actor,
options_avatar_url,
chooser_nickname,
domain).encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_move(self, options_confirm_params: str,
options_actor_moved: str,
debug: bool,
translate: {},
base_dir: str,
users_path: str,
options_avatar_url: str,
chooser_nickname: str,
domain: str,
cookie: str, calling_domain: str) -> bool:
"""Person options screen, move button
See html_person_options followStr
"""
if '&submitMove=' in options_confirm_params and options_actor_moved:
if debug:
print('Moving ' + options_actor_moved)
msg = \
2024-04-14 13:38:28 +00:00
html_confirm_follow(translate,
base_dir,
users_path,
options_actor_moved,
options_avatar_url,
chooser_nickname,
domain).encode('utf-8')
if msg:
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 11:12:57 +00:00
def _person_options_unfollow(self, options_confirm_params: str,
options_actor: str,
translate: {},
base_dir: str,
users_path: str,
options_avatar_url: str,
cookie: str, calling_domain: str) -> bool:
"""Person options screen, unfollow button
See html_person_options followStr
"""
if '&submitUnfollow=' in options_confirm_params or \
'&submitLeave=' in options_confirm_params:
print('Unfollowing ' + options_actor)
msg = \
2024-04-14 13:38:28 +00:00
html_confirm_unfollow(translate,
base_dir,
users_path,
options_actor,
options_avatar_url).encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
self.server.postreq_busy = False
2024-05-11 11:12:57 +00:00
return True
return False
2024-05-11 12:49:50 +00:00
def _person_options_dm(self, options_confirm_params: str,
debug: bool, options_actor: str,
path: str, key_shortcuts: {},
base_dir: str, bold_reading_nicknames: {},
chooser_nickname: str, http_prefix: str,
domain_full: str, person_cache: {},
system_language: str,
default_post_language: {},
translate: {}, page_number: int,
domain: str, default_timeline: str,
newswire: str, theme_name: str,
recent_posts_cache: {},
max_recent_posts: int,
curr_session,
cached_webfingers: {},
port: int, project_version: str,
yt_replace_domain: str,
twitter_replacement_domain: str,
show_published_date_only: bool,
peertube_instances: [],
allow_local_network_access: bool,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: {},
buy_sites: [],
auto_cw_cache: {},
2024-05-11 13:01:31 +00:00
cookie: str, calling_domain: str,
access_keys: {}) -> bool:
2024-05-11 12:49:50 +00:00
"""Person options screen, DM button
See html_person_options
"""
if '&submitDM=' in options_confirm_params:
if debug:
print('Sending DM to ' + options_actor)
report_path = path.replace('/personoptions', '') + '/newdm'
if '/users/' in path:
nickname = path.split('/users/')[1]
if '/' in nickname:
nickname = nickname.split('/')[0]
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
custom_submit_text = get_config_param(base_dir, 'customSubmitText')
conversation_id = None
2024-10-06 16:22:13 +00:00
convthread_id = None
2024-05-11 12:49:50 +00:00
reply_is_chat = False
bold_reading = False
if bold_reading_nicknames.get(chooser_nickname):
bold_reading = True
languages_understood = \
get_understood_languages(base_dir,
http_prefix,
chooser_nickname,
domain_full,
person_cache)
default_post_language2 = system_language
if default_post_language.get(nickname):
default_post_language2 = default_post_language[nickname]
default_buy_site = ''
2024-10-12 10:53:04 +00:00
searchable_by_default = 'yourself'
2024-05-11 12:49:50 +00:00
msg = \
html_new_post({}, False, translate,
base_dir,
http_prefix,
report_path, None,
[options_actor], None, None,
page_number, '',
chooser_nickname,
domain,
domain_full,
default_timeline,
newswire,
theme_name,
True, access_keys,
custom_submit_text,
2024-10-06 16:22:13 +00:00
conversation_id, convthread_id,
2024-05-11 12:49:50 +00:00
recent_posts_cache,
max_recent_posts,
curr_session,
cached_webfingers,
person_cache,
port,
None,
project_version,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
peertube_instances,
allow_local_network_access,
system_language,
languages_understood,
max_like_count,
signing_priv_key_pem,
cw_lists,
lists_enabled,
default_timeline,
reply_is_chat,
bold_reading,
dogwhistles,
min_images_for_accounts,
None, None, default_post_language2,
buy_sites,
default_buy_site,
2024-10-12 10:53:04 +00:00
auto_cw_cache,
searchable_by_default)
2024-05-11 12:49:50 +00:00
if msg:
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
self.server.postreq_busy = False
return True
return False
def _person_options_info(self, options_confirm_params: str,
base_dir: str, chooser_nickname: str,
debug: bool, options_actor: str,
translate: {}, http_prefix: str,
domain: str, system_language: str,
signing_priv_key_pem: str,
block_federated: [],
cookie: str, calling_domain: str) -> bool:
"""Person options screen, Info button
See html_person_options
"""
if '&submitPersonInfo=' in options_confirm_params:
if is_moderator(base_dir, chooser_nickname):
if debug:
print('Showing info for ' + options_actor)
msg = \
html_account_info(translate,
base_dir,
http_prefix,
chooser_nickname,
domain,
options_actor,
debug,
system_language,
signing_priv_key_pem,
None,
block_federated)
if msg:
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
self.server.postreq_busy = False
return True
http_404(self, 11)
return True
return False
def _person_options_snooze(self, options_confirm_params: str,
path: str, http_prefix: str,
domain_full: str, debug: bool,
options_actor: str, base_dir: str,
domain: str, calling_domain: str,
onion_domain: str, i2p_domain: str,
default_timeline: str,
page_number: int,
cookie: str) -> bool:
"""Person options screen, snooze button
See html_person_options
"""
if '&submitSnooze=' in options_confirm_params:
users_path = path.split('/personoptions')[0]
this_actor = http_prefix + '://' + domain_full + users_path
if debug:
print('Snoozing ' + options_actor + ' ' + this_actor)
if '/users/' in this_actor:
nickname = this_actor.split('/users/')[1]
person_snooze(base_dir, nickname,
domain, options_actor)
if calling_domain.endswith('.onion') and onion_domain:
this_actor = 'http://' + onion_domain + users_path
elif (calling_domain.endswith('.i2p') and i2p_domain):
this_actor = 'http://' + i2p_domain + users_path
actor_path_str = \
this_actor + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, actor_path_str, cookie,
calling_domain, 303)
self.server.postreq_busy = False
return True
return False
def _person_options_unsnooze(self, options_confirm_params: str,
path: str, http_prefix: str,
domain_full: str, debug: bool,
options_actor: str,
base_dir: str, domain: str,
calling_domain: str,
onion_domain: str, i2p_domain: str,
default_timeline: str,
page_number: int, cookie: str) -> bool:
"""Person options screen, unsnooze button
See html_person_options
"""
if '&submitUnsnooze=' in options_confirm_params:
users_path = path.split('/personoptions')[0]
this_actor = http_prefix + '://' + domain_full + users_path
if debug:
print('Unsnoozing ' + options_actor + ' ' + this_actor)
if '/users/' in this_actor:
nickname = this_actor.split('/users/')[1]
person_unsnooze(base_dir, nickname,
domain, options_actor)
if calling_domain.endswith('.onion') and onion_domain:
this_actor = 'http://' + onion_domain + users_path
elif (calling_domain.endswith('.i2p') and i2p_domain):
this_actor = 'http://' + i2p_domain + users_path
actor_path_str = \
this_actor + '/' + default_timeline + \
'?page=' + str(page_number)
redirect_headers(self, actor_path_str, cookie,
calling_domain, 303)
self.server.postreq_busy = False
return True
return False
def _person_options_report(self, options_confirm_params: str,
debug: bool, path: str,
options_actor: str, key_shortcuts: {},
base_dir: str, bold_reading_nicknames: {},
chooser_nickname: str,
http_prefix: str, domain_full: str,
person_cache: {}, system_language: str,
default_post_language: {},
translate: {}, post_url: str,
page_number: int,
domain: str, default_timeline: str,
newswire: {},
theme_name: str,
recent_posts_cache: {},
max_recent_posts: int,
curr_session,
cached_webfingers: {}, port: int,
project_version: str,
yt_replace_domain: str,
twitter_replacement_domain: str,
show_published_date_only: bool,
peertube_instances: [],
allow_local_network_access: bool,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: {},
buy_sites: [],
auto_cw_cache: {},
2024-05-11 13:01:31 +00:00
cookie: str, calling_domain: str,
access_keys: {}) -> bool:
2024-05-11 12:49:50 +00:00
"""Person options screen, report button
See html_person_options
"""
if '&submitReport=' in options_confirm_params:
if debug:
print('Reporting ' + options_actor)
report_path = \
path.replace('/personoptions', '') + '/newreport'
if '/users/' in path:
nickname = path.split('/users/')[1]
if '/' in nickname:
nickname = nickname.split('/')[0]
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
custom_submit_text = get_config_param(base_dir, 'customSubmitText')
conversation_id = None
2024-10-06 16:22:13 +00:00
convthread_id = None
2024-05-11 12:49:50 +00:00
reply_is_chat = False
bold_reading = False
if bold_reading_nicknames.get(chooser_nickname):
bold_reading = True
languages_understood = \
get_understood_languages(base_dir,
http_prefix,
chooser_nickname,
domain_full,
person_cache)
default_post_language2 = system_language
if default_post_language.get(nickname):
default_post_language2 = default_post_language[nickname]
default_buy_site = ''
2024-10-12 10:53:04 +00:00
searchable_by_default = 'yourself'
2024-05-11 12:49:50 +00:00
msg = \
html_new_post({}, False, translate,
base_dir,
http_prefix,
report_path, None, [],
None, post_url, page_number, '',
chooser_nickname,
domain,
domain_full,
default_timeline,
newswire,
theme_name,
True, access_keys,
custom_submit_text,
2024-10-06 16:22:13 +00:00
conversation_id, convthread_id,
2024-05-11 12:49:50 +00:00
recent_posts_cache,
max_recent_posts,
curr_session,
cached_webfingers,
person_cache,
port,
None,
project_version,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
peertube_instances,
allow_local_network_access,
system_language,
languages_understood,
max_like_count,
signing_priv_key_pem,
cw_lists,
lists_enabled,
default_timeline,
reply_is_chat,
bold_reading,
dogwhistles,
min_images_for_accounts,
None, None, default_post_language2,
buy_sites,
default_buy_site,
2024-10-12 10:53:04 +00:00
auto_cw_cache,
searchable_by_default)
2024-05-11 12:49:50 +00:00
if msg:
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
self.server.postreq_busy = False
return True
return False
2024-05-11 11:12:57 +00:00
def person_options2(self, path: str,
calling_domain: str, cookie: str,
base_dir: str, http_prefix: str,
domain: str, domain_full: str, port: int,
onion_domain: str, i2p_domain: str,
debug: bool, curr_session,
authorized: bool,
show_published_date_only: bool,
allow_local_network_access: bool,
access_keys: {},
key_shortcuts: {},
signing_priv_key_pem: str,
twitter_replacement_domain: str,
peertube_instances: [],
yt_replace_domain: str,
cached_webfingers: {},
recent_posts_cache: {},
account_timezone: {},
proxy_type: str,
bold_reading_nicknames: {},
min_images_for_accounts: [],
max_shares_on_profile: int,
max_recent_posts: int,
translate: {},
person_cache: {},
project_version: str,
default_timeline: str,
theme_name: str,
system_language: str,
max_like_count: int,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
buy_sites: [],
no_of_books: int,
auto_cw_cache: {},
default_post_language: str,
newswire: {},
block_federated: []) -> None:
"""Receive POST from person options screen
"""
page_number = 1
users_path = path.split('/personoptions')[0]
origin_path_str = http_prefix + '://' + domain_full + users_path
chooser_nickname = get_nickname_from_actor(origin_path_str)
if not chooser_nickname:
if calling_domain.endswith('.onion') and onion_domain:
origin_path_str = 'http://' + onion_domain + users_path
elif (calling_domain.endswith('.i2p') and i2p_domain):
origin_path_str = 'http://' + i2p_domain + users_path
print('WARN: unable to find nickname in ' + origin_path_str)
redirect_headers(self, origin_path_str, cookie, calling_domain, 303)
self.server.postreq_busy = False
return
length = int(self.headers['Content-length'])
try:
options_confirm_params = self.rfile.read(length).decode('utf-8')
except SocketError as ex:
if ex.errno == errno.ECONNRESET:
print('EX: POST options_confirm_params ' +
'connection reset by peer')
else:
print('EX: POST options_confirm_params socket error')
self.send_response(400)
self.end_headers()
self.server.postreq_busy = False
return
except ValueError as ex:
print('EX: ' +
'POST options_confirm_params rfile.read failed, ' + str(ex))
self.send_response(400)
self.end_headers()
self.server.postreq_busy = False
return
options_confirm_params = \
urllib.parse.unquote_plus(options_confirm_params)
page_number = _person_options_page_number(options_confirm_params)
options_actor = _person_options_actor(options_confirm_params)
options_actor_moved = _person_options_moved_to(options_confirm_params)
options_avatar_url = _person_options_avatar_url(options_confirm_params)
post_url = _person_options_post_url(options_confirm_params)
petname = _person_options_petname(options_confirm_params)
person_notes = _person_options_notes(options_confirm_params)
# get the nickname
options_nickname = get_nickname_from_actor(options_actor)
if not options_nickname:
if calling_domain.endswith('.onion') and onion_domain:
origin_path_str = 'http://' + onion_domain + users_path
elif (calling_domain.endswith('.i2p') and i2p_domain):
origin_path_str = 'http://' + i2p_domain + users_path
print('WARN: unable to find nickname in ' + options_actor)
redirect_headers(self, origin_path_str, cookie, calling_domain, 303)
self.server.postreq_busy = False
return
options_domain, options_port = get_domain_from_actor(options_actor)
if not options_domain:
if calling_domain.endswith('.onion') and onion_domain:
origin_path_str = 'http://' + onion_domain + users_path
elif (calling_domain.endswith('.i2p') and i2p_domain):
origin_path_str = 'http://' + i2p_domain + users_path
print('WARN: unable to find domain in ' + options_actor)
redirect_headers(self, origin_path_str, cookie, calling_domain, 303)
self.server.postreq_busy = False
return
options_domain_full = get_full_domain(options_domain, options_port)
if chooser_nickname == options_nickname and \
options_domain == domain and \
options_port == port:
if debug:
print('You cannot perform an option action on yourself')
if _person_options_view(self, options_confirm_params,
debug,
options_actor,
key_shortcuts,
chooser_nickname,
account_timezone,
proxy_type,
bold_reading_nicknames,
authorized,
recent_posts_cache,
max_recent_posts,
translate,
base_dir,
users_path,
http_prefix,
domain,
port,
cached_webfingers,
person_cache,
project_version,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
default_timeline,
peertube_instances,
allow_local_network_access,
theme_name,
system_language,
max_like_count,
signing_priv_key_pem,
cw_lists,
lists_enabled,
onion_domain,
i2p_domain,
dogwhistles,
min_images_for_accounts,
buy_sites,
max_shares_on_profile,
no_of_books,
auto_cw_cache,
cookie,
2024-05-11 12:56:11 +00:00
calling_domain,
2024-05-11 12:58:42 +00:00
curr_session, access_keys):
2024-05-11 11:12:57 +00:00
return
if _person_option_receive_petname(self, options_confirm_params,
petname, debug,
options_nickname,
options_domain_full,
base_dir,
chooser_nickname,
domain,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_receive_notes(self, options_confirm_params,
debug,
options_nickname,
options_domain_full,
person_notes,
base_dir,
chooser_nickname,
domain,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_on_calendar(self, options_confirm_params,
base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_min_images(self, options_confirm_params,
base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_allow_announce(self, options_confirm_params,
base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_allow_quotes(self, options_confirm_params,
base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_notify(self, options_confirm_params,
base_dir,
chooser_nickname,
domain,
options_nickname,
options_domain_full,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_post_to_news(self, options_confirm_params,
chooser_nickname,
base_dir,
options_nickname,
options_domain,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_post_to_features(self, options_confirm_params,
chooser_nickname,
options_nickname,
base_dir,
options_domain,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_mod_news(self, options_confirm_params,
base_dir,
chooser_nickname,
options_nickname,
options_domain,
users_path,
default_timeline,
page_number,
cookie,
calling_domain):
return
if _person_options_block(self, options_confirm_params,
debug,
options_actor,
translate,
base_dir,
users_path,
options_avatar_url,
cookie, calling_domain):
return
if _person_options_unblock(self, options_confirm_params,
debug,
options_actor,
translate,
base_dir,
users_path,
options_avatar_url,
cookie, calling_domain):
return
if _person_options_follow(self, options_confirm_params,
debug, options_actor,
translate,
base_dir,
users_path,
options_avatar_url,
chooser_nickname,
domain,
cookie, calling_domain):
return
if _person_options_move(self, options_confirm_params,
options_actor_moved,
debug, translate,
base_dir, users_path,
options_avatar_url,
chooser_nickname, domain,
cookie, calling_domain):
return
if _person_options_unfollow(self, options_confirm_params,
options_actor, translate, base_dir,
users_path, options_avatar_url,
cookie, calling_domain):
return
2024-05-11 12:49:50 +00:00
if _person_options_dm(self, options_confirm_params,
debug, options_actor,
path, key_shortcuts,
base_dir, bold_reading_nicknames,
chooser_nickname, http_prefix,
domain_full, person_cache,
system_language,
default_post_language,
translate, page_number,
domain, default_timeline,
newswire, theme_name,
2024-04-14 13:38:28 +00:00
recent_posts_cache,
max_recent_posts,
curr_session,
2024-04-14 13:38:28 +00:00
cached_webfingers,
2024-05-11 12:49:50 +00:00
port, project_version,
2024-04-14 13:38:28 +00:00
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
peertube_instances,
allow_local_network_access,
max_like_count,
signing_priv_key_pem,
cw_lists,
lists_enabled,
dogwhistles,
min_images_for_accounts,
buy_sites,
2024-05-11 12:49:50 +00:00
auto_cw_cache,
2024-05-11 13:01:31 +00:00
cookie, calling_domain,
access_keys):
return
2024-05-11 12:49:50 +00:00
if _person_options_info(self, options_confirm_params,
base_dir, chooser_nickname,
debug, options_actor,
translate, http_prefix,
domain, system_language,
signing_priv_key_pem,
block_federated,
cookie, calling_domain):
return
2024-05-11 12:49:50 +00:00
if _person_options_snooze(self, options_confirm_params,
path, http_prefix,
domain_full, debug,
options_actor, base_dir,
domain, calling_domain,
onion_domain, i2p_domain,
default_timeline,
page_number,
cookie):
return
2024-05-11 12:49:50 +00:00
if _person_options_unsnooze(self, options_confirm_params,
path, http_prefix,
domain_full, debug,
options_actor,
base_dir, domain,
calling_domain,
onion_domain, i2p_domain,
default_timeline,
page_number, cookie):
return
2024-05-11 12:49:50 +00:00
if _person_options_report(self, options_confirm_params,
debug, path,
options_actor, key_shortcuts,
base_dir, bold_reading_nicknames,
chooser_nickname,
http_prefix, domain_full,
person_cache, system_language,
default_post_language,
translate, post_url,
page_number,
domain, default_timeline,
newswire,
theme_name,
recent_posts_cache,
max_recent_posts,
curr_session,
cached_webfingers, port,
project_version,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
peertube_instances,
allow_local_network_access,
max_like_count,
signing_priv_key_pem,
cw_lists,
lists_enabled,
dogwhistles,
min_images_for_accounts,
buy_sites,
auto_cw_cache,
2024-05-11 13:01:31 +00:00
cookie, calling_domain,
access_keys):
return
# redirect back from person options screen
if calling_domain.endswith('.onion') and onion_domain:
origin_path_str = 'http://' + onion_domain + users_path
elif calling_domain.endswith('.i2p') and i2p_domain:
origin_path_str = 'http://' + i2p_domain + users_path
2024-04-16 13:47:21 +00:00
redirect_headers(self, origin_path_str, cookie, calling_domain, 303)
self.server.postreq_busy = False
return