Beispiel #1
0
    def test_send_should_return_http_400_if_task_to_compute_deadline_exceeded(self):
        compute_task_def = message.ComputeTaskDef()
        compute_task_def['task_id'] = '8'
        compute_task_def['deadline'] = self.message_timestamp - 9000

        with freeze_time(datetime.datetime.fromtimestamp(self.message_timestamp - 10000)):
            task_to_compute = tasks.TaskToComputeFactory(
                compute_task_def     = self.compute_task_def,
                provider_public_key  = PROVIDER_PUBLIC_KEY,
                requestor_public_key = REQUESTOR_PUBLIC_KEY,
                price=0,
            )

        serialized_task_to_compute      = dump(task_to_compute,             REQUESTOR_PRIVATE_KEY,   PROVIDER_PUBLIC_KEY)
        deserialized_task_to_compute    = load(serialized_task_to_compute,  PROVIDER_PRIVATE_KEY,  REQUESTOR_PUBLIC_KEY, check_time = False)

        ack_report_computed_task = message.AckReportComputedTask()
        ack_report_computed_task.report_computed_task = message.ReportComputedTask(
            task_to_compute = deserialized_task_to_compute
        )

        response_400 = self.client.post(
            reverse('core:send'),
            data = dump(
                ack_report_computed_task,
                PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY
            ),
            content_type                    = 'application/octet-stream',
        )

        self._test_400_response(
            response_400,
            error_code=ErrorCode.QUEUE_COMMUNICATION_NOT_STARTED
        )
Beispiel #2
0
    def test_send_should_return_http_400_if_task_id_already_use(self):

        response_202 = self.send_request(
            url='core:send',
            data=dump(
                self.correct_golem_data,
                self.PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY,
            ),
        )

        self.assertIsInstance(response_202, HttpResponse)
        self.assertEqual(response_202.status_code, 202)
        self.correct_golem_data.encrypted = None
        self.correct_golem_data.sig = None
        response_400 = self.send_request(
            url='core:send',
            data=dump(
                self.correct_golem_data,
                self.PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY,
            ),
        )

        self.assertIsInstance(response_400, JsonResponse)
        self._test_400_response(
            response_400,
            error_code=ErrorCode.SUBTASK_DUPLICATE_REQUEST
        )
Beispiel #3
0
    def test_assert_methods(self):
        requestor_keys = self._fake_keys()
        provider_keys = self._fake_keys()
        concent_keys = self._fake_keys()

        rct = msg_factories.tasks.ReportComputedTaskFactory()

        dump(rct, provider_keys.raw_privkey, requestor_keys.raw_pubkey)

        stored_rct = pickle.loads(pickle.dumps(rct))

        frct_concent = message.concents.ForceReportComputedTask(
            report_computed_task=rct)

        frct_concent_data = dump(frct_concent, provider_keys.raw_privkey,
                                 concent_keys.raw_pubkey)

        stored_frct = pickle.loads(pickle.dumps(frct_concent))

        frct_concent_rcv = load(frct_concent_data, concent_keys.raw_privkey,
                                provider_keys.raw_pubkey)

        concent_rct = frct_concent_rcv.report_computed_task

        frct_requestor = message.concents.ForceReportComputedTask(
            report_computed_task=concent_rct)
        frct_requestor_data = dump(frct_requestor, concent_keys.raw_privkey,
                                   requestor_keys.raw_pubkey)
        frct_requestor_rcv = load(frct_requestor_data,
                                  requestor_keys.raw_privkey,
                                  concent_keys.raw_pubkey)

        self.assertEqual(frct_requestor_rcv.report_computed_task, stored_rct)
        self.assertNotEqual(frct_requestor_rcv, stored_frct)
        self.assertSamePayload(frct_requestor_rcv, stored_frct)
Beispiel #4
0
    def test_send_should_return_http_400_if_task_id_already_use(self):

        response_202 = self.client.post(
            reverse('core:send'),
            data=dump(
                self.correct_golem_data,
                PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY,
            ),
            content_type='application/octet-stream',
        )

        self.assertIsInstance(response_202, HttpResponse)
        self.assertEqual(response_202.status_code, 202)
        self.correct_golem_data.encrypted = None
        self.correct_golem_data.sig = None
        response_400 = self.client.post(
            reverse('core:send'),
            data=dump(
                self.correct_golem_data,
                PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY,
            ),
            content_type='application/octet-stream',
        )

        self.assertIsInstance(response_400, JsonResponse)
        self._test_400_response(response_400,
                                error_code=ErrorCode.SUBTASK_DUPLICATE_REQUEST)
