use std::collections::HashMap;
use serde::Deserialize;
#[derive(Deserialize, Debug)]
#[serde(untagged)]
pub enum ShodanClientResponse<T> {
Error(ErrorResponse),
Response(T),
}
#[derive(Deserialize, Debug)]
pub struct ErrorResponse {
pub error: String,
}
#[derive(Deserialize, Debug)]
pub struct AccountProfileResponse {
pub member: bool,
pub credits: u32,
pub display_name: Option<String>,
pub created: String,
}
#[derive(Deserialize, Debug)]
pub struct ApiInfoResponse {
pub scan_credits: u32,
pub usage_limits: ApiInfoResponseUsageLimits,
pub plan: String,
pub https: bool,
pub unlocked: bool,
pub query_credits: u32,
pub monitored_ips: Option<u32>,
pub unlocked_left: u32,
pub telnet: bool,
}
#[derive(Deserialize, Debug)]
pub struct ApiInfoResponseUsageLimits {
pub scan_credits: i32,
pub query_credits: i32,
pub monitored_ips: i32,
}
#[derive(Deserialize, Debug)]
pub struct DirectoryQueryResponse {
pub matches: Vec<DirectoryQueryResponseMatch>,
pub total: u32,
}
#[derive(Deserialize, Debug)]
pub struct DirectoryQueryResponseMatch {
pub votes: u32,
pub description: String,
pub tags: Vec<String>,
pub timestamp: String,
pub title: String,
pub query: String,
}
#[derive(Deserialize, Debug)]
pub struct DirectoryQueryTagsResponse {
pub matches: Vec<DirectoryQueryTagsResponseMatch>,
pub total: u32,
}
#[derive(Deserialize, Debug)]
pub struct DirectoryQueryTagsResponseMatch {
pub count: u32,
pub value: String,
}
#[derive(Deserialize, Debug)]
pub struct DnsDomainResponse {
pub domain: String,
pub tags: Vec<String>,
pub data: Vec<DnsDomainDataItem>,
pub subdomains: Vec<String>,
pub more: bool,
}
#[derive(Deserialize, Debug)]
pub struct DnsDomainDataItem {
pub subdomain: String,
#[serde(rename(deserialize = "type"))]
pub item_type: String, pub value: String,
pub last_seen: String,
}
#[derive(Deserialize, Debug)]
pub struct SearchHostIpResponse {
pub last_update: String,
pub ip: u32,
pub ip_str: String,
pub ports: Vec<u16>,
pub isp: Option<String>,
pub asn: Option<String>,
pub os: Option<String>,
pub domains: Vec<String>,
pub hostnames: Vec<String>,
pub org: Option<String>,
pub latitude: Option<f64>,
pub longitude: Option<f64>,
pub country_code: Option<String>,
pub country_code_3: Option<String>,
pub country_name: Option<String>,
pub region_code: Option<String>,
pub postal_code: Option<String>,
pub city: Option<String>,
pub dma_code: Option<u32>,
pub tags: Vec<String>,
pub area_code: Option<String>,
}
#[derive(Deserialize, Debug)]
pub struct CountResponse {
pub total: u32,
pub facets: Option<HashMap<String, Vec<Facet>>>,
}
#[derive(Deserialize, Debug)]
pub struct TokenResponse {
pub attributes: HashMap<String, Vec<i32>>,
pub errors: Vec<String>,
pub string: String,
pub filters: Vec<String>,
}
#[derive(Deserialize, Debug)]
pub struct Facet {
pub count: u32,
pub value: String,
}
#[derive(Debug, Deserialize)]
pub struct SearchResult {
pub matches: Vec<SearchResultMatch>,
pub total: i64,
pub facets: Option<HashMap<String, Vec<Facet>>>,
}
#[derive(Debug, Deserialize)]
pub struct SearchResultMatch {
pub hash: i64,
pub asn: Option<String>,
pub http: Option<Http>,
pub os: Option<String>,
pub tags: Option<Vec<String>>,
pub timestamp: String,
pub isp: Option<String>,
pub transport: String,
#[serde(rename = "_shodan")]
pub shodan: Shodan,
pub ssl: Option<Ssl>,
pub cloud: Option<Cloud>,
pub hostnames: Vec<String>,
pub location: LocationClass,
pub ip: Option<i64>,
pub domains: Vec<String>,
pub org: Option<String>,
pub data: String,
pub port: i64,
pub ip_str: String,
pub product: Option<String>,
pub cpe23: Option<Vec<String>>,
pub cpe: Option<Vec<String>>,
pub version: Option<String>,
pub mysql: Option<Mysql>,
pub info: Option<String>,
pub vulns: Option<HashMap<String, Vuln>>,
pub ipv6: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct Cloud {
pub region: Option<String>,
pub service: Option<String>,
pub provider: String,
}
#[derive(Debug, Deserialize)]
pub struct Http {
pub status: i64,
pub robots_hash: Option<i64>,
pub redirects: Vec<Redirect>,
pub securitytxt: Option<String>,
pub title: Option<String>,
pub sitemap_hash: Option<i64>,
pub robots: Option<String>,
pub server: Option<String>,
pub headers_hash: i64,
pub host: String,
pub html: String,
pub location: String,
pub components: Option<HashMap<String, Component>>,
pub html_hash: i64,
pub sitemap: Option<String>,
pub securitytxt_hash: Option<i64>,
pub favicon: Option<Favicon>,
pub waf: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct Component {
pub categories: Vec<String>,
}
#[derive(Debug, Deserialize)]
pub struct Favicon {
pub hash: i64,
pub data: String,
pub location: String,
}
#[derive(Debug, Deserialize)]
pub struct Redirect {
pub host: String,
pub data: String,
pub location: String,
pub html: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct LocationClass {
pub city: String,
pub region_code: String,
pub area_code: Option<String>,
pub longitude: f64,
pub latitude: f64,
pub country_code: String,
pub country_name: String,
}
#[derive(Debug, Deserialize)]
pub struct Mysql {
pub authentication_plugin: String,
pub capabilities: i64,
pub server_status: String,
pub thread_id: i64,
pub version: String,
pub extended_server_capabilities: i64,
pub protocol_version: i64,
pub server_language: i64,
}
#[derive(Debug, Deserialize)]
pub struct Shodan {
pub region: String,
pub ptr: Option<bool>,
pub module: String,
pub id: String,
pub options: HashMap<String, String>,
pub crawler: String,
}
#[derive(Debug, Deserialize)]
pub struct Ssl {
pub chain_sha256: Vec<String>,
pub jarm: String,
pub chain: Vec<String>,
pub dhparams: Option<Dhparams>,
pub versions: Vec<String>,
pub tlsext: Vec<Tlsext>,
#[serde(rename = "ja3s")]
pub ja3_s: String,
pub cert: Cert,
pub cipher: Cipher,
pub trust: Trust,
pub handshake_states: Vec<String>,
pub alpn: Vec<String>,
pub ocsp: Ocsp,
}
#[derive(Debug, Deserialize)]
pub struct Cert {
pub sig_alg: String,
pub issued: String,
pub expires: String,
pub expired: bool,
pub version: i64,
pub extensions: Vec<Extension>,
pub fingerprint: Fingerprint,
pub serial: f64,
pub subject: Issuer,
pub pubkey: Pubkey,
pub issuer: Issuer,
}
#[derive(Debug, Deserialize)]
pub struct Extension {
pub critical: Option<bool>,
pub data: String,
pub name: String,
}
#[derive(Debug, Deserialize)]
pub struct Fingerprint {
pub sha256: String,
pub sha1: String,
}
#[derive(Debug, Deserialize)]
pub struct Issuer {
#[serde(rename = "C")]
pub c: Option<String>,
#[serde(rename = "CN")]
pub cn: Option<String>,
#[serde(rename = "O")]
pub o: Option<String>,
#[serde(rename = "L")]
pub l: Option<String>,
#[serde(rename = "ST")]
pub st: Option<String>,
#[serde(rename = "OU")]
pub ou: Option<String>,
#[serde(rename = "emailAddress")]
pub email_address: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct Pubkey {
#[serde(rename = "type")]
pub pubkey_type: String,
pub bits: i64,
}
#[derive(Debug, Deserialize)]
pub struct Cipher {
pub version: String,
pub bits: i64,
pub name: String,
}
#[derive(Debug, Deserialize)]
pub struct Dhparams {
pub prime: String,
pub public_key: String,
pub bits: i64,
pub generator: i64,
pub fingerprint: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct Ocsp {
pub version: Option<String>,
pub response_status: Option<String>,
pub responder_id: Option<String>,
pub cert_status: Option<String>,
pub produced_at: Option<String>,
pub signature_algorithm: Option<String>,
pub next_update: Option<String>,
pub this_update: Option<String>,
pub certificate_id: Option<CertificateId>,
}
#[derive(Debug, Deserialize)]
pub struct CertificateId {
pub hash_algorithm: String,
pub issuer_name_hash: String,
pub issuer_name_key: String,
pub serial_number: String,
}
#[derive(Debug, Deserialize)]
pub struct Tlsext {
pub id: i64,
pub name: String,
}
#[derive(Debug, Deserialize)]
pub struct Trust {
pub revoked: bool,
pub browser: Option<Browser>,
}
#[derive(Debug, Deserialize)]
pub struct Browser {
pub mozilla: bool,
pub apple: bool,
pub microsoft: bool,
}
#[derive(Debug, Deserialize)]
pub struct Vuln {
pub verified: bool,
pub references: Vec<String>,
pub cvss: Option<f64>,
pub summary: String,
}