mirror of https://gitlab.com/bashrc2/epicyon
Move daemon theme designer functions to their own module
parent
1c2e32a616
commit
4ece904038
173
daemon_post.py
173
daemon_post.py
|
@ -16,7 +16,6 @@ from socket import error as SocketError
|
|||
from utils import dangerous_markup
|
||||
from utils import binary_is_image
|
||||
from utils import get_image_extension_from_mime_type
|
||||
from utils import load_json
|
||||
from utils import save_json
|
||||
from utils import is_editor
|
||||
from utils import get_config_param
|
||||
|
@ -51,9 +50,6 @@ from daemon_utils import get_user_agent
|
|||
from daemon_utils import post_to_outbox
|
||||
from daemon_utils import update_inbox_queue
|
||||
from daemon_utils import is_authorized
|
||||
from theme import reset_theme_designer_settings
|
||||
from theme import set_theme
|
||||
from theme import set_theme_from_designer
|
||||
from daemon_post_login import post_login_screen
|
||||
from daemon_post_receive import receive_new_post
|
||||
from daemon_post_profile import profile_edit
|
||||
|
@ -72,6 +68,7 @@ from daemon_post_remove import remove_share
|
|||
from daemon_post_remove import remove_wanted
|
||||
from daemon_post_remove import receive_remove_post
|
||||
from daemon_post_question import receive_vote
|
||||
from daemon_post_theme import theme_designer_edit
|
||||
|
||||
# maximum number of posts in a hashtag feed
|
||||
MAX_POSTS_IN_HASHTAG_FEED = 6
|
||||
|
@ -593,19 +590,19 @@ def daemon_http_post(self) -> None:
|
|||
allow_local_network_access = \
|
||||
self.server.allow_local_network_access
|
||||
|
||||
_theme_designer_edit(self, calling_domain, cookie,
|
||||
self.server.base_dir,
|
||||
self.server.http_prefix,
|
||||
nickname,
|
||||
self.server.domain,
|
||||
self.server.domain_full,
|
||||
self.server.onion_domain,
|
||||
self.server.i2p_domain,
|
||||
self.server.default_timeline,
|
||||
self.server.theme_name,
|
||||
allow_local_network_access,
|
||||
self.server.system_language,
|
||||
self.server.dyslexic_font)
|
||||
theme_designer_edit(self, calling_domain, cookie,
|
||||
self.server.base_dir,
|
||||
self.server.http_prefix,
|
||||
nickname,
|
||||
self.server.domain,
|
||||
self.server.domain_full,
|
||||
self.server.onion_domain,
|
||||
self.server.i2p_domain,
|
||||
self.server.default_timeline,
|
||||
self.server.theme_name,
|
||||
allow_local_network_access,
|
||||
self.server.system_language,
|
||||
self.server.dyslexic_font)
|
||||
self.server.postreq_busy = False
|
||||
return
|
||||
|
||||
|
@ -1129,148 +1126,6 @@ def _key_shortcuts(self, calling_domain: str, cookie: str,
|
|||
return
|
||||
|
||||
|
||||
def _theme_designer_edit(self, calling_domain: str, cookie: str,
|
||||
base_dir: str, http_prefix: str, nickname: str,
|
||||
domain: str, domain_full: str,
|
||||
onion_domain: str, i2p_domain: str,
|
||||
default_timeline: str, theme_name: str,
|
||||
allow_local_network_access: bool,
|
||||
system_language: str,
|
||||
dyslexic_font: bool) -> None:
|
||||
"""Receive POST from webapp_theme_designer
|
||||
"""
|
||||
users_path = '/users/' + nickname
|
||||
origin_path_str = \
|
||||
http_prefix + '://' + domain_full + users_path + '/' + \
|
||||
default_timeline
|
||||
length = int(self.headers['Content-length'])
|
||||
|
||||
try:
|
||||
theme_params = self.rfile.read(length).decode('utf-8')
|
||||
except SocketError as ex:
|
||||
if ex.errno == errno.ECONNRESET:
|
||||
print('EX: POST theme_params ' +
|
||||
'connection reset by peer')
|
||||
else:
|
||||
print('EX: POST theme_params socket error')
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.server.postreq_busy = False
|
||||
return
|
||||
except ValueError as ex:
|
||||
print('EX: POST theme_params rfile.read failed, ' + str(ex))
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.server.postreq_busy = False
|
||||
return
|
||||
theme_params = \
|
||||
urllib.parse.unquote_plus(theme_params)
|
||||
|
||||
# theme designer screen, reset button
|
||||
# See html_theme_designer
|
||||
if 'submitThemeDesignerReset=' in theme_params or \
|
||||
'submitThemeDesigner=' not in theme_params:
|
||||
if 'submitThemeDesignerReset=' in theme_params:
|
||||
reset_theme_designer_settings(base_dir)
|
||||
self.server.css_cache = {}
|
||||
set_theme(base_dir, theme_name, domain,
|
||||
allow_local_network_access, system_language,
|
||||
dyslexic_font, True)
|
||||
|
||||
if calling_domain.endswith('.onion') and onion_domain:
|
||||
origin_path_str = \
|
||||
'http://' + onion_domain + users_path + '/' + \
|
||||
default_timeline
|
||||
elif calling_domain.endswith('.i2p') and i2p_domain:
|
||||
origin_path_str = \
|
||||
'http://' + i2p_domain + users_path + \
|
||||
'/' + default_timeline
|
||||
redirect_headers(self, origin_path_str, cookie, calling_domain)
|
||||
self.server.postreq_busy = False
|
||||
return
|
||||
|
||||
fields = {}
|
||||
fields_list = theme_params.split('&')
|
||||
for field_str in fields_list:
|
||||
if '=' not in field_str:
|
||||
continue
|
||||
field_value = field_str.split('=')[1].strip()
|
||||
if not field_value:
|
||||
continue
|
||||
if field_value == 'on':
|
||||
field_value = 'True'
|
||||
fields_index = field_str.split('=')[0]
|
||||
fields[fields_index] = field_value
|
||||
|
||||
# Check for boolean values which are False.
|
||||
# These don't come through via theme_params,
|
||||
# so need to be checked separately
|
||||
theme_filename = base_dir + '/theme/' + theme_name + '/theme.json'
|
||||
theme_json = load_json(theme_filename)
|
||||
if theme_json:
|
||||
for variable_name, value in theme_json.items():
|
||||
variable_name = 'themeSetting_' + variable_name
|
||||
if value.lower() == 'false' or value.lower() == 'true':
|
||||
if variable_name not in fields:
|
||||
fields[variable_name] = 'False'
|
||||
|
||||
# get the parameters from the theme designer screen
|
||||
theme_designer_params = {}
|
||||
for variable_name, key in fields.items():
|
||||
if variable_name.startswith('themeSetting_'):
|
||||
variable_name = variable_name.replace('themeSetting_', '')
|
||||
theme_designer_params[variable_name] = key
|
||||
|
||||
self.server.css_cache = {}
|
||||
set_theme_from_designer(base_dir, theme_name, domain,
|
||||
theme_designer_params,
|
||||
allow_local_network_access,
|
||||
system_language, dyslexic_font)
|
||||
|
||||
# set boolean values
|
||||
if 'rss-icon-at-top' in theme_designer_params:
|
||||
if theme_designer_params['rss-icon-at-top'].lower() == 'true':
|
||||
self.server.rss_icon_at_top = True
|
||||
else:
|
||||
self.server.rss_icon_at_top = False
|
||||
if 'publish-button-at-top' in theme_designer_params:
|
||||
publish_button_at_top_str = \
|
||||
theme_designer_params['publish-button-at-top'].lower()
|
||||
if publish_button_at_top_str == 'true':
|
||||
self.server.publish_button_at_top = True
|
||||
else:
|
||||
self.server.publish_button_at_top = False
|
||||
if 'newswire-publish-icon' in theme_designer_params:
|
||||
newswire_publish_icon_str = \
|
||||
theme_designer_params['newswire-publish-icon'].lower()
|
||||
if newswire_publish_icon_str == 'true':
|
||||
self.server.show_publish_as_icon = True
|
||||
else:
|
||||
self.server.show_publish_as_icon = False
|
||||
if 'icons-as-buttons' in theme_designer_params:
|
||||
if theme_designer_params['icons-as-buttons'].lower() == 'true':
|
||||
self.server.icons_as_buttons = True
|
||||
else:
|
||||
self.server.icons_as_buttons = False
|
||||
if 'full-width-timeline-buttons' in theme_designer_params:
|
||||
theme_value = theme_designer_params['full-width-timeline-buttons']
|
||||
if theme_value.lower() == 'true':
|
||||
self.server.full_width_tl_button_header = True
|
||||
else:
|
||||
self.server.full_width_tl_button_header = False
|
||||
|
||||
# redirect back from theme designer screen
|
||||
if calling_domain.endswith('.onion') and onion_domain:
|
||||
origin_path_str = \
|
||||
'http://' + onion_domain + users_path + '/' + default_timeline
|
||||
elif calling_domain.endswith('.i2p') and i2p_domain:
|
||||
origin_path_str = \
|
||||
'http://' + i2p_domain + users_path + '/' + default_timeline
|
||||
redirect_headers(self, origin_path_str, cookie, calling_domain)
|
||||
self.server.postreq_busy = False
|
||||
return
|
||||
|
||||
|
||||
def _receive_image(self, length: int, path: str, base_dir: str,
|
||||
domain: str, debug: bool) -> None:
|
||||
"""Receives an image via POST
|
||||
|
|
|
@ -0,0 +1,159 @@
|
|||
__filename__ = "daemon_post_theme.py"
|
||||
__author__ = "Bob Mottram"
|
||||
__license__ = "AGPL3+"
|
||||
__version__ = "1.5.0"
|
||||
__maintainer__ = "Bob Mottram"
|
||||
__email__ = "bob@libreserver.org"
|
||||
__status__ = "Production"
|
||||
__module_group__ = "Core"
|
||||
|
||||
import errno
|
||||
import urllib.parse
|
||||
from socket import error as SocketError
|
||||
from theme import reset_theme_designer_settings
|
||||
from theme import set_theme
|
||||
from theme import set_theme_from_designer
|
||||
from httpheaders import redirect_headers
|
||||
from utils import load_json
|
||||
|
||||
|
||||
def theme_designer_edit(self, calling_domain: str, cookie: str,
|
||||
base_dir: str, http_prefix: str, nickname: str,
|
||||
domain: str, domain_full: str,
|
||||
onion_domain: str, i2p_domain: str,
|
||||
default_timeline: str, theme_name: str,
|
||||
allow_local_network_access: bool,
|
||||
system_language: str,
|
||||
dyslexic_font: bool) -> None:
|
||||
"""Receive POST from webapp_theme_designer
|
||||
"""
|
||||
users_path = '/users/' + nickname
|
||||
origin_path_str = \
|
||||
http_prefix + '://' + domain_full + users_path + '/' + \
|
||||
default_timeline
|
||||
length = int(self.headers['Content-length'])
|
||||
|
||||
try:
|
||||
theme_params = self.rfile.read(length).decode('utf-8')
|
||||
except SocketError as ex:
|
||||
if ex.errno == errno.ECONNRESET:
|
||||
print('EX: POST theme_params ' +
|
||||
'connection reset by peer')
|
||||
else:
|
||||
print('EX: POST theme_params socket error')
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.server.postreq_busy = False
|
||||
return
|
||||
except ValueError as ex:
|
||||
print('EX: POST theme_params rfile.read failed, ' + str(ex))
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.server.postreq_busy = False
|
||||
return
|
||||
theme_params = \
|
||||
urllib.parse.unquote_plus(theme_params)
|
||||
|
||||
# theme designer screen, reset button
|
||||
# See html_theme_designer
|
||||
if 'submitThemeDesignerReset=' in theme_params or \
|
||||
'submitThemeDesigner=' not in theme_params:
|
||||
if 'submitThemeDesignerReset=' in theme_params:
|
||||
reset_theme_designer_settings(base_dir)
|
||||
self.server.css_cache = {}
|
||||
set_theme(base_dir, theme_name, domain,
|
||||
allow_local_network_access, system_language,
|
||||
dyslexic_font, True)
|
||||
|
||||
if calling_domain.endswith('.onion') and onion_domain:
|
||||
origin_path_str = \
|
||||
'http://' + onion_domain + users_path + '/' + \
|
||||
default_timeline
|
||||
elif calling_domain.endswith('.i2p') and i2p_domain:
|
||||
origin_path_str = \
|
||||
'http://' + i2p_domain + users_path + \
|
||||
'/' + default_timeline
|
||||
redirect_headers(self, origin_path_str, cookie, calling_domain)
|
||||
self.server.postreq_busy = False
|
||||
return
|
||||
|
||||
fields = {}
|
||||
fields_list = theme_params.split('&')
|
||||
for field_str in fields_list:
|
||||
if '=' not in field_str:
|
||||
continue
|
||||
field_value = field_str.split('=')[1].strip()
|
||||
if not field_value:
|
||||
continue
|
||||
if field_value == 'on':
|
||||
field_value = 'True'
|
||||
fields_index = field_str.split('=')[0]
|
||||
fields[fields_index] = field_value
|
||||
|
||||
# Check for boolean values which are False.
|
||||
# These don't come through via theme_params,
|
||||
# so need to be checked separately
|
||||
theme_filename = base_dir + '/theme/' + theme_name + '/theme.json'
|
||||
theme_json = load_json(theme_filename)
|
||||
if theme_json:
|
||||
for variable_name, value in theme_json.items():
|
||||
variable_name = 'themeSetting_' + variable_name
|
||||
if value.lower() == 'false' or value.lower() == 'true':
|
||||
if variable_name not in fields:
|
||||
fields[variable_name] = 'False'
|
||||
|
||||
# get the parameters from the theme designer screen
|
||||
theme_designer_params = {}
|
||||
for variable_name, key in fields.items():
|
||||
if variable_name.startswith('themeSetting_'):
|
||||
variable_name = variable_name.replace('themeSetting_', '')
|
||||
theme_designer_params[variable_name] = key
|
||||
|
||||
self.server.css_cache = {}
|
||||
set_theme_from_designer(base_dir, theme_name, domain,
|
||||
theme_designer_params,
|
||||
allow_local_network_access,
|
||||
system_language, dyslexic_font)
|
||||
|
||||
# set boolean values
|
||||
if 'rss-icon-at-top' in theme_designer_params:
|
||||
if theme_designer_params['rss-icon-at-top'].lower() == 'true':
|
||||
self.server.rss_icon_at_top = True
|
||||
else:
|
||||
self.server.rss_icon_at_top = False
|
||||
if 'publish-button-at-top' in theme_designer_params:
|
||||
publish_button_at_top_str = \
|
||||
theme_designer_params['publish-button-at-top'].lower()
|
||||
if publish_button_at_top_str == 'true':
|
||||
self.server.publish_button_at_top = True
|
||||
else:
|
||||
self.server.publish_button_at_top = False
|
||||
if 'newswire-publish-icon' in theme_designer_params:
|
||||
newswire_publish_icon_str = \
|
||||
theme_designer_params['newswire-publish-icon'].lower()
|
||||
if newswire_publish_icon_str == 'true':
|
||||
self.server.show_publish_as_icon = True
|
||||
else:
|
||||
self.server.show_publish_as_icon = False
|
||||
if 'icons-as-buttons' in theme_designer_params:
|
||||
if theme_designer_params['icons-as-buttons'].lower() == 'true':
|
||||
self.server.icons_as_buttons = True
|
||||
else:
|
||||
self.server.icons_as_buttons = False
|
||||
if 'full-width-timeline-buttons' in theme_designer_params:
|
||||
theme_value = theme_designer_params['full-width-timeline-buttons']
|
||||
if theme_value.lower() == 'true':
|
||||
self.server.full_width_tl_button_header = True
|
||||
else:
|
||||
self.server.full_width_tl_button_header = False
|
||||
|
||||
# redirect back from theme designer screen
|
||||
if calling_domain.endswith('.onion') and onion_domain:
|
||||
origin_path_str = \
|
||||
'http://' + onion_domain + users_path + '/' + default_timeline
|
||||
elif calling_domain.endswith('.i2p') and i2p_domain:
|
||||
origin_path_str = \
|
||||
'http://' + i2p_domain + users_path + '/' + default_timeline
|
||||
redirect_headers(self, origin_path_str, cookie, calling_domain)
|
||||
self.server.postreq_busy = False
|
||||
return
|
Loading…
Reference in New Issue