from typing import *
from pathlib import Path
import json
from dateutil.relativedelta import relativedelta
from datetime import datetime
import base64
from autoslot import Slots
import httpx
from ghunt.errors import GHuntInvalidSession
class SmartObj():
pass
class AndroidCreds(SmartObj):
def __init__(self) -> None:
self.master_token: str = ""
self.authorization_tokens: Dict = {}
class GHuntCreds(SmartObj):
"""
This object stores all the needed credentials that GHunt uses,
such as cookies, OSIDs, keys and tokens.
"""
def __init__(self, creds_path: str = "") -> None:
self.cookies: Dict[str, str] = {}
self.osids: Dict[str, str] = {}
self.android: AndroidCreds = AndroidCreds()
if not creds_path:
cwd_path = Path().home()
ghunt_folder = cwd_path / ".malfrats/ghunt"
if not ghunt_folder.is_dir():
ghunt_folder.mkdir(parents=True, exist_ok=True)
creds_path = ghunt_folder / "creds.m"
self.creds_path: str = creds_path
def are_creds_loaded(self) -> bool:
return all([self.cookies, self.osids, self.android.master_token])
def load_creds(self, silent=False) -> None:
"""Loads cookies, OSIDs and tokens if they exist"""
if Path(self.creds_path).is_file():
try:
with open(self.creds_path, "r", encoding="utf-8") as f:
raw = f.read()
data = json.loads(base64.b64decode(raw).decode())
self.cookies = data["cookies"]
self.osids = data["osids"]
self.android.master_token = data["android"]["master_token"]
self.android.authorization_tokens = data["android"]["authorization_tokens"]
except Exception:
raise GHuntInvalidSession("Stored session is corrupted.")
else:
raise GHuntInvalidSession("No stored session found.")
if not self.are_creds_loaded():
raise GHuntInvalidSession("Stored session is incomplete.")
if not silent:
print("[+] Stored session loaded !")
def save_creds(self, silent=False):
"""Save cookies, OSIDs and tokens to the specified file."""
data = {
"cookies": self.cookies,
"osids": self.osids,
"android": {
"master_token": self.android.master_token,
"authorization_tokens": self.android.authorization_tokens
}
}
with open(self.creds_path, "w", encoding="utf-8") as f:
f.write(base64.b64encode(json.dumps(data, indent=2).encode()).decode())
if not silent:
print(f"\n[+] Creds have been saved in {self.creds_path} !")
class Position(SmartObj):
def __init__(self):
self.latitude: float = 0.0
self.longitude: float = 0.0
class MapsLocation(SmartObj):
def __init__(self):
self.id: str = ""
self.name: str = ""
self.address: str = ""
self.position: Position = Position()
self.tags: List[str] = []
self.types: List[str] = []
self.cost_level: int = 0
class MapsReview(SmartObj):
def __init__(self):
self.id: str = ""
self.comment: str = ""
self.rating: int = 0
self.location: MapsLocation = MapsLocation()
self.date: datetime = None
class MapsPhoto(SmartObj):
def __init__(self):
self.id: str = ""
self.url: str = ""
self.location: MapsLocation = MapsLocation()
self.date: datetime = None
class DriveExtractedUser(SmartObj):
def __init__(self):
self.gaia_id: str = ""
self.name: str = ""
self.email_address: str = ""
self.role: str = ""
self.is_last_modifying_user: bool = False