Beispiel #1
0
        public async Task FindSource(PackageURL purl)
        {
            var purlNoVersion = new PackageURL(purl.Type, purl.Namespace, purl.Name,
                                               null, purl.Qualifiers, purl.Subpath);

            Logger.Debug("Searching for source code for {0}", purlNoVersion.ToString());

            // Use reflection to find the correct downloader class
            var projectManagerClass = typeof(BaseProjectManager).Assembly.GetTypes()
                                      .Where(type => type.IsSubclassOf(typeof(BaseProjectManager)))
                                      .Where(type => type.Name.Equals($"{purl.Type}ProjectManager",
                                                                      StringComparison.InvariantCultureIgnoreCase))
                                      .FirstOrDefault();

            if (projectManagerClass != null)
            {
                var ctor           = projectManagerClass.GetConstructor(Array.Empty <Type>());
                var projectManager = (BaseProjectManager)(ctor.Invoke(Array.Empty <object>()));
                var content        = await projectManager.GetMetadata(purlNoVersion);

                foreach (var githubPurl in BaseProjectManager.ExtractGitHubPackageURLs(content))
                {
                    var githubUrl = $"https://github.com/{githubPurl.Namespace}/{githubPurl.Name}";
                    Logger.Info("Found: {0} ({1})", githubPurl.ToString(), githubUrl);
                }
            }
            else
            {
                throw new ArgumentException("Invalid Package URL type: {0}", purlNoVersion.Type);
            }
        }
Beispiel #2
0
        public async Task <HealthMetrics> CheckHealth(PackageURL purl)
        {
            // Use reflection to find the correct package management class
            var projectManagerClass = typeof(BaseProjectManager).Assembly.GetTypes()
                                      .Where(type => type.IsSubclassOf(typeof(BaseProjectManager)))
                                      .Where(type => type.Name.Equals($"{purl.Type}ProjectManager",
                                                                      StringComparison.InvariantCultureIgnoreCase))
                                      .FirstOrDefault();

            if (projectManagerClass != default)
            {
                var ctor           = projectManagerClass.GetConstructor(Array.Empty <Type>());
                var projectManager = (BaseProjectManager)(ctor.Invoke(Array.Empty <object>()));
                var content        = await projectManager.GetMetadata(purl);

                if (!string.IsNullOrWhiteSpace(content))
                {
                    foreach (var githubPurl in BaseProjectManager.ExtractGitHubPackageURLs(content))
                    {
                        try
                        {
                            var healthAlgorithm = new GitHubHealthAlgorithm(githubPurl);
                            var health          = await healthAlgorithm.GetHealth();

                            return(health);
                        }
                        catch (Exception ex)
                        {
                            Logger.Warn(ex, "Unable to calculate health for {0}: {1}", githubPurl, ex.Message);
                        }
                    }
                }
                else
                {
                    Logger.Warn("No metadata found for {0}", purl.ToString());
                }
            }
            else
            {
                throw new ArgumentException("Invalid Package URL type: {0}", purl.Type);
            }
            return(default);
Beispiel #3
0
        public async Task <IEnumerable <PackageURL> > FindSource(PackageURL purl)
        {
            var purlNoVersion = new PackageURL(purl.Type, purl.Namespace, purl.Name,
                                               null, purl.Qualifiers, purl.Subpath);

            Logger.Debug("Searching for source code for {0}", purlNoVersion.ToString());

            // Use reflection to find the correct downloader class
            var projectManagerClass = typeof(BaseProjectManager).Assembly.GetTypes()
                                      .Where(type => type.IsSubclassOf(typeof(BaseProjectManager)))
                                      .Where(type => type.Name.Equals($"{purl.Type}ProjectManager",
                                                                      StringComparison.InvariantCultureIgnoreCase))
                                      .FirstOrDefault();

            var sourceList = new List <PackageURL>();

            if (projectManagerClass != default)
            {
                var ctor           = projectManagerClass.GetConstructor(Array.Empty <Type>());
                var projectManager = (BaseProjectManager)(ctor.Invoke(Array.Empty <object>()));
                var content        = await projectManager.GetMetadata(purlNoVersion);

                if (!string.IsNullOrWhiteSpace(content))
                {
                    foreach (var githubPurl in BaseProjectManager.ExtractGitHubPackageURLs(content))
                    {
                        sourceList.Add(githubPurl);
                        Logger.Debug("Identified GitHub Source: {0})", githubPurl.ToString());
                    }
                }
                else
                {
                    Logger.Warn("No metadata found for {0}", purlNoVersion.ToString());
                }
            }
            else
            {
                throw new ArgumentException("Invalid Package URL type: {0}", purlNoVersion.Type);
            }
            return(sourceList);
        }