mirror of
https://github.com/MattKeeley/Spoofy.git
synced 2026-02-03 05:23:24 +00:00
87 lines
2.9 KiB
Python
87 lines
2.9 KiB
Python
# modules/dkim.py
|
|
|
|
import requests
|
|
|
|
|
|
class DKIM:
|
|
def __init__(self, domain, dns_server=None, api_base_url=None):
|
|
self.domain = domain
|
|
self.dns_server = dns_server
|
|
self.api_base_url = "https://archive.prove.email/api"
|
|
self.dkim_record = self.get_dkim_record()
|
|
|
|
def get_dkim_record(self):
|
|
"""Returns the DKIM records for a given domain using the API."""
|
|
try:
|
|
base_url = self.api_base_url.rstrip('/')
|
|
url = f"{base_url}/key"
|
|
params = {"domain": self.domain}
|
|
headers = {"accept": "application/json"}
|
|
|
|
response = requests.get(url, params=params, headers=headers, timeout=10)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
return self.format_dkim_records(data)
|
|
elif response.status_code == 400:
|
|
return None
|
|
elif response.status_code == 429:
|
|
return None
|
|
elif response.status_code == 500:
|
|
return None
|
|
else:
|
|
return None
|
|
except requests.exceptions.RequestException:
|
|
return None
|
|
except (KeyError, ValueError, TypeError):
|
|
return None
|
|
|
|
def format_dkim_records(self, api_response):
|
|
"""Formats the API response into a readable string format."""
|
|
combined_txt_records = ""
|
|
|
|
if not isinstance(api_response, list):
|
|
return None
|
|
|
|
records_by_key = {}
|
|
for record in api_response:
|
|
if not isinstance(record, dict):
|
|
continue
|
|
|
|
selector = record.get("selector", "unknown")
|
|
domain = record.get("domain", self.domain)
|
|
value = record.get("value", "")
|
|
last_seen = record.get("lastSeenAt", "")
|
|
|
|
key = f"{selector}._domainkey.{domain}"
|
|
|
|
if key not in records_by_key:
|
|
records_by_key[key] = record
|
|
else:
|
|
existing_last_seen = records_by_key[key].get("lastSeenAt", "")
|
|
if last_seen > existing_last_seen:
|
|
records_by_key[key] = record
|
|
|
|
for key, record in records_by_key.items():
|
|
selector = record.get("selector", "unknown")
|
|
domain = record.get("domain", self.domain)
|
|
value = record.get("value", "")
|
|
|
|
if len(value) > 128:
|
|
trimmed_value = value[:128] + "...(trimmed)"
|
|
else:
|
|
trimmed_value = value
|
|
|
|
combined_txt_records += (
|
|
f"[*] {selector}._domainkey.{domain} -> {trimmed_value}\r\n"
|
|
)
|
|
|
|
if combined_txt_records:
|
|
return combined_txt_records.strip()
|
|
else:
|
|
return None
|
|
|
|
def __str__(self):
|
|
return f"DKIM Record: {self.dkim_record}"
|
|
|