Beispiel #5
0
    def test_message_sig(self):
        """Signed message inside a signed message"""

        concent_keys = cryptography.ECCx(None)
        provider_keys = cryptography.ECCx(None)
        requestor_keys = cryptography.ECCx(None)

        report_computed_task = factories.tasks.ReportComputedTaskFactory()

        # Dump TaskToCompute to make it signed
        s_rct = shortcuts.dump(
            report_computed_task,
            requestor_keys.raw_privkey,
            provider_keys.raw_pubkey,
        )

        # Load TaskToCompute back to its original format
        # Task TaskToCompute is verified correctly
        report_computed_task = shortcuts.load(
            s_rct,
            provider_keys.raw_privkey,
            requestor_keys.raw_pubkey,
        )

        first_sig = report_computed_task.sig
        first_hash = report_computed_task.get_short_hash()

        force_report = message.ForceReportComputedTask()
        force_report.report_computed_task = report_computed_task

        s_force_report = shortcuts.dump(
            force_report,
            provider_keys.raw_privkey,
            concent_keys.raw_pubkey,
        )

        force_report = shortcuts.load(
            s_force_report,
            concent_keys.raw_privkey,
            provider_keys.raw_pubkey,
        )

        second_sig = force_report.report_computed_task.sig
        second_hash = force_report.report_computed_task.get_short_hash()

        self.assertEqual(first_sig, second_sig)
        self.assertEqual(first_hash, second_hash)

        # Now, attached TaskToCompute should still be verified using
        # original key. ecdsa_verify will raise InvalidSignature on
        # failure.
        cryptography.ecdsa_verify(
            requestor_keys.raw_pubkey,
            force_report.report_computed_task.sig,
            force_report.report_computed_task.get_short_hash(),
        )
    def test_validation(self):
        for key in ('nonce', 'gasprice', 'startgas', 'value', 'r', 's'):
            invalid_message_instance = self.FACTORY(**{key: '1' * 79})
            serialized_message = dump(invalid_message_instance, None, None)
            with self.assertRaises(FieldError):
                load(serialized_message, None, None)

        invalid_message_instance = self.FACTORY(v='1' * 4)
        serialized_message = dump(invalid_message_instance, None, None)
        with self.assertRaises(FieldError):
            load(serialized_message, None, None)
Beispiel #7
0
    def test_send_should_return_http_400_if_task_to_compute_deadline_is_not_an_integer(self):
        compute_task_def = ComputeTaskDefFactory()

        invalid_values = [
            -11,
            'a11b',
            {},
            [],
            (1, 2, 3),
            None,
        ]

        for deadline in invalid_values:
            StoredMessage.objects.all().delete()
            compute_task_def['deadline'] = deadline
            task_to_compute = tasks.TaskToComputeFactory(
                compute_task_def=compute_task_def,
                provider_public_key=self._get_provider_hex_public_key(),
                requestor_public_key=self._get_requestor_hex_public_key(),
            )

            serialized_task_to_compute = dump(
                task_to_compute,
                self.REQUESTOR_PRIVATE_KEY,
                self.PROVIDER_PUBLIC_KEY,
            )
            deserialized_task_to_compute = load(
                serialized_task_to_compute,
                self.PROVIDER_PRIVATE_KEY,
                self.REQUESTOR_PUBLIC_KEY,
                check_time=False,
            )

            with freeze_time("2017-11-17 10:00:00"):
                force_report_computed_task = message.concents.ForceReportComputedTask(
                    report_computed_task=message.tasks.ReportComputedTask(
                        task_to_compute=deserialized_task_to_compute
                    )
                )

                response_400 = self.send_request(
                    url='core:send',
                    data=dump(
                        force_report_computed_task,
                        self.PROVIDER_PRIVATE_KEY,
                        CONCENT_PUBLIC_KEY
                    ),
                )

            self._test_400_response(response_400)
