File: session.py

package info (click to toggle)
python-b2sdk 2.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,020 kB
  • sloc: python: 30,902; sh: 13; makefile: 8
file content (79 lines) | stat: -rw-r--r-- 3,077 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
######################################################################
#
# File: b2sdk/v1/session.py
#
# Copyright 2021 Backblaze Inc. All Rights Reserved.
#
# License https://www.backblaze.com/using_b2_code.html
#
######################################################################
from __future__ import annotations

from b2sdk import v2
from b2sdk.v2.exception import InvalidArgument
from .account_info import SqliteAccountInfo


# Override to use legacy signature of account_info.set_auth_data, especially the minimum_part_size argument
# and to accept old-style raw_api argument
class B2Session(v2.B2Session):
    SQLITE_ACCOUNT_INFO_CLASS = staticmethod(SqliteAccountInfo)

    def __init__(
        self,
        account_info=None,
        cache=None,
        raw_api: v2.B2RawHTTPApi = None,
        api_config: v2.B2HttpApiConfig | None = None,
    ):
        if raw_api is not None and api_config is not None:
            raise InvalidArgument(
                'raw_api,api_config', 'Provide at most one of: raw_api, api_config'
            )

        if api_config is None:
            api_config = v2.DEFAULT_HTTP_API_CONFIG
        super().__init__(account_info=account_info, cache=cache, api_config=api_config)
        if raw_api is not None:
            self.raw_api = raw_api

    def authorize_account(self, realm, application_key_id, application_key):
        """
        Perform account authorization.

        :param str realm: a realm to authorize account in (usually just "production")
        :param str application_key_id: :term:`application key ID`
        :param str application_key: user's :term:`application key`
        """
        # Authorize
        realm_url = self.account_info.REALM_URLS.get(realm, realm)
        response = self.raw_api.authorize_account(realm_url, application_key_id, application_key)
        account_id = response['accountId']
        storage_api_info = response['apiInfo']['storageApi']

        # `allowed` object has been deprecated in the v3 of the API, but we still
        # construct it artificially to avoid changes in all the reliant parts.
        allowed = {
            'bucketId': storage_api_info['bucketId'],
            'bucketName': storage_api_info['bucketName'],
            'capabilities': storage_api_info['capabilities'],
            'namePrefix': storage_api_info['namePrefix'],
        }

        # Clear the cache if new account has been used
        if not self.account_info.is_same_account(account_id, realm):
            self.cache.clear()

        # Store the auth data
        self.account_info.set_auth_data(
            account_id=account_id,
            auth_token=response['authorizationToken'],
            api_url=storage_api_info['apiUrl'],
            download_url=storage_api_info['downloadUrl'],
            minimum_part_size=storage_api_info['recommendedPartSize'],
            application_key=application_key,
            realm=realm,
            s3_api_url=storage_api_info['s3ApiUrl'],
            allowed=allowed,
            application_key_id=application_key_id,
        )