コード例 #1
0
 private void Log(ReceivedManagementMessage message)
 {
     if (!message.IsByteCount)
     {
         _logger.Info($"Management -> {message}");
     }
 }
コード例 #2
0
        private async Task HandleStateMessage(ReceivedManagementMessage message)
        {
            ManagementState managementState = message.State();

            if (managementState.HasError)
            {
                await TrySend(_managementChannel.Messages.Disconnect());

                if (_lastError == VpnError.None)
                {
                    _lastError = managementState.Error;
                }
            }
            else
            {
                if (managementState.HasStatus)
                {
                    OnVpnStateChanged(new VpnState(managementState.Status, _lastError,
                                                   managementState.LocalIpAddress, managementState.RemoteIpAddress, default, label: _endpoint.Server.Label));
コード例 #3
0
        /// <summary>
        /// Primary VPN connect method, doesn't finish until disconnect.
        /// This method will raise <see cref="TransportStatsChanged"/>, <see cref="VpnStateChanged"/>
        /// </summary>
        /// <param name="credentials"><see cref="VpnCredentials"/> (username and password) for authenticating to VPN server</param>
        /// <param name="endpoint"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task StartVpnConnection(VpnCredentials credentials, VpnEndpoint endpoint, CancellationToken cancellationToken)
        {
            _lastError           = VpnError.None;
            _credentials         = credentials;
            _endpoint            = endpoint;
            _sendingFailed       = false;
            _disconnectRequested = false;
            _disconnectAccepted  = false;

            while (!cancellationToken.IsCancellationRequested && !_sendingFailed)
            {
                ReceivedManagementMessage message = await Receive();

                if (message.IsChannelDisconnected)
                {
                    if (!_disconnectRequested && _lastError == VpnError.None)
                    {
                        _lastError = VpnError.Unknown;
                    }

                    OnVpnStateChanged(VpnStatus.Disconnecting);
                    return;
                }

                if (!cancellationToken.IsCancellationRequested)
                {
                    HandleMessage(message);
                }
            }

            if (!_sendingFailed)
            {
                await SendExit();
            }

            if (!cancellationToken.IsCancellationRequested && _sendingFailed)
            {
                OnVpnStateChanged(VpnStatus.Disconnecting);
            }
        }
コード例 #4
0
ファイル: ManagementClient.cs プロジェクト: wicusross/win-app
 private void HandleErrorMessage(ReceivedManagementMessage message)
 {
     _lastError = message.Error().VpnError();
 }
コード例 #5
0
ファイル: ManagementClient.cs プロジェクト: wicusross/win-app
        private void HandleByteMessage(ReceivedManagementMessage message)
        {
            var bandwidth = message.Bandwidth();

            OnTransportStatsChanged(bandwidth);
        }
コード例 #6
0
ファイル: ManagementClient.cs プロジェクト: wicusross/win-app
        private async void HandleMessage(ReceivedManagementMessage message)
        {
            var handled = false;

            if (message.IsState)
            {
                await HandleStateMessage(message);

                handled = true;
            }
            else if (message.IsBytecount)
            {
                HandleByteMessage(message);
                handled = true;
            }
            else if (message.IsError)
            {
                HandleErrorMessage(message);
                handled = true;
            }
            else if (message.IsDisconnectReceived)
            {
                OnVpnStateChanged(VpnStatus.Disconnecting);
                _disconnectAccepted = true;
                handled             = true;
            }
            else if (message.IsUsernameNeeded)
            {
                await TrySend(_managementChannel.Messages.Username(_credentials.Username));

                handled = true;
            }
            else if (message.IsPasswordNeeded)
            {
                await TrySend(_managementChannel.Messages.Password(_credentials.Password));

                handled = true;
            }

            if (handled)
            {
                return;
            }

            if (_disconnectRequested && !_disconnectAccepted)
            {
                await TrySend(_managementChannel.Messages.Disconnect());
            }
            else if (message.IsWaitingHoldRelease)
            {
                await TrySend(_managementChannel.Messages.EchoOn());
            }
            else if (message.IsEchoSet)
            {
                await TrySend(_managementChannel.Messages.StateOn());
            }
            else if (message.IsStateSet)
            {
                await TrySend(_managementChannel.Messages.Bytecount());
            }
            else if (message.IsBytecountSet)
            {
                await TrySend(_managementChannel.Messages.LogOn());
            }
            else if (message.IsLogSet)
            {
                await TrySend(_managementChannel.Messages.HoldRelease());
            }
        }