Beispiel #8
0
    def test_send_should_accept_valid_message_with_non_numeric_task_id(self):
        assert StoredMessage.objects.count() == 0

        compute_task_def = self._get_deserialized_compute_task_def(
            task_id='ABC00XYZ',
            subtask_id='ABC00XYZ',
            deadline=self.message_timestamp)
        task_to_compute = self._get_deserialized_task_to_compute(
            compute_task_def=compute_task_def, )
        report_computed_task = self._get_deserialized_report_computed_task(
            task_to_compute=task_to_compute)
        correct_golem_data = self._get_deserialized_force_report_computed_task(
            report_computed_task=report_computed_task, )

        response = self.client.post(
            reverse('core:send'),
            data=dump(correct_golem_data, self.PROVIDER_PRIVATE_KEY,
                      CONCENT_PUBLIC_KEY),
            content_type='application/octet-stream',
        )

        self.assertEqual(response.status_code, 202)
        self._assert_stored_message_counter_increased(increased_by=2)
        self._test_last_stored_messages(
            expected_messages=[
                message.TaskToCompute,
                message.ReportComputedTask,
            ],
            task_id='ABC00XYZ',
            subtask_id='ABC00XYZ',
        )
Beispiel #9
0
    def test_send_should_return_http_200_if_message_timeout(self):
        assert StoredMessage.objects.count() == 0

        task_to_compute = self.task_to_compute
        task_to_compute.compute_task_def[
            'deadline'] = self.message_timestamp - 1  # pylint: disable=no-member
        task_to_compute.sig = None
        task_to_compute = self._sign_message(task_to_compute)
        report_computed_task = self._get_deserialized_report_computed_task(
            task_to_compute=task_to_compute)
        correct_golem_data = self._get_deserialized_force_report_computed_task(
            report_computed_task=report_computed_task)

        response = self.client.post(
            reverse('core:send'),
            data=dump(correct_golem_data, self.PROVIDER_PRIVATE_KEY,
                      CONCENT_PUBLIC_KEY),
            content_type='application/octet-stream',
        )

        self.assertEqual(response.status_code, 200)
        response_message = load(
            response.content,
            self.PROVIDER_PRIVATE_KEY,
            CONCENT_PUBLIC_KEY,
        )
        self.assertIsInstance(response_message,
                              message.concents.ForceReportComputedTaskResponse)
Beispiel #10
0
    def test_send_should_return_http_400_if_task_to_compute_younger_than_report_computed(self):

        deserialized_task_to_compute = self._get_deserialized_task_to_compute(
            task_id     = '1',
            subtask_id  = '3',
            deadline    = get_current_utc_timestamp() + (60 * 37),
        )
        with freeze_time("2017-11-17 10:00:00"):
            force_report_computed_task = self._get_deserialized_force_report_computed_task(
                report_computed_task = self._get_deserialized_report_computed_task(
                    subtask_id      = '3',
                    task_to_compute = deserialized_task_to_compute
                )
            )

            response = self.client.post(
                reverse('core:send'),
                data = dump(
                    force_report_computed_task,
                    self.PROVIDER_PRIVATE_KEY,
                    CONCENT_PUBLIC_KEY
                ),
                content_type                        = 'application/octet-stream',
            )

        self._test_400_response(
            response,
            error_code=ErrorCode.MESSAGE_TIMESTAMP_TOO_OLD
        )
Beispiel #11
0
    def test_upload_should_return_401_if_specific_file_info_data(self):
        file = FileTransferToken.FileInfo(
            path=get_storage_result_file_path(task_id=self._get_uuid(),
                                              subtask_id=self._get_uuid()),
            size=1,
            checksum='sha1:356a192b7913b04c54574d18c28d46e6395428ab\n',
        )

        self.upload_token.files = [file]

        golem_upload_token = dump(self.upload_token,
                                  settings.CONCENT_PRIVATE_KEY,
                                  settings.CONCENT_PUBLIC_KEY)
        encoded_token = b64encode(golem_upload_token).decode()
        response = self.client.post(
            '{}{}'.format(
                reverse('gatekeeper:upload'),
                get_storage_result_file_path(
                    task_id=self._get_uuid(),
                    subtask_id=self._get_uuid(),
                ),
            ),
            HTTP_AUTHORIZATION='Golem ' + encoded_token,
            HTTP_CONCENT_AUTH=self.header_concent_auth,
            content_type='application/x-www-form-urlencoded',
            HTTP_X_Golem_Messages=settings.GOLEM_MESSAGES_VERSION,
        )

        self.assertIsInstance(response, JsonResponse)
        self.assertEqual(response.status_code, 401)
        self.assertIn('message', response.json().keys())
        self.assertEqual("application/json", response["Content-Type"])
