summaryrefslogtreecommitdiff
path: root/platform/util-rt/src/com/intellij/execution/rmi/RemoteServer.java
diff options
context:
space:
mode:
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.java66
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);
+ }
}