diff --git a/.gitignore b/.gitignore
index 661833e5..002a926a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,7 @@
.gradle
/build
*.iml
-/.idea/libraries
-/.idea/workspace.xml
-/.idea/caches
-/.idea/codeStyles
+/.idea
/local.properties
/captures
.externalNativeBuild
diff --git a/app/build.gradle b/app/build.gradle
index 61a6797b..0aa2c8f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -7,8 +7,8 @@ android {
applicationId "com.m2049r.xmrwallet"
minSdkVersion 21
targetSdkVersion 25
- versionCode 87
- versionName "1.4.7 'Monero Spedner'"
+ versionCode 90
+ versionName "1.5.0 'CrAzYpass'"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
@@ -66,7 +66,6 @@ dependencies {
implementation 'com.android.support:support-v4:25.4.0'
implementation 'com.android.support:recyclerview-v7:25.4.0'
implementation 'com.android.support:cardview-v7:25.4.0'
- implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
implementation "com.squareup.okhttp3:okhttp:$rootProject.ext.okHttpVersion"
diff --git a/app/src/main/cpp/monerujo.cpp b/app/src/main/cpp/monerujo.cpp
index 01f23425..a7adbb82 100644
--- a/app/src/main/cpp/monerujo.cpp
+++ b/app/src/main/cpp/monerujo.cpp
@@ -695,6 +695,23 @@ Java_com_m2049r_xmrwallet_model_Wallet_isSynchronized(JNIEnv *env, jobject insta
return static_cast(wallet->synchronized());
}
+//void cn_slow_hash(const void *data, size_t length, char *hash); // from crypto/hash-ops.h
+JNIEXPORT jbyteArray JNICALL
+Java_com_m2049r_xmrwallet_util_KeyStoreHelper_cnSlowHash(JNIEnv *env, jobject clazz,
+ jbyteArray data) {
+
+ jbyte *buffer = env->GetByteArrayElements(data, NULL);
+ jsize size = env->GetArrayLength(data);
+ char hash[HASH_SIZE];
+ cn_slow_hash(buffer, (size_t) size, hash);
+
+ env->ReleaseByteArrayElements(data, buffer, JNI_ABORT); // do not update java byte[]
+
+ jbyteArray result = env->NewByteArray(HASH_SIZE);
+ env->SetByteArrayRegion(result, 0, HASH_SIZE, (jbyte *) hash);
+ return result;
+}
+
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getDisplayAmount(JNIEnv *env, jobject clazz,
jlong amount) {
@@ -1083,7 +1100,8 @@ Java_com_m2049r_xmrwallet_model_PendingTransaction_getTxCount(JNIEnv *env, jobje
//static void error(const std::string &category, const std::string &str);
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_initLogger(JNIEnv *env, jobject instance,
- jstring argv0, jstring default_log_base_name) {
+ jstring argv0,
+ jstring default_log_base_name) {
const char *_argv0 = env->GetStringUTFChars(argv0, NULL);
const char *_default_log_base_name = env->GetStringUTFChars(default_log_base_name, NULL);
@@ -1109,7 +1127,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_logDebug(JNIEnv *env, jobject inst
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_logInfo(JNIEnv *env, jobject instance,
- jstring category, jstring message) {
+ jstring category, jstring message) {
const char *_category = env->GetStringUTFChars(category, NULL);
const char *_message = env->GetStringUTFChars(message, NULL);
@@ -1122,7 +1140,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_logInfo(JNIEnv *env, jobject insta
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_logWarning(JNIEnv *env, jobject instance,
- jstring category, jstring message) {
+ jstring category, jstring message) {
const char *_category = env->GetStringUTFChars(category, NULL);
const char *_message = env->GetStringUTFChars(message, NULL);
@@ -1149,11 +1167,10 @@ Java_com_m2049r_xmrwallet_model_WalletManager_logError(JNIEnv *env, jobject inst
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_setLogLevel(JNIEnv *env, jobject instance,
jint level) {
- Bitmonero::WalletManagerFactory::setLogLevel(level);
+ Bitmonero::WalletManagerFactory::setLogLevel(level);
}
-
#ifdef __cplusplus
}
#endif
diff --git a/app/src/main/cpp/monerujo.h b/app/src/main/cpp/monerujo.h
index 3315e022..de74f221 100644
--- a/app/src/main/cpp/monerujo.h
+++ b/app/src/main/cpp/monerujo.h
@@ -18,6 +18,7 @@
#define XMRWALLET_WALLET_LIB_H
#include
+
/*
#include
@@ -27,13 +28,13 @@
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
*/
-jfieldID getHandleField(JNIEnv *env, jobject obj, const char* fieldName = "handle") {
+jfieldID getHandleField(JNIEnv *env, jobject obj, const char *fieldName = "handle") {
jclass c = env->GetObjectClass(obj);
return env->GetFieldID(c, fieldName, "J"); // of type long
}
-template
-T *getHandle(JNIEnv *env, jobject obj, const char* fieldName = "handle") {
+template
+T *getHandle(JNIEnv *env, jobject obj, const char *fieldName = "handle") {
jlong handle = env->GetLongField(obj, getHandleField(env, obj, fieldName));
return reinterpret_cast(handle);
}
@@ -42,10 +43,27 @@ void setHandleFromLong(JNIEnv *env, jobject obj, jlong handle) {
env->SetLongField(obj, getHandleField(env, obj), handle);
}
-template
+template
void setHandle(JNIEnv *env, jobject obj, T *t) {
jlong handle = reinterpret_cast(t);
setHandleFromLong(env, obj, handle);
}
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+// from monero-core crypto/hash-ops.h - avoid #including monero code here
+enum {
+ HASH_SIZE = 32,
+ HASH_DATA_AREA = 136
+};
+
+void cn_slow_hash(const void *data, size_t length, char *hash);
+
+#ifdef __cplusplus
+}
+#endif
+
#endif //XMRWALLET_WALLET_LIB_H
diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
index c2b59562..a1726074 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
@@ -34,6 +34,7 @@ import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.TextView;
+import com.m2049r.xmrwallet.util.KeyStoreHelper;
import com.m2049r.xmrwallet.util.RestoreHeight;
import com.m2049r.xmrwallet.widget.Toolbar;
import com.m2049r.xmrwallet.model.Wallet;
@@ -424,17 +425,20 @@ public class GenerateFragment extends Fragment {
String name = etWalletName.getEditText().getText().toString();
String password = etWalletPassword.getEditText().getText().toString();
+ // create the real wallet password
+ String crazyPass = KeyStoreHelper.getCrazyPass(getActivity(), password);
+
long height = getHeight();
if (height < 0) height = 0;
if (type.equals(TYPE_NEW)) {
bGenerate.setEnabled(false);
- activityCallback.onGenerate(name, password);
+ activityCallback.onGenerate(name, crazyPass);
} else if (type.equals(TYPE_SEED)) {
if (!checkMnemonic()) return;
String seed = etWalletMnemonic.getEditText().getText().toString();
bGenerate.setEnabled(false);
- activityCallback.onGenerate(name, password, seed, height);
+ activityCallback.onGenerate(name, crazyPass, seed, height);
} else if (type.equals(TYPE_KEY) || type.equals(TYPE_VIEWONLY)) {
if (checkAddress() && checkViewKey() && checkSpendKey()) {
bGenerate.setEnabled(false);
@@ -444,7 +448,7 @@ public class GenerateFragment extends Fragment {
if (type.equals(TYPE_KEY)) {
spendKey = etWalletSpendKey.getEditText().getText().toString();
}
- activityCallback.onGenerate(name, password, address, viewKey, spendKey, height);
+ activityCallback.onGenerate(name, crazyPass, address, viewKey, spendKey, height);
}
}
}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
index 97a4b330..b99a271b 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
@@ -16,16 +16,23 @@
package com.m2049r.xmrwallet;
+import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
+import android.support.design.widget.TextInputLayout;
import android.support.v4.app.Fragment;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
@@ -35,12 +42,15 @@ import android.widget.TextView;
import android.widget.Toast;
import com.m2049r.xmrwallet.model.NetworkType;
+import com.m2049r.xmrwallet.util.KeyStoreHelper;
import com.m2049r.xmrwallet.widget.Toolbar;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
+import java.io.File;
+
import timber.log.Timber;
public class GenerateReviewFragment extends Fragment {
@@ -51,7 +61,6 @@ public class GenerateReviewFragment extends Fragment {
ScrollView scrollview;
ProgressBar pbProgress;
- TextView tvWalletName;
TextView tvWalletPassword;
TextView tvWalletAddress;
TextView tvWalletMnemonic;
@@ -59,9 +68,18 @@ public class GenerateReviewFragment extends Fragment {
TextView tvWalletSpendKey;
ImageButton bCopyAddress;
LinearLayout llAdvancedInfo;
+ LinearLayout llPassword;
Button bAdvancedInfo;
Button bAccept;
+ // TODO fix visibility of variables
+ String walletPath;
+ String walletName;
+ // we need to keep the password so the user is not asked again if they want to change it
+ // note they can only enter this fragment immediately after entering the password
+ // so asking them to enter it a couple of seconds later seems silly
+ String walletPassword = null;
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -70,7 +88,6 @@ public class GenerateReviewFragment extends Fragment {
scrollview = (ScrollView) view.findViewById(R.id.scrollview);
pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress);
- tvWalletName = (TextView) view.findViewById(R.id.tvWalletName);
tvWalletPassword = (TextView) view.findViewById(R.id.tvWalletPassword);
tvWalletAddress = (TextView) view.findViewById(R.id.tvWalletAddress);
tvWalletViewKey = (TextView) view.findViewById(R.id.tvWalletViewKey);
@@ -79,12 +96,14 @@ public class GenerateReviewFragment extends Fragment {
bCopyAddress = (ImageButton) view.findViewById(R.id.bCopyAddress);
bAdvancedInfo = (Button) view.findViewById(R.id.bAdvancedInfo);
llAdvancedInfo = (LinearLayout) view.findViewById(R.id.llAdvancedInfo);
+ llPassword = (LinearLayout) view.findViewById(R.id.llPassword);
bAccept = (Button) view.findViewById(R.id.bAccept);
boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet;
tvWalletMnemonic.setTextIsSelectable(testnet);
tvWalletSpendKey.setTextIsSelectable(testnet);
+ tvWalletPassword.setTextIsSelectable(testnet);
bAccept.setOnClickListener(new View.OnClickListener() {
@Override
@@ -112,17 +131,20 @@ public class GenerateReviewFragment extends Fragment {
}
});
- showProgress();
-
Bundle args = getArguments();
- String path = args.getString("path");
- String password = args.getString("password");
- this.type = args.getString("type");
- new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR,
- path, password);
+ type = args.getString("type");
+ walletPath = args.getString("path");
+ showDetails(args.getString("password"));
return view;
}
+ void showDetails(String password) {
+ walletPassword = password;
+ showProgress();
+ tvWalletPassword.setText(null);
+ new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath);
+ }
+
void copyViewKey() {
Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_viewkey), tvWalletViewKey.getText().toString());
Toast.makeText(getActivity(), getString(R.string.message_copy_viewkey), Toast.LENGTH_SHORT).show();
@@ -151,15 +173,11 @@ public class GenerateReviewFragment extends Fragment {
String type;
private void acceptWallet() {
- String name = tvWalletName.getText().toString();
- String password = tvWalletPassword.getText().toString();
bAccept.setEnabled(false);
- acceptCallback.onAccept(name, password);
+ acceptCallback.onAccept(walletName, walletPassword);
}
private class AsyncShow extends AsyncTask {
- String password;
-
String name;
String address;
String seed;
@@ -170,9 +188,8 @@ public class GenerateReviewFragment extends Fragment {
@Override
protected Boolean doInBackground(String... params) {
- if (params.length != 2) return false;
+ if (params.length != 1) return false;
String walletPath = params[0];
- password = params[1];
Wallet wallet;
boolean closeWallet;
@@ -180,7 +197,7 @@ public class GenerateReviewFragment extends Fragment {
wallet = GenerateReviewFragment.this.walletCallback.getWallet();
closeWallet = false;
} else {
- wallet = WalletManager.getInstance().openWallet(walletPath, password);
+ wallet = WalletManager.getInstance().openWallet(walletPath, walletPassword);
closeWallet = true;
}
name = wallet.getName();
@@ -204,13 +221,16 @@ public class GenerateReviewFragment extends Fragment {
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (!isAdded()) return; // never mind
- tvWalletName.setText(name);
+ walletName = name;
if (result) {
if (type.equals(GenerateReviewFragment.VIEW_TYPE_ACCEPT)) {
- tvWalletPassword.setText(password);
bAccept.setVisibility(View.VISIBLE);
bAccept.setEnabled(true);
}
+ if (walletPassword != null) {
+ llPassword.setVisibility(View.VISIBLE);
+ tvWalletPassword.setText(walletPassword);
+ }
tvWalletAddress.setText(address);
tvWalletMnemonic.setText(seed);
tvWalletViewKey.setText(viewKey);
@@ -233,6 +253,7 @@ public class GenerateReviewFragment extends Fragment {
}
Listener activityCallback = null;
+ ProgressListener progressCallback = null;
AcceptListener acceptCallback = null;
ListenerWithWallet walletCallback = null;
@@ -242,6 +263,13 @@ public class GenerateReviewFragment extends Fragment {
void setToolbarButton(int type);
}
+ public interface ProgressListener {
+ void showProgressDialog(int msgId);
+
+ void dismissProgressDialog();
+ }
+
+
public interface AcceptListener {
void onAccept(String name, String password);
}
@@ -256,6 +284,9 @@ public class GenerateReviewFragment extends Fragment {
if (context instanceof Listener) {
this.activityCallback = (Listener) context;
}
+ if (context instanceof ProgressListener) {
+ this.progressCallback = (ProgressListener) context;
+ }
if (context instanceof AcceptListener) {
this.acceptCallback = (AcceptListener) context;
}
@@ -268,9 +299,7 @@ public class GenerateReviewFragment extends Fragment {
public void onResume() {
super.onResume();
Timber.d("onResume()");
- String name = tvWalletName.getText().toString();
- if (name.isEmpty()) name = null;
- activityCallback.setTitle(name, getString(R.string.details_title));
+ activityCallback.setTitle(walletName, getString(R.string.details_title));
activityCallback.setToolbarButton(
GenerateReviewFragment.VIEW_TYPE_ACCEPT.equals(type) ? Toolbar.BUTTON_NONE : Toolbar.BUTTON_BACK);
}
@@ -295,7 +324,198 @@ public class GenerateReviewFragment extends Fragment {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- inflater.inflate(R.menu.wallet_details_menu, menu);
- super.onCreateOptionsMenu(menu, inflater);
+ String type = getArguments().getString("type");
+ if (GenerateReviewFragment.VIEW_TYPE_ACCEPT.equals(type)) {
+ inflater.inflate(R.menu.wallet_details_help_menu, menu);
+ super.onCreateOptionsMenu(menu, inflater);
+ } else {
+ inflater.inflate(R.menu.wallet_details_menu, menu);
+ super.onCreateOptionsMenu(menu, inflater);
+ }
}
+
+ boolean changeWalletPassword(String newPassword) {
+ Wallet wallet;
+ boolean closeWallet;
+ if (type.equals(GenerateReviewFragment.VIEW_TYPE_WALLET)) {
+ wallet = GenerateReviewFragment.this.walletCallback.getWallet();
+ closeWallet = false;
+ } else {
+ wallet = WalletManager.getInstance().openWallet(walletPath, walletPassword);
+ closeWallet = true;
+ }
+
+ boolean ok = false;
+ if (wallet.getStatus() == Wallet.Status.Status_Ok) {
+ wallet.setPassword(newPassword);
+ wallet.store();
+ ok = true;
+ } else {
+ Timber.e(wallet.getErrorString());
+ }
+ if (closeWallet) wallet.close();
+ return ok;
+ }
+
+ private class AsyncChangePassword extends AsyncTask {
+ String newPassword;
+
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+ if (progressCallback != null)
+ progressCallback.showProgressDialog(R.string.changepw_progress);
+ }
+
+ @Override
+ protected Boolean doInBackground(String... params) {
+ if (params.length != 3) return false;
+ File walletFile = Helper.getWalletFile(getActivity(), params[0]);
+ String oldPassword = params[1];
+ String userPassword = params[2];
+ newPassword = KeyStoreHelper.getCrazyPass(getActivity(), userPassword);
+ return changeWalletPassword(newPassword);
+ }
+
+ @Override
+ protected void onPostExecute(Boolean result) {
+ super.onPostExecute(result);
+ if (getActivity().isDestroyed()) {
+ return;
+ }
+ if (progressCallback != null)
+ progressCallback.dismissProgressDialog();
+ if (result) {
+ Toast.makeText(getActivity(), getString(R.string.changepw_success), Toast.LENGTH_SHORT).show();
+ showDetails(newPassword);
+ } else {
+ Toast.makeText(getActivity(), getString(R.string.changepw_failed), Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+
+ AlertDialog openDialog = null; // for preventing opening of multiple dialogs
+
+ public AlertDialog createChangePasswordDialog() {
+ if (openDialog != null) return null; // we are already open
+ LayoutInflater li = LayoutInflater.from(getActivity());
+ View promptsView = li.inflate(R.layout.prompt_changepw, null);
+
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
+ alertDialogBuilder.setView(promptsView);
+
+ final TextInputLayout etPasswordA = (TextInputLayout) promptsView.findViewById(R.id.etWalletPasswordA);
+ etPasswordA.setHint(getString(R.string.prompt_changepw, walletName));
+
+ final TextInputLayout etPasswordB = (TextInputLayout) promptsView.findViewById(R.id.etWalletPasswordB);
+ etPasswordB.setHint(getString(R.string.prompt_changepwB, walletName));
+
+ etPasswordA.getEditText().addTextChangedListener(new TextWatcher() {
+ @Override
+ public void afterTextChanged(Editable s) {
+ if (etPasswordA.getError() != null) {
+ etPasswordA.setError(null);
+ }
+ if (etPasswordB.getError() != null) {
+ etPasswordB.setError(null);
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start,
+ int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start,
+ int before, int count) {
+ }
+ });
+
+ etPasswordB.getEditText().addTextChangedListener(new TextWatcher() {
+ @Override
+ public void afterTextChanged(Editable s) {
+ if (etPasswordA.getError() != null) {
+ etPasswordA.setError(null);
+ }
+ if (etPasswordB.getError() != null) {
+ etPasswordB.setError(null);
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start,
+ int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start,
+ int before, int count) {
+ }
+ });
+
+ // set dialog message
+ alertDialogBuilder
+ .setCancelable(false)
+ .setPositiveButton(getString(R.string.label_ok), null)
+ .setNegativeButton(getString(R.string.label_cancel),
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ Helper.hideKeyboardAlways(getActivity());
+ dialog.cancel();
+ openDialog = null;
+ }
+ });
+
+ openDialog = alertDialogBuilder.create();
+ openDialog.setOnShowListener(new DialogInterface.OnShowListener() {
+ @Override
+ public void onShow(final DialogInterface dialog) {
+ Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ String newPasswordA = etPasswordA.getEditText().getText().toString();
+ String newPasswordB = etPasswordB.getEditText().getText().toString();
+ // disallow empty passwords
+ if (newPasswordA.isEmpty()) {
+ etPasswordA.setError(getString(R.string.generate_empty_passwordB));
+ } else if (!newPasswordA.equals(newPasswordB)) {
+ etPasswordB.setError(getString(R.string.generate_bad_passwordB));
+ } else if (newPasswordA.equals(newPasswordB)) {
+ new AsyncChangePassword().execute(walletName, walletPassword, newPasswordA);
+ Helper.hideKeyboardAlways(getActivity());
+ openDialog.dismiss();
+ openDialog = null;
+ }
+ }
+ });
+ }
+ });
+
+ // accept keyboard "ok"
+ etPasswordB.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
+ String newPasswordA = etPasswordA.getEditText().getText().toString();
+ String newPasswordB = etPasswordB.getEditText().getText().toString();
+ // disallow empty passwords
+ if (newPasswordA.isEmpty()) {
+ etPasswordA.setError(getString(R.string.generate_empty_passwordB));
+ } else if (!newPasswordA.equals(newPasswordB)) {
+ etPasswordB.setError(getString(R.string.generate_bad_passwordB));
+ } else if (newPasswordA.equals(newPasswordB)) {
+ new AsyncChangePassword().execute(walletName, walletPassword, newPasswordA);
+ Helper.hideKeyboardAlways(getActivity());
+ openDialog.dismiss();
+ openDialog = null;
+ }
+ return true;
+ }
+ return false;
+ }
+ });
+ return openDialog;
+ }
+
}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
index 271d084f..3e458d1a 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
@@ -54,7 +54,9 @@ import com.m2049r.xmrwallet.model.NetworkType;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.service.WalletService;
+import com.m2049r.xmrwallet.util.CrazyPassEncoder;
import com.m2049r.xmrwallet.util.Helper;
+import com.m2049r.xmrwallet.util.KeyStoreHelper;
import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
import com.m2049r.xmrwallet.widget.Toolbar;
@@ -71,7 +73,8 @@ import timber.log.Timber;
public class LoginActivity extends SecureActivity
implements LoginFragment.Listener, GenerateFragment.Listener,
- GenerateReviewFragment.Listener, GenerateReviewFragment.AcceptListener, ReceiveFragment.Listener {
+ GenerateReviewFragment.Listener, GenerateReviewFragment.AcceptListener,
+ GenerateReviewFragment.ProgressListener, ReceiveFragment.Listener {
private static final String GENERATE_STACK = "gen";
static final int DAEMON_TIMEOUT = 500; // deamon must respond in 500ms
@@ -437,16 +440,30 @@ public class LoginActivity extends SecureActivity
}
}
+ public void onWalletChangePassword() {//final String walletName, final String walletPassword) {
+ try {
+ GenerateReviewFragment detailsFragment = (GenerateReviewFragment)
+ getSupportFragmentManager().findFragmentById(R.id.fragment_container);
+ AlertDialog dialog = detailsFragment.createChangePasswordDialog();
+ if (dialog != null) {
+ Helper.showKeyboard(dialog);
+ dialog.show();
+ }
+ } catch (ClassCastException ex) {
+ Timber.w("onWalletChangePassword() called, but no GenerateReviewFragment active");
+ }
+ }
+
@Override
public void onAddWallet(String type) {
if (checkServiceRunning()) return;
startGenerateFragment(type);
}
- AlertDialog passwordDialog = null; // for preventing multiple clicks in wallet list
+ AlertDialog openDialog = null; // for preventing opening of multiple dialogs
void promptPassword(final String wallet, final PasswordAction action) {
- if (passwordDialog != null) return; // we are already asking for password
+ if (openDialog != null) return; // we are already asking for password
Context context = LoginActivity.this;
LayoutInflater li = LayoutInflater.from(context);
View promptsView = li.inflate(R.layout.prompt_password, null);
@@ -486,12 +503,12 @@ public class LoginActivity extends SecureActivity
public void onClick(DialogInterface dialog, int id) {
Helper.hideKeyboardAlways(LoginActivity.this);
dialog.cancel();
- passwordDialog = null;
+ openDialog = null;
}
});
- passwordDialog = alertDialogBuilder.create();
+ openDialog = alertDialogBuilder.create();
- passwordDialog.setOnShowListener(new DialogInterface.OnShowListener() {
+ openDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
@@ -501,8 +518,8 @@ public class LoginActivity extends SecureActivity
String pass = etPassword.getEditText().getText().toString();
if (processPasswordEntry(wallet, pass, action)) {
Helper.hideKeyboardAlways(LoginActivity.this);
- passwordDialog.dismiss();
- passwordDialog = null;
+ openDialog.dismiss();
+ openDialog = null;
} else {
etPassword.setError(getString(R.string.bad_password));
}
@@ -511,8 +528,6 @@ public class LoginActivity extends SecureActivity
}
});
- Helper.showKeyboard(passwordDialog);
-
// accept keyboard "ok"
etPassword.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
@@ -520,8 +535,8 @@ public class LoginActivity extends SecureActivity
String pass = etPassword.getEditText().getText().toString();
if (processPasswordEntry(wallet, pass, action)) {
Helper.hideKeyboardAlways(LoginActivity.this);
- passwordDialog.dismiss();
- passwordDialog = null;
+ openDialog.dismiss();
+ openDialog = null;
} else {
etPassword.setError(getString(R.string.bad_password));
}
@@ -531,14 +546,37 @@ public class LoginActivity extends SecureActivity
}
});
- passwordDialog.show();
+ Helper.showKeyboard(openDialog);
+ openDialog.show();
}
- private boolean checkWalletPassword(String walletName, String password) {
+ // try to figure out what the real wallet password is given the user password
+ // which could be the actual wallet password or a (maybe malformed) CrAzYpass
+ // or the password used to derive the CrAzYpass for the wallet
+ private String getWalletPassword(String walletName, String password) {
String walletPath = new File(Helper.getWalletRoot(getApplicationContext()),
walletName + ".keys").getAbsolutePath();
- // only test view key
- return WalletManager.getInstance().verifyWalletPassword(walletPath, password, true);
+
+ // try with entered password (which could be a legacy password or a CrAzYpass)
+ if (WalletManager.getInstance().verifyWalletPassword(walletPath, password, true)) {
+ return password;
+ }
+
+ // maybe this is a malformed CrAzYpass?
+ String possibleCrazyPass = CrazyPassEncoder.reformat(password);
+ if (possibleCrazyPass != null) { // looks like a CrAzYpass
+ if (WalletManager.getInstance().verifyWalletPassword(walletPath, possibleCrazyPass, true)) {
+ return possibleCrazyPass;
+ }
+ }
+
+ // generate & try with CrAzYpass
+ String crazyPass = KeyStoreHelper.getCrazyPass(this, password);
+ if (WalletManager.getInstance().verifyWalletPassword(walletPath, crazyPass, true)) {
+ return crazyPass;
+ }
+
+ return null;
}
interface PasswordAction {
@@ -546,8 +584,9 @@ public class LoginActivity extends SecureActivity
}
private boolean processPasswordEntry(String walletName, String pass, PasswordAction action) {
- if (checkWalletPassword(walletName, pass)) {
- action.action(walletName, pass);
+ String walletPassword = getWalletPassword(walletName, pass);
+ if (walletPassword != null) {
+ action.action(walletName, walletPassword);
return true;
} else {
return false;
@@ -598,7 +637,8 @@ public class LoginActivity extends SecureActivity
ProgressDialog progressDialog = null;
- private void showProgressDialog(int msgId) {
+ @Override
+ public void showProgressDialog(int msgId) {
showProgressDialog(msgId, 0);
}
@@ -617,7 +657,8 @@ public class LoginActivity extends SecureActivity
}
}
- private void dismissProgressDialog() {
+ @Override
+ public void dismissProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
@@ -1077,6 +1118,9 @@ public class LoginActivity extends SecureActivity
case R.id.action_details_help:
HelpFragment.display(getSupportFragmentManager(), R.string.help_details);
return true;
+ case R.id.action_details_changepw:
+ onWalletChangePassword();
+ return true;
case R.id.action_license_info:
AboutFragment.display(getSupportFragmentManager());
return true;
diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
index 0108baa0..87284258 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
@@ -174,6 +174,9 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
case R.id.action_details_help:
HelpFragment.display(getSupportFragmentManager(), R.string.help_details);
return true;
+ case R.id.action_details_changepw:
+ onWalletChangePassword();
+ return true;
case R.id.action_help_send:
HelpFragment.display(getSupportFragmentManager(), R.string.help_send);
return true;
@@ -182,6 +185,20 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
}
}
+ public void onWalletChangePassword() {//final String walletName, final String walletPassword) {
+ try {
+ GenerateReviewFragment detailsFragment = (GenerateReviewFragment)
+ getSupportFragmentManager().findFragmentById(R.id.fragment_container);
+ AlertDialog dialog = detailsFragment.createChangePasswordDialog();
+ if (dialog != null) {
+ Helper.showKeyboard(dialog);
+ dialog.show();
+ }
+ } catch (ClassCastException ex) {
+ Timber.w("onWalletChangePassword() called, but no GenerateReviewFragment active");
+ }
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
Timber.d("onCreate()");
@@ -682,6 +699,7 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
case DialogInterface.BUTTON_POSITIVE:
Bundle extras = new Bundle();
extras.putString("type", GenerateReviewFragment.VIEW_TYPE_WALLET);
+ extras.putString("password", getIntent().getExtras().getString(REQUEST_PW));
replaceFragment(new GenerateReviewFragment(), null, extras);
break;
case DialogInterface.BUTTON_NEGATIVE:
diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java
index c5e61e24..bdafc043 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java
@@ -291,7 +291,7 @@ public class SendFragment extends Fragment
pagerAdapter.notifyDataSetChanged();
}
});
- Timber.d("New Mode = " + mode.toString());
+ Timber.d("New Mode = %s", mode.toString());
}
}
@@ -350,7 +350,7 @@ public class SendFragment extends Fragment
@Override
public SendWizardFragment getItem(int position) {
Timber.d("getItem(%d) CREATE", position);
- Timber.d("Mode=" + mode.toString());
+ Timber.d("Mode=%s", mode.toString());
if (mode == Mode.XMR) {
switch (position) {
case POS_ADDRESS:
diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
index 76ab0c4c..7c205561 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
@@ -275,5 +275,4 @@ public class Wallet {
//virtual bool parse_uri(const std::string &uri, std::string &address, std::string &payment_id, uint64_t &tvAmount, std::string &tx_description, std::string &recipient_name, std::vector &unknown_parameters, std::string &error) = 0;
//virtual bool rescanSpent() = 0;
-
}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
index 47b2ed18..5bd6a68e 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
@@ -271,6 +271,7 @@ public class WalletManager {
//TODO static std::tuple checkUpdates(const std::string &software, const std::string &subdir);
static public native void initLogger(String argv0, String defaultLogBaseName);
+
//TODO: maybe put these in an enum like in monero core - but why?
static public int LOGLEVEL_SILENT = -1;
static public int LOGLEVEL_WARN = 0;
@@ -278,9 +279,14 @@ public class WalletManager {
static public int LOGLEVEL_DEBUG = 2;
static public int LOGLEVEL_TRACE = 3;
static public int LOGLEVEL_MAX = 4;
+
static public native void setLogLevel(int level);
+
static public native void logDebug(String category, String message);
+
static public native void logInfo(String category, String message);
+
static public native void logWarning(String category, String message);
+
static public native void logError(String category, String message);
}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/CrazyPassEncoder.java b/app/src/main/java/com/m2049r/xmrwallet/util/CrazyPassEncoder.java
new file mode 100644
index 00000000..cd884d71
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/util/CrazyPassEncoder.java
@@ -0,0 +1,54 @@
+package com.m2049r.xmrwallet.util;
+
+import com.m2049r.xmrwallet.model.WalletManager;
+
+import java.math.BigInteger;
+
+public class CrazyPassEncoder {
+ static final String BASE = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
+ static final int PW_CHARS = 52;
+
+ // this takes a 32 byte buffer and converts it to 52 alphnumeric characters
+ // separated by blanks every 4 characters = 13 groups of 4
+ // always (padding by Xs if need be
+ static public String encode(byte[] data) {
+ if (data.length != 32) throw new IllegalArgumentException("data[] is not 32 bytes long");
+ BigInteger rest = new BigInteger(1, data);
+ BigInteger remainder;
+ final StringBuilder result = new StringBuilder();
+ final BigInteger base = BigInteger.valueOf(BASE.length());
+ int i = 0;
+ do {
+ if ((i > 0) && (i % 4 == 0)) result.append(' ');
+ i++;
+ remainder = rest.remainder(base);
+ rest = rest.divide(base);
+ result.append(BASE.charAt(remainder.intValue()));
+ } while (!BigInteger.ZERO.equals(rest));
+ // pad it
+ while (i < PW_CHARS) {
+ if ((i > 0) && (i % 4 == 0)) result.append(' ');
+ result.append('2');
+ i++;
+ }
+ return result.toString();
+ }
+
+ static public String reformat(String password) {
+ // maybe this is a CrAzYpass without blanks? or lowercase letters
+ String noBlanks = password.toUpperCase().replaceAll(" ", "");
+ if (noBlanks.length() == PW_CHARS) { // looks like a CrAzYpass
+ // insert blanks every 4 characters
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < PW_CHARS; i++) {
+ if ((i > 0) && (i % 4 == 0)) sb.append(' ');
+ char c = noBlanks.charAt(i);
+ if (BASE.indexOf(c) < 0) return null; // invalid character found
+ sb.append(c);
+ }
+ return sb.toString();
+ } else {
+ return null; // not a CrAzYpass
+ }
+ }
+}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
index db5d8233..7bc83572 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
@@ -47,6 +47,7 @@ import com.m2049r.xmrwallet.model.WalletManager;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
@@ -280,6 +281,14 @@ public class Helper {
}
}
+ private final static char[] HexArray = "0123456789ABCDEF".toCharArray();
+
+ public static String bytesToHex(byte[] data) {
+ if ((data != null) && (data.length > 0))
+ return String.format("%0" + (data.length * 2) + "X", new BigInteger(1, data));
+ else return "";
+ }
+
static public void setMoneroHome(Context context) {
try {
String home = getStorage(context, HOME_DIR).getAbsolutePath();
diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/KeyStoreHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/KeyStoreHelper.java
new file mode 100644
index 00000000..ea49cd54
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/util/KeyStoreHelper.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2018 m2049r
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.m2049r.xmrwallet.util;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.security.KeyPairGeneratorSpec;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyProperties;
+
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import javax.security.auth.x500.X500Principal;
+
+import timber.log.Timber;
+
+public class KeyStoreHelper {
+
+ static {
+ System.loadLibrary("monerujo");
+ }
+
+ public static native byte[] cnSlowHash(byte[] data);
+
+ static final private String RSA_ALIAS = "MonerujoRSA";
+
+ public static String getCrazyPass(Context context, String password) {
+ // TODO we should check Locale.getDefault().getLanguage() here but for now we default to English
+ return getCrazyPass(context, password, "English");
+ }
+
+ public static String getCrazyPass(Context context, String password, String language) {
+ byte[] data = password.getBytes(StandardCharsets.UTF_8);
+ byte[] sig = null;
+ try {
+ KeyStoreHelper.createKeys(context, RSA_ALIAS);
+ sig = KeyStoreHelper.signData(RSA_ALIAS, data);
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ return CrazyPassEncoder.encode(cnSlowHash(sig));
+ }
+
+ /**
+ * Creates a public and private key and stores it using the Android Key
+ * Store, so that only this application will be able to access the keys.
+ */
+ public static void createKeys(Context context, String alias) throws NoSuchProviderException,
+ NoSuchAlgorithmException, InvalidAlgorithmParameterException, KeyStoreException {
+ KeyStore keyStore = KeyStore.getInstance(SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
+ try {
+ keyStore.load(null);
+ } catch (Exception ex) { // don't care why it failed
+ throw new IllegalStateException("Could not load KeySotre", ex);
+ }
+ if (!keyStore.containsAlias(alias)) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ createKeysJBMR2(context, alias);
+ } else {
+ createKeysM(alias);
+ }
+ }
+ }
+
+ public static void deleteKeys(String alias) throws KeyStoreException {
+ KeyStore keyStore = KeyStore.getInstance(SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
+ try {
+ keyStore.load(null);
+ keyStore.deleteEntry(alias);
+ } catch (Exception ex) { // don't care why it failed
+ throw new IllegalStateException("Could not load KeySotre", ex);
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
+ private static void createKeysJBMR2(Context context, String alias) throws NoSuchProviderException,
+ NoSuchAlgorithmException, InvalidAlgorithmParameterException {
+
+ Calendar start = new GregorianCalendar();
+ Calendar end = new GregorianCalendar();
+ end.add(Calendar.YEAR, 300);
+
+ KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
+ .setAlias(alias)
+ .setSubject(new X500Principal("CN=" + alias))
+ .setSerialNumber(BigInteger.valueOf(Math.abs(alias.hashCode())))
+ .setStartDate(start.getTime()).setEndDate(end.getTime())
+ .build();
+ // defaults to 2048 bit modulus
+ KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance(
+ SecurityConstants.TYPE_RSA,
+ SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
+ kpGenerator.initialize(spec);
+ KeyPair kp = kpGenerator.generateKeyPair();
+ Timber.d("preM Keys created");
+ }
+
+ @TargetApi(Build.VERSION_CODES.M)
+ private static void createKeysM(String alias) {
+ try {
+ KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
+ KeyProperties.KEY_ALGORITHM_RSA, SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
+ keyPairGenerator.initialize(
+ new KeyGenParameterSpec.Builder(
+ alias, KeyProperties.PURPOSE_SIGN)
+ .setDigests(KeyProperties.DIGEST_SHA256)
+ .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+ .build());
+ KeyPair keyPair = keyPairGenerator.generateKeyPair();
+ Timber.d("M Keys created");
+ } catch (NoSuchProviderException | NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static KeyStore.PrivateKeyEntry getPrivateKeyEntry(String alias) {
+ try {
+ KeyStore ks = KeyStore
+ .getInstance(SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
+ ks.load(null);
+ KeyStore.Entry entry = ks.getEntry(alias, null);
+
+ if (entry == null) {
+ Timber.w("No key found under alias: %s", alias);
+ return null;
+ }
+
+ if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
+ Timber.w("Not an instance of a PrivateKeyEntry");
+ return null;
+ }
+ return (KeyStore.PrivateKeyEntry) entry;
+ } catch (Exception ex) {
+ Timber.e(ex);
+ return null;
+ }
+ }
+
+ /**
+ * Signs the data using the key pair stored in the Android Key Store. This
+ * signature can be used with the data later to verify it was signed by this
+ * application.
+ *
+ * @return The data signature generated
+ */
+ public static byte[] signData(String alias, byte[] data) throws NoSuchAlgorithmException,
+ InvalidKeyException, SignatureException {
+
+ PrivateKey privateKey = getPrivateKeyEntry(alias).getPrivateKey();
+ Signature s = Signature.getInstance(SecurityConstants.SIGNATURE_SHA256withRSA);
+ s.initSign(privateKey);
+ s.update(data);
+ return s.sign();
+ }
+
+ /**
+ * Given some data and a signature, uses the key pair stored in the Android
+ * Key Store to verify that the data was signed by this application, using
+ * that key pair.
+ *
+ * @param data The data to be verified.
+ * @param signature The signature provided for the data.
+ * @return A boolean value telling you whether the signature is valid or
+ * not.
+ */
+ public static boolean verifyData(String alias, byte[] data, byte[] signature)
+ throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+
+ // Make sure the signature string exists
+ if (signature == null) {
+ Timber.w("Invalid signature.");
+ return false;
+ }
+
+ KeyStore.PrivateKeyEntry keyEntry = getPrivateKeyEntry(alias);
+ Signature s = Signature.getInstance(SecurityConstants.SIGNATURE_SHA256withRSA);
+ s.initVerify(keyEntry.getCertificate());
+ s.update(data);
+ return s.verify(signature);
+ }
+
+ public interface SecurityConstants {
+ String KEYSTORE_PROVIDER_ANDROID_KEYSTORE = "AndroidKeyStore";
+ String TYPE_RSA = "RSA";
+ String SIGNATURE_SHA256withRSA = "SHA256withRSA";
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_review.xml b/app/src/main/res/layout/fragment_review.xml
index fb847763..569a665b 100644
--- a/app/src/main/res/layout/fragment_review.xml
+++ b/app/src/main/res/layout/fragment_review.xml
@@ -1,5 +1,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:textAlignment="center"
+ tools:text="49RBjxQ2zgf7t17w7So9ngcEY9obKzsrr6Dsah24MNSMiMBEeiYPP5CCTBq4GpZcEYN5Zf3upsLiwd5PezePE1i4Tf3rryY" />
+ android:textAlignment="center"
+ tools:text="tucks slackens vehicle doctor oaks aloof balding knife rays wise haggled cuisine navy ladder suitcase dusted last thorn pixels karate ticket nibs violin zapped slackens" />
+
+
+
+
+
+
+
+ android:textAlignment="center"
+ tools:text="e4aba454d78799dbd8d576bf70e7f15a06e91f1ecfd404053f91519a48df2a0e" />
-
-
-
-
+
+ android:textAlignment="center"
+ tools:text="4925a6254d2dff71df53f13b8334f9ceda6cdd5821aa895f7de1d2640500740d" />
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/prompt_changepw.xml b/app/src/main/res/layout/prompt_changepw.xml
new file mode 100644
index 00000000..94c3c33f
--- /dev/null
+++ b/app/src/main/res/layout/prompt_changepw.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/wallet_details_help_menu.xml b/app/src/main/res/menu/wallet_details_help_menu.xml
new file mode 100644
index 00000000..92a8067a
--- /dev/null
+++ b/app/src/main/res/menu/wallet_details_help_menu.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/wallet_details_menu.xml b/app/src/main/res/menu/wallet_details_menu.xml
index 794aaebf..45dc6d7c 100644
--- a/app/src/main/res/menu/wallet_details_menu.xml
+++ b/app/src/main/res/menu/wallet_details_menu.xml
@@ -7,6 +7,12 @@
android:icon="@drawable/ic_help_white_24dp"
android:orderInCategory="100"
android:title="@string/menu_help"
- app:showAsAction="always" />
+ app:showAsAction="ifRoom" />
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/help.xml b/app/src/main/res/values-es/help.xml
index b945e4b1..273a619e 100644
--- a/app/src/main/res/values-es/help.xml
+++ b/app/src/main/res/values-es/help.xml
@@ -74,6 +74,26 @@
completo a tus fondos.
¡Mantenerla segura y privada es muy importante, ya que permite a quien sea
acceso completo a tus fondos! Si no la anotaste en un lugar seguro aún, ¡por favor hazlo!
+
Wallet Files Recovery Password
+ Make sure you write this password down. If you reset your device or uninstall the app, you
+ will need it to access your wallet again.
+
CrAzYpass
+ If the password displayed here is 52 alphanumeric characters in groups of 4 - congratulations!
+ Your wallet files are secured with a 256-bit key generated by your device's security
+ features based on the passphrase you chose (on creation or by changing it). This makes it
+ extremenly difficult to hack!
+ This feature is mandatory for all newly created wallets.
+
Legacy Password
+ If you see your passphrase here, your wallet files are not as secure as when using
+ a CrAzYpass. To fix this, simply select \"Change Passphrase\" from the menu. After entering
+ a new passphrase (maybe even the same one as before) the app will generate a CrAzYpass for
+ you and secure your wallet files with it. Write it down!
+
CrAzYpass wallets
+ If you ever need to reinstall Monerujo (for example after resetting your phone or switching
+ to a new one) or you want to use your wallet files on a different device or PC, you have to
+ use this Recovery Password in order to access your wallet again.
+ By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
+ that this will generate a new Recovery Password. Write it down!
Clave de vista
Tu clave de vista puede usarse para monitorizar las transacciones entrantes de tu
monedero sin otorgar permiso para gastar los fondos guardados en ella.
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 821bcc79..b9fa1ce6 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -12,6 +12,7 @@
Renombrar …ArchivarCopia de seguridad
+ [Change Passphrase]Sigue escribiendo …Mas o menos.
@@ -46,6 +47,7 @@
Archivado en progresoCambio de nombre en progresoComprobando conexión con el daemon
+ [Change Password in progress]Guardando todo\n¡Puede llevar un tiempo!
@@ -55,6 +57,8 @@
¡Archivado fallido!¡Borrado fallido!¡Cambio de nombre fallido!
+ [Change Password failed!]
+ [Password changed]Nodo([<usuario>:<contraseña>@]<daemon>[:<puerto>])
@@ -84,6 +88,8 @@
Renombrar %1$s
+ [New Passphrase for %1$s]
+ [Repeat Passphrase for %1$s]Contraseña para %1$sConfirmar Contraseña¡Contraseña incorrecta!
@@ -134,9 +140,11 @@
Crear monederoNombre del monederoFrase de Contraseña
+ [Passphrases do not match]
+ [Passphrase may not be empty]¡Házme ya un monedero!Semilla Mnemotécnica
- ¡He apuntado estas 25 palabras!
+ [I have noted the above info!]Copia de SeguridadExportar Claves
@@ -169,6 +177,7 @@
Clave de GastoSemilla MnemotécnicaAltura de Restauración:
+ [Wallet Files Restore Password]Introduce una clave válidaIntroduce una dirección válida
@@ -278,8 +287,6 @@
Vas a enviar XMR y el destinatario recibirá BTC usando el servicio XMR.TO.
]]>Enviando
- Estado:
- %1$s es %1$s (#%1$d)%1$s BTCClave:Dirección:
diff --git a/app/src/main/res/values-it/about.xml b/app/src/main/res/values-it/about.xml
index 70e8de97..752ecc00 100644
--- a/app/src/main/res/values-it/about.xml
+++ b/app/src/main/res/values-it/about.xml
@@ -1,5 +1,6 @@
+ [About]ChiudiIo sono monerujoVersione %1$s (%2$d)
@@ -46,569 +47,4 @@
Se hai dubbi o domande sulla nostra politica per la privacy, oppure su come i tuoi dati vengono raccolti e processati, contattaci all'indirizzo email privacy@monerujo.io.
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- \"License\" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- \"Licensor\" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- \"Legal Entity\" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- \"control\" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- \"You\" (or \"Your\") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- \"Source\" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- \"Object\" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- \"Work\" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- \"Derivative Works\" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- \"Contribution\" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, \"submitted\"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as \"Not a Contribution.\"
-
- \"Contributor\" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a \"NOTICE\" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an \"AS IS\" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
Monero (https://github.com/monero-project/monero)
-
The Monero Project License
- Copyright (c) 2014-2017, The Monero Project. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. Neither the name of the copyright holder nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- Parts of the project are originally copyright (c) 2012-2013 The Cryptonote
- developers
-
-
OpenSSL (https://github.com/openssl/openssl)
-
LICENSE ISSUES
- The OpenSSL toolkit stays under a double license, i.e. both the conditions of
- the OpenSSL License and the original SSLeay license apply to the toolkit.
- See below for the actual license texts.
-
OpenSSL License
- Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- 3. All advertising materials mentioning features or use of this
- software must display the following acknowledgment:
- \"This product includes software developed by the OpenSSL Project
- for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"
-
- 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to
- endorse or promote products derived from this software without
- prior written permission. For written permission, please contact
- openssl-core@openssl.org.
-
- 5. Products derived from this software may not be called \"OpenSSL\"
- nor may \"OpenSSL\" appear in their names without prior written
- permission of the OpenSSL Project.
-
- 6. Redistributions of any form whatsoever must retain the following
- acknowledgment:
- \"This product includes software developed by the OpenSSL Project
- for use in the OpenSSL Toolkit (http://www.openssl.org/)\"
-
- THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT \"AS IS\" AND ANY
- EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
- ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- OF THE POSSIBILITY OF SUCH DAMAGE.
-
- This product includes cryptographic software written by Eric Young
- (eay@cryptsoft.com). This product includes software written by Tim
- Hudson (tjh@cryptsoft.com).
-
Original SSLeay License
- Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com). All rights reserved.
-
- This package is an SSL implementation written
- by Eric Young (eay@cryptsoft.com).
- The implementation was written so as to conform with Netscapes SSL.
-
- This library is free for commercial and non-commercial use as long as
- the following conditions are aheared to. The following conditions
- apply to all code found in this distribution, be it the RC4, RSA,
- lhash, DES, etc., code; not just the SSL code. The SSL documentation
- included with this distribution is covered by the same copyright terms
- except that the holder is Tim Hudson (tjh@cryptsoft.com).
-
- Copyright remains Eric Young's, and as such any Copyright notices in
- the code are not to be removed.
- If this package is used in a product, Eric Young should be given attribution
- as the author of the parts of the library used.
- This can be in the form of a textual message at program startup or
- in documentation (online or textual) provided with the package.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement:
- \"This product includes cryptographic software written by
- Eric Young (eay@cryptsoft.com)\"
- The word 'cryptographic' can be left out if the rouines from the library
- being used are not cryptographic related :-).
- 4. If you include any Windows specific code (or a derivative thereof) from
- the apps directory (application code) you must include an acknowledgement:
- \"This product includes software written by Tim Hudson (tjh@cryptsoft.com)\"
-
- THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- The licence and distribution terms for any publically available version or
- derivative of this code cannot be changed. i.e. this code cannot simply be
- copied and put under another distribution licence
- [including the GNU Public Licence.]
-
-
Boost Software License - Version 1.0 - August 17th, 2003
- Permission is hereby granted, free of charge, to any person or organization
- obtaining a copy of the software and accompanying documentation covered by
- this license (the \"Software\") to use, reproduce, display, distribute,
- execute, and transmit the Software, and to prepare derivative works of the
- Software, and to permit third-parties to whom the Software is furnished to
- do so, all subject to the following:
-
- The copyright notices in the Software and this entire statement, including
- the above license grant, this restriction and the following disclaimer,
- must be included in all copies of the Software, in whole or in part, and
- all derivative works of the Software, unless such copies or derivative
- works are solely in the form of machine-executable object code generated by
- a source language processor.
-
- THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
- SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
- FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
-
- Copyright (c) 2007, NLnet Labs. All rights reserved.
-
- This software is open source.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- Neither the name of the NLNET LABS nor the names of its contributors may
- be used to endorse or promote products derived from this software without
- specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
- Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-
The MiniUPnPc License
- Copyright (c) 2005-2015, Thomas BERNARD. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
-
The OpenLDAP Public License, Version 2.8, 17 August 2003
- Redistribution and use of this software and associated documentation
- (\"Software\"), with or without modification, are permitted provided
- that the following conditions are met:
-
- 1. Redistributions in source form must retain copyright statements
- and notices,
-
- 2. Redistributions in binary form must reproduce applicable copyright
- statements and notices, this list of conditions, and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution, and
-
- 3. Redistributions must contain a verbatim copy of this document.
-
- The OpenLDAP Foundation may revise this license from time to time.
- Each revision is distinguished by a version number. You may use
- this Software under terms of this license revision or under the
- terms of any subsequent revision of the license.
-
- THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND ITS
- CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- SHALL THE OPENLDAP FOUNDATION, ITS CONTRIBUTORS, OR THE AUTHOR(S)
- OR OWNER(S) OF THE SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- The names of the authors and copyright holders must not be used in
- advertising or otherwise to promote the sale, use or other dealing
- in this Software without specific, written prior permission. Title
- to copyright in this Software shall at all times remain with copyright
- holders.
-
- OpenLDAP is a registered trademark of the OpenLDAP Foundation.
-
- Copyright 1999-2003 The OpenLDAP Foundation, Redwood City,
- California, USA. All Rights Reserved. Permission to copy and
- distribute verbatim copies of this document is granted.
-
-
- Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net. All rights reserved.
-
The epee License
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the Andrey N. Sabelnikov nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL Andrey N. Sabelnikov BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
'Poppins' Font
-
SIL Open Font License
-
Copyright (c) 2014, Indian Type Foundry (info@indiantypefoundry.com).
-
This Font Software is licensed under the SIL Open Font License, Version 1.1.
- This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-
—————————————————————————————-
- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 —————————————————————————————-
-
PREAMBLE
- The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
-
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
-
DEFINITIONS
- “Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
-
“Reserved Font Name” refers to any names specified as such after the copyright statement(s).
-
“Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s).
-
“Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
-
“Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
-
PERMISSION & CONDITIONS
- Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
-
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
-
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
-
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
-
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
-
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
-
TERMINATION
- This license becomes null and void if any of the above conditions are not met.
-
DISCLAIMER
- THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
- ]]>
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-it/help.xml b/app/src/main/res/values-it/help.xml
index 96fd35a1..f63ce382 100644
--- a/app/src/main/res/values-it/help.xml
+++ b/app/src/main/res/values-it/help.xml
@@ -7,9 +7,9 @@
La password viene usata per rendere sicuri i dati del portafoglio sul tuo dispositivo. Utilizza una password efficace - meglio se una passphrase.
Prendi nota del tuo Seed Mnemonico!
Sulla schermata successiva troverai il tuo \"Seed Mnemonico\" da 25 parole.
- Questa è l'unica informazione necessaria per recuperare il tuo portafoglio d'ora in poi
+ Questa è l'unica informazione necessaria per recuperare il tuo portafoglio d'ora in poi
e avere pieno accesso ai tuoi fondi.
- E' molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a chiunque
+ E' molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a chiunque
pieno accesso ai tuoi fondi!
Se perdi la password del tuo portafoglio, puoi ancora recuperare il tuo portafoglio mediante il Seed Mnemonico.
Non esiste alcun modo per recuperare il tuo Seed Mnemonico; se lo perdi, tutti i tuoi fondi andranno persi!
@@ -25,7 +25,7 @@
La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo. Utilizza una password efficace -
ancora meglio se una passphrase.
Inserisci il tuo Seed nel campo \"Seed Mnemonico\".
-
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo, inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere parecchio tempo.
+
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo, inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere parecchio tempo.
]]>
Inserisci il tuo indirizzo Monero nel campo \"Indirizzo Pubblico\" e riempi i campi \"Chiave di Visualizzazione\" e \"Chiave di Spesa\".
-
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo, inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere parecchio tempo.
+
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo, inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere parecchio tempo.
]]>
Inserisci il tuo indirizzo Monero nel campo \"Indirizzo Pubblico\" e riempi il campo \"Chiave di Visualizzazione\".
-
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo, inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere parecchio tempo.
+
Se conosci il numero di blocco dove si trova la prima transazione utilizzata per questo indirizzo, inseriscilo nel campo \"Altezza di Recupero\" - se lasci il campo in bianco verrà scansionata l'intera blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere parecchio tempo.
]]>Indirizzo pubblico
Il tuo indirizzo pubblico Monero equivale al tuo IBAN. Puoi condividerlo con chiunque senza temere di perdere i tuoi Moneroj. Gli altri invieranno Moneroj al tuo portafoglio utilizzando questo indirizzo.
Seed Mnemonico
- Questa è l'unica informazione necessaria per recuperare il tuo portafoglio in futuro
+ Questa è l'unica informazione necessaria per recuperare il tuo portafoglio in futuro
e avere pieno accesso ai tuoi fondi.
- E' molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a chiunque
+ E' molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a chiunque
pieno accesso ai tuoi Moneroj! Se non lo hai già fatto, annotati il Seed Mnemonico e conservalo in un luogo sicuro!
+
Wallet Files Recovery Password
+ Make sure you write this password down. If you reset your device or uninstall the app, you
+ will need it to access your wallet again.
+
CrAzYpass
+ If the password displayed here is 52 alphanumeric characters in groups of 4 - congratulations!
+ Your wallet files are secured with a 256-bit key generated by your device's security
+ features based on the passphrase you chose (on creation or by changing it). This makes it
+ extremenly difficult to hack!
+ This feature is mandatory for all newly created wallets.
+
Legacy Password
+ If you see your passphrase here, your wallet files are not as secure as when using
+ a CrAzYpass. To fix this, simply select \"Change Passphrase\" from the menu. After entering
+ a new passphrase (maybe even the same one as before) the app will generate a CrAzYpass for
+ you and secure your wallet files with it. Write it down!
+
CrAzYpass wallets
+ If you ever need to reinstall Monerujo (for example after resetting your phone or switching
+ to a new one) or you want to use your wallet files on a different device or PC, you have to
+ use this Recovery Password in order to access your wallet again.
+ By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
+ that this will generate a new Recovery Password. Write it down!
Chiave di Visualizzazione
La tua chiave di visualizzazione può essere usata per monitorare le transazioni in ingresso al tuo portafoglio senza concedere il permesso di spendere i fondi.
Chiave di Spesa
@@ -69,8 +89,8 @@
Monerujo usa un nodo remoto per comunicare con la rete Monero senza dover scaricare e mantenere in memoria una copia della blockchain intera. Puoi trovare una lista di nodi remoti popolari o imparare come eseguire un tuo personale nodo remoto a questo sito: https://moneroworld.com/
Monerujo contiene già una lista di nodi remoti e tiene memoria degli ultimi cinque nodi utilizzati.
Portafogli
-
Qui trovi la lista dei portafogli. I portafogli sono fisicamente posizionati nella cartella monerujo nella memoria interna del tuo dispositivo. Puoi usare un'applicazione di file explorer per vederli.
- E' buona regola effettuare dei backup periodici di questa cartella su un'unità di memoria esterna al tuo dispositivo nel caso in cui il tuo dispositivo esploda o venga rubato.
+
Qui trovi la lista dei portafogli. I portafogli sono fisicamente posizionati nella cartella monerujo nella memoria interna del tuo dispositivo. Puoi usare un'applicazione di file explorer per vederli.
+ E' buona regola effettuare dei backup periodici di questa cartella su un'unità di memoria esterna al tuo dispositivo nel caso in cui il tuo dispositivo esploda o venga rubato.
Seleziona un portafoglio per aprirlo o premere \"+\" per crearne uno nuovo.
Oppure seleziona una delle operazioni di portafoglio:
Dettagli
@@ -80,9 +100,9 @@
Rinomina
Rinomina il portafoglio. Le copie di backup non vengono rinominate.
Backup
-
Fai una copia del portafoglio all'interno della cartella backups, a sua volta all'interno della cartella monerujo, sovrascrivendo eventuali copie precedenti.
+
Fai una copia del portafoglio all'interno della cartella backups, a sua volta all'interno della cartella monerujo, sovrascrivendo eventuali copie precedenti.
Archivia
-
Effettua un backup e successivamente elimina il portafoglio. La copia rimane nella cartella backups. Se non hai più bisogno dei backup, è meglio cancellare i file interessati utilizzando un'applicazione di tipo file explorer o un'applicazione di rimozione dati sicura.
+
Effettua un backup e successivamente elimina il portafoglio. La copia rimane nella cartella backups. Se non hai più bisogno dei backup, è meglio cancellare i file interessati utilizzando un'applicazione di tipo file explorer o un'applicazione di rimozione dati sicura.
]]>Dettagli della transazione
Destinazione
- Questo è l'indirizzo pubblico del portafoglio cui hai inviato Moneroj
+ Questo è l'indirizzo pubblico del portafoglio cui hai inviato Moneroj
ID Pagamento
- Puoi usare un ID Pagamento per identificare la causale della transazione. Questa è un'informazione opzionale e privata. Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.
+ Puoi usare un ID Pagamento per identificare la causale della transazione. Questa è un'informazione opzionale e privata. Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.
TX ID (ID di Transazione)
- Questo è l'ID della transazione che puoi usare per identificare la tua transazione offuscata su un explorer della blockchain Monero, ad esempio https://xmrchain.net/
+ Questo è l'ID della transazione che puoi usare per identificare la tua transazione offuscata su un explorer della blockchain Monero, ad esempio https://xmrchain.net/
TX KEY (Chiave di transazione)
Questa è la tua chiave privata della transazione. Conservala al sicuro poiché rivelare questa chiave a terze parti rivela quale firma in un anello è la tua, rendendo quindi la tua transazione trasparente.
Blocco
@@ -116,27 +136,27 @@
Invia
Indirizzo del ricevente
-
Questo è l'indirizzo pubblico del portafoglio cui stai inviando Moneroj, puoi incollare qui un indirizzo che hai precededentemente copiato sul blocco appunti, scansionare un codice QR o inserire un indirizzo manualmente. Accertati più volte che sia l'indirizzo corretto e che tu non stia inviando Moneroj ad un indirizzo sbagliato.
+
Questo è l'indirizzo pubblico del portafoglio cui stai inviando Moneroj, puoi incollare qui un indirizzo che hai precededentemente copiato sul blocco appunti, scansionare un codice QR o inserire un indirizzo manualmente. Accertati più volte che sia l'indirizzo corretto e che tu non stia inviando Moneroj ad un indirizzo sbagliato.
Oltre ad inviare Moneroj (XMR), puoi anche inviare Bitcoin (BTC) attraverso il servizio XMR.TO (vedi https://xmr.to
- per ulteriori dettagli). Controlla la sezione sull'invio di BTC più avanti.
+ per ulteriori dettagli). Controlla la sezione sull'invio di BTC più avanti.
ID Pagamento
-
Puoi usare un ID Pagamento per identificare la causale della transazione. Questa è un'informazione opzionale e privata. Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.
-
Dimensione dell'anello (ring size)
-
Monerujo dà la possibilità di scegliere la dimensione dell'anello (ring size) da utilizzare in una transazione. Se sei un utente poco esperto, ti raccomandiamo di utilizzare una dimensione dell'anello pari a 7. Un numero più alto rispetto a 7 aumenta il numero di firmatari nella firma ad anello così come, teoricamente, la negabilità plausibile. Considera però che selezionare una dimensione dell'anello elevata rischia di mettere in risalto la tua transazione sulla blockchain.
+
Puoi usare un ID Pagamento per identificare la causale della transazione. Questa è un'informazione opzionale e privata. Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.
+
Dimensione dell'anello (ring size)
+
Monerujo dà la possibilità di scegliere la dimensione dell'anello (ring size) da utilizzare in una transazione. Se sei un utente poco esperto, ti raccomandiamo di utilizzare una dimensione dell'anello pari a 7. Un numero più alto rispetto a 7 aumenta il numero di firmatari nella firma ad anello così come, teoricamente, la negabilità plausibile. Considera però che selezionare una dimensione dell'anello elevata rischia di mettere in risalto la tua transazione sulla blockchain.
Priorità
-
Questa impostazione determina la velocità con la quale la tua transazione verrà inclusa nella blockchain. Un'alta priorità si correla ad una commissione di transazione più alta, così come una priorità bassa si correla ad una commissione di transazione più bassa. Considera che se imposti una priorità bassa alla tua transazione, potrebbero trascorrere ore prima che essa sia inserita all'interno della blockchain. La priorità di default è
+
Questa impostazione determina la velocità con la quale la tua transazione verrà inclusa nella blockchain. Un'alta priorità si correla ad una commissione di transazione più alta, così come una priorità bassa si correla ad una commissione di transazione più bassa. Considera che se imposti una priorità bassa alla tua transazione, potrebbero trascorrere ore prima che essa sia inserita all'interno della blockchain. La priorità di default è
\"Media\".
Inviare BTC
XMR.TO
XMR.TO è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin.
- Utilizziamo le API XMR.TO per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://xmr.to e decidi tu stesso se questa è una funzionalità che vuoi usare. Il team Monerujo non è associato in alcun modo con XMR.TO e non è in grado di aiutarti con il servizio da loro offerto.
+ Utilizziamo le API XMR.TO per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://xmr.to e decidi tu stesso se questa è una funzionalità che vuoi usare. Il team Monerujo non è associato in alcun modo con XMR.TO e non è in grado di aiutarti con il servizio da loro offerto.
Tasso di cambio XMR.TO
-
Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio XMR.TO. Questi parametri includono il tasso di cambio attuale oltre ai limiti massimo e minimo di BTC. Considera che il tasso che ti viene mostrato non è ancora garantito in questa fase. Vedrai inoltre l'ammontare fino al quale la transazione BTC verrà eseguita istantaneamente senza attendere conferme XMR (vedi le FAQ XMR.TO per maggiori informazioni). Considera inoltre che il servizio XMR.TO non aggiunge commissioni extra - bello vero?
+
Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio XMR.TO. Questi parametri includono il tasso di cambio attuale oltre ai limiti massimo e minimo di BTC. Considera che il tasso che ti viene mostrato non è ancora garantito in questa fase. Vedrai inoltre l'ammontare fino al quale la transazione BTC verrà eseguita istantaneamente senza attendere conferme XMR (vedi le FAQ XMR.TO per maggiori informazioni). Considera inoltre che il servizio XMR.TO non aggiunge commissioni extra - bello vero?
Ordine XMR.TO
Sulla schermata \"Conferma\", troverai il vero ordine XMR.TO. Questo ordine è valido per un tempo limitato - potresti notare un conto alla rovescia sul pulsante \"Spendi\". Il tasso di cambio potrebbe essere diverso da quello indicativo mostrato nelle schermate precedenti.
Chiave segreta XMR.TO
Dal momento che Monerujo gestisce soltanto il versante Monero della tua transazione, può essere usata la chiave segreta XMR.TO per tracciare il versante Bitcoin del tuo ordine sulla homepage XMR.TO.
-
Considera che questa chiave segreta è valida solamente per 24 ore dall'inizio della transazione!
+
Considera che questa chiave segreta è valida solamente per 24 ore dall'inizio della transazione!
Conto alla rovescia XMR.TO!
Non appena il conto alla rovescia arriva a zero, è necessario richiedere una nuova quotazione a XMR.TO tornando indietro al passo precedente e tornando poi di nuovo alla schermata \"Conferma\".
]]>
@@ -145,16 +165,16 @@
Inviare BTC
XMR.TO
XMR.TO è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin.
- Utilizziamo le API XMR.TO per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://xmr.to e decidi tu stesso se questa è una funzionalità che vuoi usare. Il team Monerujo non è associato in alcun modo con XMR.TO e non è in grado di aiutarti con il servizio da loro offerto.
+ Utilizziamo le API XMR.TO per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://xmr.to e decidi tu stesso se questa è una funzionalità che vuoi usare. Il team Monerujo non è associato in alcun modo con XMR.TO e non è in grado di aiutarti con il servizio da loro offerto.
Tasso di cambio XMR.TO
-
Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio XMR.TO. Questi parametri includono il tasso di cambio attuale oltre ai limiti massimo e minimo di BTC. Considera che il tasso che ti viene mostrato non è ancora garantito in questa fase. Vedrai inoltre l'ammontare fino al quale la transazione BTC verrà eseguita istantaneamente senza attendere conferme XMR (vedi le FAQ XMR.TO per maggiori informazioni). Considera inoltre che il servizio XMR.TO non aggiunge commissioni extra - bello vero?
+
Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio XMR.TO. Questi parametri includono il tasso di cambio attuale oltre ai limiti massimo e minimo di BTC. Considera che il tasso che ti viene mostrato non è ancora garantito in questa fase. Vedrai inoltre l'ammontare fino al quale la transazione BTC verrà eseguita istantaneamente senza attendere conferme XMR (vedi le FAQ XMR.TO per maggiori informazioni). Considera inoltre che il servizio XMR.TO non aggiunge commissioni extra - bello vero?
XMR.TO Order
Sulla schermata \"Conferma\", troverai il vero ordine XMR.TO. Questo ordine è valido per un tempo limitato - potresti notare un conto alla rovescia sul pulsante \"Spendi\". Il tasso di cambio potrebbe essere diverso da quello indicativo mostrato nelle schermate precedenti.
Chiave segreta XMR.TO
Dal momento che Monerujo gestisce soltanto il versante Monero della tua transazione, può essere usata la chiave segreta XMR.TO per tracciare il versante Bitcoin del tuo ordine sulla homepage XMR.TO.
-
Considera che questa chiave segreta è valida solamente per 24 ore dall'inizio della transazione!
+
Considera che questa chiave segreta è valida solamente per 24 ore dall'inizio della transazione!
Conto alla rovescia XMR.TO!
Non appena il conto alla rovescia arriva a zero, è necessario richiedere una nuova quotazione a XMR.TO tornando indietro al passo precedente e tornando poi di nuovo alla schermata \"Conferma\".
]]>
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index df3d1248..0762b5d0 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -1,6 +1,4 @@
- monerujo
- monerujoPortafoglioTestnet
@@ -14,6 +12,7 @@
Rinomina …ArchiviaBackup
+ [Change Passphrase]Continua a scrivere …Mah …
@@ -44,9 +43,7 @@
Ordine XMR.TOInvio in corso
- Stato:%1$s BTC
- %1$s è %1$s (#%1$d)Chiave:Indirizzo:
@@ -73,8 +70,8 @@
ID pagamento integratoPreparando la tua transazione
- Creando l'ordine XMR.TO
- Richiedendo l'ordine XMR.TO
+ Creando l\'ordine XMR.TO
+ Richiedendo l\'ordine XMR.TOPreparando la transazione MoneroRichiedendo i parametri XMR.TO
@@ -111,6 +108,7 @@
Archiviazione in corsoRinomina in corsoControllando connessione con daemon
+ [Change Password in progress]Rimettendo le cose a posto …\nPuò richiedere del tempo!
@@ -120,6 +118,8 @@
Archiviazione fallita!Cancellazione fallita!Rinomina fallita!
+ [Change Password failed!]
+ [Password changed]Nodo([<utente>:<password>@]<daemon>[:<porta>])
@@ -151,12 +151,14 @@
Rinomina %1$s
+ [New Passphrase for %1$s]
+ [Repeat Passphrase for %1$s]Password per %1$sConferma PasswordPassword errata!Il portafoglio non esiste!Questo non è un portafoglio!
- Deve essere impostato l'indirizzo del Daemon!
+ Deve essere impostato l\'indirizzo del Daemon!Il portafoglio non si abbina con la rete selezionataImpossibile connettersi al daemon! Prova di nuovo.Qualcosa è sbagliato!
@@ -169,7 +171,6 @@
AmmontareData+ %1$s XMR non confermati
- XMRTransazioniDaemon connesso!
@@ -185,8 +186,8 @@
Scansionando:Problemi
- L'unità di memoria esterna non è scrivibile! Aiuto!
- Abbiamo veramente bisogno di questi permessi sull'unità di memoria esterna!
+ L\'unità di memoria esterna non è scrivibile! Aiuto!
+ Abbiamo veramente bisogno di questi permessi sull\'unità di memoria esterna!Nessuna telecamera = Nessuna scansione QR!Chiave di visualizzazione
@@ -205,9 +206,11 @@
Crea portafoglioNome del portafoglioPassphrase del portafoglio
+ [Passphrases do not match]
+ [Passphrase may not be empty]Fammi subito un portafoglio!Seed mnemonico
- Ho preso nota di queste 25 parole!
+ [I have noted the above info!]BackupEsporta chiavi
@@ -240,6 +243,7 @@
Chiave di spesaSeed mnemonicoAltezza di ripristino:
+ [Wallet Files Restore Password]Inserisci una chiave validaInserisci un indirizzo valido
@@ -348,13 +352,6 @@
Sì, procedi!No grazie!
-
- Ringsize 7
- Ringsize 10
- Ringsize 13
- Ringsize 26
-
-
Priority DefaultPriority Bassa
@@ -362,12 +359,6 @@
Priority Alta
-
- XMR
- EUR
- USD
-
-
Crea un nuovo portafoglioRecupera un portafoglio solo-visualizzazioneRecupera un portafoglio dalle chiavi private
diff --git a/app/src/main/res/values-zh-rTW/about.xml b/app/src/main/res/values-zh-rTW/about.xml
index 7f419838..55b4f7cf 100644
--- a/app/src/main/res/values-zh-rTW/about.xml
+++ b/app/src/main/res/values-zh-rTW/about.xml
@@ -45,569 +45,4 @@
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- \"License\" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- \"Licensor\" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- \"Legal Entity\" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- \"control\" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- \"You\" (or \"Your\") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- \"Source\" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- \"Object\" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- \"Work\" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- \"Derivative Works\" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- \"Contribution\" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, \"submitted\"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as \"Not a Contribution.\"
-
- \"Contributor\" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a \"NOTICE\" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an \"AS IS\" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
Monero (https://github.com/monero-project/monero)
-
The Monero Project License
- Copyright (c) 2014-2017, The Monero Project. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. Neither the name of the copyright holder nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- Parts of the project are originally copyright (c) 2012-2013 The Cryptonote
- developers
-
-
OpenSSL (https://github.com/openssl/openssl)
-
LICENSE ISSUES
- The OpenSSL toolkit stays under a double license, i.e. both the conditions of
- the OpenSSL License and the original SSLeay license apply to the toolkit.
- See below for the actual license texts.
-
OpenSSL License
- Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- 3. All advertising materials mentioning features or use of this
- software must display the following acknowledgment:
- \"This product includes software developed by the OpenSSL Project
- for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"
-
- 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to
- endorse or promote products derived from this software without
- prior written permission. For written permission, please contact
- openssl-core@openssl.org.
-
- 5. Products derived from this software may not be called \"OpenSSL\"
- nor may \"OpenSSL\" appear in their names without prior written
- permission of the OpenSSL Project.
-
- 6. Redistributions of any form whatsoever must retain the following
- acknowledgment:
- \"This product includes software developed by the OpenSSL Project
- for use in the OpenSSL Toolkit (http://www.openssl.org/)\"
-
- THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT \"AS IS\" AND ANY
- EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
- ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- OF THE POSSIBILITY OF SUCH DAMAGE.
-
- This product includes cryptographic software written by Eric Young
- (eay@cryptsoft.com). This product includes software written by Tim
- Hudson (tjh@cryptsoft.com).
-
Original SSLeay License
- Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com). All rights reserved.
-
- This package is an SSL implementation written
- by Eric Young (eay@cryptsoft.com).
- The implementation was written so as to conform with Netscapes SSL.
-
- This library is free for commercial and non-commercial use as long as
- the following conditions are aheared to. The following conditions
- apply to all code found in this distribution, be it the RC4, RSA,
- lhash, DES, etc., code; not just the SSL code. The SSL documentation
- included with this distribution is covered by the same copyright terms
- except that the holder is Tim Hudson (tjh@cryptsoft.com).
-
- Copyright remains Eric Young's, and as such any Copyright notices in
- the code are not to be removed.
- If this package is used in a product, Eric Young should be given attribution
- as the author of the parts of the library used.
- This can be in the form of a textual message at program startup or
- in documentation (online or textual) provided with the package.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement:
- \"This product includes cryptographic software written by
- Eric Young (eay@cryptsoft.com)\"
- The word 'cryptographic' can be left out if the rouines from the library
- being used are not cryptographic related :-).
- 4. If you include any Windows specific code (or a derivative thereof) from
- the apps directory (application code) you must include an acknowledgement:
- \"This product includes software written by Tim Hudson (tjh@cryptsoft.com)\"
-
- THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- The licence and distribution terms for any publically available version or
- derivative of this code cannot be changed. i.e. this code cannot simply be
- copied and put under another distribution licence
- [including the GNU Public Licence.]
-
-
Boost Software License - Version 1.0 - August 17th, 2003
- Permission is hereby granted, free of charge, to any person or organization
- obtaining a copy of the software and accompanying documentation covered by
- this license (the \"Software\") to use, reproduce, display, distribute,
- execute, and transmit the Software, and to prepare derivative works of the
- Software, and to permit third-parties to whom the Software is furnished to
- do so, all subject to the following:
-
- The copyright notices in the Software and this entire statement, including
- the above license grant, this restriction and the following disclaimer,
- must be included in all copies of the Software, in whole or in part, and
- all derivative works of the Software, unless such copies or derivative
- works are solely in the form of machine-executable object code generated by
- a source language processor.
-
- THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
- SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
- FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
-
- Copyright (c) 2007, NLnet Labs. All rights reserved.
-
- This software is open source.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- Neither the name of the NLNET LABS nor the names of its contributors may
- be used to endorse or promote products derived from this software without
- specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
- Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
-
The MiniUPnPc License
- Copyright (c) 2005-2015, Thomas BERNARD. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
-
The OpenLDAP Public License, Version 2.8, 17 August 2003
- Redistribution and use of this software and associated documentation
- (\"Software\"), with or without modification, are permitted provided
- that the following conditions are met:
-
- 1. Redistributions in source form must retain copyright statements
- and notices,
-
- 2. Redistributions in binary form must reproduce applicable copyright
- statements and notices, this list of conditions, and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution, and
-
- 3. Redistributions must contain a verbatim copy of this document.
-
- The OpenLDAP Foundation may revise this license from time to time.
- Each revision is distinguished by a version number. You may use
- this Software under terms of this license revision or under the
- terms of any subsequent revision of the license.
-
- THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND ITS
- CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- SHALL THE OPENLDAP FOUNDATION, ITS CONTRIBUTORS, OR THE AUTHOR(S)
- OR OWNER(S) OF THE SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- The names of the authors and copyright holders must not be used in
- advertising or otherwise to promote the sale, use or other dealing
- in this Software without specific, written prior permission. Title
- to copyright in this Software shall at all times remain with copyright
- holders.
-
- OpenLDAP is a registered trademark of the OpenLDAP Foundation.
-
- Copyright 1999-2003 The OpenLDAP Foundation, Redwood City,
- California, USA. All Rights Reserved. Permission to copy and
- distribute verbatim copies of this document is granted.
-
-
- Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net. All rights reserved.
-
The epee License
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the Andrey N. Sabelnikov nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL Andrey N. Sabelnikov BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
'Poppins' Font
-
SIL Open Font License
-
Copyright (c) 2014, Indian Type Foundry (info@indiantypefoundry.com).
-
This Font Software is licensed under the SIL Open Font License, Version 1.1.
- This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-
—————————————————————————————-
- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 —————————————————————————————-
-
PREAMBLE
- The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
-
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
-
DEFINITIONS
- “Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
-
“Reserved Font Name” refers to any names specified as such after the copyright statement(s).
-
“Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s).
-
“Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
-
“Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
-
PERMISSION & CONDITIONS
- Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
-
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
-
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
-
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
-
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
-
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
-
TERMINATION
- This license becomes null and void if any of the above conditions are not met.
-
DISCLAIMER
- THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
- ]]>
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-zh-rTW/help.xml b/app/src/main/res/values-zh-rTW/help.xml
index 75477fc9..c97aa090 100644
--- a/app/src/main/res/values-zh-rTW/help.xml
+++ b/app/src/main/res/values-zh-rTW/help.xml
@@ -56,6 +56,26 @@
會失去你的Monero,其他人可以透過這個地址發送Monero到你的錢包。
+ Make sure you write this password down. If you reset your device or uninstall the app, you
+ will need it to access your wallet again.
+
CrAzYpass
+ If the password displayed here is 52 alphanumeric characters in groups of 4 - congratulations!
+ Your wallet files are secured with a 256-bit key generated by your device's security
+ features based on the passphrase you chose (on creation or by changing it). This makes it
+ extremenly difficult to hack!
+ This feature is mandatory for all newly created wallets.
+
Legacy Password
+ If you see your passphrase here, your wallet files are not as secure as when using
+ a CrAzYpass. To fix this, simply select \"Change Passphrase\" from the menu. After entering
+ a new passphrase (maybe even the same one as before) the app will generate a CrAzYpass for
+ you and secure your wallet files with it. Write it down!
+
CrAzYpass wallets
+ If you ever need to reinstall Monerujo (for example after resetting your phone or switching
+ to a new one) or you want to use your wallet files on a different device or PC, you have to
+ use this Recovery Password in order to access your wallet again.
+ By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
+ that this will generate a new Recovery Password. Write it down!
查看金鑰
查看金鑰可以被用在查看錢包的入帳金額而不包含花費錢包資金的權限。
花費金鑰
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index aff84677..0b5ca404 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -12,6 +12,7 @@
重新命名 …封存備份
+ [Change Passphrase]再長一點 …嗯 …
@@ -42,9 +43,7 @@
XMR.TO訂單發送中
- 狀態:%1$s BTC
- %1$s 是 %1$s (#%1$d)金鑰:地址:
@@ -109,6 +108,7 @@
正在封存中正在重新命名正在檢查daemon連線
+ [Change Password in progress]正在關閉錢包 …\n可能會花費些許時間!
@@ -118,6 +118,8 @@
封存失敗!刪除失敗!重新命名失敗!
+ [Change Password failed!]
+ [Password changed]節點([<名稱>:<密碼>@]<節點>[:<port>])
@@ -149,6 +151,8 @@
重新命名 %1$s
+ [New Passphrase for %1$s]
+ [Repeat Passphrase for %1$s]%1$s 的密碼確認密碼密碼錯誤!
@@ -202,9 +206,11 @@
建立錢包錢包名稱錢包密碼
+ [Passphrases do not match]
+ [Passphrase may not be empty]建立錢包!記憶種子碼
- 我已抄寫下這25個單字!
+ [I have noted the above info!]備份匯出金鑰
@@ -237,6 +243,7 @@
花費金鑰記憶種子碼回復高度:
+ [Wallet Files Restore Password]輸入有效的金鑰輸入有效的地址
diff --git a/app/src/main/res/values/help.xml b/app/src/main/res/values/help.xml
index 667c7df2..0ab73955 100644
--- a/app/src/main/res/values/help.xml
+++ b/app/src/main/res/values/help.xml
@@ -62,6 +62,26 @@
This is the only data needed to recover your wallet at a later point and gain full access to
your funds. Keeping this private and secure is very important, as it gives anyone full
access to your Monero! If you haven’t written this down somewhere safe please do!
+
Wallet Files Recovery Password
+ Make sure you write this password down. If you reset your device or uninstall the app, you
+ will need it to access your wallet again.
+
CrAzYpass
+ If the password displayed here is 52 alphanumeric characters in groups of 4 - congratulations!
+ Your wallet files are secured with a 256-bit key generated by your device's security
+ features based on the passphrase you chose (on creation or by changing it). This makes it
+ extremenly difficult to hack!
+ This feature is mandatory for all newly created wallets.
+
Legacy Password
+ If you see your passphrase here, your wallet files are not as secure as when using
+ a CrAzYpass. To fix this, simply select \"Change Passphrase\" from the menu. After entering
+ a new passphrase (maybe even the same one as before) the app will generate a CrAzYpass for
+ you and secure your wallet files with it. Write it down!
+
CrAzYpass wallets
+ If you ever need to reinstall Monerujo (for example after resetting your phone or switching
+ to a new one) or you want to use your wallet files on a different device or PC, you have to
+ use this Recovery Password in order to access your wallet again.
+ By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
+ that this will generate a new Recovery Password. Write it down!
View key
Your view key can be used to monitor incoming transactions to your wallet without giving
permission to spend the funds inside your wallet.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5d4d476c..14490ed8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -14,6 +14,7 @@
Rename …ArchiveBackup
+ Change PassphraseContinue typing …Meh …
@@ -44,9 +45,7 @@
XMR.TO OrderSending
- Status:%1$s BTC
- %1$s is %1$s (#%1$d)Key:Address:
@@ -111,6 +110,7 @@
Archive in progressRename in progressChecking daemon connection
+ Change Password in progressWrapping things up …\nThis can take a while!
@@ -120,6 +120,8 @@
Archive failed!Delete failed!Rename failed!
+ Change Password failed!
+ Password changedNode([<user>:<pass>@]<daemon>[:<port>])
@@ -151,6 +153,8 @@
Rename %1$s
+ New Passphrase for %1$s
+ Repeat Passphrase for %1$sPassword for %1$sConfirm PasswordIncorrect password!
@@ -205,9 +209,11 @@
Create WalletWallet NameWallet Passphrase
+ Passphrases do not match
+ Passphrase may not be emptyMake me a wallet already!Mnemonic Seed
- I have noted these 25 words!
+ I have noted the mnemonic seedBackupExport Keys
@@ -240,6 +246,7 @@
Spend KeyMnemonic SeedRestore Height:
+ Wallet Files Restore PasswordEnter valid KeyEnter valid Address
diff --git a/build.gradle b/build.gradle
index 30c6cfd6..e1ac1575 100644
--- a/build.gradle
+++ b/build.gradle
@@ -28,5 +28,5 @@ ext {
okHttpVersion = '3.9.0'
junitVersion = '4.12'
mockitoVersion = '1.10.19'
- timberVersion = '4.6.0'
+ timberVersion = '4.7.0'
}