Beispiel #12
0
    def test_that_send_should_refuse_request_if_all_stored_messages_have_incompatible_protocol_version(self):
        with override_settings(GOLEM_MESSAGES_VERSION='1.11.0'):
            store_subtask(
                task_id=self.task_to_compute.compute_task_def['task_id'],
                subtask_id=self.task_to_compute.compute_task_def['subtask_id'],
                provider_public_key=self.provider_public_key,
                requestor_public_key=self.requestor_public_key,
                state=Subtask.SubtaskState.FORCING_REPORT,
                next_deadline=int(self.task_to_compute.compute_task_def['deadline']) + settings.CONCENT_MESSAGING_TIME,
                task_to_compute=self.task_to_compute,
                report_computed_task=self.report_computed_task,
            )
        with mock.patch('core.views.logging.log_message_received') as log_not_called_mock, \
                mock.patch('core.subtask_helpers.log') as log_called_mock:
            response = self.send_request(
                url='core:send',
                data=dump(
                    self.force_report_computed_task,
                    self.PROVIDER_PRIVATE_KEY,
                    CONCENT_PUBLIC_KEY),
            )
        self._test_response(
            response,
            status=200,
            key=self.PROVIDER_PRIVATE_KEY,
            message_type=message.concents.ServiceRefused,
            fields={
                'reason': message.concents.ServiceRefused.REASON.UnsupportedProtocolVersion,
            }
        )

        log_called_mock.assert_called()
        log_not_called_mock.assert_not_called()

        self.assertIn(f'Version stored in database is 1.11.0, Concent version is {settings.GOLEM_MESSAGES_VERSION}', str(log_called_mock.call_args))
Beispiel #13
0
    def test_send_should_return_http_202_if_task_to_compute_deadline_is_correct(self):
        compute_task_def = ComputeTaskDefFactory()

        valid_values = [
            11,
            True,
            0,
            False,
        ]
        for deadline in valid_values:
            StoredMessage.objects.all().delete()
            compute_task_def['deadline'] = deadline

            deserialized_task_to_compute = self._get_deserialized_task_to_compute(
                compute_task_def=compute_task_def,
            )

            force_report_computed_task = self._get_deserialized_force_report_computed_task(
                report_computed_task=self._get_deserialized_report_computed_task(
                    task_to_compute=deserialized_task_to_compute
                )
            )

            response_202 = self.send_request(
                url='core:send',
                data=dump(
                    force_report_computed_task,
                    self.PROVIDER_PRIVATE_KEY,
                    CONCENT_PUBLIC_KEY
                ),
            )

            self.assertIn(response_202.status_code, [200, 202])
Beispiel #14
0
    def test_send_should_accept_valid_message_with_non_numeric_task_id(self):
        assert StoredMessage.objects.count() == 0

        compute_task_def = self._get_deserialized_compute_task_def(
            deadline=self.message_timestamp
        )
        task_to_compute = self._get_deserialized_task_to_compute(
            compute_task_def=compute_task_def,
        )
        report_computed_task = self._get_deserialized_report_computed_task(
            task_to_compute=task_to_compute
        )
        correct_golem_data = self._get_deserialized_force_report_computed_task(
            report_computed_task=report_computed_task,
        )

        response = self.send_request(
            url='core:send',
            data=dump(
                correct_golem_data,
                self.PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY),
        )

        self.assertEqual(response.status_code, 202)
        self._assert_stored_message_counter_increased(increased_by=3)
        self._test_last_stored_messages(
            expected_messages=[
                message.TaskToCompute,
                message.WantToComputeTask,
                message.ReportComputedTask,
            ],
            task_id=task_to_compute.task_id,
            subtask_id=task_to_compute.subtask_id,
        )
Beispiel #15
0
    def test_send_should_return_http_400_if_task_to_compute_younger_than_report_computed(self):

        deserialized_task_to_compute = self._get_deserialized_task_to_compute(
            deadline=get_current_utc_timestamp() + (60 * 37),
        )
        with freeze_time("2017-11-17 10:00:00"):
            force_report_computed_task = self._get_deserialized_force_report_computed_task(
                report_computed_task=self._get_deserialized_report_computed_task(
                    subtask_id=deserialized_task_to_compute.subtask_id,
                    task_to_compute=deserialized_task_to_compute
                )
            )
            response = self.send_request(
                url='core:send',
                data=dump(
                    force_report_computed_task,
                    self.PROVIDER_PRIVATE_KEY,
                    CONCENT_PUBLIC_KEY
                ),
            )

        self._test_400_response(
            response,
            error_code=ErrorCode.MESSAGE_TIMESTAMP_TOO_OLD
        )
