private void Log(ReceivedManagementMessage message) { if (!message.IsByteCount) { _logger.Info($"Management -> {message}"); } }
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));
/// <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); } }
private void HandleErrorMessage(ReceivedManagementMessage message) { _lastError = message.Error().VpnError(); }
private void HandleByteMessage(ReceivedManagementMessage message) { var bandwidth = message.Bandwidth(); OnTransportStatsChanged(bandwidth); }
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()); } }