Example #1
0
    def test_update_signatures(self, mocker, mock_logger):
        # Make sure the test environment is clean. This test is invalid otherwise.
        assert Recipe.objects.all().count() == 0

        # Mock the Autographer
        mock_autograph = mocker.patch('normandy.recipes.models.Autographer')
        mock_autograph.return_value.sign_data.return_value = [
            {
                'signature': 'fake signature 1'
            },
            {
                'signature': 'fake signature 2'
            },
        ]

        # Make and sign two recipes
        (recipe1, recipe2) = RecipeFactory.create_batch(2)
        Recipe.objects.all().update_signatures()

        # Assert that the signature update is logged.
        mock_logger.info.assert_called_with(
            Whatever.contains(str(recipe1.id), str(recipe2.id)),
            extra={
                'code': INFO_REQUESTING_RECIPE_SIGNATURES,
                'recipe_ids': Whatever.contains(recipe1.id, recipe2.id)
            })

        # Assert the autographer was used as expected
        assert mock_autograph.called
        assert mock_autograph.return_value.sign_data.called_with(
            [Whatever(), Whatever()])
        signatures = list(Recipe.objects.all().values_list(
            'signature__signature', flat=True))
        assert signatures == ['fake signature 1', 'fake signature 2']
Example #2
0
    def test_update_signatures(self, mocker, mock_logger):
        # Make sure the test environment is clean. This test is invalid otherwise.
        assert Action.objects.all().count() == 0

        # Mock the Autographer
        mock_autograph = mocker.patch('normandy.recipes.models.Autographer')
        mock_autograph.return_value.sign_data.return_value = [
            {
                'signature': 'fake signature 1'
            },
            {
                'signature': 'fake signature 2'
            },
        ]

        # Make and sign two actions
        (action1, action2) = ActionFactory.create_batch(2)
        Action.objects.all().update_signatures()

        # Assert that the signature update is logged.
        mock_logger.info.assert_called_with(
            Whatever.contains(action1.name, action2.name),
            extra={
                'code': INFO_REQUESTING_ACTION_SIGNATURES,
                'action_names': Whatever.contains(action1.name, action2.name),
            })

        # Assert the autographer was used as expected
        assert mock_autograph.called
        assert mock_autograph.return_value.sign_data.called_with(
            [Whatever(), Whatever()])
        signatures = list(Action.objects.all().values_list(
            'signature__signature', flat=True))
        assert signatures == ['fake signature 1', 'fake signature 2']
 def test_log_failure_no_username(self, mock_logger, mock_authenticate):
     mock_authenticate.return_value = None
     request = RequestFactory().get("/")
     user = LoggingModelBackend().authenticate(request, password="******")
     assert user is None
     mock_logger.warning.assert_called_with(
         Whatever.contains("no username provided"), extra={"code": WARNING_LOGIN_FAILURE}
     )
 def test_log_success(self, mock_logger, mock_authenticate):
     mock_authenticate.return_value = True
     user = LoggingModelBackend().authenticate(username='******', password='******')
     assert user
     mock_logger.info.assert_called_with(
         Whatever.contains('fakeuser'),
         extra={'code': INFO_LOGIN_SUCCESS}
     )
 def test_log_failure_no_username(self, mock_logger, mock_authenticate):
     mock_authenticate.return_value = None
     user = LoggingModelBackend().authenticate(password='******')
     assert user is None
     mock_logger.warning.assert_called_with(
         Whatever.contains('no username provided'),
         extra={'code': WARNING_LOGIN_FAILURE}
     )
Example #6
0
 def test_log_success(self, mock_logger, mock_authenticate):
     mock_authenticate.return_value = True
     request = RequestFactory().get("/")
     user = LoggingModelBackend().authenticate(request,
                                               username="******",
                                               password="******")
     assert user
     mock_logger.info.assert_called_with(Whatever.contains("fakeuser"),
                                         extra={"code": INFO_LOGIN_SUCCESS})