Beispiel #16
0
    def test_send_should_return_http_200_if_message_timeout(self):
        assert StoredMessage.objects.count() == 0

        task_to_compute = self._get_deserialized_task_to_compute(
            deadline=self.message_timestamp - 1
        )
        report_computed_task = self._get_deserialized_report_computed_task(
            task_to_compute=task_to_compute
        )
        correct_golem_data = self._get_deserialized_force_report_computed_task(
            report_computed_task=report_computed_task
        )

        response = self.send_request(
            url='core:send',
            data=dump(
                correct_golem_data,
                self.PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY),
        )

        self.assertEqual(response.status_code, 200)
        response_message = load(
            response.content,
            self.PROVIDER_PRIVATE_KEY,
            CONCENT_PUBLIC_KEY,
        )
        self.assertIsInstance(response_message, message.concents.ForceReportComputedTaskResponse)
        self.assertEqual(response_message.reason,
                         message.concents.ForceReportComputedTaskResponse.REASON.SubtaskTimeout)
Beispiel #17
0
    def test_send_should_return_http_400_if_task_to_compute_deadline_exceeded(self):
        compute_task_def = ComputeTaskDefFactory()
        compute_task_def['deadline'] = self.message_timestamp - 9000

        with freeze_time(parse_timestamp_to_utc_datetime(self.message_timestamp - 10000)):
            task_to_compute = self._get_deserialized_task_to_compute(
                compute_task_def=self.compute_task_def,
                provider_public_key=self._get_provider_hex_public_key(),
                requestor_public_key=self._get_requestor_hex_public_key(),
            )

        report_computed_task = message.ReportComputedTask(
            task_to_compute=task_to_compute
        )
        report_computed_task.sign_message(self.PROVIDER_PRIVATE_KEY)

        ack_report_computed_task = message.tasks.AckReportComputedTask(
            report_computed_task=report_computed_task
        )

        response_400 = self.send_request(
            url='core:send',
            data=dump(
                ack_report_computed_task,
                self.PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY
            ),
        )

        self._test_400_response(
            response_400,
            error_code=ErrorCode.QUEUE_COMMUNICATION_NOT_STARTED
        )
    def test_load_without_public_key_should_load_message(self):
        """
        Test that message loaded with load_without_public_key function will be the same as load
        with golem_messages load function.
        """

        # Create and fill some data into ComputeTaskDef
        compute_task_def = tasks.ComputeTaskDefFactory(
            task_id=generate_uuid_for_tests(),
            subtask_id=generate_uuid_for_tests(),
            deadline=1510912800,
        )

        # Create TaskToCompute
        task_to_compute = tasks.TaskToComputeFactory(
            compute_task_def = compute_task_def,
            price=0,
        )

        # Dump TaskToCompute to make it signed
        dumped_task_to_compute = dump(task_to_compute, REQUESTOR_PRIVATE_KEY, CONCENT_PUBLIC_KEY)

        loaded_task_to_compute_with_utility_function    = load_without_public_key(
            dumped_task_to_compute,
            REQUESTOR_PUBLIC_KEY,
        )

        loaded_task_to_compute_with_golem_messages_load = load(
            dumped_task_to_compute,
            CONCENT_PRIVATE_KEY,
            REQUESTOR_PUBLIC_KEY,
        )

        self.assertEqual(loaded_task_to_compute_with_utility_function, loaded_task_to_compute_with_golem_messages_load)
