コード例 #1
0
 private static async Task AuthWarningLog(JsonClasses.CharacterData ch, string message, bool isOptional = false)
 {
     if (!isOptional || SettingsManager.Settings.WebAuthModule.EnableDetailedLogging)
     {
         await LogHelper.LogWarning($"[{ch.character_id}|{ch.name}]: {message}", LogCat.AuthCheck);
     }
 }
コード例 #2
0
        public async Task UpdateData(JsonClasses.CharacterData characterData, JsonClasses.CorporationData rCorp = null, JsonClasses.AllianceData rAlliance = null, string permissions = null)
        {
            rCorp = rCorp ?? await APIHelper.ESIAPI.GetCorporationData(LogCat.AuthCheck.ToString(), characterData.corporation_id, true);

            Data.CharacterName     = characterData.name;
            Data.CorporationId     = characterData.corporation_id;
            Data.CorporationName   = rCorp?.name;
            Data.CorporationTicker = rCorp?.ticker;
            Data.AllianceId        = characterData.alliance_id ?? 0;
            if (Data.AllianceId > 0)
            {
                rAlliance = rAlliance ?? await APIHelper.ESIAPI.GetAllianceData(LogCat.AuthCheck.ToString(), characterData.alliance_id, true);

                Data.AllianceName   = rAlliance?.name;
                Data.AllianceTicker = rAlliance?.ticker;
            }
            if (permissions != null)
            {
                Data.Permissions = permissions;
            }
        }
コード例 #3
0
        public async Task <bool> RefreshRadius(string reason, JsonZKill.Killmail kill)
        {
            if (killmailID > 0)
            {
                return(true);
            }
            try
            {
                killmailID = kill.killmail_id;
                value      = kill.zkb.totalValue;
                systemId   = kill.solar_system_id;
                rSystem    = await APIHelper.ESIAPI.GetSystemData(reason, systemId);

                isUnreachableSystem = systemId == 31000005;
                if (rSystem != null)
                {
                    sysName             = rSystem.name == rSystem.system_id.ToString() ? "Abyss" : (rSystem.name ?? "J");
                    isUnreachableSystem = rSystem.IsUnreachable();
                }
                else
                {
                    sysName = "?";
                }

                victimCharacterID       = kill.victim.character_id;
                victimCorpID            = kill.victim.corporation_id;
                victimAllianceID        = kill.victim.alliance_id;
                attackers               = kill.attackers;
                finalBlowAttacker       = attackers.FirstOrDefault(a => a.final_blow);
                finalBlowAttackerCorpId = finalBlowAttacker?.corporation_id ?? 0;
                finalBlowAttackerAllyId = finalBlowAttacker?.alliance_id ?? 0;
                shipID   = kill.victim.ship_type_id;
                killTime = kill.killmail_time.ToString(SettingsManager.Settings.Config.ShortTimeFormat);

                rVictimCorp = await APIHelper.ESIAPI.GetCorporationData(reason, victimCorpID);

                rAttackerCorp = finalBlowAttackerCorpId > 0
                        ? await APIHelper.ESIAPI.GetCorporationData(reason, finalBlowAttackerCorpId)
                        : null;

                rVictimAlliance = victimAllianceID != 0 ? await APIHelper.ESIAPI.GetAllianceData(reason, victimAllianceID) : null;

                rAttackerAlliance = finalBlowAttackerAllyId > 0
                        ? await APIHelper.ESIAPI.GetAllianceData(reason, finalBlowAttackerAllyId)
                        : null;

                rShipType = await APIHelper.ESIAPI.GetTypeId(reason, shipID);

                rVictimCharacter = await APIHelper.ESIAPI.GetCharacterData(reason, victimCharacterID);

                rAttackerCharacter = await APIHelper.ESIAPI.GetCharacterData(reason, finalBlowAttacker?.character_id);

                systemSecurityStatus = Math.Round(rSystem.security_status, 1).ToString("0.0");

                dic = new Dictionary <string, string>
                {
                    { "{shipID}", shipID.ToString() },
                    { "{shipType}", rShipType?.name },
                    { "{iskValue}", value.ToString("n0") },
                    { "{systemName}", sysName },
                    { "{systemSec}", systemSecurityStatus },
                    { "{victimName}", rVictimCharacter?.name },
                    { "{victimCorpName}", rVictimCorp?.name },
                    { "{victimCorpTicker}", rVictimCorp?.ticker },
                    { "{victimAllyName}", rVictimAlliance?.name },
                    { "{victimAllyTicker}", rVictimAlliance == null ? null : $"<{rVictimAlliance.ticker}>" },
                    { "{attackerName}", rAttackerCharacter?.name },
                    { "{attackerCorpName}", rAttackerCorp?.name },
                    { "{attackerCorpTicker}", rAttackerCorp?.ticker },
                    { "{attackerAllyTicker}", rAttackerAlliance == null ? null : $"<{rAttackerAlliance.ticker}>" },
                    { "{attackerAllyName}", rAttackerAlliance?.name },
                    { "{attackersCount}", attackers?.Length.ToString() },
                    { "{kmId}", killmailID.ToString() },
                    { "{isNpcKill}", isNPCKill.ToString() },
                    { "{timestamp}", killTime }
                };


                return(true);
            }
            catch (Exception ex)
            {
                killmailID = 0;
                await LogHelper.LogEx("refresh ex", ex, LogCat.RadiusKill);

                return(false);
            }
        }
