123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- package de.tudarmstadt.informatik.hostage.net;
- import java.io.FileDescriptor;
- import java.io.IOException;
- import java.lang.reflect.Field;
- import java.net.InetAddress;
- import java.net.ServerSocket;
- import java.net.SocketImpl;
- import javax.net.ServerSocketFactory;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLServerSocket;
- import de.tudarmstadt.informatik.hostage.system.PrivilegedPort;
- public class MyServerSocketFactory extends ServerSocketFactory {
- /**
- * This method creates and returns a ServerSocket. A custom SocketImpl is
- * injected into the ServerSocket.
- */
- @Override
- public ServerSocket createServerSocket(int port) throws IOException {
- FileDescriptor fd = new PrivilegedPort(port).bindAndGetFD();
- ServerSocket socket = new ServerSocket();
- try {
- SocketImpl impl = getImpl(socket);
- injectFD(fd, impl);
- injectImpl(impl, socket);
- setBound(socket);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return socket;
- }
-
- public ServerSocket createServerSocket(int port, SSLContext sslc) throws IOException {
- //TODO
- FileDescriptor fd = new PrivilegedPort(port).bindAndGetFD();
- ServerSocketFactory ssf = sslc.getServerSocketFactory();
- ServerSocket socket = ssf.createServerSocket();
- try {
- SocketImpl impl = getImpl(socket);
- injectFD(fd, impl);
- injectImpl(impl, socket);
- setBound(socket);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return socket;
- }
- /**
- * Extracts the SocketImpl out of a ServerSocket.
- */
- private SocketImpl getImpl(ServerSocket socket) throws Exception {
- Field implField = socket.getClass().getDeclaredField("impl");
- implField.setAccessible(true);
- return (SocketImpl) implField.get(socket);
- }
- /**
- * Injects a FileDescriptor into a SocketImpl.
- */
- private void injectFD(FileDescriptor fd, SocketImpl impl) throws Exception {
- Class<?> plainServerSocketImplClazz = impl.getClass();
- Class<?> plainSocketImplClazz = plainServerSocketImplClazz
- .getSuperclass();
- Class<?> socketImplClazz = plainSocketImplClazz.getSuperclass();
- Field fdField = socketImplClazz.getDeclaredField("fd");
- fdField.setAccessible(true);
- fdField.set(impl, fd);
- }
- /**
- * Injects a SocketImpl into a ServerSocket.
- */
- private void injectImpl(SocketImpl impl, ServerSocket socket)
- throws Exception {
- Field implField = socket.getClass().getDeclaredField("impl");
- implField.setAccessible(true);
- implField.set(socket, impl);
- }
- /**
- * Sets the isBound Field of a ServerSocket to true.
- */
- private void setBound(ServerSocket socket) throws Exception {
- Field boundField = socket.getClass().getDeclaredField("isBound");
- boundField.setAccessible(true);
- boundField.set(socket, true);
- }
- /**
- * Must override.
- */
- @Override
- public ServerSocket createServerSocket(int port, int backlog)
- throws IOException {
- return createServerSocket(port);
- }
- /**
- * Must override.
- */
- @Override
- public ServerSocket createServerSocket(int port, int backlog,
- InetAddress iAddress) throws IOException {
- return createServerSocket(port);
- }
- }
|