Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
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);
        }