Combine user login in profile and gamestats.

This commit is contained in:
Admiral H. Curtiss 2014-06-15 22:29:33 +02:00
parent 8e535e005b
commit 9882da3af3
3 changed files with 40 additions and 119 deletions

View File

@ -71,6 +71,41 @@ def prepare_rc4_base64(_key, _data):
def parse_authtoken(authtoken, db):
return db.get_nas_login(authtoken)
def login_profile_via_parsed_authtoken(authtoken_parsed, db):
console = 0
userid = authtoken_parsed['userid']
csnum = authtoken_parsed.get('csnum', '') # Wii: Serial number
cfc = authtoken_parsed.get('cfc', '') # Wii: Friend code
bssid = authtoken_parsed.get('bssid', '') # NDS: Wifi network's BSSID
devname = authtoken_parsed.get('devname', '') # NDS: Device name
birth = authtoken_parsed.get('birth', '') # NDS: User's birthday
# The Wii does not use passwd, so take another uniquely generated string as the password.
if "passwd" in authtoken_parsed:
password = authtoken_parsed['passwd']
else:
password = authtoken_parsed['gsbrcd']
console = 1
gsbrcd = authtoken_parsed['gsbrcd']
gameid = gsbrcd[:4]
uniquenick = utils.base32_encode(int(userid)) + gsbrcd
email = uniquenick + "@nds" # The Wii also seems to use @nds.
if "csnum" in authtoken_parsed:
console = 1
if "cfc" in authtoken_parsed:
console = 1
valid_user = db.check_user_exists(userid, gsbrcd)
if valid_user == False:
profileid = db.create_user(userid, password, email, uniquenick, gsbrcd, console, csnum, cfc, bssid, devname, birth, gameid)
else:
profileid = db.perform_login(userid, password, gsbrcd)
return userid, profileid, gsbrcd, uniquenick
def generate_response(challenge, ac_challenge, secretkey, authtoken):
md5 = hashlib.md5()
md5.update(ac_challenge)

View File

@ -163,65 +163,7 @@ class Gamestats(LineReceiver):
if "lid" in data_parsed:
self.lid = data_parsed['lid']
# Track what console is connecting and save it in the database during user creation just in case we can use
# the information in the future.
console = 0 # 0 = NDS, 1 = Wii
# get correct information
userid = authtoken_parsed['userid']
# The Wii does not use passwd, so take another uniquely generated string as the password.
if "passwd" in authtoken_parsed:
password = authtoken_parsed['passwd']
else:
password = authtoken_parsed['gsbrcd']
console = 1
gsbrcd = authtoken_parsed['gsbrcd']
gameid = gsbrcd[:4]
uniquenick = utils.base32_encode(int(userid)) + gsbrcd
email = uniquenick + "@nds" # The Wii also seems to use @nds.
# Wii: Serial number
if "csnum" in authtoken_parsed:
csnum = authtoken_parsed['csnum']
console = 1
else:
csnum = ""
# Wii: Friend code
if "cfc" in authtoken_parsed:
cfc = authtoken_parsed['cfc']
console = 1
else:
cfc = ""
# NDS: Wifi network's BSSID
if "bssid" in authtoken_parsed:
bssid = authtoken_parsed['bssid']
else:
bssid = ""
# NDS: Device name
if "devname" in authtoken_parsed:
devname = authtoken_parsed['devname']
else:
devname = ""
# NDS: User's birthday
if "birth" in authtoken_parsed:
birth = authtoken_parsed['birth']
else:
birth = ""
valid_user = self.db.check_user_exists(userid, gsbrcd)
profileid = None
if valid_user:
profileid = self.db.perform_login(userid, password, gsbrcd)
if profileid == None:
# Handle case where the user is invalid
self.log(logging.ERROR, "Invalid password")
userid, profileid, gsbrcd, uniquenick = gs_utils.login_profile_via_parsed_authtoken(authtoken_parsed, self.db)
if profileid != None:
# Successfully logged in or created account, continue creating session.
@ -236,6 +178,7 @@ class Gamestats(LineReceiver):
])
else:
# login failed
self.log(logging.WARNING, "Invalid password")
msg = gs_query.create_gamespy_message([
('__cmd__', "pauthr"),
('__cmd_val__', -3),

View File

@ -179,57 +179,6 @@ class PlayerSession(LineReceiver):
authtoken_parsed = gs_utils.parse_authtoken(data_parsed['authtoken'], self.db)
#print authtoken_parsed
# Track what console is connecting and save it in the database during user creation just in case we can use
# the information in the future.
console = 0 # 0 = NDS, 1 = Wii
# get correct information
userid = authtoken_parsed['userid']
# The Wii does not use passwd, so take another uniquely generated string as the password.
if "passwd" in authtoken_parsed:
password = authtoken_parsed['passwd']
else:
password = authtoken_parsed['gsbrcd']
console = 1
gsbrcd = authtoken_parsed['gsbrcd']
gameid = gsbrcd[:4]
uniquenick = utils.base32_encode(int(userid)) + gsbrcd
email = uniquenick + "@nds" # The Wii also seems to use @nds.
# Wii: Serial number
if "csnum" in authtoken_parsed:
csnum = authtoken_parsed['csnum']
console = 1
else:
csnum = ""
# Wii: Friend code
if "cfc" in authtoken_parsed:
cfc = authtoken_parsed['cfc']
console = 1
else:
cfc = ""
# NDS: Wifi network's BSSID
if "bssid" in authtoken_parsed:
bssid = authtoken_parsed['bssid']
else:
bssid = ""
# NDS: Device name
if "devname" in authtoken_parsed:
devname = authtoken_parsed['devname']
else:
devname = ""
# NDS: User's birthday
if "birth" in authtoken_parsed:
birth = authtoken_parsed['birth']
else:
birth = ""
if 'sdkrevision' in data_parsed:
self.sdkrevision = data_parsed['sdkrevision']
@ -240,15 +189,7 @@ class PlayerSession(LineReceiver):
proof = gs_utils.generate_proof(self.challenge, authtoken_parsed['challenge'], data_parsed['challenge'], data_parsed['authtoken'])
valid_user = self.db.check_user_exists(userid, gsbrcd)
if valid_user == False:
profileid = self.db.create_user(userid, password, email, uniquenick, gsbrcd, console, csnum, cfc, bssid, devname, birth, gameid)
else:
profileid = self.db.perform_login(userid, password, gsbrcd)
if profileid == None:
# Handle case where the user is invalid
self.log(logging.ERROR, "Invalid password")
userid, profileid, gsbrcd, uniquenick = gs_utils.login_profile_via_parsed_authtoken(authtoken_parsed, self.db)
if profileid != None:
# Successfully logged in or created account, continue creating session.
@ -327,6 +268,8 @@ class PlayerSession(LineReceiver):
# if profile != None:
# self.statstring = profile['stat']
# self.locstring = profile['loc']
else:
self.log(logging.WARNING, "Invalid password")
def perform_logout(self, data_parsed):
self.log(logging.INFO, "Session %s has logged off" % (data_parsed['sesskey']))