コード例 #4
0
        public static async Task <RoleSearchResult> GetRoleGroup(JsonClasses.CharacterData characterData, ulong discordUserId, string refreshToken = null)
        {
            var result       = new RoleSearchResult();
            var discordGuild = APIHelper.DiscordAPI.GetGuild();
            var u            = discordGuild.GetUser(discordUserId);

            try
            {
                if (characterData == null)
                {
                    await AuthWarningLog(discordUserId, "[RG] Aborted due to character data is null");

                    result.IsConnectionError = true;
                    return(result);
                }

                if (u != null)
                {
                    result.UpdatedRoles.Add(u.Roles.FirstOrDefault(x => x.Name == "@everyone"));
                }


                var groupsToCheck = new Dictionary <string, WebAuthGroup>();
                var authData      = await SQLHelper.GetAuthUserByCharacterId(characterData.character_id);

                #region Select groups to check
                if (!string.IsNullOrEmpty(authData?.GroupName))
                {
                    await AuthInfoLog(characterData, $"[RG] Has group name {authData.GroupName}", true);

                    //check specified group for roles
                    var(groupName, group) = GetGroupByName(authData.GroupName);
                    if (group != null)
                    {
                        //process upgrade groups first
                        if (group.UpgradeGroupNames.Any())
                        {
                            await AuthInfoLog(characterData, $"[RG] Adding upgrade groups: {string.Join(',', group.UpgradeGroupNames)}", true);

                            foreach (var item in group.UpgradeGroupNames)
                            {
                                var(key, value) = GetGroupByName(item);
                                if (value != null)
                                {
                                    groupsToCheck.Add(key, value);
                                }
                            }
                        }

                        //add root group
                        groupsToCheck.Add(groupName, group);

                        //add downgrade groups (checked last)
                        if (authData.IsAuthed && group.DowngradeGroupNames.Any())
                        {
                            await AuthInfoLog(characterData, $"[RG] Adding downgrade groups: {string.Join(',', group.DowngradeGroupNames)}", true);

                            foreach (var item in group.DowngradeGroupNames)
                            {
                                var(key, value) = GetGroupByName(item);
                                if (value != null)
                                {
                                    groupsToCheck.Add(key, value);
                                }
                            }
                        }
                    }
                    else
                    {
                        await AuthWarningLog(characterData, "[RG] Specified group not found!", true);
                    }
                }
                else //no auth group specifies - fresh general auth
                {
                    //check only GENERAL auth groups for roles
                    //non-general group auth should have group name supplied
                    foreach (var(key, value) in SettingsManager.Settings.WebAuthModule.AuthGroups.Where(a => !a.Value.ESICustomAuthRoles.Any() && !a.Value.BindToMainCharacter))
                    {
                        groupsToCheck.Add(key, value);
                    }
                    await AuthInfoLog(characterData, $"[RG] No group were specified, selected for search: {string.Join(',', groupsToCheck.Keys)}!", true);
                }
                #endregion

                // string groupName = null;

                //refresh token
                var tq = string.IsNullOrEmpty(refreshToken) ? null : await APIHelper.ESIAPI.RefreshToken(refreshToken, SettingsManager.Settings.WebServerModule.CcpAppClientId,
                                                                                                         SettingsManager.Settings.WebServerModule.CcpAppSecret);

                var uToken = tq?.Result;
                if (tq != null)
                {
                    if (tq.Data.IsFailed)
                    {
                        if (!tq.Data.IsNotValid)
                        {
                            result.IsConnectionError = true;
                            await AuthWarningLog(characterData, $"[RG] {characterData.name} Connection error while fetching token!");

                            return(result);
                        }
                    }
                }


                await AuthInfoLog(characterData, $"[RG] PRE TOCHECK: {string.Join(',', groupsToCheck.Keys)} CHARID: {characterData.character_id} DID: {authData.DiscordId} AUTH: {authData.AuthState} GRP: {authData.GroupName}", true);

                var foundGroup = await GetAuthGroupByCharacter(groupsToCheck, characterData);

                if (foundGroup != null)
                {
                    await AuthInfoLog(characterData, $"[RG] Group found: {foundGroup.GroupName} Roles: {string.Join(',', foundGroup.RoleEntities.SelectMany(a=> a.DiscordRoles))} Titles: {string.Join(',', foundGroup.RoleEntities.SelectMany(a=> a.Titles))}!", true);

                    //bad token
                    if (tq != null && tq.Data.IsNotValid)
                    {
                        if (foundGroup.Group.RemoveAuthIfTokenIsInvalid)
                        {
                            await AuthWarningLog(characterData, $"[RG] User {characterData.name} token is no more valid. Authentication will be declined.");

                            return(result);
                        }
                        if (foundGroup.Group.RemoveTokenIfTokenIsInvalid)
                        {
                            await AuthWarningLog(characterData, $"[RG] User {characterData.name} token is no more valid. Token will be omitted from auth data.");

                            result.TokenMustBeDeleted = true;
                            // return result;
                        }
                    }


                    await UpdateResultRolesWithTitles(discordGuild, foundGroup.RoleEntities, result, characterData, uToken);

                    result.ValidManualAssignmentRoles.AddRange(foundGroup.Group.ManualAssignmentRoles.Where(a => !result.ValidManualAssignmentRoles.Contains(a)));
                    result.GroupName = foundGroup.GroupName;
                    result.Group     = foundGroup.Group;
                }
                else
                {
                    await AuthInfoLog(characterData, $"[RG] Group not found", true);
                }

                return(result);
            }
            catch (Exception ex)
            {
                await LogHelper.LogError($"EXCEPTION: {ex.Message} CHARACTER: {characterData.character_id} [{characterData?.name}][{characterData?.corporation_id}]", LogCat.AuthCheck);

                throw;
            }
        }
