ProxyChanger/src/org/proxy/Main.java

183 lines
6.4 KiB
Java
Raw Normal View History

2023-03-16 05:28:14 +01:00
package org.proxy;
import org.json.simple.parser.ParseException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.*;
2023-03-29 11:12:35 +02:00
import java.util.List;
2023-03-16 05:28:14 +01:00
import java.util.Locale;
import static javax.swing.JOptionPane.showMessageDialog;
import static org.dhaverdLogs.DhaverdLogs.*;
import static org.proxy.loadConfig.*;
2023-03-16 05:28:14 +01:00
public class Main {
public static boolean isLinux = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("linux");
public static ServerSocket serverSocket;
public static int repeatTime;
public static TrayIcon trayIcon = null;
2023-03-16 05:28:14 +01:00
static {
try {
serverSocket = new ServerSocket();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static Thread currentThread = null;
2023-03-16 05:28:14 +01:00
public static void main(String[] args) throws IOException, ParseException {
setLogDir("logs");
setLogName("startup");
bindSocket();
repeatTime = getRepeatTime();
2023-03-16 05:28:14 +01:00
systemTray();
}
public static void bindSocket() throws IOException, ParseException {
String context = "BindSocket";
InetAddress inetAddress = InetAddress.getByName("localhost");
int port = getSocketPort();
SocketAddress endPoint = new InetSocketAddress(inetAddress, port);
try {
serverSocket.bind(endPoint);
} catch (BindException e) {
showMessageDialog(null, "Приложение уже запущено");
exeptionActions(context, e);
System.exit(0);
}
setLog(context, "Socket binded", true, false);
setLog(context, "Local Socket Address: "+serverSocket.getLocalSocketAddress(), true, false);
}
2023-03-29 11:12:35 +02:00
public static void systemTray() throws IOException, ParseException {
2023-03-16 05:28:14 +01:00
String context = "SystemTray";
if(! SystemTray.isSupported() ) {
setLog(context,"System tray is unsupported!", true, false);
return;
}
Font trayFont;
if (isLinux){
trayFont = new Font("Tempora LGC Uni", Font.PLAIN, 16);
} else {
trayFont = new Font("Arial", Font.PLAIN, 12);
}
2023-03-29 11:12:35 +02:00
List<String> proxyList = getProxyList();
int counter = 1;
PopupMenu trayMenu = new PopupMenu();
for (String prox : proxyList){
MenuItem proxy = new MenuItem(prox);
counter++;
proxy.setFont(trayFont);
proxy.addActionListener(proxyListener(prox));
trayMenu.add(proxy);
}
MenuItem stopbutton = new MenuItem("Stop");
stopbutton.setFont(trayFont);
stopbutton.addActionListener(stopListener());
trayMenu.add(stopbutton);
2023-03-16 05:28:14 +01:00
MenuItem trayExit = new MenuItem("Exit");
trayExit.setFont(trayFont);
trayExit.addActionListener(trayExitListener());
trayMenu.add(trayExit);
Image icon;
if (isLinux){
icon = Toolkit.getDefaultToolkit().getImage("res" + osSeparator + "icon.png");
} else {
icon = Toolkit.getDefaultToolkit().getImage("res" + osSeparator + "icon.png");
}
trayIcon = new TrayIcon(icon, "Current proxy: proxy is off", trayMenu);
2023-03-16 05:28:14 +01:00
if (isLinux){
trayIcon.setImageAutoSize(false);
} else {
trayIcon.setImageAutoSize(true);
}
SystemTray tray = SystemTray.getSystemTray();
try {
tray.add(trayIcon);
} catch (AWTException e) {
exeptionActions(context, e);
}
setLog(context,"System tray launched", true, false);
}
public static ActionListener trayExitListener() {
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
setLog("Program","Closing server socket...", true, false);
setLog( "Program","Exiting program", true, false);
serverSocket.close();
} catch (IOException ex) {
exeptionActions("TrayExitListener", ex);
}
closeThread();
2023-03-16 05:28:14 +01:00
System.exit(0);
}
};
return listener;
}
public static ActionListener stopListener() {
2023-03-16 05:28:14 +01:00
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
closeThread();
trayIcon.setToolTip("Current proxy: proxy is off");
2023-03-16 05:28:14 +01:00
}
};
return listener;
}
public static void closeThread(){
if (currentThread != null){
currentThread.stop();
}
currentThread = null;
2023-03-29 11:12:35 +02:00
}
public static ActionListener proxyListener(String proxyStr) {
2023-03-16 05:28:14 +01:00
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (currentThread != null){
currentThread.stop();
2023-03-16 05:28:14 +01:00
}
currentThread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
setProxy(proxyStr);
Thread.sleep(repeatTime);
} catch (InterruptedException | IOException ex) {
exeptionActions(proxyStr, ex);
}
}
}
});
currentThread.start();
2023-03-16 05:28:14 +01:00
}
};
return listener;
}
2023-03-29 11:12:35 +02:00
public static void setProxy(String proxyStr) throws IOException, InterruptedException {
execute("reg delete \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\" /v AutoConfigURL /f");
execute("reg add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\" /v AutoConfigURL /t REG_SZ /d \"" + proxyStr + "\"");
setLog("setProxy", "Proxy is set on: " + proxyStr, true, false);
trayIcon.setToolTip("Current proxy: " + proxyStr);
2023-03-16 05:28:14 +01:00
}
public static void execute(String command) throws IOException, InterruptedException {
Process proc = Runtime.getRuntime().exec(command);
proc.waitFor();
proc.destroy();
}
}