Example #7
0
 def test_log_failure_no_username(self, mock_logger, mock_authenticate):
     mock_authenticate.return_value = None
     request = RequestFactory().get("/")
     user = LoggingModelBackend().authenticate(request,
                                               password="******")
     assert user is None
     mock_logger.warning.assert_called_with(
         Whatever.contains("no username provided"),
         extra={"code": WARNING_LOGIN_FAILURE})
 def test_log_success(self, mock_logger, mock_authenticate):
     mock_authenticate.return_value = True
     request = RequestFactory().get("/")
     user = LoggingModelBackend().authenticate(
         request, username="******", password="******"
     )
     assert user
     mock_logger.info.assert_called_with(
         Whatever.contains("fakeuser"), extra={"code": INFO_LOGIN_SUCCESS}
     )
Example #9
0
 def test_update_signature(self, mock_logger, mocked_autograph):
     recipe = RecipeFactory(enabler=UserFactory(), approver=UserFactory())
     recipe.signature = None
     recipe.update_signature()
     mock_logger.info.assert_called_with(
         Whatever.contains(str(recipe.id)),
         extra={"code": INFO_REQUESTING_RECIPE_SIGNATURES, "recipe_ids": [recipe.id]},
     )
     mocked_autograph.return_value.sign_data.assert_called_with(
         [Whatever(lambda s: json.loads(s)["id"] == recipe.id)]
     )
     assert recipe.signature is not None
Example #10
0
 def test_update_signature(self, mock_logger, mocked_autograph):
     recipe = RecipeFactory(enabler=UserFactory(), approver=UserFactory())
     recipe.signature = None
     recipe.update_signature()
     mock_logger.info.assert_called_with(
         Whatever.contains(str(recipe.id)),
         extra={"code": INFO_REQUESTING_RECIPE_SIGNATURES, "recipe_ids": [recipe.id]},
     )
     mocked_autograph.return_value.sign_data.assert_called_with(
         [Whatever(lambda s: json.loads(s)["id"] == recipe.id)]
     )
     assert recipe.signature is not None
Example #11
0
    def test_update_signature(self, mocker, mock_logger):
        # Mock the Autographer
        mock_autograph = mocker.patch("normandy.recipes.models.Autographer")
        mock_autograph.return_value.sign_data.return_value = [{"signature": "fake signature"}]

        action = ActionFactory(signed=False)
        action.update_signature()
        mock_logger.info.assert_called_with(
            Whatever.contains(action.name),
            extra={"code": INFO_REQUESTING_ACTION_SIGNATURES, "action_names": [action.name]},
        )

        action.save()
        assert action.signature is not None
        assert action.signature.signature == "fake signature"
Example #12
0
    def test_update_signature(self, mocker, mock_logger):
        # Mock the Autographer
        mock_autograph = mocker.patch("normandy.recipes.models.Autographer")
        mock_autograph.return_value.sign_data.return_value = [{"signature": "fake signature"}]

        action = ActionFactory(signed=False)
        action.update_signature()
        mock_logger.info.assert_called_with(
            Whatever.contains(action.name),
            extra={"code": INFO_REQUESTING_ACTION_SIGNATURES, "action_names": [action.name]},
        )

        action.save()
        assert action.signature is not None
        assert action.signature.signature == "fake signature"
Example #13
0
    def test_update_signature(self, mocker, mock_logger):
        # Mock the Autographer
        mock_autograph = mocker.patch('normandy.recipes.models.Autographer')
        mock_autograph.return_value.sign_data.return_value = [
            {
                'signature': 'fake signature'
            },
        ]

        recipe = RecipeFactory(signed=False)
        recipe.update_signature()
        mock_logger.info.assert_called_with(
            Whatever.contains(str(recipe.id)),
            extra={
                'code': INFO_REQUESTING_RECIPE_SIGNATURES,
                'recipe_ids': [recipe.id]
            })

        recipe.save()
        assert recipe.signature is not None
        assert recipe.signature.signature == 'fake signature'
