private async Task HandleXmlPacket(Penguin penguin, string packet) { switch (packet) { case "<policy-file-request/>": await HandlePolicy(penguin); return; case "<msg t='sys'><body action='verChk' r='0'><ver v='153' /></body></msg>": await HandleVersionCheck(penguin); return; case "<msg t='sys'><body action='rndK' r='-1'></body></msg>": await HandleRandomKey(penguin); return; } if (packet.Substring(0, 40) == "<msg t='sys'><body action='login' r='0'>") { await HandleLogin(penguin, packet); } }
protected virtual async void StreamSocketListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args) { Debug.WriteLine("Accepting penguin"); Penguin penguin = new Penguin(this, args.Socket); await MServer.LogMessage("INFO", server_name, "Accepting new penguin"); await AddPenguin(penguin); using (var stream = args.Socket.InputStream.AsStreamForRead()) { while (penguins.ContainsKey(args.Socket)) { byte[] data = new byte[256]; int numBytesRead = await stream.ReadAsync(data, 0, data.Length); if (numBytesRead == 0) { await RemovePenguin(penguin); return; } String message = Encoding.UTF8.GetString(data).Substring(0, numBytesRead); Stack <string> packets = new Stack <string>(message.Split('\0')); packets.Pop(); foreach (string packet in packets) { Debug.WriteLine("[RECV] " + packet); await HandlePacket(penguin, packet); } } } }
private async Task AddPenguin(Penguin penguin) { await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { penguins.Add(penguin.socket, penguin); MServer.penguins.Add(penguin); latestPackets[penguin] = new Dictionary <string, string>(); }); }
private async Task HandlePolicy(Penguin penguin) { if (penguin.LoginStep == null) { await penguin.Send("<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>"); return; } await RemovePenguin(penguin); }
private async Task HandleRandomKey(Penguin penguin) { if (penguin.LoginStep == "Versioncheck") { penguin.Randkey = "e4a2dbcca10a7246817a83cdmCPPS"; await penguin.Send("<msg t='sys'><body action='rndK' r='-1'><k>" + penguin.Randkey + "</k></body></msg>"); penguin.LoginStep = "Randkey"; return; } await RemovePenguin(penguin); }
protected override async Task RemovePenguin(Penguin penguin) { if (penguins.ContainsKey(penguin.socket)) { await MServer.LogMessage("INFO", server_name, "Removing penguin"); await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Debug.WriteLine("Removing penguin"); penguins.Remove(penguin.socket); MServer.penguins.Remove(penguin); latestPackets.Remove(penguin); }); } }
protected override async Task HandleLogin(Penguin penguin, string packet) { if (penguin.LoginStep != "Randkey") { await RemovePenguin(penguin); return; } XmlDocument login_xml = new XmlDocument(); login_xml.LoadXml(packet); string username, password, dbpassword, dbpassword_encrypted; username = login_xml.GetElementsByTagName("nick")[0].InnerText; password = login_xml.GetElementsByTagName("pword")[0].InnerText; if (!await Database.UsernameExists(username)) { // await penguin.Send("%xt%e%-1%100%"); // await RemovePenguin(penguin); await penguin.Send("%xt%gs%-1%65.184.60.189:6113:mCPPS:4%"); await penguin.Send("%xt%l%-1%1%97debb64dcb0b0f1598f605318bc28fc%0%"); return; } Crypt2 crypt = new Crypt2(); dbpassword = (string)await Database.GetColumnFromUsername(username, "Password"); dbpassword_encrypted = GetAuthenticationHash(dbpassword, penguin.Randkey); if (!crypt.BCryptVerify(password, dbpassword)) { await penguin.Send("%xt%e%-1%101%"); return; } }
private async Task HandlePacket(Penguin penguin, string packet) { await MServer.LogMessage("INFO", server_name, "Received: " + packet); string start = packet.Substring(0, 1); switch (start) { case "<": await StoreXmlPacket(penguin, packet); break; case "%": // await StorePlayPacket(penguin, packet); break; } return; }
protected override async Task HandleLogin(Penguin penguin, string packet) { await Task.CompletedTask; }
abstract protected Task RemovePenguin(Penguin penguin);
protected virtual async Task HandleLogin(Penguin penguin, string packet) { await Task.CompletedTask; }
private async Task HandleVersionCheck(Penguin penguin) { await penguin.Send("<msg t='sys'><body action='apiOK' r='0'></body></msg>"); penguin.LoginStep = "Versioncheck"; }
private async Task StoreXmlPacket(Penguin penguin, string packet) { latestPackets[penguin]["<"] = packet; await Task.CompletedTask; }