From 7e4eea1d7615c4de30a2c80f4d83a99c47cba9b9 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sun, 20 Dec 2020 10:26:20 -0500 Subject: [PATCH 1/4] Cleanup obsolete code from first webUI iteration --- fHDHR_web/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fHDHR_web/__init__.py b/fHDHR_web/__init__.py index 565ca74..65eda08 100644 --- a/fHDHR_web/__init__.py +++ b/fHDHR_web/__init__.py @@ -83,7 +83,7 @@ class fHDHR_HTTP_Server(): methods=endpoint_methods) def isapath(self, item): - not_a_page_list = ["fhdhr", "htmlerror", "page_elements"] + not_a_page_list = ["fhdhr"] if item in not_a_page_list: return False elif item.startswith("__") and item.endswith("__"): From b12996b8bb360c40012c2631618adc5058a627b5 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sun, 20 Dec 2020 10:52:51 -0500 Subject: [PATCH 2/4] Create Flask Session system and mobile device detection --- fHDHR_web/__init__.py | 16 +++++++++++++++- fHDHR_web/pages/channels_editor.py | 4 ++-- fHDHR_web/pages/channels_html.py | 4 ++-- fHDHR_web/pages/cluster_html.py | 4 ++-- fHDHR_web/pages/diagnostics_html.py | 4 ++-- fHDHR_web/pages/guide_html.py | 4 ++-- fHDHR_web/pages/index_html.py | 4 ++-- fHDHR_web/pages/settings_html.py | 4 ++-- fHDHR_web/pages/tools.py | 4 ++-- fHDHR_web/pages/tuners_html.py | 4 ++-- fHDHR_web/pages/version_html.py | 4 ++-- fHDHR_web/pages/xmltv_html.py | 4 ++-- 12 files changed, 37 insertions(+), 23 deletions(-) diff --git a/fHDHR_web/__init__.py b/fHDHR_web/__init__.py index 65eda08..3071c8b 100644 --- a/fHDHR_web/__init__.py +++ b/fHDHR_web/__init__.py @@ -1,5 +1,5 @@ from gevent.pywsgi import WSGIServer -from flask import Flask, request +from flask import Flask, request, session from .pages import fHDHR_Pages from .files import fHDHR_Files @@ -22,9 +22,14 @@ class fHDHR_HTTP_Server(): self.fhdhr.logger.info("Loading Flask.") self.fhdhr.app = Flask("fHDHR", template_folder=self.template_folder) + + # Allow Internal API Usage self.fhdhr.app.testing = True self.fhdhr.api.client = self.fhdhr.app.test_client() + # Set Secret Key For Sessions + self.fhdhr.app.secret_key = self.fhdhr.config.dict["fhdhr"]["friendlyname"] + self.fhdhr.logger.info("Loading HTTP Pages Endpoints.") self.pages = fHDHR_Pages(fhdhr) self.add_endpoints(self.pages, "pages") @@ -57,12 +62,21 @@ class fHDHR_HTTP_Server(): self.fhdhr.logger.info("HTTP Server Online.") def before_request(self): + session["is_mobile"] = self.detect_mobile(request) self.fhdhr.logger.debug("Client %s requested %s Opening" % (request.method, request.path)) def after_request(self, response): self.fhdhr.logger.debug("Client %s requested %s Closing" % (request.method, request.path)) return response + def detect_mobile(self, request): + agent = request.headers.get('User-Agent') + phones = ["iphone", "android", "blackberry"] + if any(phone in agent.lower() for phone in phones): + return True + else: + return False + def add_endpoints(self, index_list, index_name): item_list = [x for x in dir(index_list) if self.isapath(x)] for item in item_list: diff --git a/fHDHR_web/pages/channels_editor.py b/fHDHR_web/pages/channels_editor.py index 2628843..4f3549f 100644 --- a/fHDHR_web/pages/channels_editor.py +++ b/fHDHR_web/pages/channels_editor.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session class Channels_Editor_HTML(): @@ -26,4 +26,4 @@ class Channels_Editor_HTML(): channelslist = sorted(channelslist, key=lambda i: i['number']) - return render_template('channels_editor.html', request=request, fhdhr=self.fhdhr, channelslist=channelslist) + return render_template('channels_editor.html', session=session, request=request, fhdhr=self.fhdhr, channelslist=channelslist) diff --git a/fHDHR_web/pages/channels_html.py b/fHDHR_web/pages/channels_html.py index ef82b72..8525e86 100644 --- a/fHDHR_web/pages/channels_html.py +++ b/fHDHR_web/pages/channels_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session class Channels_HTML(): @@ -33,4 +33,4 @@ class Channels_HTML(): channelslist = sorted(channelslist, key=lambda i: i['number']) - return render_template('channels.html', request=request, fhdhr=self.fhdhr, channelslist=channelslist, channels_dict=channels_dict, list=list) + return render_template('channels.html', session=session, request=request, fhdhr=self.fhdhr, channelslist=channelslist, channels_dict=channels_dict, list=list) diff --git a/fHDHR_web/pages/cluster_html.py b/fHDHR_web/pages/cluster_html.py index cc26a12..2f96119 100644 --- a/fHDHR_web/pages/cluster_html.py +++ b/fHDHR_web/pages/cluster_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session import urllib.parse @@ -47,4 +47,4 @@ class Cluster_HTML(): } locations_list.append(location_dict) - return render_template('cluster.html', request=request, fhdhr=self.fhdhr, locations_list=locations_list) + return render_template('cluster.html', session=session, request=request, fhdhr=self.fhdhr, locations_list=locations_list) diff --git a/fHDHR_web/pages/diagnostics_html.py b/fHDHR_web/pages/diagnostics_html.py index 04eda62..b5886d8 100644 --- a/fHDHR_web/pages/diagnostics_html.py +++ b/fHDHR_web/pages/diagnostics_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session class Diagnostics_HTML(): @@ -122,4 +122,4 @@ class Diagnostics_HTML(): "other": None, }) - return render_template('diagnostics.html', request=request, fhdhr=self.fhdhr, button_list=button_list) + return render_template('diagnostics.html', session=session, request=request, fhdhr=self.fhdhr, button_list=button_list) diff --git a/fHDHR_web/pages/guide_html.py b/fHDHR_web/pages/guide_html.py index d863a2d..4f1b6ec 100644 --- a/fHDHR_web/pages/guide_html.py +++ b/fHDHR_web/pages/guide_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session import datetime from fHDHR.tools import humanized_time @@ -92,4 +92,4 @@ class Guide_HTML(): chan_guide_list.append(chan_dict) - return render_template('guide.html', request=request, fhdhr=self.fhdhr, chan_guide_list=chan_guide_list, epg_methods=epg_methods, source=source) + return render_template('guide.html', session=session, request=request, fhdhr=self.fhdhr, chan_guide_list=chan_guide_list, epg_methods=epg_methods, source=source) diff --git a/fHDHR_web/pages/index_html.py b/fHDHR_web/pages/index_html.py index 9da681a..373ae6f 100644 --- a/fHDHR_web/pages/index_html.py +++ b/fHDHR_web/pages/index_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session class Index_HTML(): @@ -24,4 +24,4 @@ class Index_HTML(): "Tuner Usage": ("%s/%s" % (str(tuners_in_use), str(max_tuners))), } - return render_template('index.html', request=request, fhdhr=self.fhdhr, fhdhr_status_dict=fhdhr_status_dict, list=list) + return render_template('index.html', session=session, request=request, fhdhr=self.fhdhr, fhdhr_status_dict=fhdhr_status_dict, list=list) diff --git a/fHDHR_web/pages/settings_html.py b/fHDHR_web/pages/settings_html.py index de7d615..5b678b8 100644 --- a/fHDHR_web/pages/settings_html.py +++ b/fHDHR_web/pages/settings_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session class Settings_HTML(): @@ -30,4 +30,4 @@ class Settings_HTML(): if not len(web_settings_dict[config_section].keys()): del web_settings_dict[config_section] - return render_template('settings.html', request=request, fhdhr=self.fhdhr, web_settings_dict=web_settings_dict, list=list) + return render_template('settings.html', session=session, request=request, fhdhr=self.fhdhr, web_settings_dict=web_settings_dict, list=list) diff --git a/fHDHR_web/pages/tools.py b/fHDHR_web/pages/tools.py index 94c26aa..dc8a3cc 100644 --- a/fHDHR_web/pages/tools.py +++ b/fHDHR_web/pages/tools.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session class Tools_HTML(): @@ -13,4 +13,4 @@ class Tools_HTML(): def get(self, *args): - return render_template('tools.html', request=request, fhdhr=self.fhdhr) + return render_template('tools.html', session=session, request=request, fhdhr=self.fhdhr) diff --git a/fHDHR_web/pages/tuners_html.py b/fHDHR_web/pages/tuners_html.py index 787076b..f10db09 100644 --- a/fHDHR_web/pages/tuners_html.py +++ b/fHDHR_web/pages/tuners_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session from fHDHR.tools import humanized_filesize @@ -33,4 +33,4 @@ class Tuners_HTML(): tuner_list.append(tuner_dict) - return render_template('tuners.html', request=request, fhdhr=self.fhdhr, tuner_list=tuner_list, tuner_scanning=tuner_scanning) + return render_template('tuners.html', session=session, request=request, fhdhr=self.fhdhr, tuner_list=tuner_list, tuner_scanning=tuner_scanning) diff --git a/fHDHR_web/pages/version_html.py b/fHDHR_web/pages/version_html.py index 24eca65..f2b3598 100644 --- a/fHDHR_web/pages/version_html.py +++ b/fHDHR_web/pages/version_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session class Version_HTML(): @@ -15,4 +15,4 @@ class Version_HTML(): version_dict = {} for key in list(self.fhdhr.config.internal["versions"].keys()): version_dict[key] = self.fhdhr.config.internal["versions"][key] - return render_template('version.html', request=request, fhdhr=self.fhdhr, version_dict=version_dict, list=list) + return render_template('version.html', session=session, request=request, fhdhr=self.fhdhr, version_dict=version_dict, list=list) diff --git a/fHDHR_web/pages/xmltv_html.py b/fHDHR_web/pages/xmltv_html.py index 869f0b7..0f4c4f5 100644 --- a/fHDHR_web/pages/xmltv_html.py +++ b/fHDHR_web/pages/xmltv_html.py @@ -1,4 +1,4 @@ -from flask import request, render_template +from flask import request, render_template, session class xmlTV_HTML(): @@ -13,4 +13,4 @@ class xmlTV_HTML(): def get(self, *args): - return render_template('xmltv.html', request=request, fhdhr=self.fhdhr) + return render_template('xmltv.html', session=session, request=request, fhdhr=self.fhdhr) From 2cd30a38ca3d7038b09e2972c604ab408162e810 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sun, 20 Dec 2020 11:13:00 -0500 Subject: [PATCH 3/4] Use session to detect if PlexMediaServer --- fHDHR_web/__init__.py | 19 +++++++++++++++++-- fHDHR_web/api/root_url.py | 6 +++--- fHDHR_web/files/device_xml.py | 6 ++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/fHDHR_web/__init__.py b/fHDHR_web/__init__.py index 3071c8b..ef80fff 100644 --- a/fHDHR_web/__init__.py +++ b/fHDHR_web/__init__.py @@ -62,7 +62,15 @@ class fHDHR_HTTP_Server(): self.fhdhr.logger.info("HTTP Server Online.") def before_request(self): + session["is_mobile"] = self.detect_mobile(request) + if session["is_mobile"]: + self.fhdhr.logger.debug("Client is a mobile device.") + + session["is_plexmediaserver"] = self.detect_plexmediaserver(request) + if session["is_plexmediaserver"]: + self.fhdhr.logger.debug("Client is a Plex Media Server.") + self.fhdhr.logger.debug("Client %s requested %s Opening" % (request.method, request.path)) def after_request(self, response): @@ -70,9 +78,16 @@ class fHDHR_HTTP_Server(): return response def detect_mobile(self, request): - agent = request.headers.get('User-Agent') + user_agent = request.headers.get('User-Agent') phones = ["iphone", "android", "blackberry"] - if any(phone in agent.lower() for phone in phones): + if any(phone in user_agent.lower() for phone in phones): + return True + else: + return False + + def detect_plexmediaserver(self, request): + user_agent = request.headers.get('User-Agent') + if str(user_agent).lower().startswith("plexmediaserver"): return True else: return False diff --git a/fHDHR_web/api/root_url.py b/fHDHR_web/api/root_url.py index 68a8d75..acbedaf 100644 --- a/fHDHR_web/api/root_url.py +++ b/fHDHR_web/api/root_url.py @@ -1,4 +1,4 @@ -from flask import redirect, request +from flask import redirect, request, session class Root_URL(): @@ -17,10 +17,10 @@ class Root_URL(): user_agent = request.headers.get('User-Agent') # Client Devices Discovering Device Information - if not user_agent or str(user_agent).lower().startswith("plexmediaserver"): + if not user_agent or session["is_plexmediaserver"]: # Plex Remote Media Grabber redirect - if self.fhdhr.config.dict["rmg"]["enabled"] and str(user_agent).lower().startswith("plexmediaserver"): + if self.fhdhr.config.dict["rmg"]["enabled"] and session["is_plexmediaserver"]: return redirect("/rmg") # Client Device is looking for HDHR type device diff --git a/fHDHR_web/files/device_xml.py b/fHDHR_web/files/device_xml.py index 3bca8cf..031bf35 100644 --- a/fHDHR_web/files/device_xml.py +++ b/fHDHR_web/files/device_xml.py @@ -1,4 +1,4 @@ -from flask import request, redirect +from flask import redirect, session class Device_XML(): @@ -13,9 +13,7 @@ class Device_XML(): def get(self, *args): - user_agent = request.headers.get('User-Agent') - if (self.fhdhr.config.dict["rmg"]["enabled"] and - str(user_agent).lower().startswith("plexmediaserver")): + if self.fhdhr.config.dict["rmg"]["enabled"] and session["is_plexmediaserver"]: return redirect("/rmg/device.xml") else: return redirect("/hdhr/device.xml") From e3a264f24e3e9b06b08f300ffe8c1e8f02811caa Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sun, 20 Dec 2020 11:22:46 -0500 Subject: [PATCH 4/4] Use session to store the DeviceAuth --- fHDHR_web/__init__.py | 5 +++++ fHDHR_web/api/xmltv.py | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/fHDHR_web/__init__.py b/fHDHR_web/__init__.py index ef80fff..3749ac7 100644 --- a/fHDHR_web/__init__.py +++ b/fHDHR_web/__init__.py @@ -71,12 +71,17 @@ class fHDHR_HTTP_Server(): if session["is_plexmediaserver"]: self.fhdhr.logger.debug("Client is a Plex Media Server.") + session["deviceauth"] = self.detect_plexmediaserver(request) + self.fhdhr.logger.debug("Client %s requested %s Opening" % (request.method, request.path)) def after_request(self, response): self.fhdhr.logger.debug("Client %s requested %s Closing" % (request.method, request.path)) return response + def detect_deviceauth(self, request): + return request.args.get('DeviceAuth', default=None, type=str) + def detect_mobile(self, request): user_agent = request.headers.get('User-Agent') phones = ["iphone", "android", "blackberry"] diff --git a/fHDHR_web/api/xmltv.py b/fHDHR_web/api/xmltv.py index f13b6b0..200a435 100644 --- a/fHDHR_web/api/xmltv.py +++ b/fHDHR_web/api/xmltv.py @@ -1,4 +1,4 @@ -from flask import Response, request, redirect +from flask import Response, request, redirect, session import xml.etree.ElementTree from io import BytesIO import urllib.parse @@ -30,8 +30,7 @@ class xmlTV(): def get(self, *args): if self.fhdhr.config.dict["fhdhr"]["require_auth"]: - DeviceAuth = request.args.get('DeviceAuth', default=None, type=str) - if DeviceAuth != self.fhdhr.config.dict["fhdhr"]["device_auth"]: + if session["deviceauth"] != self.fhdhr.config.dict["fhdhr"]["device_auth"]: return "not subscribed" base_url = request.url_root[:-1]