private async static void discoveryRequestReceived(Windows.Networking.Sockets.DatagramSocketMessageReceivedEventArgs args) { if (args.RemoteAddress.RawName == "127.0.0.1") return; try { var responseSocket = new TCPSocket(); await responseSocket.Connect(args.RemoteAddress.RawName, DEFAULT_DISCOVERY_PORT); await responseSocket.Send(await GuidHandling.GetMyGuid() + ":" + myName); } catch(Exception) { } }
private async static void requestReceived(TCPSocket sender) { await uiThreadDispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { try { progressIndeterminate(); sender.ProgressRepport += (x) => { if (ProgressRepport != null) ProgressRepport(x); }; string requestContents = await sender.Recv(); progressStop(); Request receivedRequest = JSONHandling.ParseJSONResponse<Request>(requestContents); await requestHandlerMap[receivedRequest.Type](receivedRequest.SenderGuid, receivedRequest.Data, sender); } catch(OutOfMemoryException) { DialogBoxes.ShowMessageBox("File too big to fit in memory"); } catch(FileTransferException error) { DialogBoxes.ShowMessageBox(error.Message); } catch(Exception error) { DialogBoxes.ShowMessageBox("Unknown error " + error.Message); } finally { progressStop(); sender.Send(Strings.RESPONSE_REJECT); } }); }
private async static Task preSendNoCryptRequestReceived(string peer, string data, TCPSocket socket) { if (peerMap.ContainsKey(peer) && peerMap[peer].Paired) { PreSendRequestNoCrypt registration = JSONHandling.ParseJSONResponse<PreSendRequestNoCrypt>(data); await DialogBoxes.AskForConfirmation(registration.FileName + " from " + peerMap[peer].Name + " over insecure connection. Accept?", async () => { preSendRegistrationsNoCrypt[peer] = registration; await socket.Send(Strings.RESPONSE_OK); }, async () => { await socket.Send(Strings.RESPONSE_REJECT); }); } else { await socket.Send(Strings.RESPONSE_NOT_PAIRED); } }
private async static Task preSendRequestReceived(string peer, string data, TCPSocket socket) { if(peerMap.ContainsKey(peer) && peerMap[peer].Paired) { PreSendRequest registration = JSONHandling.ParseJSONResponse<PreSendRequest>(data); if(!registration.key.VerifySignature(peerMap[peer].SharedPassword)) { socket.Send(Strings.RESPONSE_REJECT); } await DialogBoxes.AskForConfirmation(registration.FileName+" from "+peerMap[peer].Name+". Accept?", async () => { preSendRegistrations[peer] = registration; await socket.Send(Strings.RESPONSE_OK); }, async () => { await socket.Send(Strings.RESPONSE_REJECT); }); } else { await socket.Send(Strings.RESPONSE_NOT_PAIRED); } }
private async static Task fileReceivedNoCrypt(string peer, string data, TCPSocket socket) { progressIndeterminate(); if (!(peerMap.ContainsKey(peer) && peerMap[peer].Paired)) { progressStop(); await socket.Send(Strings.RESPONSE_NOT_PAIRED); return; } if (!(preSendRegistrationsNoCrypt.ContainsKey(peer))) { progressStop(); await socket.Send(Strings.RESPONSE_REJECT); return; } PreSendRequestNoCrypt registration = preSendRegistrationsNoCrypt[peer]; preSendRegistrationsNoCrypt.Remove(peer); File receivedFile = JSONHandling.ParseJSONResponse<File>(data); if (receivedFile.FileName != registration.FileName) { progressStop(); throw new FileTransferException("File name mismatch"); } byte[] fileContents = receivedFile.GetContents(); progressStop(); FileReceived(receivedFile.FileName, fileContents); }
private async static Task pairRequestReceived(string peer, string data, TCPSocket socket) { progressIndeterminate(); var request = JSONHandling.ParseJSONResponse<PairingRequest>(data); if(request.Guid!=peer) { progressStop(); await socket.Send(Strings.RESPONSE_REJECT); return; } string signatureSecret = await DialogBoxes.AskForInput("Pairing request", "Please enter the shared password"); if (signatureSecret == null) { progressStop(); await socket.Send(Strings.RESPONSE_REJECT); return; } if(!request.PublicKey.VerifySignature(signatureSecret)) { progressStop(); await socket.Send(Strings.RESPONSE_BAD_SIGNATURE); await DialogBoxes.ShowMessageBox("Shared password incorrect"); return; } string myPrivateKey = DiffieHellman.generate_DH_Private(); string myPublicKey = DiffieHellman.calculate_DH_Public(myPrivateKey); PublicKey returnedKey = new PublicKey(myPublicKey, signatureSecret); await sendRequestToSocket(socket, Strings.REQYEST_TYPE_PUBLICKEY, JSONHandling.SerializeObject(returnedKey)); string response = await socket.Recv(); progressStop(); if(response!=Strings.RESPONSE_OK) { await DialogBoxes.ShowMessageBox(response); return; } Peer newPeer = new Peer(request.Guid, request.Name); newPeer.LastKnownIP = socket.GetIP(); newPeer.MyPrivateKey = myPrivateKey; newPeer.PublicKey = request.PublicKey.Key; newPeer.SharedPassword = signatureSecret; addPeer(newPeer); await StorePeers(); RefreshPeerMap(); }
private async static Task<TCPSocket> sendRequestToSocket(TCPSocket socket, string type, string data, int timeout=5000) { var request = new Request(); request.Data = data; request.SenderGuid = await GuidHandling.GetMyGuid(); request.Type = type; socket.SetTimeout(timeout); await socket.Send(JSONHandling.SerializeObject(request)); return socket; }