From a1bda39e9d129cb077836c5e7793833109ad7b64 Mon Sep 17 00:00:00 2001 From: croneter Date: Fri, 21 Feb 2020 08:22:09 +0100 Subject: [PATCH 1/3] Correctly detect whether we can use SSL to connect to the PMS --- resources/lib/plex_functions.py | 39 ++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/resources/lib/plex_functions.py b/resources/lib/plex_functions.py index 52e403d7..c9e29491 100644 --- a/resources/lib/plex_functions.py +++ b/resources/lib/plex_functions.py @@ -846,28 +846,31 @@ def _pms_https_enabled(url): Prefers HTTPS over HTTP """ - res = DU().downloadUrl('https://%s/identity' % url, - authenticate=False, - verifySSL=True if v.KODIVERSION >= 18 else False) + # Try HTTPS first try: - res.attrib - except AttributeError: - # Might have SSL deactivated. Try with http - res = DU().downloadUrl('http://%s/identity' % url, - authenticate=False, - verifySSL=True if v.KODIVERSION >= 18 else False) - try: - res.attrib - except AttributeError: - LOG.error("Could not contact PMS %s", url) - return None - else: - # Received a valid XML. Server wants to talk HTTP - return False + DU().downloadUrl('https://%s/identity' % url, + authenticate=False, + reraise=True) + except exceptions.SSLError: + LOG.debug('SSLError trying to connect to https://%s/identity', url) + except Exception as e: + LOG.info('Couldnt check https connection to https://%s/identity: %s', + url, e) else: - # Received a valid XML. Server wants to talk HTTPS return True + # Try HTTP next + try: + DU().downloadUrl('http://%s/identity' % url, + authenticate=False, + reraise=True) + except Exception as e: + LOG.info('Couldnt check http connection to http://%s/identity: %s', + url, e) + return + else: + return False + def GetMachineIdentifier(url): """ From 83598ff3f1232fee331d0b0efc0b555e66f434a5 Mon Sep 17 00:00:00 2001 From: croneter Date: Fri, 21 Feb 2020 08:40:41 +0100 Subject: [PATCH 2/3] Fix PKC auto-connecting to a local PMS --- resources/lib/initialsetup.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/resources/lib/initialsetup.py b/resources/lib/initialsetup.py index 809300b6..b8536dec 100644 --- a/resources/lib/initialsetup.py +++ b/resources/lib/initialsetup.py @@ -241,20 +241,18 @@ class InitialSetup(object): """ Checks for server's connectivity. Returns check_connection result """ - # Re-direct via plex if remote - will lead to the correct SSL - # certificate if server['local']: - url = ('%s://%s:%s' - % (server['scheme'], server['ip'], server['port'])) # Deactive SSL verification if the server is local for Kodi 17 verifySSL = True if v.KODIVERSION >= 18 else False else: - url = server['baseURL'] verifySSL = True - chk = PF.check_connection(url, - token=server['token'], - verifySSL=verifySSL) - return chk + if not server['token']: + # Plex GDM: we only get the token from plex.tv after + # Sign-in to plex.tv + server['token'] = utils.settings('plexToken') or None + return PF.check_connection(server['baseURL'], + token=server['token'], + verifySSL=verifySSL) def pick_pms(self, showDialog=False, inform_of_search=False): """ From cad59235466b50682adbb783613339274b1b6a0d Mon Sep 17 00:00:00 2001 From: croneter Date: Fri, 21 Feb 2020 09:12:59 +0100 Subject: [PATCH 3/3] Improve logic to connect to local PMS via plex.direct redirect --- resources/lib/plex_functions.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/resources/lib/plex_functions.py b/resources/lib/plex_functions.py index c9e29491..045d1a5f 100644 --- a/resources/lib/plex_functions.py +++ b/resources/lib/plex_functions.py @@ -210,24 +210,31 @@ def discover_pms(token=None): if pms['machineIdentifier'] == plex_pms['machineIdentifier']: break else: - # Only found PMS using GDM - add it to the PMS from plex.tv - https = _pms_https_enabled('%s:%s' % (pms['ip'], pms['port'])) - if https is None: - # Error contacting url. Skip and ignore this PMS for now - LOG.error('Could not contact PMS %s but we should have', pms) - continue - elif https is True: - pms['scheme'] = 'https' - else: - pms['scheme'] = 'http' - pms['baseURL'] = '%s://%s:%s' % (pms['scheme'], - pms['ip'], - pms['port']) + # Only found PMS using GDM. Check whether we can use baseURL + # (which is in a different format) or need to connect directly + if not _correct_baseurl(pms, + '%s:%s' % (pms['baseURL'], pms['port'])): + if not _correct_baseurl(pms, + '%s:%s' % (pms['ip'], pms['port'])): + continue plex_pms_list.append(pms) _log_pms(plex_pms_list) return plex_pms_list +def _correct_baseurl(pms, url): + https = _pms_https_enabled(url) + if https is None: + # Error contacting url + return False + elif https is True: + pms['scheme'] = 'https' + else: + pms['scheme'] = 'http' + pms['baseURL'] = '%s://%s' % (pms['scheme'], url) + return True + + def _log_pms(pms_list): log_list = deepcopy(pms_list) for pms in log_list: