Exemple #1
0
        private bool HandleRequest()
        {
            if (!EventsEnabled)
            {
                Logging.Info("pausing events until events are reenabled");
                __HoldSignal.WaitOne();
            }

            var line = __StreamReader.ReadLine();

            if (string.IsNullOrEmpty(line))
            {
                return(false);
            }

            IVPNResponse response = JsonConvert.DeserializeObject <IVPNResponse>(line, new JsonSerializerSettings {
                TypeNameHandling = TypeNameHandling.All
            });

            Logging.Info("received " + response);

            switch (response.GetType().ToString())
            {
            case "IVPN.IVPNHelloResponse":

                // Uncommment to test eror during connection to client proxy

                // Thread.Sleep(2000);
                // throw new Exception("This is some text exception with very long text");

                Logging.Info("got hello, server version is " + ((IVPNHelloResponse)response).Version);
                break;

            case "IVPN.IVPNServerListResponse":
                Logging.Info($"Got servers info [{((IVPNServerListResponse)response).VpnServers.OpenVPNServers.Count} openVPN; {((IVPNServerListResponse)response).VpnServers.WireGuardServers.Count} WireGuard]");

                VpnServersInfo retServers = ((IVPNServerListResponse)response).VpnServers;

                // When no servers received:
                // - on a initialization (ServiceConnected == false): throw an exception
                // - if we already initialized (servers already initialized) - just ignore this empty response
                if (!retServers.OpenVPNServers.Any() || !retServers.WireGuardServers.Any())
                {
                    if (ServiceConnected == false)
                    {
                        throw new ServersNotLoaded();
                    }
                    break;
                }

                VpnServerList = retServers;
                ServerListChanged(VpnServerList);

                if (ServiceConnected != true)
                {
                    ServiceConnected = true;     // final GUI initialization performs only after receiving servers-list
                }
                break;

            case "IVPN.IVPNPingServersResponse":
                IVPNPingServersResponse resp = (IVPNPingServersResponse)response;
                Logging.Info($"Got ping response for {resp.pingResults.Count} servers");
                ServersPingsUpdated(resp.pingResults);
                break;

            case "IVPN.IVPNStateResponse":
                ConnectionState(((IVPNStateResponse)response).State, ((IVPNStateResponse)response).StateAdditionalInfo);
                break;

            case "IVPN.IVPNConnectedResponse":
                IVPNConnectedResponse connectedRes = (IVPNConnectedResponse)response;
                Connected(connectedRes.TimeSecFrom1970, connectedRes.ClientIP, connectedRes.ServerIP);
                break;

            case "IVPN.IVPNDisconnectedResponse":
                IVPNDisconnectedResponse discRes = response as IVPNDisconnectedResponse;
                Disconnected(discRes.Failure, discRes.Reason, discRes.ReasonDescription);
                break;

            case "IVPN.IVPNGetPreferencesResponse":
                IVPNGetPreferencesResponse prefsRes = response as IVPNGetPreferencesResponse;
                Preferences(prefsRes.Preferences);
                break;

            case "IVPN.IVPNDiagnosticsGeneratedResponse":
            {
                IVPNDiagnosticsGeneratedResponse diag = response as IVPNDiagnosticsGeneratedResponse;
                DiagnosticsGenerated(diag);
            }
            break;

            case "IVPN.IVPNServiceExitingResponse":
                __IsExiting = true;
                ServiceExiting();
                break;

            case "IVPN.IVPNKillSwitchGetStatusResponse":
            case "IVPN.IVPNKillSwitchGetIsPestistentResponse":
            case "IVPN.IVPNSetAlternateDnsResponse":
            case "IVPN.IVPNEmptyResponse":
            case "IVPN.IVPNErrorResponse":
                __BlockingCollection.Add(response);
                break;
            }

            return(true);
        }
