import android.content.Context; | |
| import com.zi.ultrasshservice.config.SettingsConstants; |
| import com.zi.ultrasshservice.config.Settingsz; |
| import com.zi.ultrasshservice.logger.ZIStatus; |
| import com.zi.ultrasshservice.tunnel.TunnelManagerHelper; |
| import com.zi.ultrasshservice.util.securepreferences.SecurePreferences; |
| import com.zi.zivpn.UDPStreamGobbler; |
| import java.io.File; |
| import java.io.IOException; |
| import java.io.PrintWriter; |
| import java.net.Inet4Address; |
| import java.net.InetAddress; |
| import java.net.UnknownHostException; |
| |
| public class UdpThread extends Thread { |
| private String address; |
| private String auth; |
| private String ca; |
| Context context; |
| private String dir; |
| private String dwon; |
| private UDPStreamGobbler err; |
| private File fileConf; |
| private File fileDns; |
| private File fileca; |
| private String listen; |
| /* access modifiers changed from: private */ |
| public final Settingsz mConfig; |
| private String obfs; |
| private UDPStreamGobbler out; |
| private String rc_conn; |
| private String rc_w; |
| private String retry; |
| private String serv; |
| private String server; |
| private Process udpProcess; |
| private Thread udpThread; |
| private String up; |
| |
| public UdpThread(Context context2) { |
| this.context = context2; |
| this.dir = context2.getFilesDir().getPath(); |
| this.mConfig = new Settingsz(context2); |
| } |
| |
| private boolean printToFile(File file, String str) { |
| try { |
| PrintWriter printWriter = new PrintWriter(file); |
| printWriter.println(str); |
| printWriter.flush(); |
| printWriter.close(); |
| return true; |
| } catch (Exception e) { |
| e.printStackTrace(); |
| return false; |
| } |
| } |
| |
| public void run() { |
| this.fileca = new File(this.dir, "zi.ca.crt"); |
| String privString = this.mConfig.getPrivString(SettingsConstants.UDP_SERVER); |
| this.serv = privString; |
| if (privString.isEmpty()) { |
| this.serv = "udpsg1.zivpn.com"; |
| try { |
| SecurePreferences.Editor edit = this.mConfig.getPrefsPrivate().edit(); |
| edit.putString(SettingsConstants.UDP_SERVER, this.serv); |
| edit.apply(); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| InetAddress[] inetAddressArr = new InetAddress[0]; |
| try { |
| inetAddressArr = InetAddress.getAllByName(this.serv); |
| } catch (UnknownHostException e2) { |
| e2.printStackTrace(); |
| } |
| try { |
| this.address = getIPv4Addresses(inetAddressArr).getHostAddress(); |
| } catch (Exception e3) { |
| e3.printStackTrace(); |
| if (String.valueOf(e3).contains("on a null object reference")) { |
| ZIStatus.logInfo("<font color='red'><strong>Invalid UDP Server</strong></font>"); |
| stopVudp(); |
| } |
| } |
| this.server = this.address + ":20000-50000"; |
| this.obfs = "zi"; |
| String privString2 = this.mConfig.getPrivString(SettingsConstants.UDP_AUTH); |
| this.auth = privString2; |
| if (privString2.isEmpty()) { |
| this.auth = "zi"; |
| } |
| String privString3 = this.mConfig.getPrivString(SettingsConstants.UDP_SPEED_UP); |
| this.up = privString3; |
| if (privString3.isEmpty()) { |
| this.up = "1"; |
| } |
| String privString4 = this.mConfig.getPrivString(SettingsConstants.UDP_SPEED_DOWN); |
| this.dwon = privString4; |
| if (privString4.isEmpty()) { |
| this.dwon = "2"; |
| } |
| this.retry = "3"; |
| String privString5 = this.mConfig.getPrivString(SettingsConstants.UDP_WINDOW); |
| this.rc_conn = privString5; |
| if (privString5.isEmpty()) { |
| this.rc_conn = "196608"; |
| } |
| try { |
| this.rc_w = String.valueOf((Integer.parseInt(this.rc_conn) * 5) / 2); |
| } catch (NumberFormatException e4) { |
| e4.printStackTrace(); |
| } |
| this.listen = "127.0.0.1:1080"; |
| String str = this.dir + "/zi.ca.crt"; |
| this.ca = str; |
| String format = String.format("{\n \"server\": \"%s\",\n \"obfs\": \"%s\",\n \"auth_str\": \"%s\",\n \"up_mbps\": %s,\n \"down_mbps\": %s,\n \"retry\": %s,\n \"retry_interval\": 1,\n \"socks5\": {\n \"listen\": \"%s\"\n },\n \"insecure\": true,\n \"ca\": \"%s\",\n \"recv_window_conn\": %s,\n \"recv_window\": %s\n}", new Object[]{this.server, this.obfs, this.auth, this.up, this.dwon, this.retry, this.listen, str, this.rc_conn, this.rc_w}); |
| this.fileConf = new File(this.dir, "config.json"); |
| if (!printToFile(this.fileca, "-----BEGIN CERTIFICATE-----\nMIIDizCCAnOgAwIBAgIUGxLl5Ou4dR1h3c9lUcaM5bp4ZBswDQYJKoZIhvcNAQEL\nBQAwVTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJTWjEUMBIG\nA1UECgwLWklWUE4sIEluYy4xFjAUBgNVBAMMDVpJVlBOIFJvb3QgQ0EwHhcNMjMw\nMjExMDkwMjM1WhcNMzMwMjA4MDkwMjM1WjBVMQswCQYDVQQGEwJDTjELMAkGA1UE\nCAwCR0QxCzAJBgNVBAcMAlNaMRQwEgYDVQQKDAtaSVZQTiwgSW5jLjEWMBQGA1UE\nAwwNWklWUE4gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAMQsHTq2UD4WDOvNUFGQuKd0PEitgQzSh12qH9aJ5jnCtbWjqVNDRQSW0ietg4Po\nqOfKLOBvGOJcGkrYlAAynnwsufdkZd2Jj2+FAXloAbMBK5cjqRANfPJ7ns3S5zL2\nt2+Xv/O6H58NL5QksyIHb2Vcosfelwuvj5Lq+MvyqGZikce5IaykgjjV0OsrBnsC\neK4yAeoxsqVixGwmcJDLGOIJDGYcDdaElqJqFCyOjOhLLDymx9JbeOb3DpiRNFNN\nlwXi2rfvpnmpGNwNt9sclWAQTL3cfV4GsCovT02r1qxcAqqRE4U1nqMRqk0KfyQn\nUebOat/0jNJI9YxJByuVBK0CAwEAAaNTMFEwHQYDVR0OBBYEFGk91bjhFZfcKkpm\n5SxVkqnSGhXBMB8GA1UdIwQYMBaAFGk91bjhFZfcKkpm5SxVkqnSGhXBMA8GA1Ud\nEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEr4aeE0ib5/7neEcRWCE1pg\nw0j/958bdaSdQJJvYEpc7brCHhp5lmNJA+MjVcCXCL4/8KfuEcyGNPPSPo7wbuYJ\nO9jsJmQOklfyvlKGJschvc8AZ0E0AGdrgGam1KApjrb6Xly5bqgV4KPBQ7KttBVw\nwFfTm0yjD3nAjaSXi3I/MG+gMGnUXoTMZa3iS2pomBMHLdTksiujbbH7RP9mzPT3\n7UvyVmtw7eQFEjEYceVWHlhXCjL9gpcJiX/wu9XzREDpNCqY2R3zb+ZGYuQD0L5h\nzv0u1CF+Cfkkg8luxol+aWc+1ac/8TGLV1WOGj4FuEMfxQPXWFqhc8VEyxZ/r/w=\n-----END CERTIFICATE-----") || !printToFile(this.fileConf, format)) { |
| interrupt(); |
| return; |
| } |
| File file = new File(this.context.getApplicationInfo().nativeLibraryDir, "libuz.so"); |
| this.fileDns = file; |
| String[] strArr = {file.getAbsolutePath(), "client", "--config", this.fileConf.getAbsolutePath()}; |
| AnonymousClass1 r1 = new UDPStreamGobbler.OnResultListener() { |
| public void onResult(String str) { |
| SecurePreferences prefsPrivate = UdpThread.this.mConfig.getPrefsPrivate(); |
| if (str.contains("ZIVPN UDP running")) { |
| ZIStatus.logInfo("<font color='green'><strong>UDP Connected Successfully</strong></font>"); |
| ZIStatus.logInfo("<font color='#FF7F27'><strong>You are ready to go</strong></font>"); |
| } else if (str.contains("no recent network activity")) { |
| if (prefsPrivate.getBoolean(SettingsConstants.RECONNECT_UDP, false)) { |
| BugTestMainActivity.reconnectUDP(UdpThread.this.context); |
| ZIStatus.logInfo("<font color='red'><strong>Connection Lost retrying </strong></font>"); |
| UdpThread.this.interrupt(); |
| return; |
| } |
| ZIStatus.logInfo("<font color='red'><strong>UDP connection Lost</strong></font>"); |
| UdpThread.this.stopVudp(); |
| } else if (str.contains("Connection to server lost") || str.contains("handshake did not complete in time")) { |
| ZIStatus.logInfo("<font color='red'><strong>Please wait reconnecting UDP</strong></font>"); |
| } else if (str.contains("Failed to parse client configuration")) { |
| ZIStatus.logInfo("<font color='red'><strong>Invalid UDP setting</strong></font>"); |
| UdpThread.this.stopVudp(); |
| } else if (str.contains("auth error")) { |
| ZIStatus.logInfo("<font color='red'><strong>Authentication failed, invalid password/expired/may logged-in on another device</strong></font>"); |
| UdpThread.this.stopVudp(); |
| } else if (str.contains("too many connections")) { |
| ZIStatus.logInfo("<font color='red'><strong>Same account on multi-device not support</strong></font>"); |
| UdpThread.this.stopVudp(); |
| } |
| } |
| }; |
| try { |
| this.udpProcess = new ProcessBuilder(new String[0]).command(strArr).redirectErrorStream(true).start(); |
| this.out = new UDPStreamGobbler(this.udpProcess.getInputStream(), r1); |
| this.err = new UDPStreamGobbler(this.udpProcess.getErrorStream(), r1); |
| this.out.setInterrupted(false); |
| this.out.start(); |
| this.err.setInterrupted(false); |
| this.err.start(); |
| this.udpProcess.waitFor(); |
| } catch (IOException | InterruptedException e5) { |
| e5.printStackTrace(); |
| } |
| } |
| |
| public static Inet4Address getIPv4Addresses(InetAddress[] inetAddressArr) { |
| for (Inet4Address inet4Address : inetAddressArr) { |
| if (inet4Address instanceof Inet4Address) { |
| return inet4Address; |
| } |
| } |
| return null; |
| } |
| |
| public void stopVudp() { |
| new Thread(new Runnable() { |
| public void run() { |
| ZIStatus.logInfo("Stopping UDP...."); |
| UdpThread.this.interrupt(); |
| try { |
| Thread.sleep(2000); |
| } catch (InterruptedException unused) { |
| } |
| TunnelManagerHelper.stopZIVPN(UdpThread.this.context); |
| } |
| }).start(); |
| } |
| |
| public void interrupt() { |
| UDPStreamGobbler uDPStreamGobbler = this.out; |
| if (uDPStreamGobbler != null) { |
| uDPStreamGobbler.setInterrupted(true); |
| this.out.interrupt(); |
| this.out = null; |
| } |
| UDPStreamGobbler uDPStreamGobbler2 = this.err; |
| if (uDPStreamGobbler2 != null) { |
| uDPStreamGobbler2.setInterrupted(true); |
| this.err.interrupt(); |
| this.err = null; |
| } |
| Process process = this.udpProcess; |
| if (process != null) { |
| process.destroy(); |
| this.udpProcess = null; |
| } |
| File file = this.fileConf; |
| if (file != null && file.exists()) { |
| this.fileConf.delete(); |
| } |
| super.interrupt(); |
| } |
| } |