Search in sources :

Example 1 with RadiusRequest

use of org.tinyradius.core.packet.request.RadiusRequest in project tinyradius-netty by globalreachtech.

the class ProxyHandler method channelRead0.

@Override
protected void channelRead0(ChannelHandlerContext ctx, RequestCtx msg) {
    final RadiusRequest request = msg.getRequest();
    RadiusEndpoint clientEndpoint = msg.getEndpoint();
    Optional<RadiusEndpoint> serverEndpoint = getProxyServer(request, clientEndpoint);
    if (!serverEndpoint.isPresent()) {
        logger.info("Server not found for client proxy request, ignoring");
        return;
    }
    logger.debug("Proxying packet to {}", serverEndpoint.get().getAddress());
    radiusClient.communicate(request, serverEndpoint.get()).addListener(f -> {
        final RadiusResponse packet = (RadiusResponse) f.getNow();
        if (f.isSuccess() && packet != null) {
            final RadiusResponse response = RadiusResponse.create(request.getDictionary(), packet.getType(), packet.getId(), packet.getAuthenticator(), packet.getAttributes());
            ctx.writeAndFlush(msg.withResponse(response));
        }
    });
}
Also used : RadiusResponse(org.tinyradius.core.packet.response.RadiusResponse) RadiusEndpoint(org.tinyradius.io.RadiusEndpoint) RadiusRequest(org.tinyradius.core.packet.request.RadiusRequest)

Example 2 with RadiusRequest

use of org.tinyradius.core.packet.request.RadiusRequest in project tinyradius-netty by globalreachtech.

the class ServerPacketCodec method decode.

@Override
protected void decode(ChannelHandlerContext ctx, DatagramPacket msg, List<Object> out) {
    final InetSocketAddress remoteAddress = msg.sender();
    try {
        final RadiusRequest request = fromDatagram(dictionary, msg);
        String secret = secretProvider.getSharedSecret(remoteAddress, request);
        if (secret == null) {
            logger.warn("Ignoring packet from {}, shared secret lookup failed", remoteAddress);
            return;
        }
        logger.debug("Received request from {} - {}", remoteAddress, request);
        // log first before errors may be thrown
        out.add(new RequestCtx(request.decodeRequest(secret), new RadiusEndpoint(remoteAddress, secret)));
    } catch (RadiusPacketException e) {
        logger.warn("Could not deserialize packet: {}", e.getMessage());
    }
}
Also used : RadiusPacketException(org.tinyradius.core.RadiusPacketException) RadiusEndpoint(org.tinyradius.io.RadiusEndpoint) InetSocketAddress(java.net.InetSocketAddress) RadiusRequest(org.tinyradius.core.packet.request.RadiusRequest) RequestCtx(org.tinyradius.io.server.RequestCtx)

Example 3 with RadiusRequest

use of org.tinyradius.core.packet.request.RadiusRequest in project tinyradius-netty by globalreachtech.

the class TestProxy method main.

