async def login(self, client, username): print("User trying to log in:", username) user = get_user_by_name(username) if not user: raise common.RMCError("RendezVous::InvalidUsername") server = get_user_by_name(SECURE_SERVER) url = common.StationURL(scheme="prudps", address="127.0.0.1", port=1224, PID=server.pid, CID=1, type=2, sid=1, stream=10) conn_data = authentication.RVConnectionData() conn_data.main_station = url conn_data.special_protocols = [] conn_data.special_station = common.StationURL() response = rmc.RMCResponse() response.result = common.Result.success() response.pid = user.pid response.ticket = self.generate_ticket(user, server) response.connection_data = conn_data response.server_name = "Example server" return response
async def update_and_get_all_information(self, nna_info, presence, birthday): logger.info("FriendsClientV2.update_and_get_all_information()") #--- request --- stream = streams.StreamOut(self.settings) stream.add(nna_info) stream.add(presence) stream.datetime(birthday) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_UPDATE_AND_GET_ALL_INFORMATION, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.principal_preference = stream.extract(PrincipalPreference) obj.comment = stream.extract(Comment) obj.friends = stream.list(FriendInfo) obj.sent_requests = stream.list(FriendRequest) obj.received_requests = stream.list(FriendRequest) obj.blacklist = stream.list(BlacklistedPrincipal) obj.unk1 = stream.bool() obj.notifications = stream.list(PersistentNotification) obj.unk2 = stream.bool() if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("FriendsClientV2.update_and_get_all_information -> done") return obj
async def login(self, client, username): assert username == "username" pid = 1001 stick = kerberos.ServerTicket() stick.timestamp = common.DateTime.now() stick.source = pid stick.session_key = bytes(32) ctick = kerberos.ClientTicket() ctick.session_key = bytes(32) ctick.target = 100 ctick.internal = stick.encrypt(b"testkey", self.settings) kerb = kerberos.KeyDerivationOld(65000, 1024) key = kerb.derive_key(b"password", pid) connection_data = authentication.RVConnectionData() connection_data.main_station = common.StationURL(address=HOST, port=12346, PID=100, sid=1) connection_data.special_protocols = [] connection_data.special_station = common.StationURL() connection_data.server_time = common.DateTime.now() response = rmc.RMCResponse() response.result = common.Result.success() response.pid = pid response.ticket = ctick.encrypt(key, self.settings) response.connection_data = connection_data response.server_name = "server build name" return response
async def validate_and_request_ticket_with_custom_data( self, username, extra_data): logger.info( "AuthenticationClientNX.validate_and_request_ticket_with_custom_data()" ) #--- request --- stream = streams.StreamOut(self.settings) stream.string(username) stream.anydata(extra_data) data = await self.client.request( self.PROTOCOL_ID, self.METHOD_VALIDATE_AND_REQUEST_TICKET_WITH_CUSTOM_DATA, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.result = stream.result() obj.pid = stream.pid() obj.ticket = stream.buffer() obj.connection_data = stream.extract(RVConnectionData) obj.server_name = stream.string() obj.source_key = stream.string() if not stream.eof(): raise ValueError( "Response is bigger than expected (got %i bytes, but only %i were read)" % (stream.size(), stream.tell())) logger.info( "AuthenticationClientNX.validate_and_request_ticket_with_custom_data -> done" ) return obj
async def get_custom_ranking_by_data_id(param): #--- request --- stream = streams.StreamOut(datastore_smm_client.settings) stream.add(param) data = await datastore_smm_client.client.request(datastore_smm_client.PROTOCOL_ID, 50, stream.get()) #--- response --- stream = streams.StreamIn(data, datastore_smm_client.settings) obj = rmc.RMCResponse() obj.ranking_result = stream.list(DataStoreCustomRankingResult) obj.results = stream.list(common.Result) return obj
async def get_private_data(self): logger.info("AccountClient.get_private_data()") #--- request --- stream = streams.StreamOut(self.settings) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_GET_PRIVATE_DATA, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.result = stream.bool() obj.data = stream.anydata() if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("AccountClient.get_private_data -> done") return obj
async def add_friend_by_name(self, name): logger.info("FriendsClientV2.add_friend_by_name()") #--- request --- stream = streams.StreamOut(self.settings) stream.string(name) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_ADD_FRIEND_BY_NAME, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.request = stream.extract(FriendRequest) obj.info = stream.extract(FriendInfo) if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("FriendsClientV2.add_friend_by_name -> done") return obj
async def retrieve_account(self): logger.info("AccountClient.retrieve_account()") #--- request --- stream = streams.StreamOut(self.settings) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_RETRIEVE_ACCOUNT, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.account_data = stream.extract(AccountData) obj.public_data = stream.anydata() obj.private_data = stream.anydata() if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("AccountClient.retrieve_account -> done") return obj
async def get_multiple_public_data(self, pids): logger.info("AccountClient.get_multiple_public_data()") #--- request --- stream = streams.StreamOut(self.settings) stream.list(pids, stream.pid) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_GET_MULTIPLE_PUBLIC_DATA, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.result = stream.bool() obj.data = stream.list(stream.anydata) if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("AccountClient.get_multiple_public_data -> done") return obj
async def get_last_connection_stats(self, pid): logger.info("AccountClient.get_last_connection_stats()") #--- request --- stream = streams.StreamOut(self.settings) stream.pid(pid) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_GET_LAST_CONNECTION_STATS, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.last_session_login = stream.datetime() obj.last_session_logout = stream.datetime() obj.current_session_login = stream.datetime() if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("AccountClient.get_last_connection_stats -> done") return obj
async def deliver_message(self, message): logger.info("MessagingClient.deliver_message()") #--- request --- stream = streams.StreamOut(self.settings) stream.anydata(message) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_DELIVER_MESSAGE, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.modified_message = stream.anydata() obj.sandbox_node_ids = stream.list(stream.u32) obj.participants = stream.list(stream.pid) if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("MessagingClient.deliver_message -> done") return obj
async def request_connection_data(self, cid, pid): logger.info("SecureConnectionClient.request_connection_data()") #--- request --- stream = streams.StreamOut(self.settings) stream.u32(cid) stream.pid(pid) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_REQUEST_CONNECTION_DATA, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.result = stream.bool() obj.connection_data = stream.list(ConnectionData) if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("SecureConnectionClient.request_connection_data -> done") return obj
async def register(self, urls): logger.info("SecureConnectionClient.register()") #--- request --- stream = streams.StreamOut(self.settings) stream.list(urls, stream.stationurl) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_REGISTER, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.result = stream.result() obj.connection_id = stream.u32() obj.public_station = stream.stationurl() if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("SecureConnectionClient.register -> done") return obj
async def register(self, client, urls): address, port = client.remote_address() response = rmc.RMCResponse() response.result = common.Result.success() response.connection_id = next(self.connection_id) response.public_station = common.StationURL(scheme="prudp", address=address, port=port, natf=0, natm=0, pmp=0, upnp=0, Tpt=2, type=11, sid=client.remote_sid()) self.clients.register(client) return response
async def get_relay_signature_key(self): logger.info("NATTraversalClient.get_relay_signature_key()") #--- request --- stream = streams.StreamOut(self.settings) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_GET_RELAY_SIGNATURE_KEY, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.mode = stream.s32() obj.time = stream.datetime() obj.address = stream.string() obj.port = stream.u16() obj.address_type = stream.s32() obj.game_server_id = stream.u32() if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("NATTraversalClient.get_relay_signature_key -> done") return obj
async def nintendo_create_account(self, name, key, groups, email, auth_data): logger.info("AccountClient.nintendo_create_account()") #--- request --- stream = streams.StreamOut(self.settings) stream.string(name) stream.string(key) stream.u32(groups) stream.string(email) stream.anydata(auth_data) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_NINTENDO_CREATE_ACCOUNT, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.pid = stream.pid() obj.pid_hmac = stream.string() if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("AccountClient.nintendo_create_account -> done") return obj
async def request_ticket(self, source, target): logger.info("AuthenticationClient.request_ticket()") #--- request --- stream = streams.StreamOut(self.settings) stream.pid(source) stream.pid(target) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_REQUEST_TICKET, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.result = stream.result() obj.ticket = stream.buffer() if not stream.eof(): raise ValueError( "Response is bigger than expected (got %i bytes, but only %i were read)" % (stream.size(), stream.tell())) logger.info("AuthenticationClient.request_ticket -> done") return obj
async def add_friend_request(self, unk1, unk2, unk3, unk4, unk5, game_key, unk6): logger.info("FriendsClientV2.add_friend_request()") #--- request --- stream = streams.StreamOut(self.settings) stream.u32(unk1) stream.u8(unk2) stream.string(unk3) stream.u8(unk4) stream.string(unk5) stream.add(game_key) stream.datetime(unk6) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_ADD_FRIEND_REQUEST, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.request = stream.extract(FriendRequest) obj.info = stream.extract(FriendInfo) if not stream.eof(): raise ValueError("Response is bigger than expected (got %i bytes, but only %i were read)" %(stream.size(), stream.tell())) logger.info("FriendsClientV2.add_friend_request -> done") return obj
async def login_with_context(self, login_data): logger.info("AuthenticationClient.login_with_context()") #--- request --- stream = streams.StreamOut(self.settings) stream.anydata(login_data) data = await self.client.request(self.PROTOCOL_ID, self.METHOD_LOGIN_WITH_CONTEXT, stream.get()) #--- response --- stream = streams.StreamIn(data, self.settings) obj = rmc.RMCResponse() obj.result = stream.result() obj.pid = stream.pid() obj.ticket = stream.buffer() obj.connection_data = stream.extract(RVConnectionData) if not stream.eof(): raise ValueError( "Response is bigger than expected (got %i bytes, but only %i were read)" % (stream.size(), stream.tell())) logger.info("AuthenticationClient.login_with_context -> done") return obj