Beispiel #19
0
def request_upload_status(
        report_computed_task: message.ReportComputedTask) -> bool:
    slash = '/'
    assert settings.STORAGE_CLUSTER_ADDRESS.endswith(slash)

    file_transfer_token = create_file_transfer_token_for_concent(
        subtask_id=report_computed_task.subtask_id,
        result_package_path=get_storage_result_file_path(
            subtask_id=report_computed_task.subtask_id,
            task_id=report_computed_task.task_id,
        ),
        result_size=report_computed_task.size,
        result_package_hash=report_computed_task.package_hash,
        operation=FileTransferToken.Operation.download)

    assert len(file_transfer_token.files) == 1
    assert not file_transfer_token.files[0]['path'].startswith(slash)

    file_transfer_token.sig = None
    dumped_file_transfer_token = shortcuts.dump(file_transfer_token,
                                                settings.CONCENT_PRIVATE_KEY,
                                                settings.CONCENT_PUBLIC_KEY)
    headers = {
        'Authorization':
        'Golem ' + b64encode(dumped_file_transfer_token).decode(),
        'Concent-Auth':
        b64encode(
            shortcuts.dump(
                message.concents.ClientAuthorization(
                    client_public_key=settings.CONCENT_PUBLIC_KEY, ),
                settings.CONCENT_PRIVATE_KEY,
                settings.CONCENT_PUBLIC_KEY), ).decode(),
    }
    request_http_address = settings.STORAGE_CLUSTER_ADDRESS + CLUSTER_DOWNLOAD_PATH + file_transfer_token.files[
        0]['path']

    storage_cluster_response = send_request_to_storage_cluster(
        headers, request_http_address)

    if storage_cluster_response.status_code == 200:
        return True
    elif storage_cluster_response.status_code == 404:
        return False
    else:
        raise exceptions.UnexpectedResponse(
            f'Cluster storage returned HTTP {storage_cluster_response.status_code}'
        )
Beispiel #20
0
    def test_that_receive_should_refuse_request_if_stored_messages_in_database_have_incompatible_protocol_version(self):
        """
        This case may happen, if client sends a request to core:send and in next step sends request to core:receive
        using different protocol version. The client is always required to stay on the same protocol version while
        communicating about the same subtask.
        """
        response = self.send_request(
            url='core:send',
            data=dump(
                self.force_report_computed_task,
                self.PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY),
        )
        self._test_response(
            response,
            status=202,
            key=self.PROVIDER_PRIVATE_KEY,
        )

        response1 = self.send_request(
            url='core:send',
            data=dump(
                self.reject_report_computed_task,
                self.REQUESTOR_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY),
        )
        self._test_response(
            response1,
            status=202,
            key=self.REQUESTOR_PRIVATE_KEY,
        )

        with override_settings(GOLEM_MESSAGES_VERSION='1.11.0'):
            response2 = self.send_request(
                url='core:receive',
                data=self._create_client_auth_message(self.PROVIDER_PRIVATE_KEY, self.PROVIDER_PUBLIC_KEY),
                golem_messages_version='1.11.0'
            )
            self._test_response(
                response2,
                status=200,
                key=self.PROVIDER_PRIVATE_KEY,
                message_type=message.concents.ServiceRefused,
                fields={
                    'reason': message.concents.ServiceRefused.REASON.UnsupportedProtocolVersion,
                }
            )
Beispiel #21
0
    def test_send_should_return_http_400_if_task_to_compute_deadline_is_not_an_integer(
            self):
        compute_task_def = message.ComputeTaskDef()
        compute_task_def['task_id'] = '8'
        compute_task_def['subtask_id'] = '8'

        invalid_values = [
            -11,
            'a11b',
            {},
            [],
            (1, 2, 3),
            None,
        ]

        for deadline in invalid_values:
            StoredMessage.objects.all().delete()
            compute_task_def['deadline'] = deadline
            task_to_compute = tasks.TaskToComputeFactory(
                compute_task_def=compute_task_def,
                provider_public_key=PROVIDER_PUBLIC_KEY,
                requestor_public_key=REQUESTOR_PUBLIC_KEY,
                price=0,
            )

            serialized_task_to_compute = dump(task_to_compute,
                                              REQUESTOR_PRIVATE_KEY,
                                              PROVIDER_PUBLIC_KEY)
            deserialized_task_to_compute = load(serialized_task_to_compute,
                                                PROVIDER_PRIVATE_KEY,
                                                REQUESTOR_PUBLIC_KEY,
                                                check_time=False)

            with freeze_time("2017-11-17 10:00:00"):
                force_report_computed_task = message.ForceReportComputedTask(
                    report_computed_task=message.tasks.ReportComputedTask(
                        task_to_compute=deserialized_task_to_compute))

                response_400 = self.client.post(
                    reverse('core:send'),
                    data=dump(force_report_computed_task, PROVIDER_PRIVATE_KEY,
                              CONCENT_PUBLIC_KEY),
                    content_type='application/octet-stream',
                )

            self._test_400_response(response_400)
Beispiel #22
0
 def _prepare_data(data: Union[Message, bytes]) -> bytes:
     if isinstance(data, bytes):
         return data
     return dump(
         data,
         private_key,
         public_key,
     )
