예제 #1
0
def test_signature_checking(app, receiver):
    """Check signatures for payload."""
    class TestReceiverSign(receiver):
        signature = 'X-Hub-Signature'

    with app.app_context():
        current_webhooks.register('test-receiver-sign', TestReceiverSign)

    # check correct signature
    payload = json.dumps(dict(somekey='somevalue'))
    with app.app_context():
        headers = [('Content-Type', 'application/json'),
                   ('X-Hub-Signature', get_hmac(payload))]
    with app.test_request_context(headers=headers, data=payload):
        event = Event.create(receiver_id='test-receiver-sign')
        event.process()
        assert json.loads(payload) == event.receiver.calls[0].payload

    # check signature with prefix
    with app.app_context():
        headers = [('Content-Type', 'application/json'),
                   ('X-Hub-Signature', 'sha1=' + get_hmac(payload))]
    with app.test_request_context(headers=headers, data=payload):
        event = Event.create(receiver_id='test-receiver-sign')
        event.process()
        assert json.loads(payload) == event.receiver.calls[1].payload

    # check incorrect signature
    with app.app_context():
        headers = [('Content-Type', 'application/json'),
                   ('X-Hub-Signature', get_hmac("somevalue"))]
    with app.test_request_context(headers=headers, data=payload):
        with pytest.raises(InvalidSignature):
            Event.create(receiver_id='test-receiver-sign')
예제 #2
0
def test_signature_checking(app, receiver):
    """Check signatures for payload."""
    class TestReceiverSign(receiver):
        signature = 'X-Hub-Signature'

    with app.app_context():
        current_webhooks.register('test-receiver-sign', TestReceiverSign)

    # check correct signature
    payload = json.dumps(dict(somekey='somevalue'))
    with app.app_context():
        headers = [('Content-Type', 'application/json'),
                   ('X-Hub-Signature', get_hmac(payload))]
    with app.test_request_context(headers=headers, data=payload):
        event = Event.create(receiver_id='test-receiver-sign')
        event.process()
        assert json.loads(payload) == event.receiver.calls[0].payload

    # check signature with prefix
    with app.app_context():
        headers = [('Content-Type', 'application/json'),
                   ('X-Hub-Signature', 'sha1=' + get_hmac(payload))]
    with app.test_request_context(headers=headers, data=payload):
        event = Event.create(receiver_id='test-receiver-sign')
        event.process()
        assert json.loads(payload) == event.receiver.calls[1].payload

    # check incorrect signature
    with app.app_context():
        headers = [('Content-Type', 'application/json'),
                   ('X-Hub-Signature', get_hmac("somevalue"))]
    with app.test_request_context(headers=headers, data=payload):
        with pytest.raises(InvalidSignature):
            Event.create(receiver_id='test-receiver-sign')
예제 #3
0
def test_webhook_post_no_scope(app, tester_id, access_token_no_scope):
    class TestReceiverNoScope(Receiver):
        def __call__(self, event):
            return event

    with app.test_request_context():
        current_webhooks.register("test-receiver-no-scope", TestReceiverNoScope)

        with app.test_client() as client:
            payload = dict(somekey="somevalue")
            make_request(
                access_token_no_scope,
                client.post,
                "invenio_webhooks.event_list",
                urlargs=dict(receiver_id="test-receiver-no-scope"),
                data=payload,
                code=403,
            )
예제 #4
0
def test_webhook_post_no_scope(app, tester_id, access_token_no_scope):
    class TestReceiverNoScope(Receiver):
        def __call__(self, event):
            return event

    with app.test_request_context():
        current_webhooks.register('test-receiver-no-scope',
                                  TestReceiverNoScope)

        with app.test_client() as client:
            payload = dict(somekey='somevalue')
            make_request(
                access_token_no_scope,
                client.post,
                'invenio_webhooks.event_list',
                urlargs=dict(receiver_id='test-receiver-no-scope'),
                data=payload,
                code=403,
            )