public static void main(String[] args) throws Exception {
    final NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(4);
    final Dictionary dictionary = DefaultDictionary.INSTANCE;
    final Timer timer = new HashedWheelTimer();
    final Bootstrap bootstrap = new Bootstrap().channel(NioDatagramChannel.class).group(eventLoopGroup);
    final SecretProvider secretProvider = remote -> {
        if (remote.getPort() == 11812 || remote.getPort() == 11813)
            return "testing123";
        return remote.getAddress().getHostAddress().equals("127.0.0.1") ? "proxytest" : null;
    };
    final FixedTimeoutHandler retryStrategy = new FixedTimeoutHandler(timer, 3, 1000);
    final RadiusClient radiusClient = new RadiusClient(bootstrap, new InetSocketAddress(0), retryStrategy, new ChannelInitializer<DatagramChannel>() {

        @Override
        protected void initChannel(DatagramChannel ch) {
            ch.pipeline().addLast(new ClientDatagramCodec(dictionary), new PromiseAdapter());
        }
    });
    final ChannelInitializer<DatagramChannel> channelInitializer = new ChannelInitializer<DatagramChannel>() {

        @Override
        protected void initChannel(DatagramChannel ch) {
            ch.pipeline().addLast(new ServerPacketCodec(dictionary, secretProvider), new ProxyHandler(radiusClient) {

                @Override
                public Optional<RadiusEndpoint> getProxyServer(RadiusRequest request, RadiusEndpoint client) {
                    try {
                        InetAddress address = InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 });
                        int port = request instanceof AccountingRequest ? 11813 : 11812;
                        return Optional.of(new RadiusEndpoint(new InetSocketAddress(address, port), "testing123"));
                    } catch (UnknownHostException e) {
                        return Optional.empty();
                    }
                }
            });
        }
    };
    try (RadiusServer proxy = new RadiusServer(bootstrap, channelInitializer, channelInitializer, new InetSocketAddress(1812), new InetSocketAddress(1813))) {
        proxy.isReady().addListener(future1 -> {
            if (future1.isSuccess()) {
                logger.info("Server started");
            } else {
                logger.info("Failed to start server", future1.cause());
                proxy.close();
                eventLoopGroup.shutdownGracefully();
            }
        });
        System.in.read();
    }
    eventLoopGroup.shutdownGracefully();
}
Also used : FixedTimeoutHandler(org.tinyradius.io.client.timeout.FixedTimeoutHandler) ServerPacketCodec(org.tinyradius.io.server.handler.ServerPacketCodec) ClientDatagramCodec(org.tinyradius.io.client.handler.ClientDatagramCodec) RadiusClient(org.tinyradius.io.client.RadiusClient) InetAddress(java.net.InetAddress) DatagramChannel(io.netty.channel.socket.DatagramChannel) AccountingRequest(org.tinyradius.core.packet.request.AccountingRequest) RadiusServer(org.tinyradius.io.server.RadiusServer) RadiusRequest(org.tinyradius.core.packet.request.RadiusRequest) ProxyHandler(org.tinyradius.io.server.handler.ProxyHandler) ChannelInitializer(io.netty.channel.ChannelInitializer) Dictionary(org.tinyradius.core.dictionary.Dictionary) InetSocketAddress(java.net.InetSocketAddress) UnknownHostException(java.net.UnknownHostException) NioEventLoopGroup(io.netty.channel.nio.NioEventLoopGroup) SecretProvider(org.tinyradius.io.server.SecretProvider) Bootstrap(io.netty.bootstrap.Bootstrap) Logger(org.apache.logging.log4j.Logger) RadiusEndpoint(org.tinyradius.io.RadiusEndpoint) NioDatagramChannel(io.netty.channel.socket.nio.NioDatagramChannel) DefaultDictionary(org.tinyradius.core.dictionary.DefaultDictionary) HashedWheelTimer(io.netty.util.HashedWheelTimer) Timer(io.netty.util.Timer) PromiseAdapter(org.tinyradius.io.client.handler.PromiseAdapter) Optional(java.util.Optional) LogManager(org.apache.logging.log4j.LogManager) Dictionary(org.tinyradius.core.dictionary.Dictionary) DefaultDictionary(org.tinyradius.core.dictionary.DefaultDictionary) RadiusClient(org.tinyradius.io.client.RadiusClient) NioDatagramChannel(io.netty.channel.socket.nio.NioDatagramChannel) FixedTimeoutHandler(org.tinyradius.io.client.timeout.FixedTimeoutHandler) InetSocketAddress(java.net.InetSocketAddress) ClientDatagramCodec(org.tinyradius.io.client.handler.ClientDatagramCodec) RadiusRequest(org.tinyradius.core.packet.request.RadiusRequest) AccountingRequest(org.tinyradius.core.packet.request.AccountingRequest) RadiusServer(org.tinyradius.io.server.RadiusServer) Bootstrap(io.netty.bootstrap.Bootstrap) ChannelInitializer(io.netty.channel.ChannelInitializer) NioEventLoopGroup(io.netty.channel.nio.NioEventLoopGroup) ServerPacketCodec(org.tinyradius.io.server.handler.ServerPacketCodec) Optional(java.util.Optional) UnknownHostException(java.net.UnknownHostException) ProxyHandler(org.tinyradius.io.server.handler.ProxyHandler) DatagramChannel(io.netty.channel.socket.DatagramChannel) NioDatagramChannel(io.netty.channel.socket.nio.NioDatagramChannel) HashedWheelTimer(io.netty.util.HashedWheelTimer) PromiseAdapter(org.tinyradius.io.client.handler.PromiseAdapter) HashedWheelTimer(io.netty.util.HashedWheelTimer) Timer(io.netty.util.Timer) RadiusEndpoint(org.tinyradius.io.RadiusEndpoint) InetAddress(java.net.InetAddress) SecretProvider(org.tinyradius.io.server.SecretProvider)

