mirror of
https://github.com/cryptoadvance/specter-desktop.git
synced 2026-08-13 12:33:29 +02:00
* add spectrum * rc3 of spectrum * spectrum rc4 * missing __init__.py * changes for rc6 * make cli-arguments work in electron * update spectrum to remove simplejson * Bugfix devices not shown * additional checks for wallet_import * nodes template magic to improve extensibility * smaller bugfixes * update spectrum * keep python 3.9 in pre-commit-yaml * specter_added_to_flask_app callback added * useful logger + avoid writing to config with no node alias * Using FlaskThread * remove overriding chain property in node.py * nodes_by_chain method added to node mananger * icons for spectrum setup * keep external_node and fix test * bump spectrum version * more visibility * deactivate checker_threads for testing Co-authored-by: k9ert <kim@swanbitcoin.com> Co-authored-by: Manolis Mandrapilias <70536101+moneymanolis@users.noreply.github.com> Co-authored-by: moneymanolis <moneymanolis@protonmail.com>
164 lines
5.4 KiB
Python
164 lines
5.4 KiB
Python
import json, logging, pytest
|
|
from cryptoadvance.specter.specter import Specter
|
|
from cryptoadvance.specter.user import User, hash_password, verify_password
|
|
|
|
|
|
def test_password_hash():
|
|
"""
|
|
verify_password should succeed when presented with hash_password and the same
|
|
password that was hashed. It should fail when given a different password.
|
|
"""
|
|
password = "somepassword"
|
|
password_hash = hash_password(password)
|
|
assert verify_password(password_hash, password)
|
|
assert not verify_password(password_hash, "wrongpassword")
|
|
|
|
|
|
def test_generate_user_secret_on_decrypt_user_secret(empty_data_folder):
|
|
"""
|
|
Should generate a user_secret if one does not yet exist when decrypt_user_secret
|
|
is called (happens during the login flow).
|
|
"""
|
|
specter = Specter(data_folder=empty_data_folder, checker_threads=False)
|
|
|
|
password = "somepassword"
|
|
user = User.from_json(
|
|
user_dict={
|
|
"id": "someuser",
|
|
"username": "someuser",
|
|
"password": hash_password(password),
|
|
"config": {},
|
|
"is_admin": False,
|
|
"services": None,
|
|
},
|
|
specter=specter,
|
|
)
|
|
|
|
assert user.encrypted_user_secret is None
|
|
assert user.plaintext_user_secret is None
|
|
|
|
# Even though there's no user_secret yet, the flow calls decrypt anyway...
|
|
user.decrypt_user_secret(password)
|
|
|
|
# ...and a new user_secret is created and stored encrypted and plaintext
|
|
assert user.encrypted_user_secret is not None
|
|
assert user.plaintext_user_secret is not None
|
|
|
|
|
|
def test_generate_user_secret_on_set_password(empty_data_folder):
|
|
"""
|
|
Should generate a user_secret if one does not yet exist when the User's password
|
|
is changed via set_password.
|
|
"""
|
|
specter = Specter(data_folder=empty_data_folder, checker_threads=False)
|
|
|
|
password = "somepassword"
|
|
user = User.from_json(
|
|
user_dict={
|
|
"id": "someuser",
|
|
"username": "someuser",
|
|
"password": hash_password(password),
|
|
"config": {},
|
|
"is_admin": False,
|
|
"services": None,
|
|
},
|
|
specter=specter,
|
|
)
|
|
|
|
assert user.encrypted_user_secret is None
|
|
assert user.plaintext_user_secret is None
|
|
|
|
new_password = "mynewpassphrase"
|
|
user.set_password(new_password)
|
|
|
|
assert user.encrypted_user_secret is not None
|
|
assert user.plaintext_user_secret is not None
|
|
|
|
# Reset the plaintext user_secret and test decryption
|
|
user.plaintext_user_secret = None
|
|
user.decrypt_user_secret(new_password)
|
|
|
|
assert user.plaintext_user_secret is not None
|
|
|
|
|
|
def test_reencrypt_user_secret_on_set_password(empty_data_folder):
|
|
"""
|
|
Should re-encrypt the user_secret when the user changes their password.
|
|
"""
|
|
specter = Specter(data_folder=empty_data_folder, checker_threads=False)
|
|
|
|
password = "somepassword"
|
|
user = User.from_json(
|
|
user_dict={
|
|
"id": "someuser",
|
|
"username": "someuser",
|
|
"password": hash_password(password),
|
|
"config": {},
|
|
"is_admin": False,
|
|
"services": None,
|
|
},
|
|
specter=specter,
|
|
)
|
|
|
|
# Force generation of a new user_secret
|
|
user.decrypt_user_secret(password)
|
|
assert user.encrypted_user_secret is not None
|
|
assert user.plaintext_user_secret is not None
|
|
|
|
first_encrypted_user_secret = user.encrypted_user_secret
|
|
first_plaintext_user_secret = user.plaintext_user_secret
|
|
|
|
new_password = "mynewpassphrase"
|
|
user.set_password(new_password)
|
|
|
|
# The new encrypted_user_secret will be different...
|
|
assert first_encrypted_user_secret != user.encrypted_user_secret
|
|
|
|
# ...but the plaintext_user_secret remains unchanged
|
|
assert first_plaintext_user_secret == user.plaintext_user_secret
|
|
|
|
|
|
def test_reencrypt_user_secret_on_iterations_increase(empty_data_folder):
|
|
"""
|
|
Should re-encrypt the user_secret when the User.encryption_iterations is increased
|
|
"""
|
|
specter = Specter(data_folder=empty_data_folder, checker_threads=False)
|
|
|
|
password = "somepassword"
|
|
user = User.from_json(
|
|
user_dict={
|
|
"id": "someuser",
|
|
"username": "someuser",
|
|
"password": hash_password(password),
|
|
"config": {},
|
|
"is_admin": False,
|
|
"services": None,
|
|
},
|
|
specter=specter,
|
|
)
|
|
|
|
# Override current default iterations setting
|
|
original_encryption_iterations = user.encryption_iterations
|
|
user.encryption_iterations -= 10000
|
|
|
|
# Force generation of a new user_secret
|
|
user.decrypt_user_secret(password)
|
|
assert user.encrypted_user_secret is not None
|
|
assert user.plaintext_user_secret is not None
|
|
assert user.encrypted_user_secret["iterations"] < original_encryption_iterations
|
|
|
|
first_encrypted_user_secret = user.encrypted_user_secret
|
|
first_plaintext_user_secret = user.plaintext_user_secret
|
|
|
|
# Reset iterations to default
|
|
user.encryption_iterations = original_encryption_iterations
|
|
|
|
# On decrypt, should automatically re-encrypt the `user_secret`
|
|
user.decrypt_user_secret(password)
|
|
assert user.encrypted_user_secret["iterations"] == original_encryption_iterations
|
|
|
|
# The new encrypted_user_secret will be different...
|
|
assert first_encrypted_user_secret != user.encrypted_user_secret
|
|
|
|
# ...but the plaintext_user_secret remains unchanged
|
|
assert first_plaintext_user_secret == user.plaintext_user_secret
|