From c8c0ad699762295feb58f1185d6f16c0cae0bb5a Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Fri, 23 May 2014 17:49:00 +0200 Subject: [PATCH] Storage: Implement UpdateRecord. WarioWare DIY can now successfully delete owned games. --- storage_server.py | 59 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/storage_server.py b/storage_server.py index 7fd2ec4..6fc30f1 100644 --- a/storage_server.py +++ b/storage_server.py @@ -101,6 +101,7 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): action = self.headers['SOAPAction'] post = self.rfile.read(length) logger.log(logging.DEBUG, "SakeStorageServer SOAPAction %s", action) + logger.log(logging.DEBUG, post) shortaction = action[action.rfind('/')+1:-1] @@ -117,6 +118,9 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): logger.log(logging.WARNING, "Unknown table access '%s' in %s by %s", table, shortaction, self.client_address) return + ret += '<' + shortaction + 'Response xmlns="http://gamespy.net/sake">' + ret += '<' + shortaction + 'Result>Success' + # TODO: Actually make GetMyRecords only return *my* records if action == '"http://gamespy.net/sake/SearchForRecords"' or action == '"http://gamespy.net/sake/GetMyRecords"': columndata = data.getElementsByTagName('ns1:fields')[0].getElementsByTagName('ns1:string') @@ -126,9 +130,6 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): logger.log(logging.WARNING, "IllegalColumnAccess: %s in %s by %s", e.message, shortaction, self.client_address) return - ret += '' - ret += 'Success' - # build SELECT statement, yes I know one shouldn't do this but I cross-checked the table name and all the columns above so it should be fine statement = 'SELECT ' statement += columns[0] @@ -145,25 +146,26 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): for r in rows: ret += '' for i, c in enumerate(r): + type = self.server.get_typedata(table, columns[i]) + ret += '' - ret += '<' + self.server.get_typedata(table, columns[i]) + '>' - if c: - ret += '' + str(c) + '' + ret += '<' + type + '>' + if c is not None: + if type == 'booleanValue': + ret += '' + ('true' if c else 'false') + '' + else: + ret += '' + str(c) + '' else: ret += '' - ret += '' + ret += '' ret += '' ret += '' ret += '' else: ret += '' - ret += '' elif action == '"http://gamespy.net/sake/GetRecordCount"': - ret += '' - ret += 'Success' - statement = 'SELECT COUNT(1) FROM ' + table cursor = self.server.db.cursor() @@ -171,8 +173,41 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): count = cursor.fetchone()[0] ret += '' + str(count) + '' - ret += '' + elif action == '"http://gamespy.net/sake/UpdateRecord"': + recordid = str(int(data.getElementsByTagName('ns1:recordid')[0].firstChild.data)) + + columndata = [] + values = data.getElementsByTagName('ns1:values')[0] + recordfields = values.getElementsByTagName('ns1:RecordField') + for rf in recordfields: + columndata.append( rf.getElementsByTagName('ns1:name')[0] ) + + try: + columns = self.confirm_columns(columndata, table) + except IllegalColumnAccessException as e: + logger.log(logging.WARNING, "IllegalColumnAccess: %s in %s by %s", e.message, shortaction, self.client_address) + return + + rowdata = [] + for rf in recordfields: + cn = rf.getElementsByTagName('ns1:value')[0].childNodes + # circumvent checking for and so on by just taking whatever is there + rowdata.append( cn[len(cn)/2].getElementsByTagName('ns1:value')[0].firstChild.data ) + + statement = 'UPDATE ' + table + ' SET ' + + statement += columns[0] + ' = ?' + for c in columns[1:]: + statement += ' AND ' + c + ' = ?' + statement += ' WHERE recordid = ?' + rowdata.append( recordid ) + + cursor = self.server.db.cursor() + cursor.execute(statement, rowdata) + self.server.db.commit() + + ret += '' ret += '' self.send_response(200)