コード例 #5
0
        private static async Task UpdateResultRolesWithTitles(SocketGuild discordGuild, List <AuthRoleEntity> roleEntities, RoleSearchResult result, JsonClasses.CharacterData ch, string uToken)
        {
            //process titles in priority
            //TODO titles and general mix?

            var titleEntity = roleEntities.FirstOrDefault(a => a.Titles.Any());

            if (titleEntity != null)
            {
                if (string.IsNullOrEmpty(uToken))
                {
                    await AuthWarningLog(ch,
                                         $"User has no ESI token but is being checked against group with Titles! Titles require `esi-characters.read_titles.v1` permissions!");

                    return;
                }

                var userTitles = (await APIHelper.ESIAPI.GetCharacterTitles("AuthCheck", ch.character_id, uToken))?.Select(a => a.name).ToList();
                if (userTitles != null && userTitles.Any())
                {
                    foreach (var roleTitle in titleEntity.Titles.Values)
                    {
                        if (!roleTitle.TitleNames.ContainsAnyFromList(userTitles))
                        {
                            continue;
                        }
                        foreach (var roleName in roleTitle.DiscordRoles)
                        {
                            var role = APIHelper.DiscordAPI.GetGuildRole(roleName);
                            if (role != null && !result.UpdatedRoles.Contains(role))
                            {
                                result.UpdatedRoles.Add(role);
                            }
                        }
                    }
                }
                else
                {
                    var forEmpty = titleEntity.Titles.FirstOrDefault(a => a.Value.TitleNames.Count == 0 && a.Value.DiscordRoles.Any()).Value;
                    if (forEmpty != null)
                    {
                        foreach (var roleName in forEmpty.DiscordRoles)
                        {
                            var role = APIHelper.DiscordAPI.GetGuildRole(roleName);
                            if (role != null && !result.UpdatedRoles.Contains(role))
                            {
                                result.UpdatedRoles.Add(role);
                            }
                        }
                    }
                }
            }
            else
            {
                var foundRoles = roleEntities.SelectMany(a => a.DiscordRoles).Distinct();
                var aRoles     = discordGuild.Roles.Where(a => foundRoles.Contains(a.Name) && !result.UpdatedRoles.Contains(a));

                foreach (var role in aRoles)
                {
                    if (!result.UpdatedRoles.Contains(role))
                    {
                        result.UpdatedRoles.Add(role);
                    }
                }
            }
        }
コード例 #6
0
        private async Task <WCEAccessFilter> CheckAccess(long characterId, JsonClasses.CharacterData rChar)
        {
            var authgroups = Settings.WebConfigEditorModule.GetEnabledGroups();

            if (authgroups.Count == 0 || authgroups.Values.All(a => !a.AllowedEntities.Any() && !a.AllowedDiscordRoles.Any()))
            {
                return(new WCEAccessFilter());
            }

            //check discord roles auth
            foreach (var filter in authgroups.Values)
            {
                if (filter.AllowedDiscordRoles.Any())
                {
                    var authUser = await SQLHelper.GetAuthUserByCharacterId(characterId);

                    if (authUser != null && authUser.DiscordId > 0)
                    {
                        if (APIHelper.DiscordAPI.GetUserRoleNames(authUser.DiscordId).Intersect(filter.AllowedDiscordRoles).Any())
                        {
                            return(filter);
                        }
                    }
                }
            }

            //check for Discord admins
            var discordId = SQLHelper.GetAuthUserDiscordId(characterId).GetAwaiter().GetResult();

            if (discordId > 0)
            {
                var roles = string.Join(',', APIHelper.DiscordAPI.GetUserRoleNames(discordId));
                if (!string.IsNullOrEmpty(roles))
                {
                    var exemptRoles = Settings.Config.DiscordAdminRoles;
                    if (roles.Replace("&br;", "\"").Split(',').Any(role => exemptRoles.Contains(role)))
                    {
                        return(new WCEAccessFilter());
                    }
                }
            }



            foreach (var accessList in Settings.WebConfigEditorModule.GetEnabledGroups())
            {
                var filterName     = accessList.Key;
                var filter         = accessList.Value;
                var accessChars    = GetParsedCharacters(filterName) ?? new List <long>();
                var accessCorps    = GetParsedCorporations(filterName) ?? new List <long>();
                var accessAlliance = GetParsedAlliances(filterName) ?? new List <long>();
                if (!accessCorps.Contains(rChar.corporation_id) && (!rChar.alliance_id.HasValue || !(rChar.alliance_id > 0) || (!accessAlliance.Contains(
                                                                                                                                    rChar.alliance_id
                                                                                                                                    .Value))))
                {
                    if (!accessChars.Contains(characterId))
                    {
                        continue;
                    }
                }

                return(filter);
            }

            return(null);
        }
コード例 #7
0
        private async Task <bool[]> CheckAccess(long characterId, JsonClasses.CharacterData rChar)
        {
            var authgroups     = Settings.TimersModule.AccessList;
            var accessCorps    = new List <long>();
            var accessAlliance = new List <long>();
            var accessChars    = new List <long>();
            // isEditor = false;
            bool skip = false;

            if (authgroups.Count == 0 || authgroups.Values.All(a => !a.FilterEntities.Any() && !a.FilterDiscordRoles.Any()))
            {
                skip = true;
            }
            else
            {
                var discordRoles = authgroups.Values.SelectMany(a => a.FilterDiscordRoles).Distinct().ToList();
                if (discordRoles.Any())
                {
                    var authUser = await SQLHelper.GetAuthUserByCharacterId(characterId);

                    if (authUser != null && authUser.DiscordId > 0 && APIHelper.IsDiscordAvailable)
                    {
                        if (APIHelper.DiscordAPI.GetUserRoleNames(authUser.DiscordId).Intersect(discordRoles).Any())
                        {
                            skip = true;
                        }
                    }
                }

                accessChars    = ParsedAccessLists.Where(a => a.Value.ContainsKey("character")).SelectMany(a => a.Value["character"]).Distinct().Where(a => a > 0).ToList();
                accessCorps    = ParsedAccessLists.Where(a => a.Value.ContainsKey("corporation")).SelectMany(a => a.Value["corporation"]).Distinct().Where(a => a > 0).ToList();
                accessAlliance = ParsedAccessLists.Where(a => a.Value.ContainsKey("alliance")).SelectMany(a => a.Value["alliance"]).Distinct().Where(a => a > 0).ToList();
            }

            authgroups = Settings.TimersModule.EditList;
            var  editCorps    = new List <long>();
            var  editAlliance = new List <long>();
            var  editChars    = new List <long>();
            bool skip2        = false;

            if (authgroups.Count == 0 || authgroups.Values.All(a => !a.FilterEntities.Any() && !a.FilterDiscordRoles.Any()))
            {
                skip2 = true;
            }
            else
            {
                var discordRoles = authgroups.Values.SelectMany(a => a.FilterDiscordRoles).Distinct().ToList();
                if (discordRoles.Any())
                {
                    var authUser = await SQLHelper.GetAuthUserByCharacterId(characterId);

                    if (authUser != null && authUser.DiscordId > 0)
                    {
                        if (APIHelper.DiscordAPI.GetUserRoleNames(authUser.DiscordId).Intersect(discordRoles).Any())
                        {
                            skip2 = true;
                        }
                    }
                }
                editChars    = ParsedEditLists.Where(a => a.Value.ContainsKey("character")).SelectMany(a => a.Value["character"]).Distinct().Where(a => a > 0).ToList();
                editCorps    = ParsedEditLists.Where(a => a.Value.ContainsKey("corporation")).SelectMany(a => a.Value["corporation"]).Distinct().Where(a => a > 0).ToList();
                editAlliance = ParsedEditLists.Where(a => a.Value.ContainsKey("alliance")).SelectMany(a => a.Value["alliance"]).Distinct().Where(a => a > 0).ToList();
            }

            //check for Discord admins
            if (!skip2 && Settings.TimersModule.GrantEditRolesToDiscordAdmins)
            {
                var discordId = await SQLHelper.GetAuthUserDiscordId(characterId);

                if (discordId > 0)
                {
                    var roles = string.Join(',', APIHelper.DiscordAPI.GetUserRoleNames(discordId));
                    if (!string.IsNullOrEmpty(roles))
                    {
                        var exemptRoles = Settings.Config.DiscordAdminRoles;
                        skip2 = roles.Replace("&br;", "\"").Split(',').Any(role => exemptRoles.Contains(role));
                    }
                }
            }

            if (!skip && !skip2 && !accessCorps.Contains(rChar.corporation_id) && !editCorps.Contains(rChar.corporation_id) &&
                (!rChar.alliance_id.HasValue || !(rChar.alliance_id > 0) || (!accessAlliance.Contains(
                                                                                 rChar.alliance_id
                                                                                 .Value) && !editAlliance.Contains(
                                                                                 rChar.alliance_id.Value))))
            {
                if (!editChars.Contains(characterId) && !accessChars.Contains(characterId))
                {
                    return(new[] { false, false });
                }
            }

            var isEditor = skip2 || editCorps.Contains(rChar.corporation_id) || (rChar.alliance_id.HasValue && rChar.alliance_id.Value > 0 && editAlliance.Contains(rChar.alliance_id.Value)) ||
                           editChars.Contains(characterId);

            return(new [] { true, isEditor });
        }