Beispiel #23
0
    def test_send_reject_message_save_as_receive_out_of_band_status(self):
        assert StoredMessage.objects.count() == 0

        self.correct_golem_data.report_computed_task = self._get_deserialized_report_computed_task(
            task_to_compute = self.cannot_compute_task.task_to_compute  # pylint: disable=no-member
        )

        force_response = self.client.post(
            reverse('core:send'),
            data = dump(
                self.correct_golem_data,
                PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY),
            content_type                        = 'application/octet-stream',
        )

        self.assertEqual(force_response.status_code,                                202)
        self._test_last_stored_messages(
            expected_messages = [
                message.TaskToCompute,
                message.ReportComputedTask,
            ],
            task_id         = '8',
            subtask_id      = '8',
            timestamp       = "2017-11-17 10:00:00"
        )

        reject_response = self.client.post(
            reverse('core:send'),
            data = dump(
                self.reject_report_computed_task,
                REQUESTOR_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY
            ),
            content_type                   = 'application/octet-stream',
        )

        self.assertEqual(reject_response.status_code,       202)
        self._test_last_stored_messages(
            expected_messages = [
                message.RejectReportComputedTask,
            ],
            task_id         = '8',
            subtask_id      = '8',
            timestamp       = "2017-11-17 10:00:00"
        )
Beispiel #24
0
    def test_send_should_return_http_400_if_data_is_incorrect(self):
        compute_task_def    = message.ComputeTaskDef()
        task_to_compute     = message.TaskToCompute(
            compute_task_def     = compute_task_def,
            provider_public_key  = PROVIDER_PUBLIC_KEY,
            requestor_public_key = REQUESTOR_PUBLIC_KEY,
            price=0,
        )
        report_computed_task = message.tasks.ReportComputedTask(
            task_to_compute = task_to_compute
        )
        with freeze_time("2017-11-17 9:56:00"):
            force_report_computed_task = message.ForceReportComputedTask(
                report_computed_task = report_computed_task
            )

        response = self.client.post(
            reverse('core:send'),
            data = dump(
                force_report_computed_task,
                PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY,
            ),
            content_type                        = 'application/octet-stream',
        )
        self._test_400_response(
            response,
            error_code=ErrorCode.MESSAGE_VALUE_BLANK
        )

        data                                        = message.ForceReportComputedTask()
        data.report_computed_task                   = message.tasks.ReportComputedTask()
        compute_task_def['deadline']                = self.message_timestamp - 3600
        data.report_computed_task.task_to_compute   = message.TaskToCompute(compute_task_def = compute_task_def)

        response = self.client.post(
            reverse('core:send'),
            data = dump(
                data,
                PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY,
            ),
            content_type                        = 'application/octet-stream',
        )
        self._test_400_response(response)
Beispiel #25
0
 def test_ethereum_address(self):
     msg = factories.tasks.TaskToComputeFactory()
     serialized = shortcuts.dump(msg, None, None)
     msg_l = shortcuts.load(serialized, None, None)
     for addr_slot in (
             'requestor_ethereum_address',
             'provider_ethereum_address'):
         address = getattr(msg_l, addr_slot)
         self.assertEqual(len(address), 2 + (20*2))
Beispiel #26
0
 def _prepare_data(data):
     if data is None:
         return ''
     if isinstance(data, bytes):
         return data
     return dump(
         data,
         private_key,
         public_key,
     )
Beispiel #27
0
    def test_send_reject_message_save_as_receive_out_of_band_status(self):
        assert StoredMessage.objects.count() == 0

        self.correct_golem_data.report_computed_task = self._get_deserialized_report_computed_task(
            task_to_compute=self.cannot_compute_task.task_to_compute  # pylint: disable=no-member
        )

        force_response = self.send_request(
            url='core:send',
            data=dump(
                self.correct_golem_data,
                self.PROVIDER_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY),
        )

        self.assertEqual(force_response.status_code, 202)
        self._test_last_stored_messages(
            expected_messages=[
                message.TaskToCompute,
                message.WantToComputeTask,
                message.ReportComputedTask,
            ],
            task_id=self.correct_golem_data.report_computed_task.task_id,
            subtask_id=self.correct_golem_data.report_computed_task.subtask_id,
        )

        reject_response = self.send_request(
            url='core:send',
            data=dump(
                self.reject_report_computed_task,
                self.REQUESTOR_PRIVATE_KEY,
                CONCENT_PUBLIC_KEY
            ),
        )

        self.assertEqual(reject_response.status_code, 202)
        self._test_last_stored_messages(
            expected_messages=[
                message.tasks.RejectReportComputedTask,
            ],
            task_id=self.reject_report_computed_task.task_id,
            subtask_id=self.reject_report_computed_task.subtask_id,
        )
