Merge pull request #537 from randomcommitter/cli_socks_support
Handling SOCKS in a separate class, added HTTP Proxy support, added proxy.http and proxy.socks config settings
This commit is contained in:
commit
db2091c1f0
@ -7,9 +7,7 @@ import java.io.BufferedReader;
|
|||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
|
|
||||||
import java.net.Authenticator;
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.PasswordAuthentication;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -29,6 +27,7 @@ import com.rarchives.ripme.ui.History;
|
|||||||
import com.rarchives.ripme.ui.HistoryEntry;
|
import com.rarchives.ripme.ui.HistoryEntry;
|
||||||
import com.rarchives.ripme.ui.MainWindow;
|
import com.rarchives.ripme.ui.MainWindow;
|
||||||
import com.rarchives.ripme.ui.UpdateUtils;
|
import com.rarchives.ripme.ui.UpdateUtils;
|
||||||
|
import com.rarchives.ripme.utils.Proxy;
|
||||||
import com.rarchives.ripme.utils.RipUtils;
|
import com.rarchives.ripme.utils.RipUtils;
|
||||||
import com.rarchives.ripme.utils.Utils;
|
import com.rarchives.ripme.utils.Utils;
|
||||||
|
|
||||||
@ -49,6 +48,12 @@ public class App {
|
|||||||
System.exit(0);
|
System.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Utils.getConfigString("proxy.http", null) != null) {
|
||||||
|
Proxy.setHTTPProxy(Utils.getConfigString("proxy.http", null));
|
||||||
|
} else if (Utils.getConfigString("proxy.socks", null) != null) {
|
||||||
|
Proxy.setSocks(Utils.getConfigString("proxy.socks", null));
|
||||||
|
}
|
||||||
|
|
||||||
if (GraphicsEnvironment.isHeadless() || args.length > 0) {
|
if (GraphicsEnvironment.isHeadless() || args.length > 0) {
|
||||||
handleArguments(args);
|
handleArguments(args);
|
||||||
} else {
|
} else {
|
||||||
@ -69,7 +74,7 @@ public class App {
|
|||||||
/**
|
/**
|
||||||
* Creates an abstract ripper and instructs it to rip.
|
* Creates an abstract ripper and instructs it to rip.
|
||||||
* @param url URL to be ripped
|
* @param url URL to be ripped
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
private static void rip(URL url) throws Exception {
|
private static void rip(URL url) throws Exception {
|
||||||
AbstractRipper ripper = AbstractRipper.getRipper(url);
|
AbstractRipper ripper = AbstractRipper.getRipper(url);
|
||||||
@ -96,29 +101,15 @@ public class App {
|
|||||||
if (cl.hasOption('w')) {
|
if (cl.hasOption('w')) {
|
||||||
Utils.setConfigBoolean("file.overwrite", true);
|
Utils.setConfigBoolean("file.overwrite", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cl.hasOption('s')) {
|
if (cl.hasOption('s')) {
|
||||||
String sservfull = cl.getOptionValue('s').trim();
|
String sservfull = cl.getOptionValue('s').trim();
|
||||||
if (sservfull.lastIndexOf("@") != -1) {
|
Proxy.setSocks(sservfull);
|
||||||
int sservli = sservfull.lastIndexOf("@");
|
}
|
||||||
String userpw = sservfull.substring(0, sservli);
|
|
||||||
String[] usersplit = userpw.split(":");
|
if (cl.hasOption('p')) {
|
||||||
String user = usersplit[0];
|
String proxyserverfull = cl.getOptionValue('p').trim();
|
||||||
String password = usersplit[1];
|
Proxy.setHTTPProxy(proxyserverfull);
|
||||||
Authenticator.setDefault(new Authenticator(){
|
|
||||||
protected PasswordAuthentication getPasswordAuthentication(){
|
|
||||||
PasswordAuthentication p = new PasswordAuthentication(user, password.toCharArray());
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
sservfull = sservfull.substring(sservli + 1);
|
|
||||||
}
|
|
||||||
String[] servsplit = sservfull.split(":");
|
|
||||||
if (servsplit.length == 2) {
|
|
||||||
System.setProperty("socksProxyPort", servsplit[1]);
|
|
||||||
}
|
|
||||||
System.setProperty("socksProxyHost", servsplit[0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cl.hasOption('t')) {
|
if (cl.hasOption('t')) {
|
||||||
@ -221,7 +212,7 @@ public class App {
|
|||||||
String url = cl.getOptionValue('u').trim();
|
String url = cl.getOptionValue('u').trim();
|
||||||
ripURL(url, cl.hasOption("n"));
|
ripURL(url, cl.hasOption("n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -269,7 +260,8 @@ public class App {
|
|||||||
opts.addOption("n", "no-prop-file", false, "Do not create properties file.");
|
opts.addOption("n", "no-prop-file", false, "Do not create properties file.");
|
||||||
opts.addOption("f", "urls-file", true, "Rip URLs from a file.");
|
opts.addOption("f", "urls-file", true, "Rip URLs from a file.");
|
||||||
opts.addOption("v", "version", false, "Show current version");
|
opts.addOption("v", "version", false, "Show current version");
|
||||||
opts.addOption("s", "socks-server", true, "Use socks server ([user:password]@host[:port]");
|
opts.addOption("s", "socks-server", true, "Use socks server ([user:password]@host[:port])");
|
||||||
|
opts.addOption("p", "proxy-server", true, "Use HTTP Proxy server ([user:password]@host[:port])");
|
||||||
return opts;
|
return opts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,7 +280,7 @@ public class App {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads history from history file into memory.
|
* Loads history from history file into memory.
|
||||||
*/
|
*/
|
||||||
|
99
src/main/java/com/rarchives/ripme/utils/Proxy.java
Normal file
99
src/main/java/com/rarchives/ripme/utils/Proxy.java
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
package com.rarchives.ripme.utils;
|
||||||
|
|
||||||
|
import java.net.Authenticator;
|
||||||
|
import java.net.PasswordAuthentication;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Proxy/Socks setter
|
||||||
|
*/
|
||||||
|
public class Proxy {
|
||||||
|
private Proxy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the proxy server settings from string, using the format
|
||||||
|
* [user:password]@host[:port].
|
||||||
|
*
|
||||||
|
* @param fullproxy the string to parse
|
||||||
|
* @return HashMap containing proxy server, port, user and password
|
||||||
|
*/
|
||||||
|
private static Map<String, String> parseServer(String fullproxy) {
|
||||||
|
Map<String, String> proxy = new HashMap<String, String>();
|
||||||
|
|
||||||
|
if (fullproxy.lastIndexOf("@") != -1) {
|
||||||
|
int sservli = fullproxy.lastIndexOf("@");
|
||||||
|
String userpw = fullproxy.substring(0, sservli);
|
||||||
|
String[] usersplit = userpw.split(":");
|
||||||
|
proxy.put("user", usersplit[0]);
|
||||||
|
proxy.put("password", usersplit[1]);
|
||||||
|
fullproxy = fullproxy.substring(sservli + 1);
|
||||||
|
}
|
||||||
|
String[] servsplit = fullproxy.split(":");
|
||||||
|
if (servsplit.length == 2) {
|
||||||
|
proxy.put("port", servsplit[1]);
|
||||||
|
}
|
||||||
|
proxy.put("server", servsplit[0]);
|
||||||
|
return proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a HTTP Proxy.
|
||||||
|
* WARNING: Authenticated HTTP Proxy won't work from jdk1.8.111 unless
|
||||||
|
* passing the flag -Djdk.http.auth.tunneling.disabledSchemes="" to java
|
||||||
|
* see https://stackoverflow.com/q/41505219
|
||||||
|
*
|
||||||
|
* @param fullproxy the proxy, using format [user:password]@host[:port]
|
||||||
|
*/
|
||||||
|
public static void setHTTPProxy(String fullproxy) {
|
||||||
|
Map<String, String> proxyServer = parseServer(fullproxy);
|
||||||
|
|
||||||
|
if (proxyServer.get("user") != null && proxyServer.get("password") != null) {
|
||||||
|
Authenticator.setDefault(new Authenticator(){
|
||||||
|
protected PasswordAuthentication getPasswordAuthentication(){
|
||||||
|
PasswordAuthentication p = new PasswordAuthentication(proxyServer.get("user"), proxyServer.get("password").toCharArray());
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
System.setProperty("http.proxyUser", proxyServer.get("user"));
|
||||||
|
System.setProperty("http.proxyPassword", proxyServer.get("password"));
|
||||||
|
System.setProperty("https.proxyUser", proxyServer.get("user"));
|
||||||
|
System.setProperty("https.proxyPassword", proxyServer.get("password"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (proxyServer.get("port") != null) {
|
||||||
|
System.setProperty("http.proxyPort", proxyServer.get("port"));
|
||||||
|
System.setProperty("https.proxyPort", proxyServer.get("port"));
|
||||||
|
}
|
||||||
|
|
||||||
|
System.setProperty("http.proxyHost", proxyServer.get("server"));
|
||||||
|
System.setProperty("https.proxyHost", proxyServer.get("server"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a Socks Proxy Server (globally).
|
||||||
|
*
|
||||||
|
* @param fullsocks the socks server, using format [user:password]@host[:port]
|
||||||
|
*/
|
||||||
|
public static void setSocks(String fullsocks) {
|
||||||
|
|
||||||
|
Map<String, String> socksServer = parseServer(fullsocks);
|
||||||
|
if (socksServer.get("user") != null && socksServer.get("password") != null) {
|
||||||
|
Authenticator.setDefault(new Authenticator(){
|
||||||
|
protected PasswordAuthentication getPasswordAuthentication(){
|
||||||
|
PasswordAuthentication p = new PasswordAuthentication(socksServer.get("user"), socksServer.get("password").toCharArray());
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
System.setProperty("java.net.socks.username", socksServer.get("user"));
|
||||||
|
System.setProperty("java.net.socks.password", socksServer.get("password"));
|
||||||
|
}
|
||||||
|
if (socksServer.get("port") != null) {
|
||||||
|
System.setProperty("socksProxyPort", socksServer.get("port"));
|
||||||
|
}
|
||||||
|
|
||||||
|
System.setProperty("socksProxyHost", socksServer.get("server"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
52
src/test/java/com/rarchives/ripme/tst/proxyTest.java
Normal file
52
src/test/java/com/rarchives/ripme/tst/proxyTest.java
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package com.rarchives.ripme.tst;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import com.rarchives.ripme.utils.Proxy;
|
||||||
|
import com.rarchives.ripme.utils.Utils;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
import com.rarchives.ripme.utils.Http;
|
||||||
|
|
||||||
|
|
||||||
|
public class proxyTest extends TestCase {
|
||||||
|
|
||||||
|
|
||||||
|
// This test will only run on machines where the user has added a entry for proxy.socks
|
||||||
|
public void testSocksProxy() throws IOException {
|
||||||
|
// Unset proxy before testing
|
||||||
|
System.setProperty("http.proxyHost", "");
|
||||||
|
System.setProperty("https.proxyHost", "");
|
||||||
|
System.setProperty("socksProxyHost", "");
|
||||||
|
URL url = new URL("https://icanhazip.com");
|
||||||
|
String proxyConfig = Utils.getConfigString("proxy.socks", "");
|
||||||
|
if (!proxyConfig.equals("")) {
|
||||||
|
String ip1 = Http.url(url).ignoreContentType().get().text();
|
||||||
|
Proxy.setSocks(Utils.getConfigString("proxy.socks", ""));
|
||||||
|
String ip2 = Http.url(url).ignoreContentType().get().text();
|
||||||
|
assertFalse(ip1.equals(ip2));
|
||||||
|
} else {
|
||||||
|
System.out.println("Skipping testSocksProxy");
|
||||||
|
assert(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This test will only run on machines where the user has added a entry for proxy.http
|
||||||
|
public void testHTTPProxy() throws IOException {
|
||||||
|
// Unset proxy before testing
|
||||||
|
System.setProperty("http.proxyHost", "");
|
||||||
|
System.setProperty("https.proxyHost", "");
|
||||||
|
System.setProperty("socksProxyHost", "");
|
||||||
|
URL url = new URL("https://icanhazip.com");
|
||||||
|
String proxyConfig = Utils.getConfigString("proxy.http", "");
|
||||||
|
if (!proxyConfig.equals("")) {
|
||||||
|
String ip1 = Http.url(url).ignoreContentType().get().text();
|
||||||
|
Proxy.setHTTPProxy(Utils.getConfigString("proxy.http", ""));
|
||||||
|
String ip2 = Http.url(url).ignoreContentType().get().text();
|
||||||
|
assertFalse(ip1.equals(ip2));
|
||||||
|
} else {
|
||||||
|
System.out.println("Skipping testHTTPProxy");
|
||||||
|
assert(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user