コード例 #8
0
ファイル: WebAuthModule.cs プロジェクト: Husteln/ThunderED
        private static async Task <bool> AuthGrantRoles(ulong channelId, string characterID, Dictionary <int, List <string> > foundList, JsonClasses.CharacterData characterData, JsonClasses.CorporationData corporationData, string remainder, ulong discordId)
        {
            var rolesToAdd = new List <SocketRole>();

            var allianceID = characterData.alliance_id ?? 0;
            var corpID     = characterData.corporation_id;

            var authSettings = TickManager.GetModule <WebAuthModule>()?.Settings.WebAuthModule;
            var missedRoles  = new List <string>();

            try
            {
                //Check for Corp roles
                if (foundList.ContainsKey(corpID))
                {
                    var cRoles = foundList[corpID];
                    cRoles.ForEach(a =>
                    {
                        var f = APIHelper.DiscordAPI.GetGuildRole(a);
                        if (f != null && !rolesToAdd.Contains(f))
                        {
                            rolesToAdd.Add(f);
                        }
                        else
                        {
                            missedRoles.Add(a);
                        }
                    });
                }

                //Check for Alliance roles
                if (foundList.ContainsKey(allianceID))
                {
                    var cRoles = foundList[allianceID];
                    cRoles.ForEach(a =>
                    {
                        var f = APIHelper.DiscordAPI.GetGuildRole(a);
                        if (f != null && !rolesToAdd.Contains(f))
                        {
                            rolesToAdd.Add(f);
                        }
                        else
                        {
                            missedRoles.Add(a);
                        }
                    });
                }

                var discordUser = APIHelper.DiscordAPI.GetUser(discordId);

                if (authSettings.AuthReportChannel != 0)
                {
                    await APIHelper.DiscordAPI.SendMessageAsync(authSettings.AuthReportChannel, LM.Get("grantRolesMessage", characterData.name))
                    .ConfigureAwait(false);
                }
                await APIHelper.DiscordAPI.AssignRolesToUser(discordUser, rolesToAdd);

                if (missedRoles.Any())
                {
                    await LogHelper.LogWarning($"Missing discord roles: {string.Join(',', missedRoles)}");
                }

                var rolesString = new StringBuilder();
                foreach (var role in discordUser.Roles)
                {
                    if (role.Name.StartsWith("@everyone"))
                    {
                        continue;
                    }
                    rolesString.Append(role.Name.Replace("\"", "&br;"));
                    rolesString.Append(",");
                }
                if (rolesString.Length > 0)
                {
                    rolesString.Remove(rolesString.Length - 1, 1);
                }

                await SQLHelper.SQLiteDataUpdate("pendingUsers", "active", "0", "authString", remainder);

                if (channelId != 0)
                {
                    await APIHelper.DiscordAPI.SendMessageAsync(channelId, LM.Get("msgAuthSuccess", discordUser.Mention, characterData.name));
                }
                var eveName   = characterData.name;
                var discordID = discordUser.Id;
                var addedOn   = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

                await SQLHelper.SQLiteDataInsertOrUpdate("authUsers", new Dictionary <string, object>
                {
                    { "eveName", eveName },
                    { "characterID", characterID },
                    { "discordID", discordID.ToString() },
                    { "role", rolesString.ToString() },
                    { "active", "yes" },
                    { "addedOn", addedOn }
                });

                if (authSettings.EnforceCorpTickers || authSettings.EnforceCharName)
                {
                    var nickname = "";
                    if (authSettings.EnforceCorpTickers)
                    {
                        nickname = $"[{corporationData.ticker}] ";
                    }
                    if (authSettings.EnforceCharName)
                    {
                        nickname += $"{eveName}";
                    }
                    else
                    {
                        nickname += $"{discordUser.Username}";
                    }

                    try
                    {
                        //will throw ex on admins
                        await discordUser.ModifyAsync(x => x.Nickname = nickname);
                    }
                    catch
                    {
                        //ignore
                    }

                    await APIHelper.DiscordAPI.Dupes(discordUser);
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx($"Failed adding Roles to User {characterData.name}, Reason: {ex.Message}", ex, LogCat.Discord);

                return(false);
            }

            return(true);
        }
コード例 #9
0
        public async Task <bool> Refresh(string reason, JsonZKill.Killmail kill)
        {
            if (killmailID > 0)
            {
                return(true);
            }
            try
            {
                killmailID                   = kill.killmail_id;
                killTime                     = kill.killmail_time.ToString(SettingsManager.Settings.Config.ShortTimeFormat);
                victimShipID                 = kill.victim.ship_type_id;
                value                        = kill.zkb.totalValue;
                victimCharacterID            = kill.victim.character_id;
                victimCorpID                 = kill.victim.corporation_id;
                victimAllianceID             = kill.victim.alliance_id;
                attackers                    = kill.attackers;
                finalBlowAttacker            = attackers.FirstOrDefault(a => a.final_blow);
                finalBlowAttackerCharacterId = finalBlowAttacker.character_id;
                attackerShipID               = finalBlowAttacker?.ship_type_id ?? 0;
                finalBlowAttackerCorpId      = finalBlowAttacker?.corporation_id ?? 0;
                finalBlowAttackerAllyId      = finalBlowAttacker?.alliance_id ?? 0;
                isNPCKill                    = kill.zkb.npc;
                systemId                     = kill.solar_system_id;
                rSystem                      = await APIHelper.ESIAPI.GetSystemData(reason, systemId);

                if (rSystem == null)
                {
                    //ESI fail - check back later
                    return(false);
                }

                rVictimCorp = await APIHelper.ESIAPI.GetCorporationData(reason, victimCorpID);

                rAttackerCorp = finalBlowAttackerCorpId > 0
                    ? await APIHelper.ESIAPI.GetCorporationData(reason, finalBlowAttackerCorpId)
                    : null;

                rVictimAlliance = victimAllianceID != 0 ? await APIHelper.ESIAPI.GetAllianceData(reason, victimAllianceID) : null;

                rAttackerAlliance = finalBlowAttackerAllyId > 0
                    ? await APIHelper.ESIAPI.GetAllianceData(reason, finalBlowAttackerAllyId)
                    : null;

                sysName = rSystem.name == rSystem.system_id.ToString() ? "Abyss" : rSystem.name;
                var rConst = rSystem != null ? await APIHelper.ESIAPI.GetConstellationData(reason, rSystem.constellation_id) : null;

                var rRegion = rConst != null ? await APIHelper.ESIAPI.GetRegionData(reason, rConst.region_id) : null;

                rVictimShipType = await APIHelper.ESIAPI.GetTypeId(reason, victimShipID);

                rAttackerShipType = await APIHelper.ESIAPI.GetTypeId(reason, attackerShipID);

                rVictimCharacter = await APIHelper.ESIAPI.GetCharacterData(reason, victimCharacterID);

                rAttackerCharacter = await APIHelper.ESIAPI.GetCharacterData(reason, finalBlowAttacker?.character_id);

                systemSecurityStatus = Math.Round(rSystem.security_status, 1).ToString("0.0");

                dic = new Dictionary <string, string>
                {
                    { "{shipID}", victimShipID.ToString() },
                    { "{shipType}", rVictimShipType?.name },
                    { "{attackerShipID}", attackerShipID.ToString() },
                    { "{attackerShipType}", rAttackerShipType?.name },
                    { "{iskValue}", value.ToString("n0") },
                    { "{iskFittedValue}", kill?.zkb?.fittedValue.ToString("n0") ?? "0" },
                    { "{systemName}", sysName },
                    { "{constName}", rConst?.name },
                    { "{regionName}", rRegion?.name },
                    { "{systemSec}", systemSecurityStatus },
                    { "{victimName}", rVictimCharacter?.name },
                    { "{victimCorpName}", rVictimCorp?.name },
                    { "{victimCorpTicker}", rVictimCorp?.ticker },
                    { "{victimAllyName}", rVictimAlliance?.name },
                    { "{victimAllyTicker}", rVictimAlliance == null ? null : $"<{rVictimAlliance.ticker}>" },
                    { "{victimAllyOrCorpName}", rVictimAlliance?.name ?? rVictimCorp?.name },
                    { "{victimAllyOrCorpTicker}", rVictimAlliance?.ticker ?? rVictimCorp?.ticker },
                    { "{attackerName}", rAttackerCharacter?.name },
                    { "{attackerCorpName}", rAttackerCorp?.name },
                    { "{attackerCorpTicker}", rAttackerCorp?.ticker },
                    { "{attackerAllyTicker}", rAttackerAlliance == null ? null : $"<{rAttackerAlliance.ticker}>" },
                    { "{attackerAllyName}", rAttackerAlliance?.name },
                    { "{attackerAllyOrCorpName}", rAttackerAlliance?.name ?? rAttackerCorp?.name },
                    { "{attackerAllyOrCorpTicker}", rAttackerAlliance?.ticker ?? rAttackerCorp?.ticker },
                    { "{attackersCount}", attackers.Length.ToString() },
                    { "{kmId}", killmailID.ToString() },
                    { "{timestamp}", killTime },
                    { "{isLoss}", "false" },
                    { "{isNpcKill}", isNPCKill.ToString() ?? "false" },
                    { "{isSoloKill}", kill?.zkb?.solo.ToString() ?? "false" },
                    { "{isAwoxKill}", kill?.zkb?.awox.ToString() ?? "false" },
                };

                return(true);
            }
            catch (Exception ex)
            {
                killmailID = 0;
                await LogHelper.LogEx("refresh ex", ex, LogCat.KillFeed);

                return(false);
            }
        }
コード例 #10
0
ファイル: TimersModule.cs プロジェクト: lumpy-it/ThunderED
        private bool CheckAccess(int characterId, JsonClasses.CharacterData rChar, out bool isEditor)
        {
            var authgroups     = SettingsManager.GetSubList("timersModule", "accessList");
            var accessCorps    = new List <int>();
            var accessAlliance = new List <int>();
            var accessChars    = new List <int>();

            isEditor = false;
            bool skip = false;

            if (authgroups.Count == 0 || authgroups.All(a => (a.GetChildren().ToList().FirstOrDefault(x => x.Key == "id")?.Value ?? "") == "0"))
            {
                skip = true;
            }
            else
            {
                foreach (var config in authgroups)
                {
                    var configChildren = config.GetChildren().ToList();
                    var id             = configChildren.FirstOrDefault(x => x.Key == "id")?.Value ?? "";
                    var isAlliance     = Convert.ToBoolean(configChildren.FirstOrDefault(x => x.Key == "isAlliance")?.Value ?? "false");
                    var isChar         = Convert.ToBoolean(configChildren.FirstOrDefault(x => x.Key == "isCharacter")?.Value ?? "false");
                    if (isChar)
                    {
                        accessChars.Add(Convert.ToInt32(id));
                    }
                    else
                    {
                        if (isAlliance)
                        {
                            accessAlliance.Add(Convert.ToInt32(id));
                        }
                        else
                        {
                            accessCorps.Add(Convert.ToInt32(id));
                        }
                    }
                }
            }

            authgroups = SettingsManager.GetSubList("timersModule", "editList");
            var  editCorps    = new List <int>();
            var  editAlliance = new List <int>();
            var  editChars    = new List <int>();
            bool skip2        = false;

            //check for Discord admins
            if (SettingsManager.GetBool("timersModule", "grantEditRolesToDiscordAdmins"))
            {
                var roles = SQLHelper.SQLiteDataQuery <string>("authUsers", "role", "characterID", characterId.ToString()).GetAwaiter().GetResult();
                if (!string.IsNullOrEmpty(roles))
                {
                    var exemptRoles = SettingsManager.GetSubList("config", "discordAdminRoles").Select(a => a.Value);
                    skip2 = roles.Replace("&br;", "\"").Split(',').Any(role => exemptRoles.Contains(role));
                }
            }

            if (authgroups.Count == 0 || authgroups.All(a => (a.GetChildren().ToList().FirstOrDefault(x => x.Key == "id")?.Value ?? "") == "0"))
            {
                skip2 = true;
            }
            else
            {
                foreach (var config in authgroups)
                {
                    var configChildren = config.GetChildren().ToList();
                    var id             = configChildren.FirstOrDefault(x => x.Key == "id")?.Value ?? "";
                    var isAlliance     = Convert.ToBoolean(configChildren.FirstOrDefault(x => x.Key == "isAlliance")?.Value ?? "false");
                    var isChar         = Convert.ToBoolean(configChildren.FirstOrDefault(x => x.Key == "isCharacter")?.Value ?? "false");
                    if (isChar)
                    {
                        editChars.Add(Convert.ToInt32(id));
                    }
                    else
                    {
                        if (isAlliance)
                        {
                            editAlliance.Add(Convert.ToInt32(id));
                        }
                        else
                        {
                            editCorps.Add(Convert.ToInt32(id));
                        }
                    }
                }
            }



            if (!skip && !skip2 && !accessCorps.Contains(rChar.corporation_id) && !editCorps.Contains(rChar.corporation_id) &&
                (!rChar.alliance_id.HasValue || !(rChar.alliance_id > 0) || (!accessAlliance.Contains(
                                                                                 rChar.alliance_id
                                                                                 .Value) && !editAlliance.Contains(
                                                                                 rChar.alliance_id.Value))))
            {
                if (!editChars.Contains(characterId) && !accessChars.Contains(characterId))
                {
                    //TODO access denied
                    return(false);
                }
            }

            isEditor = skip2 || editCorps.Contains(rChar.corporation_id) || (rChar.alliance_id.HasValue && rChar.alliance_id.Value > 0 && editAlliance.Contains(rChar.alliance_id.Value)) ||
                       editChars.Contains(characterId);

            return(true);
        }
コード例 #11
0
ファイル: TimersModule.cs プロジェクト: Husteln/ThunderED
        private bool CheckAccess(int characterId, JsonClasses.CharacterData rChar, out bool isEditor)
        {
            var authgroups     = Settings.TimersModule.AccessList;
            var accessCorps    = new List <int>();
            var accessAlliance = new List <int>();
            var accessChars    = new List <int>();

            isEditor = false;
            bool skip = false;

            if (authgroups.Count == 0 || authgroups.All(a => a.Value.Id == 0))
            {
                skip = true;
            }
            else
            {
                foreach (var config in authgroups)
                {
                    var id = config.Value.Id;
                    if (config.Value.IsCharacter)
                    {
                        accessChars.Add(id);
                    }
                    else
                    {
                        if (config.Value.IsAlliance)
                        {
                            accessAlliance.Add(id);
                        }
                        else
                        {
                            accessCorps.Add(id);
                        }
                    }
                }
            }

            authgroups = Settings.TimersModule.EditList;
            var  editCorps    = new List <int>();
            var  editAlliance = new List <int>();
            var  editChars    = new List <int>();
            bool skip2        = false;

            //check for Discord admins
            if (Settings.TimersModule.GrantEditRolesToDiscordAdmins)
            {
                var roles = SQLHelper.SQLiteDataQuery <string>("authUsers", "role", "characterID", characterId.ToString()).GetAwaiter().GetResult();
                if (!string.IsNullOrEmpty(roles))
                {
                    var exemptRoles = Settings.Config.DiscordAdminRoles;
                    skip2 = roles.Replace("&br;", "\"").Split(',').Any(role => exemptRoles.Contains(role));
                }
            }

            if (authgroups.Count == 0 || authgroups.All(a => a.Value.Id == 0))
            {
                skip2 = true;
            }
            else
            {
                foreach (var config in authgroups)
                {
                    var id = config.Value.Id;
                    if (config.Value.IsCharacter)
                    {
                        editChars.Add(id);
                    }
                    else
                    {
                        if (config.Value.IsAlliance)
                        {
                            editAlliance.Add(id);
                        }
                        else
                        {
                            editCorps.Add(id);
                        }
                    }
                }
            }



            if (!skip && !skip2 && !accessCorps.Contains(rChar.corporation_id) && !editCorps.Contains(rChar.corporation_id) &&
                (!rChar.alliance_id.HasValue || !(rChar.alliance_id > 0) || (!accessAlliance.Contains(
                                                                                 rChar.alliance_id
                                                                                 .Value) && !editAlliance.Contains(
                                                                                 rChar.alliance_id.Value))))
            {
                if (!editChars.Contains(characterId) && !accessChars.Contains(characterId))
                {
                    return(false);
                }
            }

            isEditor = skip2 || editCorps.Contains(rChar.corporation_id) || (rChar.alliance_id.HasValue && rChar.alliance_id.Value > 0 && editAlliance.Contains(rChar.alliance_id.Value)) ||
                       editChars.Contains(characterId);

            return(true);
        }
コード例 #12
0
        internal static async Task AuthUser(ICommandContext context, string remainder, ulong discordId)
        {
            JsonClasses.CharacterData characterData = null;
            try
            {
                discordId = discordId > 0 ? discordId : context.Message.Author.Id;

                //check pending user validity
                var authUser = !string.IsNullOrEmpty(remainder) ? await SQLHelper.GetAuthUserByRegCode(remainder) : await SQLHelper.GetAuthUserByDiscordId(discordId);

                if (authUser == null)
                {
                    await AuthWarningLog(discordId, $"Failed to get authUser from `{remainder}` or by Discord ID");

                    if (context != null)
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, context.Channel, LM.Get("authHasInvalidKey", SettingsManager.Settings.Config.BotDiscordCommandPrefix), true).ConfigureAwait(false);
                    }
                    return;
                }
                if (authUser.IsAuthed || string.IsNullOrEmpty(authUser.RegCode))
                {
                    await AuthWarningLog(authUser, authUser.IsAuthed? "User already authenticated" : "Specified reg code is empty");

                    if (context != null)
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, context.Channel, LM.Get("authHasInactiveKey", SettingsManager.Settings.Config.BotDiscordCommandPrefix), true).ConfigureAwait(false);
                    }
                    return;
                }

                if (authUser.Data.PermissionsList.Any())
                {
                    var token = (await APIHelper.ESIAPI.RefreshToken(authUser.RefreshToken, SettingsManager.Settings.WebServerModule.CcpAppClientId,
                                                                     SettingsManager.Settings.WebServerModule.CcpAppSecret, $"From WebAuth | Char ID: {authUser.CharacterId} | Char name: {authUser.Data.CharacterName}"))?.Result;
                    //delete char if token is invalid
                    if (string.IsNullOrEmpty(token))
                    {
                        //just reauth... if happens
                        await AuthWarningLog(authUser, $"Character has invalid token and will be deleted from DB.");

                        if (context != null)
                        {
                            await APIHelper.DiscordAPI.ReplyMessageAsync(context, context.Channel, LM.Get("authUnableToCompleteTryAgainLater"), true).ConfigureAwait(false);
                        }
                        await SQLHelper.DeleteAuthDataByCharId(authUser.CharacterId);

                        return;
                    }
                }

                characterData = await APIHelper.ESIAPI.GetCharacterData("Auth", authUser.CharacterId, true);

                //check if we fit some group
                var result = await GetRoleGroup(characterData, discordId, authUser.RefreshToken);

                if (result.IsConnectionError)
                {
                    await AuthWarningLog(authUser, $"Possible connection error while processing auth request(search for group)!");

                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, context.Channel, LM.Get("authUnableToCompleteTryAgainLater"), true).ConfigureAwait(false);

                    return;
                }

                await AuthInfoLog(authUser, $"GRPFETCH GROUP: {result.GroupName} ROLES: {(result.UpdatedRoles == null || !result.UpdatedRoles.Any() ? "null" : string.Join(',', result.UpdatedRoles?.Select(a=> a.Name.Replace("@", "_"))))} MANUAL: {(result.UpdatedRoles == null || !result.UpdatedRoles.Any() ? "null" : string.Join(',', result.ValidManualAssignmentRoles.Select(a=> a.Replace("@", "_"))))}", true);

                //var groupName = result?.GroupName;
                //pass auth
                if (!string.IsNullOrEmpty(result?.GroupName))
                {
                    var group   = result.Group;
                    var channel = context?.Channel?.Id ?? SettingsManager.Settings.WebAuthModule.AuthReportChannel;

                    if (characterData == null)
                    {
                        await AuthWarningLog(authUser, $"Unable to get character {authUser.CharacterId} from ESI. Aborting auth.");

                        if (context != null)
                        {
                            await APIHelper.DiscordAPI.ReplyMessageAsync(context, context.Channel, LM.Get("authUnableToCompleteTryAgainLater"), true).ConfigureAwait(false);
                        }
                        //await SQLHelper.DeleteAuthDataByCharId(authUser.CharacterId);
                        return;
                    }

                    //report to discord
                    var reportChannel = SettingsManager.Settings.WebAuthModule.AuthReportChannel;
                    if (reportChannel != 0)
                    {
                        var mention = group.DefaultMention;
                        if (group.PreliminaryAuthMode)
                        {
                            await APIHelper.DiscordAPI.SendMessageAsync(reportChannel, $"{mention} {LM.Get("grantRolesPrelMessage", characterData.name, result.GroupName)}")
                            .ConfigureAwait(false);
                        }
                        else
                        {
                            await APIHelper.DiscordAPI.SendMessageAsync(reportChannel, $"{mention} {LM.Get("grantRolesMessage", characterData.name)}")
                            .ConfigureAwait(false);
                        }
                    }

                    //remove all prevoius users associated with discordID or charID
                    List <long> altCharIds = null;
                    if (discordId > 0)
                    {
                        altCharIds = await SQLHelper.DeleteAuthDataByDiscordId(discordId);

                        await SQLHelper.DeleteAuthDataByCharId(authUser.CharacterId);
                    }

                    // authUser.CharacterId = authUser.CharacterId;
                    authUser.DiscordId = discordId > 0 ? discordId : authUser.DiscordId;
                    if (discordId == 0)
                    {
                        await AuthWarningLog(authUser, "Assigning 0 Discord ID to auth user?");
                    }
                    authUser.GroupName = result.GroupName;
                    authUser.SetStateAuthed();
                    authUser.RegCode = null;

                    await authUser.UpdateData(group.ESICustomAuthRoles.Count > 0?string.Join(',', group.ESICustomAuthRoles) : null);

                    await SQLHelper.SaveAuthUser(authUser);

                    if (altCharIds?.Any() ?? false)
                    {
                        altCharIds.ForEach(async a => await SQLHelper.UpdateMainCharacter(a, authUser.CharacterId));
                    }

                    //run roles assignment
                    await AuthInfoLog(authUser, $"Running roles update for {characterData.name} {(group.PreliminaryAuthMode ? $"[AUTO-AUTH from {result.GroupName}]" : $"[MANUAL-AUTH {result.GroupName}]")}");

                    await APIHelper.DiscordAPI.GetGuild(SettingsManager.Settings.Config.DiscordGuildId).DownloadUsersAsync();

                    await UpdateUserRoles(discordId, SettingsManager.Settings.WebAuthModule.ExemptDiscordRoles,
                                          SettingsManager.Settings.WebAuthModule.AuthCheckIgnoreRoles);

                    //notify about success
                    if (channel != 0)
                    {
                        await APIHelper.DiscordAPI.SendMessageAsync(channel, LM.Get("msgAuthSuccess", await APIHelper.DiscordAPI.GetUserMention(discordId), characterData.name));
                    }
                    await AuthInfoLog(authUser, $"Character {characterData.name} has been successfully authenticated");
                }
                else
                {
                    if (context != null)
                    {
                        await APIHelper.DiscordAPI.SendMessageAsync(context.Channel, "Unable to accept user as he don't fit into auth group access criteria!").ConfigureAwait(false);
                    }
                    await LogHelper.LogError($"ESI Failure or No Access - auth group name not matching user data! DiscordID: {discordId}", LogCat.AuthWeb);
                }
            }
