diff --git a/README.md b/README.md index 43e5803..da4a9fb 100644 --- a/README.md +++ b/README.md @@ -81,5 +81,5 @@ python github_searcher.py --query QUERY --search_type SEARCH_TYPE [--get_file_co 6. Use Docker Compose to search for a specific CVE-ID and output results to a file: ```sh - docker-compose run --rm app python3 /usr/src/app/github_searcher.py --query=CVE-2024-5932 --search_type=in-repo-name --get_open_issues --get_open_pull_requests --get_file_contents --json > cve-2024-5932 + docker-compose run --rm github_searcher python3 /usr/src/app/github_searcher.py --query=CVE-2024-5932 --search_type=in-repo-name --get_open_issues --get_open_pull_requests --get_file_contents --json > cve-2024-5932 ``` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 19d2003..f27e41b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ services: - app: + github_searcher: build: . env_file: ".env" diff --git a/github_searcher.py b/github_searcher.py index ecb77e9..4ece5dc 100644 --- a/github_searcher.py +++ b/github_searcher.py @@ -15,6 +15,43 @@ def auth(): g = Github(auth=auth) return g +""" +This class is used to search GitHub repositories to gather information about repos and users. +- search_repo: Search for repositories based on the query. +- search_users: Search for users based on the query. +- search_in_repo_name: Search for repositories based on the query in the repository name. +- search_by_repo_name: Search for repositories based on the query in the repository name. +- get_repo_open_issues: Get the open issues of a repository. +- get_repo_stars: Get the number of stars of a repository. +- get_repo_open_pull_requests: Get the open pull requests of a repository. +- get_repo_contents: Get the contents of a repository. +- get_result: Get the search result. +- query: The search query. +- result: The search result. +- g: The GitHub object. + +Example usage: +# Searching for a CVE-ID in repositories: +searcher = GithubSearcher("CVE-2021-1234") # Initialize the searcher with the query +searcher.search_repo() # Search for repositories based on the query. This would search github for repositories with the query "CVE-2021-1234" +result = searcher.get_result() # Get the search result + +# Searching for a specific repo by name: +searcher = GithubSearcher("php/php-src") # Initialize the searcher with the query +searcher.search_by_repo_name() # Search for repositories based on the query in the repository name. This would search github for the repository "php/php-src" +result = searcher.get_result() # Get the search result + +# Getting open issues of a repository: +repo = result[0] # Get the first repository from the search result +open_issues = searcher.get_repo_open_issues(repo) # Get the open issues of the repository +for issue in open_issues: + print(issue.title) # Print the title of the issue + +# Getting the number of stars of a repository: +repo = result[0] # Get the first repository from the search result +stars = searcher.get_repo_stars(repo) # Get the number of stars of the repository + +""" class GithubSearcher(): def __init__(self, query): self.g = auth() @@ -42,6 +79,13 @@ class GithubSearcher(): logging.error(f"Error searching in name: {e}") self.result = None + def search_by_repo_name(self): + try: + self.result = self.g.search_repositories(f'repo:{self.query}') + except GithubException as e: + logging.error(f"Error searching by repo name: {e}") + self.result = None + def get_repo_open_issues(self, repo): try: return repo.get_issues(state='open') @@ -49,6 +93,13 @@ class GithubSearcher(): logging.error(f"Error getting open issues: {e}") return None + def get_repo_stars(self, repo): + try: + return repo.stargazers_count + except GithubException as e: + logging.error(f"Error getting stars: {e}") + return None + def get_repo_open_pull_requests(self, repo): try: return repo.get_pulls(state='open') @@ -69,7 +120,7 @@ class GithubSearcher(): def main(): parser = argparse.ArgumentParser(description="Search GitHub repositories and users for PoC exploits and CVEs.") parser.add_argument("--query", type=str, required=True, help="The search query.") - parser.add_argument("--search_type", type=str, required=True, choices=["repo", "users", "in-repo-name"], help="The type of search to perform: 'repo', 'users', or 'in-repo-name'.") + parser.add_argument("--search_type", type=str, required=True, choices=["repo", "users", "in-repo-name", "by-repo-name"], help="The type of search to perform: 'repo', 'users', 'in-repo-name', or 'by-repo-name'.") parser.add_argument("--get_file_contents", action="store_true", help="Get the contents of repo results.") parser.add_argument("--get_open_issues", action="store_true", help="Get the open issues of repo results.") parser.add_argument("--get_open_pull_requests", action="store_true", help="Get the open pull requests of repo results.") @@ -85,6 +136,8 @@ def main(): searcher.search_users() elif args.search_type == "in-repo-name": searcher.search_in_repo_name() + elif args.search_type == "by-repo-name": + searcher.search_by_repo_name() result = searcher.get_result() if result is None: @@ -106,10 +159,12 @@ def main(): open_issues = searcher.get_repo_open_issues(item) if open_issues: repo_info["open_issues"] = [{"title": issue.title, "url": issue.html_url} for issue in open_issues] + repo_info['total_open_issues'] = item.open_issues_count if args.get_open_pull_requests: open_prs = searcher.get_repo_open_pull_requests(item) if open_prs: repo_info["open_pull_requests"] = [{"title": pr.title, "url": pr.html_url} for pr in open_prs] + repo_info["total_open_pull_requests"] = item.open_pulls_count if args.get_file_contents: contents = searcher.get_repo_contents(item) if contents: