Skip to main content

A Python client library for the GitHub Security Advisory (GHSA) API

Project description

GHSA Client

A Python client library for the GitHub Security Advisory (GHSA) API, providing structured access to security advisory data.

Features

  • Type-safe models: Full Pydantic models for GHSA data structures
  • Rate limiting: Built-in rate limit handling and retry logic
  • Flexible queries: Search advisories with various filters
  • Comprehensive data: Access to all GHSA fields including CVSS scores, CWE mappings, and package information

Installation

pip install ghsa-client

Quick Start

import logging
from ghsa_client import GHSAClient, GHSA_ID

# Set up logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# Create client
client = GHSAClient(logger)

# Get a specific advisory
ghsa_id = GHSA_ID("GHSA-gq96-8w38-hhj2")
advisory = client.get_advisory(ghsa_id)

print(f"Advisory: {advisory.summary}")
print(f"Severity: {advisory.severity}")
print(f"CVSS Score: {advisory.cvss.score if advisory.cvss else 'N/A'}")

Usage

Authentication

The client automatically uses the GITHUB_TOKEN environment variable if available:

export GITHUB_TOKEN=your_github_token_here

Getting an Advisory

from ghsa_client import GHSAClient, GHSA_ID

client = GHSAClient(logger)
advisory = client.get_advisory(GHSA_ID("GHSA-gq96-8w38-hhj2"))

# Access advisory properties
print(advisory.summary)
print(advisory.severity)
print(advisory.published_at)
print(advisory.vulnerabilities)

Searching Advisories

# Search by ecosystem
advisories = client.search_advisories(ecosystem="npm")

# Search by severity
advisories = client.search_advisories(severity="high")

# Search by date range
advisories = client.search_advisories(published="2024-01-01..2024-12-31")

# Get all advisories for a year
advisories = client.get_all_advisories_for_year(2024)

Rate Limiting

The client automatically handles GitHub's rate limits:

# Check remaining rate limit
rate_limit = client.get_ratelimit_remaining()
print(f"Remaining requests: {rate_limit['resources']['core']['remaining']}")

# The client will automatically wait for rate limit reset when needed

Models

Advisory

The main model representing a GitHub Security Advisory:

from ghsa_client import Advisory

advisory: Advisory = client.get_advisory(ghsa_id)

# Core properties
advisory.ghsa_id          # GHSA_ID object
advisory.cve_id           # Optional CVE_ID object
advisory.summary          # str
advisory.severity         # str
advisory.published_at     # str (ISO date)
advisory.description      # Optional[str]

# Vulnerability data
advisory.vulnerabilities  # List[Vulnerability]
advisory.affected_packages # List[Package] (computed property)

# CVSS data
advisory.cvss             # Optional[CVSS]
advisory.cwes             # Optional[List[str]]

# Repository information
advisory.source_code_location # Optional[str]
advisory.repository_url   # str (property, raises if not found)

# References
advisory.references       # List[str]

GHSA_ID

Type-safe GHSA identifier with validation:

from ghsa_client import GHSA_ID, InvalidGHSAIDError

try:
    ghsa_id = GHSA_ID("GHSA-gq96-8w38-hhj2")
    print(ghsa_id.id)  # "GHSA-gq96-8w38-hhj2"
except InvalidGHSAIDError as e:
    print(f"Invalid GHSA ID: {e}")

CVE_ID

Type-safe CVE identifier with validation:

from ghsa_client import CVE_ID

cve_id = CVE_ID("CVE-2024-12345")
print(cve_id.id)  # "CVE-2024-12345"

Error Handling

The client raises specific exceptions for different error conditions:

from ghsa_client import RateLimitExceeded, GHSAClient
import requests

try:
    advisory = client.get_advisory(ghsa_id)
except requests.HTTPError as e:
    if e.response.status_code == 404:
        print("Advisory not found")
    else:
        print(f"HTTP error: {e}")
except RateLimitExceeded as e:
    print(f"Rate limit exceeded: {e}")
except requests.RequestException as e:
    print(f"Network error: {e}")

Development

Setup

git clone https://github.com/valmarelox/ghsa-client.git
cd ghsa-client
pip install -e ".[dev]"

Running Tests

pytest

Code Formatting

black .
isort .

Type Checking

mypy src/ghsa_client

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome! Please open an issue or pull request on GitHub.

Changelog

See the releases page for a history of changes.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ghsa_client-1.6.0.tar.gz (18.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ghsa_client-1.6.0-py3-none-any.whl (18.0 kB view details)

Uploaded Python 3

File details

Details for the file ghsa_client-1.6.0.tar.gz.

File metadata

  • Download URL: ghsa_client-1.6.0.tar.gz
  • Upload date:
  • Size: 18.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ghsa_client-1.6.0.tar.gz
Algorithm Hash digest
SHA256 74beb7a508df08a04da4e24b4b90d20b2d64812011eb1d934d36d7e8299f7f7d
MD5 e51873a20a90a9501004b85d5127a83a
BLAKE2b-256 bb89d47cc8d989579b72b0c9f12a9b91da2ee5fc2ec038deb757c844ee36faf9

See more details on using hashes here.

Provenance

The following attestation bundles were made for ghsa_client-1.6.0.tar.gz:

Publisher: publish.yml on Valmarelox/ghsa-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ghsa_client-1.6.0-py3-none-any.whl.

File metadata

  • Download URL: ghsa_client-1.6.0-py3-none-any.whl
  • Upload date:
  • Size: 18.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ghsa_client-1.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0fb8eeb181274c74ffdbde797e1a7f2ea2036f93d0ea93ac947b75ae0c699cb0
MD5 f215eea4524681388da8e88280a9fa5e
BLAKE2b-256 887911562c6fa3cac8718b503276b9da735484782bc19073a244352bd99b3f67

See more details on using hashes here.

Provenance

The following attestation bundles were made for ghsa_client-1.6.0-py3-none-any.whl:

Publisher: publish.yml on Valmarelox/ghsa-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page