Example 4 with RadiusRequest

use of org.tinyradius.core.packet.request.RadiusRequest in project tinyradius-netty by globalreachtech.

the class RadiusClientTest method communicateEndpointListFirstSuccess.

@Test
void communicateEndpointListFirstSuccess() throws RadiusPacketException {
    final byte id = (byte) random.nextInt(256);
    final RadiusResponse response = RadiusResponse.create(DefaultDictionary.INSTANCE, (byte) 2, id, null, Collections.emptyList());
    final CapturingOutboundHandler capturingOutboundHandler = spy(new CapturingOutboundHandler(p -> p.trySuccess(response)));
    final RadiusClient radiusClient = new RadiusClient(bootstrap, address, timeoutHandler, capturingOutboundHandler);
    final InetSocketAddress address2 = new InetSocketAddress(1);
    // never used
    final RadiusEndpoint stubEndpoint2 = new RadiusEndpoint(address2, "secret2");
    final InetSocketAddress address3 = new InetSocketAddress(2);
    // never used
    final RadiusEndpoint stubEndpoint3 = new RadiusEndpoint(address3, "secret3");
    final List<RadiusEndpoint> endpoints = Arrays.asList(stubEndpoint, stubEndpoint2, stubEndpoint3);
    final RadiusRequest request = RadiusRequest.create(dictionary, (byte) 1, (byte) 1, null, Collections.emptyList());
    final Future<RadiusResponse> future = radiusClient.communicate(request, endpoints);
    await().until(future::isDone);
    assertTrue(future.isSuccess());
    assertEquals(response, future.getNow());
    assertEquals(1, capturingOutboundHandler.requests.size());
    assertEquals("secret", capturingOutboundHandler.requests.get(0).getEndpoint().getSecret());
}
Also used : FixedTimeoutHandler(org.tinyradius.io.client.timeout.FixedTimeoutHandler) Arrays(java.util.Arrays) TimeoutException(java.util.concurrent.TimeoutException) ArrayList(java.util.ArrayList) SecureRandom(java.security.SecureRandom) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) ChannelPromise(io.netty.channel.ChannelPromise) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) Spy(org.mockito.Spy) RadiusRequest(org.tinyradius.core.packet.request.RadiusRequest) MockitoExtension(org.mockito.junit.jupiter.MockitoExtension) Awaitility.await(org.awaitility.Awaitility.await) ChannelOutboundHandlerAdapter(io.netty.channel.ChannelOutboundHandlerAdapter) Promise(io.netty.util.concurrent.Promise) Dictionary(org.tinyradius.core.dictionary.Dictionary) InetSocketAddress(java.net.InetSocketAddress) NioEventLoopGroup(io.netty.channel.nio.NioEventLoopGroup) TimeoutHandler(org.tinyradius.io.client.timeout.TimeoutHandler) RadiusResponse(org.tinyradius.core.packet.response.RadiusResponse) Test(org.junit.jupiter.api.Test) Consumer(java.util.function.Consumer) Bootstrap(io.netty.bootstrap.Bootstrap) Mockito(org.mockito.Mockito) List(java.util.List) RadiusEndpoint(org.tinyradius.io.RadiusEndpoint) NioDatagramChannel(io.netty.channel.socket.nio.NioDatagramChannel) DefaultDictionary(org.tinyradius.core.dictionary.DefaultDictionary) HashedWheelTimer(io.netty.util.HashedWheelTimer) Assertions(org.junit.jupiter.api.Assertions) Timer(io.netty.util.Timer) Future(io.netty.util.concurrent.Future) Collections(java.util.Collections) RadiusPacketException(org.tinyradius.core.RadiusPacketException) RadiusResponse(org.tinyradius.core.packet.response.RadiusResponse) RadiusEndpoint(org.tinyradius.io.RadiusEndpoint) InetSocketAddress(java.net.InetSocketAddress) RadiusRequest(org.tinyradius.core.packet.request.RadiusRequest) Test(org.junit.jupiter.api.Test)

