epicyon/daemon_get_timeline.py

2384 lines
110 KiB
Python

__filename__ = "daemon_get_timeline.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
__version__ = "1.5.0"
__maintainer__ = "Bob Mottram"
__email__ = "bob@libreserver.org"
__status__ = "Production"
__module_group__ = "Core GET"
import json
from securemode import secure_mode
from posts import is_moderator
from utils import is_artist
from utils import is_editor
from utils import convert_domains
from utils import get_json_content_from_accept
from httpheaders import set_headers
from httpcodes import http_404
from httpcodes import write2
from httprequests import request_http
from person import person_box_json
from webapp_minimalbutton import is_minimal
from webapp_timeline import html_outbox
from webapp_timeline import html_bookmarks
from webapp_timeline import html_wanted
from webapp_timeline import html_shares
from webapp_timeline import html_inbox_dms
from webapp_timeline import html_inbox_features
from webapp_timeline import html_inbox_news
from webapp_timeline import html_inbox_blogs
from webapp_timeline import html_inbox_media
from webapp_timeline import html_inbox_replies
from webapp_timeline import html_inbox
from webapp_moderation import html_moderation
from fitnessFunctions import fitness_performance
def show_media_timeline(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_media_feed: int,
recent_posts_cache: {},
positive_voting: bool,
voting_time_mins: int,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
allow_local_network_access: bool,
twitter_replacement_domain: str,
account_timezone: {},
bold_reading_nicknames: {},
reverse_sequence_nicknames: bool,
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
show_published_date_only: bool,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: {},
buy_sites: [],
auto_cw_cache: {},
fitness: {},
full_width_tl_button_header: bool,
onion_domain: str,
i2p_domain: str,
hide_announces: {}) -> bool:
"""Shows the media timeline
"""
if '/users/' in path:
if authorized:
inbox_media_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_media_feed, 'tlmedia',
True,
0, positive_voting,
voting_time_mins)
if not inbox_media_feed:
inbox_media_feed = []
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlmedia', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
inbox_media_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_media_feed, 'tlmedia',
True,
0, positive_voting,
voting_time_mins)
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = \
key_shortcuts[nickname]
fed_domains = shared_items_federated_domains
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
last_post_id = None
if ';lastpost=' in path:
last_post_id = path.split(';lastpost=')[1]
if ';' in last_post_id:
last_post_id = last_post_id.split(';')[0]
show_announces = True
if hide_announces.get(nickname):
show_announces = False
msg = \
html_inbox_media(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_media_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
inbox_media_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized,
theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
fed_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles, ua_str,
min_images_for_accounts,
reverse_sequence, last_post_id,
buy_sites,
auto_cw_cache,
show_announces)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time,
fitness,
'_GET', '_show_media_timeline',
debug)
else:
# don't need authorized fetch here because there is
# already the authorization check
msg_str = json.dumps(inbox_media_feed,
ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str, http_prefix,
domain,
onion_domain, i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_media_timeline json',
debug)
return True
if debug:
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlmedia', '')
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if path != '/tlmedia':
# not the media inbox
if debug:
print('DEBUG: GET access to inbox is unauthorized')
self.send_response(405)
self.end_headers()
return True
return False
def show_blogs_timeline(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_blogs_feed: int,
recent_posts_cache: {},
positive_voting: bool,
voting_time_mins: int,
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
allow_local_network_access: bool,
twitter_replacement_domain: str,
account_timezone: {},
bold_reading_nicknames: {},
reverse_sequence_nicknames: [],
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
show_published_date_only: bool,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: [],
auto_cw_cache: {},
fitness: {},
onion_domain: str,
i2p_domain: str) -> bool:
"""Shows the blogs timeline
"""
if '/users/' in path:
if authorized:
inbox_blogs_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_blogs_feed, 'tlblogs',
True,
0, positive_voting,
voting_time_mins)
if not inbox_blogs_feed:
inbox_blogs_feed = []
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlblogs', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
inbox_blogs_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_blogs_feed, 'tlblogs',
True,
0, positive_voting,
voting_time_mins)
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
fed_domains = shared_items_federated_domains
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
last_post_id = None
if ';lastpost=' in path:
last_post_id = path.split(';lastpost=')[1]
if ';' in last_post_id:
last_post_id = last_post_id.split(';')[0]
msg = \
html_inbox_blogs(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_blogs_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
inbox_blogs_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized,
theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
fed_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles, ua_str,
min_images_for_accounts,
reverse_sequence, last_post_id,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_blogs_timeline',
debug)
else:
# don't need authorized fetch here because there is
# already the authorization check
msg_str = json.dumps(inbox_blogs_feed,
ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str, http_prefix,
domain,
onion_domain, i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_blogs_timeline json',
debug)
return True
if debug:
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlblogs', '')
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if path != '/tlblogs':
# not the blogs inbox
if debug:
print('DEBUG: GET access to blogs is unauthorized')
self.send_response(405)
self.end_headers()
return True
return False
def show_news_timeline(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_news_feed: int,
recent_posts_cache: {},
newswire_votes_threshold: int,
positive_voting: bool,
voting_time_mins: int,
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
account_timezone: {},
bold_reading_nicknames: {},
reverse_sequence_nicknames: [],
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
twitter_replacement_domain: str,
show_published_date_only: bool,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
allow_local_network_access: bool,
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: [],
auto_cw_cache: {},
fitness: {},
onion_domain: str,
i2p_domain: str) -> bool:
"""Shows the news timeline
"""
if '/users/' in path:
if authorized:
inbox_news_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_news_feed, 'tlnews',
True,
newswire_votes_threshold,
positive_voting,
voting_time_mins)
if not inbox_news_feed:
inbox_news_feed = []
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlnews', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
inbox_news_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_news_feed, 'tlnews',
True,
newswire_votes_threshold,
positive_voting,
voting_time_mins)
curr_nickname = path.split('/users/')[1]
if '/' in curr_nickname:
curr_nickname = curr_nickname.split('/')[0]
moderator = is_moderator(base_dir, curr_nickname)
editor = is_editor(base_dir, curr_nickname)
artist = is_artist(base_dir, curr_nickname)
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
fed_domains = shared_items_federated_domains
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
msg = \
html_inbox_news(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_news_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
inbox_news_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
moderator, editor, artist,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized,
theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
fed_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles, ua_str,
min_images_for_accounts,
reverse_sequence,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_news_timeline',
debug)
else:
# don't need authorized fetch here because there is
# already the authorization check
msg_str = json.dumps(inbox_news_feed,
ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str, http_prefix,
domain,
onion_domain, i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_news_timeline json',
debug)
return True
if debug:
nickname = 'news'
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if path != '/tlnews':
# not the news inbox
if debug:
print('DEBUG: GET access to news is unauthorized')
self.send_response(405)
self.end_headers()
return True
return False
def show_features_timeline(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str, base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_news_feed: int,
recent_posts_cache: {},
newswire_votes_threshold: int,
positive_voting: bool,
voting_time_mins: int,
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
allow_local_network_access: bool,
twitter_replacement_domain: str,
show_published_date_only: bool,
account_timezone: {},
bold_reading_nicknames: {},
min_images_for_accounts: [],
reverse_sequence_nicknames: [],
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
buy_sites: [],
auto_cw_cache: {},
fitness: {},
onion_domain: str,
i2p_domain: str) -> bool:
"""Shows the features timeline (all local blogs)
"""
if '/users/' in path:
if authorized:
inbox_features_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_news_feed, 'tlfeatures',
True,
newswire_votes_threshold,
positive_voting,
voting_time_mins)
if not inbox_features_feed:
inbox_features_feed = []
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlfeatures', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
inbox_features_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_news_feed,
'tlfeatures',
True,
newswire_votes_threshold,
positive_voting,
voting_time_mins)
curr_nickname = path.split('/users/')[1]
if '/' in curr_nickname:
curr_nickname = curr_nickname.split('/')[0]
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
msg = \
html_inbox_features(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number,
max_posts_in_news_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
inbox_features_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized,
theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles, ua_str,
min_images_for_accounts,
reverse_sequence,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_features_timeline',
debug)
else:
# don't need authorized fetch here because there is
# already the authorization check
msg_str = json.dumps(inbox_features_feed,
ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str,
http_prefix,
domain,
onion_domain, i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_features_timeline json',
debug)
return True
if debug:
nickname = 'news'
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if path != '/tlfeatures':
# not the features inbox
if debug:
print('DEBUG: GET access to features is unauthorized')
self.send_response(405)
self.end_headers()
return True
return False
def show_shares_timeline(self, authorized: bool,
calling_domain: str, path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_feed: int,
access_keys: {},
key_shortcuts: {},
full_width_tl_button_header: bool,
account_timezone: {},
bold_reading_nicknames: {},
reverse_sequence_nicknames: [],
default_timeline: str,
recent_posts_cache: {},
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
twitter_replacement_domain: str,
show_published_date_only: bool,
newswire: {},
positive_voting: bool,
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
allow_local_network_access: bool,
text_mode_banner: str,
system_language: str,
max_like_count: int,
shared_items_federated_domains: [],
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: [],
auto_cw_cache: {},
fitness: {}) -> bool:
"""Shows the shares timeline
"""
if '/users/' in path:
if authorized:
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlshares', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
msg = \
html_shares(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
allow_deletion,
http_prefix,
project_version,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized, theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled, timezone,
bold_reading, dogwhistles,
ua_str,
min_images_for_accounts,
reverse_sequence,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_shares_timeline',
debug)
return True
# not the shares timeline
if debug:
print('DEBUG: GET access to shares timeline is unauthorized')
self.send_response(405)
self.end_headers()
return True
def show_wanted_timeline(self, authorized: bool,
calling_domain: str, path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_feed: int,
access_keys: {},
key_shortcuts: {},
full_width_tl_button_header: bool,
account_timezone: {},
bold_reading_nicknames: {},
reverse_sequence_nicknames: [],
default_timeline: str,
recent_posts_cache: {},
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
twitter_replacement_domain: str,
show_published_date_only: bool,
newswire: {},
positive_voting: bool,
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
allow_local_network_access: bool,
text_mode_banner: str,
system_language: str,
max_like_count: int,
shared_items_federated_domains: [],
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: [],
auto_cw_cache: {},
fitness: {}) -> bool:
"""Shows the wanted timeline
"""
if '/users/' in path:
if authorized:
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlwanted', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
msg = \
html_wanted(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
allow_deletion,
http_prefix,
project_version,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized, theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles, ua_str,
min_images_for_accounts,
reverse_sequence,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_wanted_timeline',
debug)
return True
# not the shares timeline
if debug:
print('DEBUG: GET access to wanted timeline is unauthorized')
self.send_response(405)
self.end_headers()
return True
def show_bookmarks_timeline(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_feed: int,
recent_posts_cache: {},
positive_voting: bool,
voting_time_mins: int,
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
allow_local_network_access: bool,
twitter_replacement_domain: str,
show_published_date_only: bool,
account_timezone: {},
bold_reading_nicknames: {},
reverse_sequence_nicknames: [],
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: [],
auto_cw_cache: {},
fitness: {},
onion_domain: str,
i2p_domain: str) -> bool:
"""Shows the bookmarks timeline
"""
if '/users/' in path:
if authorized:
bookmarks_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_feed, 'tlbookmarks',
authorized,
0, positive_voting,
voting_time_mins)
if bookmarks_feed:
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlbookmarks', '')
nickname = nickname.replace('/bookmarks', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
bookmarks_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_feed,
'tlbookmarks',
authorized,
0, positive_voting,
voting_time_mins)
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
msg = \
html_bookmarks(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
bookmarks_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized,
theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles, ua_str,
min_images_for_accounts,
reverse_sequence,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_bookmarks_timeline',
debug)
else:
# don't need authorized fetch here because
# there is already the authorization check
msg_str = json.dumps(bookmarks_feed,
ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str, http_prefix,
domain,
onion_domain,
i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness, '_GET',
'_show_bookmarks_timeline json',
debug)
return True
else:
if debug:
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlbookmarks', '')
nickname = nickname.replace('/bookmarks', '')
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if debug:
print('DEBUG: GET access to bookmarks is unauthorized')
self.send_response(405)
self.end_headers()
return True
def show_outbox_timeline(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
proxy_type: str,
max_posts_in_feed: int,
recent_posts_cache: {},
newswire_votes_threshold: int,
positive_voting: bool,
voting_time_mins: int,
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
account_timezone: {},
bold_reading_nicknames: {},
reverse_sequence_nicknames: [],
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
twitter_replacement_domain: str,
show_published_date_only: bool,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
allow_local_network_access: bool,
text_mode_banner: str,
system_language: str,
max_like_count: int,
shared_items_federated_domains: [],
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: {},
auto_cw_cache: {},
fitness: {},
onion_domain: str,
i2p_domain: str,
hide_announces: {}) -> bool:
"""Shows the outbox timeline
"""
# get outbox feed for a person
outbox_feed = \
person_box_json(recent_posts_cache,
base_dir, domain, port, path,
http_prefix, max_posts_in_feed, 'outbox',
authorized,
newswire_votes_threshold,
positive_voting,
voting_time_mins)
if outbox_feed:
nickname = \
path.replace('/users/', '').replace('/outbox', '')
page_number = 0
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
else:
if request_http(self.headers, debug):
page_number = 1
if authorized and page_number >= 1:
# if a page wasn't specified then show the first one
page_str = '?page=' + str(page_number)
outbox_feed = \
person_box_json(recent_posts_cache,
base_dir, domain, port,
path + page_str,
http_prefix,
max_posts_in_feed, 'outbox',
authorized,
newswire_votes_threshold,
positive_voting,
voting_time_mins)
else:
page_number = 1
if request_http(self.headers, debug):
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
show_announces = True
if hide_announces.get(nickname):
show_announces = False
msg = \
html_outbox(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname, domain, port,
outbox_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized,
theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles, ua_str,
min_images_for_accounts,
reverse_sequence,
buy_sites,
auto_cw_cache,
show_announces)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_outbox_timeline',
debug)
else:
if secure_mode(curr_session, proxy_type, False,
self.server, self.headers, self.path):
msg_str = json.dumps(outbox_feed,
ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str, http_prefix,
domain,
onion_domain,
i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_outbox_timeline json',
debug)
else:
http_404(self, 76)
return True
return False
def show_mod_timeline(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str, base_dir: str, http_prefix: str,
domain: str, port: int, getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_feed: int,
recent_posts_cache: {},
positive_voting: bool,
voting_time_mins: int,
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
twitter_replacement_domain: str,
allow_local_network_access: bool,
show_published_date_only: bool,
account_timezone: {},
bold_reading_nicknames: {},
min_images_for_accounts: [],
reverse_sequence_nicknames: [],
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
project_version: str,
yt_replace_domain: str,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
buy_sites: [],
auto_cw_cache: {},
fitness: {},
onion_domain: str,
i2p_domain: str) -> bool:
"""Shows the moderation timeline
"""
if '/users/' in path:
if authorized:
moderation_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_feed, 'moderation',
True,
0, positive_voting,
voting_time_mins)
if moderation_feed:
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/moderation', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
moderation_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_feed,
'moderation',
True,
0, positive_voting,
voting_time_mins)
moderation_action_str = ''
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
msg = \
html_moderation(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
moderation_feed,
True,
http_prefix,
project_version,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized, moderation_action_str,
theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles,
ua_str,
min_images_for_accounts,
reverse_sequence,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_mod_timeline',
debug)
else:
# don't need authorized fetch here because
# there is already the authorization check
msg_str = json.dumps(moderation_feed,
ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str, http_prefix,
domain,
onion_domain,
i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_mod_timeline json',
debug)
return True
else:
if debug:
nickname = path.replace('/users/', '')
nickname = nickname.replace('/moderation', '')
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if debug:
print('DEBUG: GET access to moderation feed is unauthorized')
self.send_response(405)
self.end_headers()
return True
def show_dms(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str, base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_feed: int,
recent_posts_cache: {},
positive_voting: bool,
voting_time_mins: int,
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
allow_local_network_access: bool,
twitter_replacement_domain: str,
show_published_date_only: bool,
account_timezone: {},
bold_reading_nicknames: [],
reverse_sequence_nicknames: [],
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: [],
auto_cw_cache: {},
fitness: {},
onion_domain: str,
i2p_domain: str) -> bool:
"""Shows the DMs timeline
"""
if '/users/' in path:
if authorized:
inbox_dm_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_feed, 'dm',
authorized,
0, positive_voting,
voting_time_mins)
if inbox_dm_feed:
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/dm', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
inbox_dm_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_feed, 'dm',
authorized,
0,
positive_voting,
voting_time_mins)
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
last_post_id = None
if ';lastpost=' in path:
last_post_id = path.split(';lastpost=')[1]
if ';' in last_post_id:
last_post_id = last_post_id.split(';')[0]
msg = \
html_inbox_dms(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
inbox_dm_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized, theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles, ua_str,
min_images_for_accounts,
reverse_sequence, last_post_id,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_dms', debug)
else:
# don't need authorized fetch here because
# there is already the authorization check
msg_str = \
json.dumps(inbox_dm_feed, ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str, http_prefix,
domain,
onion_domain,
i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_dms json',
debug)
return True
else:
if debug:
nickname = path.replace('/users/', '')
nickname = nickname.replace('/dm', '')
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if path != '/dm':
# not the DM inbox
if debug:
print('DEBUG: GET access to DM timeline is unauthorized')
self.send_response(405)
self.end_headers()
return True
return False
def show_replies(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
curr_session, ua_str: str,
max_posts_in_feed: int,
recent_posts_cache: {},
positive_voting: bool,
voting_time_mins: int,
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
allow_local_network_access: bool,
twitter_replacement_domain: str,
show_published_date_only: bool,
account_timezone: {},
bold_reading_nicknames: [],
reverse_sequence_nicknames: [],
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: [],
auto_cw_cache: {},
fitness: {},
onion_domain: str,
i2p_domain: str) -> bool:
"""Shows the replies timeline
"""
if '/users/' in path:
if authorized:
inbox_replies_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_feed, 'tlreplies',
True,
0, positive_voting,
voting_time_mins)
if not inbox_replies_feed:
inbox_replies_feed = []
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlreplies', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
inbox_replies_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_feed, 'tlreplies',
True,
0, positive_voting,
voting_time_mins)
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
last_post_id = None
if ';lastpost=' in path:
last_post_id = path.split(';lastpost=')[1]
if ';' in last_post_id:
last_post_id = last_post_id.split(';')[0]
msg = \
html_inbox_replies(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
inbox_replies_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized, theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles,
ua_str,
min_images_for_accounts,
reverse_sequence, last_post_id,
buy_sites,
auto_cw_cache)
msg = msg.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_replies',
debug)
else:
# don't need authorized fetch here because there is
# already the authorization check
msg_str = json.dumps(inbox_replies_feed,
ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str, http_prefix,
domain,
onion_domain, i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_replies json',
debug)
return True
if debug:
nickname = path.replace('/users/', '')
nickname = nickname.replace('/tlreplies', '')
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if path != '/tlreplies':
# not the replies inbox
if debug:
print('DEBUG: GET access to inbox is unauthorized')
self.send_response(405)
self.end_headers()
return True
return False
def show_inbox(self, authorized: bool,
calling_domain: str, referer_domain: str,
path: str,
base_dir: str, http_prefix: str,
domain: str, port: int,
getreq_start_time,
cookie: str, debug: str,
recent_posts_cache: {}, curr_session,
default_timeline: str,
max_recent_posts: int,
translate: {},
cached_webfingers: {},
person_cache: {},
allow_deletion: bool,
project_version: str,
yt_replace_domain: str,
twitter_replacement_domain: str,
ua_str: str,
max_posts_in_feed: int,
positive_voting: bool,
voting_time_mins: int,
fitness: {},
full_width_tl_button_header: bool,
access_keys: {},
key_shortcuts: {},
shared_items_federated_domains: [],
allow_local_network_access: bool,
account_timezone: {},
bold_reading_nicknames: {},
reverse_sequence_nicknames: [],
show_published_date_only: bool,
newswire: {},
show_publish_as_icon: bool,
icons_as_buttons: bool,
rss_icon_at_top: bool,
publish_button_at_top: bool,
theme_name: str,
peertube_instances: [],
text_mode_banner: str,
system_language: str,
max_like_count: int,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: {},
dogwhistles: {},
min_images_for_accounts: [],
buy_sites: [],
auto_cw_cache: {},
onion_domain: str,
i2p_domain: str,
hide_announces: {}) -> bool:
"""Shows the inbox timeline
"""
if '/users/' in path:
if authorized:
inbox_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path,
http_prefix,
max_posts_in_feed, 'inbox',
authorized,
0,
positive_voting,
voting_time_mins)
if inbox_feed:
if getreq_start_time:
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_inbox',
debug)
if request_http(self.headers, debug):
nickname = path.replace('/users/', '')
nickname = nickname.replace('/inbox', '')
page_number = 1
if '?page=' in nickname:
page_number = nickname.split('?page=')[1]
if ';' in page_number:
page_number = page_number.split(';')[0]
nickname = nickname.split('?page=')[0]
if len(page_number) > 5:
page_number = "1"
if page_number.isdigit():
page_number = int(page_number)
else:
page_number = 1
if 'page=' not in path:
# if no page was specified then show the first
inbox_feed = \
person_box_json(recent_posts_cache,
base_dir,
domain,
port,
path + '?page=1',
http_prefix,
max_posts_in_feed, 'inbox',
authorized,
0,
positive_voting,
voting_time_mins)
if getreq_start_time:
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_inbox2',
debug)
minimal_nick = is_minimal(base_dir, domain, nickname)
if key_shortcuts.get(nickname):
access_keys = key_shortcuts[nickname]
timezone = None
if account_timezone.get(nickname):
timezone = account_timezone.get(nickname)
bold_reading = False
if bold_reading_nicknames.get(nickname):
bold_reading = True
reverse_sequence = False
if nickname in reverse_sequence_nicknames:
reverse_sequence = True
last_post_id = None
if ';lastpost=' in path:
last_post_id = path.split(';lastpost=')[1]
if ';' in last_post_id:
last_post_id = last_post_id.split(';')[0]
show_announces = True
if hide_announces.get(nickname):
show_announces = False
msg = \
html_inbox(default_timeline,
recent_posts_cache,
max_recent_posts,
translate,
page_number, max_posts_in_feed,
curr_session,
base_dir,
cached_webfingers,
person_cache,
nickname,
domain,
port,
inbox_feed,
allow_deletion,
http_prefix,
project_version,
minimal_nick,
yt_replace_domain,
twitter_replacement_domain,
show_published_date_only,
newswire,
positive_voting,
show_publish_as_icon,
full_width_tl_button_header,
icons_as_buttons,
rss_icon_at_top,
publish_button_at_top,
authorized,
theme_name,
peertube_instances,
allow_local_network_access,
text_mode_banner,
access_keys,
system_language,
max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists,
lists_enabled,
timezone, bold_reading,
dogwhistles,
ua_str,
min_images_for_accounts,
reverse_sequence, last_post_id,
buy_sites,
auto_cw_cache,
show_announces)
if getreq_start_time:
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_inbox3',
debug)
if msg:
msg_str = msg
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str,
http_prefix,
domain,
onion_domain,
i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
set_headers(self, 'text/html', msglen,
cookie, calling_domain, False)
write2(self, msg)
if getreq_start_time:
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_inbox4',
debug)
else:
# don't need authorized fetch here because
# there is already the authorization check
msg_str = json.dumps(inbox_feed, ensure_ascii=False)
msg_str = convert_domains(calling_domain,
referer_domain,
msg_str,
http_prefix,
domain,
onion_domain,
i2p_domain)
msg = msg_str.encode('utf-8')
msglen = len(msg)
accept_str = self.headers['Accept']
protocol_str = \
get_json_content_from_accept(accept_str)
set_headers(self, protocol_str, msglen,
None, calling_domain, False)
write2(self, msg)
fitness_performance(getreq_start_time, fitness,
'_GET', '_show_inbox5',
debug)
return True
else:
if debug:
nickname = path.replace('/users/', '')
nickname = nickname.replace('/inbox', '')
print('DEBUG: ' + nickname +
' was not authorized to access ' + path)
if path != '/inbox':
# not the shared inbox
if debug:
print('DEBUG: GET access to inbox is unauthorized')
self.send_response(405)
self.end_headers()
return True
return False