Example #14
0
    def test_it_interacts_with_autograph_correctly(self, settings,
                                                   mock_logger):
        settings.AUTOGRAPH_URL = 'https://autograph.example.com'
        settings.AUTOGRAPH_HAWK_ID = 'hawk id'
        settings.AUTOGRAPH_HAWK_SECRET_KEY = 'hawk secret key'

        autographer = signing.Autographer()
        autographer.session = MagicMock()

        autographer.session.post.return_value.json.return_value = [{
            'content-signature':
            ('x5u="https://example.com/fake_x5u_1";p384ecdsa=fake_signature_1'
             ),
            'x5u':
            'https://example.com/fake_x5u_1',
            'hash_algorithm':
            'sha384',
            'ref':
            'fake_ref_1',
            'signature':
            'fake_signature_1',
            'public_key':
            'fake_pubkey_1',
        }, {
            'content-signature':
            ('x5u="https://example.com/fake_x5u_2";p384ecdsa=fake_signature_2'
             ),
            'x5u':
            'https://example.com/fake_x5u_2',
            'hash_algorithm':
            'sha384',
            'ref':
            'fake_ref_2',
            'signature':
            'fake_signature_2',
            'public_key':
            'fake_pubkey_2',
        }]

        url = self.test_settings['URL'] + 'sign/data'
        foo_base64 = base64.b64encode(b'foo').decode('utf8')
        bar_base64 = base64.b64encode(b'bar').decode('utf8')

        # Assert the correct data is returned
        assert autographer.sign_data([b'foo', b'bar']) == [{
            'timestamp':
            Whatever(),
            'signature':
            'fake_signature_1',
            'x5u':
            'https://example.com/fake_x5u_1',
            'public_key':
            'fake_pubkey_1',
        }, {
            'timestamp':
            Whatever(),
            'signature':
            'fake_signature_2',
            'x5u':
            'https://example.com/fake_x5u_2',
            'public_key':
            'fake_pubkey_2',
        }]

        # Assert that logging happened
        mock_logger.info.assert_called_with(
            Whatever.contains('2'),
            extra={'code': signing.INFO_RECEIVED_SIGNATURES})

        # Assert the correct request was made
        assert autographer.session.post.called_once_with([
            url,
            [
                {
                    'template': 'content-signature',
                    'input': foo_base64
                },
                {
                    'template': 'content-signature',
                    'input': bar_base64
                },
            ]
        ])
Example #15
0
 def test_update_logging(self, mock_logger):
     recipe = RecipeFactory(name="my name")
     recipe.revise(name="my name", force=True)
     mock_logger.info.assert_called_with(
         Whatever.contains(str(recipe.id)),
         extra={"code": INFO_CREATE_REVISION})