Exemple #2
0
        private bool HandleResponse()
        {
            if (!EventsEnabled)
            {
                Logging.Info("pausing events until events are reenabled");
                __HoldSignal.WaitOne();
            }

            string line = "";

            try
            {
                line = __StreamReader.ReadLine();
                if (string.IsNullOrEmpty(line))
                {
                    return(false);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to receive command ", ex);
            }

            Responses.IVPNResponse response;

            try
            {
                response = JsonConvert.DeserializeObject <Responses.IVPNResponse>(line);
                Logging.Info($"received {response.Command}: {response}");
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to parse command '{line}'", ex);
            }

            try
            {
                switch (response.Command)
                {
                case "HelloResp":
                    var resp = JsonConvert.DeserializeObject <Responses.IVPNHelloResponse>(line);

                    NotifySessionInfo(resp.Session);

                    Logging.Info("got hello, server version is " + resp.Version
                                 + (string.IsNullOrEmpty(resp.Session.Session)?"Not logged in":"Logged in"));

                    break;

                case "ConfigParamsResp":
                    DaemonParams = JsonConvert.DeserializeObject <Responses.ConfigParamsResp>(line);
                    break;

                case "ServerListResp":
                    var serversResp = JsonConvert.DeserializeObject <Responses.IVPNServerListResponse>(line);

                    Logging.Info($"Got servers info [{serversResp.VpnServers.OpenVPNServers.Count} openVPN; {serversResp.VpnServers.WireGuardServers.Count} WireGuard]");
                    VpnServersInfo retServers = serversResp.VpnServers;

                    // When no servers received:
                    // - on a initialization (ServiceConnected == false): throw an exception
                    // - if we already initialized (servers already initialized) - just ignore this empty response
                    if (!retServers.OpenVPNServers.Any() || !retServers.WireGuardServers.Any())
                    {
                        if (ServiceConnected == false)
                        {
                            throw new ServersNotLoaded();
                        }
                        break;
                    }

                    VpnServerList = retServers;
                    ServerListChanged(VpnServerList);

                    if (ServiceConnected != true)
                    {
                        ServiceConnected = true;     // final GUI initialization performs only after receiving servers-list
                    }
                    break;

                case "PingServersResp":
                    var pingResp = JsonConvert.DeserializeObject <Responses.IVPNPingServersResponse>(line);
                    if (pingResp.PingResults != null)
                    {
                        Dictionary <string, int> results = pingResp.PingResults.ToDictionary(x => x.Host, x => x.Ping);

                        Logging.Info($"Got ping response for {results.Count} servers");
                        ServersPingsUpdated(results);
                    }
                    break;

                case "VpnStateResp":
                    var stateResp = JsonConvert.DeserializeObject <Responses.IVPNVpnStateResponse>(line);
                    ConnectionState(stateResp.State, stateResp.StateAdditionalInfo);
                    break;

                case "ConnectedResp":
                    var connectedRes = JsonConvert.DeserializeObject <Responses.IVPNConnectedResponse>(line);
                    Connected(connectedRes.TimeSecFrom1970, connectedRes.ClientIP, connectedRes.ServerIP, connectedRes.VpnType, connectedRes.ExitServerID);
                    AlternateDNSChanged(connectedRes.ManualDNS);
                    break;

                case "DisconnectedResp":
                    var discRes = JsonConvert.DeserializeObject <Responses.IVPNDisconnectedResponse>(line);
                    Disconnected(discRes.Failure, discRes.Reason, discRes.ReasonDescription);
                    break;

                case "DiagnosticsGeneratedResp":
                    var diagResp = JsonConvert.DeserializeObject <Responses.IVPNDiagnosticsGeneratedResponse>(line);
                    DiagnosticsGenerated(diagResp);
                    break;

                case "ServiceExitingResp":
                    __IsExiting = true;
                    ServiceExiting();
                    break;

                // :: __BlockingCollection ::
                case "KillSwitchStatusResp":
                    var kwResp = JsonConvert.DeserializeObject <Responses.IVPNKillSwitchStatusResponse>(line);
                    responseReceived(kwResp);
                    // KillSwitch change can be requested by another client - notifying about every change
                    KillSwitchStatus(kwResp.IsEnabled, kwResp.IsPersistent, kwResp.IsAllowLAN, kwResp.IsAllowMulticast);
                    break;

                case "KillSwitchGetIsPestistentResp":
                    var kwPers = JsonConvert.DeserializeObject <Responses.IVPNKillSwitchGetIsPestistentResponse>(line);
                    responseReceived(kwPers);
                    // KillSwitch change can be requested by another client - notifying about every change
                    KillSwitchStatus(null, kwPers.IsPersistent, null, null);
                    break;

                case "SessionNewResp":
                {
                    var snResp = JsonConvert.DeserializeObject <Responses.SessionNewResponse>(line);
                    if (snResp.APIStatus == (int)ApiStatusCode.Success)
                    {
                        NotifySessionInfo(snResp.Session);
                        NotifyAccountStatus(snResp.Session.Session, snResp.Account);
                    }
                    responseReceived(snResp);
                }
                break;

                case "AccountStatusResp":
                    var accStatResp = JsonConvert.DeserializeObject <Responses.AccountStatusResponse>(line);
                    NotifyAccountStatus(accStatResp.SessionToken, accStatResp.Account);
                    responseReceived(accStatResp);
                    break;

                case "SetAlternateDNSResp":
                    var dnsSetResp = JsonConvert.DeserializeObject <Responses.IVPNSetAlternateDnsResponse>(line);
                    responseReceived(dnsSetResp);
                    // DNS change can be requested by another client - notifying about every change
                    if (dnsSetResp.IsSuccess)
                    {
                        AlternateDNSChanged(dnsSetResp.ChangedDNS);
                    }
                    break;

                case "EmptyResp":
                    responseReceived(JsonConvert.DeserializeObject <Responses.IVPNEmptyResponse>(line));
                    break;

                case "ErrorResp":
                    responseReceived(JsonConvert.DeserializeObject <Responses.IVPNErrorResponse>(line));
                    break;
                }
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to process '{response.Command}'", ex);
            }
            return(true);
        }