-// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL]
+// Copyright 2000-2005 the Contributors, as shown in the revision logs.
+// Licensed under the Apache Public Source License 2.0 ("the License").
+// You may not use this file except in compliance with the License.
+
package org.ibex.net;
import java.net.*;
private Hash h = new Hash();
public String getCookieHeader(String domain, String path, boolean secure) {
StringBuffer ret = new StringBuffer("Cookie: ");
- Enumeration e = h.keys();
+ Enumeration e = h.enumerateKeys();
while (e.hasMoreElements()) {
Vec v = (Vec)h.get(e.nextElement());
Cookie cookie = null;
value = end;
continue;
}
- //#switch(start.toLowerCase())
- case "domain": domain = end;
- case "path": path = end;
- case "expires": expires = new Date(end);
- //#end
+ if (start.toLowerCase().equals("domain")) domain = end;
+ else if (start.toLowerCase().equals("path")) path = end;
+ else if (start.toLowerCase().equals("expires")) expires = new Date(end);
}
if (h.get(name) == null) h.put(name, new Vec());
((Vec)h.get(name)).addElement(new Cookie(name, value, domain, path, expires, secure));
// Public Methods ////////////////////////////////////////////////////////////////////////////////////////
public HTTP(String url) { this(url, false); }
- public HTTP(String url, boolean skipResolveCheck) { originalUrl = url; this.skipResolveCheck = skipResolveCheck; }
+ public HTTP(String url, boolean skipResolveCheck) { this(url, skipResolveCheck, null); }
+ public HTTP(String url, Proxy p) { this(url, false, p); }
+ public HTTP(String url, boolean skipResolveCheck, Proxy p) { originalUrl = url; this.skipResolveCheck = skipResolveCheck; proxy = p; }
/** Performs an HTTP GET request */
public InputStream GET(String referer, Cookie.Jar cookies) throws IOException {
boolean firstRequest = true; ///< true iff this is the first request to be made on this socket
boolean skipResolveCheck = false; ///< allowed to skip the resolve check when downloading PAC script
boolean proxied = false; ///< true iff we're using a proxy
+ Proxy proxy;
/** this is null if the current request is the first request on
* this HTTP connection; otherwise it is a Semaphore which will be
} catch (UnknownHostException uhe) { }
/*
- if (Platform.detectProxy() == null)
- throw new HTTPException("could not resolve hostname \"" + host + "\" and no proxy configured");
+ if (Platform.detectProxy() == null)
+ throw new HTTPException("could not resolve hostname \"" + host + "\" and no proxy configured");
*/
}
}
/** Attempts a direct connection */
- private Socket attemptDirect() {
+ Socket attemptDirect() {
try {
Log.info(this, "attempting to create unproxied socket to " +
host + ":" + port + (ssl ? " [ssl]" : ""));
}
}
- /** Attempts to use an HTTP proxy, employing the CONNECT method if HTTPS is requested */
- private Socket attemptHttpProxy(String proxyHost, int proxyPort) {
- try {
- if (Log.verbose) Log.info(this, "attempting to create HTTP proxied socket using proxy " + proxyHost + ":" + proxyPort);
- Socket sock = getSocket(proxyHost, proxyPort, ssl, false);
-
- if (!ssl) {
- if (!path.startsWith("http://")) path = "http://" + host + ":" + port + path;
- return sock;
- }
-
- PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
- BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
- pw.print("CONNECT " + host + ":" + port + " HTTP/1.1\r\n\r\n");
- pw.flush();
- String s = br.readLine();
- if (s.charAt(9) != '2') throw new HTTPException("proxy refused CONNECT method: \"" + s + "\"");
- while (br.readLine().length() > 0) { };
- ((SSL)sock).negotiate();
- return sock;
-
- } catch (IOException e) {
- if (Log.on) Log.info(this, "exception in attemptHttpProxy(): " + e);
- return null;
- }
- }
-
- /**
- * Implements SOCKSv4 with v4a DNS extension
- * @see http://www.socks.nec.com/protocol/socks4.protocol
- * @see http://www.socks.nec.com/protocol/socks4a.protocol
- */
- private Socket attemptSocksProxy(String proxyHost, int proxyPort) {
-
- // even if host is already a "x.y.z.w" string, we use this to parse it into bytes
- InetAddress addr = null;
- try { addr = InetAddress.getByName(host); } catch (Exception e) { }
-
- if (Log.verbose) Log.info(this, "attempting to create SOCKSv4" + (addr == null ? "" : "a") +
- " proxied socket using proxy " + proxyHost + ":" + proxyPort);
-
- try {
- Socket sock = getSocket(proxyHost, proxyPort, ssl, false);
-
- DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
- dos.writeByte(0x04); // SOCKSv4(a)
- dos.writeByte(0x01); // CONNECT
- dos.writeShort(port & 0xffff); // port
- if (addr == null) dos.writeInt(0x00000001); // bogus IP
- else dos.write(addr.getAddress()); // actual IP
- dos.writeByte(0x00); // no userid
- if (addr == null) {
- PrintWriter pw = new PrintWriter(new OutputStreamWriter(dos));
- pw.print(host);
- pw.flush();
- dos.writeByte(0x00); // hostname null terminator
- }
- dos.flush();
-
- DataInputStream dis = new DataInputStream(sock.getInputStream());
- dis.readByte(); // reply version
- byte success = dis.readByte(); // success/fail
- dis.skip(6); // ip/port
-
- if ((int)(success & 0xff) == 90) {
- if (ssl) ((SSL)sock).negotiate();
- return sock;
- }
- if (Log.on) Log.info(this, "SOCKS server denied access, code " + (success & 0xff));
- return null;
-
- } catch (IOException e) {
- if (Log.on) Log.info(this, "exception in attemptSocksProxy(): " + e);
- return null;
- }
- }
-
- /** executes the PAC script and dispatches a call to one of the other attempt methods based on the result */
- /*
- private Socket attemptPAC(org.ibex.js.JS pacFunc) {
- if (Log.verbose) Log.info(this, "evaluating PAC script");
- String pac = null;
- try {
- Object obj = pacFunc.call(url, host, null, null, 2);
- if (Log.verbose) Log.info(this, " PAC script returned \"" + obj + "\"");
- pac = obj.toString();
- } catch (Throwable e) {
- if (Log.on) Log.info(this, "PAC script threw exception " + e);
- return null;
- }
-
- StringTokenizer st = new StringTokenizer(pac, ";", false);
- while (st.hasMoreTokens()) {
- String token = st.nextToken().trim();
- if (Log.verbose) Log.info(this, " trying \"" + token + "\"...");
- try {
- Socket ret = null;
- if (token.startsWith("DIRECT"))
- ret = attemptDirect();
- else if (token.startsWith("PROXY"))
- ret = attemptHttpProxy(token.substring(token.indexOf(' ') + 1, token.indexOf(':')),
- Integer.parseInt(token.substring(token.indexOf(':') + 1)));
- else if (token.startsWith("SOCKS"))
- ret = attemptSocksProxy(token.substring(token.indexOf(' ') + 1, token.indexOf(':')),
- Integer.parseInt(token.substring(token.indexOf(':') + 1)));
- if (ret != null) return ret;
- } catch (Throwable e) {
- if (Log.on) Log.info(this, "attempt at \"" + token + "\" failed due to " + e + "; trying next token");
- }
- }
- if (Log.on) Log.info(this, "all PAC results exhausted");
- return null;
- }
- */
+
// Everything Else ////////////////////////////////////////////////////////////////////////////
host = temphost;
if (Log.verbose) Log.info(this, "creating HTTP object for connection to " + host + ":" + port);
- /*
- Proxy pi = Platform.detectProxy();
- OUTER: do {
- if (pi != null) {
- for(int i=0; i<pi.excluded.length; i++) if (host.equals(pi.excluded[i])) break OUTER;
- if (sock == null && pi.proxyAutoConfigFunction != null) sock = attemptPAC(pi.proxyAutoConfigFunction);
- if (sock == null && ssl && pi.httpsProxyHost != null) sock = attemptHttpProxy(pi.httpsProxyHost,pi.httpsProxyPort);
- if (sock == null && pi.httpProxyHost != null) sock = attemptHttpProxy(pi.httpProxyHost, pi.httpProxyPort);
- if (sock == null && pi.socksProxyHost != null) sock = attemptSocksProxy(pi.socksProxyHost, pi.socksProxyPort);
- }
- } while (false);
- */
- proxied = sock != null;
- if (sock == null) sock = attemptDirect();
+ proxied = proxy!=null;
+ if (proxied) sock = proxy.attempt(url, host, this);
+ if (sock==null) {
+ proxied = false;
+ sock = attemptDirect();
+ }
if (sock == null) throw new HTTPException("unable to contact host " + host);
if (in == null) in = new BufferedInputStream(sock.getInputStream());
}
if (h.get("AUTHTYPE").equals("Basic")) {
if (authCache.get(originalUrl) != null) throw new HTTPException("username/password rejected");
- authCache.put(originalUrl, "Basic " + new String(Base64.encode(userInfo.getBytes("UTF8"))));
+ authCache.put(originalUrl, "Basic " + new String(Encode.toBase64(userInfo.getBytes("UTF8"))));
} else if (h.get("AUTHTYPE").equals("Digest")) {
if (authCache.get(originalUrl) != null && !"true".equals(h.get("stale")))
if (style.equals("NTLM") && Proxy.Authorization.authorization2 == null) {
Log.info(this, "Proxy identified itself as NTLM, sending Type 1 packet");
- Proxy.Authorization.authorization2 = "NTLM " + Base64.encode(Proxy.NTLM.type1);
+ Proxy.Authorization.authorization2 = "NTLM " + Encode.toBase64(Proxy.NTLM.type1);
return;
}
/*
- if (!realm.equals("Digest") || Proxy.Authorization.authorization2 == null || !"true".equals(h.get("stale")))
- Proxy.Authorization.getPassword(realm, style, sock.getInetAddress().getHostAddress(),
- Proxy.Authorization.authorization);
+ if (!realm.equals("Digest") || Proxy.Authorization.authorization2 == null || !"true".equals(h.get("stale")))
+ Proxy.Authorization.getPassword(realm, style, sock.getInetAddress().getHostAddress(),
+ Proxy.Authorization.authorization);
*/
if (style.equals("Basic")) {
Proxy.Authorization.authorization2 =
- "Basic " + new String(Base64.encode(Proxy.Authorization.authorization.getBytes("UTF8")));
+ "Basic " + new String(Encode.toBase64(Proxy.Authorization.authorization.getBytes("UTF8")));
} else if (style.equals("Digest")) {
String A1 = Proxy.Authorization.authorization.substring(0, userInfo.indexOf(':')) + ":" + h.get("realm") + ":" +
} else if (style.equals("NTLM")) {
Log.info(this, "Proxy identified itself as NTLM, got Type 2 packet");
- byte[] type2 = Base64.decode(((String)h0.get("proxy-authenticate")).substring(5).trim());
+ byte[] type2 = Encode.fromBase64(((String)h0.get("proxy-authenticate")).substring(5).trim());
for(int i=0; i<type2.length; i += 4) {
String log = "";
if (i<type2.length) log += Integer.toString(type2[i] & 0xff, 16) + " ";
// FEATURE: need to keep the connection open between type1 and type3
// FEATURE: finish this
//byte[] type3 = Proxy.NTLM.getResponse(
- //Proxy.Authorization.authorization2 = "NTLM " + Base64.encode(type3));
+ //Proxy.Authorization.authorization2 = "NTLM " + Encode.toBase64(type3));
}
}
public int socksProxyPort = -1; ///< the SOCKS Proxy Port to use
public String[] excluded = new String[] { }; ///< hosts to be excluded from proxy use; wildcards permitted
- // ** temporarily disabled so HTTP does not depend on org.ibex.js **
- //public JS proxyAutoConfigFunction = null; ///< the PAC script
- public Object proxyAutoConfigFunction = null; ///< the PAC script
-
- public static Proxy detectProxyViaManual() {
+ public Socket attempt(String url, String host, HTTP http) {
+ for(int i=0; i<excluded.length; i++) if (http.host.equals(excluded[i])) return null;
+ if (http.ssl && httpsProxyHost != null) return attemptHttpProxy(http, httpsProxyHost, httpsProxyPort);
+ if (httpProxyHost != null) return attemptHttpProxy(http, httpProxyHost, httpProxyPort);
+ if (socksProxyHost != null) return attemptSocksProxy(http, socksProxyHost, socksProxyPort);
+ return null;
+ }
+
+ public Proxy detectProxyViaManual(String http_proxy,
+ String https_proxy,
+ String socks_proxy,
+ String noproxy) {
Proxy ret = new Proxy();
- /*
- ret.httpProxyHost = Platform.getEnv("http_proxy");
+ ret.httpProxyHost = http_proxy;
if (ret.httpProxyHost != null) {
if (ret.httpProxyHost.startsWith("http://")) ret.httpProxyHost = ret.httpProxyHost.substring(7);
if (ret.httpProxyHost.endsWith("/"))
}
}
- ret.httpsProxyHost = Platform.getEnv("https_proxy");
+ ret.httpsProxyHost = https_proxy;
if (ret.httpsProxyHost != null) {
if (ret.httpsProxyHost.startsWith("https://")) ret.httpsProxyHost = ret.httpsProxyHost.substring(7);
if (ret.httpsProxyHost.endsWith("/"))
}
}
- ret.socksProxyHost = Platform.getEnv("socks_proxy");
+ ret.socksProxyHost = socks_proxy;
if (ret.socksProxyHost != null) {
if (ret.socksProxyHost.startsWith("socks://")) ret.socksProxyHost = ret.socksProxyHost.substring(7);
if (ret.socksProxyHost.endsWith("/"))
}
}
- String noproxy = Platform.getEnv("no_proxy");
if (noproxy != null) {
StringTokenizer st = new StringTokenizer(noproxy, ",");
ret.excluded = new String[st.countTokens()];
}
if (ret.httpProxyHost == null && ret.socksProxyHost == null) return null;
- */
return ret;
}
- /*
- public static JSScope proxyAutoConfigRootScope = new ProxyAutoConfigRootScope();
- public static JS getProxyAutoConfigFunction(String url) {
- try {
- BufferedReader br = new BufferedReader(new InputStreamReader(new HTTP(url, true).GET()));
- String s = null;
- String script = "";
- while((s = br.readLine()) != null) script += s + "\n";
- if (Log.on) Log.info(Proxy.class, "successfully retrieved WPAD PAC:");
- if (Log.on) Log.info(Proxy.class, script);
+ // Attempts //////////////////////////////////////////////////////////////////////////////
+
+ protected Socket attemptDirect(HTTP http) { return http.attemptDirect(); }
+
+ /** Attempts to use an HTTP proxy, employing the CONNECT method if HTTPS is requested */
+ protected Socket attemptHttpProxy(HTTP http, String proxyHost, int proxyPort) {
+ try {
+ if (Log.verbose) Log.info(this, "attempting to create HTTP proxied socket using proxy " + proxyHost + ":" + proxyPort);
+ Socket sock = http.getSocket(proxyHost, proxyPort, http.ssl, false);
+
+ if (!http.ssl) {
+ if (!http.path.startsWith("http://")) http.path = "http://" + http.host + ":" + http.port + http.path;
+ return sock;
+ }
+
+ PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
+ BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
+ pw.print("CONNECT " + http.host + ":" + http.port + " HTTP/1.1\r\n\r\n");
+ pw.flush();
+ String s = br.readLine();
+ if (s.charAt(9) != '2') throw new HTTPException("proxy refused CONNECT method: \"" + s + "\"");
+ while (br.readLine().length() > 0) { };
+ ((SSL)sock).negotiate();
+ return sock;
+
+ } catch (IOException e) {
+ if (Log.on) Log.info(this, "exception in attemptHttpProxy(): " + e);
+ return null;
+ }
+ }
+
+ /**
+ * Implements SOCKSv4 with v4a DNS extension
+ * @see http://www.socks.nec.com/protocol/socks4.protocol
+ * @see http://www.socks.nec.com/protocol/socks4a.protocol
+ */
+ protected Socket attemptSocksProxy(HTTP http, String proxyHost, int proxyPort) {
+
+ // even if host is already a "x.y.z.w" string, we use this to parse it into bytes
+ InetAddress addr = null;
+ try { addr = InetAddress.getByName(http.host); } catch (Exception e) { }
+
+ if (Log.verbose) Log.info(this, "attempting to create SOCKSv4" + (addr == null ? "" : "a") +
+ " proxied socket using proxy " + proxyHost + ":" + proxyPort);
+
+ try {
+ Socket sock = http.getSocket(proxyHost, proxyPort, http.ssl, false);
- // MS CARP hack
- Vector carpHosts = new Vector();
- for(int i=0; i<script.length(); i++)
- if (script.regionMatches(i, "new Node(", 0, 9)) {
- String host = script.substring(i + 10, script.indexOf('\"', i + 11));
- if (Log.on) Log.info(Proxy.class, "Detected MS Proxy Server CARP Script, Host=" + host);
- carpHosts.addElement(host);
- }
- if (carpHosts.size() > 0) {
- script = "function FindProxyForURL(url, host) {\nreturn \"";
- for(int i=0; i<carpHosts.size(); i++)
- script += "PROXY " + carpHosts.elementAt(i) + "; ";
- script += "\";\n}";
- if (Log.on) Log.info(Proxy.class, "DeCARPed PAC script:");
- if (Log.on) Log.info(Proxy.class, script);
+ DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
+ dos.writeByte(0x04); // SOCKSv4(a)
+ dos.writeByte(0x01); // CONNECT
+ dos.writeShort(http.port & 0xffff); // port
+ if (addr == null) dos.writeInt(0x00000001); // bogus IP
+ else dos.write(addr.getAddress()); // actual IP
+ dos.writeByte(0x00); // no userid
+ if (addr == null) {
+ PrintWriter pw = new PrintWriter(new OutputStreamWriter(dos));
+ pw.print(http.host);
+ pw.flush();
+ dos.writeByte(0x00); // hostname null terminator
}
+ dos.flush();
- JS scr = JS.fromReader("PAC script at " + url, 0, new StringReader(script));
- JS.cloneWithNewParentScope(scr, proxyAutoConfigRootScope).call(null, null, null, null, 0);
- return (JS)proxyAutoConfigRootScope.get("FindProxyForURL");
- } catch (Exception e) {
- if (Log.on) {
- Log.info(Platform.class, "WPAD detection failed due to:");
- if (e instanceof JSExn) {
- try {
- org.ibex.js.JSArray arr = new org.ibex.js.JSArray();
- arr.addElement(((JSExn)e).getObject());
- } catch (Exception e2) {
- Log.info(Platform.class, e);
- }
- }
- else Log.info(Platform.class, e);
+ DataInputStream dis = new DataInputStream(sock.getInputStream());
+ dis.readByte(); // reply version
+ byte success = dis.readByte(); // success/fail
+ dis.skip(6); // ip/port
+
+ if ((int)(success & 0xff) == 90) {
+ if (http.ssl) ((SSL)sock).negotiate();
+ return sock;
}
+ if (Log.on) Log.info(this, "SOCKS server denied access, code " + (success & 0xff));
+ return null;
+
+ } catch (IOException e) {
+ if (Log.on) Log.info(this, "exception in attemptSocksProxy(): " + e);
return null;
}
}
- */
// Authorization ///////////////////////////////////////////////////////////////////////////////////
// FIXME: temporarily disabled so we can use HTTP outside the core
/*
- public static synchronized void getPassword(final String realm, final String style,
- final String proxyIP, String oldAuth) throws IOException {
-
- // this handles cases where multiple threads hit the proxy auth at the same time -- all but one will block on the
- // synchronized keyword. If 'authorization' changed while the thread was blocked, it means that the user entered
- // a password, so we should reattempt authorization.
-
- if (authorization != oldAuth) return;
- if (Log.on) Log.info(Authorization.class, "displaying proxy authorization dialog");
- Scheduler.add(new Task() {
- public void perform() throws IOException, JSExn {
- Box b = new Box();
- Template t = null;
- // FIXME
- //Template.buildTemplate("org/ibex/builtin/proxy_authorization.ibex", Stream.getInputStream((JS)Main.builtin.get("org/ibex/builtin/proxy_authorization.ibex")), new Ibex(null));
- t.apply(b);
- b.put("realm", realm);
- b.put("proxyIP", proxyIP);
- }
- });
-
- waitingForUser.block();
- if (Log.on) Log.info(Authorization.class, "got proxy authorization info; re-attempting connection");
- }
+ public static synchronized void getPassword(final String realm, final String style,
+ final String proxyIP, String oldAuth) throws IOException {
+
+ // this handles cases where multiple threads hit the proxy auth at the same time -- all but one will block on the
+ // synchronized keyword. If 'authorization' changed while the thread was blocked, it means that the user entered
+ // a password, so we should reattempt authorization.
+
+ if (authorization != oldAuth) return;
+ if (Log.on) Log.info(Authorization.class, "displaying proxy authorization dialog");
+ Scheduler.add(new Task() {
+ public void perform() throws IOException, JSExn {
+ Box b = new Box();
+ Template t = null;
+ // FIXME
+ //Template.buildTemplate("org/ibex/builtin/proxy_authorization.ibex", Stream.getInputStream((JS)Main.builtin.get("org/ibex/builtin/proxy_authorization.ibex")), new Ibex(null));
+ t.apply(b);
+ b.put("realm", realm);
+ b.put("proxyIP", proxyIP);
+ }
+ });
+
+ waitingForUser.block();
+ if (Log.on) Log.info(Authorization.class, "got proxy authorization info; re-attempting connection");
+ }
*/
}
-
- // ProxyAutoConfigRootJSScope ////////////////////////////////////////////////////////////////////
- /*
- public static class ProxyAutoConfigRootScope extends JSScope.Global {
-
- public ProxyAutoConfigRootScope() { super(); }
-
- public Object get(Object name) throws JSExn {
- // #switch(name)
- case "isPlainHostName": return METHOD;
- case "dnsDomainIs": return METHOD;
- case "localHostOrDomainIs": return METHOD;
- case "isResolvable": return METHOD;
- case "isInNet": return METHOD;
- case "dnsResolve": return METHOD;
- case "myIpAddress": return METHOD;
- case "dnsDomainLevels": return METHOD;
- case "shExpMatch": return METHOD;
- case "weekdayRange": return METHOD;
- case "dateRange": return METHOD;
- case "timeRange": return METHOD;
- case "ProxyConfig": return ProxyConfig;
- // #end
- return super.get(name);
- }
-
- private static final JS proxyConfigBindings = new JS();
- private static final JS ProxyConfig = new JS() {
- public Object get(Object name) {
- if (name.equals("bindings")) return proxyConfigBindings;
- return null;
- }
- };
-
- public Object callMethod(Object method, Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn {
- // #switch(method)
- case "isPlainHostName": return (a0.toString().indexOf('.') == -1) ? Boolean.TRUE : Boolean.FALSE;
- case "dnsDomainIs": return (a0.toString().endsWith(a1.toString())) ? Boolean.TRUE : Boolean.FALSE;
- case "localHostOrDomainIs":
- return (a0.equals(a1) || (a0.toString().indexOf('.') == -1 && a1.toString().startsWith(a0.toString()))) ? T:F;
- case "isResolvable": try {
- return (InetAddress.getByName(a0.toString()) != null) ? Boolean.TRUE : Boolean.FALSE;
- } catch (UnknownHostException e) { return F; }
- case "isInNet":
- if (nargs != 3) return Boolean.FALSE;
- try {
- byte[] host = InetAddress.getByName(a0.toString()).getAddress();
- byte[] net = InetAddress.getByName(a1.toString()).getAddress();
- byte[] mask = InetAddress.getByName(a2.toString()).getAddress();
- return ((host[0] & mask[0]) == net[0] &&
- (host[1] & mask[1]) == net[1] &&
- (host[2] & mask[2]) == net[2] &&
- (host[3] & mask[3]) == net[3]) ?
- Boolean.TRUE : Boolean.FALSE;
- } catch (Exception e) {
- throw new JSExn("exception in isInNet(): " + e);
- }
- case "dnsResolve":
- try {
- return InetAddress.getByName(a0.toString()).getHostAddress();
- } catch (UnknownHostException e) {
- return null;
- }
- case "myIpAddress":
- try {
- return InetAddress.getLocalHost().getHostAddress();
- } catch (UnknownHostException e) {
- if (Log.on) Log.info(this, "strange... host does not know its own address");
- return null;
- }
- case "dnsDomainLevels":
- String s = a0.toString();
- int i = 0;
- while((i = s.indexOf('.', i)) != -1) i++;
- return new Integer(i);
- case "shExpMatch":
- StringTokenizer st = new StringTokenizer(a1.toString(), "*", false);
- String[] arr = new String[st.countTokens()];
- String s = a0.toString();
- for (int i=0; st.hasMoreTokens(); i++) arr[i] = st.nextToken();
- return match(arr, s, 0) ? Boolean.TRUE : Boolean.FALSE;
- case "weekdayRange":
- TimeZone tz = (nargs < 3 || a2 == null || !a2.equals("GMT")) ?
- TimeZone.getTimeZone("UTC") : TimeZone.getDefault();
- Calendar c = new GregorianCalendar();
- c.setTimeZone(tz);
- c.setTime(new java.util.Date());
- java.util.Date d = c.getTime();
- int day = d.getDay();
- String d1s = a0.toString().toUpperCase();
- int d1 = 0, d2 = 0;
- for(int i=0; i<days.length; i++) if (days[i].equals(d1s)) d1 = i;
-
- if (nargs == 1)
- return d1 == day ? Boolean.TRUE : Boolean.FALSE;
-
- String d2s = a1.toString().toUpperCase();
- for(int i=0; i<days.length; i++) if (days[i].equals(d2s)) d2 = i;
-
- return ((d1 <= d2 && day >= d1 && day <= d2) || (d1 > d2 && (day >= d1 || day <= d2))) ? T : F;
-
- case "dateRange": throw new JSExn("Ibex does not support dateRange() in PAC scripts");
- case "timeRange": throw new JSExn("Ibex does not support timeRange() in PAC scripts");
- // #end
- return super.callMethod(method, a0, a1, a2, rest, nargs);
- }
- private static boolean match(String[] arr, String s, int index) {
- if (index >= arr.length) return true;
- for(int i=0; i<s.length(); i++) {
- String s2 = s.substring(i);
- if (s2.startsWith(arr[index]) && match(arr, s2.substring(arr[index].length()), index + 1)) return true;
- }
- return false;
- }
- public static String[] days = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
- }
- */
-
/**
* An implementation of Microsoft's proprietary NTLM authentication protocol. This code was derived from Eric
* Glass's work, and is copyright as follows:
* @return The LM Response.
*/
public static byte[] getLMResponse(String password, byte[] challenge)
- {
+ {
byte[] lmHash = lmHash(password);
return lmResponse(lmHash, challenge);
}
*/
private static byte[] lmHash(String password) {
/*
- byte[] oemPassword = password.toUpperCase().getBytes("UTF8");
- int length = java.lang.Math.min(oemPassword.length, 14);
- byte[] keyBytes = new byte[14];
- System.arraycopy(oemPassword, 0, keyBytes, 0, length);
- Key lowKey = createDESKey(keyBytes, 0);
- Key highKey = createDESKey(keyBytes, 7);
- byte[] magicConstant = "KGS!@#$%".getBytes("UTF8");
- Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
- des.init(Cipher.ENCRYPT_MODE, lowKey);
- byte[] lowHash = des.doFinal(magicConstant);
- des.init(Cipher.ENCRYPT_MODE, highKey);
- byte[] highHash = des.doFinal(magicConstant);
- byte[] lmHash = new byte[16];
- System.arraycopy(lowHash, 0, lmHash, 0, 8);
- System.arraycopy(highHash, 0, lmHash, 8, 8);
- return lmHash;
+ byte[] oemPassword = password.toUpperCase().getBytes("UTF8");
+ int length = java.lang.Math.min(oemPassword.length, 14);
+ byte[] keyBytes = new byte[14];
+ System.arraycopy(oemPassword, 0, keyBytes, 0, length);
+ Key lowKey = createDESKey(keyBytes, 0);
+ Key highKey = createDESKey(keyBytes, 7);
+ byte[] magicConstant = "KGS!@#$%".getBytes("UTF8");
+ Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
+ des.init(Cipher.ENCRYPT_MODE, lowKey);
+ byte[] lowHash = des.doFinal(magicConstant);
+ des.init(Cipher.ENCRYPT_MODE, highKey);
+ byte[] highHash = des.doFinal(magicConstant);
+ byte[] lmHash = new byte[16];
+ System.arraycopy(lowHash, 0, lmHash, 0, 8);
+ System.arraycopy(highHash, 0, lmHash, 8, 8);
+ return lmHash;
*/
return null;
}
private static byte[] ntlmHash(String password) throws UnsupportedEncodingException {
// FIXME
/*
- byte[] unicodePassword = password.getBytes("UnicodeLittleUnmarked");
- MD4 md4 = new MD4();
- md4.update(unicodePassword, 0, unicodePassword.length);
- byte[] ret = new byte[md4.getDigestSize()];
- return ret;
+ byte[] unicodePassword = password.getBytes("UnicodeLittleUnmarked");
+ MD4 md4 = new MD4();
+ md4.update(unicodePassword, 0, unicodePassword.length);
+ byte[] ret = new byte[md4.getDigestSize()];
+ return ret;
*/
return null;
}
* hash).
*/
private static byte[] lmResponse(byte[] hash, byte[] challenge)
- {
+ {
/*
- byte[] keyBytes = new byte[21];
- System.arraycopy(hash, 0, keyBytes, 0, 16);
- Key lowKey = createDESKey(keyBytes, 0);
- Key middleKey = createDESKey(keyBytes, 7);
- Key highKey = createDESKey(keyBytes, 14);
- Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
- des.init(Cipher.ENCRYPT_MODE, lowKey);
- byte[] lowResponse = des.doFinal(challenge);
- des.init(Cipher.ENCRYPT_MODE, middleKey);
- byte[] middleResponse = des.doFinal(challenge);
- des.init(Cipher.ENCRYPT_MODE, highKey);
- byte[] highResponse = des.doFinal(challenge);
- byte[] lmResponse = new byte[24];
- System.arraycopy(lowResponse, 0, lmResponse, 0, 8);
- System.arraycopy(middleResponse, 0, lmResponse, 8, 8);
- System.arraycopy(highResponse, 0, lmResponse, 16, 8);
- return lmResponse;
+ byte[] keyBytes = new byte[21];
+ System.arraycopy(hash, 0, keyBytes, 0, 16);
+ Key lowKey = createDESKey(keyBytes, 0);
+ Key middleKey = createDESKey(keyBytes, 7);
+ Key highKey = createDESKey(keyBytes, 14);
+ Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
+ des.init(Cipher.ENCRYPT_MODE, lowKey);
+ byte[] lowResponse = des.doFinal(challenge);
+ des.init(Cipher.ENCRYPT_MODE, middleKey);
+ byte[] middleResponse = des.doFinal(challenge);
+ des.init(Cipher.ENCRYPT_MODE, highKey);
+ byte[] highResponse = des.doFinal(challenge);
+ byte[] lmResponse = new byte[24];
+ System.arraycopy(lowResponse, 0, lmResponse, 0, 8);
+ System.arraycopy(middleResponse, 0, lmResponse, 8, 8);
+ System.arraycopy(highResponse, 0, lmResponse, 16, 8);
+ return lmResponse;
*/
return null;
}
* @return A DES encryption key created from the key material
* starting at the specified offset in the given byte array.
*/
- /*
- private static Key createDESKey(byte[] bytes, int offset) {
- byte[] keyBytes = new byte[7];
- System.arraycopy(bytes, offset, keyBytes, 0, 7);
- byte[] material = new byte[8];
- material[0] = keyBytes[0];
- material[1] = (byte) (keyBytes[0] << 7 | (keyBytes[1] & 0xff) >>> 1);
- material[2] = (byte) (keyBytes[1] << 6 | (keyBytes[2] & 0xff) >>> 2);
- material[3] = (byte) (keyBytes[2] << 5 | (keyBytes[3] & 0xff) >>> 3);
- material[4] = (byte) (keyBytes[3] << 4 | (keyBytes[4] & 0xff) >>> 4);
- material[5] = (byte) (keyBytes[4] << 3 | (keyBytes[5] & 0xff) >>> 5);
- material[6] = (byte) (keyBytes[5] << 2 | (keyBytes[6] & 0xff) >>> 6);
- material[7] = (byte) (keyBytes[6] << 1);
- oddParity(material);
- return new SecretKeySpec(material, "DES");
- }
- */
+ /*
+ private static Key createDESKey(byte[] bytes, int offset) {
+ byte[] keyBytes = new byte[7];
+ System.arraycopy(bytes, offset, keyBytes, 0, 7);
+ byte[] material = new byte[8];
+ material[0] = keyBytes[0];
+ material[1] = (byte) (keyBytes[0] << 7 | (keyBytes[1] & 0xff) >>> 1);
+ material[2] = (byte) (keyBytes[1] << 6 | (keyBytes[2] & 0xff) >>> 2);
+ material[3] = (byte) (keyBytes[2] << 5 | (keyBytes[3] & 0xff) >>> 3);
+ material[4] = (byte) (keyBytes[3] << 4 | (keyBytes[4] & 0xff) >>> 4);
+ material[5] = (byte) (keyBytes[4] << 3 | (keyBytes[5] & 0xff) >>> 5);
+ material[6] = (byte) (keyBytes[5] << 2 | (keyBytes[6] & 0xff) >>> 6);
+ material[7] = (byte) (keyBytes[6] << 1);
+ oddParity(material);
+ return new SecretKeySpec(material, "DES");
+ }
+ */
/**
* Applies odd parity to the given byte array.