예제 #5
0
def test_receiver_registration(app, receiver):
    with app.app_context():
        current_webhooks.register('test-invalid', receiver)

        assert 'test-receiver' in current_webhooks.receivers
        assert 'test-receiver' == current_webhooks.receivers[
            'test-receiver'].receiver_id

        # Double registration
        with pytest.raises(AssertionError):
            current_webhooks.register('test-receiver', receiver)

        current_webhooks.unregister('test-receiver')
        assert 'test-receiver' not in current_webhooks.receivers

        current_webhooks.register('test-receiver', receiver)

    # JSON payload parsing
    payload = json.dumps(dict(somekey='somevalue'))
    headers = [('Content-Type', 'application/json')]
    with app.test_request_context(headers=headers, data=payload):
        event = Event.create(receiver_id='test-receiver')
        event.process()
        assert 1 == len(event.receiver.calls)
        assert json.loads(payload) == event.receiver.calls[0].payload
        assert event.receiver.calls[0].user_id is None

    # Form encoded values payload parsing
    payload = dict(somekey='somevalue')
    with app.test_request_context(method='POST', data=payload):
        event = Event.create(receiver_id='test-receiver')
        event.process()
        assert 2 == len(event.receiver.calls)
        assert dict(somekey=['somevalue']) == event.receiver.calls[1].payload

    # Test invalid post data
    with app.test_request_context(method='POST', data="invaliddata"):
        with pytest.raises(InvalidPayload):
            event = Event.create(receiver_id='test-receiver')

    calls = []

    # Test Celery Receiver
    class TestCeleryReceiver(CeleryReceiver):

        def run(self, event):
            calls.append(event.payload)

    app.extensions['invenio-webhooks'].register('celery-receiver',
                                                TestCeleryReceiver)

    # Form encoded values payload parsing
    payload = dict(somekey='somevalue')
    with app.test_request_context(method='POST', data=payload):
        event = Event.create(receiver_id='celery-receiver')
        db.session.add(event)
        db.session.commit()
        event.process()
        assert 1 == len(calls)
        assert dict(somekey=['somevalue']) == calls[0]
예제 #6
0
def test_receiver_registration(app, receiver):
    with app.app_context():
        current_webhooks.register('test-invalid', receiver)

        assert 'test-receiver' in current_webhooks.receivers
        assert 'test-receiver' == current_webhooks.receivers[
            'test-receiver'].receiver_id

        # Double registration
        with pytest.raises(AssertionError):
            current_webhooks.register('test-receiver', receiver)

        current_webhooks.unregister('test-receiver')
        assert 'test-receiver' not in current_webhooks.receivers

        current_webhooks.register('test-receiver', receiver)

    # JSON payload parsing
    payload = json.dumps(dict(somekey='somevalue'))
    headers = [('Content-Type', 'application/json')]
    with app.test_request_context(headers=headers, data=payload):
        event = Event.create(receiver_id='test-receiver')
        event.process()
        assert 1 == len(event.receiver.calls)
        assert json.loads(payload) == event.receiver.calls[0].payload
        assert event.receiver.calls[0].user_id is None

    # Form encoded values payload parsing
    payload = dict(somekey='somevalue')
    with app.test_request_context(method='POST', data=payload):
        event = Event.create(receiver_id='test-receiver')
        event.process()
        assert 2 == len(event.receiver.calls)
        assert dict(somekey=['somevalue']) == event.receiver.calls[1].payload

    # Test invalid post data
    with app.test_request_context(method='POST', data="invaliddata"):
        with pytest.raises(InvalidPayload):
            event = Event.create(receiver_id='test-receiver')

    calls = []

    # Test Celery Receiver
    class TestCeleryReceiver(CeleryReceiver):
        def run(self, event):
            calls.append(event.payload)

    app.extensions['invenio-webhooks'].register('celery-receiver',
                                                TestCeleryReceiver)

    # Form encoded values payload parsing
    payload = dict(somekey='somevalue')
    with app.test_request_context(method='POST', data=payload):
        event = Event.create(receiver_id='celery-receiver')
        db.session.add(event)
        db.session.commit()
        event.process()
        assert 1 == len(calls)
        assert dict(somekey=['somevalue']) == calls[0]