Пример #1
0
        public ConnectionService(Session session, UserauthArgs auth)
            : base(session)
        {
            Contract.Requires(auth != null);

            _auth = auth;
        }
Пример #2
0
        private void HandleMessage(PasswordRequestMessage message)
        {
            var verifed = false;

            var args = new UserauthArgs(_session, message.Username, message.Password);

            if (Userauth != null)
            {
                Userauth(this, args);
                verifed = args.Result;
            }

            if (verifed)
            {
                _session.RegisterService(message.ServiceName, args);

                Succeed?.Invoke(this, message.ServiceName);

                _session.SendMessage(new SuccessMessage());
                return;
            }
            else
            {
                _session.SendMessage(new FailureMessage());
            }
        }
Пример #3
0
        public ConnectionService(Session session, UserauthArgs auth)
            : base(session)
        {
            Contract.Requires(auth != null);

            _auth = auth;

            Task.Run(() => { MessageLoop(); });
        }
Пример #4
0
        public SessionRequestedArgs(SessionChannel channel, string command, UserauthArgs userauthArgs)
        {
            Contract.Requires(channel != null);
            Contract.Requires(command != null);
            Contract.Requires(userauthArgs != null);

            this.Channel              = channel;
            this.CommandText          = command;
            this.AttachedUserauthArgs = userauthArgs;
        }
Пример #5
0
        public SessionRequestedArgs(SessionChannel channel, string command, UserauthArgs userauthArgs)
        {
            Contract.Requires(channel != null);
            Contract.Requires(command != null);
            Contract.Requires(userauthArgs != null);

            Channel = channel;
            CommandText = command;
            AttachedUserauthArgs = userauthArgs;
        }
Пример #6
0
        public CommandRequestedArgs(SessionChannel channel, string type, string command, UserauthArgs userauthArgs)
        {
            Contract.Requires(channel != null);
            Contract.Requires(command != null);
            Contract.Requires(userauthArgs != null);

            Channel              = channel;
            ShellType            = type;
            CommandText          = command;
            AttachedUserauthArgs = userauthArgs;
        }
Пример #7
0
        public EnvironmentArgs(SessionChannel channel, string name, string value, UserauthArgs userauthArgs)
        {
            Contract.Requires(channel != null);
            Contract.Requires(name != null);
            Contract.Requires(value != null);
            Contract.Requires(userauthArgs != null);

            Channel = channel;
            Name    = name;
            Value   = value;
            AttachedUserauthArgs = userauthArgs;
        }
Пример #8
0
        public TcpRequestArgs(SessionChannel channel, string host, int port, string originatorIP, int originatorPort, UserauthArgs userauthArgs)
        {
            Contract.Requires(channel != null);
            Contract.Requires(host != null);
            Contract.Requires(originatorIP != null);

            Channel              = channel;
            Host                 = host;
            Port                 = port;
            OriginatorIP         = originatorIP;
            OriginatorPort       = originatorPort;
            AttachedUserauthArgs = userauthArgs;
        }
Пример #9
0
        private void HandleMessage(PublicKeyRequestMessage message)
        {
            if (Session._publicKeyAlgorithms.ContainsKey(message.KeyAlgorithmName))
            {
                if (!message.HasSignature)
                {
                    _session.SendMessage(new PublicKeyOkMessage {
                        KeyAlgorithmName = message.KeyAlgorithmName, PublicKey = message.PublicKey
                    });
                    return;
                }

                var keyAlg = Session._publicKeyAlgorithms[message.KeyAlgorithmName](null);
                keyAlg.LoadKeyAndCertificatesData(message.PublicKey);

                var sig     = keyAlg.GetSignature(message.Signature);
                var verifed = false;

                using (var worker = new SshDataWorker())
                {
                    worker.WriteBinary(_session.SessionId);
                    worker.Write(message.PayloadWithoutSignature);

                    verifed = keyAlg.VerifyData(worker.ToByteArray(), sig);
                }

                var args = new UserauthArgs(message.KeyAlgorithmName, keyAlg.GetFingerprint(), message.PublicKey);
                if (verifed && Userauth != null)
                {
                    Userauth(this, args);
                    verifed = args.Result;
                }

                if (verifed)
                {
                    _session.RegisterService(message.ServiceName, args);
                    if (Succeed != null)
                    {
                        Succeed(this, message.ServiceName);
                    }
                    _session.SendMessage(new SuccessMessage());
                    return;
                }
                else
                {
                    _session.SendMessage(new FailureMessage());
                    throw new SshConnectionException("Authentication fail.", DisconnectReason.NoMoreAuthMethodsAvailable);
                }
            }
            _session.SendMessage(new FailureMessage());
        }
