Beispiel #1
0
        /// <summary>
        /// Create a connection to a remote endpoint.
        /// </summary>
        public virtual NetConnection Connect(IPEndPoint remoteEndPoint, NetOutgoingMessage?hailMessage)
        {
            if (remoteEndPoint == null)
            {
                throw new ArgumentNullException(nameof(remoteEndPoint));
            }

            if (Configuration.DualStack)
            {
                remoteEndPoint = NetUtility.MapToIPv6(remoteEndPoint);
            }

            if (Status == NetPeerStatus.NotRunning)
            {
                throw new LidgrenException("Must call Start() first.");
            }

            if (ConnectionLookup.ContainsKey(remoteEndPoint))
            {
                throw new LidgrenException("Already connected to that endpoint!");
            }

            if (Handshakes.TryGetValue(remoteEndPoint, out NetConnection? hs))
            {
                // already trying to connect to that endpoint; make another try
                switch (hs.Status)
                {
                case NetConnectionStatus.InitiatedConnect:
                    // send another connect
                    hs._connectRequested = true;
                    break;

                case NetConnectionStatus.RespondedConnect:
                    // send another response
                    hs.SendConnectResponse(NetTime.Now, false);
                    break;

                default:
                    // weird
                    LogWarning(NetLogMessage.FromValues(NetLogCode.UnexpectedHandshakeStatus, value: (int)hs.Status));
                    break;
                }
                return(hs);
            }

            var conn = new NetConnection(this, remoteEndPoint);

            conn.Status           = NetConnectionStatus.InitiatedConnect;
            conn.LocalHailMessage = hailMessage;

            // handle on network thread
            conn._connectRequested    = true;
            conn._connectionInitiator = true;

            Handshakes.TryAdd(remoteEndPoint, conn);
            return(conn);
        }
Beispiel #2
0
        private static void HandleHandshakeMessage2(SksMessageReceivedEventArgs sksMessageReceivedEventArgs)
        {
            var user = GetUserByIpAndPort(sksMessageReceivedEventArgs.FromIp, sksMessageReceivedEventArgs.FromPort);

            Handshake handshake;

            lock (handshakesLock)
            {
                handshake = Handshakes.FirstOrDefault(h => h.User == user);
            }

            if (handshake == null)
            {
                Logger.Log(LogTag, "ERROR: Handshake message 2 - handshake doesn't exist");
                return;
            }

            var message = HandshakeMessage2.FromString(sksMessageReceivedEventArgs.Message);

            user.Protocol = message.ProtocolId;

            switch (message.ProtocolId)
            {
            case ProtocolType.None:
                break;

            case ProtocolType.Akep2:
                InitAkep2(user, SksClientType.Local);
                break;

            case ProtocolType.LamportScheme:
                InitLamportScheme(user, SksClientType.Local);
                break;

            case ProtocolType.OtwayRees:
                break;

            case ProtocolType.Rsa:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Beispiel #3
0
        private static void HandleHandshakeMessage1(SksMessageReceivedEventArgs sksMessageReceivedEventArgs)
        {
            var user = GetUserByIpAndPort(sksMessageReceivedEventArgs.FromIp, sksMessageReceivedEventArgs.FromPort);

            Handshake handshake;

            lock (handshakesLock)
            {
                handshake = Handshakes.FirstOrDefault(h => h.User == user);
            }

            if (handshake != null)
            {
                Logger.Log(LogTag, "ERROR: Handshake message 1 - handshake already existed");
                return;
            }

            handshake = InitHandshake(user, SksClientType.Remote);

            if (handshake == null)
            {
                return;
            }

            var message = HandshakeMessage1.FromString(sksMessageReceivedEventArgs.Message);

            user.Protocol = Utils.DetermineProtocol(user);

            if (user.Protocol == ProtocolType.LamportScheme)
            {
                InitLamportScheme(user, SksClientType.Remote);
            }

            var newMessage = new HandshakeMessage2(user.Protocol, null);

            user.SendMessage(newMessage.ToString());

            handshake.IncrementMessageCount();
        }
Beispiel #4
0
        public static Handshake InitHandshake(User user, SksClientType clientType)
        {
            Logger.Log(LogTag, $"InitHandshake - User: {user.Name}. ClientType: {clientType}");

            lock (handshakesLock)
            {
                if (Handshakes.Any(h => h.User == user))
                {
                    Logger.Log(LogTag, "ERROR: Handshake already exists");
                    return(null);
                }
            }

            var newHandshake = new Handshake(user);

            newHandshake.Start(clientType);

            lock (handshakesLock)
            {
                Handshakes.Add(newHandshake);
            }

            return(newHandshake);
        }