MyServerSocketFactory.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package de.tudarmstadt.informatik.hostage.net;
  2. import java.io.FileDescriptor;
  3. import java.io.IOException;
  4. import java.lang.reflect.Field;
  5. import java.net.InetAddress;
  6. import java.net.ServerSocket;
  7. import java.net.SocketImpl;
  8. import javax.net.ServerSocketFactory;
  9. import javax.net.ssl.SSLContext;
  10. import javax.net.ssl.SSLServerSocket;
  11. import de.tudarmstadt.informatik.hostage.system.PrivilegedPort;
  12. public class MyServerSocketFactory extends ServerSocketFactory {
  13. /**
  14. * This method creates and returns a ServerSocket. A custom SocketImpl is
  15. * injected into the ServerSocket.
  16. */
  17. @Override
  18. public ServerSocket createServerSocket(int port) throws IOException {
  19. FileDescriptor fd = new PrivilegedPort(port).bindAndGetFD();
  20. ServerSocket socket = new ServerSocket();
  21. try {
  22. SocketImpl impl = getImpl(socket);
  23. injectFD(fd, impl);
  24. injectImpl(impl, socket);
  25. setBound(socket);
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. return socket;
  30. }
  31. public ServerSocket createServerSocket(int port, SSLContext sslc) throws IOException {
  32. //TODO
  33. FileDescriptor fd = new PrivilegedPort(port).bindAndGetFD();
  34. ServerSocketFactory ssf = sslc.getServerSocketFactory();
  35. ServerSocket socket = ssf.createServerSocket();
  36. try {
  37. SocketImpl impl = getImpl(socket);
  38. injectFD(fd, impl);
  39. injectImpl(impl, socket);
  40. setBound(socket);
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. return socket;
  45. }
  46. /**
  47. * Extracts the SocketImpl out of a ServerSocket.
  48. */
  49. private SocketImpl getImpl(ServerSocket socket) throws Exception {
  50. Field implField = socket.getClass().getDeclaredField("impl");
  51. implField.setAccessible(true);
  52. return (SocketImpl) implField.get(socket);
  53. }
  54. /**
  55. * Injects a FileDescriptor into a SocketImpl.
  56. */
  57. private void injectFD(FileDescriptor fd, SocketImpl impl) throws Exception {
  58. Class<?> plainServerSocketImplClazz = impl.getClass();
  59. Class<?> plainSocketImplClazz = plainServerSocketImplClazz
  60. .getSuperclass();
  61. Class<?> socketImplClazz = plainSocketImplClazz.getSuperclass();
  62. Field fdField = socketImplClazz.getDeclaredField("fd");
  63. fdField.setAccessible(true);
  64. fdField.set(impl, fd);
  65. }
  66. /**
  67. * Injects a SocketImpl into a ServerSocket.
  68. */
  69. private void injectImpl(SocketImpl impl, ServerSocket socket)
  70. throws Exception {
  71. Field implField = socket.getClass().getDeclaredField("impl");
  72. implField.setAccessible(true);
  73. implField.set(socket, impl);
  74. }
  75. /**
  76. * Sets the isBound Field of a ServerSocket to true.
  77. */
  78. private void setBound(ServerSocket socket) throws Exception {
  79. Field boundField = socket.getClass().getDeclaredField("isBound");
  80. boundField.setAccessible(true);
  81. boundField.set(socket, true);
  82. }
  83. /**
  84. * Must override.
  85. */
  86. @Override
  87. public ServerSocket createServerSocket(int port, int backlog)
  88. throws IOException {
  89. return createServerSocket(port);
  90. }
  91. /**
  92. * Must override.
  93. */
  94. @Override
  95. public ServerSocket createServerSocket(int port, int backlog,
  96. InetAddress iAddress) throws IOException {
  97. return createServerSocket(port);
  98. }
  99. }