package org.proxy; import org.json.simple.parser.ParseException; import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Scanner; 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; public static List currentProxyList = null; public static SystemTray tray; public static Font trayFont; static { if (isLinux){ trayFont = new Font("Tempora LGC Uni", Font.PLAIN, 16); } else { trayFont = new Font("Arial", Font.PLAIN, 12); } } static { try { serverSocket = new ServerSocket(); } catch (IOException e) { throw new RuntimeException(e); } } public static Thread currentThread = null; public static String currentProxyPub = " proxy is off"; public static void main(String[] args) throws IOException, ParseException, InterruptedException { setLogDir("logs"); setLogName("startup"); logCleaner(getDeleteTime()); bindSocket(); repeatTime = getRepeatTime(); currentProxyPub = getCurrentProxy(); setLog("Proxy Checker", "Current proxy: " + currentProxyPub, true, false); systemTray(); } public static String getCurrentProxy() throws InterruptedException, IOException { String currentProxy = " proxy is off"; Process proc = Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\""); proc.waitFor(); BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); String s; String proxyLine = ""; while ((s = stdInput.readLine()) != null) { if (s.contains("AutoConfigURL")){ proxyLine = s.replace(" ", ";"); } } String[] abc = proxyLine.split(";"); if (abc.length == 4 && abc[3] != null) currentProxy = abc[3]; proc.destroy(); return currentProxy; } 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; } List proxyList = getProxyList(); currentProxyList = proxyList; PopupMenu trayMenu = new PopupMenu(); MenuItem addButton = new MenuItem("Add proxy..."); addButton.setFont(trayFont); addButton.addActionListener(addListener()); trayMenu.add(addButton); for (String prox : proxyList){ MenuItem proxy = new MenuItem(prox); 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; icon = Toolkit.getDefaultToolkit().getImage("res" + osSeparator + "icon off.png"); trayIcon = new TrayIcon(icon, "Current proxy: " + currentProxyPub, trayMenu); trayIcon.setImageAutoSize(!isLinux); tray = SystemTray.getSystemTray(); try { tray.add(trayIcon); } catch (AWTException e) { exeptionActions(context, e); } setLog(context,"System tray launched", true, false); } public static ActionListener trayExitListener() { return 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); }; } public static void addNewProxy(String proxy) throws IOException { File config = getConfigFile(); FileReader reader = new FileReader(config); Scanner sc = new Scanner(reader); List propsList = new ArrayList<>(); while (sc.hasNext()){ String line = sc.nextLine(); propsList.add(line); } sc.close(); reader.close(); List newProps = new ArrayList<>(); for (String prop : propsList){ newProps.add(prop); if (prop.contains("\"proxyList\" : [")){ newProps.add("\t\t\"" + proxy + "\","); } } /* setLog("Add new proxy function", "New proxy list:", true, false); for (String prop : newProps) { setLog("Add new proxy function", prop, false, true); } */ FileWriter writer = new FileWriter(config, false); for (String prop : newProps) { writer.write(prop + "\n"); } writer.close(); } public static void reloadMenu() throws IOException, ParseException { String context = "Reload tray menu"; tray.remove(trayIcon); List proxyList = getProxyList(); currentProxyList = proxyList; PopupMenu trayMenu = new PopupMenu(); MenuItem addButton = new MenuItem("Add proxy..."); addButton.setFont(trayFont); addButton.addActionListener(addListener()); trayMenu.add(addButton); for (String prox : proxyList){ MenuItem proxy = new MenuItem(prox); 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; icon = Toolkit.getDefaultToolkit().getImage("res" + osSeparator + "icon off.png"); trayIcon = new TrayIcon(icon, "Current proxy: " + currentProxyPub, trayMenu); trayIcon.setImageAutoSize(!isLinux); try { tray.add(trayIcon); } catch (AWTException e) { exeptionActions(context, e); } } public static ActionListener addListener(){ return e -> { // frame JFrame frame = new JFrame("Add proxy"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setSize(400,200); frame.setLocationRelativeTo(null); //main panel JPanel mainPanel = new JPanel(); GridBagLayout layout = new GridBagLayout(); mainPanel.setLayout(layout); GridBagConstraints gbc = new GridBagConstraints(); //label JLabel label = new JLabel("Proxy address:"); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 0.3; gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets(10, 10, 10, 2); mainPanel.add(label, gbc); //text field JTextField proxyField = new JTextField(); proxyField.setSize(300, 50); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 0.7; gbc.gridx = 1; gbc.gridy = 0; gbc.gridwidth = 2; gbc.insets = new Insets(10, 2, 10, 10); mainPanel.add(proxyField, gbc); // add button JButton addButton = new JButton("Add"); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = 1; gbc.gridy = 1; gbc.gridwidth = 1; gbc.insets = new Insets(0, 10, 10, 10); addButton.addActionListener(al -> { String newProxy = proxyField.getText(); try { setLog("Add proxy", "New proxy: " + newProxy, true, false); addNewProxy(newProxy); reloadMenu(); frame.dispose(); } catch (IOException | ParseException ex) { exeptionActions("Add proxy", ex); } }); mainPanel.add(addButton, gbc); //close button JButton closeButton = new JButton("Close"); closeButton.addActionListener(al -> { frame.dispose(); }); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = 2; gbc.gridy = 1; gbc.gridwidth = 1; gbc.insets = new Insets(0, 10, 10, 10); mainPanel.add(closeButton, gbc); frame.getContentPane().add(mainPanel); frame.setResizable(false); frame.setVisible(true); }; } public static ActionListener stopListener() { return e -> { closeThread(); try { setLog("Stop Listener", "Proxy setter now is off", true, false); } catch (IOException ex) { exeptionActions("Stop Listener", ex); } Image icon = Toolkit.getDefaultToolkit().getImage("res" + osSeparator + "icon off.png"); trayIcon.setImage(icon); currentThread = new Thread(() -> { while(true){ try { currentProxyPub = getCurrentProxy(); trayIcon.setToolTip("Current proxy: " + currentProxyPub); Thread.sleep(repeatTime); } catch (InterruptedException | IOException ex) { exeptionActions("Stop Listener", ex); } } }); currentThread.start(); }; } public static void closeThread(){ if (currentThread != null){ currentThread.stop(); } currentThread = null; } public static ActionListener proxyListener(String proxyStr) { return e -> { closeThread(); currentThread = new Thread(() -> { while(true){ try { currentProxyPub = getCurrentProxy(); if (!currentProxyPub.equals(proxyStr)) setProxy(proxyStr); Image icon = Toolkit.getDefaultToolkit().getImage("res" + osSeparator + "icon on blue.png"); trayIcon.setImage(icon); currentProxyPub = getCurrentProxy(); trayIcon.setToolTip("Current proxy: " + currentProxyPub); Thread.sleep(repeatTime); } catch (InterruptedException | IOException ex) { exeptionActions( "Set proxy: " + proxyStr, ex); } } }); currentThread.start(); }; } 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("Set Proxy", "Proxy is set on: " + proxyStr, true, false); } public static void execute(String command) throws IOException, InterruptedException { Process proc = Runtime.getRuntime().exec(command); proc.waitFor(); proc.destroy(); } }