Exemplo n.º 1
0
        private static async Task RunAsync(string orgName, string outputFileName, string cacheLocation, string githubToken, string ospoToken, string policyRepo)
        {
            var isForExcel   = outputFileName == null;
            var gitHubClient = await GitHubClientFactory.CreateAsync(githubToken);

            var ospoClient = await OspoClientFactory.CreateAsync(ospoToken);

            var cachedOrg = await CachedOrg.LoadAsync(gitHubClient, orgName, Console.Out, cacheLocation, forceUpdate : false);

            var userLinks = await MicrosoftUserLinks.LoadAsync(ospoClient);

            var context    = new PolicyAnalysisContext(cachedOrg, userLinks);
            var violations = PolicyRunner.Run(context);

            SaveVioloations(orgName, outputFileName, isForExcel, violations);

            if (!string.IsNullOrEmpty(policyRepo))
            {
                await FilePolicyViolationsAsync(gitHubClient, orgName, policyRepo, violations);
            }
        }
Exemplo n.º 2
0
        private static async Task RunAsync(string orgName,
                                           List <string> repoNames,
                                           List <string> teamNames,
                                           List <string> userNames,
                                           string outputFileName,
                                           string cacheLocation)
        {
            Console.WriteLine("Loading org data...");
            var cachedOrg = await CachedOrg.LoadFromCacheAsync(orgName, cacheLocation);

            if (cachedOrg == null)
            {
                Console.Error.WriteLine("The org wasn't loaded yet or the cache isn't valid anymore.");
                return;
            }

            var repoFilter = CreateRepoFilter(cachedOrg, repoNames);
            var teamFilter = CreateTeamFilter(cachedOrg, teamNames);
            var userFilter = CreateUserFilter(cachedOrg, userNames);

            Console.WriteLine("Loading Microsoft links...");
            var ospoClient = await OspoClientFactory.CreateAsync();

            var links = await ospoClient.GetAllAsync();

            Console.WriteLine("Computing result...");

            var emailByUser   = new Dictionary <CachedUser, string>();
            var nameByUser    = new Dictionary <CachedUser, string>();
            var microsoftLink = links.ToDictionary(l => l.GitHubInfo.Login);

            foreach (var user in cachedOrg.Users)
            {
                emailByUser[user] = user.Email;
                nameByUser[user]  = user.Name;

                if (microsoftLink.TryGetValue(user.Login, out var link))
                {
                    if (!string.IsNullOrEmpty(link.MicrosoftInfo.EmailAddress))
                    {
                        emailByUser[user] = link.MicrosoftInfo.EmailAddress;
                    }

                    if (!string.IsNullOrEmpty(link.MicrosoftInfo.PreferredName))
                    {
                        nameByUser[user] = link.MicrosoftInfo.PreferredName;
                    }
                }
            }

            var isForExcel  = outputFileName == null;
            var csvDocument = new CsvDocument("team", "repo", "user", "user-name", "user-email", "is-microsoft", "change", "repo-admins");

            using (var writer = csvDocument.Append())
            {
                foreach (var userAccess in cachedOrg.Collaborators)
                {
                    var repo = userAccess.Repo;
                    var user = userAccess.User;

                    if (!repoFilter(repo) || !userFilter(user))
                    {
                        continue;
                    }

                    foreach (var team in cachedOrg.Teams)
                    {
                        if (!teamFilter(team))
                        {
                            continue;
                        }

                        var whatIfRemoved = userAccess.WhatIfRemovedFromTeam(team);
                        var change        = whatIfRemoved.ToString();

                        if (whatIfRemoved.IsUnchanged)
                        {
                            continue;
                        }

                        var isMicrosoft = microsoftLink.ContainsKey(user.Login) ? "Yes" : "No";
                        var repoAdmins  = repo.GetAdministrators()
                                          .Select(u => (Email: emailByUser[u], Name: nameByUser[u]))
                                          .Where(t => !string.IsNullOrEmpty(t.Email))
                                          .Select(t => $"{t.Name}<{t.Email}>");
                        var repoAdminList = string.Join("; ", repoAdmins);

                        writer.WriteHyperlink(team.Url, team.Name, isForExcel);
                        writer.WriteHyperlink(repo.Url, repo.Name, isForExcel);
                        writer.WriteHyperlink(user.Url, user.Login, isForExcel);
                        writer.Write(nameByUser[user]);
                        writer.Write(emailByUser[user]);
                        writer.Write(isMicrosoft);
                        writer.Write(change);
                        writer.Write(repoAdminList);
                        writer.WriteLine();
                    }
                }
            }

            if (outputFileName != null)
            {
                csvDocument.Save(outputFileName);
            }
            else
            {
                csvDocument.ViewInExcel();
            }
        }