コード例 #13
0
        private static async Task <WebAuthResult> GetAuthGroupByCharacter(Dictionary <string, WebAuthGroup> groups, JsonClasses.CharacterData chData)
        {
            groups = groups ?? SettingsManager.Settings.WebAuthModule.GetEnabledAuthGroups();
            var result = await GetAuthRoleEntityById(groups, chData);

            return(result.RoleEntities.Any() ? new WebAuthResult {
                GroupName = result.GroupName, Group = result.Group, RoleEntities = result.RoleEntities
            } : null);
        }
コード例 #14
0
        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);
        }
コード例 #15
0
 public static async Task <WebAuthResult> GetAuthRoleEntityById(KeyValuePair <string, WebAuthGroup> group, JsonClasses.CharacterData chData)
 {
     var(key, value) = @group;
     return(await GetAuthRoleEntityById(new Dictionary <string, WebAuthGroup> {
         { key, value }
     }, chData));
 }
コード例 #16
0
        public static async Task <WebAuthResult> GetAuthRoleEntityById(Dictionary <string, WebAuthGroup> groups, JsonClasses.CharacterData chData)
        {
            groups = groups ?? SettingsManager.Settings.WebAuthModule.GetEnabledAuthGroups();
            var result = new WebAuthResult();

            foreach (var(groupName, group) in groups)
            {
                if (group.StandingsAuth == null)
                {
                    var nameList = new List <string>();
                    foreach (var(entityName, entity) in group.AllowedMembers)
                    {
                        //found guest
                        if (!entity.Entities.Any())
                        {
                            await AuthInfoLog(chData, $"[GARE] Found guest group {groupName}! Return OK.", true);

                            result.RoleEntities.Add(entity);
                            result.Group     = group;
                            result.GroupName = groupName;
                            return(result);
                        }

                        await AuthInfoLog(chData, $"[GARE] Checking {groupName}|{entityName} - FSTOP: {group.StopSearchingOnFirstMatch} ...", true);

                        List <long> data;
                        lock (UpdateLock)
                            data = Instance.GetTier2CharacterIds(Instance.ParsedMembersLists, groupName, entityName);
                        if (data.Contains(chData.character_id))
                        {
                            result.RoleEntities.Add(entity);
                        }
                        else
                        {
                            lock (UpdateLock)
                                data = Instance.GetTier2CorporationIds(Instance.ParsedMembersLists, groupName, entityName);
                            if (data.Contains(chData.corporation_id))
                            {
                                result.RoleEntities.Add(entity);
                            }
                            else
                            {
                                lock (UpdateLock)
                                    data = Instance.GetTier2AllianceIds(Instance.ParsedMembersLists, groupName, entityName);
                                if (chData.alliance_id.HasValue && data.Contains(chData.alliance_id.Value))
                                {
                                    result.RoleEntities.Add(entity);
                                }
                            }
                        }

                        //return if we have a match and don't need to check all members
                        if (result.RoleEntities.Any())
                        {
                            nameList.Add(entityName);
                            if (group.StopSearchingOnFirstMatch)
                            {
                                await AuthInfoLog(chData, $"[GARE] Found match. Return OK.", true);

                                result.Group     = group;
                                result.GroupName = groupName;
                                return(result);
                            }
                            else
                            {
                                await AuthInfoLog(chData, $"[GARE] Found pre-match in {groupName}|{entityName}. Continue search...", true);
                            }
                        }
                    }

                    //return after all members has been checked
                    if (result.RoleEntities.Any())
                    {
                        await AuthInfoLog(chData, $"[GARE] Found matches from {string.Join(',', nameList)}. Return OK.", true);

                        result.Group     = group;
                        result.GroupName = groupName;
                        return(result);
                    }
                }
                else
                {
                    var r = await GetEntityForStandingsAuth(group, chData);

                    if (r.Any())
                    {
                        await AuthInfoLog(chData, $"[GARE] Found match. Return OK.", true);

                        result.Group        = group;
                        result.GroupName    = groupName;
                        result.RoleEntities = r;
                        return(result);
                    }
                }
            }

            return(result);
        }