File: providers.py

package info (click to toggle)
secrets 12.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,616 kB
  • sloc: python: 6,838; xml: 7; makefile: 4
file content (77 lines) | stat: -rw-r--r-- 2,501 bytes parent folder | download | duplicates (2)
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
# SPDX-License-Identifier: GPL-3.0-only
from __future__ import annotations

import logging
from typing import TYPE_CHECKING

from gi.repository import Adw, Gio, GLib, GObject

from gsecrets.provider.file_provider import FileProvider
from gsecrets.provider.pkcs11_provider import Pkcs11Provider
from gsecrets.provider.yubikey_provider import YubiKeyProvider

if TYPE_CHECKING:
    from gsecrets.utils import LazyValue

KEY_PROVIDERS = [FileProvider, Pkcs11Provider, YubiKeyProvider]


class Providers(GObject.Object):
    def __init__(self, window: Adw.ApplicationWindow):
        super().__init__()

        self.providers = []
        self.salt: LazyValue[bytes] | None = None

        for key_provider in KEY_PROVIDERS:
            self.providers.append(key_provider(window))

    def get_key_providers(self) -> list:
        return self.providers

    def generate_composite_key_async(
        self,
        salt: LazyValue[bytes],
        callback: Gio.AsyncReadyCallback,
        cancellable: GLib.Cancellable = None,
    ) -> None:
        """Generate composite key.

        Traverse all available key providers and request each raw_key.
        This one is appended to the main raw_key.
        """
        self.salt = salt

        def generate_composite_key_task(task, self, _task_data, _cancellable):
            raw_key = b""

            # Generate composite key
            # It is safe to travel all providers as non configured ones do not
            # have a key.
            for provider in self.providers:
                logging.debug("Generate key for %s", type(provider).__name__)
                try:
                    if provider.generate_key(self.salt):
                        logging.debug("Adding key from %s", type(provider).__name__)
                        raw_key += provider.key
                except ValueError as err:
                    task.return_error(GLib.Error(str(err)))
                    return

            if len(raw_key) == 0:
                logging.debug("No key providers in use, returning None")
                task.return_value(None)
                return

            task.return_value(raw_key)

        task = Gio.Task.new(self, cancellable, callback)
        task.run_in_thread(generate_composite_key_task)

    def generate_composite_key_finish(self, result):
        """Finish generate_composite_key_finish.

        Can raise GLib.Error
        """
        _success, composite_key = result.propagate_value()
        return composite_key