Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/daily-update.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
private-key: ${{ secrets.CLOUDCHECK_APP_PRIVATE_KEY }}

- name: Checkout stable branch
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
ref: stable
token: ${{ steps.app-token.outputs.token }}
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/docker-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: Set up Python
uses: actions/setup-python@v6
Expand All @@ -39,7 +39,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
Expand All @@ -61,8 +61,8 @@ jobs:
type=sha,prefix=sha-
type=raw,value=latest,enable={{is_default_branch}}
type=raw,value=v11
type=raw,value=v11.0
type=raw,value=v11.0.0
type=raw,value=v11.1
type=raw,value=v11.1.0

- name: Build and push Docker image
uses: docker/build-push-action@v7
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pipeline-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: Set up Python
uses: actions/setup-python@v6
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/python-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: Set up Python
uses: actions/setup-python@v6
Expand Down Expand Up @@ -56,7 +56,7 @@ jobs:
with:
app-id: ${{ secrets.CLOUDCHECK_APP_ID }}
private-key: ${{ secrets.CLOUDCHECK_APP_PRIVATE_KEY }}
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0
token: ${{ steps.app-token.outputs.token }}
Expand Down Expand Up @@ -116,7 +116,7 @@ jobs:
- runner: ubuntu-22.04
target: ppc64le
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: 3.x
Expand Down Expand Up @@ -162,7 +162,7 @@ jobs:
- runner: ubuntu-22.04
target: armv7
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: 3.x
Expand Down Expand Up @@ -208,7 +208,7 @@ jobs:
- runner: windows-latest
target: x86
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: 3.x
Expand Down Expand Up @@ -237,7 +237,7 @@ jobs:
- runner: macos-latest
target: aarch64
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: 3.x
Expand All @@ -258,7 +258,7 @@ jobs:
needs: publish
if: github.event_name == 'push' && github.ref == 'refs/heads/stable'
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/rust-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
Expand Down Expand Up @@ -45,7 +45,7 @@ jobs:
if: github.event_name == 'push' && github.ref == 'refs/heads/stable'

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "cloudcheck"
version = "11.0.0"
version = "11.1.0"
edition = "2024"
description = "CloudCheck is a simple Rust tool to check whether an IP address or hostname belongs to a cloud provider."
license = "GPL-3.0"
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "cloudcheck"
version = "11.0.0"
version = "11.1.0"
description = "Detailed database of cloud providers. Instantly look up a domain or IP address"
readme = "README.md"
requires-python = ">=3.10"
Expand Down
35 changes: 31 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ pub struct CloudCheck {
max_retries: u32,
retry_delay_seconds: u64,
force_refresh: bool,
verify_ssl: bool,
}

impl Default for CloudCheck {
Expand All @@ -57,14 +58,15 @@ impl Default for CloudCheck {

impl CloudCheck {
pub fn new() -> Self {
Self::with_config(None, None, None, None)
Self::with_config(None, None, None, None, None)
}

pub fn with_config(
signature_url: Option<String>,
max_retries: Option<u32>,
retry_delay_seconds: Option<u64>,
force_refresh: Option<bool>,
verify_ssl: Option<bool>,
) -> Self {
let url = signature_url
.or_else(|| std::env::var("CLOUDCHECK_SIGNATURE_URL").ok())
Expand All @@ -78,6 +80,7 @@ impl CloudCheck {
max_retries: max_retries.unwrap_or(10),
retry_delay_seconds: retry_delay_seconds.unwrap_or(1),
force_refresh: force_refresh.unwrap_or(false),
verify_ssl: verify_ssl.unwrap_or(true),
}
}

Expand All @@ -95,17 +98,28 @@ impl CloudCheck {
let max_retries = self.max_retries;
let retry_delay_seconds = self.retry_delay_seconds;
log::info!(
"Fetching data from URL: {} (max_retries={}, retry_delay={}s)",
"Fetching data from URL: {} (max_retries={}, retry_delay={}s, verify_ssl={})",
url,
max_retries,
retry_delay_seconds
retry_delay_seconds,
self.verify_ssl
);

if !self.verify_ssl {
log::warn!(
"SSL certificate verification is DISABLED for cloud provider signature fetch"
);
}
let client = reqwest::Client::builder()
.danger_accept_invalid_certs(!self.verify_ssl)
.build()
.map_err(|e| Box::new(e) as Error)?;

let mut last_error = None;

for attempt in 0..=max_retries {
log::info!("Fetch attempt {}/{}", attempt + 1, max_retries + 1);
let result = match reqwest::get(url).await {
let result = match client.get(url).send().await {
Ok(response) => {
let status = response.status();
log::info!(
Expand Down Expand Up @@ -479,6 +493,19 @@ mod tests {
);
}

#[tokio::test]
async fn test_lookup_with_ssl_verification_disabled() {
// verify_ssl=false should still succeed against a host with a valid cert
let cloudcheck = CloudCheck::with_config(None, None, None, Some(true), Some(false));
let results = cloudcheck.lookup("8.8.8.8").await.unwrap();
let names: Vec<String> = results.iter().map(|p| p.name.clone()).collect();
assert!(
names.contains(&"Google".to_string()),
"Expected Google in results: {:?}",
names
);
}

#[tokio::test]
async fn test_lookup_windows_blob_domain() {
let cloudcheck = CloudCheck::new();
Expand Down
4 changes: 3 additions & 1 deletion src/python.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,21 @@ pub struct CloudCheck {
#[pymethods]
impl CloudCheck {
#[new]
#[pyo3(signature = (signature_url=None, max_retries=None, retry_delay_seconds=None, force_refresh=None))]
#[pyo3(signature = (signature_url=None, max_retries=None, retry_delay_seconds=None, force_refresh=None, verify_ssl=None))]
fn new(
signature_url: Option<String>,
max_retries: Option<u32>,
retry_delay_seconds: Option<u64>,
force_refresh: Option<bool>,
verify_ssl: Option<bool>,
) -> Self {
CloudCheck {
inner: RustCloudCheck::with_config(
signature_url,
max_retries,
retry_delay_seconds,
force_refresh,
verify_ssl,
),
}
}
Expand Down
9 changes: 9 additions & 0 deletions test_cloudcheck.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ async def test_lookup_amazon_domain():
assert "Amazon" in names, f"Expected Amazon in results: {names}"


@pytest.mark.asyncio
async def test_lookup_with_ssl_verification_disabled():
"""verify_ssl=False should still succeed against a host with a valid cert"""
cloudcheck = CloudCheck(verify_ssl=False)
results = await cloudcheck.lookup("8.8.8.8")
names = [provider["name"] for provider in results]
assert "Google" in names, f"Expected Google in results: {names}"


@pytest.mark.asyncio
async def test_lookup_with_invalid_url():
"""Test that lookup raises RuntimeError with proper message when URL is invalid"""
Expand Down
Loading
Loading