Пример #10
0
        private void AuthenticationSuccessful(RequestMessage message, UserauthArgs args,
                                              AuthenticationMethod method)
        {
            this.Session.AuthenticationMethods[method] = true;

            var remainingAuthenticationMethods = this.GetRemainingAuthenticationMethods();

            if (remainingAuthenticationMethods.Count > 0)
            {
                this.Session.SendMessage(new FailureMessage(remainingAuthenticationMethods, true));
                return;
            }
            this.AuthenticationSuccessful(message, args);
        }
Пример #11
0
        private void HandleMessage(PublicKeyRequestMessage message)
        {
            if (Session._publicKeyAlgorithms.ContainsKey(message.KeyAlgorithmName))
            {
                var verifed = false;

                var keyAlg = Session._publicKeyAlgorithms[message.KeyAlgorithmName](null);
                keyAlg.LoadKeyAndCertificatesData(message.PublicKey);

                var args = new UserauthArgs(base._session, message.Username, message.KeyAlgorithmName, keyAlg.GetFingerprint(), message.PublicKey);
                Userauth?.Invoke(this, args);
                verifed = args.Result;

                if (!verifed)
                {
                    _session.SendMessage(new FailureMessage());
                    return;
                }

                if (!message.HasSignature)
                {
                    _session.SendMessage(new PublicKeyOkMessage {
                        KeyAlgorithmName = message.KeyAlgorithmName, PublicKey = message.PublicKey
                    });
                    return;
                }

                var sig = keyAlg.GetSignature(message.Signature);

                using (var worker = new SshDataWorker())
                {
                    worker.WriteBinary(_session.SessionId);
                    worker.Write(message.PayloadWithoutSignature);

                    verifed = keyAlg.VerifyData(worker.ToByteArray(), sig);
                }

                if (!verifed)
                {
                    _session.SendMessage(new FailureMessage());
                    return;
                }

                _session.RegisterService(message.ServiceName, args);
                Succeed?.Invoke(this, message.ServiceName);
                _session.SendMessage(new SuccessMessage());
            }
        }
Пример #12
0
        private void HandleMessage(PublicKeyRequestMessage message)
        {
            if (Session._publicKeyAlgorithms.ContainsKey(message.KeyAlgorithmName))
            {
                if (!message.HasSignature)
                {
                    _session.SendMessage(new PublicKeyOkMessage { KeyAlgorithmName = message.KeyAlgorithmName, PublicKey = message.PublicKey });
                    return;
                }

                var keyAlg = Session._publicKeyAlgorithms[message.KeyAlgorithmName](null);
                keyAlg.LoadKeyAndCertificatesData(message.PublicKey);

                var sig = keyAlg.GetSignature(message.Signature);
                var verifed = false;

                using (var worker = new SshDataWorker())
                {
                    worker.WriteBinary(_session.SessionId);
                    worker.Write(message.PayloadWithoutSignature);

                    verifed = keyAlg.VerifyData(worker.ToByteArray(), sig);
                }

                var args = new UserauthArgs(message.KeyAlgorithmName, keyAlg.GetFingerprint(), message.PublicKey);
                if (verifed && Userauth != null)
                {
                    Userauth(this, args);
                    verifed = args.Result;
                }

                if (verifed)
                {
                    _session.RegisterService(message.ServiceName, args);
                    if (Succeed != null)
                        Succeed(this, message.ServiceName);
                    _session.SendMessage(new SuccessMessage());
                    return;
                }
                else
                {
                    _session.SendMessage(new FailureMessage());
                    throw new SshConnectionException("Authentication fail.", DisconnectReason.NoMoreAuthMethodsAvailable);
                }
            }
            _session.SendMessage(new FailureMessage());
        }
Пример #13
0
        public PtyArgs(SessionChannel channel, string terminal, uint heightPx, uint heightRows, uint widthPx, uint widthChars, string modes, UserauthArgs userauthArgs)
        {
            Contract.Requires(channel != null);
            Contract.Requires(terminal != null);
            Contract.Requires(modes != null);
            Contract.Requires(userauthArgs != null);

            Channel    = channel;
            Terminal   = terminal;
            HeightPx   = heightPx;
            HeightRows = heightRows;
            WidthPx    = widthPx;
            WidthChars = widthChars;
            Modes      = modes;

            AttachedUserauthArgs = userauthArgs;
        }
