audit-labs/audit-tools

A collection of scripts, queries, and other goodies you can use in an audit.

clone: git clone https://gitbay.org/audit-labs/audit-tools.git

c9cd2f443a8b96d9f535d330ca5bc54fc1550281

signed_unknown_key

author: Christian Cleberg <156287552+ccleberg@users.noreply.github.com> · 2024-10-28T18:58:58Z
committer: <noreply@github.com>

add github API scripts
 github/github_admins.py  | 76 ++++++++++++++++++++++++++++++++++++++++++++++++
 github/github_commits.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 151 insertions(+)

diff --git a/github/github_admins.py b/github/github_admins.py
new file mode 100644
index 0000000..d737887
--- /dev/null
+++ b/github/github_admins.py
@@ -0,0 +1,76 @@
+"""
+Gather all members of a GitHub organization, all repos within that organization,
+and list each user's permission per repo.
+"""
+
+import requests
+
+GITHUB_TOKEN = 'your_personal_access_token'
+ORGANIZATION = 'your_organization'
+TIMEOUT = 30
+
+# Headers for authentication
+headers = {
+    'Authorization': f'token {GITHUB_TOKEN}',
+    'Accept': 'application/vnd.github.v3+json'
+}
+
+def get_org_members(org):
+    """
+    Get members of an organization
+    """
+    url = f'https://api.github.com/orgs/{org}/members'
+    response = requests.get(url, headers=headers, timeout=TIMEOUT)
+    response.raise_for_status()
+    return response.json()
+
+def get_org_repos(org):
+    """
+    Get repositories of an organization
+    """
+    url = f'https://api.github.com/orgs/{org}/repos'
+    response = requests.get(url, headers=headers, timeout=TIMEOUT)
+    response.raise_for_status()
+    return response.json()
+
+def get_repo_collaborators(org, repo):
+    """
+    Get collaborators of a repository with their permissions
+    """
+    url = f'https://api.github.com/repos/{org}/{repo}/collaborators'
+    response = requests.get(url, headers=headers, timeout=TIMEOUT)
+    response.raise_for_status()
+    return response.json()
+
+def get_user_permissions(org, repo, user):
+    """
+    Get a user's permissions for a repository
+    """
+    url = f'https://api.github.com/repos/{org}/{repo}/collaborators/{user}/permission'
+    response = requests.get(url, headers=headers, timeout=TIMEOUT)
+    response.raise_for_status()
+    return response.json()
+
+# Main script
+if __name__ == '__main__':
+    # Get organization members
+    members = get_org_members(ORGANIZATION)
+    print(f"Members of the organization '{ORGANIZATION}':")
+    for member in members:
+        print(f"- {member['login']}")
+
+    # Get organization repositories
+    repositories = get_org_repos(ORGANIZATION)
+    print(f"\nRepositories in the organization '{ORGANIZATION}':")
+    for repository in repositories:
+        print(f"- {repository['name']}")
+
+    # Get collaborators for each repository and their permissions
+    for repository in repositories:
+        repository_name = repository['name']
+        collaborators = get_repo_collaborators(ORGANIZATION, repository_name)
+        print(f"\nCollaborators for the repository '{repository_name}':")
+        for collaborator in collaborators:
+            user_login = collaborator['login']
+            permissions = get_user_permissions(ORGANIZATION, repository_name, user_login)
+            print(f"- {user_login}: {permissions['permission']}")
diff --git a/github/github_commits.py b/github/github_commits.py
new file mode 100644
index 0000000..f35d5d6
--- /dev/null
+++ b/github/github_commits.py
@@ -0,0 +1,75 @@
+"""
+Gather all commits from a specific branch of a repository in a GitHub organization.
+"""
+
+import requests
+
+GITHUB_TOKEN = 'your_personal_access_token'
+ORGANIZATION = 'your_organization'
+REPOSITORY = 'your_repository'
+BRANCH = 'your_branch'
+
+# Headers for authentication
+headers = {
+    'Authorization': f'token {GITHUB_TOKEN}',
+    'Accept': 'application/vnd.github.v3+json'
+}
+
+# Define a timeout value (in seconds)
+TIMEOUT = 10
+
+def get_commit_log(org, repo, branch):
+    """
+    Get the full commit log for a repository branch
+    """
+    commits = []
+    page = 1
+    while True:
+        url = (f'https://api.github.com/repos/{org}/{repo}/commits?sha={branch}'
+        f'&page={page}&per_page=100')
+        response = requests.get(url, headers=headers, timeout=TIMEOUT)
+        response.raise_for_status()
+        page_commits = response.json()
+        if not page_commits:
+            break
+        commits.extend(page_commits)
+        page += 1
+    return commits
+
+def get_commit_details(org, repo, sha):
+    """
+    Get detailed information for a specific commit
+    """
+    url = f'https://api.github.com/repos/{org}/{repo}/commits/{sha}'
+    response = requests.get(url, headers=headers, timeout=TIMEOUT)
+    response.raise_for_status()
+    return response.json()
+
+if __name__ == '__main__':
+    try:
+        # Get the full commit log for the specified branch
+        commit_log = get_commit_log(ORGANIZATION, REPOSITORY, BRANCH)
+        print(f"Total commits in the repository '{REPOSITORY}' on branch "
+              f"'{BRANCH}': {len(commit_log)}")
+
+        # Get detailed information for each commit
+        for commit in commit_log:
+            sha_hash = commit['sha']
+            commit_details = get_commit_details(ORGANIZATION, REPOSITORY,
+                                                sha_hash)
+            print(f"\nCommit SHA: {commit_details['sha']}")
+            print(f"Author: {commit_details['commit']['author']['name']} "
+                  f"<{commit_details['commit']['author']['email']}>")
+            print(f"Date: {commit_details['commit']['author']['date']}")
+            print(f"Message: {commit_details['commit']['message']}")
+            print(f"URL: {commit_details['html_url']}")
+            print("Files changed:")
+            for file in commit_details['files']:
+                print(f"  - {file['filename']} ({file['status']})")
+                print(f"    Additions: {file['additions']}, "
+                      f"Deletions: {file['deletions']}, "
+                      f"Changes: {file['changes']}")
+    except requests.exceptions.Timeout:
+        print("The request timed out")
+    except requests.exceptions.RequestException as e:
+        print(f"An error occurred: {e}")