Scanner serverdata now tries to get a non-localhost IPV4 address if possible
							parent
							
								
									6b47387920
								
							
						
					
					
						commit
						291f7d93c0
					
				|  | @ -13,8 +13,8 @@ apply plugin: 'maven-publish' | |||
| // Uncomment the lines below to define an application | ||||
| // (this will also allow you to build a "fatCapsule" which includes | ||||
| // the entire application, including all dependencies in a single jar) | ||||
| //apply plugin: 'application' | ||||
| //mainClassName='your.main.ApplicationClass' | ||||
| apply plugin: 'application' | ||||
| mainClassName='meerkat.pollingstation.PollingStationToyRun' | ||||
| 
 | ||||
| 
 | ||||
| // Is this a snapshot version? | ||||
|  | @ -32,7 +32,7 @@ ext { | |||
| description = "Meerkat polling-station application" | ||||
| 
 | ||||
| // Your project version | ||||
| version = "0.0" | ||||
| version = "0.1" | ||||
| 
 | ||||
| version += "${isSnapshot ? '-SNAPSHOT' : ''}" | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ public class PollingStationToyRun { | |||
|         scanner = new PollingStationWebScanner(0, CONTEXT_PATH); | ||||
|         PollingStation.ConnectionServerData serverData = scanner.start(true); | ||||
| 
 | ||||
|         logger.info("Started polling station web scanner on {}", serverData.getServerUrl()); | ||||
|         PollingStationMainController controller = new PollingStationMainController(); | ||||
|         controller.init(scanner); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,9 +1,13 @@ | |||
| package meerkat.pollingstation; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.net.*; | ||||
| import java.nio.channels.ServerSocketChannel; | ||||
| import java.security.InvalidKeyException; | ||||
| import java.security.SecureRandom; | ||||
| import java.security.SignatureException; | ||||
| import java.security.cert.CertificateException; | ||||
| import java.util.Enumeration; | ||||
| import java.util.List; | ||||
| import java.util.LinkedList; | ||||
| 
 | ||||
|  | @ -13,6 +17,7 @@ import meerkat.crypto.DigitalSignature; | |||
| import meerkat.crypto.concrete.ECDSASignature; | ||||
| import meerkat.protobuf.Crypto; | ||||
| import meerkat.protobuf.PollingStation; | ||||
| import org.eclipse.jetty.server.Connector; | ||||
| import org.eclipse.jetty.server.Server; | ||||
| import org.eclipse.jetty.servlet.*; | ||||
| 
 | ||||
|  | @ -38,6 +43,12 @@ public class PollingStationWebScanner implements PollingStationScanner.PollingSt | |||
|      */ | ||||
|     long expectedSerial; | ||||
| 
 | ||||
|     /** | ||||
|      * Context path for servlet | ||||
|      */ | ||||
| 
 | ||||
|     String contextPath; | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Should a newly-connected scanner be verified using the nonce? | ||||
|  | @ -108,6 +119,7 @@ public class PollingStationWebScanner implements PollingStationScanner.PollingSt | |||
|                 return false; | ||||
|             } | ||||
| 
 | ||||
|             expectedSerial = 0; | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|  | @ -116,7 +128,7 @@ public class PollingStationWebScanner implements PollingStationScanner.PollingSt | |||
|             if (verifySignatures) { | ||||
|                 ByteString scannerID = scannedData.getScannerId(); | ||||
|                 if (!scannerID.equals(connectedScannerID)) { | ||||
|                     logger.warn("Scanner ID doesn't match connection public key"); | ||||
|                     logger.error("Scanner ID doesn't match connection public key"); | ||||
|                     return false; | ||||
|                 } | ||||
| 
 | ||||
|  | @ -124,22 +136,28 @@ public class PollingStationWebScanner implements PollingStationScanner.PollingSt | |||
|                     verifier.initVerify(data.getScannerSig()); | ||||
|                     verifier.updateContent(scannedData); | ||||
|                     if (!verifier.verify()) { | ||||
|                         logger.warn("Bad Signature"); | ||||
|                         logger.error("Bad Signature"); | ||||
|                         return false; | ||||
|                     } | ||||
| 
 | ||||
|                 } catch (CertificateException e) { | ||||
|                     logger.warn("Certificate Exception: {}", e); | ||||
|                     logger.error("Certificate Exception: {}", e); | ||||
|                     return false; | ||||
|                 } catch (InvalidKeyException e) { | ||||
|                     logger.warn("InvalidKey Exception: {}", e); | ||||
|                     logger.error("InvalidKey Exception: {}", e); | ||||
|                     return false; | ||||
|                 } catch (SignatureException e) { | ||||
|                     logger.warn("Signature Exception: {}", e); | ||||
|                     logger.error("Signature Exception: {}", e); | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (scannedData.getSerial() != expectedSerial) { | ||||
|                 logger.warn("Got scan with serial {}, expecting {}", scannedData.getSerial(), expectedSerial); | ||||
|             } | ||||
| 
 | ||||
|             expectedSerial = scannedData.getSerial() + 1; | ||||
| 
 | ||||
|             for (FutureCallback<ScannedData> callback : callbacks) { | ||||
|                 callback.onSuccess(scannedData); | ||||
|             } | ||||
|  | @ -153,7 +171,7 @@ public class PollingStationWebScanner implements PollingStationScanner.PollingSt | |||
| 
 | ||||
| 
 | ||||
|     public PollingStationWebScanner(int port, String contextPath) { | ||||
| 
 | ||||
|         this.contextPath = contextPath; | ||||
|         scanRequestHandler = new ScanRequestHandler(); | ||||
|         callbacks = new LinkedList<>(); | ||||
|         verifier = new ECDSASignature(); | ||||
|  | @ -173,15 +191,64 @@ public class PollingStationWebScanner implements PollingStationScanner.PollingSt | |||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     String getServerURL(Server server) { | ||||
| 
 | ||||
|         String serverURL = server.getURI().toASCIIString(); | ||||
| 
 | ||||
|         try { | ||||
| 
 | ||||
|             Connector connector = server.getConnectors()[0]; | ||||
| 
 | ||||
|             Object transport = connector.getTransport(); | ||||
| 
 | ||||
|             if (transport instanceof ServerSocketChannel) { | ||||
|                 // We can get better info about the local endpoint
 | ||||
|                 ServerSocketChannel sock = (ServerSocketChannel) transport; | ||||
|                 SocketAddress localAddr = null; | ||||
|                 localAddr = sock.getLocalAddress(); | ||||
|                 if (localAddr instanceof InetSocketAddress) { | ||||
|                     InetSocketAddress localInet = (InetSocketAddress) localAddr; | ||||
|                     InetAddress hostAddr = localInet.getAddress(); | ||||
|                     if (hostAddr.isAnyLocalAddress()) { | ||||
|                         Enumeration<NetworkInterface> n = null; | ||||
|                         n = NetworkInterface.getNetworkInterfaces(); | ||||
|                         while (n.hasMoreElements()) { | ||||
|                             NetworkInterface e = n.nextElement(); | ||||
|                             if (e.isLoopback() || e.isPointToPoint() || !e.isUp()) | ||||
|                                 continue; | ||||
| 
 | ||||
|                             Enumeration<InetAddress> aList = e.getInetAddresses(); | ||||
|                             while (aList.hasMoreElements()) { | ||||
|                                 InetAddress a = aList.nextElement(); | ||||
|                                 if (a instanceof Inet4Address) { | ||||
|                                     serverURL =  "http://" + a.getHostAddress() + ":" + localInet.getPort() | ||||
|                                             + contextPath; | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         } catch (SocketException e) { | ||||
|             // Ignore
 | ||||
|         } catch (IOException e) { | ||||
|             // Ignore
 | ||||
|         } | ||||
| 
 | ||||
|         return serverURL; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public PollingStation.ConnectionServerData start(boolean verifyScanner) throws Exception { | ||||
|         this.verifyNonce = this.verifySignatures = verifyScanner; | ||||
|         nonce = new SecureRandom().nextLong(); | ||||
| 
 | ||||
|         server.start(); | ||||
| 
 | ||||
|         return PollingStation.ConnectionServerData.newBuilder() | ||||
|                 .setNonce(nonce) | ||||
|                 .setServerUrl(server.getURI().toString()) | ||||
|                 .setServerUrl(getServerURL(server)) | ||||
|                 .build(); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue