diff options
Diffstat (limited to 'platform/util-rt/src/com/intellij/execution/rmi/RemoteServer.java')
-rw-r--r-- | platform/util-rt/src/com/intellij/execution/rmi/RemoteServer.java | 66 |
1 files changed, 63 insertions, 3 deletions
diff --git a/platform/util-rt/src/com/intellij/execution/rmi/RemoteServer.java b/platform/util-rt/src/com/intellij/execution/rmi/RemoteServer.java index 46e7b25a6be8..908f40a37295 100644 --- a/platform/util-rt/src/com/intellij/execution/rmi/RemoteServer.java +++ b/platform/util-rt/src/com/intellij/execution/rmi/RemoteServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,15 @@ package com.intellij.execution.rmi; import com.intellij.execution.rmi.ssl.SslSocketFactory; +import com.intellij.openapi.util.io.FileUtilRt; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.spi.InitialContextFactory; +import java.io.*; +import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; @@ -39,6 +43,8 @@ public class RemoteServer { System.setProperty("apple.awt.UIElement", "true"); } + public static final String DOMAIN_AUTH_LIBRARY_PATH = "domain.auth.library"; + private static Remote ourRemote; @SuppressWarnings("UseOfSystemOutOrSystemErr") @@ -46,6 +52,7 @@ public class RemoteServer { setupRMI(); banJNDI(); setupSSL(); + setupDomainAuth(); if (ourRemote != null) throw new AssertionError("Already started"); ourRemote = remote; @@ -104,7 +111,7 @@ public class RemoteServer { } } - public static void setupSSL() { + private static void setupSSL() { boolean caCert = System.getProperty(SslSocketFactory.SSL_CA_CERT_PATH) != null; boolean clientCert = System.getProperty(SslSocketFactory.SSL_CLIENT_CERT_PATH) != null; boolean clientKey = System.getProperty(SslSocketFactory.SSL_CLIENT_KEY_PATH) != null; @@ -113,18 +120,71 @@ public class RemoteServer { } } + private static void setupDomainAuth() { + String property = System.getProperty(DOMAIN_AUTH_LIBRARY_PATH); + if (property != null) { + try { + File extracted = extractLibraryFromJar(property); + setLibraryPath(extracted.getParentFile().getAbsolutePath()); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + } + @SuppressWarnings("UnusedDeclaration") public static class Jndi implements InitialContextFactory, InvocationHandler { + @NotNull public Context getInitialContext(final Hashtable<?, ?> environment) throws NamingException { return (Context)Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{Context.class}, this); } @Nullable - public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + public Object invoke(final Object proxy, @NotNull final Method method, final Object[] args) throws Throwable { if (Object.class.equals(method.getDeclaringClass())) { return method.invoke(this, args); } throw new NamingException("JNDI service is disabled"); } } + + @NotNull + public static File extractLibraryFromJar(@NotNull String path) throws Exception { + if (!path.startsWith("/")) throw new IllegalArgumentException("The path to be absolute (start with '/')."); + + String[] parts = path.split("/"); + String filename = parts.length > 1 ? parts[parts.length - 1] : null; + + if (filename == null) throw new IllegalArgumentException("The filename extracted from the path: '" + path + "' is null"); + + File auth = FileUtilRt.createTempDirectory("win_auth", null, true); + File temp = new File(auth, filename); + temp.deleteOnExit(); + if (!temp.createNewFile() || !temp.exists()) throw new FileNotFoundException("File " + temp.getAbsolutePath() + " does not exist."); + + byte[] buffer = new byte[5 * 1024]; + int readBytes; + + //noinspection IOResourceOpenedButNotSafelyClosed + InputStream is = RemoteServer.class.getResourceAsStream(path); + if (is == null) throw new FileNotFoundException("File " + path + " was not found inside JAR."); + + OutputStream os = new FileOutputStream(temp); + try { + while ((readBytes = is.read(buffer)) != -1) os.write(buffer, 0, readBytes); + } + finally { + os.close(); + is.close(); + } + return temp; + } + + private static void setLibraryPath(@NotNull String path) throws NoSuchFieldException, IllegalAccessException { + System.setProperty("java.library.path", path); + Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); + fieldSysPath.setAccessible(true); + fieldSysPath.set(null, null); + } } |