2323from cryptoadvance .specter .user import User , hash_password
2424
2525
26+ class FakeServiceNoEncryption (Service ):
27+ # A dummy Service just used by the test suite
28+ id = "test_service_no_encryption"
29+ name = "Test Service no encryption"
30+ has_blueprint = False
31+ encrypt_data = False
32+
33+
2634class FakeService (Service ):
2735 # A dummy Service just used by the test suite
2836 id = "test_service"
2937 name = "Test Service"
3038 has_blueprint = False
39+ encrypt_data = True
3140
3241
3342# @patch("cryptoadvance.specter.services.service_manager.app")
@@ -158,7 +167,9 @@ def test_access_encrypted_storage_after_login(app_no_node: SpecterFlask):
158167 ) == {"somekey" : "green" }
159168
160169
161- def test_remove_all_services_from_user (app_no_node : SpecterFlask , empty_data_folder ):
170+ def test_remove_encrypted_services_from_user (
171+ app_no_node : SpecterFlask , empty_data_folder
172+ ):
162173 """ServiceEncryptedStorage should be accessible (decryptable) after user login"""
163174 # Create test users; automatically generates their `user_secret` and kept decrypted
164175 # in memory.
@@ -170,9 +181,8 @@ def test_remove_all_services_from_user(app_no_node: SpecterFlask, empty_data_fol
170181 config = {},
171182 )
172183
173- storage_manager = ServiceEncryptedStorageManager (
174- user_manager .data_folder , user_manager
175- )
184+ storage_manager = app_no_node .specter .service_encrypted_storage_manager
185+ service_manager = app_no_node .specter .service_manager
176186 storage_manager .storage_by_user = {}
177187
178188 # Need a simulated request context to enable `current_user` lookup
@@ -199,8 +209,22 @@ def test_remove_all_services_from_user(app_no_node: SpecterFlask, empty_data_fol
199209 # Can't test the actual values because they're encrypted, but the Service.id key is plaintext
200210 assert FakeService .id in data_on_disk
201211
202- # Now remove all
203- app_no_node .specter .service_manager .remove_all_services_from_user (user )
212+ # Remove all services that need encryption
213+ # we add the fakeservice to the service_manager.services otherwise delete_services_with_encrypted_storage doesn't know it exists
214+ # strictly speaking the important call is here user.delete_user_secret(autosave=True) which will execute regardless of adding fakeservice
215+ fake_service = FakeService (True , app_no_node .specter )
216+ service_manager .services [fake_service .id ] = fake_service
217+ assert fake_service .id in service_manager .services
218+
219+ # also add it to the user, and check later it was remove from the user
220+ user .add_service (fake_service .id )
221+ assert user .has_service (fake_service .id )
222+
223+ app_no_node .specter .service_manager .delete_services_with_encrypted_storage (user )
224+ # the user should not have the fake_service activated any more
225+ assert not user .has_service (fake_service .id )
226+ # the service_manager on the other hand keeps all services, no matter what
227+ assert service_manager .services [fake_service .id ]
204228
205229 # Verify data on disk; Bob's user should have his user_secret cleared.
206230 users_file = app_no_node .specter .user_manager .users_file
@@ -230,6 +254,69 @@ def test_remove_all_services_from_user(app_no_node: SpecterFlask, empty_data_fol
230254 assert data_on_disk == {}
231255
232256
257+ def test_check_differences_between_encrypted_and_non_encrypted_services (
258+ app_no_node : SpecterFlask , empty_data_folder
259+ ):
260+ """ServiceEncryptedStorage should be accessible (decryptable) after user login"""
261+ # Create test users; automatically generates their `user_secret` and kept decrypted
262+ # in memory.
263+ user_manager : UserManager = app_no_node .specter .user_manager
264+ user_manager .create_user (
265+ user_id = "bob" ,
266+ username = "bob" ,
267+ plaintext_password = "plain_pass_bob" ,
268+ config = {},
269+ )
270+
271+ service_manager = app_no_node .specter .service_manager
272+ user = user_manager .get_user ("bob" )
273+
274+ def setup_services ():
275+ # Remove all services that need encryption
276+ # we add the fakeservice to the service_manager.services otherwise delete_services_with_encrypted_storage doesn't know it exists
277+ # strictly speaking the important call is here user.delete_user_secret(autosave=True) which will execute regardless of adding fakeservice
278+ fake_service = FakeService (True , app_no_node .specter )
279+ fake_service_no_encryption = FakeServiceNoEncryption (True , app_no_node .specter )
280+ service_manager .services [fake_service .id ] = fake_service
281+ service_manager .services [
282+ fake_service_no_encryption .id
283+ ] = fake_service_no_encryption
284+ assert fake_service .id in service_manager .services
285+ assert fake_service_no_encryption .id in service_manager .services
286+
287+ # also add it to the user, and check later it was remove from the user
288+ user .add_service (fake_service .id )
289+ user .add_service (fake_service_no_encryption .id )
290+ assert user .has_service (fake_service .id )
291+ assert user .has_service (fake_service_no_encryption .id )
292+
293+ return fake_service , fake_service_no_encryption
294+
295+ fake_service , fake_service_no_encryption = setup_services ()
296+ # delete the encrypted ones
297+ app_no_node .specter .service_manager .delete_services_with_encrypted_storage (user )
298+ assert not user .has_service (fake_service .id )
299+ assert user .has_service (fake_service_no_encryption .id )
300+ # delete the unencrypted ones
301+ app_no_node .specter .service_manager .delete_services_with_unencrypted_storage (user )
302+ assert not user .has_service (fake_service_no_encryption .id )
303+
304+ # now setup again and check a different order of execution
305+ fake_service , fake_service_no_encryption = setup_services ()
306+ # delete the unencrypted ones
307+ app_no_node .specter .service_manager .delete_services_with_unencrypted_storage (user )
308+ assert not user .has_service (fake_service_no_encryption .id )
309+ assert user .has_service (fake_service .id )
310+ # delete the encrypted ones
311+ app_no_node .specter .service_manager .delete_services_with_encrypted_storage (user )
312+ # the user should not have the fake_service activated any more
313+ assert not user .has_service (fake_service .id )
314+
315+ # the service_manager on the other hand keeps all services, no matter what
316+ assert service_manager .services [fake_service .id ]
317+ assert service_manager .services [fake_service_no_encryption .id ]
318+
319+
233320def test_ServiceUnEncryptedStorage (empty_data_folder , user1 , user2 ):
234321 user1 ._generate_user_secret ("muh" )
235322
0 commit comments