From 7b27c79907837e4d2bba69c1dd3851fe03f0a823 Mon Sep 17 00:00:00 2001 From: kdmukai Date: Thu, 13 Jan 2022 04:47:28 -0600 Subject: [PATCH] Feature: Service integration - Swan (#1517) * fix create_order issue * fix url and better error-handling * basic balances tab * activating services * Service management * Improve settings page and default to it if token unset * Fix history tab * Fix trade error handling * Add withdraw * calling specter-cloud for creating vaultoro orders * Improve trade screen and fixes * sidebar fix * black * refactor Service integration * refactor to have Service Classes like manifests * maturity * dynamic initialisation of service-classes and blueprints * fix sidebar_services * migrated templates and static into vaultoro folder * refactor config to manifest * some minor things * swan initial * rename and fix test * adding ServiceApiKeyStorageUserAware * fix * store the access token * directory indirection to shield templates from each others blueprint * first attempts with automatic withdrawals * proper tab highlighting * Update service_apikey_storage.py * Update oauth2_success.jinja * Awaiting refresh_token support * Service logo display on Addresses * Associate addr with a Service * address-data component reorg Separates the presentation html from the data as much as possible. * Services data/icon added to tx History * Now hitting the updated Swan endpoint to save deposit addrs * Simplified injecting Services data into JS * Reducing js calls back to server in tx-data; templatizing utxo in/outs * renaming "reserving" to "associating" an Address with a Service. * rename `manifest.py` files to `service.py`. * rename "api_data" to "service_data" to make the storage a bit more generalized. `ServiceApiKeyStorage` is now `ServiceEncryptedStorage` to match. * Beginning of factoring out Swan api to its own `api.py` file; need to rectify with `swan_client.py`. * Removed tx-table/row/data changes and address-table/row/data Kept only the bare minimum changes required to display the Services icon, plus optimizations. * deleted no longer used CustomElement * Adding services docs to mkdocs * Configuration for Services * more clever configuration * fix test * deleted swan_client * Changing the address abbreviation format to 7...7 and little big fix for not vertically aligned addresses in Firefox. * Better state management if Auth method changes * Cleanup, better user messaging; pulling Service methods out of controller and User * Redirect to services endpoint after setting up authentication. * PR cleanup, bug fixes, test suite updates * Fixed test case problem * First fix for delete API key button. * Service hooks; Option to fully remove Swan Integration; Logout clears plaintext_user_secret * Restoring bugfix from @moneymanolis * cleanup and black * Make service-decovery in AppImage work * import hashlib, maybe fix cypress * Update service_encrypted_storage.py * further bugfix on update * TODO: remove debugging in client.py before first release * fix controller-test * fix singleton testing issues Co-authored-by: Kim Neunert Co-authored-by: benk10 Co-authored-by: Kim Neunert Co-authored-by: moneymanolis --- docs/archblog.md | 2 +- docs/services/services.md | 130 +++++ docs/services/swan.md | 0 mkdocs.yml | 1 + pyinstaller/electron/styles.css | 12 +- pytest.ini | 3 + src/cryptoadvance/specter/addresslist.py | 53 +- src/cryptoadvance/specter/config.py | 12 + src/cryptoadvance/specter/liquid/wallet.py | 22 +- .../specter/managers/singleton.py | 40 ++ .../specter/managers/wallet_manager.py | 94 ++-- src/cryptoadvance/specter/persistence.py | 2 +- src/cryptoadvance/specter/server.py | 7 + .../specter/server_endpoints/auth.py | 15 +- .../specter/server_endpoints/controller.py | 14 +- .../specter/server_endpoints/settings.py | 88 ++- .../specter/server_endpoints/wallets.py | 21 +- .../specter/services/__init__.py | 0 .../services/bitcoinreserve/__init__.py | 0 .../services/bitcoinreserve/controller.py | 24 + .../services/bitcoinreserve/service.py | 14 + .../static/img/bitcoinreserve_icon.svg | 12 + .../specter/services/controller.py | 84 +++ src/cryptoadvance/specter/services/service.py | 181 ++++++ .../services/service_annotations_storage.py | 72 +++ .../services/service_encrypted_storage.py | 162 ++++++ .../specter/services/service_manager.py | 162 ++++++ .../specter/services/swan/__init__.py | 0 .../specter/services/swan/client.py | 514 ++++++++++++++++++ .../specter/services/swan/config.py | 6 + .../specter/services/swan/controller.py | 223 ++++++++ .../specter/services/swan/service.py | 397 ++++++++++++++ .../services/swan/static/img/swan_icon.svg | 1 + .../services/swan/static/img/swan_logo.svg | 2 + .../templates/swan/components/swan_menu.jinja | 16 + .../templates/swan/components/swan_tab.jinja | 8 + .../services/swan/templates/swan/index.jinja | 112 ++++ .../swan/templates/swan/oauth2_start.jinja | 62 +++ .../swan/templates/swan/oauth2_success.jinja | 52 ++ .../swan/templates/swan/settings.jinja | 133 +++++ .../swan/templates/swan/withdrawals.jinja | 78 +++ .../templates/components/menu_item.jinja | 17 + .../templates/includes/services-data.html | 15 + .../templates/services/associate_addr.jinja | 83 +++ .../services/templates/services/choose.jinja | 98 ++++ .../services/sidebar_services_list.jinja | 13 + src/cryptoadvance/specter/specter.py | 20 +- .../specter/static/img/ghost_3d.png | Bin 0 -> 413565 bytes src/cryptoadvance/specter/static/styles.css | 12 +- .../specter/templates/base.jinja | 8 +- .../templates/includes/address-data.html | 51 +- .../templates/includes/address-label.html | 14 + .../templates/includes/address-row.html | 16 +- .../templates/includes/addresses-table.html | 24 +- .../templates/includes/message-box.html | 5 +- .../templates/includes/sidebar/sidebar.jinja | 11 +- .../specter/templates/includes/tx-data.html | 41 +- .../specter/templates/includes/tx-row.html | 32 +- .../specter/templates/includes/tx-table.html | 13 + .../templates/settings/auth_settings.jinja | 19 + .../templates/settings/general_settings.jinja | 2 +- .../templates/settings/hwi_settings.jinja | 2 +- .../templates/settings/tor_settings.jinja | 2 +- .../templates/setup/bitcoind_datadir.jinja | 2 +- .../specter/templates/setup/node_type.jinja | 2 +- .../specter/templates/setup/tor.jinja | 2 +- .../wallet/addresses/wallet_addresses.jinja | 5 +- .../wallet/history/wallet_history.jinja | 5 +- .../wallet/receive/wallet_receive.jinja | 4 +- .../wallet/send/new/wallet_send.jinja | 2 +- .../templates/wallet/wallets_overview.jinja | 67 +-- src/cryptoadvance/specter/user.py | 83 ++- src/cryptoadvance/specter/util/reflection.py | 71 +++ src/cryptoadvance/specter/wallet.py | 141 +++-- tests/conftest.py | 46 +- tests/install_noded.sh | 9 +- tests/test_services.py | 218 ++++++++ tests/test_user.py | 1 - tests/test_util_reflection.py | 37 ++ 79 files changed, 3797 insertions(+), 227 deletions(-) create mode 100644 docs/services/services.md create mode 100644 docs/services/swan.md create mode 100644 src/cryptoadvance/specter/managers/singleton.py create mode 100644 src/cryptoadvance/specter/services/__init__.py create mode 100644 src/cryptoadvance/specter/services/bitcoinreserve/__init__.py create mode 100644 src/cryptoadvance/specter/services/bitcoinreserve/controller.py create mode 100644 src/cryptoadvance/specter/services/bitcoinreserve/service.py create mode 100644 src/cryptoadvance/specter/services/bitcoinreserve/static/img/bitcoinreserve_icon.svg create mode 100644 src/cryptoadvance/specter/services/controller.py create mode 100644 src/cryptoadvance/specter/services/service.py create mode 100644 src/cryptoadvance/specter/services/service_annotations_storage.py create mode 100644 src/cryptoadvance/specter/services/service_encrypted_storage.py create mode 100644 src/cryptoadvance/specter/services/service_manager.py create mode 100644 src/cryptoadvance/specter/services/swan/__init__.py create mode 100644 src/cryptoadvance/specter/services/swan/client.py create mode 100644 src/cryptoadvance/specter/services/swan/config.py create mode 100644 src/cryptoadvance/specter/services/swan/controller.py create mode 100644 src/cryptoadvance/specter/services/swan/service.py create mode 100644 src/cryptoadvance/specter/services/swan/static/img/swan_icon.svg create mode 100644 src/cryptoadvance/specter/services/swan/static/img/swan_logo.svg create mode 100644 src/cryptoadvance/specter/services/swan/templates/swan/components/swan_menu.jinja create mode 100644 src/cryptoadvance/specter/services/swan/templates/swan/components/swan_tab.jinja create mode 100644 src/cryptoadvance/specter/services/swan/templates/swan/index.jinja create mode 100644 src/cryptoadvance/specter/services/swan/templates/swan/oauth2_start.jinja create mode 100644 src/cryptoadvance/specter/services/swan/templates/swan/oauth2_success.jinja create mode 100644 src/cryptoadvance/specter/services/swan/templates/swan/settings.jinja create mode 100644 src/cryptoadvance/specter/services/swan/templates/swan/withdrawals.jinja create mode 100644 src/cryptoadvance/specter/services/templates/components/menu_item.jinja create mode 100644 src/cryptoadvance/specter/services/templates/includes/services-data.html create mode 100644 src/cryptoadvance/specter/services/templates/services/associate_addr.jinja create mode 100644 src/cryptoadvance/specter/services/templates/services/choose.jinja create mode 100644 src/cryptoadvance/specter/services/templates/services/sidebar_services_list.jinja create mode 100644 src/cryptoadvance/specter/static/img/ghost_3d.png create mode 100644 src/cryptoadvance/specter/util/reflection.py create mode 100644 tests/test_services.py create mode 100644 tests/test_util_reflection.py diff --git a/docs/archblog.md b/docs/archblog.md index 274441e4d..a98f26691 100644 --- a/docs/archblog.md +++ b/docs/archblog.md @@ -1,7 +1,7 @@ # Purpose Let's find a place to docoment non straightforward design decisions. -## 02nd Oct 2020 - k9ert +## 02nd Oct 2020 - Kim It's already mentioned in Development.md. I spend far too much time figuring out that we have created a nasty workaround in server.py. So the problem looks like this: The fixtures are creating the app anew for each test in test_controller. For some reason hwi-view-endpoints are somehow treated differently then the normal endpoints. As a result, the second test gets a app-object which, for some reason doesn't have the normal endpoints, but just the hwi-endpoint. A healthy app.view_functions looks like this: ``` diff --git a/docs/services/services.md b/docs/services/services.md new file mode 100644 index 000000000..cd1af1de9 --- /dev/null +++ b/docs/services/services.md @@ -0,0 +1,130 @@ +# Third-Party Service Integrations + +A developer's guide for Specter Desktop `Service` integrations. + + +## Basic Code Philosophy +As much as possible, each `Service` implementation should be entirely self-contained with little or no custom code altering existing/core Specter functionality. + +Effort has been taken to provide `Service` data storage that is separate from existing data stores in order to keep those areas clean and simple. Where touchpoints are unavoidable, they are kept to the absolute bare minimum (e.g. `User.services` list, `Address.service_id` field). + + +## `Address`-Level Integration +An `Address` can be associated with a `Service` (e.g. addr X received a smash buy from `Service` Foo) via the `Address.service_id` field. + +A `Service` can also "reserve" and `Address` for future use by setting `Address.service_id`. The normal "Receive" UI will automatically skip any reserved `Address`es when generating a new receive addr. The reserved addresses are interleaved with ready-to-use addresses so that we don't create any potentially confusing wallet gaps (e.g. addrs 4, 6, and 8 are reserved but addrs 3, 5, and 7 are available). + +Users can also manually associate an existing `Address` with a `Service` (this is useful when the user has info that the particular `Service` api can't provide for whatever reason). + +_Note: TODO: manually un-reserve an `Address` from a `Service`._ + + +## Basic Code Structure +All `Service`-related code should be contained within `cryptoadvance.specter.services`. The base components are: + + +### `Service` Base Class +Defines the base `Service` class that all service integrations must inherit from. This is wired to enable `Service` auto-discovery. Any feature that is common to most or all `Service` integrations should be implemented here. + +Each `Service` must specify a unique `Service.id` that is just a short string (e.g. "swan"). This is the main identifier throughout the code. + +Includes methods to "reserve" addresses for the `Service` to basically make those not-yet-used addresses somewhat off-limits to the rest of the UI (can still be manually overridden though). + + +### `Service` Configuration +In order to separate the service-configuration from the main-configuration, you can specify your config in a file called `config.py`. It's structure is similiar to the specter-wide `config.py`, e.g.: +``` +class BaseConfig(): + SWAN_API_URL="https://dev-api.swanbitcoin.com" + +class ProductionConfig(BaseConfig): + SWAN_API_URL="https://api.swanbitcoin.com" +``` +In your code, you can access the correct value as in any other flask-code, like `api_url = app.config.get("SWAN_API_URL")`. If the instance is running a config (e.g. `DevelopmentConfig`) which is not available in your service-specific config (as above), the inheritance-hirarchy from the mainconfig will get traversed and the first hit will get get configured. In this example, it would be `BaseConfig`. + + +### `ServiceManager` +Simple manager that contains all `Service`s. Performs the `Service` auto-discovery at startup and filters availability by each `Service`'s release level (i.e. alpha, beta, etc). + + +### `ServiceEncryptedStorage` +Most `Service`s will require user secrets (e.g. API key and secret). Each Specter `User` will have their own on-disk encrypted `ServiceEncryptedStorage` with filename `_services.json`. Note that the user's secrets for all `Service`s will be stored in this one file. + +This is built upon the `GenericDataManager` class which supports optional encrypted fields. In this case all fields are encrypted. The `GenericDataManager` encryption can only be unlocked by each `User`'s individual `user_secret` that itself is stored encrypted on-disk; it is decrypted to memory when the `User` logs in. + +For this reason `Service`s cannot be activated unless the user is signing in with a password-protected account (the default no-password `admin` account will not work). + +_Note: during development if the Flask server is restarted or auto-reloads, the user's decrypted `user_secret` will no longer be in memory. The Flask context will still consider the user logged in after restart, but code that relies on having access to the `ServiceEncryptedStorage` will throw an error and/or prompt the user to log in again._ + +It is up to each `Service` implementation to decide what data is stored; the `ServiceEncryptedStorage` simply takes arbitrary json in and delivers it back out. + +This is also where `Service`-wide configuration or other information should be stored, _**even if it is not secret**_ (see above intro about not polluting other existing data stores). + + +### `ServiceEncryptedStorageManager` +Because the `ServiceEncryptedStorage` is specific to each individual user, this manager provides convenient access to automatically retrieve the `current_user` from the Flask context and provide the correct user's `ServiceEncryptedStorage`. It is implemented as a `Singleton` which can be retrieved simply by importing the class and calling `get_instance()`. + +This simplifies code to just asking for: +``` +from .service_encrypted_storage import ServiceEncryptedStorageManager + +ServiceEncryptedStorageManager.get_instance().get_current_user_service_data(service_id=some_service_id) +``` + +As a further convenience, the `Service` base class itself encapsulates `Service`-aware access to this per-`User` encrypted storage: +``` +@classmethod +def get_current_user_service_data(cls) -> dict: + return ServiceEncryptedStorageManager.get_instance().get_current_user_service_data(service_id=cls.id) +``` + +Whenever possible, external code should not directly access these `Service`-related support classes but rather should ask for them through the `Service` class. + + +### `ServiceAnnotationsStorage` +Annotations are any address-specific or transaction-specific data from a `Service` that we might want to present to the user. Example: a `Service` that integrates with a onchain storefront would have product/order data associated with a utxo. That additional data could be imported by the `Service` and stored as an annotation. This annotation data could then be displayed to the user when viewing the details for that particular address or tx. + +Annotations are stored on a per-wallet and per-`Service` basis as _unencrypted_ on-disk data (filename: `_.json`). + +_Note: current `Service` implementations have not yet needed this feature so displaying annotations is not yet implemented._ + + +### `controller.py` +The minimal url routes for `Service` selection and management. + + +## Implementation Class Structure +Child implementation classes (e.g. `SwanService`) should be self-contained within their own subdirectory in `services`. e.g.: +``` +cryptoadvance.specter.services.swan +``` + +Each implementation must have the following required components: +``` +/static +/templates/ +controller.py +service.py +``` + +This makes each implementation its own Flask `Blueprint`. + +### `/static` +Because of Flask `Blueprint` imports, you can just add static files here and reference them (e.g. "static/img/blah.png") as if they were in the main `/static` files root dir. + +### `/templates/` +Again, Flask `Blueprint`s import the `/templates` directory as-is, but to avoid namespace collisions on the template files (e.g. `/templates/index.html`) they should be contained within a subdirectory named with the `Service.id` (e.g. `/templates/swan/index.html`) + +### `Service` Implementation Class +Must inherit from `Service` and provide any additional functionality needed. The `Service` implementation class is meant to be the main hub for all things related to that particular `Service`. In general, external code would ideally only interact with the `Service` implementation class (e.g. ) + +### `controller.py` +Flask `Blueprint` for any endpoints required by this `Service`. + +The coding philosophy should be to keep this code as simple as possible and keep most or all of the actual logic in the `Service` implementation class. + +### Additional Files +The `SwanService` also includes an `api.py` to separate its back-end API calls from the user-facing `controller.py` endpoints. In general this is recommended to provide a clear separation. + +An individual `Service` implementation may add whatever additional files or classes it needs. + diff --git a/docs/services/swan.md b/docs/services/swan.md new file mode 100644 index 000000000..e69de29bb diff --git a/mkdocs.yml b/mkdocs.yml index 345db5410..d508ddb4a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -25,6 +25,7 @@ nav: - build-instructions.md - 'Continuous Integration': continuous-integration.md - cypress-testing.md + - services/services.md - 'Some Random Dev Thoughts': archblog.md - API: - api/README.md diff --git a/pyinstaller/electron/styles.css b/pyinstaller/electron/styles.css index ca23d445e..31d89891c 100644 --- a/pyinstaller/electron/styles.css +++ b/pyinstaller/electron/styles.css @@ -11,7 +11,7 @@ html, body{ --cmap-red: #A12737; --cmap-red-darker: #951E2D; --cmap-bg: #192432; - --cmap-bg-ligher: #263044; + --cmap-bg-lighter: #263044; --cmap-bg-lightest: #313E50; --cmap-border: #506072; --cmap-border-darker: #405062; @@ -75,7 +75,7 @@ ul, li{ align-items: center; } .settings-bar-btn:hover { - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); } .logout{ position: relative; @@ -90,7 +90,7 @@ ul, li{ border-radius: 0 0 0 5px; } .logout:hover{ - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); } .logout img{ margin-right: 10px; @@ -177,7 +177,7 @@ nav.side{ width: 250px; } #side-content{ - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); border-right: 1px solid var(--cmap-bg-lightest); padding-top: 10px; display: flex; @@ -651,7 +651,7 @@ td, th{ border-bottom: 1px solid var(--cmap-bg-lightest); } tr, thead{ - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); } th{ text-align: left; @@ -952,7 +952,7 @@ a:focus + .tool-tip .tool-tip__info { bottom: 0; right: 0; width: 20px; - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); } td.xpub{ max-width: 230px; diff --git a/pytest.ini b/pytest.ini index 2a7ee9c02..c7c19f1f1 100644 --- a/pytest.ini +++ b/pytest.ini @@ -6,3 +6,6 @@ markers = slow: mark test as slow. elm: mark test as elementsd dependent #log_cli = 1 + +filterwarnings = + ignore::DeprecationWarning:bitbox02[.*] \ No newline at end of file diff --git a/src/cryptoadvance/specter/addresslist.py b/src/cryptoadvance/specter/addresslist.py index 06a03b905..3f5d263c7 100644 --- a/src/cryptoadvance/specter/addresslist.py +++ b/src/cryptoadvance/specter/addresslist.py @@ -23,6 +23,7 @@ class Address(dict): "change", # bool, change or receive "label", # str, address label "used", # bool, does this address have a transaction? + "service_id", # str, reserved for or used by Service.id ] type_converter = [ str, @@ -30,6 +31,7 @@ class Address(dict): to_bool, str, to_bool, + str, ] def __init__(self, rpc, **kwargs): @@ -49,6 +51,16 @@ class Address(dict): self["label"] = label self.rpc.setlabel(self.address, label) + def set_service_id(self, service_id: str): + if service_id: + # Declares that this Address is associated with a Service + self["service_id"] = service_id + else: + # Frees a reserved Address; reset its label + self["service_id"] = None + if not self.used and self["label"]: + self.set_label("") + @property def is_external(self): return self.index is None @@ -95,6 +107,14 @@ class Address(dict): def is_labeled(self): return bool(self["label"]) + @property + def is_reserved(self): + return bool(self["service_id"]) + + @property + def service_id(self): + return self["service_id"] + def __str__(self): return self.address @@ -179,10 +199,14 @@ class AddressList(dict): ) self.save() - def set_label(self, address, label): + def get_address(self, address: str) -> Address: if address not in self: - self[address] = self.AddressCls(self.rpc, address=address, label=label) - self[address].set_label(label) + self[address] = self.AddressCls(self.rpc, address=address) + return self[address] + + def set_label(self, address, label): + addr_obj = self.get_address(address) + addr_obj.set_label(label) self.save() def get_labels(self): @@ -193,6 +217,29 @@ class AddressList(dict): labels[lbl] = labels.get(lbl, []) + [addr.address] return labels + def associate_with_service( + self, address: str, service_id: str, label: str, autosave: bool = True + ): + """ + Associates the Address (i.e. sets Address.service_id) with the specified + Service.id. + """ + addr_obj = self.get_address(address) + addr_obj.set_service_id(service_id) + addr_obj.set_label(label) + if autosave: + self.save() + + def deassociate(self, address: str, autosave: bool = True): + """ + Removes the Address's association with a Service (i.e. sets + Address.service_id to None and resets Address.label). + """ + addr_obj = self.get_address(address) + addr_obj.set_service_id(None) + if autosave: + self.save() + def set_used(self, addresses): need_save = False for address in addresses: diff --git a/src/cryptoadvance/specter/config.py b/src/cryptoadvance/specter/config.py index 0df9d1502..f990c842c 100644 --- a/src/cryptoadvance/specter/config.py +++ b/src/cryptoadvance/specter/config.py @@ -135,6 +135,12 @@ class BaseConfig(object): # Babel integration. List of languages written from right to left for RTL support in the UI RTL_LANGUAGES = ["he"] + # One of "prod", "beta" or "alpha". Every Service below will be not available + SERVICES_DEVSTATUS_THRESHOLD = os.getenv("SERVICES_DEVSTATUS_THRESHOLD", "prod") + + # This is just a placeholder in order to be aware that you cannot set this + # It'll be filled up with the fully qualified Classname the Config is derived from + SPECTER_CONFIGURATION_CLASS_FULLNAME = None # The user will get a warning if a request takes longer than this threshold REQUEST_TIME_WARNING_THRESHOLD = int( os.getenv("REQUEST_TIME_WARNING_THRESHOLD", "20") @@ -144,12 +150,18 @@ class BaseConfig(object): class DevelopmentConfig(BaseConfig): # https://stackoverflow.com/questions/22463939/demystify-flask-app-secret-key SECRET_KEY = "development key" + + # EXPLAIN_TEMPLATE_LOADING = os.getenv("EXPLAIN_TEMPLATE_LOADING", "False") + SPECTER_DATA_FOLDER = os.path.expanduser( os.getenv("SPECTER_DATA_FOLDER", "~/.specter_dev") ) # API active by default in dev-mode SPECTER_API_ACTIVE = _get_bool_env_var("SPECTER_API_ACTIVE", "True") + # One of "prod", "beta" or "alpha". Every Service below will be not available + SERVICES_DEVSTATUS_THRESHOLD = os.getenv("SERVICES_DEVSTATUS_THRESHOLD", "beta") + class TestConfig(BaseConfig): SECRET_KEY = "test key" diff --git a/src/cryptoadvance/specter/liquid/wallet.py b/src/cryptoadvance/specter/liquid/wallet.py index 215eb5194..620a1b266 100644 --- a/src/cryptoadvance/specter/liquid/wallet.py +++ b/src/cryptoadvance/specter/liquid/wallet.py @@ -1,14 +1,18 @@ -from ..wallet import * -from ..addresslist import Address +import hashlib +from typing import List + from embit import ec +from embit.descriptor.checksum import add_checksum +from embit.liquid.addresses import to_unconfidential +from embit.liquid.descriptor import LDescriptor from embit.liquid.pset import PSET from embit.liquid.transaction import LTransaction -from embit.liquid.descriptor import LDescriptor -from embit.descriptor.checksum import add_checksum -from .txlist import LTxList -from .addresslist import LAddressList -from embit.liquid.addresses import to_unconfidential + +from ..addresslist import Address from ..specter_error import SpecterError +from ..wallet import * +from .addresslist import LAddressList +from .txlist import LTxList from .util.pset import SpecterPSET @@ -136,8 +140,8 @@ class LWallet(Wallet): def createpsbt( self, - addresses: [str], - amounts: [float], + addresses: List[str], + amounts: List[float], subtract: bool = False, subtract_from: int = 0, fee_rate: float = 1.0, diff --git a/src/cryptoadvance/specter/managers/singleton.py b/src/cryptoadvance/specter/managers/singleton.py new file mode 100644 index 000000000..910f91485 --- /dev/null +++ b/src/cryptoadvance/specter/managers/singleton.py @@ -0,0 +1,40 @@ +class Singleton: + _instance = None + + def __init__(self): + # Singleton pattern must prevent normal instantiation + raise Exception( + "Cannot directly instantiate a Singleton. Access via get_instance()" + ) + + @classmethod + def get_instance(cls): + # This is the only way to access the one and only instance + if cls._instance is None: + cls._instance = cls.__new__(cls) + return cls._instance + + +class ConfigurableSingletonException(Exception): + pass + + +class ConfigurableSingleton(Singleton): + @classmethod + def get_instance(cls): + # This is the only way to access the one and only instance + if cls._instance: + return cls._instance + else: + raise ConfigurableSingletonException( + f"Must call {cls.__name__}.configure_instance(config) first" + ) + + @classmethod + def configure_instance(cls, **kwargs): + # Must be called before the first get_instance() call + if cls._instance: + raise ConfigurableSingletonException(f"{cls.__name__} already configured") + + # Instantiate the one and only instance + cls._instance = cls.__new__(cls) diff --git a/src/cryptoadvance/specter/managers/wallet_manager.py b/src/cryptoadvance/specter/managers/wallet_manager.py index 3fdb0b7a0..29a9f9476 100644 --- a/src/cryptoadvance/specter/managers/wallet_manager.py +++ b/src/cryptoadvance/specter/managers/wallet_manager.py @@ -5,33 +5,17 @@ import pathlib import shutil import threading import traceback -import hashlib -from collections import OrderedDict -from io import BytesIO from ..helpers import alias, load_jsons, is_liquid, add_dicts -from ..persistence import delete_file, delete_folder +from ..persistence import delete_folder from ..rpc import RpcError, get_default_datadir from ..specter_error import SpecterError -from ..util.descriptor import AddChecksum -from ..wallet import Wallet, purposes +from ..wallet import ( + Wallet, + purposes, +) # TODO: `purposes` unused here, but other files rely on this import from ..liquid.wallet import LWallet -from embit import ec -from embit.descriptor import Descriptor -from embit.liquid.descriptor import LDescriptor -from embit.descriptor.checksum import add_checksum - -from embit import ec -from embit.descriptor import Descriptor -from embit.liquid.descriptor import LDescriptor -from embit.descriptor.checksum import add_checksum - -from embit import ec -from embit.descriptor import Descriptor -from embit.liquid.descriptor import LDescriptor -from embit.descriptor.checksum import add_checksum - logger = logging.getLogger(__name__) @@ -128,7 +112,7 @@ class WalletManager: try: if self.wallets_update_list: loaded_wallets = self.rpc.listwallets() - logger.info("Getting loaded wallets list from Bitcoin Core") + # logger.info("Getting loaded wallets list from Bitcoin Core") for wallet in self.wallets_update_list: wallet_alias = self.wallets_update_list[wallet]["alias"] wallet_name = self.wallets_update_list[wallet]["name"] @@ -179,10 +163,10 @@ class WalletManager: ], ) self.wallets[wallet_name] = loaded_wallet - logger.info( - "Finished loading wallet into Bitcoin Core and Specter: %s" - % self.wallets_update_list[wallet]["alias"] - ) + # logger.info( + # "Finished loading wallet into Bitcoin Core and Specter: %s" + # % self.wallets_update_list[wallet]["alias"] + # ) except RpcError as e: logger.warning( f"Couldn't load wallet {wallet_alias} into core. Silently ignored! RPC error: {e}" @@ -208,10 +192,10 @@ class WalletManager: # ok wallet is already there # we only need to update try: - logger.info( - "Wallet already loaded in Bitcoin Core. Initializing %s Wallet object" - % self.wallets_update_list[wallet]["alias"] - ) + # logger.info( + # "Wallet already loaded in Bitcoin Core. Initializing %s Wallet object" + # % self.wallets_update_list[wallet]["alias"] + # ) loaded_wallet = self.WalletClass.from_json( self.wallets_update_list[wallet], self.device_manager, @@ -219,10 +203,10 @@ class WalletManager: ) if loaded_wallet: self.wallets[wallet_name] = loaded_wallet - logger.info( - "Finished loading wallet into Specter: %s" - % self.wallets_update_list[wallet]["alias"] - ) + # logger.info( + # "Finished loading wallet into Specter: %s" + # % self.wallets_update_list[wallet]["alias"] + # ) else: raise Exception("Failed to load wallet") except Exception as e: @@ -238,20 +222,20 @@ class WalletManager: ) else: # wallet is loaded and should stay - logger.info( - "Wallet already in Specter, updating wallet: %s" - % self.wallets_update_list[wallet]["alias"] - ) + # logger.info( + # "Wallet already in Specter, updating wallet: %s" + # % self.wallets_update_list[wallet]["alias"] + # ) self.wallets[wallet_name].update() - logger.info( - "Finished updating wallet: %s" - % self.wallets_update_list[wallet]["alias"] - ) + # logger.info( + # "Finished updating wallet: %s" + # % self.wallets_update_list[wallet]["alias"] + # ) # TODO: check wallet file didn't change # only ignore rpc errors except RpcError as e: logger.error(f"Failed updating wallet manager. RPC error: {e}") - logger.info("Done updating wallet manager") + # logger.info("Done updating wallet manager") self.wallets_update_list = {} self.is_loading = False @@ -368,22 +352,29 @@ class WalletManager: fetch_transactions=True, validate_merkle_proofs=False, current_blockheight=None, + service_id=None, ): """Returns a list of all transactions in all wallets loaded in the wallet_manager. #Parameters: # fetch_transactions (bool): Update the TxList CSV caching by fetching transactions from the Bitcoin RPC # validate_merkle_proofs (bool): Return transactions with validated_blockhash # current_blockheight (int): Current blockheight for calculating confirmations number (None will fetch the block count from the RPC) + # service_id (str): Filters results for just the specified Service """ + # Nested comprehensions: txlists = [ [ + # Inner comprehension: Return each tx and all its attrs as a list of dicts... + # TODO: Simplify this by adding an `as_dict` option to `Wallet.txlist()`? {**tx, "wallet_alias": wallet.alias} for tx in wallet.txlist( fetch_transactions=fetch_transactions, validate_merkle_proofs=validate_merkle_proofs, current_blockheight=current_blockheight, + service_id=service_id, ) ] + # Outer comprehension: ...from each wallet, each returning their own tx list. for wallet in self.wallets.values() ] result = [] @@ -411,6 +402,23 @@ class WalletManager: result.append(tx) return list(reversed(sorted(result, key=lambda tx: tx["time"]))) + def full_addresses_info(self, is_change: bool = False, service_id: str = None): + """Mimics full_txlist in concept, but is really only expected to be used for + retrieving all addresses across all Wallets that are associated with a + Service. + + Not currently used yet.""" + addresses_info = [] + for wallet_alias, wallet in self.wallets.items(): + addresses_info.extend( + wallet.addresses_info( + is_change=is_change, + service_id=service_id, + include_wallet_alias=True, + ) + ) + return addresses_info + def delete(self, specter): """Deletes all the wallets""" for w in list(self.wallets.keys()): diff --git a/src/cryptoadvance/specter/persistence.py b/src/cryptoadvance/specter/persistence.py index 07771526a..47ff7ac52 100644 --- a/src/cryptoadvance/specter/persistence.py +++ b/src/cryptoadvance/specter/persistence.py @@ -195,7 +195,7 @@ def storage_callback(mode="write", path=None): """Call this whenever anything in the .specter directory changes. Be aware that we might store node-data in the specter-folder""" # Might be usefull to figure out why the callback has been triggered: # traceback.print_stack() - logger.info(f"Storage Callback called mode {mode} with path {path}") + # logger.debug(f"Storage Callback called mode {mode} with path {path}") if os.getenv("SPECTER_PERSISTENCE_CALLBACK_ASYNC"): cmd_list = os.getenv("SPECTER_PERSISTENCE_CALLBACK_ASYNC").split(" ") cmd_list.append(mode) diff --git a/src/cryptoadvance/specter/server.py b/src/cryptoadvance/specter/server.py index ba9bff783..07d3f0ecf 100644 --- a/src/cryptoadvance/specter/server.py +++ b/src/cryptoadvance/specter/server.py @@ -93,6 +93,8 @@ def create_app(config=None): app.jinja_env.autoescape = select_autoescape(default_for_string=True, default=True) logger.info(f"Configuration: {config}") app.config.from_object(config) + # Might be convenient to know later where it came from (see Service configuration) + app.config["SPECTER_CONFIGURATION_CLASS_FULLNAME"] = config app.wsgi_app = ProxyFix( app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_port=1, x_prefix=1 ) @@ -121,6 +123,7 @@ def init_app(app, hwibridge=False, specter=None): data_folder=app.config["SPECTER_DATA_FOLDER"], config=app.config["DEFAULT_SPECTER_CONFIG"], internal_bitcoind_version=app.config["INTERNAL_BITCOIND_VERSION"], + service_devstatus_threshold=app.config["SERVICES_DEVSTATUS_THRESHOLD"], ) login_manager = LoginManager() @@ -150,12 +153,14 @@ def init_app(app, hwibridge=False, specter=None): app.config["LOGIN_DISABLED"] = True else: app.logger.info("Login enabled") + app.config["LOGIN_DISABLED"] = False app.logger.info("Initializing Controller ...") app.register_blueprint(hwi_server, url_prefix="/hwi") csrf.exempt(hwi_server) if not hwibridge: with app.app_context(): from cryptoadvance.specter.server_endpoints import controller + from cryptoadvance.specter.services import controller as serviceController if app.config.get("TESTING") and len(app.view_functions) <= 20: # Need to force a reload as otherwise the import is skipped @@ -165,7 +170,9 @@ def init_app(app, hwibridge=False, specter=None): # see archblog for more about this nasty workaround import importlib + logger.info("Reloading controllers") importlib.reload(controller) + importlib.reload(serviceController) else: @app.route("/", methods=["GET"]) diff --git a/src/cryptoadvance/specter/server_endpoints/auth.py b/src/cryptoadvance/specter/server_endpoints/auth.py index 5032f4826..1082bbbd5 100644 --- a/src/cryptoadvance/specter/server_endpoints/auth.py +++ b/src/cryptoadvance/specter/server_endpoints/auth.py @@ -1,4 +1,6 @@ -import random, time +import random +import time + from flask import ( Flask, Blueprint, @@ -175,6 +177,9 @@ please request a new link from the node operator." @auth_endpoint.route("/logout", methods=["GET", "POST"]) def logout(): + # Clear the decrypted user_secret from memory + current_user.plaintext_user_secret = None + logout_user() if "timeout" in request.args: flash(_("You were automatically logged out"), "info") @@ -196,6 +201,14 @@ def redirect_login(request): response = redirect(request.form["next"]) else: response = redirect(url_for("index")) + + for service_id in app.specter.user_manager.get_user().services: + try: + service_cls = app.specter.service_manager.get_service(service_id) + service_cls.on_user_login() + except Exception as e: + app.logger.exception(e) + return response diff --git a/src/cryptoadvance/specter/server_endpoints/controller.py b/src/cryptoadvance/specter/server_endpoints/controller.py index e3c014678..d4623db9b 100644 --- a/src/cryptoadvance/specter/server_endpoints/controller.py +++ b/src/cryptoadvance/specter/server_endpoints/controller.py @@ -3,7 +3,7 @@ from time import time from binascii import unhexlify from flask import make_response from flask_wtf.csrf import CSRFError -from werkzeug.exceptions import MethodNotAllowed +from werkzeug.exceptions import MethodNotAllowed, NotFound from flask import render_template, request, redirect, url_for, flash, g from flask_babel import lazy_gettext as _ from flask_login import login_required, current_user @@ -35,10 +35,14 @@ from .wallets import wallets_endpoint from .wallets_api import wallets_endpoint_api from ..rpc import RpcError +# Services live in their own separate path +from cryptoadvance.specter.services.controller import services_endpoint + app.register_blueprint(auth_endpoint, url_prefix="/auth") app.register_blueprint(devices_endpoint, url_prefix="/devices") app.register_blueprint(nodes_endpoint, url_prefix="/nodes") app.register_blueprint(price_endpoint, url_prefix="/price") +app.register_blueprint(services_endpoint, url_prefix="/services") app.register_blueprint(settings_endpoint, url_prefix="/settings") app.register_blueprint(setup_endpoint, url_prefix="/setup") app.register_blueprint(wallets_endpoint, url_prefix="/wallets") @@ -79,6 +83,14 @@ def server_specter_error(se): return redirect(url_for("about")) +@app.errorhandler(NotFound) +def server_notFound_error(e): + """Unspecific Exceptions get a 404 Error-Page""" + # if rpc is not available + app.logger.error("Could not find Resource (404): %s" % request.url) + return render_template("500.jinja", error=e), 500 + + @app.errorhandler(Exception) def server_error(e): """Unspecific Exceptions get a 500 Error-Page""" diff --git a/src/cryptoadvance/specter/server_endpoints/settings.py b/src/cryptoadvance/specter/server_endpoints/settings.py index d802652de..f32f07912 100644 --- a/src/cryptoadvance/specter/server_endpoints/settings.py +++ b/src/cryptoadvance/specter/server_endpoints/settings.py @@ -1,3 +1,4 @@ +import cryptography import json import logging import os @@ -18,6 +19,9 @@ from flask import current_app as app from flask import flash, jsonify, redirect, render_template, request, send_file, url_for from flask_babel import lazy_gettext as _ from flask_login import current_user, login_required +from cryptoadvance.specter.services.service import Service + +from cryptoadvance.specter.user import User, UserSecretException from ..helpers import ( get_loglevel, @@ -50,11 +54,11 @@ def settings(): def general(): current_version = notify_upgrade(app, flash) explorer_id = app.specter.explorer_id - explorer = "" fee_estimator = app.specter.fee_estimator fee_estimator_custom_url = app.specter.config.get("fee_estimator_custom_url", "") loglevel = get_loglevel(app) unit = app.specter.unit + services = app.specter.service_manager.services if request.method == "POST": action = request.form["action"] @@ -90,8 +94,12 @@ def general(): fee_estimator_custom_url = request.form["fee_estimator_custom_url"] unit = request.form["unit"] validate_merkleproof_bool = request.form.get("validatemerkleproof") == "on" - if current_user.is_admin: + active_services = [] + for service_name in services: + if request.form.get(f"service_{service_name}"): + active_services.append(service_name) + loglevel = request.form["loglevel"] if action == "save": @@ -110,6 +118,7 @@ def general(): app.specter.update_merkleproof_settings( validate_bool=validate_merkleproof_bool ) + app.specter.service_manager.set_active_services(active_services) app.specter.update_fee_estimator( fee_estimator=fee_estimator, custom_url=fee_estimator_custom_url, @@ -198,6 +207,7 @@ This may take a few hours to complete." return render_template( "settings/general_settings.jinja", + services=services, fee_estimator=fee_estimator, fee_estimator_custom_url=fee_estimator_custom_url, loglevel=loglevel, @@ -377,6 +387,9 @@ def tor(): @settings_endpoint.route("/auth", methods=["GET", "POST"]) @login_required def auth(): + # TODO: Simplify this endpoint. Separate out setting the Authentication mode from all + # the other options here: updating admin username/password, adding users, deleting + # users, etc. Do those in simple separate screens with their own endpoints. current_version = notify_upgrade(app, flash) auth = app.specter.config["auth"] method = auth["method"] @@ -403,6 +416,7 @@ def auth(): min_chars = int(auth["password_min_chars"]) if specter_username: + if current_user.username != specter_username: if app.specter.user_manager.get_user_by_username(specter_username): flash( @@ -418,8 +432,12 @@ def auth(): specter=app.specter, current_version=current_version, rand=rand, + has_service_encrypted_storage=app.specter.service_manager.user_has_encrypted_storage( + current_user + ), ) - current_user.username = specter_username + current_user.username = specter_username + if specter_password: if len(specter_password) < min_chars: flash( @@ -437,15 +455,20 @@ def auth(): specter=app.specter, current_version=current_version, rand=rand, + has_service_encrypted_storage=app.specter.service_manager.user_has_encrypted_storage( + current_user + ), ) current_user.set_password(specter_password) + current_user.save_info() + if current_user.is_admin: app.specter.update_auth(method, rate_limit, registration_link_timeout) if method in ["rpcpasswordaspin", "passwordonly", "usernamepassword"]: if method == "passwordonly": - new_password = request.form.get("specter_password_only") - if new_password and len(new_password) < min_chars: + specter_password = request.form.get("specter_password_only") + if specter_password and len(specter_password) < min_chars: flash( _( "Please enter a password of a least {} characters" @@ -461,14 +484,48 @@ def auth(): specter=app.specter, current_version=current_version, rand=rand, + has_service_encrypted_storage=app.specter.service_manager.user_has_encrypted_storage( + current_user + ), ) - elif not new_password: + elif not specter_password: # Set to the default - new_password = "admin" + specter_password = "admin" + + try: + current_user.set_password(specter_password) + except UserSecretException as e: + # Most likely the admin User is logged in but the + # plaintext_user_secret is not available in memory (happens + # when the server restarts). + logger.warn(e) + flash( + _( + "Error re-encrypting Service data. Log out and log back in before trying again." + ), + "error", + ) + return render_template( + "settings/auth_settings.jinja", + method=method, + rate_limit=rate_limit, + registration_link_timeout=registration_link_timeout, + users=users, + specter=app.specter, + current_version=current_version, + rand=rand, + has_service_encrypted_storage=app.specter.service_manager.user_has_encrypted_storage( + current_user + ), + ) - current_user.set_password(new_password) current_user.save_info() + flash( + _("Admin password successfully updated"), + "info", + ) + if method == "usernamepassword": users = [ user @@ -477,11 +534,22 @@ def auth(): ] else: users = None + app.config["LOGIN_DISABLED"] = False else: users = None app.config["LOGIN_DISABLED"] = True + # Cannot support Services if there's no password (admin was already + # warned about this in the UI). Remove User.services, clear the + # `user_secret`, and wipe the ServiceEncryptedStorage. + app.specter.service_manager.remove_all_services_from_user( + current_user + ) + + # Redirect if a URL was given via the next variable + if request.form.get("next") and request.form.get("next") != "": + return redirect(request.form.get("next")) app.specter.check() elif action == "adduser": @@ -536,6 +604,10 @@ def auth(): specter=app.specter, current_version=current_version, rand=rand, + has_service_encrypted_storage=app.specter.service_manager.user_has_encrypted_storage( + current_user + ), + next=request.args.get("next", ""), ) diff --git a/src/cryptoadvance/specter/server_endpoints/wallets.py b/src/cryptoadvance/specter/server_endpoints/wallets.py index cdd01e3e8..a1f85fb8c 100644 --- a/src/cryptoadvance/specter/server_endpoints/wallets.py +++ b/src/cryptoadvance/specter/server_endpoints/wallets.py @@ -6,13 +6,15 @@ from functools import wraps import requests from cryptoadvance.specter.util.psbt_creator import PsbtCreator from cryptoadvance.specter.util.wallet_importer import WalletImporter +from cryptoadvance.specter.wallet import Wallet from flask import Blueprint from flask import current_app as app from flask import flash, jsonify, redirect, render_template, request, url_for from flask_babel import lazy_gettext as _ from flask_login import login_required -from ..helpers import get_devices_with_keys_by_type +from ..helpers import bcur2base64, get_devices_with_keys_by_type, get_txid +from ..key import Key from ..managers.wallet_manager import purposes from ..persistence import delete_file from ..specter_error import SpecterError, handle_exception @@ -61,6 +63,7 @@ def wallets_overview(): "wallet/wallets_overview.jinja", specter=app.specter, rand=rand, + services=app.specter.service_manager.services, ) @@ -395,6 +398,7 @@ def history(wallet_alias): tx_list_type=tx_list_type, specter=app.specter, rand=rand, + services=app.specter.service_manager.services, ) @@ -405,7 +409,7 @@ def history(wallet_alias): @login_required @check_wallet def receive(wallet_alias): - wallet = app.specter.wallet_manager.get_by_alias(wallet_alias) + wallet: Wallet = app.specter.wallet_manager.get_by_alias(wallet_alias) if request.method == "POST": action = request.form["action"] if action == "newaddress": @@ -456,6 +460,7 @@ def send_new(wallet_alias): err = None ui_option = "ui" recipients_txt = "" + fillform = False subtract = False subtract_from = 1 fee_options = "dynamic" @@ -579,6 +584,13 @@ def send_new(wallet_alias): specter=app.specter, rand=rand, ) + elif action == "fillform": + # TODO: Not yet used. Remove if the use case doesn't happen. + # can be used to recommend a transaction from a service (goind to an exchange or so) + addresses = request.form.getlist("addresses[]") + labels = request.form.getlist("labels[]") + amounts = request.form.getlist("amounts[]") + fillform = True if rbf_tx_id: try: @@ -604,6 +616,10 @@ def send_new(wallet_alias): psbt=psbt, ui_option=ui_option, recipients_txt=recipients_txt, + addresses=addresses, + labels=labels, + amounts=amounts, + fillform=fillform, recipients=list(zip(addresses, amounts, amount_units, labels)), subtract=subtract, subtract_from=subtract_from, @@ -713,6 +729,7 @@ def addresses(wallet_alias): wallet=wallet, specter=app.specter, rand=rand, + services=app.specter.service_manager.services, ) diff --git a/src/cryptoadvance/specter/services/__init__.py b/src/cryptoadvance/specter/services/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/cryptoadvance/specter/services/bitcoinreserve/__init__.py b/src/cryptoadvance/specter/services/bitcoinreserve/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/cryptoadvance/specter/services/bitcoinreserve/controller.py b/src/cryptoadvance/specter/services/bitcoinreserve/controller.py new file mode 100644 index 000000000..38fd59195 --- /dev/null +++ b/src/cryptoadvance/specter/services/bitcoinreserve/controller.py @@ -0,0 +1,24 @@ +import logging +from flask import Flask, Response, redirect, render_template, request, url_for, flash +from flask_login import login_required + +from ..controller import user_secret_decrypted_required +from .service import BitcoinReserveService + + +""" + Empty placeholder just so the dummyservice/static folder can be wired up to retrieve its img +""" + +logger = logging.getLogger(__name__) + +bitcoinreserve_endpoint = BitcoinReserveService.blueprint + + +@bitcoinreserve_endpoint.route("/") +@login_required +@user_secret_decrypted_required +def index(): + return render_template( + "bitcoinreserve/index.jinja", + ) diff --git a/src/cryptoadvance/specter/services/bitcoinreserve/service.py b/src/cryptoadvance/specter/services/bitcoinreserve/service.py new file mode 100644 index 000000000..95bc23f4c --- /dev/null +++ b/src/cryptoadvance/specter/services/bitcoinreserve/service.py @@ -0,0 +1,14 @@ +from ..service import Service, devstatus_alpha + + +class BitcoinReserveService(Service): + id = "bitcoinreserve" + name = "Bitcoin Reserve" + icon = "img/bitcoinreserve_icon.svg" + logo = "img/bitcoinreserve_icon.svg" + desc = "Where Europe buys Bitcoin." + has_blueprint = True + devstatus = devstatus_alpha + + # TODO: As more Services are integrated, we'll want more robust categorization and sorting logic + sort_priority = 2 diff --git a/src/cryptoadvance/specter/services/bitcoinreserve/static/img/bitcoinreserve_icon.svg b/src/cryptoadvance/specter/services/bitcoinreserve/static/img/bitcoinreserve_icon.svg new file mode 100644 index 000000000..9cc126b0a --- /dev/null +++ b/src/cryptoadvance/specter/services/bitcoinreserve/static/img/bitcoinreserve_icon.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/src/cryptoadvance/specter/services/controller.py b/src/cryptoadvance/specter/services/controller.py new file mode 100644 index 000000000..50c92c99a --- /dev/null +++ b/src/cryptoadvance/specter/services/controller.py @@ -0,0 +1,84 @@ +import logging + +from flask import Blueprint, render_template, redirect, url_for, flash +from flask import current_app as app, request +from flask_babel import lazy_gettext as _ +from flask_login import current_user, login_required +from functools import wraps + +logger = logging.getLogger(__name__) + + +# This endpoint is just there to share templates between services. +services_endpoint = Blueprint( + "services_endpoint", __name__, template_folder="templates" +) + +# All blueprint from Services are no longer loaded statically but dynamically when the service-class in initialized +# check cryptoadvance.specter.services.service_manager.Service for doing that and +# check cryptoadvance.specter.services/**/manifest for instances of Service-classes and +# check cryptoadvance.specter.services.service_manager.ServiceManager.services for initialisation of ServiceClasses + + +def user_secret_decrypted_required(func): + @wraps(func) + def wrapper(*args, **kwargs): + if app.config["LOGIN_DISABLED"]: + # No logins means no password so no user_secret is possible + flash( + _( + "Service integration requires an authentication method that includes a password" + ) + ) + return redirect(url_for(f"settings_endpoint.auth")) + elif not current_user.is_user_secret_decrypted: + flash(_("Must login again to enable protected Services-related data")) + # Force re-login; automatically redirects back to calling page + return app.login_manager.unauthorized() + else: + return func(*args, **kwargs) + + return wrapper + + +@services_endpoint.route("/choose", methods=["GET"]) +def choose(): + return render_template( + "services/choose.jinja", + is_login_disabled=app.config["LOGIN_DISABLED"], + specter=app.specter, + services=app.specter.service_manager.services_sorted, + ) + + +@services_endpoint.route( + "/associate_addr//
", methods=["GET", "POST"] +) +@login_required +@user_secret_decrypted_required +def associate_addr(wallet_alias, address): + wallet = app.specter.wallet_manager.get_by_alias(wallet_alias) + + if request.method == "POST": + service_id = request.form["service_id"] + wallet = app.specter.wallet_manager.get_by_alias(wallet_alias) + service_cls = app.specter.service_manager.get_service(service_id) + service_cls.reserve_address(wallet=wallet, address=address) + return redirect( + url_for("wallets_endpoint.addresses", wallet_alias=wallet_alias) + ) + + addr_obj = wallet.get_address_obj(address=address) + + # Inject the User's active Services + services = [] + for service_id in current_user.services: + services.append(app.specter.service_manager.get_service(service_id=service_id)) + + return render_template( + "services/associate_addr.jinja", + specter=app.specter, + services=services, + wallet=wallet, + addr_obj=addr_obj, + ) diff --git a/src/cryptoadvance/specter/services/service.py b/src/cryptoadvance/specter/services/service.py new file mode 100644 index 000000000..cd81a3fa6 --- /dev/null +++ b/src/cryptoadvance/specter/services/service.py @@ -0,0 +1,181 @@ +import logging +import os +from importlib import import_module + +from flask import current_app as app +from flask.blueprints import Blueprint +from cryptoadvance.specter.wallet import Wallet +from flask_babel import lazy_gettext as _ +from typing import List + +from .service_encrypted_storage import ServiceEncryptedStorageManager +from .service_annotations_storage import ServiceAnnotationsStorage + +from cryptoadvance.specter.addresslist import Address + + +logger = logging.getLogger(__name__) + + +devstatus_alpha = "alpha" +devstatus_beta = "beta" +devstatus_prod = "prod" + + +class Service: + """A base class for Services""" + + # These should be overrided in implementation classes + id = None + name = None + icon = None + logo = None + desc = None # TODO: rename to "description" to be explicit + has_blueprint = True # the default + devstatus = devstatus_alpha + + def __init__(self, active, specter): + if not hasattr(self, "id"): + raise Exception(f"Service {self.__class__} needs ID") + if not hasattr(self, "name"): + raise Exception(f"Service {self.__class__} needs name") + self.active = active + self.specter = specter + if self.has_blueprint: + self.__class__.blueprint = Blueprint( + f"{self.id}_endpoint", + f"cryptoadvance.specter.services.{self.id}.service", # To Do: move to subfolder + template_folder="templates", + static_folder="static", + ) + + def inject_stuff(): + """Can be used in all jinja2 templates""" + return dict(specter=app.specter, service=self) + + self.__class__.blueprint.context_processor(inject_stuff) + # Import the controller for this service + import_module(f"cryptoadvance.specter.services.{self.id}.controller") + app.register_blueprint( + self.__class__.blueprint, url_prefix=f"/svc/{self.id}" + ) + + @classmethod + def set_current_user_service_data(cls, service_data: dict): + ServiceEncryptedStorageManager.get_instance().set_current_user_service_data( + service_id=cls.id, service_data=service_data + ) + + @classmethod + def update_current_user_service_data(cls, service_data: dict): + ServiceEncryptedStorageManager.get_instance().update_current_user_service_data( + service_id=cls.id, service_data=service_data + ) + + @classmethod + def get_current_user_service_data(cls) -> dict: + return ( + ServiceEncryptedStorageManager.get_instance().get_current_user_service_data( + service_id=cls.id + ) + ) + + @classmethod + def get_blueprint_name(cls): + return f"{cls.id}_endpoint" + + @classmethod + def default_address_label(cls): + # Have to str() it; can't pass a LazyString to json serializer + return str(_("Reserved for {}").format(cls.name)) + + @classmethod + def reserve_address(cls, wallet: Wallet, address: str, label: str = None): + # Mark an Address in a persistent way as being reserved by a Service + if not label: + label = cls.default_address_label() + wallet.associate_address_with_service( + address=address, service_id=cls.id, label=label + ) + + @classmethod + def reserve_addresses( + cls, + wallet: Wallet, + label: str = None, + num_addresses: int = 10, + annotations: dict = None, + ) -> List[str]: + """ + Reserve n unused addresses but leave a gap between each one so that this reserved + range never causes an address gap in the wallet (e.g. if you reserve ten in a + row it's possible that some wallet software will miss a new tx on the 11th + address). + + If `label` is not provided, we use Service.default_address_label(). + + Optional `annotations` data can be attached to each Address being reserved. + """ + # Track Service-related addresses in ServiceAnnotationsStorage + if annotations: + annotations_storage = ServiceAnnotationsStorage( + service_id=cls.id, wallet=wallet + ) + + addresses = [] + start_index = wallet.address_index + 1 + for i in range(start_index, start_index + (2 * num_addresses), 2): + address = wallet.get_address(i) + + # Mark an Address in a persistent way as being reserved by a Service + cls.reserve_address(wallet=wallet, address=address) + + addresses.append(address) + + if annotations: + annotations_storage.set_addr_annotations( + addr=address, annotations=annotations, autosave=False + ) + if annotations: + annotations_storage.save() + + return addresses + + @classmethod + def unreserve_addresses(cls, wallet: Wallet): + """ + Clear out Services-related data from any unused Addresses, but leave already-used + Addresses as-is. + """ + annotations_storage = ServiceAnnotationsStorage( + service_id=cls.id, wallet=wallet + ) + addrs = wallet.get_associated_addresses(service_id=cls.id, unused_only=True) + for addr_obj in addrs: + wallet.deassociate_address(addr_obj["address"]) + annotations_storage.remove_addr_annotations( + addr_obj.address, autosave=False + ) + annotations_storage.save() + + # def is_active(self): + # return self.active + + # def set_active(self, value): + # self.active = value + + @classmethod + def update(self): + """ + Called by backend periodic process to keep Service in sync with any remote + data (e.g. fetching the latest data from an external API). + """ + logger.info(f"update() not implemented / not necessary for Service {self.id}") + + """ *********************************************************************** + Update hooks + *********************************************************************** """ + + @classmethod + def on_user_login(cls): + pass diff --git a/src/cryptoadvance/specter/services/service_annotations_storage.py b/src/cryptoadvance/specter/services/service_annotations_storage.py new file mode 100644 index 000000000..45434a672 --- /dev/null +++ b/src/cryptoadvance/specter/services/service_annotations_storage.py @@ -0,0 +1,72 @@ +import os + +from cryptoadvance.specter.managers.genericdata_manager import GenericDataManager +from cryptoadvance.specter.wallet import Wallet + + +class ServiceAnnotationsStorage(GenericDataManager): + """ + Stores Service-specific annotations for addresses and txs. Each wallet + service + pairing will get its own _.json file. + + Annotations must be in a json-serializable dict, keyed on addr or tx: + { + "someaddress": { + "foo": 1, + "bar": "hello", + } + } + """ + + def __init__(self, service_id: str, wallet: Wallet): + # Must set these before calling parent's __init__() so that the data_file + # property will have the proper member vars. + self.service_id = service_id + self.wallet = wallet + + super().__init__(wallet.manager.data_folder) + + if "addrs" not in self.data: + self.data["addrs"] = {} + + if "txs" not in self.data: + self.data["txs"] = {} + + @property + def data_file(self): + # TODO: currently saving in the wallets/ dir but not in the main vs regtest subdir + return os.path.join( + self.wallet.manager.data_folder, + f"{self.wallet.alias}_{self.service_id}.json", + ) + + def save(self): + # Expose for external use + self._save() + + def set_addr_annotations(self, addr: str, annotations: dict, autosave: bool = True): + self.data["addrs"][addr] = annotations + if autosave: + self._save() + + def remove_addr_annotations(self, addr: str, autosave: bool = True): + self.data["addrs"].pop(addr, None) + if autosave: + self._save() + + def get_addr_annotations(self, addr: str): + return self.data["addrs"].get(addr, None) + + def get_all_addr_annotations(self): + return self.data["addrs"] + + def set_tx_annotations(self, txid: str, annotations: dict, autosave: bool = True): + self.data["txs"][txid] = annotations + if autosave: + self._save() + + def get_tx_annotations(self, txid: str): + return self.data["txs"].get(txid, None) + + def get_all_tx_annotations(self): + return self.data["txs"] diff --git a/src/cryptoadvance/specter/services/service_encrypted_storage.py b/src/cryptoadvance/specter/services/service_encrypted_storage.py new file mode 100644 index 000000000..5ce92073a --- /dev/null +++ b/src/cryptoadvance/specter/services/service_encrypted_storage.py @@ -0,0 +1,162 @@ +import json +import logging +import os + +from cryptoadvance.specter.managers.genericdata_manager import GenericDataManager +from cryptoadvance.specter.managers.singleton import ConfigurableSingleton +from cryptoadvance.specter.specter_error import SpecterError +from cryptoadvance.specter.user import User + +logger = logging.getLogger("__name__") + + +class ServiceEncryptedStorageError(Exception): + pass + + +class ServiceEncryptedStorage(GenericDataManager): + """ + Encrypted storage class for *ALL* Services-related secrets and config for a given user. + The json file is stored as: _services.json + + Each Service may specify its own json data format. + + Data is stored internally as a json string for easier encryption handling to disk. + + Note that this is storage is separate from the un-encrypted ServiceAnnotationsStorage. + This storage is meant for secrets that must be encrypted and any Service-related config + that the User might need to store (e.g. which Wallet is attached to the Service). This + config data doesn't need to be encrypted, but we may as well store it here rather than + adding data bloat to the User json. + + * `disable_decrypt`: Allows the ServiceEncryptedStorageManager to see which Services + have data but without attempting to decrypt the values. This allows us to check + if there is encrypted Service data even when we don't have the + plaintext_user_secret. + """ + + def __init__(self, data_folder: str, user: User, disable_decrypt: bool = False): + if not user.plaintext_user_secret and not disable_decrypt: + raise ServiceEncryptedStorageError( + f"User {user} must be authenticated with password before encrypted service data can be loaded" + ) + + # Must set the user before calling the parent's __init__(); it calls load() + # which then calls data_file below. + self.user = user + + if disable_decrypt: + super().__init__(data_folder, encryption_key=None) + else: + super().__init__(data_folder, encryption_key=user.plaintext_user_secret) + + @property + def encrypted_fields(self): + """We override the class member to force ALL data fields to be considered + encrypted.""" + fields = list(self.data.keys()) + if "encrypted_storage_version" in fields: + fields.pop(fields.index("encrypted_storage_version")) + return fields + + @property + def data_file(self): + return os.path.join(self.data_folder, f"{self.user.username}_services.json") + + def set_service_data(self, service_id: str, data: dict, autosave: bool = True): + """Store the api_data json blob as a string; completely overwrites previous state""" + if data == {} and service_id in self.data: + del self.data[service_id] + else: + self.data[service_id] = json.dumps(data) + if autosave: + self._save() + + def update_service_data(self, service_id: str, data: dict, autosave: bool = True): + if data == {}: + logger.debug("This is a nonsense no-op") + return + + # Add or update fields; does not remove existing fields + if service_id not in self.data: + # Initialize a blank entry + cur_data = {} + else: + cur_data = json.loads(self.data[service_id]) + cur_data.update(data) + self.data[service_id] = json.dumps(cur_data) + if autosave: + self._save() + + def get_service_data(self, service_id: str) -> dict: + service_data = self.data.get(service_id, None) + if service_data: + # Convert string back into json blob + service_data = json.loads(service_data) + else: + service_data = {} + return service_data + + +class ServiceEncryptedStorageManager(ConfigurableSingleton): + """Singleton that manages access to users' ServiceApiKeyStorage; context-aware so it + knows who the current_user is for the given request context. + + Requires a one-time configuration call on startup in the ServiceManager. + """ + + @classmethod + def configure_instance(cls, data_folder, user_manager): + super().configure_instance() + cls._instance.data_folder = data_folder + cls._instance.user_manager = user_manager + cls._instance.storage_by_user = {} + + def get_raw_encrypted_data(self, user: User) -> dict: + """Doesn't attempt to decrypt the ServiceEncryptedStorage, just returns the + user's full encrypted Service data json as-is.""" + return ServiceEncryptedStorage( + self.data_folder, user, disable_decrypt=True + ).data + + def _get_current_user_service_storage(self) -> ServiceEncryptedStorage: + """Returns the storage-class for the current_user. Lazy_init if necessary""" + user = self.user_manager.get_user() + + if user not in self.storage_by_user: + self.storage_by_user[user] = ServiceEncryptedStorage(self.data_folder, user) + return self.storage_by_user[user] + + def set_current_user_service_data(self, service_id: str, service_data: dict): + self._get_current_user_service_storage().set_service_data( + service_id, service_data + ) + + def update_current_user_service_data(self, service_id: str, service_data: dict): + # Add or update fields; does not remove existing fields + self._get_current_user_service_storage().update_service_data( + service_id, service_data + ) + + def get_current_user_service_data(self, service_id: str) -> dict: + service_storage = self._get_current_user_service_storage() + if service_storage: + return service_storage.get_service_data(service_id) + + def unload_current_user(self): + """Clear user's ServiceEncryptedStorage from memory (but it remains safely on disk)""" + user = self.user_manager.get_user() + if user and user in self.storage_by_user: + self.storage_by_user[user] = None + + def delete_all_service_data(self, user: User): + """Completely removes all data in the User's ServiceEncryptedStorage from memory and on-disk.""" + # Clear it from memory... + self.storage_by_user.pop(user, None) + + # ...and wipe the on-disk storage + encrypted_storage = ServiceEncryptedStorage( + self.data_folder, user, disable_decrypt=True + ) + encrypted_storage.data = {} + encrypted_storage._save() diff --git a/src/cryptoadvance/specter/services/service_manager.py b/src/cryptoadvance/specter/services/service_manager.py new file mode 100644 index 000000000..529909d42 --- /dev/null +++ b/src/cryptoadvance/specter/services/service_manager.py @@ -0,0 +1,162 @@ +import json +import logging +import os + +from flask import current_app as app, url_for +from flask.blueprints import Blueprint +from importlib import import_module +from inspect import isclass +from pathlib import Path +from pkgutil import iter_modules +from typing import Dict, List +from cryptoadvance.specter.user import User + +from cryptoadvance.specter.managers.singleton import ConfigurableSingletonException +from ..util.reflection import get_subclasses_for_class + +from .service import Service +from .service_encrypted_storage import ServiceEncryptedStorageManager + +logger = logging.getLogger(__name__) + + +class ServiceManager: + """Loads support for all Services it auto-discovers.""" + + def __init__(self, specter, devstatus_threshold): + self.specter = specter + self.devstatus_threshold = devstatus_threshold + + # Each Service class is stored here, keyed on its Service.id str + self._services: Dict[str, Service] = {} + logger.info("----> starting service discovery <----") + for clazz in get_subclasses_for_class(Service): + compare_map = {"alpha": 1, "beta": 2, "prod": 3} + if compare_map[self.devstatus_threshold] <= compare_map[clazz.devstatus]: + # First configure the service + self.configure_service_for_module(clazz.id) + # Now activate it + self._services[clazz.id] = clazz( + active=clazz.id in self.specter.config.get("services", []), + specter=self.specter, + ) + logger.info(f"Service {clazz.__name__} activated ({clazz.devstatus})") + else: + logger.info( + f"Service {clazz.__name__} not activated due to devstatus ( {self.devstatus_threshold} > {clazz.devstatus} )" + ) + + # Configure and instantiate the one and only ServiceEncryptedStorageManager + try: + ServiceEncryptedStorageManager.configure_instance( + specter.data_folder, specter.user_manager + ) + except ConfigurableSingletonException as e: + # Test suite triggers multiple calls; ignore for now. + pass + logger.info("----> finished service discovery <----") + + @classmethod + def configure_service_for_module(cls, service_id): + """searches for ConfigClasses in the module-Directory and merges its config in the global config""" + try: + module = import_module( + f"cryptoadvance.specter.services.{service_id}.config" + ) + except ModuleNotFoundError: + logger.warning( + f"Service {service_id} does not have a service Configuration! Skipping!" + ) + return + main_config_clazz_name = app.config.get("SPECTER_CONFIGURATION_CLASS_FULLNAME") + main_config_clazz_slug = main_config_clazz_name.split(".")[-1] + potential_config_classes = [] + for attribute_name in dir(module): + attribute = getattr(module, attribute_name) + if isclass(attribute): + clazz = attribute + potential_config_classes.append(clazz) + if clazz.__name__.endswith( + main_config_clazz_slug + ): # e.g. BaseConfig or DevelopmentConfig + cls.import_config(clazz) + return + + logger.warning( + f"Could not find a configuration for Service {module} ... trying parent-classes of main-config" + ) + config_module = import_module(".".join(main_config_clazz_name.split(".")[0:-1])) + + config_clazz = getattr(config_module, main_config_clazz_slug) + config_candidate_class = config_clazz.__bases__[0] + while config_candidate_class != object: + for clazz in potential_config_classes: + if clazz.__name__.endswith(config_candidate_class.__name__): + cls.import_config(clazz) + return + config_candidate_class = config_candidate_class.__bases__[0] + + @classmethod + def import_config(cls, clazz): + logger.info(f"Loading Service-specific configuration from {clazz}") + for key in dir(clazz): + if key.isupper(): + if app.config.get(key): + raise Exception( + f"Config {clazz} tries to override existing key {key}" + ) + app.config[key] = getattr(clazz, key) + logger.debug(f"setting {key} = {app.config[key]}") + + @property + def services(self) -> Dict[str, Service]: + return self._services + + @property + def services_sorted(self): + service_names = sorted( + self._services, key=lambda s: self._services[s].sort_priority + ) + return [self._services[s] for s in service_names] + + def user_has_encrypted_storage(self, user: User) -> bool: + """Looks for any data for any service in the User's ServiceEncryptedStorage. + This check works even if the user doesn't have their plaintext_user_secret + available.""" + encrypted_data = ( + ServiceEncryptedStorageManager.get_instance().get_raw_encrypted_data(user) + ) + print(f"encrypted_data: {encrypted_data} for {user}") + return encrypted_data != {} + + def set_active_services(self, service_names_active): + logger.debug(f"Setting these services active: {service_names_active}") + self.specter.update_services(service_names_active) + for _, service in self.services.items(): + logger.debug( + f"Setting service '{service.id}' active to {service.id in service_names_active}" + ) + service.active = service.id in service_names_active + + def get_service(self, service_id: str) -> Service: + if service_id not in self._services: + # TODO: better error handling? + raise Exception(f"No such Service: '{service_id}'") + return self._services[service_id] + + def remove_all_services_from_user(self, user: User): + """ + Clears User.services and `user_secret`; wipes the User's + ServiceEncryptedStorage. + """ + # Don't show any Services on the sidebar for the admin user + user.services.clear() + + # Reset as if we never had any encrypted storage + user.delete_user_secret(autosave=False) + user.save_info() + + if self.user_has_encrypted_storage(user=user): + # Encrypted Service data is now orphaned since there is no + # password. So wipe it from the disk. + ServiceEncryptedStorageManager.get_instance().delete_all_service_data(user) diff --git a/src/cryptoadvance/specter/services/swan/__init__.py b/src/cryptoadvance/specter/services/swan/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/cryptoadvance/specter/services/swan/client.py b/src/cryptoadvance/specter/services/swan/client.py new file mode 100644 index 000000000..51d03e44d --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/client.py @@ -0,0 +1,514 @@ +import base64 +import datetime +import hashlib +import json +import logging +import pytz +import requests +import secrets + +from decimal import Decimal +from flask import current_app as app +from flask_babel import lazy_gettext as _ +from typing import List + +from cryptoadvance.specter.wallet import Wallet + +from .service import SwanService + + +logger = logging.getLogger(__name__) + + +# TODO: Update with prod values +client_id = "specter-dev" +client_secret = "BcetcVcmueWf5P3UPJnHhCBMQ49p38fhzYwM7t3DJGzsXSjm89dDR5URE46SY69j" +code_verifier = "64fRjTuy6SKqdC1wSoInUNxX65dQUhVVKTqZXuQ7dqw" +api_url = app.config.get("SWAN_API_URL") + + +class SwanApiException(Exception): + pass + + +class SwanApiRefreshTokenException(SwanApiException): + pass + + +def get_oauth2_start_url(): + """ + Set up the Swan API integration by requesting our initial access_token and + refresh_token. + """ + # Let's start the PKCE-flow + global code_verifier + + if code_verifier is None: + code_verifier = secrets.token_urlsafe(43) + # see specification: https://datatracker.ietf.org/doc/html/rfc7636#section-4.2 + # and example impl: https://github.com/RomeoDespres/pkce/blob/master/pkce/__init__.py#L94-L96 + hashed = hashlib.sha256(code_verifier.encode("ascii")).digest() + encoded = base64.urlsafe_b64encode(hashed) + code_challenge = encoded.decode("ascii")[:-1] + + flow_url = f"{api_url}/oidc/auth?" + query_params = [ + "client_id=specter-dev", + "redirect_uri=http://localhost:25441/svc/swan/oauth2/callback", # TODO: Will localhost work in all usage contexts (e.g. standalone app)? + "response_type=code", + "response_mode=query", + f"code_challenge={code_challenge}", + "code_challenge_method=S256", + "state=kjkmdskdmsmmsmdslmdlsm", + "scope=offline_access v1 write:vendor_wallet read:vendor_wallet write:automatic_withdrawal read:automatic_withdrawal", + "prompt=consent", + ] + flow_url += "&".join(query_params) + + return flow_url + + +def get_access_token(code: str = None, code_verifier: str = None): + """ + If code and code_verifier are specified, this is our initial request for an + access_token and, more importantly, the refresh_token. + + If code is None, use the refresh_token to get a new short-lived access_token. + + If we don't have the refresh_token, raise SwanApiRefreshTokenException. + """ + if code: + # Requesting initial refresh_token and access_token + payload = { + "client_id": "specter-dev", + "client_secret": client_secret, + "code_verifier": code_verifier, + "grant_type": "authorization_code", + "code": code, + } + auth_header = None + else: + service_data = SwanService.get_current_user_service_data() + if SwanService.is_access_token_valid(): + return service_data[SwanService.ACCESS_TOKEN] + + # Use the refresh_token to get a new access_token + if SwanService.REFRESH_TOKEN not in service_data: + raise SwanApiRefreshTokenException( + "access_token is expired but we don't have a refresh_token" + ) + + payload = { + "grant_type": "refresh_token", + # "redirect_uri": # Necessary? + "refresh_token": service_data[SwanService.REFRESH_TOKEN], + "scope": "offline_access v1 write:vendor_wallet read:vendor_wallet write:automatic_withdrawal read:automatic_withdrawal", + } + + auth_hash = base64.b64encode(f"{client_id}:{client_secret}".encode()).decode() + auth_header = { + "Authorization": f"Basic {auth_hash}", + } + logger.debug(f"auth_hash: {auth_hash}") + logger.debug("Using the refresh_token to request an access_token") + logger.debug(f"payload: {json.dumps(payload, indent=4)}") + + logger.debug(payload) + logger.debug(auth_header) + + response = requests.post( + f"{api_url}/oidc/token", + data=payload, + headers=auth_header, + ) + logger.debug(f"api_url: {api_url}") + logger.debug(response) + logger.debug(response.text) + resp = json.loads(response.text) + """ + { + "access_token": "***************", + "expires_in": 3600, + "refresh_token": "***************", + "scope": "offline_access v1 write:vendor_wallet read:vendor_wallet write:automatic_withdrawal read:automatic_withdrawal", + "token_type": "Bearer" + } + """ + # TODO: Remove debugging + logger.debug(json.dumps(resp, indent=4)) + if resp.get("access_token"): + new_api_data = { + SwanService.ACCESS_TOKEN: resp["access_token"], + SwanService.ACCESS_TOKEN_EXPIRES: ( + datetime.datetime.now(tz=pytz.utc) + + datetime.timedelta(seconds=resp["expires_in"]) + ).timestamp(), + } + if "refresh_token" in resp: + new_api_data[SwanService.REFRESH_TOKEN] = resp["refresh_token"] + + SwanService.update_current_user_service_data(new_api_data) + + # TODO: Remove debugging + logger.debug( + f"service_data: {json.dumps(SwanService.get_current_user_service_data(), indent=4)}" + ) + return resp["access_token"] + else: + logger.warning(response) + raise SwanApiException(response.text) + + +def handle_oauth2_auth_callback(request): + code = request.args.get("code") + logger.debug(f"request.args: {request.args}") + logger.debug(f"looks good, we got a code: {code}") + get_access_token(code=code, code_verifier=code_verifier) + + +def authenticated_request( + endpoint: str, method: str = "GET", json_payload: dict = {} +) -> dict: + logger.debug(f"{method} endpoint: {endpoint}") + + access_token = get_access_token() + + auth_header = { + "Authorization": f"Bearer {access_token}", + } + try: + if method == "GET": + response = requests.get(api_url + endpoint, headers=auth_header) + elif method in ["POST", "PATCH", "PUT", "DELETE"]: + response = requests.request( + method=method, + url=api_url + endpoint, + headers=auth_header, + json=json_payload, + ) + if response.status_code != 200: + raise SwanApiException(f"{response.status_code}: {response.text}") + return response.json() + except Exception as e: + # TODO: tighten up expected Exceptions + logger.exception(e) + logger.error( + f"endpoint: {endpoint} | method: {method} | payload: {json.dumps(json_payload, indent=4)}" + ) + logger.error(f"{response.status_code}: {response.text}") + raise e + + +def get_autowithdrawal_addresses(swan_wallet_id: str = None) -> dict: + """ + { + "entity": "wallet", + "item": { + "id": "c47e1e83-90a0-45da-ae25-6a0d324b9f29", + "isConfirmed": false, + "displayName": "Specter autowithdrawal to SeedSigner demo", + "metadata": { + "oidc": { + "clientId": "specter-dev" + }, + "specter_wallet_alias": "seedsigner_demo" + }, + "btcAddresses": [] + } + } + """ + if not swan_wallet_id: + swan_wallet_id = SwanService.get_current_user_service_data().get( + SwanService.SWAN_WALLET_ID + ) + + resp = authenticated_request( + endpoint=f"/apps/v20210824/wallets/{swan_wallet_id}?full=true", + method="GET", + ) + + logger.debug(json.dumps(resp, indent=4)) + return resp + + +def update_autowithdrawal_addresses( + specter_wallet_name: str, specter_wallet_alias: str, addresses: List[str] +) -> dict: + """ + * If SWAN_WALLET_ID is known, any existing unused addresses are cleared. + * If there is no known SWAN_WALLET_ID, we `POST` to create an initial Swan wallet and store the resulting SWAN_WALLET_ID. + * Sends the list of new addresses for SWAN_WALLET_ID. + """ + swan_wallet_id = SwanService.get_current_user_service_data().get( + SwanService.SWAN_WALLET_ID + ) + + if swan_wallet_id: + # We already have a Swan walletId. DELETE the existing unused addresses... + delete_autowithdrawal_addresses(swan_wallet_id) + + # ...and then append the new ones. + endpoint = f"/apps/v20210824/wallets/{swan_wallet_id}/addresses" + method = "PATCH" + else: + # We don't yet have a Swan walletId. POST to create one. + endpoint = "/apps/v20210824/wallets" + method = "POST" + + resp = authenticated_request( + endpoint=endpoint, + method=method, + json_payload={ + "btcAddresses": [{"address": addr} for addr in addresses], + "displayName": str( + _('Specter Desktop "{}"').format(specter_wallet_name) + ), # Can't pass a LazyString into json + "metadata": { + "specter_wallet_alias": specter_wallet_alias, + }, + }, + ) + + """ + Response should include wallet ("item") details: + { + "entity": "wallet", + "item": { + "id": "c47e1e83-90a0-45da-ae25-6a0d324b9f29", + "isConfirmed": false, + "displayName": "Specter autowithdrawal to SeedSigner demo", + "metadata": { + "oidc": { + "clientId": "specter-dev" + }, + "specter_wallet_alias": "seedsigner_demo" + }, + "btcAddresses": [] + } + } + """ + logger.debug(json.dumps(resp, indent=4)) + + if "item" in resp and "id" in resp["item"]: + if resp["item"]["id"] != swan_wallet_id: + swan_wallet_id = resp["item"]["id"] + + # Save the swan_wallet_id in the user's persistent Service settings + logger.debug(f"Updating the Swan wallet id to {swan_wallet_id}") + SwanService.update_current_user_service_data( + {SwanService.SWAN_WALLET_ID: swan_wallet_id} + ) + else: + raise SwanApiException( + f"No 'id' returned for the new/updated wallet: {json.dumps(resp, indent=4)}" + ) + + +def delete_autowithdrawal_addresses(swan_wallet_id: str): + """ + Deletes all unused autowithdrawal addresses from the specified SWAN_WALLET_ID + """ + resp = authenticated_request( + endpoint=f"/apps/v20210824/wallets/{swan_wallet_id}/addresses", + method="DELETE", + ) + logger.debug(json.dumps(resp, indent=4)) + return resp + + +def get_autowithdrawal_info() -> dict: + """ + See note in set_autowithdrawal. This returns all autowithdrawal objs from the Swan + side. + """ + resp = authenticated_request( + endpoint="/apps/v20210824/automatic-withdrawal", + method="GET", + ) + logger.debug(json.dumps(resp, indent=4)) + return resp + + +def set_autowithdrawal(btc_threshold: Decimal) -> dict: + """ + 0 == Weekly; other float values = BTC threshold + + The Swan api generates a new autowithdrawal id each time but there is no support to + update an existing autowithdrawal, other than activating or deactivating it. + + New autowithdrawals are initialized as `isActive: false` and require the user to + complete a Swan-side email verification step. + + We save the resulting autowithdrawal_id even though it isn't clear at the moment if + it's desirable to ever call the `deactivate/` or `activate/` endpoints. + """ + service_data = SwanService.get_current_user_service_data() + swan_wallet_id = service_data.get(SwanService.SWAN_WALLET_ID) + + endpoint = "/apps/v20210824/automatic-withdrawal" + method = "POST" + resp = authenticated_request( + endpoint=endpoint, + method=method, + json_payload={ + "walletId": swan_wallet_id, + "minBtcThreshold": btc_threshold, + }, + ) + logger.debug(json.dumps(resp, indent=4)) + + """ + { + "entity": "automaticWithdrawal", + "item": { + "id": "******************", + "minBtcThreshold": "0.01", + "isActive": false, + "isCanceled": false, + "createdAt": "2022-01-07T02:14:56.070Z", + "walletId": "******************", + "walletAddressId": null + } + } + """ + if "item" in resp and "id" in resp["item"]: + autowithdrawal_id = resp["item"]["id"] + if autowithdrawal_id != service_data.get(SwanService.AUTOWITHDRAWAL_ID): + SwanService.update_current_user_service_data( + { + SwanService.AUTOWITHDRAWAL_ID: autowithdrawal_id, + } + ) + else: + raise SwanApiException( + f"No 'id' returned for the new/updated autowithdrawal: {json.dumps(resp, indent=4)}" + ) + + return resp + + +def activate_autowithdrawal() -> dict: + """ + Activates the autowithdrawal specified in SwanService.AUTOWITHDRAWAL_ID. + + If the automatic withdrawal was just created, this will generate a 400 error: + "Cannot activate an automatic withdrawal before withdrawal address is confirmed". + + The user must first confirm the first withdrawal addr via Swan-side email flow. + After they confirm, the autowithdrawal should then return `isActive: true`. + + NOT CURRENTLY USED; remove if we don't ever enable disable/activate flows. + """ + service_data = SwanService.get_current_user_service_data() + autowithdrawal_id = service_data.get(SwanService.AUTOWITHDRAWAL_ID) + if not autowithdrawal_id: + raise SwanApiException( + f"AUTOWITHDRAWAL_ID ({SwanService.AUTOWITHDRAWAL_ID}) not found in service data" + ) + + endpoint = f"/apps/v20210824/automatic-withdrawal/{autowithdrawal_id}/activate" + method = "POST" + resp = authenticated_request( + endpoint=endpoint, + method=method, + ) + logger.debug(json.dumps(resp, indent=4)) + + """ + { + "entity": "automaticWithdrawal", + "item": { + "id": "******************", + "minBtcThreshold": "0.01", + "isActive": true, + "isCanceled": false, + "createdAt": "2022-01-07T02:14:56.070Z", + "walletId": "******************", + "walletAddressId": null + } + } + """ + if "item" in resp and "id" in resp["item"]: + if resp["item"]["id"] != service_data[SwanService.AUTOWITHDRAWAL_ID]: + autowithdrawal_id = resp["item"]["id"] + else: + raise SwanApiException( + f"No 'id' returned for the new/updated autowithdrawal: {json.dumps(resp, indent=4)}" + ) + + return resp + + +def get_wallet_details(swan_wallet_id: str) -> dict: + """ + { + "entity": "wallet", + "item": { + "id": "********", + "isConfirmed": false, + "displayName": "Specter autowithdrawal to SeedSigner demo", + "metadata": { + "oidc": { + "clientId": "specter-dev" + }, + "specter_wallet_alias": "seedsigner_demo" + }, + "btcAddresses": [] + } + } + """ + resp = authenticated_request( + endpoint=f"/apps/v20210824/wallets/{swan_wallet_id}", + method="GET", + ) + + logger.debug(json.dumps(resp, indent=4)) + return resp + + +def get_wallets() -> dict: + """ + Return all Swan wallet entries. Should only be one per Specter-Swan user combo (but can be more due + to testing/debugging, calling `/wallets` POST more than once, etc.) + """ + resp = authenticated_request( + endpoint=f"/apps/v20210824/wallets", + method="GET", + ) + """ + { + "entity": "wallet", + "list": [ + { + "id": "**********", + "walletAddressId": "**********", + "btcAddress": "bc1q**********", + "isConfirmed": false, + "displayName": "Specter Desktop \"SeedSigner demo\"", + "metadata": { + "oidc": { + "clientId": "specter-dev" + }, + "specter_wallet_alias": "seedsigner_demo" + } + }, + { + "id": "**********", + "walletAddressId": "**********", + "btcAddress": "bc1q**********", + "isConfirmed": false, + "displayName": "Specter Desktop \"DCA Corn\"", + "metadata": { + "oidc": { + "clientId": "specter-dev" + }, + "specter_wallet_alias": "dca_corn_2" + } + }, + ..., + ] + } + """ + logger.debug(json.dumps(resp, indent=4)) + + return resp diff --git a/src/cryptoadvance/specter/services/swan/config.py b/src/cryptoadvance/specter/services/swan/config.py new file mode 100644 index 000000000..60b28d80e --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/config.py @@ -0,0 +1,6 @@ +class BaseConfig: + SWAN_API_URL = "https://dev-api.swanbitcoin.com" + + +class ProductionConfig(BaseConfig): + SWAN_API_URL = "https://api.swanbitcoin.com" diff --git a/src/cryptoadvance/specter/services/swan/controller.py b/src/cryptoadvance/specter/services/swan/controller.py new file mode 100644 index 000000000..66400195a --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/controller.py @@ -0,0 +1,223 @@ +import json +import logging + +from decimal import Decimal +from flask import redirect, render_template, request, url_for, flash +from flask import current_app as app +from flask_babel import lazy_gettext as _ +from flask_login import current_user, login_required +from functools import wraps +from cryptoadvance.specter.user import User +from cryptoadvance.specter.wallet import Wallet + +from cryptoadvance.specter.services.service_encrypted_storage import ( + ServiceEncryptedStorageError, +) +from . import client as swan_client +from .client import SwanApiException +from .service import SwanService +from ..controller import user_secret_decrypted_required + + +logger = logging.getLogger(__name__) + +swan_endpoint = SwanService.blueprint + + +def refreshtoken_required(func): + """Refresh token needed for any endpoint that interacts with Swan API""" + + @wraps(func) + def wrapper(*args, **kwargs): + try: + if not SwanService.has_refresh_token(): + logger.debug(f"No refresh token, redirecting to relink Swan account") + return redirect( + url_for(f"{SwanService.get_blueprint_name()}.oauth2_start") + ) + except ServiceEncryptedStorageError as e: + logger.debug(repr(e)) + flash("Re-login required to access your protected services data") + + # Use Flask's built-in re-login w/automatic redirect back to calling page + return app.login_manager.unauthorized() + return func(*args, **kwargs) + + return wrapper + + +@swan_endpoint.route("/") +@login_required +@user_secret_decrypted_required +def index(): + if SwanService.has_refresh_token(): + # User has already completed Swan integration; skip ahead + return redirect(url_for(f"{SwanService.get_blueprint_name()}.withdrawals")) + return render_template( + "swan/index.jinja", + ) + + +@swan_endpoint.route("/withdrawals") +@login_required +@refreshtoken_required +def withdrawals(): + # The wallet currently configured for ongoing autowithdrawals + wallet: Wallet = SwanService.get_associated_wallet() + + return render_template( + "swan/withdrawals.jinja", + # txlist=swan_txs, + wallet=wallet, + services=app.specter.service_manager.services, + swan_id=SwanService.id, + autowithdrawal_threshold=SwanService.get_current_user_service_data().get( + SwanService.AUTOWITHDRAWAL_THRESHOLD + ), + ) + + +@swan_endpoint.route("/settings", methods=["GET"]) +@login_required +@refreshtoken_required +def settings(): + associated_wallet: Wallet = SwanService.get_associated_wallet() + + # Get the user's Wallet objs, sorted by Wallet.name + wallet_names = sorted(current_user.wallet_manager.wallets.keys()) + wallets = [current_user.wallet_manager.wallets[name] for name in wallet_names] + + return render_template( + "swan/settings.jinja", + associated_wallet=associated_wallet, + wallets=wallets, + cookies=request.cookies, + num_reserved_addrs=SwanService.MIN_PENDING_AUTOWITHDRAWAL_ADDRS, + ) + + +@swan_endpoint.route("/settings/autowithdrawal", methods=["POST"]) +@login_required +@refreshtoken_required +def update_autowithdrawal(): + threshold = request.form["threshold"] + destination_wallet_alias = request.form["destination_wallet"] + wallet = current_user.wallet_manager.get_by_alias(destination_wallet_alias) + + try: + SwanService.set_autowithdrawal_settings(wallet=wallet, btc_threshold=threshold) + return redirect(url_for(f"{SwanService.get_blueprint_name()}.withdrawals")) + except SwanApiException as e: + logger.exception(e) + flash(_("Error communicating with Swan API")) + return redirect(url_for(f"{SwanService.get_blueprint_name()}.settings")) + + +""" *************************************************************************** + OAuth2 endpoints +*************************************************************************** """ + + +@swan_endpoint.route("/oauth2/start") +@login_required +@user_secret_decrypted_required +def oauth2_start(): + """ + Set up the Swan API integration by requesting our initial access_token and + refresh_token. + """ + # Do we have a token already? + if SwanService.has_refresh_token(): + return redirect(url_for(f"{SwanService.get_blueprint_name()}.settings")) + + # Let's start the PKCE-flow + flow_url = swan_client.get_oauth2_start_url() + + return render_template( + "swan/oauth2_start.jinja", + flow_url=flow_url, + ) + + +""" + Note: the callback from Swan will be treated by Flask as an AnonymousUserMixin request + but we need the user logged in and their user_secret decrypted. So we must require + @login_required here which will interrupt the return flow with the login prompt. +""" + + +@swan_endpoint.route("/oauth2/callback") +@login_required +def oauth2_auth(): + if request.args.get("error"): + logger.error( + f"OAuth2 flow error: {request.args.get('error')}, {request.args.get('error_description')}" + ) + return render_template( + "500.jinja", + error=request.args.get("error"), + traceback=request.args.get( + "error_description" + ), # Slightly misusing the traceback field + ) + + user: User = app.specter.user_manager.get_user() + error = None + + try: + swan_client.handle_oauth2_auth_callback(request) + except swan_client.SwanApiException as e: + logger.exception(e) + error = e + + if not error: + try: + # Add the Service to the User's profile (will now appear in sidebar) + user = app.specter.user_manager.get_user() + user.add_service(SwanService.id) + + # Sync this Specter instance with any previous Swan-Specter integrations + SwanService.sync_swan_data() + + service_data = SwanService.get_current_user_service_data() + if service_data.get(SwanService.SPECTER_WALLET_ALIAS): + # We've re-synced with an existing auto-withdrawal setup. Redirect + # straight to the auto-withdrawals page. + return redirect( + url_for(f"{SwanService.get_blueprint_name()}.withdrawals") + ) + + return redirect(url_for(".oauth2_success")) + except Exception as e: + logger.exception(e) + error = e + + return render_template( + "error.html", + response=None, + error=str(error), + error_description=None, + cookies=request.cookies, + ) + + +@swan_endpoint.route("/oauth2/success") +def oauth2_success(): + """ + The redirect from the oauth2 callback has to land on an endpoint that does not + have the @login_required filter set. Once we're back we can proceed to login- + protected pages as usual. + """ + return render_template( + "swan/oauth2_success.jinja", + ) + + +@swan_endpoint.route("/oauth2/delete-token", methods=["POST"]) +@login_required +@refreshtoken_required +def oauth2_delete_token(): + SwanService.remove_swan_integration(current_user) + + url = url_for(f"{SwanService.get_blueprint_name()}.index") + return redirect(url_for(f"{SwanService.get_blueprint_name()}.index")) diff --git a/src/cryptoadvance/specter/services/swan/service.py b/src/cryptoadvance/specter/services/swan/service.py new file mode 100644 index 000000000..e5946ca69 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/service.py @@ -0,0 +1,397 @@ +import datetime +import json +import logging +import pytz + +from flask import current_app as app +from flask_babel import lazy_gettext as _ +from typing import List + +from cryptoadvance.specter.user import User + +from ..service import Service, devstatus_beta +from cryptoadvance.specter.addresslist import Address +from cryptoadvance.specter.wallet import Wallet + +logger = logging.getLogger(__name__) + + +class SwanService(Service): + id = "swan" + name = "Swan" + icon = "img/swan_icon.svg" + logo = "img/swan_logo.svg" + desc = "Auto-withdraw to your Specter wallet" + has_blueprint = True + devstatus = devstatus_beta + + # TODO: As more Services are integrated, we'll want more robust categorization and sorting logic + sort_priority = 1 + + # Service-specific constants + MIN_PENDING_AUTOWITHDRAWAL_ADDRS = 10 + + # ServiceEncryptedStorage field names for Swan + SPECTER_WALLET_ALIAS = "wallet" + SWAN_WALLET_ID = "swan_wallet_id" + ACCESS_TOKEN = "access_token" + ACCESS_TOKEN_EXPIRES = "expires" + REFRESH_TOKEN = "refresh_token" + AUTOWITHDRAWAL_ID = "autowithdrawal_id" + AUTOWITHDRAWAL_THRESHOLD = "withdrawal_threshold" + + @classmethod + def is_access_token_valid(cls): + service_data = cls.get_current_user_service_data() + if not service_data or not service_data.get(cls.ACCESS_TOKEN_EXPIRES): + return False + return ( + service_data[cls.ACCESS_TOKEN_EXPIRES] + > datetime.datetime.now(tz=pytz.utc).timestamp() + ) + + @classmethod + def has_refresh_token(cls): + return cls.REFRESH_TOKEN in cls.get_current_user_service_data() + + @classmethod + def get_associated_wallet(cls) -> Wallet: + """Get the Specter `Wallet` that is currently associated with Swan auto-withdrawals""" + service_data = cls.get_current_user_service_data() + if not service_data or cls.SPECTER_WALLET_ALIAS not in service_data: + # Service is not initialized; nothing to do + return + return app.specter.wallet_manager.get_by_alias( + service_data[cls.SPECTER_WALLET_ALIAS] + ) + + @classmethod + def set_associated_wallet(cls, wallet: Wallet): + """Set the Specter `Wallet` that is currently associated with Swan auto-withdrawals""" + cls.update_current_user_service_data({cls.SPECTER_WALLET_ALIAS: wallet.alias}) + + @classmethod + def reserve_addresses( + cls, wallet: Wallet, label: str = None, num_addresses: int = 10 + ) -> List[str]: + """ + * Reserves addresses for Swan auto-withdrawals + * Sets the associated Specter `Wallet` that will receive auto-withdrawals + * Removes any existing unused reserved addresses in the previously associated `Wallet` + * Performs matching cleanup and update on the Swan side + + Overrides base classmethod to add Swan-specific functionality & data management. + """ + from . import client as swan_client + + # Update Addresses as reserved (aka "associated") with Swan in our Wallet + addresses = super().reserve_addresses( + wallet=wallet, label=label, num_addresses=num_addresses + ) + + # Clear out any prior unused reserved addresses if this is a different Wallet + cur_wallet = cls.get_associated_wallet() + if cur_wallet and cur_wallet != wallet: + super().unreserve_addresses(cur_wallet) + + # Store our `Wallet` as the current one for Swan auto-withdrawals + cls.set_associated_wallet(wallet) + + # Send the new list to Swan (DELETES any unused ones; creates a new SWAN_WALLET_ID if needed) + swan_client.update_autowithdrawal_addresses( + specter_wallet_name=wallet.name, + specter_wallet_alias=wallet.alias, + addresses=addresses, + ) + + return addresses + + @classmethod + def set_autowithdrawal_settings(cls, wallet: Wallet, btc_threshold: str): + """ + btc_threshold: "0", "0.01", "0.025", or "0.05" + + Performs a lot of maintenance behind the scenes in order to keep Specter's + internal data in sync (e.g. resetting previously reserved addresses) and the same + in the api to keep Swan's notion of a wallet and list of addrs in sync. + """ + from . import client as swan_client + + # Reserve auto-withdrawal addresses for this Wallet; clear out an unused ones in a prior wallet + cls.reserve_addresses( + wallet=wallet, num_addresses=cls.MIN_PENDING_AUTOWITHDRAWAL_ADDRS + ) + + # Send the autowithdrawal threshold + swan_client.set_autowithdrawal(btc_threshold=btc_threshold) + + # Store the threshold setting in the User's service data + cls.update_current_user_service_data( + {SwanService.AUTOWITHDRAWAL_THRESHOLD: btc_threshold} + ) + + @classmethod + def sync_swan_data(cls): + """ + Called when the user completes the OAuth2 link with Swan. + + User could be: + * A first-time Specter-Swan integration (so no local or Swan API wallet data). + * Re-linking on a previously linked Specter instance (some/all existing data). + * Linking a new Specter instance but had previously linked on a different Specter + instance; the previously linked Specter wallet may or may not be present + (need to resync data). + """ + from . import client as swan_client + + def sync_autowithdrawal_settings(service_data): + """ + Retrieve the autowithdrawal objs from Swan. We only care if we find one + that matches our SWAN_WALLET_ID and has `isActive: true`. + + Otherwise clear any local autowithdrawal data. + """ + autowithdrawal_info = swan_client.get_autowithdrawal_info() + """ + { + "entity": "automaticWithdrawal", + "list": [ + { + "id": "2026d75b-baf0-45c3-a1c6-9e17d4f7e90f", + "minBtcThreshold": "0.01", + "isActive": false, + "isCanceled": false, + "createdAt": "2022-01-07T02:14:56.070Z", + "walletId": "e26132e7-2e03-49b7-807b-9067aa3a8507", + "walletAddressId": null + }, + ..., + { ... } + ] + } + """ + if autowithdrawal_info and "list" in autowithdrawal_info: + swan_wallet_id = service_data.get(SwanService.SWAN_WALLET_ID) + for entry in autowithdrawal_info["list"]: + if entry.get("wallet_id") == swan_wallet_id and entry.get( + "isActive" + ): + # Found our swan_wallet_id's active autowithdrawal! + logger.debug( + "Found swan_wallet_id's active autowithdrawal entry" + ) + SwanService.update_current_user_service_data( + { + SwanService.AUTOWITHDRAWAL_ID: entry["id"], + SwanService.AUTOWITHDRAWAL_THRESHOLD: entry[ + "minBtcThreshold" + ], + } + ) + return + + # Did not find a matching and/or active autowithdrawal + logger.debug("No active autowithdrawal with swan_wallet_id found") + + # Clear the autowithdrawal fields from local storage and move on + service_data.pop(SwanService.AUTOWITHDRAWAL_ID, None) + service_data.pop(SwanService.AUTOWITHDRAWAL_THRESHOLD, None) + SwanService.set_current_user_service_data(service_data) + return + + service_data = cls.get_current_user_service_data() + if SwanService.SWAN_WALLET_ID in service_data: + # This user has previously/currently linked to Swan on this instance + swan_wallet_id = service_data[SwanService.SWAN_WALLET_ID] + logger.debug(f"swan_wallet_id: {swan_wallet_id}") + + # Confirm that the Swan walletId exists on the Swan side + details = swan_client.get_wallet_details(swan_wallet_id) + """ + { + "entity": "wallet", + "item": { + "id": "*******", + "isConfirmed": false, + "displayName": "Specter autowithdrawal to SeedSigner demo", + "metadata": { + "oidc": { + "clientId": "specter-dev" + }, + "specter_wallet_alias": "seedsigner_demo" + }, + "btcAddresses": [] + } + } + """ + if not details: + # Specter's SWAN_WALLET_ID is out of sync; doesn't exist on Swan's side. + # Clear the local SWAN_WALLET_ID and continue below to try to find one. + logger.debug(f"swan_wallet_id {swan_wallet_id} not found on Swan") + del service_data[SwanService.SWAN_WALLET_ID] + cls.set_current_user_service_data(service_data) + + elif ( + "item" in details + and "metadata" in details["item"] + and "specter_wallet_alias" in details["item"]["metadata"] + ): + wallet_alias = details["item"]["metadata"]["specter_wallet_alias"] + logger.debug(f"swan_wallet_id exists on Swan side") + if wallet_alias in [ + w.alias for w in app.specter.wallet_manager.wallets.values() + ]: + # All is good; we've matched Swan's wallet data with a Specter `Wallet` that we recognize. + logger.debug(f"Found wallet_alias {wallet_alias} in Specter") + if wallet_alias != service_data.get( + SwanService.SPECTER_WALLET_ALIAS + ): + # Our local `service_data` is out of sync; update with the + # current Specter wallet_alias Swan is expecting. + logger.debug( + f"Updating service_data to use wallet_alias {wallet_alias}" + ) + cls.update_current_user_service_data( + {SwanService.SPECTER_WALLET_ALIAS: wallet_alias} + ) + + sync_autowithdrawal_settings(service_data) + + return + else: + # Swan is out of sync with Specter; the SPECTER_WALLET_ALIAS we had + # been using doesn't exist on this Specter instance. + logger.warn( + f"Swan referenced an unknown wallet_alias {wallet_alias}" + ) + if SwanService.SPECTER_WALLET_ALIAS in service_data: + # Clear the local reference to that unknown SPECTER_WALLET_ALIAS + del service_data[SwanService.SPECTER_WALLET_ALIAS] + cls.set_current_user_service_data(service_data) + + # This Specter instance has no idea if there might already be wallet data on the Swan side. + # Fetch all Swan wallets, if any exist. + wallet_entries = swan_client.get_wallets().get("list") + if not wallet_entries: + # No Swan data at all yet. Nothing to do. + logger.debug("No wallets on the Swan side yet") + return + + swan_wallet_id = None + for wallet_entry in wallet_entries: + swan_wallet_id = wallet_entry["id"] + specter_wallet_alias = wallet_entry["metadata"].get("specter_wallet_alias") + if specter_wallet_alias in [ + w.alias for w in app.specter.wallet_manager.wallets.values() + ]: + # All is good; we've matched Swan's wallet data with a Specter `Wallet` that we recognize. + # Use this Swan walletId going forward. + cls.update_current_user_service_data( + { + SwanService.SWAN_WALLET_ID: swan_wallet_id, + SwanService.SPECTER_WALLET_ALIAS: specter_wallet_alias, + } + ) + logger.debug( + f"Found a Specter wallet that we recognize: {specter_wallet_alias}" + ) + + sync_autowithdrawal_settings(service_data) + + return + + # We didn't find a matching Specter `Wallet`. Clear out any nonsense settings in our local data. + logger.debug( + "Did not find any matching Specter wallets in the Swan wallet metadata" + ) + if SwanService.SPECTER_WALLET_ALIAS in service_data: + del service_data[SwanService.SPECTER_WALLET_ALIAS] + SwanService.set_current_user_service_data(service_data) + + # Did we at least get a Swan walletId that we can update later? + if swan_wallet_id: + cls.update_current_user_service_data( + { + SwanService.SWAN_WALLET_ID: swan_wallet_id, + } + ) + logger.debug(f"Setting swan_wallet_id to {swan_wallet_id}") + + @classmethod + def remove_swan_integration(cls, user: User): + # Unreserve unused addresses in all wallets + for wallet_name, wallet in user.wallet_manager.wallets.items(): + SwanService.unreserve_addresses(wallet=wallet) + + # If an autowithdrawal setup is active, remove pending addrs from Swan + try: + service_data = SwanService.get_current_user_service_data() + if service_data.get(cls.SPECTER_WALLET_ALIAS) and service_data.get( + cls.SWAN_WALLET_ID + ): + # Import here to prevent circular dependency + from . import client as swan_client + + swan_client.delete_autowithdrawal_addresses( + service_data[cls.SWAN_WALLET_ID] + ) + except Exception as e: + # Note the exception but proceed with clearing local data + logger.exception(e) + + # Wipe the on-disk encrypted service data (refresh_token, etc) + SwanService.set_current_user_service_data({}) + + # Remove Swan from User's list of active Services + user.remove_service(SwanService.id) + + """ *********************************************************************** + Update hooks overrides + *********************************************************************** """ + + @classmethod + def update(cls): + """ + Periodic or at-login call to check our Swan address status and send more when + needed. + * Check for autowithdrawals paid to addrs reserved for Swan. + * Add more pending autowithdrawal addrs if we're under the threshold. + """ + # Which Specter `Wallet` has been configured to receive Swan autowithdrawals? + wallet = cls.get_associated_wallet() + if not wallet: + # Swan autowithdrawals to Specter aren't set up yet; nothing to do. + logger.debug( + "No associated wallet. Swan autowithdrawals are not set up yet." + ) + return + + # Scan the Wallet for any new Swan autowithdrawals + reserved_addresses: List[Address] = wallet.get_associated_addresses( + service_id=cls.id, unused_only=False + ) + for addr_obj in reserved_addresses: + if addr_obj["used"] and addr_obj["label"] == cls.default_address_label: + # This addr has received an autowithdrawal since we last checked + logger.debug( + f"Updating address label for {json.dumps(addr_obj, indent=4)}" + ) + addr_obj.set_label(str(_("Swan autowithdrawal"))) + + num_pending_autowithdrawal_addrs = len( + [addr_obj for addr_obj in reserved_addresses if not addr_obj["used"]] + ) + if num_pending_autowithdrawal_addrs < cls.MIN_PENDING_AUTOWITHDRAWAL_ADDRS: + from . import ( + client as swan_client, + ) # Import here to avoid circular dependency + + logger.debug("Need to send more addrs to Swan") + + cls.reserve_addresses( + wallet=wallet, num_addresses=cls.MIN_PENDING_AUTOWITHDRAWAL_ADDRS + ) + + @classmethod + def on_user_login(cls): + cls.update() diff --git a/src/cryptoadvance/specter/services/swan/static/img/swan_icon.svg b/src/cryptoadvance/specter/services/swan/static/img/swan_icon.svg new file mode 100644 index 000000000..209f0cdb8 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/static/img/swan_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/swan/static/img/swan_logo.svg b/src/cryptoadvance/specter/services/swan/static/img/swan_logo.svg new file mode 100644 index 000000000..ad896e93b --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/static/img/swan_logo.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/swan/templates/swan/components/swan_menu.jinja b/src/cryptoadvance/specter/services/swan/templates/swan/components/swan_menu.jinja new file mode 100644 index 000000000..8f59b2d67 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/templates/swan/components/swan_menu.jinja @@ -0,0 +1,16 @@ +{% from 'components/menu_item.jinja' import menu_item %} + +{# + vaultoro_menu - Tabs menu to navigate between the vaultoro screens. + Parameters: + - active_menuitem: Current active tab. Options: 'general', 'bitcoin_core', 'auth'. + #} +{% macro swan_menu(active_menuitem) -%} + +{%- endmacro %} diff --git a/src/cryptoadvance/specter/services/swan/templates/swan/components/swan_tab.jinja b/src/cryptoadvance/specter/services/swan/templates/swan/components/swan_tab.jinja new file mode 100644 index 000000000..8945b22e9 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/templates/swan/components/swan_tab.jinja @@ -0,0 +1,8 @@ +{% extends "base.jinja" %} +{% block main %} + + {% from 'swan/components/swan_menu.jinja' import swan_menu with context %} + {{ swan_menu(tab) }} + {% block content %} + {% endblock %} +{% endblock %} \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/swan/templates/swan/index.jinja b/src/cryptoadvance/specter/services/swan/templates/swan/index.jinja new file mode 100644 index 000000000..213d9fab4 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/templates/swan/index.jinja @@ -0,0 +1,112 @@ +{% extends "base.jinja" %} + +{% block main %} + + +
“Swan is the best way to accumulate Bitcoin with automatic recurring buys and instant buys.”
+
+ + +
+ Join Swan! +
+
$10 free Bitcoin bonus
+
+
+
+ +
+ Existing Swan users +
+
+ +
+ + + +
+
+
  • Auto-withdraw from Swan straight into your Specter wallet +
  • Swan UTXOs marked in your Specter History +
  • +
    +
    +{% endblock %} + + + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/swan/templates/swan/oauth2_start.jinja b/src/cryptoadvance/specter/services/swan/templates/swan/oauth2_start.jinja new file mode 100644 index 000000000..080da39c2 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/templates/swan/oauth2_start.jinja @@ -0,0 +1,62 @@ +{% extends "base.jinja" %} + +{% block main %} + + + +
    +

    {{ _("Enable Swan Integration") }}

    +
    + +
    +
    + Link your account +
    +
    + +
    + {{ _("Click to sign into your Swan account and authorize Specter integration") }} +
    +
    +
    +{% endblock %} + + + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/swan/templates/swan/oauth2_success.jinja b/src/cryptoadvance/specter/services/swan/templates/swan/oauth2_success.jinja new file mode 100644 index 000000000..9d6061dc5 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/templates/swan/oauth2_success.jinja @@ -0,0 +1,52 @@ +{% extends "base.jinja" %} + +{% block main %} + + +
    +

    Swan Integration Success!

    +
    + +
    Continue
    +
    +{% endblock %} + + + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/swan/templates/swan/settings.jinja b/src/cryptoadvance/specter/services/swan/templates/swan/settings.jinja new file mode 100644 index 000000000..9cb6632a2 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/templates/swan/settings.jinja @@ -0,0 +1,133 @@ +{% extends "swan/components/swan_tab.jinja" %} +{% block title %}Settings{% endblock %} +{% set tab = 'settings' %} +{% block content %} +
    + + +
    +

    {{ _("Configure Auto-Withdrawal") }}

    +
    + +
    + {{ _("- Specter will send {} unused addresses to Swan").format(num_reserved_addrs) }}
    + {{ _("- Your wallet will show them pre-labeled as \"reserved\" for Swan") }}
    + {{ _("- Specter will check these addresses each time you log in to Specter") }}
    + {{ _("- Specter will send more unused addresses to Swan as needed") }}
    +
    +
    + +
    + + + {{ _("Withdraw to wallet") }}:
    + +
    +
    +
    + +
    Auto-withdrawal threshold:
    + +
    +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    + + +
    +

    {{ _("Remove Swan Integration") }}

    +
    +
    + {{ _("- Halts Swan auto-withdrawals to your Specter wallet") }}
    + {{ _("- Clears Swan data from Specter") }}
    +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    + +{% endblock %} \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/swan/templates/swan/withdrawals.jinja b/src/cryptoadvance/specter/services/swan/templates/swan/withdrawals.jinja new file mode 100644 index 000000000..ba32d5187 --- /dev/null +++ b/src/cryptoadvance/specter/services/swan/templates/swan/withdrawals.jinja @@ -0,0 +1,78 @@ +{% extends "swan/components/swan_tab.jinja" %} +{% block title %}Balances{% endblock %} +{% set tab = 'withdrawals' %} +{% block content %} + + + +

    Swan Auto-Withdrawals to Specter

    + + {% if wallet %} +
    Linked wallet: + {{ wallet.name }}
    +
    + {% if autowithdrawal_threshold %} + Auto-withdrawal threshold: {% if autowithdrawal_threshold == "0" %}{{ _("Weekly") }}{% else %}{{ autowithdrawal_threshold }} btc{% endif %} + {% endif %} + + {% else %} +
    +
    {{ _("Auto-Withdrawal Not Configured") }}
    +
    + {{ _("Go to Settings to set up auto-withdrawal to one of your Specter wallets") }} +
    +
    + {% endif %} + + {# TODO: List total withdrawal value? Or just current value of withdrawn utxos? #} + +
    + {% include "includes/services-data.html" %} + {% include "includes/address-label.html" %} + {% include "includes/tx-row.html" %} + {% include "includes/tx-data.html" %} + {% include "includes/explorer-link.html" %} + {% include "includes/tx-table.html" %} + +
    + + +
    + {{ _("*Only shows the withdrawals that this Specter instance is aware of.") }} +
    + +{% endblock %} \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/templates/components/menu_item.jinja b/src/cryptoadvance/specter/services/templates/components/menu_item.jinja new file mode 100644 index 000000000..8394db41b --- /dev/null +++ b/src/cryptoadvance/specter/services/templates/components/menu_item.jinja @@ -0,0 +1,17 @@ +{# + menu_item - navigation bar menu item. + Parameters: + - tab: The tab name. + - title: The tab title. + - active_menuitem: Current active tab name. + - optional: is the tab supported for mobile. + - isLeft: Is the item at the left edge (first item) of the navigation bar? + - isRight: Is the item at the right edge (last item) of the navigation bar? + #} + {% macro menu_item(service_id, tab, title, active_menuitem, isLeft=false, isRight=false) -%} + + {{ title }} + +{%- endmacro %} diff --git a/src/cryptoadvance/specter/services/templates/includes/services-data.html b/src/cryptoadvance/specter/services/templates/includes/services-data.html new file mode 100644 index 000000000..a0ca385a6 --- /dev/null +++ b/src/cryptoadvance/specter/services/templates/includes/services-data.html @@ -0,0 +1,15 @@ +{# Assumes that the `services` object has been injected into the Flask context. This +script makes the Services data globally available to all JS. #} +{# TODO: Better way to manage this JS global? #} + diff --git a/src/cryptoadvance/specter/services/templates/services/associate_addr.jinja b/src/cryptoadvance/specter/services/templates/services/associate_addr.jinja new file mode 100644 index 000000000..285d4e955 --- /dev/null +++ b/src/cryptoadvance/specter/services/templates/services/associate_addr.jinja @@ -0,0 +1,83 @@ +{% extends "base.jinja" %} + +{% block main %} + +

    {{ _("Associate Address") }}

    +
    +
    Associating an address with a service will: +
    +
      +
    • Display the service's icon with the address label
    • +
    • Include the address' UTXOs in the service's transaction totals
    • +
    +
    +
    + +
    +
    + +
    +
    Address:
    + {{addr_obj.address}} +
    + +
    +
    Wallet:
    + {{ wallet.name }} +
    + +
    +
    Service:
    + +
    + + +
    +
    +
    +{% endblock %} + + + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/templates/services/choose.jinja b/src/cryptoadvance/specter/services/templates/services/choose.jinja new file mode 100644 index 000000000..bbfa3ab55 --- /dev/null +++ b/src/cryptoadvance/specter/services/templates/services/choose.jinja @@ -0,0 +1,98 @@ +{% extends "base.jinja" %} + +{% block main %} + +

    {{ _("Services") }}

    + + {% if is_login_disabled %} + + {% endif %} + +
    +
    + {% for service in services %} +
    + {% if service.icon %} +
    + {% endif %} +
    {{ service.name }}
    +
    {{ service.desc }}
    +
    + {% endfor %} +
    +
    +
    ???
    +
    More integrations coming soon!
    +
    +
    +
    +
    ???
    +
    More integrations coming soon!
    +
    +
    +
    +
    ???
    +
    More integrations coming soon!
    +
    + + +
    + {{ _("Some services might not respect the Tor-only policy.") }} +
    +
    +{% endblock %} + + + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/src/cryptoadvance/specter/services/templates/services/sidebar_services_list.jinja b/src/cryptoadvance/specter/services/templates/services/sidebar_services_list.jinja new file mode 100644 index 000000000..4add058c6 --- /dev/null +++ b/src/cryptoadvance/specter/services/templates/services/sidebar_services_list.jinja @@ -0,0 +1,13 @@ +
    + Services   ▼ +
    +
    + {% for _,service in specter.service_manager.services.items() %} + {% if service.id in current_user.services %} + +  {{ service.name }} + +
    + {% endif %} + {% endfor %} +
    diff --git a/src/cryptoadvance/specter/specter.py b/src/cryptoadvance/specter/specter.py index b10d70e95..9db98688b 100644 --- a/src/cryptoadvance/specter/specter.py +++ b/src/cryptoadvance/specter/specter.py @@ -37,6 +37,8 @@ from .rpc import ( RpcError, get_default_datadir, ) +from .services.service_manager import ServiceManager +from .services.service import devstatus_alpha, devstatus_beta, devstatus_prod from .specter_error import ExtProcTimeoutException, SpecterError from .tor_daemon import TorDaemonController from .user import User @@ -56,7 +58,13 @@ class Specter: lock = threading.Lock() _default_asset = None - def __init__(self, data_folder="./data", config={}, internal_bitcoind_version=""): + def __init__( + self, + data_folder="./data", + config={}, + internal_bitcoind_version="", + service_devstatus_threshold=devstatus_prod, + ): if data_folder.startswith("~"): data_folder = os.path.expanduser(data_folder) data_folder = os.path.abspath(data_folder) @@ -71,6 +79,10 @@ class Specter: self ) # has to come before calling VersionChecker() + self.service_manager = ServiceManager( + specter=self, devstatus_threshold=service_devstatus_threshold + ) + # version checker # checks for new versions once per hour self.version = VersionChecker(specter=self) @@ -426,7 +438,11 @@ class Specter: def update_alt_symbol(self, alt_symbol, user): self.config_manager.update_alt_symbol(alt_symbol, user) - # mark logic! + def update_services(self, services): + """takes a list of service_names which should be activated""" + self.config["services"] = services + self._save() + def update_merkleproof_settings(self, validate_bool): if validate_bool is True and self.info.get("pruned") is True: validate_bool = False diff --git a/src/cryptoadvance/specter/static/img/ghost_3d.png b/src/cryptoadvance/specter/static/img/ghost_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6398581af03bc234743dfb0f72f617930064b8 GIT binary patch literal 413565 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
    FAP?f7j0JP_*Fn-ypjc{aHC`Xr(I5? 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 U^q`Hz=(>*`IexhE+cQ7>A6?@eZU6uP literal 0 HcmV?d00001 diff --git a/src/cryptoadvance/specter/static/styles.css b/src/cryptoadvance/specter/static/styles.css index 1a7410fb9..91ea3319d 100644 --- a/src/cryptoadvance/specter/static/styles.css +++ b/src/cryptoadvance/specter/static/styles.css @@ -11,7 +11,7 @@ html, body{ --cmap-red: #A12737; --cmap-red-darker: #951E2D; --cmap-bg: #192432; - --cmap-bg-ligher: #263044; + --cmap-bg-lighter: #263044; --cmap-bg-lightest: #313E50; --cmap-border: #506072; --cmap-border-darker: #405062; @@ -95,7 +95,7 @@ ul, li{ align-items: center; } .settings-bar-btn:hover { - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); } .logout{ position: relative; @@ -110,7 +110,7 @@ ul, li{ border-radius: 0 0 0 5px; } .logout:hover{ - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); } .logout img{ margin-right: 10px; @@ -197,7 +197,7 @@ nav.side{ width: 250px; } #side-content{ - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); border-right: 1px solid var(--cmap-bg-lightest); padding-top: 10px; display: flex; @@ -684,7 +684,7 @@ td, th{ border-bottom: 1px solid var(--cmap-bg-lightest); } tr, thead{ - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); } th{ text-align: left; @@ -992,7 +992,7 @@ nav.collapse-on-mobile a.mobile-nav-icon { bottom: 0; right: 0; width: 20px; - background: var(--cmap-bg-ligher); + background: var(--cmap-bg-lighter); } td.xpub{ max-width: 230px; diff --git a/src/cryptoadvance/specter/templates/base.jinja b/src/cryptoadvance/specter/templates/base.jinja index 8930e5f74..bfa864fa8 100644 --- a/src/cryptoadvance/specter/templates/base.jinja +++ b/src/cryptoadvance/specter/templates/base.jinja @@ -71,7 +71,7 @@ - + {% if specter.config.auth.method != "none" %} @@ -102,9 +102,9 @@

    - + {{ _('Welcome to Specter Desktop') }} - +

    {{ _("Specter Desktop is a convenient wallet interface to better use your Bitcoin Core node. It’s good for singlesig wallets, but comes with a special focus on multisignature setups for different hardware wallets and air-gapped signing devices.") }}

    @@ -223,7 +223,7 @@ {% if specter.chain == 'main' %} - +
    diff --git a/src/cryptoadvance/specter/templates/includes/address-data.html b/src/cryptoadvance/specter/templates/includes/address-data.html index 5b95a087c..64b288fc8 100644 --- a/src/cryptoadvance/specter/templates/includes/address-data.html +++ b/src/cryptoadvance/specter/templates/includes/address-data.html @@ -13,6 +13,12 @@ word-wrap: break-word; margin: auto; } + .service-icon { + margin-top: -5px; + margin-right: 0.5em; + height:24px; + vertical-align: middle; + }

    {{ _("Address details") }}


    @@ -33,6 +39,8 @@ this.el = clone.querySelector(".address-data"); this.note = clone.querySelector(".note"); this.info = clone.querySelector(".address-data-info"); + + // Read input "data-*" attributes this.isVerifyQR = this.getAttribute('data-verify-qr') == 'True'; this.isVerifyHwi = this.getAttribute('data-verify-hwi') == 'True'; this.used = (this.getAttribute('data-used') == 'true'); @@ -40,7 +48,10 @@ this.amount = this.getAttribute('data-amount'); this.amountPrice = this.getAttribute('data-amount-price'); this.address = this.getAttribute('data-address'); + this.label = this.getAttribute('data-label'); + this.serviceId = this.getAttribute('data-service-id'); this.wallet = this.getAttribute('data-address-wallet'); + this.note.innerText = `{{ _("Loading address") }}: ${this.address} {{ _("details") }}...`; this.fetchAddressData(); @@ -67,7 +78,6 @@ } const jsonResponse = await response.json(); if (jsonResponse.success) { - console.log(jsonResponse); let descriptor = jsonResponse.descriptor; let addressIndex = jsonResponse.index; let isChange = jsonResponse.change; @@ -75,20 +85,31 @@ let address = jsonResponse.address; let walletLink = `{{ url_for('wallets_endpoint.wallet', wallet_alias='WALLET_ALIAS') }}`.replace("WALLET_ALIAS", this.wallet); let addressInfoHTML = ` -
    - - - - - - - - - - - -
    {{ _("Address") }}:
    {{ _("Label") }}:
    {{ _("From wallet") }}:${walletName}
    {{ _("Address index") }}:${addressIndex}
    {{ _("Is change address") }}:${isChange ? '{{ _("Yes") }}' : '{{ _("No") }}'}
    {{ _("Used") }}:${this.used ? 'Yes' : 'No'}
    {{ _("UTXO count") }}:${this.utxo}
    {{ _("Amount") }}:${this.amount} ${this.amountPrice}
    - ` +
    + + + + + + + + + + + + +
    {{ _("Address") }}:
    {{ _("Label") }}:
    {{ _("From wallet") }}:${walletName}
    {{ _("Address index") }}:${addressIndex}
    {{ _("Is change address") }}:${isChange ? '{{ _("Yes") }}' : '{{ _("No") }}'}
    {{ _("Used") }}:${this.used ? 'Yes' : 'No'}
    {{ _("UTXO count") }}:${this.utxo}
    {{ _("Amount") }}:${this.amount} ${this.amountPrice}
    {{ _("Service") }}: + `; + if (this.serviceId != "null") { + // `services` obj made globally available in services-data.html + addressInfoHTML += `${services[this.serviceId].name}`; + } else { + let associateServiceUrl = `{{ url_for('services_endpoint.associate_addr', wallet_alias='WALLET_ALIAS', address='ADDRESS') }}`.replace('WALLET_ALIAS', this.wallet).replace('ADDRESS', jsonResponse.address); + addressInfoHTML += `` + } + addressInfoHTML += ` +
    + `; if (this.isVerifyHwi) { addressInfoHTML += ` diff --git a/src/cryptoadvance/specter/templates/includes/address-label.html b/src/cryptoadvance/specter/templates/includes/address-label.html index 2c41e72c1..be090f1a8 100644 --- a/src/cryptoadvance/specter/templates/includes/address-label.html +++ b/src/cryptoadvance/specter/templates/includes/address-label.html @@ -3,6 +3,12 @@ .address-label-form { display: inline; } + .service-icon { + margin-top: -5px; + margin-right: 0.25em; + height:24px; + vertical-align: middle; + } .label { word-break: break-all; background: none; @@ -60,6 +66,7 @@
    + {{ _("Fetching address label...") }} @@ -76,6 +83,7 @@ var style = document.getElementById('address-label').content; var clone = style.cloneNode(true); this.el = clone.querySelector(".address-label-form"); + this.serviceIconImg = clone.querySelector(".service-icon"); this.label = clone.querySelector(".label"); this.update = clone.querySelector(".update"); this.cancel = clone.querySelector(".cancel"); @@ -90,10 +98,16 @@ this.address = this.getAttribute('data-address'); this.wallet = this.getAttribute('data-wallet'); this.labelValue = this.getAttribute('data-label'); + this.serviceId = this.getAttribute('data-service-id'); this.explorer = '{{ specter.explorer }}'; this.label.title = this.address; this.isEditing = false; + if (this.serviceId && this.serviceId != "null") { + // `services` globally injected via includes/services-data.html + this.serviceIconImg.src = "/svc/" + this.serviceId + "/static/" + services[this.serviceId].icon; + } + // Set the label - fetch if not specified if (this.labelValue) { this.label.innerText = this.labelValue; diff --git a/src/cryptoadvance/specter/templates/includes/address-row.html b/src/cryptoadvance/specter/templates/includes/address-row.html index 6fb2e9d34..4f1bab1d6 100644 --- a/src/cryptoadvance/specter/templates/includes/address-row.html +++ b/src/cryptoadvance/specter/templates/includes/address-row.html @@ -9,6 +9,9 @@ max-width: 160px; } } + .address-row:hover { + background-color: var(--cmap-bg-lightest); + } @@ -69,15 +72,22 @@ this.hideSensitiveInfo = this.getAttribute('data-hide-sensitive-info') == 'true'; this.index.innerText = `#${this.addressData.index}`; - this.address.innerText = this.hideSensitiveInfo ? '###########################' : this.addressData.address; + this.address.innerHTML = this.hideSensitiveInfo ? '###########################' : this.addressData.address.substring(0, 7) + "…" + this.addressData.address.substring(this.addressData.address.length - 7); if (!this.hideSensitiveInfo) { this.address.onclick = () => { showAddressData(this.amountText.innerText, this.amountPrice.innerText, this.addressData, this.wallet); } } - this.label.innerHTML = this.hideSensitiveInfo ? '############' : ``; - + if (this.hideSensitiveInfo) { + this.label.innerHTML = '############' + } else { + this.label.innerHTML = ``; + } this.used.innerText = this.hideSensitiveInfo ? '###' : `${this.addressData.used ? 'Yes' : 'No'}`; this.utxo.innerText = this.hideSensitiveInfo ? '###' : this.addressData.utxo; diff --git a/src/cryptoadvance/specter/templates/includes/addresses-table.html b/src/cryptoadvance/specter/templates/includes/addresses-table.html index 0bdf4d9cb..0b67fb686 100644 --- a/src/cryptoadvance/specter/templates/includes/addresses-table.html +++ b/src/cryptoadvance/specter/templates/includes/addresses-table.html @@ -454,7 +454,7 @@ let addressesList = JSON.parse(jsonResponse.addressesList); for (let addr of addressesList) { - + // Address data is embedded into each row as stringified JSON in the "data-address" attr. let addrRow = document.createRange().createContextualFragment(` + data-wallet="${this.wallet}"> `); this.tbody.append(addrRow); @@ -535,15 +535,17 @@ let addressDataPopup = document.getElementById('address-popup'); addressDataPopup.innerHTML = ` - `; + data-verify-qr="{{ supports_qr_code_verify != [] }}" + data-verify-hwi="{{ supports_hwi != [] and (supports_hwi_multisig_display_address != [] or not wallet.is_multisig) }}" + data-used="${addressData.used}" + data-utxo="${addressData.utxo}" + data-amount="${amount}" + data-amount-price="${amountPrice}" + data-address="${addressData.address}" + data-service-id="${addressData.service_id}" + data-label="${addressData.label}" + data-address-wallet="${wallet}" + />`; showPageOverlay('address-popup'); } else { copyText(address, `{{ _("Copied address") }}: ${ address }`); diff --git a/src/cryptoadvance/specter/templates/includes/message-box.html b/src/cryptoadvance/specter/templates/includes/message-box.html index 288ff8d63..79cf7a42f 100644 --- a/src/cryptoadvance/specter/templates/includes/message-box.html +++ b/src/cryptoadvance/specter/templates/includes/message-box.html @@ -91,6 +91,9 @@ class MessageBoxElement extends HTMLElement { this.main.style.display = "none"; }, 200); } + setType(mytype) { + this.main.classList.add("error"); + } connectedCallback(){ this.main.style.opacity = 0; this.main.style["animation-name"]="appear"; @@ -101,7 +104,7 @@ class MessageBoxElement extends HTMLElement { var timeout = parseInt(this.getAttribute('timeout')); this.main.classList.remove("error"); if(type=="error"){ - this.main.classList.add("error"); + this.setType("error"); } if(timeout > 0){ setTimeout(()=>{ diff --git a/src/cryptoadvance/specter/templates/includes/sidebar/sidebar.jinja b/src/cryptoadvance/specter/templates/includes/sidebar/sidebar.jinja index 31155c247..05f293d40 100644 --- a/src/cryptoadvance/specter/templates/includes/sidebar/sidebar.jinja +++ b/src/cryptoadvance/specter/templates/includes/sidebar/sidebar.jinja @@ -221,12 +221,14 @@ {% endfor %} {{ sidebar_btn(url_for('devices_endpoint.new_device_type'), _('Add new device'),'btn_new_device') }}
    + {% include "services/sidebar_services_list.jinja" %} + {{ sidebar_btn(url_for('services_endpoint.choose'), 'Choose services', 'btn_new_service') }}
    @@ -300,6 +302,13 @@ }); } + if ('{{ specter.service_manager.service_names | length }}' == '0') { + document.getElementById('toggle_services_list').innerHTML = 'Services'; + } else { + document.getElementById('toggle_services_list').addEventListener('click', (event) => { + toggleList('services'); + }); + } {% if specter.wallet_manager.is_loading %} updateWalletsLoadingData(); {% endif %} diff --git a/src/cryptoadvance/specter/templates/includes/tx-data.html b/src/cryptoadvance/specter/templates/includes/tx-data.html index f40562021..22611c546 100644 --- a/src/cryptoadvance/specter/templates/includes/tx-data.html +++ b/src/cryptoadvance/specter/templates/includes/tx-data.html @@ -138,6 +138,7 @@ let jsonResponse = await this.fetchRawTx(rawtx.vin[i].txid); if (jsonResponse !== null && jsonResponse.success) { let spentOutput = jsonResponse.rawtx.vout[rawtx.vin[i].vout]; + let address = (spentOutput.addresses && spentOutput.addresses.length == 1) ? spentOutput.addresses[0] : 'Unknown'; if (address == 'Unknown') { address = (spentOutput.scriptPubKey.addresses && spentOutput.scriptPubKey.addresses.length == 1) ? spentOutput.scriptPubKey.addresses[0] : 'Unknown'; @@ -175,8 +176,23 @@ value = `${numberWithCommas(value.toString())}`; } + let labelAttr = ""; + if ("label" in spentOutput) { + labelAttr = `data-label="${spentOutput.label}"`; + } + let serviceIdAttr = ""; + if ("service_id" in spentOutput) { + serviceIdAttr = `data-service-id="${spentOutput.service_id}"`; + } + addressAndValue = `
    - {{ _("Address:") }}
    + {{ _("Address:") }}
    {{ _("Value:") }} ${value} ${assetlabel} ${price}`; } @@ -235,15 +251,32 @@ } let bgColor = '#131a24'; - let isMine = await this.fetchAddressIsMine(address); - if (isMine) { + if ("index" in rawtx.vout[i]) { + // Only addresses from this wallet will have an index; isMine = True bgColor = '#154984'; } + let labelAttr = ""; + if ("label" in rawtx.vout[i]) { + labelAttr = `data-label="${rawtx.vout[i].label}"`; + } else if (address != "Unknown") { + labelAttr = `data-label="${address}"`; + } + let serviceIdAttr = ""; + if ("service_id" in rawtx.vout[i]) { + serviceIdAttr = `data-service-id="${rawtx.vout[i].service_id}"`; + } + rawtxHTML += `

    {{ _("Output #${i}") }}

    - {{ _("Address:") }}
    + {{ _("Address:") }}
    {{ _("Value:") }} ${value} ${assetlabel} ${price}

    `; diff --git a/src/cryptoadvance/specter/templates/includes/tx-row.html b/src/cryptoadvance/specter/templates/includes/tx-row.html index fce499fc2..92c8c2801 100644 --- a/src/cryptoadvance/specter/templates/includes/tx-row.html +++ b/src/cryptoadvance/specter/templates/includes/tx-row.html @@ -15,6 +15,20 @@ .svg-cancelled { filter: invert(20%) sepia(32%) saturate(4838%) hue-rotate(332deg) brightness(81%) contrast(97%); } + + .tx-row:hover { + background-color: var(--cmap-bg-lightest); + } + .address { + overflow: hidden; + text-overflow: ellipsis; + } + .service-icon { + margin-top: -5px; + margin-right: 0.5em; + height:24px; + vertical-align: middle; + } @@ -58,6 +72,7 @@ this.category = clone.querySelector(".category"); this.txid = clone.querySelector(".txid .explorer-link"); this.address = clone.querySelector(".address"); + this.serviceIcon = clone.querySelector(".service-icon"); this.amountText = clone.querySelector(".amount"); this.amountPrice = clone.querySelector(".amount-price"); this.time = clone.querySelector(".time"); @@ -109,7 +124,7 @@ // Set txid - this.txid.innerText = this.hideSensitiveInfo ? '############################################' : this.tx.txid; + this.txid.innerHTML = this.hideSensitiveInfo ? '############################################' : this.tx.txid.slice(0,11) + '…'; if (!this.hideSensitiveInfo) { this.txid.onclick = () => { showTxData( @@ -138,7 +153,18 @@ if (Array.isArray(this.tx.address)) { this.address.innerText = this.hideSensitiveInfo ? '#########' : `${this.tx.address.length} {{ _("Recipients") }}`; } else { - this.address.innerHTML = this.hideSensitiveInfo ? '#########' : `` + if (this.hideSensitiveInfo) { + this.address.innerHTML = '#########'; + } else { + if ("service_id" in this.tx) { + this.address.innerHTML = ``; + } + if (this.tx.label !== undefined) { + this.address.innerHTML += this.tx.label; + } else { + this.address.innerHTML += this.tx.address; + } + } } // Set amount @@ -190,7 +216,7 @@ // Set confirmations if (this.tx.confirmations > 0) { - this.confirmations.innerHTML = this.hideSensitiveInfo ? '########' : `${this.tx.confirmations} {{ _("Confirmations") }}`; + this.confirmations.innerHTML = this.hideSensitiveInfo ? '########' : `${this.tx.confirmations}`; } else if (this.tx.confirmations == 0) { this.el.classList.add('unconfirmed'); this.confirmations.innerHTML = this.hideSensitiveInfo ? '########' : `{{ _("Unconfirmed") }}`; diff --git a/src/cryptoadvance/specter/templates/includes/tx-table.html b/src/cryptoadvance/specter/templates/includes/tx-table.html index f4c22b869..e3ecd728f 100644 --- a/src/cryptoadvance/specter/templates/includes/tx-table.html +++ b/src/cryptoadvance/specter/templates/includes/tx-table.html @@ -322,12 +322,14 @@ // Next page action this.paginationNext.onclick = () => { this.idx++; + console.log("paginationNext fetch"); this.fetchTxItems(); } // Previous page action this.paginationBack.onclick = () => { this.idx--; + console.log("paginationBack fetch"); this.fetchTxItems(); } @@ -339,6 +341,7 @@ return; } this.idx = newIdx - 1; + console.log("paginationIdxInput fetch"); this.fetchTxItems(); } @@ -346,12 +349,14 @@ this.searchInput.onchange = () => { this.search = this.searchInput.value; this.export.href = this.export.href.split('?')[0] + `?exportPrices=${this.exportPricesSwitch.checked}&search=${this.search}&sortby=${this.sortby}&sortdir=${this.sortdir}`; + console.log("searchInput fetch"); this.fetchTxItems(); } // Listen to changes in page limit this.pageLimitSelect.onchange = () => { this.limit = this.pageLimitSelect.value; + console.log("pageLimitSelect fetch"); this.fetchTxItems(); } @@ -385,6 +390,7 @@ this.el.querySelector(`.${this.sortby}-arrow`).classList.add(this.sortdir == 'asc' ? 'down-arrow' : 'up-arrow'); this.export.href = this.export.href.split('?')[0] + `?exportPrices=${this.exportPricesSwitch.checked}&search=${this.search}&sortby=${this.sortby}&sortdir=${this.sortdir}`; } + console.log("header fetch") this.fetchTxItems(); } } @@ -486,6 +492,9 @@ } /** + * TODO: This is being called 7 times (once for each attribute) when the page is loaded, + * causing up to 7 redundant fetchTxItems() hits to the server. + * * Listens to changes on the following attributes: * - blockhash: Should show blockhash column. Either "true" or "false" * - btc-unit: Bitcoin unit to display amounts with. Either "btc" or "sat" @@ -621,6 +630,9 @@ formData.append('search', this.search); formData.append('sortby', this.sortby); formData.append('sortdir', this.sortdir); + if (this.serviceId) { + formData.append('service_id', this.serviceId); + } formData.append('csrf_token', '{{ csrf_token() }}'); try { let callId = this.callId; @@ -690,6 +702,7 @@ // If index is greater than the pages count fetch again for the last page if (this.idx >= this.pageCount) { this.idx = this.pageCount - 1; + console.log("index greater than pages count fetch"); this.fetchTxItems() } diff --git a/src/cryptoadvance/specter/templates/settings/auth_settings.jinja b/src/cryptoadvance/specter/templates/settings/auth_settings.jinja index 4edfc7d8e..cd75321ab 100644 --- a/src/cryptoadvance/specter/templates/settings/auth_settings.jinja +++ b/src/cryptoadvance/specter/templates/settings/auth_settings.jinja @@ -1,7 +1,18 @@ {% extends "base.jinja" %} {% block main %} + +

    Settings

    {% from 'settings/components/settings_menu.jinja' import settings_menu %} {{ settings_menu('auth', current_user) }} @@ -16,6 +27,9 @@

    {% endif %} +
    {{ _("Rate Limiting (seconds between login/register attempts)") }}:


    @@ -67,10 +81,15 @@ function toggleUsernamePassword(select) { {% if current_user.is_admin %} var ratelimitDiv = document.getElementById("ratelimit"); + var hasEncryptedServiceData = document.getElementById("hasencryptedservicedata"); if (select.options[select.selectedIndex].value !== 'none'){ ratelimitDiv.style.display = 'block'; + hasEncryptedServiceData.style.display = 'none'; } else { ratelimitDiv.style.display = 'none'; + {% if method != "none" and current_user.is_admin and has_service_encrypted_storage %} + hasEncryptedServiceData.style.display = 'block'; + {% endif %} } {% endif %} var usernamepasswordDiv = document.getElementById("usernamepassword"); diff --git a/src/cryptoadvance/specter/templates/settings/general_settings.jinja b/src/cryptoadvance/specter/templates/settings/general_settings.jinja index ee1e10d74..91379264c 100644 --- a/src/cryptoadvance/specter/templates/settings/general_settings.jinja +++ b/src/cryptoadvance/specter/templates/settings/general_settings.jinja @@ -6,7 +6,6 @@ {% from 'settings/components/settings_menu.jinja' import settings_menu %} {{ settings_menu('general', current_user) }}
    -

    {{ _("Language") }}

    {% include "includes/language/language_select.jinja" %}


    @@ -59,6 +58,7 @@ {{ _("Download Specter backup files") }}

    + Load Specter backup:
    i

    diff --git a/src/cryptoadvance/specter/templates/settings/hwi_settings.jinja b/src/cryptoadvance/specter/templates/settings/hwi_settings.jinja index 9ad16caa6..d5c1009cd 100644 --- a/src/cryptoadvance/specter/templates/settings/hwi_settings.jinja +++ b/src/cryptoadvance/specter/templates/settings/hwi_settings.jinja @@ -2,7 +2,7 @@ {% block main %} diff --git a/src/cryptoadvance/specter/templates/settings/tor_settings.jinja b/src/cryptoadvance/specter/templates/settings/tor_settings.jinja index ef46e47fe..de9a9e483 100644 --- a/src/cryptoadvance/specter/templates/settings/tor_settings.jinja +++ b/src/cryptoadvance/specter/templates/settings/tor_settings.jinja @@ -2,7 +2,7 @@ {% block main %} - {% include "includes/address-label.html" %} + .disabled { + visibility: hidden; + } + + {% include "includes/services-data.html" %} + {% include "includes/address-label.html" %}

    {{ _("Wallets Overview") }}

    -

    {{ _("Here you can see the combined balance and transactions history of all your Specter wallets.") }}

    +

    {{ _("Here you can see the combined balance and transactions history of all your Specter wallets.") }}

    Total balance:
    - {% set fullbalance = specter.wallet_manager.wallets.values() | sum(attribute='fullbalance') %} - {% set balance = specter.wallet_manager.joined_balance() %} + {% set fullbalance = specter.wallet_manager.wallets.values() | sum(attribute='fullbalance') %} + {% set balance = specter.wallet_manager.joined_balance() %} {{ fullbalance | btcunitamount }} {% if specter.unit == 'sat' %} - sats - {% else %} - {% if specter.is_testnet %}t{%endif%}{% if specter.is_liquid %}L{%endif%}BTC - {% endif %} + sats + {% else %} + {% if specter.is_testnet %}t{%endif%}{% if specter.is_liquid %}L{%endif%}BTC + {% endif %}
    - {{ fullbalance | altunit }} + {{ fullbalance | altunit }} {% if balance.get("untrusted_pending", 0) or balance.get("immature", 0) %}
    ( {{ balance.get("trusted", 0) | btcunitamount }} {{ _("confirmed") }}, {% if balance.get("untrusted_pending", 0) %} @@ -61,18 +62,18 @@

    {% include "includes/tx-row.html" %} - {% include "includes/tx-data.html" %} - {% include "includes/explorer-link.html" %} - {% include "includes/tx-table.html" %} - - + {% include "includes/tx-data.html" %} + {% include "includes/explorer-link.html" %} + {% include "includes/tx-table.html" %} + +
    {% endblock %} diff --git a/src/cryptoadvance/specter/user.py b/src/cryptoadvance/specter/user.py index 536c0e623..b4d6d7d2f 100644 --- a/src/cryptoadvance/specter/user.py +++ b/src/cryptoadvance/specter/user.py @@ -1,7 +1,9 @@ import base64 import binascii +import cryptography import hashlib import json +import logging import os import shutil @@ -18,6 +20,9 @@ from .managers.device_manager import DeviceManager from .helpers import deep_update +logger = logging.getLogger(__name__) + + def hash_password(plaintext_password): """Hash a password for storing.""" salt = binascii.b2a_base64(hashlib.sha256(os.urandom(60)).digest()).strip() @@ -44,6 +49,10 @@ def verify_password(stored_password, provided_password): return pwdhash == binascii.a2b_base64(stored_password["pwdhash"]) +class UserSecretException(Exception): + pass + + class User(UserMixin): """ The user_secret is used to encrypt/decrypt other user-specific data @@ -63,7 +72,7 @@ class User(UserMixin): specter, encrypted_user_secret=None, is_admin=False, - services=None, + services=[], ): self.id = id self.username = username @@ -95,7 +104,7 @@ class User(UserMixin): "config": {}, "specter": specter, "encrypted_user_secret": user_dict.get("encrypted_user_secret", None), - "services": user_dict.get("services", None), + "services": user_dict.get("services", []), } if not user_dict["is_admin"]: user_args["config"] = user_dict["config"] @@ -114,6 +123,10 @@ class User(UserMixin): return "" return f"_{self.id}" + @property + def is_user_secret_decrypted(self): + return self.plaintext_user_secret is not None + def _encrypt_user_secret(self, plaintext_password): """ Implementation taken from the pyca/cryptography docs: @@ -163,26 +176,58 @@ class User(UserMixin): self._encrypt_user_secret(plaintext_password) def _generate_user_secret(self, plaintext_password): - # Encryption using the user_secret uses a Fernet key. But the Fernet - # key itself will be encrypted with the user's password. + """ + Generates and stores the user_secret in memory. Also stores it encrypted + to disk. + + Encryption using the user_secret uses a Fernet key. But the Fernet + key itself will be encrypted with the user's password. + """ self.plaintext_user_secret = Fernet.generate_key() self._encrypt_user_secret(plaintext_password) self.save_info() + logger.debug("Generated user_secret") + + def delete_user_secret(self, autosave: bool = True): + self.encrypted_user_secret = None + self.plaintext_user_secret = None + if autosave: + self.save_info() def set_password(self, plaintext_password): - # Hash the incoming plaintext password and update the encrypted - # user_secret as needed. - self.password_hash = hash_password(plaintext_password) + """Hash the incoming plaintext password and update the encrypted user_secret as + needed. - # Must keep encrypted_user_secret in sync with password changes + Remember that the underlying user_secret doesn't change if the user changes + their password; it's the same user_secret but it just needs to be + re-encrypted using the new password. + """ + # Check the encrypted_user_secret before saving password change! if self.encrypted_user_secret is None: + # First time this user is initializing their user_secret self._generate_user_secret(plaintext_password) else: if self.plaintext_user_secret is None: - raise Exception( - "encrypted_user_secret wasn't decrypted during user login" - ) - self._encrypt_user_secret(plaintext_password) + # encrypted_user_secret hasn't been decrypted in memory; try to decrypt + # it now (will only work if we're re-enabling the same password for the + # admin account). + try: + self.decrypt_user_secret(plaintext_password) + except cryptography.fernet.InvalidToken as e: + # Existing encrypted_user_secret cannot be decrypted with this new + # password! Alert the calling code to handle (either provide the + # previous password to decrypt/re-encrypt or delete all existing + # encrypted data for this user (admin) because it's no longer + # decryptable). + logger.warn(e) + raise UserSecretException( + "Cannot decrypt existing encrypted_user_secret with the provided password" + ) + else: + # Must keep re-encrypt encrypted_user_secret with the new password. + self._encrypt_user_secret(plaintext_password) + + self.password_hash = hash_password(plaintext_password) @property def json(self): @@ -255,6 +300,20 @@ class User(UserMixin): self.specter.delete_user(self) self.manager.save() + def add_service(self, service_id: str, autosave: bool = True): + """Add a Service to the User. Only updates what is listed in the sidebar.""" + if service_id not in self.services: + self.services.append(service_id) + if autosave: + self.save_info() + + def remove_service(self, service_id: str, autosave: bool = True): + """Remove a Service from the User. Only updates what is listed in the sidebar.""" + if service_id in self.services: + self.services.remove(service_id) + if autosave: + self.save_info() + # TODO: Refactor calling code to explicitly call User.save() rather than embedding # self.save_info() on every update and setter. It ends up saving to disk multiple # times for a single Settings submit. diff --git a/src/cryptoadvance/specter/util/reflection.py b/src/cryptoadvance/specter/util/reflection.py new file mode 100644 index 000000000..f979492c5 --- /dev/null +++ b/src/cryptoadvance/specter/util/reflection.py @@ -0,0 +1,71 @@ +import logging +from importlib import import_module +from inspect import isclass +import os +from pathlib import Path +from pkgutil import iter_modules + +logger = logging.getLogger(__name__) + + +def _get_module_from_class(clazz): + return import_module(clazz.__module__) + + +def get_package_dir_for_subclasses_of(clazz): + """There are two occasions where this is used: migrations and service-classes. Depending on the clazz + this function is returning package_directories where subclasses from clazz are supposed to be located + * subclasses of SpecterMigration are located in a subpackage called migrations + * subclasses of Servuce are located in subpackages of package cryptoadvance.specter.services + I have to admit that this is not a pure util class as it's containing business-logic + """ + if clazz.__name__ == "SpecterMigration": + return str( + Path( + Path(_get_module_from_class(clazz).__file__).resolve().parent, + "migrations", + ).resolve() + ) + elif clazz.__name__ == "Service": + return str( + Path( + import_module("cryptoadvance.specter.services").__file__ + ).parent.resolve() + ) + + +def get_subclasses_for_class(clazz): + """Returns all subclasses of class clazz located in the specific package for that class""" + class_list = [] + loopdir = Path(__file__).resolve() + package_dir = get_package_dir_for_subclasses_of(clazz) + logger.info(f"Collecting subclasses of {clazz.__name__} ...") + for (_, module_name, _) in iter_modules( + [package_dir] + ): # import the module and iterate through its attributes + # logger.debug(f"Iterating on {module_name} ") + if clazz.__name__ == "Service": + try: + + module = import_module( + f"cryptoadvance.specter.services.{module_name}.service" + ) + except ModuleNotFoundError: + logger.debug( + f"No Service Impl found in cryptoadvance.specter.services.{module_name}. Skipping!" + ) + continue + elif clazz.__name__ == "SpecterMigration": + module = import_module( + f"cryptoadvance.specter.util.migrations.{module_name}" + ) + for attribute_name in dir(module): + attribute = getattr(module, attribute_name) + if isclass(attribute): + if ( + issubclass(attribute, clazz) + and not attribute.__name__ == clazz.__name__ + ): + class_list.append(attribute) + logger.info(f" Found class {attribute.__name__}") + return class_list diff --git a/src/cryptoadvance/specter/wallet.py b/src/cryptoadvance/specter/wallet.py index e41f2cce8..254d80dc9 100644 --- a/src/cryptoadvance/specter/wallet.py +++ b/src/cryptoadvance/specter/wallet.py @@ -1,31 +1,31 @@ -import copy, hashlib, json, logging, os, re, csv -from csv import Error -from io import StringIO +import json, logging, os, re, csv +import requests +import threading import time + from collections import OrderedDict +from csv import Error +from embit import bip32 +from embit.descriptor import Descriptor +from embit.descriptor.checksum import add_checksum +from embit.ec import PublicKey +from embit.liquid.networks import get_network +from embit.psbt import DerivationPath +from embit.transaction import Transaction +from io import StringIO +from typing import List + +from .addresslist import Address, AddressList from .device import Device from .key import Key from .util.merkleblock import is_valid_merkle_proof -from .helpers import der_to_bytes, get_address_from_dict -from embit import base58, bip32 -from embit.descriptor import Descriptor -from embit.descriptor.checksum import add_checksum -from embit.liquid.networks import get_network -from embit.psbt import PSBT, DerivationPath -from embit.transaction import Transaction -from embit.ec import PublicKey - -from .util.xpub import get_xpub_fingerprint -from .util.tx import decoderawtransaction +from .helpers import get_address_from_dict from .persistence import write_json_file, delete_file, delete_folder -from io import BytesIO from .specter_error import SpecterError -import threading -import requests -from math import ceil -from .addresslist import AddressList from .txlist import TxList from .util.psbt import SpecterPSBT +from .util.tx import decoderawtransaction +from .util.xpub import get_xpub_fingerprint logger = logging.getLogger(__name__) LISTTRANSACTIONS_BATCH_SIZE = 1000 @@ -1002,6 +1002,7 @@ class Wallet: fetch_transactions=True, validate_merkle_proofs=False, current_blockheight=None, + service_id: str = None, ): """Returns a list of all transactions in the wallet's CSV cache - processed with information to display in the UI in the transactions list #Parameters: @@ -1070,11 +1071,21 @@ class Wallet: if isinstance(tx["address"], str): tx["label"] = self.getlabel(tx["address"]) + addr_obj = self.get_address_obj(tx["address"]) + if addr_obj and addr_obj.get("service_id"): + tx["service_id"] = addr_obj["service_id"] elif isinstance(tx["address"], list): + # TODO: Handle services integration w/batch txs tx["label"] = [self.getlabel(address) for address in tx["address"]] else: tx["label"] = None + if service_id and ( + "service_id" not in tx or tx["service_id"] != service_id + ): + # We only want `service_id`-related txs returned + continue + # TODO: validate for unique txids only tx["validated_blockhash"] = "" # default is assume unvalidated if validate_merkle_proofs is True and tx["confirmations"] > 0: @@ -1347,12 +1358,16 @@ class Wallet: if change: self.change_address = address else: + addr_obj = self.get_address_obj(address) + if addr_obj["service_id"]: + # Skip addresses reserved for a Service + return self.getnewaddress(change, save) self.address = address if save: self.save_to_file() return address - def get_address(self, index, change=False, check_keypool=True): + def get_address(self, index, change=False, check_keypool=True) -> str: if check_keypool: pool = self.change_keypool if change else self.keypool logger.debug( @@ -1364,6 +1379,9 @@ class Wallet: self.network ) + def get_address_obj(self, address: str) -> Address: + return self._addresses.get(address) + def derive_descriptor(self, index: int, change: bool, keep_xpubs=False): """ Derives descriptor for receiving or change address with `index`. @@ -1423,7 +1441,8 @@ class Wallet: ), } - def get_address_info(self, address): + def get_address_info(self, address) -> Address: + # TODO: This is a misleading name. This is really fetching an Address obj return self._addresses.get(address) def is_address_mine(self, address): @@ -1586,10 +1605,41 @@ class Wallet: self.save_to_file() return end + def associate_address_with_service( + self, address: str, service_id: str, label: str, autosave: bool = True + ): + """ + Links the Address to the specified Service.id + """ + self._addresses.associate_with_service( + address=address, service_id=service_id, label=label, autosave=autosave + ) + + def deassociate_address(self, address: str, autosave: bool = True): + """ + Clears any Service associations on the Address. + """ + self._addresses.deassociate(address=address, autosave=autosave) + + def get_associated_addresses( + self, service_id: str, unused_only: bool = False + ) -> List[Address]: + """ + Return the Wallet's Address objs that are associated with the specified Service.id + """ + addrs = [] + for addr, addr_obj in self._addresses.items(): + if addr_obj["service_id"] == service_id: + if not unused_only or not addr_obj["used"]: + addrs.append(addr_obj) + return addrs + def setlabel(self, address, label): self._addresses.set_label(address, label) def getlabel(self, address): + # TODO: This is confusing. The Address["label"] attr may be blank but the + # Address.label property will auto-populate a value (e.g. "Address #4"). if address in self._addresses: return self._addresses[address].label else: @@ -1631,8 +1681,8 @@ class Wallet: def createpsbt( self, - addresses: [str], - amounts: [float], + addresses: List[str], + amounts: List[float], subtract: bool = False, subtract_from: int = 0, fee_rate: float = 0, # fee rate to use, if less than MIN_FEE_RATE will use MIN_FEE_RATE, 0 for automatic @@ -1960,10 +2010,19 @@ class Wallet: self.save_pending_psbt(psbt) return psbt.to_dict() - def addresses_info(self, is_change): + def addresses_info( + self, + is_change: bool = False, + service_id: str = None, + include_wallet_alias: bool = False, + ): """Create a list of (receive or change) addresses from cache and retrieve the related UTXO and amount. - Parameters: is_change: if true, return the change addresses else the receive ones. + Parameters: + * is_change: if true, return the change addresses else the receive ones. + * service_id: just return addresses associated for the given Service + * include_wallet_alias: adds `wallet_alias` to each output (useful when this + is called by WalletManager.full_addresses_info() across all Wallets) """ addresses_info = [] @@ -1973,7 +2032,6 @@ class Wallet: ] for addr in addresses_cache: - addr_utxo = 0 addr_amount = 0 @@ -1983,17 +2041,26 @@ class Wallet: addr_amount = addr_amount + utxo["amount"] addr_utxo = addr_utxo + 1 - addresses_info.append( - { - "index": addr.index, - "address": addr.address, - "label": addr.label, - "amount": addr_amount, - "used": bool(addr.used), - "utxo": addr_utxo, - "type": "change" if is_change else "receive", - } - ) + if service_id and ( + "service_id" not in addr or addr["service_id"] != service_id + ): + # Filter this address out + continue + + addr_info = { + "index": addr.index, + "address": addr.address, + "label": addr.label, + "amount": addr_amount, + "used": bool(addr.used), + "utxo": addr_utxo, + "type": "change" if is_change else "receive", + "service_id": addr.service_id, + } + if include_wallet_alias: + addr_info["wallet_alias"] = self.alias + + addresses_info.append(addr_info) return addresses_info diff --git a/tests/conftest.py b/tests/conftest.py index fae9a9d94..3b444495c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,6 +10,7 @@ import time import docker import pytest from cryptoadvance.specter.managers.device_manager import DeviceManager +from cryptoadvance.specter.managers.user_manager import UserManager from cryptoadvance.specter.process_controller.bitcoind_controller import ( BitcoindPlainController, ) @@ -20,7 +21,7 @@ from cryptoadvance.specter.process_controller.elementsd_controller import ( ElementsPlainController, ) from cryptoadvance.specter.rpc import BitcoinRPC -from cryptoadvance.specter.server import create_app, init_app +from cryptoadvance.specter.server import SpecterFlask, create_app, init_app from cryptoadvance.specter.specter import Specter from cryptoadvance.specter.specter_error import SpecterError from cryptoadvance.specter.user import User, hash_password @@ -368,6 +369,34 @@ def device_manager(devices_filled_data_folder): return DeviceManager(os.path.join(devices_filled_data_folder, "devices")) +# @pytest.fixture +# def user_manager(empty_data_folder) -> UserManager: +# """A UserManager having users alice, bob and eve""" +# specter = Specter(data_folder=empty_data_folder) +# user_manager = UserManager(specter=specter) +# config = {} +# user_manager.get_user("admin").decrypt_user_secret("admin") +# user_manager.create_user( +# user_id="alice", +# username="alice", +# plaintext_password="plain_pass_alice", +# config=config, +# ) +# user_manager.create_user( +# user_id="bob", +# username="bob", +# plaintext_password="plain_pass_bob", +# config=config, +# ) +# user_manager.create_user( +# user_id="eve", +# username="eve", +# plaintext_password="plain_pass_eve", +# config=config, +# ) +# return user_manager + + @pytest.fixture def specter_regtest_configured(bitcoin_regtest, devices_filled_data_folder): assert bitcoin_regtest.get_rpc().test_connection() @@ -447,7 +476,7 @@ def specter_regtest_configured(bitcoin_regtest, devices_filled_data_folder): @pytest.fixture -def app(specter_regtest_configured): +def app(specter_regtest_configured) -> SpecterFlask: """the Flask-App, but uninitialized""" app = create_app(config="cryptoadvance.specter.config.TestConfig") app.app_context().push() @@ -459,6 +488,19 @@ def app(specter_regtest_configured): return app +@pytest.fixture +def app_no_node(empty_data_folder) -> SpecterFlask: + specter = Specter(data_folder=empty_data_folder) + app = create_app(config="cryptoadvance.specter.config.TestConfig") + app.app_context().push() + app.config["TESTING"] = True + app.testing = True + app.tor_service_id = None + app.tor_enabled = False + init_app(app, specter=specter) + return app + + @pytest.fixture def client(app): """a test_client from an initialized Flask-App""" diff --git a/tests/install_noded.sh b/tests/install_noded.sh index 2ed3f8c66..2a714cd35 100755 --- a/tests/install_noded.sh +++ b/tests/install_noded.sh @@ -153,9 +153,10 @@ function build_node_impl { function sub_help { echo "This script will result in having bitcoind or elementsd binaries, either by binary download or via compilation" echo "Do one of these:" - echo "$ ./install_noded.sh --bitcoin compile" - echo "$ ./install_noded.sh --elements compile" - echo "$ ./install_noded.sh --bitcoin binary # only works for bitcoind currently, no binaries for elements" + echo "$ ./install_node.sh --bitcoin binary" + echo "$ ./install_node.sh --bitcoin compile" + echo "$ ./install_node.sh --elements binary" + echo "$ ./install_node.sh --elements compile" echo "For more context, see https://github.com/cryptoadvance/specter-desktop/blob/master/docs/development.md#how-to-run-the-tests" } @@ -266,7 +267,7 @@ function sub_binary { function parse_and_execute() { if [[ $# = 0 ]]; then - sub_default + sub_help exit 0 fi diff --git a/tests/test_services.py b/tests/test_services.py new file mode 100644 index 000000000..0d13b9dc3 --- /dev/null +++ b/tests/test_services.py @@ -0,0 +1,218 @@ +import json +import pytest + +from flask_login import current_user +from flask_login.utils import login_user, logout_user +from mock import patch, Mock +from tempfile import TemporaryDirectory +from unittest.mock import MagicMock +from unittest import TestCase + +from cryptoadvance.specter.managers.user_manager import UserManager +from cryptoadvance.specter.server import SpecterFlask +from cryptoadvance.specter.services.service import Service +from cryptoadvance.specter.services.service_encrypted_storage import ( + ServiceEncryptedStorage, + ServiceEncryptedStorageError, + ServiceEncryptedStorageManager, +) +from cryptoadvance.specter.services.service_manager import ServiceManager +from cryptoadvance.specter.user import User, hash_password + + +class FakeService(Service): + # A dummy Service just used by the test suite + id = "test_service" + name = "Test Service" + has_blueprint = False + + +# @patch("cryptoadvance.specter.services.service_manager.app") +# def test_ServiceManager_loads_services(empty_data_folder, app): +# # app.config = MagicMock() +# # app.config.get.return_value = "prod" +# specter_mock = MagicMock() +# specter_mock.data_folder.return_value = empty_data_folder + +# service_manager = ServiceManager(specter=specter_mock, devstatus_threshold="alpha") +# services = service_manager.services +# assert "swan" in services + + +def test_ServiceEncryptedStorage(empty_data_folder): + specter_mock = Mock() + specter_mock.config = {"uid": ""} + specter_mock.user_manager = Mock() + specter_mock.user_manager.users = [""] + + user1 = User.from_json( + user_dict={ + "id": "user1", + "username": "user1", + "password": hash_password("somepassword"), + "config": {}, + "is_admin": False, + "services": None, + }, + specter=specter_mock, + ) + user2 = User.from_json( + user_dict={ + "id": "user2", + "username": "user2", + "password": hash_password("somepassword"), + "config": {}, + "is_admin": False, + "services": None, + }, + specter=specter_mock, + ) + user1._generate_user_secret("muh") + + # Can set and get service storage fields + service_storage = ServiceEncryptedStorage(empty_data_folder, user1) + service_storage.set_service_data("a_service_id", {"somekey": "green"}) + assert service_storage.get_service_data("a_service_id") == {"somekey": "green"} + assert service_storage.get_service_data("another_service_id") == {} + + # We expect a call for a user that isn't logged in to fail + with pytest.raises(ServiceEncryptedStorageError) as execinfo: + ServiceEncryptedStorage(empty_data_folder, user2) + assert "must be authenticated with password" in str(execinfo.value) + + +def test_access_encrypted_storage_after_login(app_no_node: SpecterFlask): + """ServiceEncryptedStorage should be accessible (decryptable) after user login""" + # Create test users; automatically generates their `user_secret` and kept decrypted + # in memory. + user_manager: UserManager = app_no_node.specter.user_manager + user_manager.create_user( + user_id="bob", + username="bob", + plaintext_password="plain_pass_bob", + config={}, + ) + user_manager.create_user( + user_id="alice", + username="alice", + plaintext_password="plain_pass_alice", + config={}, + ) + + # The ServiceEncryptedStorageManager singleton creates a mess in the test suite. Have + # to override its (potentially) already-set values with references to this test's + # new instances and temp storage dir. + storage_manager = ServiceEncryptedStorageManager.get_instance() + storage_manager.data_folder = user_manager.data_folder + storage_manager.user_manager = user_manager + storage_manager.storage_by_user = {} + + # Need a simulated request context to enable `current_user` lookup + with app_no_node.test_request_context(): + login_user(user_manager.get_user("bob")) + + # Test user's service_data should be decryptable but initially empty + service_data = storage_manager.get_current_user_service_data( + service_id=FakeService.id + ) + assert service_data == {} + storage_manager.update_current_user_service_data( + service_id=FakeService.id, service_data={"somekey": "green"} + ) + + logout_user() + + # Meanwhile Alice's account storage will still be blank... + login_user(user_manager.get_user("alice")) + service_data = storage_manager.get_current_user_service_data( + service_id=FakeService.id + ) + assert ( + storage_manager.get_current_user_service_data(service_id=FakeService.id) + == {} + ) + + logout_user() + + # ...while Bob's can be retrieved when he's logged in. + login_user(user_manager.get_user("bob")) + service_data = storage_manager.get_current_user_service_data( + service_id=FakeService.id + ) + assert storage_manager.get_current_user_service_data( + service_id=FakeService.id + ) == {"somekey": "green"} + + +def test_remove_all_services_from_user(app_no_node: SpecterFlask, empty_data_folder): + """ServiceEncryptedStorage should be accessible (decryptable) after user login""" + # Create test users; automatically generates their `user_secret` and kept decrypted + # in memory. + user_manager: UserManager = app_no_node.specter.user_manager + user_manager.create_user( + user_id="bob", + username="bob", + plaintext_password="plain_pass_bob", + config={}, + ) + + # The ServiceEncryptedStorageManager singleton creates a mess in the test suite. Have + # to override its (potentially) already-set values with references to this test's + # new instances and temp storage dir. + storage_manager = ServiceEncryptedStorageManager.get_instance() + storage_manager.data_folder = user_manager.data_folder + storage_manager.user_manager = user_manager + storage_manager.storage_by_user = {} + + # Need a simulated request context to enable `current_user` lookup + with app_no_node.test_request_context(): + user = user_manager.get_user("bob") + login_user(user) + + # Test user's service_data should be decryptable but initially empty + service_data = storage_manager.get_current_user_service_data( + service_id=FakeService.id + ) + assert service_data == {} + storage_manager.update_current_user_service_data( + service_id=FakeService.id, service_data={"somekey": "green"} + ) + + # Check on disk. The _services.json should now have our data. + service_encrypted_storage_file = ( + storage_manager._get_current_user_service_storage().data_file + ) + with open(service_encrypted_storage_file, "r") as storage_json_file: + data_on_disk = json.load(storage_json_file) + + # Can't test the actual values because they're encrypted, but the Service.id key is plaintext + assert FakeService.id in data_on_disk + + # Now remove all + app_no_node.specter.service_manager.remove_all_services_from_user(user) + + # Verify data on disk; Bob's user should have his user_secret cleared. + users_file = app_no_node.specter.user_manager.users_file + with open(users_file, "r") as storage_json_file: + data_on_disk = json.load(storage_json_file) + found_bob = False + for user_entry in data_on_disk: + if user_entry["id"] == "bob": + found_bob = True + assert user_entry.get("encrypted_user_secret") is None + assert found_bob + + # With no `user_secret` the decryption attempt must fail. + with pytest.raises(ServiceEncryptedStorageError) as execinfo: + storage_manager._get_current_user_service_storage() + assert "must be authenticated with password" in str(execinfo.value) + + # Should now be cleared in memory (have to request raw data since we can't + # decrypt)... + service_encrypted_storage = storage_manager.get_raw_encrypted_data(user) + assert service_encrypted_storage == {} + + # ...and on disk + with open(service_encrypted_storage_file, "r") as storage_json_file: + data_on_disk = json.load(storage_json_file) + assert data_on_disk == {} diff --git a/tests/test_user.py b/tests/test_user.py index 3c1d3c72b..cd862c901 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,7 +1,6 @@ import json, logging, pytest from cryptoadvance.specter.specter import Specter from cryptoadvance.specter.user import User, hash_password, verify_password -from cryptoadvance.specter.managers.user_manager import UserManager def test_password_hash(): diff --git a/tests/test_util_reflection.py b/tests/test_util_reflection.py new file mode 100644 index 000000000..7a375c72a --- /dev/null +++ b/tests/test_util_reflection.py @@ -0,0 +1,37 @@ +import logging +from pathlib import Path +from cryptoadvance.specter.util.reflection import ( + get_subclasses_for_class, + _get_module_from_class, + get_package_dir_for_subclasses_of, +) +from cryptoadvance.specter.util.specter_migrator import SpecterMigration +from cryptoadvance.specter.util.migrations.migration_0000 import SpecterMigration_0000 +from cryptoadvance.specter.services.service_manager import Service +from cryptoadvance.specter.services.swan.service import SwanService +from cryptoadvance.specter.services.bitcoinreserve.service import BitcoinReserveService + + +def test_get_module_from_class(): + assert ( + _get_module_from_class(SpecterMigration).__name__ + == "cryptoadvance.specter.util.specter_migrator" + ) + + +def test_get_package_dir_for_subclasses_of(): + assert get_package_dir_for_subclasses_of(SpecterMigration).endswith( + "cryptoadvance/specter/util/migrations" + ) + assert get_package_dir_for_subclasses_of(Service).endswith( + "cryptoadvance/specter/services" + ) + + +def test_get_subclasses_in_packagedir(caplog): + caplog.set_level(logging.INFO) + classlist = get_subclasses_for_class(SpecterMigration) + assert SpecterMigration_0000 in classlist + classlist = get_subclasses_for_class(Service) + assert SwanService in classlist + assert BitcoinReserveService in classlist