mirror of
https://github.com/malmeloo/FindMy.py.git
synced 2026-04-18 04:53:57 +02:00
104 lines
2.2 KiB
Python
104 lines
2.2 KiB
Python
from abc import ABC, abstractmethod
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
from typing import Sequence
|
|
|
|
from .keys import KeyPair
|
|
|
|
|
|
class LoginState(Enum):
|
|
LOGGED_OUT = 0
|
|
REQUIRE_2FA = 1
|
|
AUTHENTICATED = 2
|
|
LOGGED_IN = 3
|
|
|
|
def __lt__(self, other):
|
|
if isinstance(other, LoginState):
|
|
return self.value < other.value
|
|
|
|
return NotImplemented
|
|
|
|
def __repr__(self):
|
|
return self.__str__()
|
|
|
|
|
|
class BaseSecondFactorMethod(ABC):
|
|
def __init__(self, account: "BaseAppleAccount"):
|
|
self._account = account
|
|
|
|
@property
|
|
def account(self):
|
|
return self._account
|
|
|
|
@abstractmethod
|
|
def request(self) -> None:
|
|
raise NotImplementedError()
|
|
|
|
@abstractmethod
|
|
def submit(self, code: str) -> LoginState:
|
|
raise NotImplementedError()
|
|
|
|
|
|
class BaseAppleAccount(ABC):
|
|
@property
|
|
@abstractmethod
|
|
def login_state(self):
|
|
return NotImplemented
|
|
|
|
@property
|
|
@abstractmethod
|
|
def account_name(self):
|
|
return NotImplemented
|
|
|
|
@property
|
|
@abstractmethod
|
|
def first_name(self):
|
|
return NotImplemented
|
|
|
|
@property
|
|
@abstractmethod
|
|
def last_name(self):
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def export(self) -> dict:
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def restore(self, data: dict):
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def login(self, username: str, password: str) -> LoginState:
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def get_2fa_methods(self) -> list[BaseSecondFactorMethod]:
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def sms_2fa_request(self, phone_number_id: int):
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def sms_2fa_submit(self, phone_number_id: int, code: str) -> LoginState:
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def fetch_reports(
|
|
self, keys: Sequence[KeyPair], date_from: datetime, date_to: datetime
|
|
):
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def fetch_last_reports(
|
|
self,
|
|
keys: Sequence[KeyPair],
|
|
hours: int = 7 * 24,
|
|
):
|
|
return NotImplemented
|
|
|
|
@abstractmethod
|
|
def get_anisette_headers(self, serial: str = "0") -> dict[str, str]:
|
|
return NotImplemented
|