File: token.py

package info (click to toggle)
python-aioairzone-cloud 0.6.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 396 kB
  • sloc: python: 3,600; makefile: 4
file content (87 lines) | stat: -rw-r--r-- 2,495 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""Airzone Cloud API Token."""

from __future__ import annotations

from datetime import datetime
from typing import Any
import urllib.parse

from .const import (
    API_AUTH_REFRESH_TOKEN,
    API_REFRESH_TOKEN,
    API_TOKEN,
    API_V1,
    HEADER_AUTHORIZATION,
    HEADER_BEARER,
    TOKEN_REFRESH_PERIOD,
    WS_JWT,
)
from .exceptions import LoginError, TokenRefreshError


class AirzoneCloudToken:
    """Airzone Cloud Token."""

    def __init__(self) -> None:
        """Airzone Cloud Token init."""
        self.refresh_time: datetime | None = None
        self.refresh_token: str | None = None
        self.token: str | None = None

    def check_refresh(self) -> bool:
        """Check if Airzone Cloud Token needs refreshing."""
        return (
            self.refresh_time is not None
            and (datetime.now() - self.refresh_time) >= TOKEN_REFRESH_PERIOD
        )

    def clear(self) -> None:
        """Clear Airzone Cloud Token."""
        self.refresh_time = None
        self.refresh_token = None
        self.token = None

    def headers(self) -> dict[str, Any]:
        """Airzone Cloud Token headers."""
        _headers: dict[str, Any] = {}

        if self.token is not None:
            _headers[HEADER_AUTHORIZATION] = f"{HEADER_BEARER} {self.token}"

        return _headers

    def is_valid(self) -> bool:
        """Check if Airzone Cloud Token is valid."""
        return (
            self.refresh_time is not None
            and self.refresh_token is not None
            and self.token is not None
        )

    def jwt(self) -> dict[str, Any]:
        """Airzone Cloud WebSockets headers."""
        _jwt: dict[str, Any] = {}

        if self.token is not None:
            _jwt[WS_JWT] = self.token

        return _jwt

    def update(self, resp: dict[str, Any], refresh: bool) -> None:
        """Update Airzone Cloud Token."""
        refresh_token = resp.get(API_REFRESH_TOKEN)
        token = resp.get(API_TOKEN)

        if refresh_token is None or token is None:
            if refresh:
                raise TokenRefreshError("Invalid API response")
            raise LoginError("Invalid API response")

        self.refresh_time = datetime.now()
        self.refresh_token = refresh_token
        self.token = token

    def url_refresh(self) -> str:
        """Airzone Cloud Token refresh URL."""
        refresh_token = urllib.parse.quote(self.refresh_token or "")
        return f"{API_V1}/{API_AUTH_REFRESH_TOKEN}/{refresh_token}"