private static void RemoveExpiredServers() { while (RunServer) { if (DateTime.UtcNow.Ticks - LastServerExpireCheck > TimeSpan.FromMilliseconds(ServerRemoveMsCheckInterval).Ticks) { LastServerExpireCheck = DateTime.UtcNow.Ticks; var serversIdsToRemove = ServerDictionary .Where(s => DateTime.UtcNow.Ticks - s.Value.LastRegisterTime > TimeSpan.FromMilliseconds(ServerMsTimeout).Ticks) .Select(s => s.Key) .ToArray(); foreach (var serverId in serversIdsToRemove) { Server outSrv; ServerDictionary.TryRemove(serverId, out outSrv); } if (serversIdsToRemove.Any()) { Form.UpdateServerList(ServerDictionary.Values); } } } }
public void ServersTest() { const string server_list_list_json = @"{ ""server_list"": [ { ""server_type"": ""institute_access"", ""base_url"": ""https://sunset.nuonet.fr/"", ""display_name"": ""CNOUS"", ""support_contact"": [ ""mailto:[email protected]"" ] }, { ""server_type"": ""secure_internet"", ""base_url"": ""https://eduvpn.rash.al/"", ""country_code"": ""AL"", ""support_contact"": [ ""mailto:[email protected]"" ] } ] }"; var server_list_list_ia = new ServerDictionary(); server_list_list_ia.LoadJSON(server_list_list_json); Assert.IsInstanceOfType(server_list_list_ia[new Uri("https://sunset.nuonet.fr/")], typeof(InstituteAccessServer)); Assert.IsInstanceOfType(server_list_list_ia[new Uri("https://eduvpn.rash.al/")], typeof(SecureInternetServer)); }
private static void HandleMessage(IMasterServerMessageBase message, NetIncomingMessage netMsg, NetPeer peer) { switch ((message?.Data as MsBaseMsgData)?.MasterServerMessageSubType) { case MasterServerMessageSubType.REGISTER_SERVER: RegisterServer(message, netMsg); break; case MasterServerMessageSubType.REQUEST_SERVERS: var version = ((MsRequestServersMsgData)message.Data).CurrentVersion; Form.WriteLine($"Received LIST REQUEST from: {netMsg.SenderEndPoint} version: {version}"); SendServerLists(netMsg, peer, version); break; case MasterServerMessageSubType.INTRODUCTION: Form.WriteLine("Received INTRODUCTION request from:" + netMsg.SenderEndPoint); var msgData = (MsIntroductionMsgData)message.Data; Server server; if (ServerDictionary.TryGetValue(msgData.Id, out server)) { peer.Introduce( server.InternalEndpoint, server.ExternalEndpoint, Common.CreateEndpointFromString(msgData.InternalEndpoint), // client internal netMsg.SenderEndPoint, // client external msgData.Token); // request token } else { Form.WriteLine("Client requested introduction to nonlisted host!"); } break; } }
public void CreateServer(string UserServerName) { while (true) { Console.WriteLine(UserServerName + " does not exist. Would you like to create it? (y)/n "); String UserInput = Console.ReadLine(); if (UserInput == "y" || string.IsNullOrWhiteSpace(UserInput)) { CreateServerOnly(UserServerName); AddUserName(); NewPassword(); ServerDictionary.Add(this.ServerName, this); IsDicAndDatabaseInSync = false; logevents("Server created"); return; } else if (UserInput == "n") { return; } else { Console.WriteLine("Invalid Input"); } } }
public void ServersNetworkTest() { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; var xmlReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(@"<ResourceRef Uri=""https://disco.eduvpn.org/v2/server_list.json""> <MinisignPublicKeyDictionary Key=""PublicKeys""> <PublicKey>RWRtBSX1alxyGX+Xn3LuZnWUT0w//B6EmTJvgaAxBMYzlQeI+jdrO6KF</PublicKey> <PublicKey>RWQKqtqvd0R7rUDp0rWzbtYPA3towPWcLDCl7eY9pBMMI/ohCmrS0WiM</PublicKey> </MinisignPublicKeyDictionary> </ResourceRef>" ))); while (xmlReader.ReadState == ReadState.Initial) { xmlReader.Read(); } var source = new ResourceRef(); source.ReadXml(xmlReader); // Load list of servers. var server_list_list_json = Response.Get(source); var server_list_list_ia = new ServerDictionary(); server_list_list_ia.LoadJSON(server_list_list_json.Value); // Load all servers APIs. Parallel.ForEach(server_list_list_ia.Values, srv => { var uriBuilder = new UriBuilder(srv.Base); uriBuilder.Path += "info.json"; try { new ServerEndpoints().LoadJSON(Response.Get(uriBuilder.Uri).Value); } catch (UnsupportedServerAPIException) { // Ignore non-APIv3 servers. } catch (AggregateException ex) { if (ex.InnerException is WebException ex_web && (ex_web.Status == WebExceptionStatus.NameResolutionFailure || // DNS resolving failure ex_web.Status == WebExceptionStatus.ConnectFailure || // connection refused ex_web.Status == WebExceptionStatus.TrustFailure || // expired or invalid server certificate ex_web.Status == WebExceptionStatus.SecureChannelFailure || // TLS failure ex_web.Status == WebExceptionStatus.Timeout)) // server down { // Ignore connection failure WebException(s), as some servers are not publicly available or have other issues. }
private static void RegisterServer(IMessageBase message, NetIncomingMessage netMsg) { var msgData = (MsRegisterServerMsgData)message.Data; if (!ServerDictionary.ContainsKey(msgData.Id)) { ServerDictionary.TryAdd(msgData.Id, new Server(msgData, netMsg.SenderEndPoint)); ConsoleLogger.Log(LogLevels.Normal, $"NEW SERVER: {netMsg.SenderEndPoint}"); } else { //Just update ServerDictionary[msgData.Id] = new Server(msgData, netMsg.SenderEndPoint); } }
private static void RegisterServer(IMessageBase message, NetIncomingMessage netMsg) { var msgData = (MsRegisterServerMsgData)message.Data; if (!ServerDictionary.ContainsKey(msgData.Id)) { ServerDictionary.TryAdd(msgData.Id, new Server(msgData, netMsg.SenderEndPoint)); Form.UpdateServerList(ServerDictionary.Values); } else { //Just update ServerDictionary[msgData.Id] = new Server(msgData, netMsg.SenderEndPoint); } }
public void ServersNetworkTest() { // .NET 3.5 allows Schannel to use SSL 3 and TLS 1.0 by default. Instead of hacking user computer's registry, extend it in runtime. // System.Net.SecurityProtocolType lacks appropriate constants prior to .NET 4.5. ServicePointManager.SecurityProtocol = (SecurityProtocolType)0x0C00 | (SecurityProtocolType)0x3000; var xmlReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(@"<ResourceRef Uri=""https://disco.eduvpn.org/v2/server_list.json""> <MinisignPublicKeyDictionary Key=""PublicKeys""> <PublicKey>RWRtBSX1alxyGX+Xn3LuZnWUT0w//B6EmTJvgaAxBMYzlQeI+jdrO6KF</PublicKey> <PublicKey>RWQ68Y5/b8DED0TJ41B1LE7yAvkmavZWjDwCBUuC+Z2pP9HaSawzpEDA</PublicKey> <PublicKey>RWQKqtqvd0R7rUDp0rWzbtYPA3towPWcLDCl7eY9pBMMI/ohCmrS0WiM</PublicKey> </MinisignPublicKeyDictionary> </ResourceRef>" ))); while (xmlReader.ReadState == ReadState.Initial) { xmlReader.Read(); } var source = new ResourceRef(); source.ReadXml(xmlReader); // Load list of servers. var server_list_list_json = Xml.Response.Get(source); var server_list_list_ia = new ServerDictionary(); server_list_list_ia.LoadJSON(server_list_list_json.Value); // Load all servers APIs. Parallel.ForEach(server_list_list_ia.Values, srv => { var uriBuilder = new UriBuilder(srv.Base); uriBuilder.Path += "info.json"; try { new Models.ServerEndpoints().LoadJSON(Xml.Response.Get(uriBuilder.Uri).Value); } catch (AggregateException ex) { if (ex.InnerException is WebException ex_web && (ex_web.Status == WebExceptionStatus.ConnectFailure || // connection refused ex_web.Status == WebExceptionStatus.TrustFailure || // expired or invalid server certificate ex_web.Status == WebExceptionStatus.SecureChannelFailure || // TLS failure ex_web.Status == WebExceptionStatus.Timeout)) // server down { // Ignore connection failure WebException(s), as some servers are not publicly available or have other issues. }
private static void HandleMessage(IMasterServerMessageBase message, NetIncomingMessage netMsg, NetPeer peer) { if (BannedIpsRetriever.IsBanned(netMsg.SenderEndPoint)) { LunaLog.Debug($"Ignoring BANNED ip: {netMsg.SenderEndPoint}"); return; } try { switch ((message?.Data as MsBaseMsgData)?.MasterServerMessageSubType) { case MasterServerMessageSubType.RegisterServer: RegisterServer(message, netMsg); break; case MasterServerMessageSubType.RequestServers: LunaLog.Normal($"LIST REQUEST from: {netMsg.SenderEndPoint}"); SendServerLists(netMsg, peer); break; case MasterServerMessageSubType.Introduction: var msgData = (MsIntroductionMsgData)message.Data; if (ServerDictionary.TryGetValue(msgData.Id, out var server)) { LunaLog.Normal($"INTRODUCTION request from: {netMsg.SenderEndPoint} to server: {server.ExternalEndpoint}"); peer.Introduce(server.InternalEndpoint, server.ExternalEndpoint, msgData.InternalEndpoint, // client internal netMsg.SenderEndPoint, // client external msgData.Token); // request token } else { LunaLog.Warning($"Client {netMsg.SenderEndPoint} requested introduction to non listed host!"); } break; } } catch (Exception e) { LunaLog.Error($"Error handling message. Details: {e}"); } }
private static void RemoveExpiredServers() { Task.Run(async() => { while (RunServer) { var serversIdsToRemove = ServerDictionary .Where(s => LunaTime.UtcNow.Ticks - s.Value.LastRegisterTime > TimeSpan.FromMilliseconds(ServerMsTimeout).Ticks) .ToArray(); foreach (var serverId in serversIdsToRemove) { ConsoleLogger.Log(LogLevels.Normal, $"REMOVING SERVER: {serverId.Value.ExternalEndpoint}"); ServerDictionary.TryRemove(serverId.Key, out var _); } await Task.Delay(ServerRemoveMsCheckInterval); } }); }
private static void RemoveExpiredServers() { Task.Run(async() => { while (RunServer) { var serversIdsToRemove = ServerDictionary .Where(s => LunaNetworkTime.UtcNow.Ticks - s.Value.LastRegisterTime > TimeSpan.FromMilliseconds(ServerMsTimeout).Ticks || BannedIpsRetriever.IsBanned(s.Value.ExternalEndpoint)) .ToArray(); foreach (var serverId in serversIdsToRemove) { LunaLog.Normal($"REMOVING SERVER: {serverId.Value.ExternalEndpoint}"); ServerDictionary.TryRemove(serverId.Key, out _); } await Task.Delay(ServerRemoveMsCheckInterval); } }); }
private static void HandleMessage(IMasterServerMessageBase message, NetIncomingMessage netMsg, NetPeer peer) { try { switch ((message?.Data as MsBaseMsgData)?.MasterServerMessageSubType) { case MasterServerMessageSubType.RegisterServer: RegisterServer(message, netMsg); break; case MasterServerMessageSubType.RequestServers: ConsoleLogger.Log(LogLevels.Normal, $"LIST REQUEST from: {netMsg.SenderEndPoint}"); SendServerLists(netMsg, peer); break; case MasterServerMessageSubType.Introduction: var msgData = (MsIntroductionMsgData)message.Data; if (ServerDictionary.TryGetValue(msgData.Id, out var server)) { ConsoleLogger.Log(LogLevels.Normal, $"INTRODUCTION request from: {netMsg.SenderEndPoint} to server: {server.ExternalEndpoint}"); peer.Introduce(server.InternalEndpoint, server.ExternalEndpoint, Common.CreateEndpointFromString(msgData.InternalEndpoint), // client internal netMsg.SenderEndPoint, // client external msgData.Token); // request token } else { ConsoleLogger.Log(LogLevels.Warning, $"Client {netMsg.SenderEndPoint} requested introduction to nonlisted host!"); } break; } } catch (Exception e) { ConsoleLogger.Log(LogLevels.Error, $"Error handling message. Details: {e}"); } }
private static void HandleMessage(IMasterServerMessageBase message, NetIncomingMessage netMsg, NetPeer peer) { if (BannedIpsRetriever.IsBanned(netMsg.SenderEndPoint)) { LunaLog.Debug($"Ignoring BANNED ip: {netMsg.SenderEndPoint}"); return; } try { switch ((message?.Data as MsBaseMsgData)?.MasterServerMessageSubType) { case MasterServerMessageSubType.RegisterServer: RegisterServer(message, netMsg); break; case MasterServerMessageSubType.RequestServers: LunaLog.Normal($"LIST REQUEST from: {netMsg.SenderEndPoint}"); SendServerLists(netMsg, peer); break; case MasterServerMessageSubType.Introduction: var msgData = (MsIntroductionMsgData)message.Data; if (ServerDictionary.TryGetValue(msgData.Id, out var server)) { _ = Task.Run(() => { if (!server.InternalEndpoint6.Address.Equals(IPAddress.IPv6Loopback) && !server.InternalEndpoint6.Address.Equals(IPAddress.IPv6Loopback)) { // Both client and server are listening on IPv6, try an IPv6 firewall punchthrough // This also triggers a first punchthrough on IPv4 with the public addresses LunaLog.Normal( $"INTRODUCTION request from: {msgData.InternalEndpoint6} to server: {server.InternalEndpoint6}"); peer.Introduce(server.InternalEndpoint6, server.ExternalEndpoint, msgData.InternalEndpoint6, // client internal netMsg.SenderEndPoint, // client external msgData.Token); // request token // Give the first introduction attempt some time Thread.Sleep(50); } LunaLog.Normal( $"INTRODUCTION request from: {netMsg.SenderEndPoint} to server: {server.ExternalEndpoint}"); peer.Introduce(server.InternalEndpoint, server.ExternalEndpoint, msgData.InternalEndpoint, // client internal netMsg.SenderEndPoint, // client external msgData.Token); // request token }); } else { LunaLog.Warning($"Client {netMsg.SenderEndPoint} requested introduction to non listed host!"); } break; } } catch (Exception e) { LunaLog.Error($"Error handling message. Details: {e}"); } }