@Override public void start() throws Exception { // Create the client object ProcessorService service = new ProcessorServiceImpl(); // Register the handler new ServiceBinder(vertx) .setAddress("vertx.processor") .register(ProcessorService.class, service); Router router = Router.router(vertx); // Allow events for the designated addresses in/out of the event bus bridge BridgeOptions opts = new BridgeOptions() .addInboundPermitted(new PermittedOptions().setAddress("vertx.processor")) .addOutboundPermitted(new PermittedOptions().setAddress("vertx.processor")); // Create the event bus bridge and add it to the router. SockJSHandler ebHandler = SockJSHandler.create(vertx).bridge(opts); router.route("/eventbus/*").handler(ebHandler); router.route().handler(StaticHandler.create()); // vertx.createHttpServer().requestHandler(router).listen(8080); }
@Test public void testRegisterPermittedMixedAddressRe() throws Exception { String addr1 = "allow1"; String addr2 = "ballo.+"; sockJSHandler.bridge(defaultOptions.addOutboundPermitted(new PermittedOptions().setAddress(addr1)). addOutboundPermitted(new PermittedOptions().setAddressRegex(addr2))); testReceive("allow1", "foobar"); testReceive("ballow1", "foobar"); testReceive("ballow2", "foobar"); testError(new JsonObject().put("type", "register").put("address", "hello").put("body", "blah"), "access_denied"); testError(new JsonObject().put("type", "register").put("address", "allow2").put("body", "blah"), "access_denied"); }
@Override public void start() throws Exception { // Create the client object MyService service = new MyServiceImpl(); // Register the handler new ServiceBinder(vertx) .setAddress("proxy.example") .register(MyService.class, service); Router router = Router.router(vertx); BridgeOptions options = new BridgeOptions().addInboundPermitted(new PermittedOptions().setAddress("proxy.example")); router.route("/eventbus/*").handler(SockJSHandler.create(vertx).bridge(options)); // Serve the static resources router.route().handler(StaticHandler.create()); vertx.createHttpServer().requestHandler(router).listen(8080); } }
@Test public void testSendPermittedMixedAddressRe() throws Exception { String addr1 = "allow1"; String addr2 = "ballo.+"; sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr1)). addInboundPermitted(new PermittedOptions().setAddressRegex(addr2))); testSend("allow1", "foobar"); testSend("ballow1", "foobar"); testSend("ballow2", "foobar"); testError(new JsonObject().put("type", "send").put("address", "hello").put("body", "blah"), "access_denied"); testError(new JsonObject().put("type", "send").put("address", "allow2").put("body", "blah"), "access_denied"); }
@Test public void testSendPermittedStructureMatchWithAddress() throws Exception { JsonObject match = new JsonObject().put("fib", "wib").put("oop", 12); sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setMatch(match).setAddress(addr))); testSend(addr, match); JsonObject json1 = match.copy(); json1.put("blah", "foob"); testSend(addr, json1); json1.remove("fib"); testError(new JsonObject().put("type", "send").put("address", addr).put("body", json1), "access_denied"); testError(new JsonObject().put("type", "send").put("address", "otheraddress").put("body", json1), "access_denied"); }
String requiredAuthority = TestUtils.randomAlphaString(10); JsonObject match = new JsonObject().put(TestUtils.randomAlphaString(10), TestUtils.randomAlphaString(10)); assertSame(options, options.setAddress(address)); assertSame(options, options.setAddressRegex(addressRegex)); assertSame(options, options.setRequiredAuthority(requiredAuthority)); assertEquals(requiredAuthority, copy.getRequiredAuthority()); assertEquals(match, copy.getMatch()); assertSame(copy, copy.setAddress(TestUtils.randomAlphaString(10))); assertSame(copy, copy.setAddressRegex(TestUtils.randomAlphaString(10))); assertSame(copy, copy.setRequiredAuthority(TestUtils.randomAlphaString(10))); assertSame(copy, copy.setMatch(new JsonObject().put(TestUtils.randomAlphaString(10), TestUtils.randomAlphaString(10)))); assertSame(options, options.setAddress(address)); assertSame(options, options.setAddressRegex(addressRegex)); assertSame(options, options.setRequiredAuthority(requiredAuthority));
@Test public void testSendPermittedAllowAddress() throws Exception { String addr = "allow1"; sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr))); testSend(addr, "foobar"); testError(new JsonObject().put("type", "send").put("address", "allow2").put("body", "blah"), "access_denied"); }
@Test public void testRegisterPermittedAllowAddress() throws Exception { String addr = "allow1"; sockJSHandler.bridge(defaultOptions.addOutboundPermitted(new PermittedOptions().setAddress(addr))); testReceive(addr, "foobar"); testError(new JsonObject().put("type", "register").put("address", "allow2").put("body", "blah"), "access_denied"); }
@Test public void testSendRequiresAuthorityNotLoggedIn() throws Exception { sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr).setRequiredAuthority("admin"))); testError(new JsonObject().put("type", "send").put("address", addr).put("body", "foo"), "not_logged_in"); }
@Test public void testSendPermittedMultipleAddresses() throws Exception { String addr1 = "allow1"; String addr2 = "allow2"; sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr1)). addInboundPermitted(new PermittedOptions().setAddress(addr2))); testSend("allow1", "foobar"); testSend("allow2", "foobar"); testError(new JsonObject().put("type", "send").put("address", "allow3").put("body", "blah"), "access_denied"); }
@Test public void testRegisterPermittedMultipleAddresses() throws Exception { String addr1 = "allow1"; String addr2 = "allow2"; sockJSHandler.bridge(defaultOptions.addOutboundPermitted(new PermittedOptions().setAddress(addr1)). addOutboundPermitted(new PermittedOptions().setAddress(addr2))); testReceive("allow1", "foobar"); testReceive("allow2", "foobar"); testError(new JsonObject().put("type", "register").put("address", "allow3").put("body", "blah"), "access_denied"); }
@Test public void testRegisterPermittedStructureMatchWithAddress() throws Exception { JsonObject match = new JsonObject().put("fib", "wib").put("oop", 12); sockJSHandler.bridge(defaultOptions.addOutboundPermitted(new PermittedOptions().setMatch(match).setAddress(addr))); testReceive(addr, match); JsonObject json1 = match.copy(); json1.put("blah", "foob"); testReceive(addr, json1); JsonObject json2 = json1.copy(); json2.remove("fib"); testReceiveFail(addr, json2); }
@Test public void testReplyMessagesOutbound() throws Exception { // Only allow outbound address, reply message should still get through though sockJSHandler.bridge(defaultOptions.addOutboundPermitted(new PermittedOptions().setAddress(addr))); CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { JsonObject reg = new JsonObject().put("type", "register").put("address", addr); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(reg.encode(), true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); Object rec = received.getValue("body"); assertEquals("foobar", rec); // Now send back reply JsonObject reply = new JsonObject().put("type", "send").put("address", received.getString("replyAddress")).put("body", "barfoo"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(reply.encode(), true)); }); vertx.setTimer(500, tid -> vertx.eventBus().send(addr, "foobar", res -> { if (res.succeeded()) { assertEquals("barfoo", res.result().body()); ws.closeHandler(v2 -> latch.countDown()); ws.close(); } })); }); awaitLatch(latch); }
@Test public void testSendRequiresAuthorityHasnotAuthority() throws Exception { sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr).setRequiredAuthority("pick_nose"))); router.clear(); router.route().handler(CookieHandler.create()); SessionStore store = LocalSessionStore.create(vertx); router.route().handler(SessionHandler.create(store)); JsonObject authConfig = new JsonObject().put("properties_path", "classpath:login/loginusers.properties"); AuthProvider authProvider = ShiroAuth.create(vertx, new ShiroAuthOptions().setType(ShiroAuthRealmType.PROPERTIES).setConfig(authConfig)); addLoginHandler(router, authProvider); router.route("/eventbus/*").handler(sockJSHandler); testError(new JsonObject().put("type", "send").put("address", addr).put("body", "foo"), "access_denied"); }
@Test public void testReplyMessagesInbound() throws Exception { // Only allow inbound address, reply message should still get through though sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr))); CountDownLatch latch = new CountDownLatch(1); client.websocket(websocketURI, ws -> { MessageConsumer<Object> consumer = vertx.eventBus().consumer(addr); consumer.handler(msg -> { Object receivedBody = msg.body(); assertEquals("foobar", receivedBody); msg.reply("barfoo"); consumer.unregister(); }); String replyAddress = UUID.randomUUID().toString(); JsonObject msg = new JsonObject().put("type", "send").put("address", addr).put("replyAddress", replyAddress).put("body", "foobar"); ws.writeFrame(io.vertx.core.http.WebSocketFrame.textFrame(msg.encode(), true)); ws.handler(buff -> { String str = buff.toString(); JsonObject received = new JsonObject(str); Object rec = received.getValue("body"); assertEquals("barfoo", rec); ws.closeHandler(v -> latch.countDown()); ws.close(); }); }); awaitLatch(latch); }
@Test public void testInvalidMessageCode() { router.route("/ws-timeout/*").handler(SockJSHandler .create(vertx) .bridge(new BridgeOptions().addInboundPermitted(new PermittedOptions().setAddress("SockJSHandlerTest.testInvalidMessageCode"))) ); vertx.eventBus().consumer("SockJSHandlerTest.testInvalidMessageCode", msg -> msg.reply(new JsonObject())); client.websocket("/ws-timeout/websocket", ws -> { ws.writeFinalBinaryFrame(Buffer.buffer("durp!")); ws.frameHandler(frame -> { // we should get a normal frame with a error message if (!frame.isClose()) { JsonObject msg = new JsonObject(frame.binaryData()); assertEquals("err", msg.getString("type")); assertEquals("invalid_json", msg.getString("body")); testComplete(); ws.close(); } }); }); await(); } }
sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr)));
@Test public void testSendRequiresAuthorityHasAuthority() throws Exception { sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr).setRequiredAuthority("bang_sticks"))); router.clear(); router.route().handler(CookieHandler.create()); SessionStore store = LocalSessionStore.create(vertx); router.route().handler(SessionHandler.create(store)); JsonObject authConfig = new JsonObject().put("properties_path", "classpath:login/loginusers.properties"); AuthProvider authProvider = ShiroAuth.create(vertx, new ShiroAuthOptions().setType(ShiroAuthRealmType.PROPERTIES).setConfig(authConfig)); addLoginHandler(router, authProvider); router.route("/eventbus/*").handler(sockJSHandler); testSend("foo"); }
@Test public void testRegisterPermittedMultipleAddresses() throws Exception { String addr1 = "allow1"; String addr2 = "allow2"; sockJSHandler.bridge(defaultOptions.addOutboundPermitted(new PermittedOptions().setAddress(addr1)). addOutboundPermitted(new PermittedOptions().setAddress(addr2))); testReceive("allow1", "foobar"); testReceive("allow2", "foobar"); testError(new JsonObject().put("type", "register").put("address", "allow3").put("body", "blah"), "access_denied"); }
@Test public void testSendPermittedAllowAddress() throws Exception { String addr = "allow1"; sockJSHandler.bridge(defaultOptions.addInboundPermitted(new PermittedOptions().setAddress(addr))); testSend(addr, "foobar"); testError(new JsonObject().put("type", "send").put("address", "allow2").put("body", "blah"), "access_denied"); }