Example #16
0
    def test_it_interacts_with_autograph_correctly(self, settings,
                                                   mock_logger):
        settings.AUTOGRAPH_URL = "https://autograph.example.com"
        settings.AUTOGRAPH_HAWK_ID = "hawk id"
        settings.AUTOGRAPH_HAWK_SECRET_KEY = "hawk secret key"

        autographer = signing.Autographer()
        autographer.session = MagicMock()

        autographer.session.post.return_value.json.return_value = [
            {
                "content-signature":
                ('x5u="https://example.com/fake_x5u_1";p384ecdsa=fake_signature_1'
                 ),
                "x5u":
                "https://example.com/fake_x5u_1",
                "hash_algorithm":
                "sha384",
                "ref":
                "fake_ref_1",
                "signature":
                "fake_signature_1",
                "public_key":
                "fake_pubkey_1",
            },
            {
                "content-signature":
                ('x5u="https://example.com/fake_x5u_2";p384ecdsa=fake_signature_2'
                 ),
                "x5u":
                "https://example.com/fake_x5u_2",
                "hash_algorithm":
                "sha384",
                "ref":
                "fake_ref_2",
                "signature":
                "fake_signature_2",
                "public_key":
                "fake_pubkey_2",
            },
        ]

        url = self.test_settings["URL"] + "sign/data"
        foo_base64 = base64.b64encode(b"foo").decode("utf8")
        bar_base64 = base64.b64encode(b"bar").decode("utf8")

        # Assert the correct data is returned
        assert autographer.sign_data([b"foo", b"bar"]) == [
            {
                "timestamp": Whatever(),
                "signature": "fake_signature_1",
                "x5u": "https://example.com/fake_x5u_1",
                "public_key": "fake_pubkey_1",
            },
            {
                "timestamp": Whatever(),
                "signature": "fake_signature_2",
                "x5u": "https://example.com/fake_x5u_2",
                "public_key": "fake_pubkey_2",
            },
        ]

        # Assert that logging happened
        mock_logger.info.assert_called_with(
            Whatever.contains("2"),
            extra={"code": signing.INFO_RECEIVED_SIGNATURES})

        # Assert the correct request was made
        assert autographer.session.post.called_once_with([
            url,
            [
                {
                    "template": "content-signature",
                    "input": foo_base64
                },
                {
                    "template": "content-signature",
                    "input": bar_base64
                },
            ],
        ])
Example #17
0
 def test_update_logging(self, mock_logger):
     recipe = RecipeFactory(name="my name")
     recipe.revise(name="my name", force=True)
     mock_logger.info.assert_called_with(
         Whatever.contains(str(recipe.id)), extra={"code": INFO_CREATE_REVISION}
     )
Example #18
0
    def test_it_interacts_with_autograph_correctly(self, settings, mock_logger):
        settings.AUTOGRAPH_URL = "https://autograph.example.com"
        settings.AUTOGRAPH_HAWK_ID = "hawk id"
        settings.AUTOGRAPH_HAWK_SECRET_KEY = "hawk secret key"

        autographer = signing.Autographer()
        autographer.session = MagicMock()

        autographer.session.post.return_value.json.return_value = [
            {
                "content-signature": (
                    'x5u="https://example.com/fake_x5u_1";p384ecdsa=fake_signature_1'
                ),
                "x5u": "https://example.com/fake_x5u_1",
                "hash_algorithm": "sha384",
                "ref": "fake_ref_1",
                "signature": "fake_signature_1",
                "public_key": "fake_pubkey_1",
            },
            {
                "content-signature": (
                    'x5u="https://example.com/fake_x5u_2";p384ecdsa=fake_signature_2'
                ),
                "x5u": "https://example.com/fake_x5u_2",
                "hash_algorithm": "sha384",
                "ref": "fake_ref_2",
                "signature": "fake_signature_2",
                "public_key": "fake_pubkey_2",
            },
        ]

        url = self.test_settings["URL"] + "sign/data"
        foo_base64 = base64.b64encode(b"foo").decode("utf8")
        bar_base64 = base64.b64encode(b"bar").decode("utf8")

        # Assert the correct data is returned
        assert autographer.sign_data([b"foo", b"bar"]) == [
            {
                "timestamp": Whatever(),
                "signature": "fake_signature_1",
                "x5u": "https://example.com/fake_x5u_1",
                "public_key": "fake_pubkey_1",
            },
            {
                "timestamp": Whatever(),
                "signature": "fake_signature_2",
                "x5u": "https://example.com/fake_x5u_2",
                "public_key": "fake_pubkey_2",
            },
        ]

        # Assert that logging happened
        mock_logger.info.assert_called_with(
            Whatever.contains("2"), extra={"code": signing.INFO_RECEIVED_SIGNATURES}
        )

        # Assert the correct request was made
        assert autographer.session.post.called_once_with(
            [
                url,
                [
                    {"template": "content-signature", "input": foo_base64},
                    {"template": "content-signature", "input": bar_base64},
                ],
            ]
        )