findmy.reports.anisette ======================= .. py:module:: findmy.reports.anisette .. autoapi-nested-parse:: Module for Anisette header providers. Classes ------- .. autoapisummary:: findmy.reports.anisette.BaseAnisetteProvider findmy.reports.anisette.RemoteAnisetteProvider findmy.reports.anisette.LocalAnisetteProvider Module Contents --------------- .. py:class:: BaseAnisetteProvider(loop: asyncio.AbstractEventLoop | None = None) Bases: :py:obj:`findmy.util.closable.Closable`, :py:obj:`abc.ABC` Abstract base class for Anisette providers. Generously derived from https://github.com/nythepegasus/grandslam/blob/main/src/grandslam/gsa.py#L41. .. py:property:: otp :type: str :abstractmethod: A seemingly random base64 string containing 28 bytes. TODO: Figure out how to generate this. .. py:property:: machine :type: str :abstractmethod: A base64 encoded string of 60 'random' bytes. We're not sure how this is generated, we have to rely on the server. TODO: Figure out how to generate this. .. py:property:: timestamp :type: str Current timestamp in ISO 8601 format. .. py:property:: timezone :type: str Abbreviation of the timezone of the device. .. py:property:: locale :type: str Locale of the device (e.g. en_US). .. py:property:: router :type: str A number, either 17106176 or 50660608. It doesn't seem to matter which one we use. - 17106176 is used by Sideloadly and Provision (android) based servers. - 50660608 is used by Windows iCloud based servers. .. py:property:: client :type: str Client string. The format is as follows: <%MODEL%> <%OS%;%MAJOR%.%MINOR%(%SPMAJOR%,%SPMINOR%);%BUILD%> <%AUTHKIT_BUNDLE_ID%/%AUTHKIT_VERSION% (%APP_BUNDLE_ID%/%APP_VERSION%)> Where: MODEL: The model of the device (e.g. MacBookPro15,1 or 'PC' OS: The OS of the device (e.g. Mac OS X or Windows) MAJOR: The major version of the OS (e.g. 10) MINOR: The minor version of the OS (e.g. 15) SPMAJOR: The major version of the service pack (e.g. 0) (Windows only) SPMINOR: The minor version of the service pack (e.g. 0) (Windows only) BUILD: The build number of the OS (e.g. 19C57) AUTHKIT_BUNDLE_ID: The bundle ID of the AuthKit framework (e.g. com.apple.AuthKit) AUTHKIT_VERSION: The version of the AuthKit framework (e.g. 1) APP_BUNDLE_ID: The bundle ID of the app (e.g. com.apple.dt.Xcode) APP_VERSION: The version of the app (e.g. 3594.4.19) .. py:method:: get_headers(user_id: str, device_id: str, serial: str = '0', with_client_info: bool = False) -> dict[str, str] :async: Generate a complete dictionary of Anisette headers. Consider using `BaseAppleAccount.get_anisette_headers` instead. .. py:method:: get_cpd(user_id: str, device_id: str, serial: str = '0') -> dict[str, str] :async: Generate a complete dictionary of CPD data. Intended for internal use. .. py:class:: RemoteAnisetteProvider(server_url: str) Bases: :py:obj:`BaseAnisetteProvider` Anisette provider. Fetches headers from a remote Anisette server. .. py:property:: otp :type: str See `BaseAnisetteProvider.otp`_. .. py:property:: machine :type: str See `BaseAnisetteProvider.machine`_. .. py:method:: get_headers(user_id: str, device_id: str, serial: str = '0', with_client_info: bool = False) -> dict[str, str] :async: See `BaseAnisetteProvider.get_headers`_. .. py:method:: close() -> None :async: See `AnisetteProvider.close`. .. py:class:: LocalAnisetteProvider(loop: asyncio.AbstractEventLoop | None = None) Bases: :py:obj:`BaseAnisetteProvider` Anisette provider. Generates headers without a remote server using pyprovision. .. py:property:: otp :type: str :abstractmethod: See `BaseAnisetteProvider.otp`_. .. py:property:: machine :type: str :abstractmethod: See `BaseAnisetteProvider.machine`_. .. py:method:: close() -> None :async: See `BaseAnisetteProvider.close`_.