/// <summary> /// Sets the address the server listens on. /// Must be called before start(). /// Defaults to null, meaning listen on every /// local address (wildcard address). /// @param listenAddress listen address or null /// </summary> /// <summary> /// Copies all Proxy-State attributes from the request /// packet to the response packet. /// @param request request packet /// @param answer response packet /// </summary> protected void CopyProxyState(RadiusPacket request, RadiusPacket answer) { IList <RadiusAttribute> proxyStateAttrs = request.GetAttributes(33); foreach (RadiusAttribute proxyStateAttr in proxyStateAttrs) { //RadiusAttribute proxyStateAttr = (RadiusAttribute)i.next(); answer.AddAttribute(proxyStateAttr); } }
/** * Sends an answer to a proxied packet back to the original host. * Retrieves the RadiusProxyConnection object from the cache employing * the Proxy-State attribute. * @param packet packet to be sent back * @param remote the server the packet arrived from * @throws IOException */ protected void proxyPacketReceived(RadiusPacket packet, IPEndPoint remote) { // retrieve my Proxy-State attribute (the last) IList <RadiusAttribute> proxyStates = packet.GetAttributes(33); if (proxyStates == null || proxyStates.Count == 0) { throw new RadiusException("Proxy packet without Proxy-State attribute"); } RadiusAttribute proxyState = proxyStates[proxyStates.Count - 1]; // retrieve Proxy connection from cache string state = BitConverter.ToString(proxyState.Data); var proxyConnection = (RadiusProxyConnection)proxyConnections[state]; proxyConnections.Remove(state); if (proxyConnection == null) { logger.Warn("received packet on Proxy port without saved Proxy connection - duplicate?"); return; } // retrieve client RadiusEndpoint client = proxyConnection.RadiusClient; if (logger.IsInfoEnabled) { logger.Info("received Proxy packet: " + packet); logger.Info("forward packet to " + client.EndpointAddress + " with secret " + client.SharedSecret); } // remove only own Proxy-State (last attribute) packet.RemoveLastAttribute(33); // re-encode answer packet with authenticator of the original packet var answer = new RadiusPacket(packet.Type, packet.Identifier, packet.Attributes); byte[] datagram = MakeDatagramPacket(answer, client.SharedSecret, proxyConnection.Packet); // send back using correct socket UdpClient socket = proxyConnection.Port == AuthPort?GetAuthSocket() : GetAcctSocket(); socket.Send(datagram, datagram.Length, remote); }