public async Task <bool> Auth(HttpListenerRequestEventArgs context) { if (!Settings.Config.ModuleAuthWeb) { return(false); } var esiFailure = false; var request = context.Request; var response = context.Response; var extIp = Settings.WebServerModule.WebExternalIP; var extPort = Settings.WebServerModule.WebExternalPort; var port = Settings.WebServerModule.WebListenPort; var callbackurl = $"http://{extIp}:{extPort}/callback.php"; if (request.HttpMethod != HttpMethod.Get.ToString()) { return(false); } try { if (request.Url.LocalPath == "/auth.php" || request.Url.LocalPath == $"{extPort}/auth.php" || request.Url.LocalPath == $"{port}/auth.php") { var text = File.ReadAllText(SettingsManager.FileTemplateAuth).Replace("{callbackurl}", callbackurl).Replace("{client_id}", Settings.WebServerModule.CcpAppClientId) .Replace("{header}", LM.Get("authTemplateHeader")).Replace("{body}", LM.Get("authTemplateInv")).Replace("{backText}", LM.Get("backText")); await WebServerModule.WriteResponce(text, response); return(true); } if ((request.Url.LocalPath == "/callback.php" || request.Url.LocalPath == $"{extPort}/callback.php" || request.Url.LocalPath == $"{port}/callback.php") && (!request.Url.Query.Contains("&state=") || request.Url.Query.Contains("&state=x"))) { var assembly = Assembly.GetEntryAssembly(); // var temp = assembly.GetManifestResourceNames(); var resource = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.Discord-01.png"); var buffer = new byte[resource.Length]; resource.Read(buffer, 0, Convert.ToInt32(resource.Length)); var image = Convert.ToBase64String(buffer); var add = false; if (!string.IsNullOrWhiteSpace(request.Url.Query)) { var prms = request.Url.Query.TrimStart('?').Split('&'); var code = prms[0].Split('=')[1]; // var state = prms.Length > 1 ? prms[1].Split('=')[1] : null; var x = prms.Last().Split('='); var inputGroupName = x.Length > 1 ? x[1].Substring(1, x[1].Length - 1) : null; var inputGroup = Settings.WebAuthModule.AuthGroups.FirstOrDefault(a => a.Key.Equals(inputGroupName, StringComparison.OrdinalIgnoreCase)).Value; var result = await GetCharacterIdFromCode(code, Settings.WebServerModule.CcpAppClientId, Settings.WebServerModule.CcpAppSecret); if (result == null) { await WebServerModule.WriteResponce(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", LM.Get("ESIFailure")) .Replace("{header}", LM.Get("authTemplateHeader")).Replace("{backText}", LM.Get("backText")), response); return(true); } var characterID = result?[0]; var rChar = await APIHelper.ESIAPI.GetCharacterData(Reason, characterID, true); if (rChar == null) { await WebServerModule.WriteResponce(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", LM.Get("ESIFailure")) .Replace("{header}", LM.Get("authTemplateHeader")).Replace("{backText}", LM.Get("backText")), response); return(true); } var corpID = rChar?.corporation_id ?? 0; var rCorp = await APIHelper.ESIAPI.GetCorporationData(Reason, rChar?.corporation_id, true); if (rCorp == null) { await WebServerModule.WriteResponce(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", LM.Get("ESIFailure")) .Replace("{header}", LM.Get("authTemplateHeader")).Replace("{backText}", LM.Get("backText")), response); return(true); } var allianceID = rCorp?.alliance_id ?? 0; var cFoundList = new List <int>(); var groupName = string.Empty; WebAuthGroup group = null; var groupPermissions = new List <string>(); //PreliminaryAuthMode if (inputGroup != null && inputGroup.PreliminaryAuthMode) { group = inputGroup; if (string.IsNullOrEmpty(result[1])) { await WebServerModule.WriteResponce(WebServerModule.GetAccessDeniedPage("Auth Module", LM.Get("authNoTokenReceived")), response); await LogHelper.LogWarning($"Invalid named group auth attempt (missing token) from charID: {characterID} grp: {inputGroupName}", Category); return(true); } cFoundList.Add(corpID); //fake reg ;) groupName = inputGroupName; groupPermissions = new List <string>(group.ESICustomAuthRoles); add = true; } else //normal auth { //has custom ESI roles if (inputGroup != null) { group = inputGroup; if (group.CorpIDList.Contains(rChar.corporation_id) || (allianceID != 0 && group.AllianceIDList.Contains(allianceID))) { groupName = inputGroupName; groupPermissions = new List <string>(group.ESICustomAuthRoles); add = true; cFoundList.Add(rChar.corporation_id); } } else { //general auth foreach (var grp in Settings.WebAuthModule.AuthGroups.Where(a => !a.Value.ESICustomAuthRoles.Any() && !a.Value.PreliminaryAuthMode)) { if (grp.Value.CorpIDList.Contains(rChar.corporation_id) || (allianceID != 0 && grp.Value.AllianceIDList.Contains(allianceID))) { cFoundList.Add(rChar.corporation_id); groupName = grp.Key; group = grp.Value; add = true; break; } } } } if (add) { if (!string.IsNullOrEmpty(result[1])) { await SQLHelper.SQLiteDataInsertOrUpdate("userTokens", new Dictionary <string, object> { { "characterName", rChar.name }, { "characterID", Convert.ToInt32(characterID) }, { "discordUserId", 0 }, { "refreshToken", result[1] }, { "groupName", groupName }, { "permissions", string.Join(',', groupPermissions) }, { "authState", inputGroup != null && inputGroup.PreliminaryAuthMode ? 0 : 1 } }); } var uid = GetUniqID(); await SQLHelper.SQLiteDataInsertOrUpdate("pendingUsers", new Dictionary <string, object> { { "characterID", characterID }, { "corporationID", corpID.ToString() }, { "allianceID", allianceID.ToString() }, { "authString", uid }, { "active", "1" }, { "groups", "[]" }, { "dateCreated", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") } }); if (!group.PreliminaryAuthMode) { await WebServerModule.WriteResponce(File.ReadAllText(SettingsManager.FileTemplateAuth2).Replace("{url}", Settings.WebServerModule.DiscordUrl) .Replace("{image}", image) .Replace("{uid}", $"!auth {uid}").Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{body}", LM.Get("authTemplateSucc1", rChar.name)) .Replace("{body2}", LM.Get("authTemplateSucc2")).Replace("{body3}", LM.Get("authTemplateSucc3")).Replace("{backText}", LM.Get("backText")), response); if (SettingsManager.Settings.WebAuthModule.AuthReportChannel != 0) { await APIHelper.DiscordAPI.SendMessageAsync(SettingsManager.Settings.WebAuthModule.AuthReportChannel, LM.Get("authManualAcceptMessage", rChar.name, characterID, groupName)).ConfigureAwait(false); } await LogHelper.LogWarning(LM.Get("authManualAcceptMessage", rChar.name, characterID, groupName), LogCat.AuthWeb); } else { await WebServerModule.WriteResponce(File.ReadAllText(SettingsManager.FileTemplateAuth2) .Replace("{url}", Settings.WebServerModule.DiscordUrl) .Replace("{image}", image) .Replace("{uid}", $"!auth confirm {uid}") .Replace("{header}", LM.Get("authTemplateHeader")) .Replace("{body}", LM.Get("authTemplateManualAccept", rChar.name)) .Replace("{body3}", LM.Get("authTemplateManualAccept3")) .Replace("{body2}", LM.Get("authTemplateManualAccept2")) .Replace("{backText}", LM.Get("backText")), response); } } else { var message = LM.Get("authNonAlly"); await WebServerModule.WriteResponce(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", message) .Replace("{header}", LM.Get("authTemplateHeader")).Replace("{backText}", LM.Get("backText")).Replace("{body}", ""), response); } return(true); } } } catch (Exception ex) { await LogHelper.LogEx($"Error: {ex.Message}", ex, Category); } return(false); }
public static async Task <AuthUserEntity> CreateAlt(long characterId, string refreshToken, WebAuthGroup @group, string groupName, long mainCharId) { var authUser = new AuthUserEntity { CharacterId = characterId, DiscordId = 0, RefreshToken = refreshToken, GroupName = groupName, AuthState = 2, CreateDate = DateTime.Now, MainCharacterId = mainCharId }; await authUser.UpdateData(group.ESICustomAuthRoles.Count > 0?string.Join(',', group.ESICustomAuthRoles) : null); return(authUser); }
private static async Task <List <AuthRoleEntity> > GetEntityForStandingsAuth(WebAuthGroup group, JsonClasses.CharacterData chData) //0 personal, 1 corp, 2 ally, 3 faction { var list = new List <AuthRoleEntity>(); foreach (var characterID in group.StandingsAuth.CharacterIDs) { var standings = await SQLHelper.LoadAuthStands(characterID); if (standings == null) { continue; } await AuthInfoLog(chData, $"[GARE] Checking stands from {characterID}...", true); for (var typeNumber = 0; typeNumber < 3; typeNumber++) { string typeName; var id = 0L; switch (typeNumber) { case 0: typeName = "character"; id = chData.character_id; break; case 1: typeName = "corporation"; id = chData.corporation_id; break; case 2: typeName = "alliance"; id = chData.alliance_id ?? 0; break; default: return(list); } var st = new List <JsonClasses.Contact>(); st.AddRange(group.StandingsAuth.UseCharacterStandings && standings.PersonalStands != null ? standings.PersonalStands : new List <JsonClasses.Contact>()); st.AddRange(group.StandingsAuth.UseCorporationStandings && standings.CorpStands != null ? standings.CorpStands : new List <JsonClasses.Contact>()); st.AddRange(group.StandingsAuth.UseAllianceStandings && standings.AllianceStands != null? standings.AllianceStands : new List <JsonClasses.Contact>()); await AuthInfoLog(chData, $"[GARE] Total stands to check {st.Count}...", true); var stands = st.Where(a => a.contact_type == typeName && a.contact_id == id).Select(a => a.standing).Distinct(); var s = group.StandingsAuth.StandingFilters.Values.Where(a => a.Modifier == "eq").FirstOrDefault(a => a.Standings.Any(b => stands.Contains(b))); if (s != null) { list.Add(new AuthRoleEntity { Entities = new List <object> { id }, DiscordRoles = s.DiscordRoles }); } if (group.StopSearchingOnFirstMatch) { return(list); } s = group.StandingsAuth.StandingFilters.Values.Where(a => a.Modifier == "le").FirstOrDefault(a => a.Standings.Any(b => stands.Any(c => c <= b))); if (s != null) { list.Add(new AuthRoleEntity { Entities = new List <object> { id }, DiscordRoles = s.DiscordRoles }); } if (group.StopSearchingOnFirstMatch) { return(list); } s = group.StandingsAuth.StandingFilters.Values.Where(a => a.Modifier == "ge").FirstOrDefault(a => a.Standings.Any(b => stands.Any(c => c >= b))); if (s != null) { list.Add(new AuthRoleEntity { Entities = new List <object> { id }, DiscordRoles = s.DiscordRoles }); } if (group.StopSearchingOnFirstMatch) { return(list); } s = group.StandingsAuth.StandingFilters.Values.Where(a => a.Modifier == "lt").FirstOrDefault(a => a.Standings.Any(b => stands.Any(c => c < b))); if (s != null) { list.Add(new AuthRoleEntity { Entities = new List <object> { id }, DiscordRoles = s.DiscordRoles }); } if (group.StopSearchingOnFirstMatch) { return(list); } s = group.StandingsAuth.StandingFilters.Values.Where(a => a.Modifier == "gt").FirstOrDefault(a => a.Standings.Any(b => stands.Any(c => c > b))); if (s != null) { list.Add(new AuthRoleEntity { Entities = new List <object> { id }, DiscordRoles = s.DiscordRoles }); } if (group.StopSearchingOnFirstMatch) { return(list); } } } return(list); }