Example 5 with RadiusRequest

use of org.tinyradius.core.packet.request.RadiusRequest in project tinyradius-netty by globalreachtech.

the class RadiusClientTest method communicateEndpointListAllFail.

@Test
void communicateEndpointListAllFail() throws RadiusPacketException {
    final Exception expectedException = new Exception("test 123");
    final CapturingOutboundHandler capturingOutboundHandler = new CapturingOutboundHandler(p -> p.tryFailure(expectedException));
    final RadiusClient radiusClient = new RadiusClient(bootstrap, address, timeoutHandler, capturingOutboundHandler);
    final RadiusEndpoint stubEndpoint2 = new RadiusEndpoint(new InetSocketAddress(1), "secret2");
    final RadiusEndpoint stubEndpoint3 = new RadiusEndpoint(new InetSocketAddress(2), "secret3");
    final List<RadiusEndpoint> endpoints = Arrays.asList(stubEndpoint, stubEndpoint2, stubEndpoint3);
    final RadiusRequest request = RadiusRequest.create(dictionary, (byte) 1, (byte) 1, null, Collections.emptyList());
    final Future<RadiusResponse> future = radiusClient.communicate(request, endpoints);
    await().until(future::isDone);
    assertFalse(future.isSuccess());
    assertTrue(future.cause().getMessage().contains("all endpoints failed"));
    assertSame(expectedException, future.cause().getCause());
    assertEquals(3, capturingOutboundHandler.requests.size());
    assertEquals("secret", capturingOutboundHandler.requests.get(0).getEndpoint().getSecret());
    assertEquals("secret2", capturingOutboundHandler.requests.get(1).getEndpoint().getSecret());
    assertEquals("secret3", capturingOutboundHandler.requests.get(2).getEndpoint().getSecret());
    // unpooled, let GC handle it
    assertEquals(1, request.toByteBuf().refCnt());
}
Also used : RadiusResponse(org.tinyradius.core.packet.response.RadiusResponse) RadiusEndpoint(org.tinyradius.io.RadiusEndpoint) InetSocketAddress(java.net.InetSocketAddress) TimeoutException(java.util.concurrent.TimeoutException) RadiusPacketException(org.tinyradius.core.RadiusPacketException) RadiusRequest(org.tinyradius.core.packet.request.RadiusRequest) Test(org.junit.jupiter.api.Test)

Aggregations

RadiusRequest (org.tinyradius.core.packet.request.RadiusRequest)22 Test (org.junit.jupiter.api.Test)16 RadiusEndpoint (org.tinyradius.io.RadiusEndpoint)12 InetSocketAddress (java.net.InetSocketAddress)11 RadiusResponse (org.tinyradius.core.packet.response.RadiusResponse)11 RadiusPacketException (org.tinyradius.core.RadiusPacketException)9 RequestCtx (org.tinyradius.io.server.RequestCtx)7 ArrayList (java.util.ArrayList)6 DatagramPacket (io.netty.channel.socket.DatagramPacket)5 HashedWheelTimer (io.netty.util.HashedWheelTimer)5 TimeoutException (java.util.concurrent.TimeoutException)5 FixedTimeoutHandler (org.tinyradius.io.client.timeout.FixedTimeoutHandler)5 Bootstrap (io.netty.bootstrap.Bootstrap)4 NioEventLoopGroup (io.netty.channel.nio.NioEventLoopGroup)4 NioDatagramChannel (io.netty.channel.socket.nio.NioDatagramChannel)4 Timer (io.netty.util.Timer)4 DefaultDictionary (org.tinyradius.core.dictionary.DefaultDictionary)4 Dictionary (org.tinyradius.core.dictionary.Dictionary)4 AccountingRequest (org.tinyradius.core.packet.request.AccountingRequest)4 ChannelHandlerContext (io.netty.channel.ChannelHandlerContext)3