Пример #14
0
        private void HandleMessage(PasswordRequestMessage message)
        {
            var args = new UserauthArgs(null, null, null);

            if (this.Session.AuthenticationMethods == null ||
                !this.Session.AuthenticationMethods.ContainsKey(AuthenticationMethod.Password))
            {
                this.Session.SendMessage(new FailureMessage());
                return;
            }

            // Handle authentication here
            if (message.Password != "password")
            {
                this.Session.SendMessage(new FailureMessage());
                return;
            }

            this.AuthenticationSuccessful(message, args, AuthenticationMethod.Password);
        }
Пример #15
0
        private void HandleMessage(NoneRequestMessage message)
        {
            var args = new UserauthArgs(null, null, null);

            this.Username = message.Username;

            if (this.Session.AuthenticationMethods == null)
            {
                this.AuthenticationSuccessful(message, args);
                return;
            }

            var remainingAuthenticationMethods = this.GetRemainingAuthenticationMethods();

            if (remainingAuthenticationMethods.Count == 0)
            {
                this.AuthenticationSuccessful(message, args);
                return;
            }

            this.Session.SendMessage(new FailureMessage(remainingAuthenticationMethods, false));
        }
Пример #16
0
 private void AuthenticationSuccessful(RequestMessage message, UserauthArgs args)
 {
     this.Session.RegisterService(message.ServiceName, args);
     this.Succeed?.Invoke(this, message.ServiceName);
     this.Session.SendMessage(new SuccessMessage());
 }
Пример #17
0
        static void service_Userauth(object sender, UserauthArgs e)
        {
            Console.WriteLine("Client {0} fingerprint: {1}.", e.KeyAlgorithm, e.Fingerprint);

            e.Result = true;
        }
Пример #18
0
        private void HandleMessage(PublicKeyRequestMessage message)
        {
            if (this.Session.AuthenticationMethods == null ||
                !this.Session.AuthenticationMethods.ContainsKey(AuthenticationMethod.PublicKey) ||
                !Session.PublicKeyAlgorithms.ContainsKey(message.KeyAlgorithmName))
            {
                this.Session.SendMessage(new FailureMessage());
                throw new SshConnectionException("Authentication fail.",
                                                 DisconnectReason.NoMoreAuthMethodsAvailable);
            }

            if (!message.HasSignature)
            {
                this.Session.SendMessage(new PublicKeyOkMessage {
                    KeyAlgorithmName = message.KeyAlgorithmName,
                    PublicKey        = message.PublicKey
                });
                return;
            }

            var keyAlg = Session.PublicKeyAlgorithms[message.KeyAlgorithmName](null);

            keyAlg.LoadKeyAndCertificatesData(message.PublicKey);
            var  sig = keyAlg.GetSignature(message.Signature);
            bool verifed;

            using (var worker = new SshDataWorker()) {
                worker.WriteBinary(this.Session.SessionId);
                worker.Write(message.PayloadWithoutSignature);
                verifed = keyAlg.VerifyData(worker.ToByteArray(), sig);
            }

            var args = new UserauthArgs(message.KeyAlgorithmName, keyAlg.GetFingerprint(), message.PublicKey);

            if (verifed && this.Userauth != null)
            {
                this.Userauth(this, args);
                verifed = args.Result;
            }

            if (!verifed)
            {
                this.Session.SendMessage(new FailureMessage());
                throw new SshConnectionException("Authentication fail.",
                                                 DisconnectReason.NoMoreAuthMethodsAvailable);
            }

            if (this.Session.clientKeyRepository != null &&
                this.Session.clientKeyRepository.GetKeyForClient(this.Username) != null)
            {
                var clientKey  = Encoding.ASCII.GetString(this.Session.clientKeyRepository.GetKeyForClient(this.Username));
                var messageKey = System.Convert.ToBase64String(message.PublicKey);
                if (clientKey == messageKey)
                {
                    this.AuthenticationSuccessful(message, args, AuthenticationMethod.PublicKey);
                    return;
                }
            }
            else
            {
                this.AuthenticationSuccessful(message, args, AuthenticationMethod.PublicKey);
                return;
            }

            throw new SshConnectionException("Authentication fail.",
                                             DisconnectReason.NoMoreAuthMethodsAvailable);
        }