public ALPNProvider getProvider(SSLEngine engine) { for (ALPNProvider provider : alpnProviders) { if (provider.isEnabled(engine)) { return provider; } } return null; }
public void registerEngineCallback(SSLEngine original, Function<SSLEngine, SSLEngine> selectionFunction) { for(ALPNEngineManager manager : alpnEngineManagers) { if(manager.registerEngine(original, selectionFunction)) { return; } } }
@Override public SSLEngine setProtocols(SSLEngine engine, String[] protocols) { return Impl.setProtocols(engine, protocols); }
final ALPNProvider provider = alpnManager.getProvider(engine); if (provider == null) { if (!providerLogged) { final SSLEngine newEngine = provider.setProtocols(engine, protocols); ALPNLimitingSSLEngine alpnLimitingSSLEngine = new ALPNLimitingSSLEngine(newEngine, new Runnable() { @Override
@Override public SSLEngine setProtocols(SSLEngine engine, String[] protocols) { try { getOpenSSLAlpnMethods().setApplicationProtocols().invoke(engine, (Object) protocols); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } return engine; }
@Override public String getSelectedProtocol(SSLEngine engine) { try { return (String) getOpenSSLAlpnMethods().getApplicationProtocol().invoke(engine); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } }
@Override public void handleEvent(StreamSourceChannel channel) { String selectedProtocol = provider.getSelectedProtocol(sslEngine); if (selectedProtocol != null) { handleSelected(selectedProtocol); failedListener.failed(new ClosedChannelException()); selectedProtocol = provider.getSelectedProtocol(sslEngine); if (selectedProtocol != null) { handleSelected(selectedProtocol);
@Override public int compare(ALPNEngineManager o1, ALPNEngineManager o2) { return Integer.compare(o2.getPriority(), o1.getPriority()); //highest first } });
@Override public int compare(ALPNProvider o1, ALPNProvider o2) { return Integer.compare(o2.getPriority(), o1.getPriority()); //highest first } });
@Override public String getSelectedProtocol(SSLEngine engine) { try { return (String) JDK_9_ALPN_METHODS.getApplicationProtocol().invoke(engine); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } }
@Override public boolean isEnabled(SSLEngine sslEngine) { return sslEngine.getClass().getName().equals(OPENSSL_ENGINE) && getOpenSSLAlpnMethods() != null; }
@Override public OpenSSLALPNMethods run() { try { Class<?> openSSLEngine = Class.forName(OPENSSL_ENGINE, true, OpenSSLAlpnProvider.class.getClassLoader()); Method setApplicationProtocols = openSSLEngine.getMethod("setApplicationProtocols", String[].class); Method getApplicationProtocol = openSSLEngine.getMethod("getSelectedApplicationProtocol"); UndertowLogger.ROOT_LOGGER.debug("OpenSSL ALPN Enabled"); return new OpenSSLALPNMethods(setApplicationProtocols, getApplicationProtocol); } catch (Throwable e) { UndertowLogger.ROOT_LOGGER.debug("OpenSSL ALPN disabled", e); return null; } } });
@Override public JDK9ALPNMethods run() { try { Method setApplicationProtocols = SSLParameters.class.getMethod("setApplicationProtocols", String[].class); Method getApplicationProtocol = SSLEngine.class.getMethod("getApplicationProtocol"); UndertowLogger.ROOT_LOGGER.debug("Using JDK9 ALPN"); return new JDK9ALPNMethods(setApplicationProtocols, getApplicationProtocol); } catch (Exception e) { UndertowLogger.ROOT_LOGGER.debug("JDK9 ALPN not supported"); return null; } } });
@Override public SSLEngine setProtocols(SSLEngine engine, String[] protocols) { SSLParameters sslParameters = engine.getSSLParameters(); try { JDK_9_ALPN_METHODS.setApplicationProtocols().invoke(sslParameters, (Object) protocols); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } engine.setSSLParameters(sslParameters); return engine; }
static SSLEngine setProtocols(final SSLEngine engine, final String[] protocols) { if (engine.getUseClientMode()) { ALPN.put(engine, new ALPNClientSelectionProvider(Arrays.asList(protocols), engine)); } else { ALPN.put(engine, new ALPN.ServerProvider() { @Override public void unsupported() { ALPN.remove(engine); } @Override public String select(List<String> strings) { ALPN.remove(engine); for (String p : protocols) { if (strings.contains(p)) { engine.getHandshakeSession().putValue(PROTOCOL_KEY, p); return p; } } return null; } }); } return engine; } }
alpnManager.registerEngineCallback(originalSSlEngine, new SSLConduitUpdater(sslConduit, new Function<SSLEngine, SSLEngine>() { @Override public SSLEngine apply(SSLEngine engine) {
public static void runAlpn(final SslConnection sslConnection, final ChannelListener<SslConnection> fallback, final ClientCallback<ClientConnection> failedListener, final ALPNProtocol... details) { SslConduit conduit = UndertowXnioSsl.getSslConduit(sslConnection); final ALPNProvider provider = ALPNManager.INSTANCE.getProvider(conduit.getSSLEngine()); if (provider == null) { fallback.handleEvent(sslConnection); protocolMap.put(details[i].getProtocol(), details[i]); final SSLEngine sslEngine = provider.setProtocols(conduit.getSSLEngine(), protocols); conduit.setSslEngine(sslEngine); final AtomicReference<Boolean> handshakeDone = new AtomicReference<>(false);
public ALPNProvider getProvider(SSLEngine engine) { for (ALPNProvider provider : alpnProviders) { if (provider.isEnabled(engine)) { return provider; } } return null; }
public void registerEngineCallback(SSLEngine original, Function<SSLEngine, SSLEngine> selectionFunction) { for(ALPNEngineManager manager : alpnEngineManagers) { if(manager.registerEngine(original, selectionFunction)) { return; } } }
final String selected; if (selectedAlpn != null) { selected = selectedAlpn.provider.getSelectedProtocol(selectedAlpn.engine); } else { selected = null;