Beispiel #28
0
    def test_upload_should_return_401_if_checksum_is_wrong(self):
        invalid_values_with_expected_error_code = {
            b'sha1:95a0f391c7ad86686ab1366bcd519ba5ab3cce89':
            ErrorCode.MESSAGE_FILES_CHECKSUM_WRONG_TYPE,
            '': ErrorCode.MESSAGE_FILES_CHECKSUM_EMPTY,
            '95a0f391c7ad86686ab1366bcd519ba5ab3cce89':
            ErrorCode.MESSAGE_FILES_CHECKSUM_WRONG_FORMAT,
            ':95a0f391c7ad86686ab1366bcd519ba5ab3cce89':
            ErrorCode.MESSAGE_FILES_CHECKSUM_INVALID_ALGORITHM,
            'sha1:95a0f391c7ad86686ab1366bcd519ba5amONj':
            ErrorCode.MESSAGE_FILES_CHECKSUM_INVALID_SHA1_HASH,
            'sha1:': ErrorCode.MESSAGE_FILES_CHECKSUM_INVALID_SHA1_HASH,
        }

        for invalid_value, error_code in invalid_values_with_expected_error_code.items(
        ):
            file1 = FileTransferToken.FileInfo(
                path=
                'blender/benchmark/test_task/scene-Helicopter-27-cycles.blend',
                checksum='sha1:95a0f391c7ad86686ab1366bcd519ba5ab3cce89',
                size=1024,
            )

            file2 = FileTransferToken.FileInfo(
                path=
                'blenderrr/benchmark/test_task/scene-Helicopter-27-cycles.blend',
                checksum=invalid_value,
                size=1024,
            )

            self.upload_token.files = [file1, file2]
            self.upload_token.sig = None

            golem_upload_token = dump(self.upload_token,
                                      settings.CONCENT_PRIVATE_KEY,
                                      settings.CONCENT_PUBLIC_KEY)
            encoded_token = b64encode(golem_upload_token).decode()
            response = self.client.post(
                '{}{}'.format(
                    reverse('gatekeeper:upload'),
                    'blender/benchmark/test_task/scene-Helicopter-27-cycles.blend'
                ),
                HTTP_AUTHORIZATION='Golem ' + encoded_token,
                HTTP_CONCENT_AUTH=self.header_concent_auth,
                content_type='application/x-www-form-urlencoded',
                HTTP_X_Golem_Messages=settings.GOLEM_MESSAGES_VERSION,
            )

            self.assertIsInstance(response, JsonResponse)
            self.assertEqual(response.status_code, 401)
            self.assertIn('message', response.json().keys())
            self.assertIn('error_code', response.json().keys())
            self.assertEqual("application/json", response["Content-Type"])
            self.assertEqual(response.json()["error_code"], error_code.value)
Beispiel #29
0
def prepare_storage_request_headers(file_transfer_token: message.FileTransferToken) -> dict:
    """ Prepare headers for request to storage cluster. """
    dumped_file_transfer_token = dump(
        file_transfer_token,
        settings.CONCENT_PRIVATE_KEY,
        settings.CONCENT_PUBLIC_KEY,
    )
    headers = {
        'Authorization': 'Golem ' + b64encode(dumped_file_transfer_token).decode(),
        'Concent-Auth': b64encode(
            dump(
                message.concents.ClientAuthorization(
                    client_public_key=settings.CONCENT_PUBLIC_KEY,
                ),
                settings.CONCENT_PRIVATE_KEY,
                settings.CONCENT_PUBLIC_KEY
            ),
        ).decode(),
    }
    return headers
Beispiel #30
0
 def send(self, cluster_url, message):
     for party, message_types in KEY_MAP.items():
         if isinstance(message, message_types):
             priv_key, _ = self.select_keys(party)
             break
     else:
         raise Exception(f'Unsupported Message Type: {type(message)}')
     print_message(message, cluster_url, 'send')
     sign_message(get_field_from_message(message, 'task_to_compute'), self.requestor_private_key)
     serialized_message = dump(message, priv_key, self.concent_pub_key)
     self._exchange_message(priv_key, cluster_url, serialized_message)