public void Dispose() { if (_httpListener != null) { _httpListener.Dispose(); _httpListener = null; } }
public override async Task Run(object prm) { if (!Settings.Config.ModuleWebServer) { return; } if (Settings.WebServerModule.ServerStatusPort > 0 && (_statusListener == null || !_statusListener.IsListening)) { await LogHelper.LogInfo("Starting Web Server - Status Reporter", Category); try { _statusListener?.Dispose(); } catch (Exception ex) { } var ip = "0.0.0.0"; _statusListener = new HttpListener(IPAddress.Parse(ip), Settings.WebServerModule.ServerStatusPort); _statusListener.Request += async(sender, context) => { try { if (_statusQueries.Count > 10) { return; } _statusQueries.Enqueue(DateTime.Now); // var request = context.Request; var response = context.Response; //OK, NO_ESI, NO_CONNECTION, NO_DISCORD var value = "OK"; if (TickManager.IsESIUnreachable) { value = "NO_ESI"; } if (TickManager.IsNoConnection) { value = "NO_CONNECTION"; } if (!APIHelper.DiscordAPI.IsAvailable) { if (Settings.WebServerModule.NoStatusResponseOnDiscordDisconnection) { return; } value = "NO_DISCORD"; } await response.WriteContentAsync(value); } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { try { context.Response.Close(); } catch { //ignore } } }; _statusListener.Start(); } if (_listener == null || !_listener.IsListening) { await LogHelper.LogInfo("Starting Web Server", Category); try { _listener?.Dispose(); } catch (Exception ex) { } //TODO cleanup all occurences in modules in some of the following releases var extPort = Settings.WebServerModule.WebExternalPort; var ip = "0.0.0.0"; _listener = new System.Net.Http.HttpListener(IPAddress.Parse(ip), extPort); _listener.Request += async(sender, context) => { try { var request = context.Request; var response = context.Response; if (request.Url.LocalPath.EndsWith(".js") || request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { var path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", Path.GetFileName(request.Url.LocalPath)); if (request.Url.LocalPath.Contains("moments")) { path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", "moments", Path.GetFileName(request.Url.LocalPath)); } if (!File.Exists(path)) { return; } if (request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { response.Headers.ContentType.Add("text/css"); } if (request.Url.LocalPath.EndsWith(".js")) { response.Headers.ContentType.Add("text/javascript"); } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/favicon.ico") { var path = Path.Combine(SettingsManager.RootDirectory, Path.GetFileName(request.Url.LocalPath)); if (!File.Exists(path)) { return; } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/" || request.Url.LocalPath == $"{extPort}/") { // var extIp = Settings.WebServerModule.WebExternalIP; var text = File.ReadAllText(SettingsManager.FileTemplateMain) .Replace("{headerContent}", GetHtmlResourceDefault(false)) .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader")) .Replace("{authButtonText}", LM.Get("butGeneralAuthPage")); //managecontrols var manageText = new StringBuilder(); //timers if (Settings.Config.ModuleTimers) { var authNurl = GetTimersURL(); manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonTimersText")}</a>"); } if (Settings.Config.ModuleHRM) { var authNurl = GetHRMAuthURL(); manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonHRMText")}</a>"); } if (Settings.Config.ModuleWebConfigEditor) { var authNurl = GetWebConfigAuthURL(); manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("buttonSettingsText")}</a>"); } text = text.Replace("{manageControls}", manageText.ToString()); await WriteResponce(text, response); return; } if (request.Url.LocalPath == "/authPage.html" || request.Url.LocalPath == $"{extPort}/authPage.html") { var extIp = Settings.WebServerModule.WebExternalIP; var authUrl = $"{GetWebSiteUrl()}/auth"; var text = File.ReadAllText(SettingsManager.FileTemplateAuthPage) .Replace("{headerContent}", GetHtmlResourceDefault(false)) .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{backText}", LM.Get("backText")); //auth controls var authText = new StringBuilder(); if (Settings.Config.ModuleAuthWeb && SettingsManager.Settings.WebAuthModule.AuthGroups.Count > 0) { authText.Append($"<h2>{LM.Get("authWebDiscordHeader")}</h4>{LM.Get("authPageGeneralAuthHeader")}"); } var groupsForCycle = Settings.WebAuthModule.UseOneAuthButton ? Settings.WebAuthModule.AuthGroups.Where(a => a.Value.ExcludeFromOneButtonMode || a.Value.BindToMainCharacter) : Settings.WebAuthModule.AuthGroups; if (Settings.WebAuthModule.UseOneAuthButton) { if (Settings.Config.ModuleAuthWeb) { var url = $"{authUrl}?group={HttpUtility.UrlEncode(WebAuthModule.DEF_NOGROUP_NAME)}"; authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonDiscordText")}</a>"); } } //stands auth if (Settings.Config.ModuleAuthWeb) { foreach (var groupPair in groupsForCycle.Where(a => a.Value.StandingsAuth != null)) { var group = groupPair.Value; var url = $"{authUrl}?group={HttpUtility.UrlEncode(groupPair.Key)}"; authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{group.CustomButtonText}</a>"); } } //auth if (Settings.Config.ModuleAuthWeb) { foreach (var @group in groupsForCycle.Where(a => a.Value.StandingsAuth == null)) { var url = $"{authUrl}?group={HttpUtility.UrlEncode(group.Value.BindToMainCharacter ? WebAuthModule.DEF_ALTREGGROUP_NAME : group.Key)}"; var bText = group.Value.CustomButtonText ?? $"{LM.Get("authButtonDiscordText")} - {group.Key}"; authText.Append($"<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{bText}</a>"); } } var len = authText.Length; var smth = false; //stands auth if (Settings.Config.ModuleAuthWeb) { foreach (var groupPair in Settings.WebAuthModule.AuthGroups.Where(a => a.Value.StandingsAuth != null)) { var group = groupPair.Value; var url = GetStandsAuthURL(); authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{group.StandingsAuth.WebAdminButtonText}</a>"); } smth = true; } //notifications if (Settings.Config.ModuleNotificationFeed) { var authNurl = GetAuthNotifyURL(); authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonNotifyText")}</a>"); smth = true; } //mail if (Settings.Config.ModuleMail) { var authNurl = GetMailAuthURL(); authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonMailText")}</a>"); smth = true; } if (Settings.Config.ModuleContractNotifications) { foreach (var notifyGroup in Settings.ContractNotificationsModule.Groups) { var group = notifyGroup.Value; var authNurl = GetContractsAuthURL(group.FeedPersonalContracts, group.FeedCorporateContracts, notifyGroup.Key); authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{group.ButtonText}</a>"); } smth = true; } if (Settings.Config.ModuleIndustrialJobs) { foreach (var(key, group) in Settings.IndustrialJobsModule.Groups) { var authNurl = GetIndustryJobsAuthURL(group.Filters.Any(a => a.Value.FeedPersonalJobs), group.Filters.Any(a => a.Value.FeedCorporateJobs), key); authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{group.ButtonText ?? key}</a>"); } smth = true; } if (smth) { authText.Insert(len, $"<h2>{LM.Get("authWebSystemHeader")}</h2>{LM.Get("authPageSystemAuthHeader")}"); } text = text.Replace("{authControls}", authText.ToString()).Replace("{authHeaderText}", LM.Get("authPageHeaderText")); await WriteResponce(text, response); return; } var result = false; foreach (var method in ModuleConnectors.Values) { try { result = await method(context); if (result) { break; } } catch (Exception ex) { await LogHelper.LogEx($"Module method {method.Method.Name} throws ex!", ex, Category); } } if (!result) { await WriteResponce(Get404Page(), response); } } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { try { context.Response.Close(); } catch { //ignore } } }; _listener.Start(); } }
public override async Task Run(object prm) { if (!SettingsManager.GetBool("config", "moduleWebServer")) { return; } if (_listener == null || !_listener.IsListening) { await LogHelper.LogInfo("Starting Web Server", Category); _listener?.Dispose(); var port = SettingsManager.GetInt("webServerModule", "webListenPort"); var extPort = SettingsManager.Get("webServerModule", "webExternalPort"); var ip = SettingsManager.Get("webServerModule", "webListenIP"); _listener = new System.Net.Http.HttpListener(IPAddress.Parse(ip), port); _listener.Request += async(sender, context) => { try { var request = context.Request; var response = context.Response; if (request.Url.LocalPath.EndsWith(".js") || request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { var path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", Path.GetFileName(request.Url.LocalPath)); if (request.Url.LocalPath.Contains("moments")) { path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", "moments", Path.GetFileName(request.Url.LocalPath)); } if (!File.Exists(path)) { return; } if (request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { response.Headers.ContentType.Add("text/css"); } if (request.Url.LocalPath.EndsWith(".js")) { response.Headers.ContentType.Add("text/javascript"); } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/" || request.Url.LocalPath == $"{port}/" || request.Url.LocalPath == $"{extPort}/") { var extIp = SettingsManager.Get("webServerModule", "webExternalIP"); var authUrl = $"http://{extIp}:{extPort}/auth.php"; var authNurl = GetAuthNotifyURL(); response.Headers.ContentEncoding.Add("utf-8"); response.Headers.ContentType.Add("text/html;charset=utf-8"); var text = File.ReadAllText(SettingsManager.FileTemplateMain).Replace("{authUrl}", authUrl) .Replace("{authNotifyUrl}", authNurl).Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{timersUrl}", GetTimersURL()) .Replace("{authButtonDiscordText}", LM.Get("authButtonDiscordText")) .Replace("{authButtonNotifyText}", LM.Get("authButtonNotifyText")) .Replace("{authButtonTimersText}", LM.Get("authButtonTimersText")) .Replace("{authMailUrl}", GetMailAuthURL()) .Replace("{authButtonMailText}", LM.Get("authButtonMailText")) .Replace("{webAuthHeader}", LM.Get("webAuthHeader")) .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader")) ; text = text.Replace("{disableWebAuth}", !SettingsManager.GetBool("config", "moduleAuthWeb") ? "disabled" : ""); text = text.Replace("{disableWebNotify}", !SettingsManager.GetBool("config", "moduleNotificationFeed") ? "disabled" : ""); text = text.Replace("{disableWebTimers}", !SettingsManager.GetBool("config", "moduleTimers") ? "disabled" : ""); text = text.Replace("{disableMailNotify}", !SettingsManager.GetBool("config", "moduleMail") ? "disabled" : ""); await response.WriteContentAsync(text); return; } var result = false; foreach (var method in ModuleConnectors.Values) { try { result = await method(context); if (result) { break; } } catch (Exception ex) { await LogHelper.LogEx($"Module method {method.Method.Name} throws ex!", ex, Category); } } if (!result) { response.Headers.ContentEncoding.Add("utf-8"); response.Headers.ContentType.Add("text/html;charset=utf-8"); await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", "404 Not Found!") .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{body}", LM.Get("WebRequestUnexpected")) ); } } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { try { context.Response.Close(); } catch { //ignore } } }; _listener.Start(); } }
public override async Task Run(object prm) { if (!Settings.Config.ModuleWebServer) { return; } if (_listener == null || !_listener.IsListening) { await LogHelper.LogInfo("Starting Web Server", Category); _listener?.Dispose(); var port = Settings.WebServerModule.WebListenPort; var extPort = Settings.WebServerModule.WebExternalPort; var ip = Settings.WebServerModule.WebListenIP; _listener = new System.Net.Http.HttpListener(IPAddress.Parse(ip), port); _listener.Request += async(sender, context) => { try { var request = context.Request; var response = context.Response; if (request.Url.LocalPath.EndsWith(".js") || request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { var path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", Path.GetFileName(request.Url.LocalPath)); if (request.Url.LocalPath.Contains("moments")) { path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", "moments", Path.GetFileName(request.Url.LocalPath)); } if (!File.Exists(path)) { return; } if (request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css")) { response.Headers.ContentType.Add("text/css"); } if (request.Url.LocalPath.EndsWith(".js")) { response.Headers.ContentType.Add("text/javascript"); } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/favicon.ico") { var path = Path.Combine(SettingsManager.RootDirectory, Path.GetFileName(request.Url.LocalPath)); if (!File.Exists(path)) { return; } await response.WriteContentAsync(File.ReadAllText(path)); return; } if (request.Url.LocalPath == "/" || request.Url.LocalPath == $"{port}/" || request.Url.LocalPath == $"{extPort}/") { var extIp = Settings.WebServerModule.WebExternalIP; var authUrl = $"http://{extIp}:{extPort}/auth.php"; var text = File.ReadAllText(SettingsManager.FileTemplateMain) .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{webAuthHeader}", LM.Get("webAuthHeader")) .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader")); //auth controls var authText = string.Empty; //auth if (SettingsManager.Settings.Config.ModuleAuthWeb) { var groups = SettingsManager.Settings.WebAuthModule.AuthGroups.Where(a => a.Value.PreliminaryAuthMode || a.Value.ESICustomAuthRoles.Any()).ToList(); //no default auth if there are no default groups if (groups.Count != SettingsManager.Settings.WebAuthModule.AuthGroups.Count) { authText = $"<a href=\"{authUrl}\" class=\"btn btn-info btn-block {(!Settings.Config.ModuleAuthWeb ? "disabled" : "")}\" role=\"button\">{LM.Get("authButtonDiscordText")}</a>"; } foreach (var @group in groups) { var customAuthString = GetCustomAuthUrl(group.Value.ESICustomAuthRoles, group.Key); var bText = group.Value.CustomButtonText ?? $"{LM.Get("authButtonDiscordText")} - {group.Key}"; authText += $"\n<a href=\"{customAuthString}\" class=\"btn btn-info btn-block\" role=\"button\">{bText}</a>"; } } //notifications if (Settings.Config.ModuleNotificationFeed) { var authNurl = GetAuthNotifyURL(); authText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonNotifyText")}</a>"; } //mail if (Settings.Config.ModuleMail) { var authNurl = GetMailAuthURL(); authText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonMailText")}</a>"; } text = text.Replace("{authControls}", authText); //managecontrols var manageText = string.Empty; //timers if (Settings.Config.ModuleTimers) { var authNurl = GetTimersURL(); manageText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonTimersText")}</a>"; } if (Settings.Config.ModuleHRM) { var authNurl = GetHRMAuthURL(); manageText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonHRMText")}</a>"; } text = text.Replace("{manageControls}", manageText); await WriteResponce(text, response); return; } var result = false; foreach (var method in ModuleConnectors.Values) { try { result = await method(context); if (result) { break; } } catch (Exception ex) { await LogHelper.LogEx($"Module method {method.Method.Name} throws ex!", ex, Category); } } if (!result) { await WriteResponce(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", "404 Not Found!") .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{body}", LM.Get("WebRequestUnexpected")) .Replace("{backText}", LM.Get("backText")), response); } } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { try { context.Response.Close(); } catch { //ignore } } }; _listener.Start(); } }