From 7dbd704c5ded2a9fb0fd6222e0906c6bf046d420 Mon Sep 17 00:00:00 2001 From: duck <113956421+duckfromdiscord@users.noreply.github.com> Date: Sat, 11 Nov 2023 17:56:40 -0500 Subject: [PATCH 1/3] make `auth.getMobileSession` return XML --- maloja/apis/audioscrobbler.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/maloja/apis/audioscrobbler.py b/maloja/apis/audioscrobbler.py index 6699618..350d4a3 100644 --- a/maloja/apis/audioscrobbler.py +++ b/maloja/apis/audioscrobbler.py @@ -28,6 +28,15 @@ class Audioscrobbler(APIHandler): ScrobblingException:(500,{"error":8,"message":"Operation failed"}) } + # xml string escaping: https://stackoverflow.com/a/28703510 + def xml_escape(self, str_xml: str): + str_xml = str_xml.replace("&", "&") + str_xml = str_xml.replace("<", "<") + str_xml = str_xml.replace("<", "<") + str_xml = str_xml.replace("\"", """) + str_xml = str_xml.replace("'", "'") + return str_xml + def get_method(self,pathnodes,keys): return keys.get("method") @@ -50,7 +59,14 @@ class Audioscrobbler(APIHandler): client = apikeystore.check_and_identify_key(password) if client: sessionkey = self.generate_key(client) - return 200,{"session":{"key":sessionkey}} + return 200,""" + + %s + %s + 0 + + +""" % (self.xml_escape(user), self.xml_escape(sessionkey)) else: raise InvalidAuthException() # or username and token (deprecated by lastfm) From be6b796b20c950bdc3fe7e3142dd9a3b8fdd55bf Mon Sep 17 00:00:00 2001 From: duck <113956421+duckfromdiscord@users.noreply.github.com> Date: Sat, 11 Nov 2023 18:14:20 -0500 Subject: [PATCH 2/3] `auth.getMobileSession` return XML with token provided --- maloja/apis/audioscrobbler.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/maloja/apis/audioscrobbler.py b/maloja/apis/audioscrobbler.py index 350d4a3..38f3fd3 100644 --- a/maloja/apis/audioscrobbler.py +++ b/maloja/apis/audioscrobbler.py @@ -75,7 +75,14 @@ class Audioscrobbler(APIHandler): key = apikeystore[client] if md5(user + md5(key)) == token: sessionkey = self.generate_key(client) - return 200,{"session":{"key":sessionkey}} + return 200,""" + + %s + %s + 0 + + +""" % (self.xml_escape(user), self.xml_escape(sessionkey)) raise InvalidAuthException() else: raise BadAuthException() From 16b977d874fe2a65ce17df160228acbcefa18807 Mon Sep 17 00:00:00 2001 From: duck <113956421+duckfromdiscord@users.noreply.github.com> Date: Wed, 3 Jan 2024 21:57:42 -0500 Subject: [PATCH 3/3] allow json format for `authmobile`, default to XML --- maloja/apis/audioscrobbler.py | 37 ++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/maloja/apis/audioscrobbler.py b/maloja/apis/audioscrobbler.py index 38f3fd3..7b7194a 100644 --- a/maloja/apis/audioscrobbler.py +++ b/maloja/apis/audioscrobbler.py @@ -54,19 +54,22 @@ class Audioscrobbler(APIHandler): token = keys.get("authToken") user = keys.get("username") password = keys.get("password") + format = keys.get("format") or "xml" # Audioscrobbler 2.0 uses XML by default # either username and password if user is not None and password is not None: client = apikeystore.check_and_identify_key(password) if client: sessionkey = self.generate_key(client) - return 200,""" - - %s - %s - 0 - - -""" % (self.xml_escape(user), self.xml_escape(sessionkey)) + if format == "json": + return 200,{"session":{"key":sessionkey}} + else: + return 200,""" + + %s + %s + 0 + +""" % (self.xml_escape(user), self.xml_escape(sessionkey)) else: raise InvalidAuthException() # or username and token (deprecated by lastfm) @@ -75,14 +78,16 @@ class Audioscrobbler(APIHandler): key = apikeystore[client] if md5(user + md5(key)) == token: sessionkey = self.generate_key(client) - return 200,""" - - %s - %s - 0 - - -""" % (self.xml_escape(user), self.xml_escape(sessionkey)) + if format == "json": + return 200,{"session":{"key":sessionkey}} + else: + return 200,""" + + %s + %s + 0 + +""" % (self.xml_escape(user), self.xml_escape(sessionkey)) raise InvalidAuthException() else: raise BadAuthException()