Ignore:
Timestamp:
2015-05-06T20:05:57+02:00 (10 years ago)
Author:
stoecker
Message:

remotecontrol listens on IPv4 and IPv6 separately, fix #11409

Location:
trunk/src/org/openstreetmap/josm/io/remotecontrol
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java

    r7834 r8337  
    44import java.io.File;
    55import java.net.InetAddress;
     6import java.net.Inet4Address;
     7import java.net.Inet6Address;
    68import java.net.UnknownHostException;
    79
     
    8385     * @since 7800
    8486     */
     87    @Deprecated
    8588    public static InetAddress getInetAddress() throws UnknownHostException {
    8689        // Return an address to the loopback interface by default
    8790        return InetAddress.getByName(Main.pref.get("remote.control.host", null));
    8891    }
     92
     93    /**
     94     * Returns the IPv6 address used for remote control.
     95     * @return the IPv6 address used for remote control
     96     * @throws UnknownHostException if the local host name could not be resolved into an address.
     97     * @since 8337
     98     */
     99    public static InetAddress getInet6Address() throws UnknownHostException {
     100        for(InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host", "localhost"))) {
     101            if(a instanceof Inet6Address) {
     102                return a;
     103            }
     104        };
     105        throw new UnknownHostException();
     106    }
     107
     108    /**
     109     * Returns the IPv4 address used for remote control.
     110     * @return the IPv4 address used for remote control
     111     * @throws UnknownHostException if the local host name could not be resolved into an address.
     112     * @since 8337
     113     */
     114    public static InetAddress getInet4Address() throws UnknownHostException {
     115        // Return an address to the loopback interface by default
     116        for(InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host", "localhost"))) {
     117            if(a instanceof Inet4Address) {
     118                return a;
     119            }
     120        };
     121        throw new UnknownHostException();
     122    }
    89123}
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java

    r8126 r8337  
    2020public class RemoteControlHttpServer extends Thread {
    2121
    22     /** The server socket */
    23     private ServerSocket server;
     22    /** The server socket for IPv4 */
     23    private ServerSocket server4 = null;
     24    /** The server socket for IPv6 */
     25    private ServerSocket server6 = null;
    2426
    2527    private static volatile RemoteControlHttpServer instance;
     
    6668        super("RemoteControl HTTP Server");
    6769        this.setDaemon(true);
    68         // Start the server socket with only 1 connection.
    69         // Also make sure we only listen on the local interface so nobody from the outside can connect!
    70         // NOTE: On a dual stack machine with old Windows OS this may not listen on both interfaces!
    71         this.server = new ServerSocket(port, 1, RemoteControl.getInetAddress());
     70        try {
     71            this.server4 = new ServerSocket(port, 1, RemoteControl.getInet4Address());
     72        } catch (IOException e) {
     73        }
     74        try {
     75            this.server6 = new ServerSocket(port, 1, RemoteControl.getInet6Address());
     76        } catch (IOException e) {
     77            if(this.server4 == null) /* both failed */
     78                throw e;
     79        }
    7280    }
    7381
     
    7785    @Override
    7886    public void run() {
    79         Main.info(marktr("RemoteControl::Accepting connections on {0}:{1}"),
    80                 server.getInetAddress(), Integer.toString(server.getLocalPort()));
     87        if(server4 != null) {
     88            Main.info(marktr("RemoteControl::Accepting IPv4 connections on {0}:{1}"),
     89                server4.getInetAddress(), Integer.toString(server4.getLocalPort()));
     90        }
     91        if(server6 != null) {
     92            Main.info(marktr("RemoteControl::Accepting IPv6 connections on {0}:{1}"),
     93                server6.getInetAddress(), Integer.toString(server6.getLocalPort()));
     94        }
    8195        while (true) {
    82             try {
    83                 @SuppressWarnings("resource")
    84                 Socket request = server.accept();
    85                 RequestProcessor.processRequest(request);
    86             } catch (SocketException se) {
    87                 if (!server.isClosed())
    88                     Main.error(se);
    89             } catch (IOException ioe) {
    90                 Main.error(ioe);
     96            if(server4 != null) {
     97                try {
     98                    @SuppressWarnings("resource")
     99                    Socket request = server4.accept();
     100                    RequestProcessor.processRequest(request);
     101                } catch (SocketException se) {
     102                    if (!server4.isClosed())
     103                        Main.error(se);
     104                } catch (IOException ioe) {
     105                    Main.error(ioe);
     106                }
     107            }
     108            if(server6 != null) {
     109                try {
     110                    @SuppressWarnings("resource")
     111                    Socket request = server6.accept();
     112                    RequestProcessor.processRequest(request);
     113                } catch (SocketException se) {
     114                    if (!server6.isClosed())
     115                        Main.error(se);
     116                } catch (IOException ioe) {
     117                    Main.error(ioe);
     118                }
    91119            }
    92120        }
     
    99127     */
    100128    public void stopServer() throws IOException {
    101         server.close();
     129        if(server4 != null)
     130            server4.close();
     131        if(server6 != null)
     132            server6.close();
    102133        Main.info(marktr("RemoteControl::Server stopped."));
    103134    }
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java

    r8126 r8337  
    7272public class RemoteControlHttpsServer extends Thread {
    7373
    74     /** The server socket */
    75     private ServerSocket server;
     74    /** The server socket for IPv4 */
     75    private ServerSocket server4 = null;
     76    /** The server socket for IPv6 */
     77    private ServerSocket server6 = null;
    7678
    7779    private static volatile RemoteControlHttpsServer instance;
     
    377379        }
    378380
    379         // Start the server socket with only 1 connection.
    380         // Also make sure we only listen on the local interface so nobody from the outside can connect!
    381         // NOTE: On a dual stack machine with old Windows OS this may not listen on both interfaces!
    382         this.server = factory.createServerSocket(port, 1, RemoteControl.getInetAddress());
    383 
    384         if (Main.isTraceEnabled() && server instanceof SSLServerSocket) {
    385             SSLServerSocket sslServer = (SSLServerSocket) server;
    386             Main.trace("SSL server - Enabled Cipher suites: "+Arrays.toString(sslServer.getEnabledCipherSuites()));
    387             Main.trace("SSL server - Enabled Protocols: "+Arrays.toString(sslServer.getEnabledProtocols()));
    388             Main.trace("SSL server - Enable Session Creation: "+sslServer.getEnableSessionCreation());
    389             Main.trace("SSL server - Need Client Auth: "+sslServer.getNeedClientAuth());
    390             Main.trace("SSL server - Want Client Auth: "+sslServer.getWantClientAuth());
    391             Main.trace("SSL server - Use Client Mode: "+sslServer.getUseClientMode());
     381        try {
     382            this.server4 = factory.createServerSocket(port, 1, RemoteControl.getInet4Address());
     383        } catch (IOException e) {
     384        }
     385        try {
     386            this.server6 = factory.createServerSocket(port, 1, RemoteControl.getInet6Address());
     387        } catch (IOException e) {
     388            if(this.server4 == null) /* both failed */
     389                throw e;
     390        }
     391
     392        if (Main.isTraceEnabled()) {
     393            if(server4 instanceof SSLServerSocket) {
     394                SSLServerSocket sslServer = (SSLServerSocket) server4;
     395                Main.trace("SSL server - Enabled Cipher suites: "+Arrays.toString(sslServer.getEnabledCipherSuites()));
     396                Main.trace("SSL server - Enabled Protocols: "+Arrays.toString(sslServer.getEnabledProtocols()));
     397                Main.trace("SSL server - Enable Session Creation: "+sslServer.getEnableSessionCreation());
     398                Main.trace("SSL server - Need Client Auth: "+sslServer.getNeedClientAuth());
     399                Main.trace("SSL server - Want Client Auth: "+sslServer.getWantClientAuth());
     400                Main.trace("SSL server - Use Client Mode: "+sslServer.getUseClientMode());
     401            }
     402            if(server6 instanceof SSLServerSocket) {
     403                SSLServerSocket sslServer = (SSLServerSocket) server6;
     404                Main.trace("SSL server - Enabled Cipher suites: "+Arrays.toString(sslServer.getEnabledCipherSuites()));
     405                Main.trace("SSL server - Enabled Protocols: "+Arrays.toString(sslServer.getEnabledProtocols()));
     406                Main.trace("SSL server - Enable Session Creation: "+sslServer.getEnableSessionCreation());
     407                Main.trace("SSL server - Need Client Auth: "+sslServer.getNeedClientAuth());
     408                Main.trace("SSL server - Want Client Auth: "+sslServer.getWantClientAuth());
     409                Main.trace("SSL server - Use Client Mode: "+sslServer.getUseClientMode());
     410            }
    392411        }
    393412    }
     
    398417    @Override
    399418    public void run() {
    400         Main.info(marktr("RemoteControl::Accepting secure connections on {0}:{1}"),
    401                 server.getInetAddress(), Integer.toString(server.getLocalPort()));
     419        if(server4 != null) {
     420            Main.info(marktr("RemoteControl::Accepting secure IPv4 connections on {0}:{1}"),
     421                server4.getInetAddress(), Integer.toString(server4.getLocalPort()));
     422        }
     423        if(server6 != null) {
     424            Main.info(marktr("RemoteControl::Accepting secure IPv6 connections on {0}:{1}"),
     425                server6.getInetAddress(), Integer.toString(server6.getLocalPort()));
     426        }
    402427        while (true) {
    403             try {
    404                 @SuppressWarnings("resource")
    405                 Socket request = server.accept();
    406                 if (Main.isTraceEnabled() && request instanceof SSLSocket) {
    407                     SSLSocket sslSocket = (SSLSocket) request;
    408                     Main.trace("SSL socket - Enabled Cipher suites: "+Arrays.toString(sslSocket.getEnabledCipherSuites()));
    409                     Main.trace("SSL socket - Enabled Protocols: "+Arrays.toString(sslSocket.getEnabledProtocols()));
    410                     Main.trace("SSL socket - Enable Session Creation: "+sslSocket.getEnableSessionCreation());
    411                     Main.trace("SSL socket - Need Client Auth: "+sslSocket.getNeedClientAuth());
    412                     Main.trace("SSL socket - Want Client Auth: "+sslSocket.getWantClientAuth());
    413                     Main.trace("SSL socket - Use Client Mode: "+sslSocket.getUseClientMode());
    414                     Main.trace("SSL socket - Session: "+sslSocket.getSession());
    415                 }
    416                 RequestProcessor.processRequest(request);
    417             } catch (SocketException se) {
    418                 if (!server.isClosed()) {
    419                     Main.error(se);
    420                 }
    421             } catch (IOException ioe) {
    422                 Main.error(ioe);
     428            if(server4 != null) {
     429                try {
     430                    @SuppressWarnings("resource")
     431                    Socket request = server4.accept();
     432                    if (Main.isTraceEnabled() && request instanceof SSLSocket) {
     433                        SSLSocket sslSocket = (SSLSocket) request;
     434                        Main.trace("SSL socket - Enabled Cipher suites: "+Arrays.toString(sslSocket.getEnabledCipherSuites()));
     435                        Main.trace("SSL socket - Enabled Protocols: "+Arrays.toString(sslSocket.getEnabledProtocols()));
     436                        Main.trace("SSL socket - Enable Session Creation: "+sslSocket.getEnableSessionCreation());
     437                        Main.trace("SSL socket - Need Client Auth: "+sslSocket.getNeedClientAuth());
     438                        Main.trace("SSL socket - Want Client Auth: "+sslSocket.getWantClientAuth());
     439                        Main.trace("SSL socket - Use Client Mode: "+sslSocket.getUseClientMode());
     440                        Main.trace("SSL socket - Session: "+sslSocket.getSession());
     441                    }
     442                    RequestProcessor.processRequest(request);
     443                } catch (SocketException se) {
     444                    if (!server4.isClosed()) {
     445                        Main.error(se);
     446                    }
     447                } catch (IOException ioe) {
     448                    Main.error(ioe);
     449                }
     450            }
     451            if(server6 != null) {
     452                try {
     453                    @SuppressWarnings("resource")
     454                    Socket request = server6.accept();
     455                    if (Main.isTraceEnabled() && request instanceof SSLSocket) {
     456                        SSLSocket sslSocket = (SSLSocket) request;
     457                        Main.trace("SSL socket - Enabled Cipher suites: "+Arrays.toString(sslSocket.getEnabledCipherSuites()));
     458                        Main.trace("SSL socket - Enabled Protocols: "+Arrays.toString(sslSocket.getEnabledProtocols()));
     459                        Main.trace("SSL socket - Enable Session Creation: "+sslSocket.getEnableSessionCreation());
     460                        Main.trace("SSL socket - Need Client Auth: "+sslSocket.getNeedClientAuth());
     461                        Main.trace("SSL socket - Want Client Auth: "+sslSocket.getWantClientAuth());
     462                        Main.trace("SSL socket - Use Client Mode: "+sslSocket.getUseClientMode());
     463                        Main.trace("SSL socket - Session: "+sslSocket.getSession());
     464                    }
     465                    RequestProcessor.processRequest(request);
     466                } catch (SocketException se) {
     467                    if (!server6.isClosed()) {
     468                        Main.error(se);
     469                    }
     470                } catch (IOException ioe) {
     471                    Main.error(ioe);
     472                }
    423473            }
    424474        }
     
    431481     */
    432482    public void stopServer() throws IOException {
    433         if (server != null) {
    434             server.close();
    435             Main.info(marktr("RemoteControl::Server (https) stopped."));
    436         }
     483        if(server4 != null)
     484            server4.close();
     485        if(server6 != null)
     486            server6.close();
     487        if(server6 != null || server4 != null)
     488        Main.info(marktr("RemoteControl::Server (IPv6 https) stopped."));
    437489    }
    438490}
Note: See TracChangeset for help on using the changeset viewer.