From c17bf79d7929a9f8e10e2c20064c0d3021de27a0 Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Sun, 31 Jan 2016 11:32:44 -0800 Subject: [PATCH] Fix server verification for unpublished servers --- data/interfaces/default/settings.html | 19 ++++++----- data/interfaces/default/welcome.html | 7 ++-- plexpy/http_handler.py | 9 ++--- plexpy/webserve.py | 47 +++++++++++++++------------ 4 files changed, 45 insertions(+), 37 deletions(-) diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index f05d4ba7..f67bdd59 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -1569,11 +1569,11 @@ $(document).ready(function() { }); function verifyServer(_callback) { - var pms_ip = $("#pms_ip").val() - var pms_port = $("#pms_port").val() - var pms_identifier = $("#pms_identifier").val() - var pms_ssl = $("#pms_ssl").val() - var pms_is_remote = $("#pms_is_remote").val() + var pms_ip = $("#pms_ip").val(); + var pms_port = $("#pms_port").val(); + var pms_identifier = $("#pms_identifier").val(); + var pms_ssl = $("#pms_ssl").is(':checked') ? 1 : 0; + var pms_is_remote = $("#pms_is_remote").is(':checked') ? 1 : 0; if (($("#pms_ip").val() !== '') || ($("#pms_port").val() !== '')) { $("#pms-verify").html(''); $('#pms-verify').fadeIn('fast'); @@ -1582,15 +1582,16 @@ $(document).ready(function() { data : { hostname: pms_ip, port: pms_port, identifier: pms_identifier, ssl: pms_ssl, remote: pms_is_remote }, cache: true, async: true, - timeout: 5000, + timeout: 10000, error: function(jqXHR, textStatus, errorThrown) { $("#pms-verify").html(''); $('#pms-verify').fadeIn('fast'); $("#pms-ip-group").addClass("has-error"); }, - success: function (xml) { - if ($(xml).find('MediaContainer').attr('machineIdentifier')) { - $("#pms_identifier").val($(xml).find('MediaContainer').attr('machineIdentifier')); + success: function (json) { + var machine_identifier = json; + if (machine_identifier) { + $("#pms_identifier").val(machine_identifier); $("#pms-verify").html(''); $('#pms-verify').fadeIn('fast'); $("#pms-ip-group").removeClass("has-error"); diff --git a/data/interfaces/default/welcome.html b/data/interfaces/default/welcome.html index a717ad0e..5174ade1 100644 --- a/data/interfaces/default/welcome.html +++ b/data/interfaces/default/welcome.html @@ -393,9 +393,10 @@ from plexpy import common $("#pms-verify-status").html(' This is not a Plex Server!'); $('#pms-verify-status').fadeIn('fast'); }, - success: function (xml) { - if ($(xml).find('MediaContainer').attr('machineIdentifier')) { - $("#pms_identifier").val($(xml).find('MediaContainer').attr('machineIdentifier')); + success: function (json) { + var machine_identifier = json; + if (machine_identifier) { + $("#pms_identifier").val(machine_identifier); $("#pms-verify-status").html(' Server found!'); $('#pms-verify-status').fadeIn('fast'); pms_verified = true; diff --git a/plexpy/http_handler.py b/plexpy/http_handler.py index c85d2958..013512ba 100644 --- a/plexpy/http_handler.py +++ b/plexpy/http_handler.py @@ -44,7 +44,8 @@ class HTTPHandler(object): headers=None, output_format='raw', return_type=False, - no_token=False): + no_token=False, + timeout=20): valid_request_types = ['GET', 'POST', 'PUT', 'DELETE'] @@ -56,12 +57,12 @@ class HTTPHandler(object): if proto.upper() == 'HTTPS': if not self.ssl_verify and hasattr(ssl, '_create_unverified_context'): context = ssl._create_unverified_context() - handler = HTTPSConnection(host=self.host, port=self.port, timeout=20, context=context) + handler = HTTPSConnection(host=self.host, port=self.port, timeout=timeout, context=context) logger.warn(u"PlexPy HTTP Handler :: Unverified HTTPS request made. This connection is not secure.") else: - handler = HTTPSConnection(host=self.host, port=self.port, timeout=20) + handler = HTTPSConnection(host=self.host, port=self.port, timeout=timeout) else: - handler = HTTPConnection(host=self.host, port=self.port, timeout=20) + handler = HTTPConnection(host=self.host, port=self.port, timeout=timeout) token_string = '' if not no_token: diff --git a/plexpy/webserve.py b/plexpy/webserve.py index a70b8252..a73b5576 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -1382,7 +1382,11 @@ class WebInterface(object): @cherrypy.expose def get_server_id(self, hostname=None, port=None, identifier=None, ssl=0, remote=0, **kwargs): - if not identifier: + from plexpy import http_handler + + # Attempt to get the pms_identifier from plex.tv if the server is published + # Works for all PMS SSL settings + if not identifier and hostname and port: plex_tv = plextv.PlexTV() servers = plex_tv.discover() @@ -1391,27 +1395,28 @@ class WebInterface(object): identifier = server['clientIdentifier'] break - if identifier and hostname and port: - # Set PMS attributes to get the real PMS url - plexpy.CONFIG.__setattr__('PMS_IP', hostname) - plexpy.CONFIG.__setattr__('PMS_PORT', port) - plexpy.CONFIG.__setattr__('PMS_IDENTIFIER', identifier) - plexpy.CONFIG.__setattr__('PMS_SSL', ssl) - plexpy.CONFIG.__setattr__('PMS_IS_REMOTE', remote) - plexpy.CONFIG.write() - - plextv.get_real_pms_url() - - pms_connect = pmsconnect.PmsConnect() - request = pms_connect.get_local_server_identity() - - if request: - cherrypy.response.headers['Content-type'] = 'application/xml' - return request - else: - logger.warn(u"Unable to retrieve data for get_server_id.") - return None + # Fallback to checking /identity endpoint is server is unpublished + # Cannot set SSL settings on the PMS if unpublished so 'http' is okay + if not identifier: + request_handler = http_handler.HTTPHandler(host=hostname, + port=port, + token=None) + uri = '/identity' + request = request_handler.make_request(uri=uri, + proto='http', + request_type='GET', + output_format='xml', + no_token=True, + timeout=10) + if request: + xml_head = request.getElementsByTagName('MediaContainer')[0] + identifier = xml_head.getAttribute('machineIdentifier') + + if identifier: + cherrypy.response.headers['Content-type'] = 'application/json' + return json.dumps(identifier) else: + logger.warn('Unable to retrieve the PMS identifier.') return None @cherrypy.expose