diff --git a/api.py b/api.py index e7b28c1..1478538 100644 --- a/api.py +++ b/api.py @@ -1689,8 +1689,9 @@ def delete_map_api(**args): jhtml(self,[{"type":"success","message":"Done!"},selection_info(self,user,domain)]) def test_api(**args): - self,user,server,domain=gdmuld(args,"self","user","server","domain") + self,user,server,domain,a=gdmuld(args,"self","user","server","domain","a") logging.info("test") + logging.info(a) jfunc(self,"alert",["lol"]) jhtmls(self,"test") @@ -1718,15 +1719,15 @@ def server_api(name="",extra="",extra2=""): domain=gdi(self) server=get_server(self,domain) args,method=gdmul(self,"arguments","method") - if security_threat(self,domain): return "security_threat" + if security_threat(self,domain): return jhtml(self,{"failed":1,"reason":"security_threat"}) user=get_user(self,domain,api_override=(server and method and method!="start_character")) # only "start_character" has an auth check, the rest doesn't re-check user auths #IMPORTANT! [09/08/20] method="%s_api"%method if args: args=json.loads(args) if not args: args={} logging.info("\n\nAPI Method Called: %s Arguments: %s\n"%(method,simplify_args_for_logging(args))) if not user and method not in ["log_error_api","signup_or_login_api","load_article_api","get_server_api","test_api","create_server_api","stop_server_api","update_server_api","reload_server_api","set_friends_api","not_friends_api","password_reminder_api","server_event_api","reset_password_api","ban_user_api","send_mail_api","log_chat_api","take_item_from_mail_api","broadcast_api"]: - if self.values.get("server_auth"): jhtml(self,{"failed":1,"reason":"nouser"}); return "nouser" - jhtml(self,[{"type":"func","func":"add_log","args":["Not logged in."]}]); return "notloggedin" + if self.values.get("server_auth"): return jhtml(self,{"failed":1,"reason":"nouser"}) + return jhtml(self,[{"type":"func","func":"add_log","args":["Not logged in."]}]) function=globals().get(method) args["domain"]=domain args["user"]=user @@ -1740,3 +1741,45 @@ def server_api(name="",extra="",extra2=""): safe_commit(user); safe_commit(server); domain_routine(domain) return request.response +@app.route('/json_api', methods=['POST']) +@app.route('/json_api/', methods=['POST']) +@app.route('/json_api//', methods=['POST']) +@app.route('/json_api///', methods=['POST']) +@ndb.toplevel +def json_server_api(name="",extra="",extra2=""): + json_data = json.loads(request.data.decode('utf-8')) + args=json_data["args"] + method=json_data["method"] + self=request # [26/01/24] easier for now + domain=gdi(self) + server=None + if json_data.get("server_auth"): + #logging.info("here") + id,auth=json_data.get("server_auth").split("-") + s=get_by_iid("server|%s"%id) + if s and gf(s,"auth")==auth: + server=s + #logging.info(server) + if security_threat(self,domain): return jhtml(self,{"failed":1,"reason":"security_threat"}) + user=get_user(self,domain,api_override=(server and method and method!="start_character"),auth=json_data.get("auth")) + # only "start_character" has an auth check, the rest doesn't re-check user auths #IMPORTANT! [09/08/20] + method="%s_api"%method + if not args: args={} + logging.info("\n\nAPI Method Called: %s Arguments: %s\n"%(method,simplify_args_for_logging(args))) + if not user and method not in ["log_error_api","signup_or_login_api","load_article_api","get_server_api","test_api","create_server_api","stop_server_api","update_server_api","reload_server_api","set_friends_api","not_friends_api","password_reminder_api","server_event_api","reset_password_api","ban_user_api","send_mail_api","log_chat_api","take_item_from_mail_api","broadcast_api"]: + if json_data.get("server_auth"): return jhtml(self,{"failed":1,"reason":"nouser"}) + return jhtml(self,[{"type":"func","func":"add_log","args":["Not logged in."]}]) + function=globals().get(method) + args["domain"]=domain + args["user"]=user + args["server"]=server + args["self"]=self + if user and not server and gf(user,"blocked_until",really_old)>datetime.now() and method not in ["logout_api_X"]: return jhtml(self,[{"type":"func","func":"add_log","args":["Blocked"]}]) + if function: function(**args) + else: + if args.get("dataType")=="json": jhtml(self,[{"type":"ui_log","message":"Invalid method"}]) + else: logging.error("no function") + safe_commit(user); safe_commit(server); domain_routine(domain) + return request.response + + diff --git a/config.py b/config.py index 03c7985..bff3a54 100644 --- a/config.py +++ b/config.py @@ -114,13 +114,15 @@ if is_production: #maps["desertland"]["key"]="jayson_desertland_copy" pass -game_version=831 +game_version=833 SALES=4+5+388+5101+125/20 #donation+manual+macos+steam+sales update_notes=[ "Happy Holidays!", - "Last Update [21st of December]", + "Last Update [1st of January]", "New Item: Orb of Temporal Forces", - ] + "New JSON API to save bandwidth (Internal)", + "(Slight change something might break)" +] ip_to_subdomain={ #IMPORTANT: SPECIAL PAGE RULES ARE NEEDED: https://dash.cloudflare.com/b6f5a13bded5fdd273e4a1cd3777162d/adventure.land/page-rules - uss1 / eus1 was best "35.187.255.184":"asia1", "35.246.244.105":"eu1", diff --git a/functions.py b/functions.py index 105578c..6362853 100644 --- a/functions.py +++ b/functions.py @@ -299,7 +299,7 @@ def disable_email(email,logging=None): user.put() logging.info("Disabled emails for %s"%user) -def get_user(request=None,domain=None,email=None,phrase_check=False,api_override=None): +def get_user(request=None,domain=None,email=None,phrase_check=False,api_override=None,auth=None): if email: try: email=purify_email(email) @@ -312,7 +312,7 @@ def get_user(request=None,domain=None,email=None,phrase_check=False,api_override except: logTrace() elif request: - auth=get_cookie(request,"auth") or request.values.get("auth") + auth=get_cookie(request,"auth") or request.values.get("auth") or auth if auth: id,auth=auth.replace('"',"").split("-") get_user_data(id,_async=True) #trigger the get diff --git a/js/functions.js b/js/functions.js index ed9af67..b806b5e 100644 --- a/js/functions.js +++ b/js/functions.js @@ -5424,12 +5424,13 @@ function d_text(message,x,y,args) function api_call(method,args,r_args) { if(!args) args={}; if(!r_args) r_args={}; - var api_path="/api/"+method,disable=r_args.disable; + var api_path="/json_api/"+method,disable=r_args.disable; if(args.ui_loader) { r_args.r_id=randomStr(10); delete args.ui_loader; } if(args.callback) { r_args.callback=args.callback; delete args.callback; } if(disable) disable.addClass("disable"); if(window.is_electron) args.epl=electron_data.platform; - data={ 'method':method, 'arguments':JSON.stringify(args) }; + // data={ 'method':method, 'arguments':JSON.stringify(args) }; + data={ 'method':method, 'args':args }; function on_success(r_args,disable) { return function(ct) { if(r_args.r_id) hide_loader(r_args.r_id); @@ -5453,7 +5454,7 @@ function api_call(method,args,r_args) } } if(r_args.r_id) show_loader(r_args.r_id); - call_args={type:'POST',dataType:"json",url:window.location.origin+api_path,data:data,success:on_success(r_args,disable),error:on_error(r_args,disable)} + call_args={type:'POST',dataType:"json",contentType: "application/json; charset=utf-8", url:window.location.origin+api_path,data:JSON.stringify(data),success:on_success(r_args,disable),error:on_error(r_args,disable)} $.ajax(call_args); if(r_args.promise) { diff --git a/node/server_functions.js b/node/server_functions.js index b9699e2..e22df54 100644 --- a/node/server_functions.js +++ b/node/server_functions.js @@ -3196,7 +3196,7 @@ function xy_upush_logic(element) { } function appengine_call(method, args, on_success, on_error) { - var api_path = "/api/" + method, + var api_path = "/json_api/" + method, suffix = ""; if ( mode.prevent_external && @@ -3231,16 +3231,16 @@ function appengine_call(method, args, on_success, on_error) { suffix = args.suffix; delete args.suffix; } - var arguments = JSON.stringify(args); + // var arguments = JSON.stringify(args); var data = { method: method, - arguments: arguments, + args: args, server_auth: server_id + "-" + server_auth, auth: args.auth, }; - if (suffix.includes("unmount")) console.log(arguments.length); + // if (suffix.includes("unmount")) console.log(arguments.length); try { - request.post({ url: base_url + api_path, form: data }, function (err, response, body) { + request.post({ url: base_url + api_path, json: data }, function (err, response, body) { try { if (err || !response || response.statusCode != 200) { // node.request sends an undefined response when there is an issue ... @@ -3279,9 +3279,9 @@ function appengine_call(method, args, on_success, on_error) { on_error("" + err + " " + (response && response.statusCode)); } } else { - ct = JSON.parse(body); + if (typeof body === "string") body = JSON.parse(body); if (on_success) { - on_success.apply(this, [ct]); + on_success.apply(this, [body]); } } } catch (e) { diff --git a/python3/app.yaml b/python3/app.yaml index cda0c0f..a8fa949 100644 --- a/python3/app.yaml +++ b/python3/app.yaml @@ -1,4 +1,4 @@ -runtime: python313 +runtime: python312 app_engine_apis: true builtins: - deferred: on