| 551 | } |
| 552 | |
| 553 | void routing_manager_client::send_subscribe(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, |
| 554 | major_version_t _major, event_t _event, |
| 555 | const std::shared_ptr<debounce_filter_impl_t>& _filter) { |
| 556 | |
| 557 | if (_event == ANY_EVENT) { |
| 558 | auto const sec_client = get_sec_client(); |
| 559 | if (!is_subscribe_to_any_event_allowed(&sec_client, _client, _service, _instance, _eventgroup, false)) { |
| 560 | VSOMEIP_WARNING << "vSomeIP Security: Client 0x" << hex4(_client) << " : routing_manager_proxy::subscribe: " |
| 561 | << " isn't allowed to subscribe to service/instance/event " << hex4(_service) << "/" << hex4(_instance) |
| 562 | << "/ANY_EVENT which violates the security policy ~> Skip subscribe!"; |
| 563 | return; |
| 564 | } |
| 565 | } else { |
| 566 | auto const sec_client = get_sec_client(); |
| 567 | if (VSOMEIP_SEC_OK |
| 568 | != configuration_->get_security()->is_client_allowed_to_access_member(&sec_client, _service, _instance, _event)) { |
| 569 | VSOMEIP_WARNING << "vSomeIP Security: Client 0x" << hex4(_client) << " : routing_manager_proxy::subscribe: " |
| 570 | << " isn't allowed to subscribe to service/instance/event " << hex4(_service) << "/" << hex4(_instance) << "/" |
| 571 | << hex4(_event); |
| 572 | return; |
| 573 | } |
| 574 | } |
| 575 | |
| 576 | protocol::subscribe_command its_command; |
| 577 | its_command.set_client(_client); |
| 578 | its_command.set_service(_service); |
| 579 | its_command.set_instance(_instance); |
| 580 | its_command.set_eventgroup(_eventgroup); |
| 581 | its_command.set_major(_major); |
| 582 | its_command.set_event(_event); |
| 583 | its_command.set_pending_id(PENDING_SUBSCRIPTION_ID); |
| 584 | its_command.set_filter(_filter); |
| 585 | |
| 586 | std::vector<byte_t> its_buffer; |
| 587 | its_command.serialize(its_buffer); |
| 588 | |
| 589 | client_t its_target_client = find_local_client(_service, _instance); |
| 590 | if (its_target_client != VSOMEIP_ROUTING_CLIENT) { |
| 591 | auto its_target = ep_mgr_->find_or_create_local_client(its_target_client); |
| 592 | if (its_target) { |
| 593 | its_target->send(&its_buffer[0], uint32_t(its_buffer.size())); |
| 594 | } else { |
| 595 | VSOMEIP_WARNING_P << "No target available to send subscription. Client=0x" << hex4(_client) << " service=" << hex4(_service) |
| 596 | << "." << hex4(_instance) << "." << hex2(_major) << " event=" << hex4(_event); |
| 597 | } |
| 598 | } else { |
| 599 | std::scoped_lock its_sender_lock{sender_mutex_}; |
| 600 | if (sender_) { |
| 601 | sender_->send(&its_buffer[0], uint32_t(its_buffer.size())); |
| 602 | } else { |
| 603 | VSOMEIP_ERROR_P << "Failed due to a missing sender"; |
| 604 | } |
| 605 | } |
| 606 | } |
| 607 | |
| 608 | void routing_manager_client::send_subscribe_nack(client_t _subscriber, service_t _service, instance_t _instance, eventgroup_t _eventgroup, |
| 609 | event_t _event, remote_subscription_id_t _id) { |
nothing calls this directly
no test coverage detected