diff options
7 files changed, 127 insertions, 460 deletions
diff --git a/app/src/main/java/de/blinkt/openvpn/core/connection/Obfs4Connection.java b/app/src/main/java/de/blinkt/openvpn/core/connection/Obfs4Connection.java index c780f487..82a7a6aa 100644 --- a/app/src/main/java/de/blinkt/openvpn/core/connection/Obfs4Connection.java +++ b/app/src/main/java/de/blinkt/openvpn/core/connection/Obfs4Connection.java @@ -2,8 +2,9 @@ package de.blinkt.openvpn.core.connection; import se.leap.bitmaskclient.pluggableTransports.Obfs4Options; -import static se.leap.bitmaskclient.pluggableTransports.Dispatcher.DISPATCHER_IP; -import static se.leap.bitmaskclient.pluggableTransports.Dispatcher.DISPATCHER_PORT; +import static se.leap.bitmaskclient.pluggableTransports.Shapeshifter.DISPATCHER_IP; +import static se.leap.bitmaskclient.pluggableTransports.Shapeshifter.DISPATCHER_PORT; + /** * Created by cyberta on 08.03.19. diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java b/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java index 303959d0..5ddb74ab 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java @@ -49,8 +49,8 @@ import static se.leap.bitmaskclient.base.models.Constants.REMOTE; import static se.leap.bitmaskclient.base.models.Constants.TRANSPORT; import static se.leap.bitmaskclient.base.models.Constants.TYPE; import static se.leap.bitmaskclient.base.models.Constants.UDP; -import static se.leap.bitmaskclient.pluggableTransports.Dispatcher.DISPATCHER_IP; -import static se.leap.bitmaskclient.pluggableTransports.Dispatcher.DISPATCHER_PORT; +import static se.leap.bitmaskclient.pluggableTransports.Shapeshifter.DISPATCHER_IP; +import static se.leap.bitmaskclient.pluggableTransports.Shapeshifter.DISPATCHER_PORT; public class VpnConfigGenerator { private JSONObject generalConfiguration; diff --git a/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/BinaryInstaller.java b/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/BinaryInstaller.java deleted file mode 100644 index 0d6aa61e..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/BinaryInstaller.java +++ /dev/null @@ -1,204 +0,0 @@ -/* Copyright (c) 2009, Nathan Freitas, Orbot / The Guardian Project - http://openideals.com/guardian */ -/* See LICENSE for licensing information */ - -package se.leap.bitmaskclient.pluggableTransports; - -import android.content.Context; -import android.util.Log; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.concurrent.TimeoutException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -public class BinaryInstaller { - - File installFolder; - Context context; - - public BinaryInstaller(Context context, File installFolder) - { - this.installFolder = installFolder; - - this.context = context; - } - - public void deleteDirectory(File file) { - if( file.exists() ) { - if (file.isDirectory()) { - File[] files = file.listFiles(); - for(int i=0; i<files.length; i++) { - if(files[i].isDirectory()) { - deleteDirectory(files[i]); - } - else { - files[i].delete(); - } - } - } - - file.delete(); - } - } - - private final static String COMMAND_RM_FORCE = "rm -f "; - private final static String MP3_EXT = ".mp3"; - // - /* - * Extract the resources from the APK file using ZIP - */ - public File installResource (String basePath, String assetKey, boolean overwrite) throws IOException, FileNotFoundException, TimeoutException - { - - InputStream is; - File outFile; - - outFile = new File(installFolder, assetKey); - - if (outFile.exists() && (!overwrite)) { - Log.d("BINARY_INSTALLER", "Binary already exists! Using " + outFile.getCanonicalPath()); - return outFile; - } - - deleteDirectory(installFolder); - installFolder.mkdirs(); - - Log.d("BINARY_INSTALLER", "Search asset in " + basePath + "/" + assetKey); - - is = context.getAssets().open(basePath + '/' + assetKey); - streamToFile(is,outFile, false, false); - setExecutable(outFile); - - Log.d("BINARY_INSTALLER", "Asset copied from " + basePath + "/" + assetKey + " to: " + outFile.getCanonicalPath()); - - return outFile; - } - - - private final static int FILE_WRITE_BUFFER_SIZE = 1024*8; - /* - * Write the inputstream contents to the file - */ - public static boolean streamToFile(InputStream stm, File outFile, boolean append, boolean zip) throws IOException - - { - byte[] buffer = new byte[FILE_WRITE_BUFFER_SIZE]; - - int bytecount; - - OutputStream stmOut = new FileOutputStream(outFile.getAbsolutePath(), append); - ZipInputStream zis = null; - - if (zip) - { - zis = new ZipInputStream(stm); - ZipEntry ze = zis.getNextEntry(); - stm = zis; - - } - - while ((bytecount = stm.read(buffer)) > 0) - { - - stmOut.write(buffer, 0, bytecount); - - } - - stmOut.close(); - stm.close(); - - if (zis != null) - zis.close(); - - - return true; - - } - - //copy the file from inputstream to File output - alternative impl - public static boolean copyFile (InputStream is, File outputFile) - { - - try { - if (outputFile.exists()) - outputFile.delete(); - - boolean newFile = outputFile.createNewFile(); - DataOutputStream out = new DataOutputStream(new FileOutputStream(outputFile)); - DataInputStream in = new DataInputStream(is); - - int b = -1; - byte[] data = new byte[1024]; - - while ((b = in.read(data)) != -1) { - out.write(data); - } - - if (b == -1); //rejoice - - // - out.flush(); - out.close(); - in.close(); - // chmod? - - return newFile; - - - } catch (IOException ex) { - Log.e("Binaryinstaller", "error copying binary", ex); - return false; - } - - } - - /** - * Copies a raw resource file, given its ID to the given location - * @param ctx context - * @param resid resource id - * @param file destination file - * @param mode file permissions (E.g.: "755") - * @throws IOException on error - * @throws InterruptedException when interrupted - */ - public static void copyRawFile(Context ctx, int resid, File file, String mode, boolean isZipd) throws IOException, InterruptedException - { - final String abspath = file.getAbsolutePath(); - // Write the iptables binary - final FileOutputStream out = new FileOutputStream(file); - InputStream is = ctx.getResources().openRawResource(resid); - - if (isZipd) - { - ZipInputStream zis = new ZipInputStream(is); - ZipEntry ze = zis.getNextEntry(); - is = zis; - } - - byte buf[] = new byte[1024]; - int len; - while ((len = is.read(buf)) > 0) { - out.write(buf, 0, len); - } - out.close(); - is.close(); - // Change the permissions - Runtime.getRuntime().exec("chmod "+mode+" "+abspath).waitFor(); - } - - - private void setExecutable(File fileBin) { - fileBin.setReadable(true); - fileBin.setExecutable(true); - fileBin.setWritable(false); - fileBin.setWritable(true, true); - } - -} diff --git a/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/Dispatcher.java b/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/Dispatcher.java deleted file mode 100644 index 210c94b6..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/Dispatcher.java +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Copyright (c) 2019 LEAP Encryption Access Project and contributers - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package se.leap.bitmaskclient.pluggableTransports; - -import android.content.Context; -import androidx.annotation.WorkerThread; -import android.text.TextUtils; -import android.util.Log; - -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.util.StringTokenizer; - - -/** - * Created by cyberta on 22.02.19. - */ - -public class Dispatcher { - private static final String ASSET_KEY = "piedispatcher"; - public static final String DISPATCHER_PORT = "4430"; - public static final String DISPATCHER_IP = "127.0.0.1"; - private static final String TAG = Dispatcher.class.getName(); - private final String remoteIP; - private final String remotePort; - private final String certificate; - private final String iatMode; - private File fileDispatcher; - private Context context; - private Thread dispatcherThread = null; - private int dispatcherPid = -1; - - public Dispatcher(Context context, Obfs4Options obfs4Options) { - this.context = context.getApplicationContext(); - this.remoteIP = obfs4Options.remoteIP; - this.remotePort = obfs4Options.remotePort; - this.certificate = obfs4Options.cert; - this.iatMode = obfs4Options.iatMode; - } - - @WorkerThread - public void initSync() { - try { - fileDispatcher = installDispatcher(); - - // start dispatcher - dispatcherThread = new Thread(() -> { - try { - StringBuilder dispatcherLog = new StringBuilder(); - String dispatcherCommand = fileDispatcher.getCanonicalPath() + - " -transparent" + - " -client" + - " -state " + context.getFilesDir().getCanonicalPath() + "/state" + - " -target " + remoteIP + ":" + remotePort + - " -transports obfs4" + - " -options \"" + String.format("{\\\"cert\\\": \\\"%s\\\", \\\"iatMode\\\": \\\"%s\\\"}\"", certificate, iatMode) + - " -logLevel DEBUG -enableLogging" + - " -proxylistenaddr "+ DISPATCHER_IP + ":" + DISPATCHER_PORT; - - Log.d(TAG, "dispatcher command: " + dispatcherCommand); - runBlockingCmd(new String[]{dispatcherCommand}, dispatcherLog); - } catch (IOException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } - }); - dispatcherThread.start(); - - // get pid of dispatcher, try several times in case the dispatcher - // process is not spawned yet - StringBuilder log = new StringBuilder(); - String pidCommand = "ps | grep piedispatcher"; - for (int i = 0; i < 5; i++) { - runBlockingCmd(new String[]{pidCommand}, log); - if (!TextUtils.isEmpty(log)) { - break; - } - Thread.sleep(100); - } - - String output = log.toString(); - StringTokenizer st = new StringTokenizer(output, " "); - st.nextToken(); // proc owner - dispatcherPid = Integer.parseInt(st.nextToken().trim()); - } catch(Exception e){ - if (dispatcherThread.isAlive()) { - Log.e(TAG, e.getMessage() + ". Shutting down Dispatcher thread."); - stop(); - } - } - } - - public String getPort() { - return DISPATCHER_PORT; - } - - public void stop() { - Log.d(TAG, "Shutting down Dispatcher thread."); - if (dispatcherThread != null && dispatcherThread.isAlive()) { - try { - killProcess(dispatcherPid); - } catch (Exception e) { - e.printStackTrace(); - } - dispatcherThread.interrupt(); - } - } - - private void killProcess(int pid) throws Exception { - String killPid = "kill -9 " + pid; - runCmd(new String[]{killPid}, null, false); - } - - public boolean isRunning() { - return dispatcherThread != null && dispatcherThread.isAlive(); - } - - private File installDispatcher(){ - File fileDispatcher = null; - BinaryInstaller bi = new BinaryInstaller(context,context.getFilesDir()); - - String arch = System.getProperty("os.arch"); - if (arch.contains("arm")) - arch = "armeabi-v7a"; - else - arch = "x86"; - - try { - fileDispatcher = bi.installResource(arch, ASSET_KEY, false); - } catch (Exception ioe) { - Log.d(TAG,"Couldn't install dispatcher: " + ioe); - } - - return fileDispatcher; - } - - @WorkerThread - private void runBlockingCmd(String[] cmds, StringBuilder log) throws Exception { - runCmd(cmds, log, true); - } - - @WorkerThread - private int runCmd(String[] cmds, StringBuilder log, - boolean waitFor) throws Exception { - - int exitCode = -1; - Process proc = Runtime.getRuntime().exec("sh"); - OutputStreamWriter out = new OutputStreamWriter(proc.getOutputStream()); - - try { - for (String cmd : cmds) { - Log.d(TAG, "executing CMD: " + cmd); - out.write(cmd); - out.write("\n"); - } - - out.flush(); - out.write("exit\n"); - out.flush(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - out.close(); - } - - if (waitFor) { - // Consume the "stdout" - InputStreamReader reader = new InputStreamReader(proc.getInputStream()); - readToLogString(reader, log); - - // Consume the "stderr" - reader = new InputStreamReader(proc.getErrorStream()); - readToLogString(reader, log); - - try { - exitCode = proc.waitFor(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - return exitCode; - } - - private void readToLogString(InputStreamReader reader, StringBuilder log) throws IOException { - final char buf[] = new char[10]; - int read = 0; - try { - while ((read = reader.read(buf)) != -1) { - if (log != null) - log.append(buf, 0, read); - } - } catch (IOException e) { - reader.close(); - throw new IOException(e); - } - reader.close(); - } -} diff --git a/app/src/main/res/layout-xlarge/f_about.xml b/app/src/main/res/layout-xlarge/f_about.xml index e018c8fc..f2432e04 100644 --- a/app/src/main/res/layout-xlarge/f_about.xml +++ b/app/src/main/res/layout-xlarge/f_about.xml @@ -169,7 +169,7 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/mbetTLS" + android:text="@string/asio" android:textSize="24sp" android:textAppearance="?android:attr/textAppearanceMedium" /> @@ -177,8 +177,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" - android:autoLink="web" - android:text="@string/copyright_mbetTLS" /> + android:text="@string/copyright_asio" /> <Space android:layout_width="match_parent" @@ -187,7 +186,7 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/asio" + android:text="@string/shapeshifter_library" android:textSize="24sp" android:textAppearance="?android:attr/textAppearanceMedium" /> @@ -195,7 +194,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" - android:text="@string/copyright_asio" /> + android:text="@string/copyright_shapeshifter_library" /> <Space android:layout_width="match_parent" @@ -204,7 +203,7 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/openvpn3" + android:text="@string/obfs4" android:textSize="24sp" android:textAppearance="?android:attr/textAppearanceMedium" /> @@ -212,7 +211,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" - android:text="@string/copyright_openvpn3" /> + android:text="@string/copyright_obfs4" /> <Space android:layout_width="match_parent" @@ -221,7 +220,7 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/shapeshifter_library" + android:text="@string/shapeshifter_transports" android:textSize="24sp" android:textAppearance="?android:attr/textAppearanceMedium" /> @@ -229,7 +228,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" - android:text="@string/copyright_shapeshifter_library" /> + android:text="@string/copyright_shapeshifter_transports" /> <Space android:layout_width="match_parent" @@ -238,7 +237,7 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/shapeshifter_dispatcher" + android:text="@string/circleImageView" android:textSize="24sp" android:textAppearance="?android:attr/textAppearanceMedium" /> @@ -246,7 +245,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" - android:text="@string/copyright_shapeshifter_dispatcher" /> + android:text="@string/copyright_circleImageView" /> <Space android:layout_width="match_parent" @@ -255,7 +254,7 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/shapeshifter_transports" + android:text="@string/tor_android" android:textSize="24sp" android:textAppearance="?android:attr/textAppearanceMedium" /> @@ -263,7 +262,57 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" - android:text="@string/copyright_shapeshifter_transports" /> - </LinearLayout> + android:text="@string/copyright_tor_android" /> + + <Space + android:layout_width="match_parent" + android:layout_height="20sp" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/tor" + android:textSize="24sp" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="18sp" + android:text="@string/copyright_tor" /> + + <Space + android:layout_width="match_parent" + android:layout_height="20sp" /> + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/iptproxy" + android:textSize="24sp" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="18sp" + android:text="@string/copyright_iptproxy" /> + + <Space + android:layout_width="match_parent" + android:layout_height="20sp" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/snowflake" + android:textSize="24sp" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="18sp" + android:text="@string/copyright_snowflake" /> + </LinearLayout> </ScrollView> diff --git a/app/src/main/res/layout/f_about.xml b/app/src/main/res/layout/f_about.xml index b10cc555..acf686eb 100644 --- a/app/src/main/res/layout/f_about.xml +++ b/app/src/main/res/layout/f_about.xml @@ -167,14 +167,13 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/mbetTLS" + android:text="@string/asio" android:textAppearance="?android:attr/textAppearanceMedium" /> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:autoLink="web" - android:text="@string/copyright_mbetTLS" /> + android:text="@string/copyright_asio" /> <Space android:layout_width="match_parent" @@ -183,13 +182,13 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/asio" + android:text="@string/shapeshifter_library" android:textAppearance="?android:attr/textAppearanceMedium" /> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/copyright_asio" /> + android:text="@string/copyright_shapeshifter_library" /> <Space android:layout_width="match_parent" @@ -198,13 +197,13 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/openvpn3" + android:text="@string/obfs4" android:textAppearance="?android:attr/textAppearanceMedium" /> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/copyright_openvpn3" /> + android:text="@string/copyright_obfs4" /> <Space android:layout_width="match_parent" @@ -213,13 +212,13 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/shapeshifter_library" + android:text="@string/shapeshifter_transports" android:textAppearance="?android:attr/textAppearanceMedium" /> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/copyright_shapeshifter_library" /> + android:text="@string/copyright_shapeshifter_transports" /> <Space android:layout_width="match_parent" @@ -228,13 +227,13 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/shapeshifter_dispatcher" + android:text="@string/circleImageView" android:textAppearance="?android:attr/textAppearanceMedium" /> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/copyright_shapeshifter_dispatcher" /> + android:text="@string/copyright_circleImageView" /> <Space android:layout_width="match_parent" @@ -243,13 +242,13 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/shapeshifter_transports" + android:text="@string/tor_android" android:textAppearance="?android:attr/textAppearanceMedium" /> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/copyright_shapeshifter_transports" /> + android:text="@string/copyright_tor_android" /> <Space android:layout_width="match_parent" @@ -258,13 +257,43 @@ <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/circleImageView" + android:text="@string/tor" android:textAppearance="?android:attr/textAppearanceMedium" /> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/copyright_circleImageView" /> + android:text="@string/copyright_tor" /> + + <Space + android:layout_width="match_parent" + android:layout_height="20sp" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/iptproxy" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/copyright_iptproxy" /> + + <Space + android:layout_width="match_parent" + android:layout_height="20sp" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/snowflake" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <androidx.appcompat.widget.AppCompatTextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/copyright_snowflake" /> </LinearLayout> </ScrollView> diff --git a/app/src/main/res/values/untranslatable.xml b/app/src/main/res/values/untranslatable.xml index 2459e146..41be935f 100644 --- a/app/src/main/res/values/untranslatable.xml +++ b/app/src/main/res/values/untranslatable.xml @@ -8,7 +8,7 @@ <string name="copyright_openssl" translatable="false"> Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.\n\n This product includes cryptographic software written by Eric Young (eay@cryptsoft.com)\n Copyright 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved.</string> - <string name="copyright_okhttp" translatable="false">Copyright (c) 2019 Square, Inc.</string> + <string name="copyright_okhttp" translatable="false">Copyright (c) 2022 Square, Inc.</string> <string name="okhttp" translatable="false">OkHttp</string> <string name="openvpn" translatable="false">OpenVPN</string> <string name="lzo" translatable="false">LZO</string> @@ -23,7 +23,7 @@ <string name="copyright_openvpn3" translatable="false">GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007</string> <string name="unknown_state" translatable="false">Unknown state</string> - <string name="copyright_blinktgui" translatable="false">Copyright (c) 2012-2019 Arne Schwabe <arne@rfc2549.org></string> + <string name="copyright_blinktgui" translatable="false">Copyright (c) 2012-2022 Arne Schwabe <arne@rfc2549.org></string> <string name="defaultserver" translatable="false">openvpn.uni-paderborn.de</string> <string name="defaultport" translatable="false">1194</string> <string name="copyright_file_dialog" translatable="false">File Dialog based on work by Alexander Ponomarev</string> @@ -36,13 +36,21 @@ <string name="state_user_vpn_password_cancelled" translatable="false">VPN password input dialog cancelled</string> <string name="state_user_vpn_permission_cancelled" translatable="false">VPN API permission dialog cancelled</string> <string name="shapeshifter_library" translatable="false">Shapeshifter Library</string> - <string name="copyright_shapeshifter_library" translatable="false">Copyright (c) 2019, LEAP Encryption Access Project (info@leap.se)</string> + <string name="copyright_shapeshifter_library" translatable="false">Copyright (c) 2022, LEAP Encryption Access Project (info@leap.se)</string> <string name="shapeshifter_transports" translatable="false">Shapeshifter Transports</string> - <string name="copyright_shapeshifter_transports" translatable="false">Copyright (c) 2014, Yawning Angel (yawning at torproject dot org) \n All rights reserved.</string> - <string name="shapeshifter_dispatcher" translatable="false">Shapeshifter Dispatcher</string> - <string name="copyright_shapeshifter_dispatcher" translatable="false">Copyright (c) 2014, Yawning Angel (yawning at torproject dot org) \n All rights reserved.</string> + <string name="copyright_shapeshifter_transports" translatable="false">Copyright (c) 2020 Operator Foundation. Distributed under MIT license.</string> + <string name="obfs4" translatable="false">obfs4 - The obfourscator</string> + <string name="copyright_obfs4" translatable="false">Copyright (c) 2014, Yawning Angel yawning at schwanenlied dot me \n All rights reserved.</string> + <string name="snowflake" translatable="false">Snowflake</string> + <string name="copyright_snowflake" translatable="false">Copyright (c) 2016, Serene Han, Arlo Breault \n Copyright (c) 2019-2020, The Tor Project, Inc.\nDistributed under 3-clause BSD license.</string> + <string name="iptproxy" translatable="false">IPtProxy</string> + <string name="copyright_iptproxy" translatable="false">Copyright (c) 2020 - 2021 Benjamin Erhart (berhart@netzarchitekten.com). Distributed under the MIT License</string> + <string name="tor" translatable="false">Tor</string> + <string name="copyright_tor" translatable="false">Copyright (c) 2001-2004, Roger Dingledine \n Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson \n Copyright (c) 2007-2019, The Tor Project, Inc. \n Distributed under the 3-clause BSD license</string> + <string name="tor_android" translatable="false">Tor Android</string> + <string name="copyright_tor_android" translatable="false">Copyright (c) 2009-2010, Nathan Freitas, The Guardian Project. Distributed under the 3-clause BSD license.</string> <string name="circleImageView" translatable="false">CircleImageView</string> - <string name="copyright_circleImageView" translatable="false">Copyright 2014 - 2020 Henning Dodenhof. Licensed under the Apache License, Version 2.0 </string> + <string name="copyright_circleImageView" translatable="false">Copyright 2014 - 2022 Henning Dodenhof. Licensed under the Apache License, Version 2.0 </string> <!-- gateway selector, move to strings.xml, once the wording is clear --> <string name="no_location" translatable="false">---</string> |