private static void initReceiver(ProtonReceiver receiver) { org.apache.qpid.proton.amqp.messaging.Target remoteTarget = (org.apache.qpid.proton.amqp.messaging.Target) receiver.getRemoteTarget(); if(remoteTarget == null) {
@Override public Target getRemoteTarget() { return receiver.getRemoteTarget(); }
@Override public String getTargetAddress() { return link.getRemoteTarget().getAddress(); }
private void receiverOpenHandler(ProtonConnection connection, ProtonReceiver receiver) { Target target = (Target) receiver.getRemoteTarget(); receiver.setTarget(target); log.info("[{}]: Got publish request from {} on {}", containerId, connection.getRemoteContainer(), target.getAddress()); } else { receiver.close(); log.info("[{}]: Failed creating publisher {} for address {}", containerId, connection.getRemoteContainer(), receiver.getRemoteTarget().getAddress(), result.cause());
if (receiver.getRemoteTarget().getAddress() == null) { LOG.debug("client [container: {}] wants to open an anonymous link for sending messages to arbitrary addresses, closing link ...", con.getRemoteContainer()); } else { LOG.debug("client [container: {}] wants to open a link [address: {}] for sending messages", con.getRemoteContainer(), receiver.getRemoteTarget()); try { final ResourceIdentifier targetResource = getResourceIdentifier(receiver.getRemoteTarget().getAddress()); final AmqpEndpoint endpoint = getEndpoint(targetResource); if (endpoint == null) { Constants.copyProperties(con, receiver); receiver.setSource(receiver.getRemoteSource()); receiver.setTarget(receiver.getRemoteTarget()); endpoint.onLinkAttach(con, receiver, targetResource); } else {
if (receiver.getRemoteTarget().getAddress() == null) { LOG.debug("client [{}] wants to open an anonymous link for sending messages to arbitrary addresses, closing link", con.getRemoteContainer()); } else { LOG.debug("client [{}] wants to open a link for sending messages [address: {}]", con.getRemoteContainer(), receiver.getRemoteTarget()); try { final ResourceIdentifier targetResource = getResourceIdentifier(receiver.getRemoteTarget().getAddress()); final Endpoint endpoint = getEndpoint(targetResource); if (endpoint == null) { if (isAuthorized) { copyConnectionId(con.attachments(), receiver.attachments()); receiver.setTarget(receiver.getRemoteTarget()); endpoint.onLinkAttach(receiver, targetResource); } else {
/** * Verifies that the service notifies a registered endpoint about a client * that has established a link. */ @Test public void testHandleReceiverOpenForwardsToEndpoint() { // GIVEN a server with an endpoint final ResourceIdentifier targetAddress = ResourceIdentifier.from(ENDPOINT, Constants.DEFAULT_TENANT, null); final AmqpEndpoint endpoint = mock(AmqpEndpoint.class); when(endpoint.getName()).thenReturn(ENDPOINT); final AuthorizationService authService = mock(AuthorizationService.class); when(authService.isAuthorized(Constants.PRINCIPAL_ANONYMOUS, targetAddress, Activity.WRITE)) .thenReturn(Future.succeededFuture(Boolean.TRUE)); final AmqpServiceBase<ServiceConfigProperties> server = createServer(endpoint); server.setAuthorizationService(authService); // WHEN a client connects to the server using this endpoint final Target target = getTarget(targetAddress); final ProtonReceiver receiver = mock(ProtonReceiver.class); when(receiver.getRemoteTarget()).thenReturn(target); when(receiver.attachments()).thenReturn(mock(Record.class)); server.handleReceiverOpen(newConnection(Constants.PRINCIPAL_ANONYMOUS), receiver); // THEN the server delegates link establishment to the endpoint verify(endpoint).onLinkAttach(any(ProtonConnection.class), eq(receiver), eq(targetAddress)); }
/** * Verifies that the service rejects sender links on resources that * the client is not authorized to write to. */ @Test public void testHandleReceiverOpenRejectsUnauthorizedClient() { // GIVEN a server with a endpoint final ResourceIdentifier restrictedTargetAddress = ResourceIdentifier.from(ENDPOINT, "RESTRICTED_TENANT", null); final AmqpEndpoint endpoint = mock(AmqpEndpoint.class); when(endpoint.getName()).thenReturn(ENDPOINT); final AuthorizationService authService = mock(AuthorizationService.class); when(authService.isAuthorized(Constants.PRINCIPAL_ANONYMOUS, restrictedTargetAddress, Activity.WRITE)) .thenReturn(Future.succeededFuture(Boolean.FALSE)); final AmqpServiceBase<ServiceConfigProperties> server = createServer(endpoint); server.setAuthorizationService(authService); // WHEN a client connects to the server using a address for a tenant it is not authorized to write to final Target target = getTarget(restrictedTargetAddress); final ProtonReceiver receiver = mock(ProtonReceiver.class); when(receiver.getRemoteTarget()).thenReturn(target); when(receiver.setCondition(any())).thenReturn(receiver); server.handleReceiverOpen(newConnection(Constants.PRINCIPAL_ANONYMOUS), receiver); // THEN the server closes the link with the client verify(receiver).close(); }
if (receiver.getRemoteTarget().getAddress() == null) { LOG.debug("client [container: {}] wants to open an anonymous link for sending messages to arbitrary addresses, closing link ...", con.getRemoteContainer()); } else { LOG.debug("client [container: {}] wants to open a link [address: {}] for sending messages", con.getRemoteContainer(), receiver.getRemoteTarget()); try { final ResourceIdentifier targetResource = getResourceIdentifier(receiver.getRemoteTarget().getAddress()); final AmqpEndpoint endpoint = getEndpoint(targetResource); if (endpoint == null) { Constants.copyProperties(con, receiver); receiver.setSource(receiver.getRemoteSource()); receiver.setTarget(receiver.getRemoteTarget()); endpoint.onLinkAttach(con, receiver, targetResource); } else {
private void receiverHandler(ProtonReceiver receiver) { LOG.info("Attaching link request"); // the LWT service supports only the control address if (!receiver.getRemoteTarget().getAddress().equals(LWT_SERVICE_ENDPOINT)) { ErrorCondition errorCondition = new ErrorCondition(AmqpError.NOT_FOUND, "The provided address isn't supported"); receiver.setCondition(errorCondition) .close(); } else { receiver.setTarget(receiver.getRemoteTarget()) .setQoS(ProtonQoS.AT_LEAST_ONCE) .handler((delivery, message) -> { this.messageHandler(receiver, delivery, message); }) .closeHandler(ar -> { this.closeHandler(receiver, ar); }) .detachHandler(ar -> { this.closeHandler(receiver, ar); }) .setPrefetch(0) .open(); receiver.flow(AMQP_WILL_CREDITS); } }
TracingHelper.logError(span, ex); closeLinkWithError(receiver, ex); } else if (receiver.getRemoteTarget() != null && receiver.getRemoteTarget().getAddress() != null) { if (!receiver.getRemoteTarget().getAddress().isEmpty()) { LOG.debug("Closing link due to the present of Target [address : {}]", receiver.getRemoteTarget().getAddress()); } else { receiver.setTarget(receiver.getRemoteTarget()); receiver.setSource(receiver.getRemoteSource()); receiver.setQoS(receiver.getRemoteQoS());
receiver.setTarget(receiver.getRemoteTarget()) .setAutoAccept(false) .closeHandler(ar -> {
LOG.trace("Server receiver open"); Target remoteTarget = (Target) serverReceiver.getRemoteTarget(); context.assertNotNull(remoteTarget, "target should not be null"); context.assertEquals(testName, remoteTarget.getAddress(), "expected given address");
LOG.trace("Server receiver open"); Target remoteTarget = (Target) serverReceiver.getRemoteTarget(); context.assertNotNull(remoteTarget, "target should not be null"); context.assertEquals(testName, remoteTarget.getAddress(), "expected given address");
LOG.trace("Server receiver open"); Target remoteTarget = (Target) serverReceiver.getRemoteTarget(); context.assertNotNull(remoteTarget, "target should not be null"); context.assertEquals(testName, remoteTarget.getAddress(), "expected given address");
Target remoteTarget = (Target) serverReceiver.getRemoteTarget(); context.assertNotNull(remoteTarget, "target should not be null"); context.assertFalse(remoteTarget.getDynamic(), "target should not be dynamic");