consolidate all the auth stuff in one location

store and re-use user id and auth token
This commit is contained in:
faush01
2014-10-04 21:36:26 +10:00
parent 7c987ea320
commit a30745078c
3 changed files with 135 additions and 131 deletions

View File

@@ -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)

View File

@@ -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 = {}

View File

@@ -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)