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.*; import java.util.List; import java.util.Locale; import static javax.swing.JOptionPane.showMessageDialog; import static org.dhaverdLogs.DhaverdLogs.*; import static org.proxy.loadConfig.*; 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; static { try { serverSocket = new ServerSocket(); } catch (IOException e) { throw new RuntimeException(e); } } public static Thread currentThread = null; public static void main(String[] args) throws IOException, ParseException { setLogDir("logs"); setLogName("startup"); bindSocket(); repeatTime = getRepeatTime(); 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); } public static void systemTray() throws IOException, ParseException { 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); } List 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); 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); 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(); System.exit(0); } }; return listener; } public static ActionListener stopListener() { ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { closeThread(); trayIcon.setToolTip("Current proxy: proxy is off"); } }; return listener; } public static void closeThread(){ if (currentThread != null){ currentThread.stop(); } currentThread = null; } public static ActionListener proxyListener(String proxyStr) { ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (currentThread != null){ currentThread.stop(); } 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(); } }; return listener; } 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); } public static void execute(String command) throws IOException, InterruptedException { Process proc = Runtime.getRuntime().exec(command); proc.waitFor(); proc.destroy(); } }