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));
}
});
}
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());
}
}
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();
}
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());
}
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());
}
Aggregations