consolidate all the auth stuff in one location
store and re-use user id and auth token
This commit is contained in:
@@ -1694,7 +1694,7 @@ def checkServer():
|
||||
printDebug ("Getting user list")
|
||||
jsonData = None
|
||||
try:
|
||||
jsonData = downloadUtils.downloadUrl(server_address + ":" + server_port + "/mediabrowser/Users?format=json")
|
||||
jsonData = downloadUtils.downloadUrl(server_address + ":" + server_port + "/mediabrowser/Users?format=json", authenticate=False)
|
||||
except Exception, msg:
|
||||
error = "Get User unable to connect to " + server_address + ":" + server_port + " : " + str(msg)
|
||||
xbmc.log (error)
|
||||
|
||||
@@ -152,7 +152,6 @@ class ArtworkRotationThread(threading.Thread):
|
||||
WINDOW.setProperty("MB3.Background.Global.FanArt.Action", result.get("global")["action"])
|
||||
self.logMsg("MB3.Background.Global.FanArt.Action=" + result.get("global")["action"], level=2)
|
||||
|
||||
|
||||
def saveLastBackground(self):
|
||||
|
||||
data = {}
|
||||
|
||||
@@ -9,9 +9,9 @@ import hashlib
|
||||
import StringIO
|
||||
import gzip
|
||||
import sys
|
||||
import inspect
|
||||
#import inspect
|
||||
import json as json
|
||||
from random import randrange
|
||||
#from random import randrange
|
||||
from uuid import getnode as get_mac
|
||||
from ClientInformation import ClientInformation
|
||||
|
||||
@@ -33,100 +33,9 @@ class DownloadUtils():
|
||||
if(self.logLevel >= level):
|
||||
xbmc.log("MBCon DownloadUtils -> " + msg)
|
||||
|
||||
def getUserId(self):
|
||||
|
||||
port = self.addonSettings.getSetting('port')
|
||||
host = self.addonSettings.getSetting('ipaddress')
|
||||
userName = self.addonSettings.getSetting('username')
|
||||
|
||||
self.logMsg("Looking for user name: " + userName)
|
||||
|
||||
jsonData = None
|
||||
try:
|
||||
jsonData = self.downloadUrl(host + ":" + port + "/mediabrowser/Users/Public?format=json")
|
||||
except Exception, msg:
|
||||
error = "Get User unable to connect to " + host + ":" + port + " : " + str(msg)
|
||||
xbmc.log (error)
|
||||
return ""
|
||||
|
||||
self.logMsg("GETUSER_JSONDATA_01:" + str(jsonData))
|
||||
|
||||
result = []
|
||||
|
||||
try:
|
||||
result = json.loads(jsonData)
|
||||
except Exception, e:
|
||||
self.logMsg("jsonload : " + str(e) + " (" + jsonData + ")", level=1)
|
||||
return ""
|
||||
|
||||
self.logMsg("GETUSER_JSONDATA_02:" + str(result))
|
||||
|
||||
userid = ""
|
||||
secure = False
|
||||
for user in result:
|
||||
if(user.get("Name") == userName):
|
||||
userid = user.get("Id")
|
||||
self.logMsg("Username Found:" + user.get("Name"))
|
||||
if(user.get("HasPassword") == True):
|
||||
secure = True
|
||||
self.logMsg("Username Is Secure (HasPassword=True)")
|
||||
break
|
||||
|
||||
if(secure):
|
||||
authOk = self.authenticate()
|
||||
if(authOk == False):
|
||||
return_value = xbmcgui.Dialog().ok(self.getString(30044), self.getString(30044))
|
||||
sys.exit()
|
||||
|
||||
if userid == "":
|
||||
return_value = xbmcgui.Dialog().ok(self.getString(30045),self.getString(30045))
|
||||
sys.exit()
|
||||
|
||||
self.logMsg("userid : " + userid)
|
||||
|
||||
WINDOW = xbmcgui.Window( 10000 )
|
||||
WINDOW.setProperty("userid", userid)
|
||||
|
||||
return userid
|
||||
|
||||
def getMachineId(self):
|
||||
return "%012X"%get_mac()
|
||||
|
||||
def authenticate(self):
|
||||
|
||||
self.addonSettings.setSetting('AccessToken', "")
|
||||
|
||||
port = self.addonSettings.getSetting("port")
|
||||
host = self.addonSettings.getSetting("ipaddress")
|
||||
if(host == None or host == "" or port == None or port == ""):
|
||||
return False
|
||||
|
||||
url = "http://" + self.addonSettings.getSetting("ipaddress") + ":" + self.addonSettings.getSetting("port") + "/mediabrowser/Users/AuthenticateByName?format=json"
|
||||
|
||||
txt_mac = self.getMachineId()
|
||||
version = ClientInformation().getVersion()
|
||||
|
||||
deviceName = self.addonSettings.getSetting('deviceName')
|
||||
deviceName = deviceName.replace("\"", "_")
|
||||
|
||||
authString = "Mediabrowser Client=\"XBMC\",Device=\"" + deviceName + "\",DeviceId=\"" + txt_mac + "\",Version=\"" + version + "\""
|
||||
headers = {'Accept-encoding': 'gzip', 'Authorization' : authString}
|
||||
sha1 = hashlib.sha1(self.addonSettings.getSetting('password'))
|
||||
|
||||
resp = requests.post(url, data={'password':sha1.hexdigest(),'Username':self.addonSettings.getSetting('username')}, headers=headers)
|
||||
code = str(resp.status_code)
|
||||
result = resp.json()
|
||||
|
||||
if result.get("AccessToken") != self.addonSettings.getSetting('AccessToken'):
|
||||
self.addonSettings.setSetting('AccessToken', result.get("AccessToken"))
|
||||
|
||||
if int(code) >= 200 and int(code) < 300:
|
||||
self.logMsg("User Authenticated")
|
||||
return True
|
||||
else:
|
||||
self.logMsg("User NOT Authenticated")
|
||||
return False
|
||||
|
||||
def getArtwork(self, data, type, index = "0"):
|
||||
|
||||
id = data.get("Id")
|
||||
@@ -175,24 +84,6 @@ class DownloadUtils():
|
||||
artwork = ''
|
||||
'''
|
||||
return artwork
|
||||
|
||||
def getUserArtwork(self, data, type, index = "0"):
|
||||
|
||||
id = data.get("Id")
|
||||
#query = "&type=" + type + "&tag=" + imageTag
|
||||
query = ""
|
||||
height = "60"
|
||||
width = "60"
|
||||
played = "0"
|
||||
|
||||
# use the local image proxy server that is made available by this addons service
|
||||
port = self.addonSettings.getSetting('port')
|
||||
host = self.addonSettings.getSetting('ipaddress')
|
||||
server = host + ":" + port
|
||||
|
||||
artwork = "http://" + server + "/mediabrowser/Users/" + str(id) + "/Images/Primary/0" + "?height=60&width=60&format=png"
|
||||
|
||||
return artwork
|
||||
|
||||
def imageUrl(self, id, type, index, width, height):
|
||||
|
||||
@@ -202,38 +93,152 @@ class DownloadUtils():
|
||||
|
||||
return "http://" + server + "/mediabrowser/Items/" + str(id) + "/Images/" + type + "/" + str(index) + "/e3ab56fe27d389446754d0fb04910a34/original/" + str(height) + "/" + str(width) + "/0"
|
||||
|
||||
def downloadUrl(self, url, suppress=False, type="GET", popup=0 ):
|
||||
def getUserId(self):
|
||||
|
||||
WINDOW = xbmcgui.Window( 10000 )
|
||||
userid = WINDOW.getProperty("userid")
|
||||
|
||||
if(userid != None and userid != ""):
|
||||
xbmc.log("MBCon DownloadUtils -> Returning saved UserID : " + userid)
|
||||
return userid
|
||||
|
||||
port = self.addonSettings.getSetting('port')
|
||||
host = self.addonSettings.getSetting('ipaddress')
|
||||
userName = self.addonSettings.getSetting('username')
|
||||
|
||||
self.logMsg("Looking for user name: " + userName)
|
||||
|
||||
jsonData = None
|
||||
try:
|
||||
jsonData = self.downloadUrl(host + ":" + port + "/mediabrowser/Users/Public?format=json", authenticate=False)
|
||||
except Exception, msg:
|
||||
error = "Get User unable to connect to " + host + ":" + port + " : " + str(msg)
|
||||
xbmc.log (error)
|
||||
return ""
|
||||
|
||||
self.logMsg("GETUSER_JSONDATA_01:" + str(jsonData))
|
||||
|
||||
result = []
|
||||
|
||||
try:
|
||||
result = json.loads(jsonData)
|
||||
except Exception, e:
|
||||
self.logMsg("jsonload : " + str(e) + " (" + jsonData + ")", level=1)
|
||||
return ""
|
||||
|
||||
self.logMsg("GETUSER_JSONDATA_02:" + str(result))
|
||||
|
||||
userid = ""
|
||||
secure = False
|
||||
for user in result:
|
||||
if(user.get("Name") == userName):
|
||||
userid = user.get("Id")
|
||||
self.logMsg("Username Found:" + user.get("Name"))
|
||||
if(user.get("HasPassword") == True):
|
||||
secure = True
|
||||
self.logMsg("Username Is Secure (HasPassword=True)")
|
||||
break
|
||||
|
||||
if(secure):
|
||||
authOk = self.authenticate()
|
||||
if(authOk == ""):
|
||||
return_value = xbmcgui.Dialog().ok(self.getString(30044), self.getString(30044))
|
||||
return ""
|
||||
|
||||
if userid == "":
|
||||
return_value = xbmcgui.Dialog().ok(self.getString(30045),self.getString(30045))
|
||||
|
||||
self.logMsg("userid : " + userid)
|
||||
|
||||
WINDOW.setProperty("userid", userid)
|
||||
|
||||
return userid
|
||||
|
||||
def authenticate(self):
|
||||
|
||||
WINDOW = xbmcgui.Window( 10000 )
|
||||
|
||||
token = WINDOW.getProperty("AccessToken")
|
||||
if(token != None and token != ""):
|
||||
xbmc.log("MBCon DownloadUtils -> Returning saved AccessToken : " + token)
|
||||
return token
|
||||
|
||||
port = self.addonSettings.getSetting("port")
|
||||
host = self.addonSettings.getSetting("ipaddress")
|
||||
if(host == None or host == "" or port == None or port == ""):
|
||||
return ""
|
||||
|
||||
url = "http://" + self.addonSettings.getSetting("ipaddress") + ":" + self.addonSettings.getSetting("port") + "/mediabrowser/Users/AuthenticateByName?format=json"
|
||||
|
||||
txt_mac = self.getMachineId()
|
||||
version = ClientInformation().getVersion()
|
||||
|
||||
deviceName = self.addonSettings.getSetting('deviceName')
|
||||
deviceName = deviceName.replace("\"", "_")
|
||||
|
||||
authString = "Mediabrowser Client=\"XBMC\",Device=\"" + deviceName + "\",DeviceId=\"" + txt_mac + "\",Version=\"" + version + "\""
|
||||
headers = {'Accept-encoding': 'gzip', 'Authorization' : authString}
|
||||
sha1 = hashlib.sha1(self.addonSettings.getSetting('password'))
|
||||
|
||||
resp = requests.post(url, data={'password':sha1.hexdigest(),'Username':self.addonSettings.getSetting('username')}, headers=headers)
|
||||
code = str(resp.status_code)
|
||||
result = resp.json()
|
||||
|
||||
accessToken = result.get("AccessToken")
|
||||
|
||||
if int(code) >= 200 and int(code) < 300 and accessToken != None:
|
||||
self.logMsg("User Authenticated : " + accessToken)
|
||||
WINDOW.setProperty("AccessToken", accessToken)
|
||||
return accessToken
|
||||
else:
|
||||
self.logMsg("User NOT Authenticated")
|
||||
WINDOW.setProperty("AccessToken", "")
|
||||
return ""
|
||||
|
||||
def getAuthHeader(self):
|
||||
txt_mac = self.getMachineId()
|
||||
version = ClientInformation().getVersion()
|
||||
|
||||
userid = self.getUserId()
|
||||
|
||||
deviceName = self.addonSettings.getSetting('deviceName')
|
||||
deviceName = deviceName.replace("\"", "_")
|
||||
|
||||
authString = "MediaBrowser UserId=\"" + userid + "\",Client=\"XBMC\",Device=\"" + deviceName + "\",DeviceId=\"" + txt_mac + "\",Version=\"" + version + "\""
|
||||
headers = {"Accept-encoding": "gzip", "Accept-Charset" : "UTF-8,*", "Authorization" : authString}
|
||||
|
||||
authToken = self.authenticate()
|
||||
if(authToken != ""):
|
||||
headers["X-MediaBrowser-Token"] = authToken
|
||||
|
||||
xbmc.log("MBCon Authentication Header : " + str(headers))
|
||||
return headers
|
||||
|
||||
def downloadUrl(self, url, suppress=False, type="GET", popup=0, authenticate=True):
|
||||
self.logMsg("== ENTER: getURL ==")
|
||||
link = ""
|
||||
try:
|
||||
if url[0:4] == "http":
|
||||
serversplit=2
|
||||
urlsplit=3
|
||||
serversplit = 2
|
||||
urlsplit = 3
|
||||
else:
|
||||
serversplit=0
|
||||
urlsplit=1
|
||||
serversplit = 0
|
||||
urlsplit = 1
|
||||
|
||||
server =url.split('/')[serversplit]
|
||||
server = url.split('/')[serversplit]
|
||||
urlPath = "/"+"/".join(url.split('/')[urlsplit:])
|
||||
|
||||
self.logMsg("DOWNLOAD_URL = " + url)
|
||||
self.logMsg("server = "+str(server), level=2)
|
||||
self.logMsg("urlPath = "+str(urlPath), level=2)
|
||||
conn = httplib.HTTPConnection(server, timeout=20)
|
||||
#head = {"Accept-Encoding" : "gzip,deflate", "Accept-Charset" : "UTF-8,*"}
|
||||
if(self.addonSettings.getSetting('AccessToken') == None):
|
||||
self.addonSettings.setSetting('AccessToken', '')
|
||||
|
||||
authToken = self.addonSettings.getSetting('AccessToken')
|
||||
if(authToken != None and authToken != ""):
|
||||
head = {"Accept-Encoding" : "gzip", "Accept-Charset" : "UTF-8,*", "X-MediaBrowser-Token" : authToken}
|
||||
else:
|
||||
head = {"Accept-Encoding" : "gzip", "Accept-Charset" : "UTF-8,*"}
|
||||
self.logMsg("HEADERS : " + str(head), level=1)
|
||||
|
||||
#head = getAuthHeader()
|
||||
head = {}
|
||||
if(authenticate):
|
||||
head = self.getAuthHeader()
|
||||
self.logMsg("HEADERS : " + str(head), level=1)
|
||||
|
||||
conn.request(method=type, url=urlPath, headers=head)
|
||||
#conn.request(method=type, url=urlPath)
|
||||
data = conn.getresponse()
|
||||
self.logMsg("GET URL HEADERS : " + str(data.getheaders()), level=2)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user