diff --git a/app/build.gradle b/app/build.gradle index 7a1b0a7..ae2661a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "eu.neilalexander.yggdrasil" minSdkVersion 21 targetSdkVersion 29 - versionCode 11 - versionName "0.1-011" + versionCode 12 + versionName "0.1-012" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/eu/neilalexander/yggdrasil/ConfigurationProxy.kt b/app/src/main/java/eu/neilalexander/yggdrasil/ConfigurationProxy.kt index 4af8b3b..e5dd0ba 100644 --- a/app/src/main/java/eu/neilalexander/yggdrasil/ConfigurationProxy.kt +++ b/app/src/main/java/eu/neilalexander/yggdrasil/ConfigurationProxy.kt @@ -1,7 +1,6 @@ package eu.neilalexander.yggdrasil import android.content.Context -import android.provider.Settings import mobile.Mobile import org.json.JSONArray import org.json.JSONObject @@ -29,6 +28,21 @@ object ConfigurationProxy { fix() } + fun resetKeys() { + val newJson = JSONObject(String(Mobile.generateConfigJSON())) + updateJSON { json -> + json.put("PrivateKey", newJson.getString("PrivateKey")) + json.put("PublicKey", newJson.getString("PublicKey")) + } + } + + fun setKeys(privateKey: String, publicKey: String) { + updateJSON { json -> + json.put("PrivateKey", privateKey) + json.put("PublicKey", publicKey) + } + } + fun updateJSON(fn: (JSONObject) -> Unit) { json = JSONObject(file.readText(Charsets.UTF_8)) fn(json) diff --git a/app/src/main/java/eu/neilalexander/yggdrasil/SettingsActivity.kt b/app/src/main/java/eu/neilalexander/yggdrasil/SettingsActivity.kt index 11f9b32..b4e8779 100644 --- a/app/src/main/java/eu/neilalexander/yggdrasil/SettingsActivity.kt +++ b/app/src/main/java/eu/neilalexander/yggdrasil/SettingsActivity.kt @@ -7,6 +7,7 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.ContextThemeWrapper import android.view.LayoutInflater +import android.view.View import android.widget.* import androidx.core.widget.doOnTextChanged import org.json.JSONObject @@ -32,8 +33,8 @@ class SettingsActivity : AppCompatActivity() { deviceNameEntry.doOnTextChanged { text, _, _, _ -> config.updateJSON { cfg -> - val nodeinfo = cfg.optJSONObject("NodeInfo") - if (nodeinfo == null) { + val nodeInfo = cfg.optJSONObject("NodeInfo") + if (nodeInfo == null) { cfg.put("NodeInfo", JSONObject("{}")) } cfg.getJSONObject("NodeInfo").put("name", text) @@ -56,6 +57,29 @@ class SettingsActivity : AppCompatActivity() { builder.show() } + findViewById(R.id.resetKeysRow).setOnClickListener { + config.resetKeys() + updateView() + } + + findViewById(R.id.setKeysRow).setOnClickListener { + val view = inflater.inflate(R.layout.dialog_set_keys, null) + val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(this, R.style.Theme_MaterialComponents_DayNight_Dialog)) + val privateKey = view.findViewById(R.id.private_key) + val publicKey = view.findViewById(R.id.public_key) + builder.setTitle(getString(R.string.set_keys)) + builder.setView(view) + builder.setPositiveButton(getString(R.string.save)) { dialog, _ -> + config.setKeys(privateKey.text.toString(), publicKey.text.toString()) + updateView() + dialog.dismiss() + } + builder.setNegativeButton(getString(R.string.cancel)) { dialog, _ -> + dialog.cancel() + } + builder.show() + } + publicKeyLabel.setOnLongClickListener { val clipboard: ClipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("public key", publicKeyLabel.text) diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 6db6929..24bd1a4 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -211,7 +211,7 @@ android:layout_marginBottom="2pt" android:alpha="0.7" android:paddingRight="8pt" - android:text="@string/settings_reset" + android:text="@string/settings_config" android:textAllCaps="true" android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textSize="12sp" /> @@ -234,6 +234,26 @@ android:paddingBottom="2pt" android:showDividers="middle"> + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_addpeer.xml b/app/src/main/res/layout/dialog_addpeer.xml index 0e334d2..d75a471 100644 --- a/app/src/main/res/layout/dialog_addpeer.xml +++ b/app/src/main/res/layout/dialog_addpeer.xml @@ -16,7 +16,7 @@ android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="Enter the full URI of the peer to add. Yggdrasil will automatically connect to this peer when started." /> + android:text="@string/add_peer_help" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 29f00ea..0ee17d1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -38,6 +38,7 @@ Нет подключенных пиров Подключенные пиры Внимание + Конфигурация Сброс Состояние Включить Yggdrasil @@ -64,6 +65,7 @@ Эта информация публична и может появиться на картах сети. Публичный ключ Ваш публичный ключ идентифицирует вас в сети. Его распространение безопасно. + Сбросить ключи (и адрес IPv6) Сбросить настройки Сброс создаст полностью новые настройки. Это изменит ваш публичный ключ и адрес IP. Выключено @@ -76,4 +78,9 @@ Сервис VPN Главный канал нотификаций сервиса Нажмите здесь чтобы включить Yggdrasil. + Введите полный URI пира для добавления. Yggdrasil будет автоматически подключаться к нему при запуске. + Публичный ключ: + Приватный ключ: + Установить свои ключи + Сохранить \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a6d0538..96e6545 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,6 +38,7 @@ No peers currently connected Connected Peers Warning + Config Reset Status Enable Yggdrasil @@ -64,6 +65,7 @@ Information entered here is public and may be shown on network maps. Public Key Your public key forms your identity on the network. It is safe to be shared. + Regenerate keys (and IPv6-address) Reset configuration Resetting will overwrite with newly generated configuration. Your public keys and IP address on the network will change. Disabled @@ -76,4 +78,9 @@ VPN Service Main channel for foreground notification Tap here to enable Yggdrasil. + Enter the full URI of the peer to add. Yggdrasil will automatically connect to this peer when started. + Public key: + Private key: + Set your own keys + Save \ No newline at end of file