CrAzYpass implementation (#234)

This commit is contained in:
m2049r 2018-04-21 10:23:47 +02:00 committed by GitHub
parent 37f22a9dc2
commit 073bd96b17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 929 additions and 1326 deletions

5
.gitignore vendored
View File

@ -1,10 +1,7 @@
.gradle .gradle
/build /build
*.iml *.iml
/.idea/libraries /.idea
/.idea/workspace.xml
/.idea/caches
/.idea/codeStyles
/local.properties /local.properties
/captures /captures
.externalNativeBuild .externalNativeBuild

View File

@ -7,8 +7,8 @@ android {
applicationId "com.m2049r.xmrwallet" applicationId "com.m2049r.xmrwallet"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 25 targetSdkVersion 25
versionCode 87 versionCode 90
versionName "1.4.7 'Monero Spedner'" versionName "1.5.0 'CrAzYpass'"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild { externalNativeBuild {
cmake { cmake {
@ -66,7 +66,6 @@ dependencies {
implementation 'com.android.support:support-v4:25.4.0' implementation 'com.android.support:support-v4:25.4.0'
implementation 'com.android.support:recyclerview-v7: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:cardview-v7:25.4.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'me.dm7.barcodescanner:zxing:1.9.8' implementation 'me.dm7.barcodescanner:zxing:1.9.8'
implementation "com.squareup.okhttp3:okhttp:$rootProject.ext.okHttpVersion" implementation "com.squareup.okhttp3:okhttp:$rootProject.ext.okHttpVersion"

View File

@ -695,6 +695,23 @@ Java_com_m2049r_xmrwallet_model_Wallet_isSynchronized(JNIEnv *env, jobject insta
return static_cast<jboolean>(wallet->synchronized()); return static_cast<jboolean>(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 JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getDisplayAmount(JNIEnv *env, jobject clazz, Java_com_m2049r_xmrwallet_model_Wallet_getDisplayAmount(JNIEnv *env, jobject clazz,
jlong amount) { 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); //static void error(const std::string &category, const std::string &str);
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_initLogger(JNIEnv *env, jobject instance, 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 *_argv0 = env->GetStringUTFChars(argv0, NULL);
const char *_default_log_base_name = env->GetStringUTFChars(default_log_base_name, NULL); const char *_default_log_base_name = env->GetStringUTFChars(default_log_base_name, NULL);
@ -1153,7 +1171,6 @@ Java_com_m2049r_xmrwallet_model_WalletManager_setLogLevel(JNIEnv *env, jobject i
} }
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -18,6 +18,7 @@
#define XMRWALLET_WALLET_LIB_H #define XMRWALLET_WALLET_LIB_H
#include <jni.h> #include <jni.h>
/* /*
#include <android/log.h> #include <android/log.h>
@ -27,13 +28,13 @@
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #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); jclass c = env->GetObjectClass(obj);
return env->GetFieldID(c, fieldName, "J"); // of type long return env->GetFieldID(c, fieldName, "J"); // of type long
} }
template <typename T> template<typename T>
T *getHandle(JNIEnv *env, jobject obj, const char* fieldName = "handle") { T *getHandle(JNIEnv *env, jobject obj, const char *fieldName = "handle") {
jlong handle = env->GetLongField(obj, getHandleField(env, obj, fieldName)); jlong handle = env->GetLongField(obj, getHandleField(env, obj, fieldName));
return reinterpret_cast<T *>(handle); return reinterpret_cast<T *>(handle);
} }
@ -42,10 +43,27 @@ void setHandleFromLong(JNIEnv *env, jobject obj, jlong handle) {
env->SetLongField(obj, getHandleField(env, obj), handle); env->SetLongField(obj, getHandleField(env, obj), handle);
} }
template <typename T> template<typename T>
void setHandle(JNIEnv *env, jobject obj, T *t) { void setHandle(JNIEnv *env, jobject obj, T *t) {
jlong handle = reinterpret_cast<jlong>(t); jlong handle = reinterpret_cast<jlong>(t);
setHandleFromLong(env, obj, handle); 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 #endif //XMRWALLET_WALLET_LIB_H

View File

@ -34,6 +34,7 @@ import android.view.inputmethod.EditorInfo;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import com.m2049r.xmrwallet.util.KeyStoreHelper;
import com.m2049r.xmrwallet.util.RestoreHeight; import com.m2049r.xmrwallet.util.RestoreHeight;
import com.m2049r.xmrwallet.widget.Toolbar; import com.m2049r.xmrwallet.widget.Toolbar;
import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.Wallet;
@ -424,17 +425,20 @@ public class GenerateFragment extends Fragment {
String name = etWalletName.getEditText().getText().toString(); String name = etWalletName.getEditText().getText().toString();
String password = etWalletPassword.getEditText().getText().toString(); String password = etWalletPassword.getEditText().getText().toString();
// create the real wallet password
String crazyPass = KeyStoreHelper.getCrazyPass(getActivity(), password);
long height = getHeight(); long height = getHeight();
if (height < 0) height = 0; if (height < 0) height = 0;
if (type.equals(TYPE_NEW)) { if (type.equals(TYPE_NEW)) {
bGenerate.setEnabled(false); bGenerate.setEnabled(false);
activityCallback.onGenerate(name, password); activityCallback.onGenerate(name, crazyPass);
} else if (type.equals(TYPE_SEED)) { } else if (type.equals(TYPE_SEED)) {
if (!checkMnemonic()) return; if (!checkMnemonic()) return;
String seed = etWalletMnemonic.getEditText().getText().toString(); String seed = etWalletMnemonic.getEditText().getText().toString();
bGenerate.setEnabled(false); 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)) { } else if (type.equals(TYPE_KEY) || type.equals(TYPE_VIEWONLY)) {
if (checkAddress() && checkViewKey() && checkSpendKey()) { if (checkAddress() && checkViewKey() && checkSpendKey()) {
bGenerate.setEnabled(false); bGenerate.setEnabled(false);
@ -444,7 +448,7 @@ public class GenerateFragment extends Fragment {
if (type.equals(TYPE_KEY)) { if (type.equals(TYPE_KEY)) {
spendKey = etWalletSpendKey.getEditText().getText().toString(); spendKey = etWalletSpendKey.getEditText().getText().toString();
} }
activityCallback.onGenerate(name, password, address, viewKey, spendKey, height); activityCallback.onGenerate(name, crazyPass, address, viewKey, spendKey, height);
} }
} }
} }

View File

@ -16,16 +16,23 @@
package com.m2049r.xmrwallet; package com.m2049r.xmrwallet;
import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.TextInputLayout;
import android.support.v4.app.Fragment; 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.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -35,12 +42,15 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.m2049r.xmrwallet.model.NetworkType; import com.m2049r.xmrwallet.model.NetworkType;
import com.m2049r.xmrwallet.util.KeyStoreHelper;
import com.m2049r.xmrwallet.widget.Toolbar; import com.m2049r.xmrwallet.widget.Toolbar;
import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor; import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
import java.io.File;
import timber.log.Timber; import timber.log.Timber;
public class GenerateReviewFragment extends Fragment { public class GenerateReviewFragment extends Fragment {
@ -51,7 +61,6 @@ public class GenerateReviewFragment extends Fragment {
ScrollView scrollview; ScrollView scrollview;
ProgressBar pbProgress; ProgressBar pbProgress;
TextView tvWalletName;
TextView tvWalletPassword; TextView tvWalletPassword;
TextView tvWalletAddress; TextView tvWalletAddress;
TextView tvWalletMnemonic; TextView tvWalletMnemonic;
@ -59,9 +68,18 @@ public class GenerateReviewFragment extends Fragment {
TextView tvWalletSpendKey; TextView tvWalletSpendKey;
ImageButton bCopyAddress; ImageButton bCopyAddress;
LinearLayout llAdvancedInfo; LinearLayout llAdvancedInfo;
LinearLayout llPassword;
Button bAdvancedInfo; Button bAdvancedInfo;
Button bAccept; 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 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
@ -70,7 +88,6 @@ public class GenerateReviewFragment extends Fragment {
scrollview = (ScrollView) view.findViewById(R.id.scrollview); scrollview = (ScrollView) view.findViewById(R.id.scrollview);
pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress); pbProgress = (ProgressBar) view.findViewById(R.id.pbProgress);
tvWalletName = (TextView) view.findViewById(R.id.tvWalletName);
tvWalletPassword = (TextView) view.findViewById(R.id.tvWalletPassword); tvWalletPassword = (TextView) view.findViewById(R.id.tvWalletPassword);
tvWalletAddress = (TextView) view.findViewById(R.id.tvWalletAddress); tvWalletAddress = (TextView) view.findViewById(R.id.tvWalletAddress);
tvWalletViewKey = (TextView) view.findViewById(R.id.tvWalletViewKey); tvWalletViewKey = (TextView) view.findViewById(R.id.tvWalletViewKey);
@ -79,12 +96,14 @@ public class GenerateReviewFragment extends Fragment {
bCopyAddress = (ImageButton) view.findViewById(R.id.bCopyAddress); bCopyAddress = (ImageButton) view.findViewById(R.id.bCopyAddress);
bAdvancedInfo = (Button) view.findViewById(R.id.bAdvancedInfo); bAdvancedInfo = (Button) view.findViewById(R.id.bAdvancedInfo);
llAdvancedInfo = (LinearLayout) view.findViewById(R.id.llAdvancedInfo); llAdvancedInfo = (LinearLayout) view.findViewById(R.id.llAdvancedInfo);
llPassword = (LinearLayout) view.findViewById(R.id.llPassword);
bAccept = (Button) view.findViewById(R.id.bAccept); bAccept = (Button) view.findViewById(R.id.bAccept);
boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet; boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet;
tvWalletMnemonic.setTextIsSelectable(testnet); tvWalletMnemonic.setTextIsSelectable(testnet);
tvWalletSpendKey.setTextIsSelectable(testnet); tvWalletSpendKey.setTextIsSelectable(testnet);
tvWalletPassword.setTextIsSelectable(testnet);
bAccept.setOnClickListener(new View.OnClickListener() { bAccept.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -112,17 +131,20 @@ public class GenerateReviewFragment extends Fragment {
} }
}); });
showProgress();
Bundle args = getArguments(); Bundle args = getArguments();
String path = args.getString("path"); type = args.getString("type");
String password = args.getString("password"); walletPath = args.getString("path");
this.type = args.getString("type"); showDetails(args.getString("password"));
new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR,
path, password);
return view; return view;
} }
void showDetails(String password) {
walletPassword = password;
showProgress();
tvWalletPassword.setText(null);
new AsyncShow().executeOnExecutor(MoneroThreadPoolExecutor.MONERO_THREAD_POOL_EXECUTOR, walletPath);
}
void copyViewKey() { void copyViewKey() {
Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_viewkey), tvWalletViewKey.getText().toString()); 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(); Toast.makeText(getActivity(), getString(R.string.message_copy_viewkey), Toast.LENGTH_SHORT).show();
@ -151,15 +173,11 @@ public class GenerateReviewFragment extends Fragment {
String type; String type;
private void acceptWallet() { private void acceptWallet() {
String name = tvWalletName.getText().toString();
String password = tvWalletPassword.getText().toString();
bAccept.setEnabled(false); bAccept.setEnabled(false);
acceptCallback.onAccept(name, password); acceptCallback.onAccept(walletName, walletPassword);
} }
private class AsyncShow extends AsyncTask<String, Void, Boolean> { private class AsyncShow extends AsyncTask<String, Void, Boolean> {
String password;
String name; String name;
String address; String address;
String seed; String seed;
@ -170,9 +188,8 @@ public class GenerateReviewFragment extends Fragment {
@Override @Override
protected Boolean doInBackground(String... params) { protected Boolean doInBackground(String... params) {
if (params.length != 2) return false; if (params.length != 1) return false;
String walletPath = params[0]; String walletPath = params[0];
password = params[1];
Wallet wallet; Wallet wallet;
boolean closeWallet; boolean closeWallet;
@ -180,7 +197,7 @@ public class GenerateReviewFragment extends Fragment {
wallet = GenerateReviewFragment.this.walletCallback.getWallet(); wallet = GenerateReviewFragment.this.walletCallback.getWallet();
closeWallet = false; closeWallet = false;
} else { } else {
wallet = WalletManager.getInstance().openWallet(walletPath, password); wallet = WalletManager.getInstance().openWallet(walletPath, walletPassword);
closeWallet = true; closeWallet = true;
} }
name = wallet.getName(); name = wallet.getName();
@ -204,13 +221,16 @@ public class GenerateReviewFragment extends Fragment {
protected void onPostExecute(Boolean result) { protected void onPostExecute(Boolean result) {
super.onPostExecute(result); super.onPostExecute(result);
if (!isAdded()) return; // never mind if (!isAdded()) return; // never mind
tvWalletName.setText(name); walletName = name;
if (result) { if (result) {
if (type.equals(GenerateReviewFragment.VIEW_TYPE_ACCEPT)) { if (type.equals(GenerateReviewFragment.VIEW_TYPE_ACCEPT)) {
tvWalletPassword.setText(password);
bAccept.setVisibility(View.VISIBLE); bAccept.setVisibility(View.VISIBLE);
bAccept.setEnabled(true); bAccept.setEnabled(true);
} }
if (walletPassword != null) {
llPassword.setVisibility(View.VISIBLE);
tvWalletPassword.setText(walletPassword);
}
tvWalletAddress.setText(address); tvWalletAddress.setText(address);
tvWalletMnemonic.setText(seed); tvWalletMnemonic.setText(seed);
tvWalletViewKey.setText(viewKey); tvWalletViewKey.setText(viewKey);
@ -233,6 +253,7 @@ public class GenerateReviewFragment extends Fragment {
} }
Listener activityCallback = null; Listener activityCallback = null;
ProgressListener progressCallback = null;
AcceptListener acceptCallback = null; AcceptListener acceptCallback = null;
ListenerWithWallet walletCallback = null; ListenerWithWallet walletCallback = null;
@ -242,6 +263,13 @@ public class GenerateReviewFragment extends Fragment {
void setToolbarButton(int type); void setToolbarButton(int type);
} }
public interface ProgressListener {
void showProgressDialog(int msgId);
void dismissProgressDialog();
}
public interface AcceptListener { public interface AcceptListener {
void onAccept(String name, String password); void onAccept(String name, String password);
} }
@ -256,6 +284,9 @@ public class GenerateReviewFragment extends Fragment {
if (context instanceof Listener) { if (context instanceof Listener) {
this.activityCallback = (Listener) context; this.activityCallback = (Listener) context;
} }
if (context instanceof ProgressListener) {
this.progressCallback = (ProgressListener) context;
}
if (context instanceof AcceptListener) { if (context instanceof AcceptListener) {
this.acceptCallback = (AcceptListener) context; this.acceptCallback = (AcceptListener) context;
} }
@ -268,9 +299,7 @@ public class GenerateReviewFragment extends Fragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
Timber.d("onResume()"); Timber.d("onResume()");
String name = tvWalletName.getText().toString(); activityCallback.setTitle(walletName, getString(R.string.details_title));
if (name.isEmpty()) name = null;
activityCallback.setTitle(name, getString(R.string.details_title));
activityCallback.setToolbarButton( activityCallback.setToolbarButton(
GenerateReviewFragment.VIEW_TYPE_ACCEPT.equals(type) ? Toolbar.BUTTON_NONE : Toolbar.BUTTON_BACK); GenerateReviewFragment.VIEW_TYPE_ACCEPT.equals(type) ? Toolbar.BUTTON_NONE : Toolbar.BUTTON_BACK);
} }
@ -295,7 +324,198 @@ public class GenerateReviewFragment extends Fragment {
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater 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); inflater.inflate(R.menu.wallet_details_menu, menu);
super.onCreateOptionsMenu(menu, inflater); 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, Void, Boolean> {
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;
}
} }

View File

@ -54,7 +54,9 @@ import com.m2049r.xmrwallet.model.NetworkType;
import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.service.WalletService; import com.m2049r.xmrwallet.service.WalletService;
import com.m2049r.xmrwallet.util.CrazyPassEncoder;
import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.KeyStoreHelper;
import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor; import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
import com.m2049r.xmrwallet.widget.Toolbar; import com.m2049r.xmrwallet.widget.Toolbar;
@ -71,7 +73,8 @@ import timber.log.Timber;
public class LoginActivity extends SecureActivity public class LoginActivity extends SecureActivity
implements LoginFragment.Listener, GenerateFragment.Listener, 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"; private static final String GENERATE_STACK = "gen";
static final int DAEMON_TIMEOUT = 500; // deamon must respond in 500ms 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 @Override
public void onAddWallet(String type) { public void onAddWallet(String type) {
if (checkServiceRunning()) return; if (checkServiceRunning()) return;
startGenerateFragment(type); 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) { 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; Context context = LoginActivity.this;
LayoutInflater li = LayoutInflater.from(context); LayoutInflater li = LayoutInflater.from(context);
View promptsView = li.inflate(R.layout.prompt_password, null); 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) { public void onClick(DialogInterface dialog, int id) {
Helper.hideKeyboardAlways(LoginActivity.this); Helper.hideKeyboardAlways(LoginActivity.this);
dialog.cancel(); dialog.cancel();
passwordDialog = null; openDialog = null;
} }
}); });
passwordDialog = alertDialogBuilder.create(); openDialog = alertDialogBuilder.create();
passwordDialog.setOnShowListener(new DialogInterface.OnShowListener() { openDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override @Override
public void onShow(DialogInterface dialog) { public void onShow(DialogInterface dialog) {
Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE); Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
@ -501,8 +518,8 @@ public class LoginActivity extends SecureActivity
String pass = etPassword.getEditText().getText().toString(); String pass = etPassword.getEditText().getText().toString();
if (processPasswordEntry(wallet, pass, action)) { if (processPasswordEntry(wallet, pass, action)) {
Helper.hideKeyboardAlways(LoginActivity.this); Helper.hideKeyboardAlways(LoginActivity.this);
passwordDialog.dismiss(); openDialog.dismiss();
passwordDialog = null; openDialog = null;
} else { } else {
etPassword.setError(getString(R.string.bad_password)); etPassword.setError(getString(R.string.bad_password));
} }
@ -511,8 +528,6 @@ public class LoginActivity extends SecureActivity
} }
}); });
Helper.showKeyboard(passwordDialog);
// accept keyboard "ok" // accept keyboard "ok"
etPassword.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { etPassword.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
@ -520,8 +535,8 @@ public class LoginActivity extends SecureActivity
String pass = etPassword.getEditText().getText().toString(); String pass = etPassword.getEditText().getText().toString();
if (processPasswordEntry(wallet, pass, action)) { if (processPasswordEntry(wallet, pass, action)) {
Helper.hideKeyboardAlways(LoginActivity.this); Helper.hideKeyboardAlways(LoginActivity.this);
passwordDialog.dismiss(); openDialog.dismiss();
passwordDialog = null; openDialog = null;
} else { } else {
etPassword.setError(getString(R.string.bad_password)); 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()), String walletPath = new File(Helper.getWalletRoot(getApplicationContext()),
walletName + ".keys").getAbsolutePath(); 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 { interface PasswordAction {
@ -546,8 +584,9 @@ public class LoginActivity extends SecureActivity
} }
private boolean processPasswordEntry(String walletName, String pass, PasswordAction action) { private boolean processPasswordEntry(String walletName, String pass, PasswordAction action) {
if (checkWalletPassword(walletName, pass)) { String walletPassword = getWalletPassword(walletName, pass);
action.action(walletName, pass); if (walletPassword != null) {
action.action(walletName, walletPassword);
return true; return true;
} else { } else {
return false; return false;
@ -598,7 +637,8 @@ public class LoginActivity extends SecureActivity
ProgressDialog progressDialog = null; ProgressDialog progressDialog = null;
private void showProgressDialog(int msgId) { @Override
public void showProgressDialog(int msgId) {
showProgressDialog(msgId, 0); showProgressDialog(msgId, 0);
} }
@ -617,7 +657,8 @@ public class LoginActivity extends SecureActivity
} }
} }
private void dismissProgressDialog() { @Override
public void dismissProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()) { if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss(); progressDialog.dismiss();
} }
@ -1077,6 +1118,9 @@ public class LoginActivity extends SecureActivity
case R.id.action_details_help: case R.id.action_details_help:
HelpFragment.display(getSupportFragmentManager(), R.string.help_details); HelpFragment.display(getSupportFragmentManager(), R.string.help_details);
return true; return true;
case R.id.action_details_changepw:
onWalletChangePassword();
return true;
case R.id.action_license_info: case R.id.action_license_info:
AboutFragment.display(getSupportFragmentManager()); AboutFragment.display(getSupportFragmentManager());
return true; return true;

View File

@ -174,6 +174,9 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
case R.id.action_details_help: case R.id.action_details_help:
HelpFragment.display(getSupportFragmentManager(), R.string.help_details); HelpFragment.display(getSupportFragmentManager(), R.string.help_details);
return true; return true;
case R.id.action_details_changepw:
onWalletChangePassword();
return true;
case R.id.action_help_send: case R.id.action_help_send:
HelpFragment.display(getSupportFragmentManager(), R.string.help_send); HelpFragment.display(getSupportFragmentManager(), R.string.help_send);
return true; 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 @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
Timber.d("onCreate()"); Timber.d("onCreate()");
@ -682,6 +699,7 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_POSITIVE:
Bundle extras = new Bundle(); Bundle extras = new Bundle();
extras.putString("type", GenerateReviewFragment.VIEW_TYPE_WALLET); extras.putString("type", GenerateReviewFragment.VIEW_TYPE_WALLET);
extras.putString("password", getIntent().getExtras().getString(REQUEST_PW));
replaceFragment(new GenerateReviewFragment(), null, extras); replaceFragment(new GenerateReviewFragment(), null, extras);
break; break;
case DialogInterface.BUTTON_NEGATIVE: case DialogInterface.BUTTON_NEGATIVE:

View File

@ -291,7 +291,7 @@ public class SendFragment extends Fragment
pagerAdapter.notifyDataSetChanged(); 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 @Override
public SendWizardFragment getItem(int position) { public SendWizardFragment getItem(int position) {
Timber.d("getItem(%d) CREATE", position); Timber.d("getItem(%d) CREATE", position);
Timber.d("Mode=" + mode.toString()); Timber.d("Mode=%s", mode.toString());
if (mode == Mode.XMR) { if (mode == Mode.XMR) {
switch (position) { switch (position) {
case POS_ADDRESS: case POS_ADDRESS:

View File

@ -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<std::string> &unknown_parameters, std::string &error) = 0; //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<std::string> &unknown_parameters, std::string &error) = 0;
//virtual bool rescanSpent() = 0; //virtual bool rescanSpent() = 0;
} }

View File

@ -271,6 +271,7 @@ public class WalletManager {
//TODO static std::tuple<bool, std::string, std::string, std::string, std::string> checkUpdates(const std::string &software, const std::string &subdir); //TODO static std::tuple<bool, std::string, std::string, std::string, std::string> checkUpdates(const std::string &software, const std::string &subdir);
static public native void initLogger(String argv0, String defaultLogBaseName); static public native void initLogger(String argv0, String defaultLogBaseName);
//TODO: maybe put these in an enum like in monero core - but why? //TODO: maybe put these in an enum like in monero core - but why?
static public int LOGLEVEL_SILENT = -1; static public int LOGLEVEL_SILENT = -1;
static public int LOGLEVEL_WARN = 0; static public int LOGLEVEL_WARN = 0;
@ -278,9 +279,14 @@ public class WalletManager {
static public int LOGLEVEL_DEBUG = 2; static public int LOGLEVEL_DEBUG = 2;
static public int LOGLEVEL_TRACE = 3; static public int LOGLEVEL_TRACE = 3;
static public int LOGLEVEL_MAX = 4; static public int LOGLEVEL_MAX = 4;
static public native void setLogLevel(int level); static public native void setLogLevel(int level);
static public native void logDebug(String category, String message); static public native void logDebug(String category, String message);
static public native void logInfo(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 logWarning(String category, String message);
static public native void logError(String category, String message); static public native void logError(String category, String message);
} }

View File

@ -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
}
}
}

View File

@ -47,6 +47,7 @@ import com.m2049r.xmrwallet.model.WalletManager;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.math.BigInteger;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.net.URL; 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) { static public void setMoneroHome(Context context) {
try { try {
String home = getStorage(context, HOME_DIR).getAbsolutePath(); String home = getStorage(context, HOME_DIR).getAbsolutePath();

View File

@ -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";
}
}

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scrollview" android:id="@+id/scrollview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -7,7 +8,7 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<ProgressBar <ProgressBar
@ -18,55 +19,6 @@
android:indeterminate="true" android:indeterminate="true"
android:visibility="gone" /> android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/header_top_first"
android:orientation="horizontal"
android:weightSum="2">
<TextView
style="@style/MoneroLabel.Heading"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/generate_wallet_label"
android:textAlignment="center" />
<TextView
style="@style/MoneroLabel.Heading"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/generate_password_label"
android:textAlignment="center" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top"
android:orientation="horizontal"
android:weightSum="2">
<TextView
android:id="@+id/tvWalletName"
style="@style/MoneroText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textAlignment="center" />
<TextView
android:id="@+id/tvWalletPassword"
style="@style/MoneroText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="***"
android:textAlignment="center" />
</LinearLayout>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -96,7 +48,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top" android:layout_marginTop="@dimen/data_top"
android:textAlignment="center" /> android:textAlignment="center"
tools:text="49RBjxQ2zgf7t17w7So9ngcEY9obKzsrr6Dsah24MNSMiMBEeiYPP5CCTBq4GpZcEYN5Zf3upsLiwd5PezePE1i4Tf3rryY" />
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -118,7 +71,33 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top" android:layout_marginTop="@dimen/data_top"
android:background="@drawable/backgound_seed" android:background="@drawable/backgound_seed"
android:textAlignment="center" /> 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" />
<LinearLayout
android:id="@+id/llPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/header_top"
android:orientation="vertical"
android:visibility="gone">
<TextView
style="@style/MoneroLabel.Heading"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:text="@string/generate_crazypass_label" />
<TextView
android:id="@+id/tvWalletPassword"
style="@style/MoneroText.Monospace"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top"
android:textAlignment="center"
tools:text="2ExEN7droBLzWW2CEE2d7kv7E/iCZwNn:hKwUmg3:hg" />
</LinearLayout>
<Button <Button
android:id="@+id/bAccept" android:id="@+id/bAccept"
@ -178,20 +157,16 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top" android:layout_marginTop="@dimen/data_top"
android:textAlignment="center" /> android:textAlignment="center"
tools:text="e4aba454d78799dbd8d576bf70e7f15a06e91f1ecfd404053f91519a48df2a0e" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/header_top">
<TextView <TextView
style="@style/MoneroLabel.Heading" style="@style/MoneroLabel.Heading"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="@dimen/header_top"
android:text="@string/generate_spendkey_label" /> android:text="@string/generate_spendkey_label" />
</FrameLayout>
<TextView <TextView
android:id="@+id/tvWalletSpendKey" android:id="@+id/tvWalletSpendKey"
@ -199,7 +174,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/data_top" android:layout_marginTop="@dimen/data_top"
android:textAlignment="center" /> android:textAlignment="center"
tools:text="4925a6254d2dff71df53f13b8334f9ceda6cdd5821aa895f7de1d2640500740d" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletPasswordA"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorEnabled="true">
<android.support.design.widget.TextInputEditText
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="@string/generate_password_hint"
android:imeOptions="actionNext"
android:inputType="textVisiblePassword"
android:textAlignment="textStart" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/etWalletPasswordB"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/section_top"
app:errorEnabled="true">
<android.support.design.widget.TextInputEditText
style="@style/MoneroEdit"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="@string/generate_password_hint"
android:imeOptions="actionDone"
android:inputType="textVisiblePassword"
android:textAlignment="textStart" />
</android.support.design.widget.TextInputLayout>
</LinearLayout>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_details_help"
android:icon="@drawable/ic_help_white_24dp"
android:orderInCategory="100"
android:title="@string/menu_help"
app:showAsAction="ifRoom" />
</menu>

View File

@ -7,6 +7,12 @@
android:icon="@drawable/ic_help_white_24dp" android:icon="@drawable/ic_help_white_24dp"
android:orderInCategory="100" android:orderInCategory="100"
android:title="@string/menu_help" android:title="@string/menu_help"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
<item
android:id="@+id/action_details_changepw"
android:orderInCategory="200"
android:title="@string/menu_changepw"
app:showAsAction="never" />
</menu> </menu>

View File

@ -74,6 +74,26 @@
completo a tus fondos. completo a tus fondos.
¡Mantenerla segura y privada es muy importante, ya que permite a <em>quien sea</em> ¡Mantenerla segura y privada es muy importante, ya que permite a <em>quien sea</em>
acceso completo a tus fondos! Si no la anotaste en un lugar seguro aún, ¡por favor hazlo! acceso completo a tus fondos! Si no la anotaste en un lugar seguro aún, ¡por favor hazlo!
<h2>Wallet Files Recovery Password</h2>
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.<br/>
<h3>CrAzYpass</h3>
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&apos;s security
features based on the passphrase you chose (on creation or by changing it). This makes it
extremenly difficult to hack!<br/>
This feature is mandatory for all newly created wallets.
<h3>Legacy Password</h3>
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!
<h3>CrAzYpass wallets</h3>
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.<br/>
By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
that this will generate a new Recovery Password. Write it down!
<h2>Clave de vista</h2> <h2>Clave de vista</h2>
Tu clave de vista puede usarse para monitorizar las transacciones entrantes de tu Tu clave de vista puede usarse para monitorizar las transacciones entrantes de tu
monedero sin otorgar permiso para gastar los fondos guardados en ella. monedero sin otorgar permiso para gastar los fondos guardados en ella.

View File

@ -12,6 +12,7 @@
<string name="menu_rename">Renombrar &#8230;</string> <string name="menu_rename">Renombrar &#8230;</string>
<string name="menu_archive">Archivar</string> <string name="menu_archive">Archivar</string>
<string name="menu_backup">Copia de seguridad</string> <string name="menu_backup">Copia de seguridad</string>
<string name="menu_changepw">[Change Passphrase]</string>
<string name="password_weak">Sigue escribiendo &#8230;</string> <string name="password_weak">Sigue escribiendo &#8230;</string>
<string name="password_fair">Mas o menos.</string> <string name="password_fair">Mas o menos.</string>
@ -46,6 +47,7 @@
<string name="archive_progress">Archivado en progreso</string> <string name="archive_progress">Archivado en progreso</string>
<string name="rename_progress">Cambio de nombre en progreso</string> <string name="rename_progress">Cambio de nombre en progreso</string>
<string name="open_progress">Comprobando conexión con el daemon</string> <string name="open_progress">Comprobando conexión con el daemon</string>
<string name="changepw_progress">[Change Password in progress]</string>
<string name="service_progress">Guardando todo\n¡Puede llevar un tiempo!</string> <string name="service_progress">Guardando todo\n¡Puede llevar un tiempo!</string>
@ -55,6 +57,8 @@
<string name="archive_failed">¡Archivado fallido!</string> <string name="archive_failed">¡Archivado fallido!</string>
<string name="delete_failed">¡Borrado fallido!</string> <string name="delete_failed">¡Borrado fallido!</string>
<string name="rename_failed">¡Cambio de nombre fallido!</string> <string name="rename_failed">¡Cambio de nombre fallido!</string>
<string name="changepw_failed">[Change Password failed!]</string>
<string name="changepw_success">[Password changed]</string>
<string name="label_daemon">Nodo</string> <string name="label_daemon">Nodo</string>
<string name="prompt_daemon">([&lt;usuario&gt;:&lt;contraseña&gt;@]&lt;daemon&gt;[:&lt;puerto&gt;])</string> <string name="prompt_daemon">([&lt;usuario&gt;:&lt;contraseña&gt;@]&lt;daemon&gt;[:&lt;puerto&gt;])</string>
@ -84,6 +88,8 @@
<string name="prompt_rename">Renombrar %1$s</string> <string name="prompt_rename">Renombrar %1$s</string>
<string name="prompt_changepw">[New Passphrase for %1$s]</string>
<string name="prompt_changepwB">[Repeat Passphrase for %1$s]</string>
<string name="prompt_password">Contraseña para %1$s</string> <string name="prompt_password">Contraseña para %1$s</string>
<string name="prompt_send_password">Confirmar Contraseña</string> <string name="prompt_send_password">Confirmar Contraseña</string>
<string name="bad_password">¡Contraseña incorrecta!</string> <string name="bad_password">¡Contraseña incorrecta!</string>
@ -134,9 +140,11 @@
<string name="generate_title">Crear monedero</string> <string name="generate_title">Crear monedero</string>
<string name="generate_name_hint">Nombre del monedero</string> <string name="generate_name_hint">Nombre del monedero</string>
<string name="generate_password_hint">Frase de Contraseña</string> <string name="generate_password_hint">Frase de Contraseña</string>
<string name="generate_bad_passwordB">[Passphrases do not match]</string>
<string name="generate_empty_passwordB">[Passphrase may not be empty]</string>
<string name="generate_buttonGenerate">¡Házme ya un monedero!</string> <string name="generate_buttonGenerate">¡Házme ya un monedero!</string>
<string name="generate_seed">Semilla Mnemotécnica</string> <string name="generate_seed">Semilla Mnemotécnica</string>
<string name="generate_button_accept">¡He apuntado estas 25 palabras!</string> <string name="generate_button_accept">[I have noted the above info!]</string>
<string name="generate_button_backup">Copia de Seguridad</string> <string name="generate_button_backup">Copia de Seguridad</string>
<string name="generate_button_export">Exportar Claves</string> <string name="generate_button_export">Exportar Claves</string>
@ -169,6 +177,7 @@
<string name="generate_spendkey_label">Clave de Gasto</string> <string name="generate_spendkey_label">Clave de Gasto</string>
<string name="generate_mnemonic_label">Semilla Mnemotécnica</string> <string name="generate_mnemonic_label">Semilla Mnemotécnica</string>
<string name="generate_restoreheight_label">Altura de Restauración:</string> <string name="generate_restoreheight_label">Altura de Restauración:</string>
<string name="generate_crazypass_label">[Wallet Files Restore Password]</string>
<string name="generate_check_key">Introduce una clave válida</string> <string name="generate_check_key">Introduce una clave válida</string>
<string name="generate_check_address">Introduce una dirección válida</string> <string name="generate_check_address">Introduce una dirección válida</string>
@ -278,8 +287,6 @@
<i>Vas a enviar XMR y el destinatario recibirá BTC usando el servicio <b>XMR.TO</b>.</i> <i>Vas a enviar XMR y el destinatario recibirá BTC usando el servicio <b>XMR.TO</b>.</i>
]]></string> ]]></string>
<string name="info_send_xmrto_success_sending">Enviando</string> <string name="info_send_xmrto_success_sending">Enviando</string>
<string name="info_send_xmrto_success_status_label">Estado:</string>
<string name="info_send_xmrto_success_status">%1$s es %1$s (#%1$d)</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string> <string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_txdetails_xmrto_key">Clave:</string> <string name="info_txdetails_xmrto_key">Clave:</string>
<string name="info_txdetails_xmrto_address">Dirección:</string> <string name="info_txdetails_xmrto_address">Dirección:</string>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="about_title">[About]</string>
<string name="about_close">Chiudi</string> <string name="about_close">Chiudi</string>
<string name="about_whoami">Io sono monerujo</string> <string name="about_whoami">Io sono monerujo</string>
<string name="about_version">Versione %1$s (%2$d)</string> <string name="about_version">Versione %1$s (%2$d)</string>
@ -46,569 +47,4 @@
<p>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. <p>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.
</p> </p>
]]></string> ]]></string>
<string name="about_licenses" translatable="false"><![CDATA[
<h1>Open Source Licenses</h1>
<h2>Licensed under the Apache License, Version 2.0</h2>
<h3>monerujo (https://github.com/m2049r/xmrwallet)</h3>
Copyright (c) 2017 m2049r et al.
<h3>The Android Open Source Project</h3>
<ul>
<li>com.android.support:design</li>
<li>com.android.support:support-v4</li>
<li>com.android.support:appcompat-v7</li>
<li>com.android.support:recyclerview-v7</li>
<li>com.android.support:cardview-v7</li>
<li>com.android.support.constraint:constraint-layout</li>
<li>com.android.support:support-annotations</li>
<li>com.android.support:support-vector-drawable</li>
<li>com.android.support:animated-vector-drawable</li>
<li>com.android.support:transition</li>
<li>com.android.support:support-compat</li>
<li>com.android.support:support-media-compat</li>
<li>com.android.support:support-core-utils</li>
<li>com.android.support:support-core-ui</li>
<li>com.android.support:support-fragment</li>
<li>com.android.support.constraint:constraint-layout-solver</li>
</ul>
Copyright (c) The Android Open Source Project
<h3>OkHttp</h3>
Copyright (c) 2014 Square, Inc.
<h3>Timber</h3>
Copyright (c) 2013 Jake Wharton
<h3>com.google.zxing:core</h3>
Copyright (c) 2012 ZXing authors
<h3>me.dm7.barcodescanner</h3>
<ul>
<li>me.dm7.barcodescanner:core</li>
<li>me.dm7.barcodescanner:zxing</li>
</ul>
Copyright (c) 2014 Dushyanth Maguluru
<h3>AndroidLicensesPage (https://github.com/adamsp/AndroidLicensesPage)</h3>
Copyright (c) 2013 Adam Speakman
<h3>Apache License, Version 2.0, January 2004</h3>
http://www.apache.org/licenses/<br/>
<br/>
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION<br/>
<br/>
1. Definitions.<br/>
<br/>
\"License\" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.<br/>
<br/>
\"Licensor\" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.<br/>
<br/>
\"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.<br/>
<br/>
\"You\" (or \"Your\") shall mean an individual or Legal Entity
exercising permissions granted by this License.<br/>
<br/>
\"Source\" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.<br/>
<br/>
\"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.<br/>
<br/>
\"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).<br/>
<br/>
\"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.<br/>
<br/>
\"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.\"<br/>
<br/>
\"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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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:<br/>
<br/>
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and<br/>
<br/>
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and<br/>
<br/>
(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<br/>
<br/>
(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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.
<h2>Licensed under the MIT License</h2>
<h3>rapidjson (https://github.com/monero-project/monero/blob/master/external/rapidjson)</h3>
Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
<h3>easylogging++ (https://github.com/monero-project/monero/tree/master/external/easylogging%2B%2B)</h3>
Copyright (c) 2017 muflihun.com
<h3>zxcvbn4j (https://github.com/nulab/zxcvbn4j)</h3>
Copyright (c) 2014 Nulab Inc
<h3>The MIT License</h3>
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:<br/>
<br/>
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br/>
<br/>
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.<br/>
<h2>Monero (https://github.com/monero-project/monero)</h2>
<h3>The Monero Project License</h3>
Copyright (c) 2014-2017, The Monero Project. All rights reserved.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:<br/>
<br/>
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
Parts of the project are originally copyright (c) 2012-2013 The Cryptonote
developers
<h2>OpenSSL (https://github.com/openssl/openssl)</h2>
<h3>LICENSE ISSUES</h3>
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.
<h3>OpenSSL License</h3>
Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:<br/>
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.<br/>
<br/>
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.<br/>
<br/>
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/)\"<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
6. Redistributions of any form whatsoever must retain the following
acknowledgment:<br/>
\"This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/)\"<br/>
<br/>
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.<br/>
<br/>
This product includes cryptographic software written by Eric Young
(eay@cryptsoft.com). This product includes software written by Tim
Hudson (tjh@cryptsoft.com).
<h3>Original SSLeay License</h3>
Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com). All rights reserved.<br/>
<br/>
This package is an SSL implementation written
by Eric Young (eay@cryptsoft.com).
The implementation was written so as to conform with Netscapes SSL.<br/>
<br/>
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).<br/>
<br/>
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.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:<br/>
1. Redistributions of source code must retain the copyright
notice, this list of conditions and the following disclaimer.<br/>
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.<br/>
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:<br/>
\"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 :-).<br/>
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)\"<br/>
<br/>
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.<br/>
<br/>
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.]
<h2>Boost</h2>
<ul>
<li>Boost (https://sourceforge.net/projects/boost)</li>
<li>Boost/Archive (https://github.com/monero-project/monero/tree/master/external/boost/archive)</li>
</ul>
<h3>Boost Software License - Version 1.0 - August 17th, 2003</h3>
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:<br/>
<br/>
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.<br/>
<br/>
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.
<h2>Unbound (https://github.com/monero-project/monero/blob/master/external/unbound)</h2>
<h3>Unbound Software License</h3>
Copyright (c) 2007, NLnet Labs. All rights reserved.<br/>
<br/>
This software is open source.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:<br/>
<br/>
Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.
<h2>MiniUPnPc (https://github.com/monero-project/monero/blob/master/external/miniupnpc)</h2>
Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
<h3>The MiniUPnPc License</h3>
Copyright (c) 2005-2015, Thomas BERNARD. All rights reserved.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:<br/>
<br/>
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.<br/>
* 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.<br/>
* The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.<br/>
<br/>
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.
<h2>liblmdb (https://github.com/monero-project/monero/blob/master/external/db_drivers/liblmdb)</h2>
<h3>The OpenLDAP Public License, Version 2.8, 17 August 2003</h3>
Redistribution and use of this software and associated documentation
(\"Software\"), with or without modification, are permitted provided
that the following conditions are met:<br/>
<br/>
1. Redistributions in source form must retain copyright statements
and notices,<br/>
<br/>
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<br/>
<br/>
3. Redistributions must contain a verbatim copy of this document.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
OpenLDAP is a registered trademark of the OpenLDAP Foundation.<br/>
<br/>
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.
<h2>epee (https://github.com/monero-project/monero/blob/master/contrib/epee)</h2>
Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net. All rights reserved.
<h3>The epee License</h3>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:<br/>
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.<br/>
* 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.<br/>
* 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.<br/>
<br/>
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.
<h2>'Poppins' Font</h2>
<h3>SIL Open Font License</h3>
<p>Copyright (c) 2014, Indian Type Foundry (info@indiantypefoundry.com).</p>
<p>This Font Software is licensed under the SIL Open Font License, Version 1.1.<br />
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>PREAMBLE<br />
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.</p>
<p>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.</p>
<p>DEFINITIONS<br />
&#8220;Font Software&#8221; 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.</p>
<p>&#8220;Reserved Font Name&#8221; refers to any names specified as such after the copyright statement(s).</p>
<p>&#8220;Original Version&#8221; refers to the collection of Font Software components as distributed by the Copyright Holder(s).</p>
<p>&#8220;Modified Version&#8221; refers to any derivative made by adding to, deleting, or substituting&#8212;in part or in whole&#8212;any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.</p>
<p>&#8220;Author&#8221; refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.</p>
<p>PERMISSION &amp; CONDITIONS<br />
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:</p>
<p>1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>TERMINATION<br />
This license becomes null and void if any of the above conditions are not met.</p>
<p>DISCLAIMER<br />
THE FONT SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, 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.</p>
]]></string>
</resources> </resources>

View File

@ -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.</p> La password viene usata per rendere sicuri i dati del portafoglio sul tuo dispositivo. Utilizza una password efficace - meglio se una passphrase.</p>
<h2>Prendi nota del tuo Seed Mnemonico!</h2> <h2>Prendi nota del tuo Seed Mnemonico!</h2>
<p>Sulla schermata successiva troverai il tuo \"Seed Mnemonico\" da 25 parole. <p>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&apos;unica informazione necessaria per recuperare il tuo portafoglio d&apos;ora in poi
e avere pieno accesso ai tuoi fondi. e avere pieno accesso ai tuoi fondi.
E' molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a <em>chiunque</em> E&apos; molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a <em>chiunque</em>
pieno accesso ai tuoi fondi!</p> pieno accesso ai tuoi fondi!</p>
<p>Se perdi la password del tuo portafoglio, puoi ancora recuperare il tuo portafoglio mediante il Seed Mnemonico.</p> <p>Se perdi la password del tuo portafoglio, puoi ancora recuperare il tuo portafoglio mediante il Seed Mnemonico.</p>
<p>Non esiste alcun modo per recuperare il tuo Seed Mnemonico; se lo perdi, tutti i tuoi fondi andranno persi! <p>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 - La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo. Utilizza una password efficace -
ancora meglio se una passphrase.</p> ancora meglio se una passphrase.</p>
<p>Inserisci il tuo Seed nel campo \"Seed Mnemonico\".<p> <p>Inserisci il tuo Seed nel campo \"Seed Mnemonico\".<p>
<p>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'<em>intera</em> blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere <em>parecchio</em> tempo.</p> <p>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&apos;<em>intera</em> blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere <em>parecchio</em> tempo.</p>
]]></string> ]]></string>
<string name="help_create_keys"><![CDATA[ <string name="help_create_keys"><![CDATA[
@ -35,7 +35,7 @@
La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo. Utilizza una password efficace - La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo. Utilizza una password efficace -
ancora meglio se una passphrase.</p> ancora meglio se una passphrase.</p>
<p>Inserisci il tuo indirizzo Monero nel campo \"Indirizzo Pubblico\" e riempi i campi \"Chiave di Visualizzazione\" e \"Chiave di Spesa\".</p> <p>Inserisci il tuo indirizzo Monero nel campo \"Indirizzo Pubblico\" e riempi i campi \"Chiave di Visualizzazione\" e \"Chiave di Spesa\".</p>
<p>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'<em>intera</em> blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere <em>parecchio</em> tempo.</p> <p>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&apos;<em>intera</em> blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere <em>parecchio</em> tempo.</p>
]]></string> ]]></string>
<string name="help_create_view"><![CDATA[ <string name="help_create_view"><![CDATA[
@ -45,7 +45,7 @@
La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo. Utilizza una password efficace - La password viene usata per rendere sicuri i dati relativi al portafoglio sul tuo dispositivo. Utilizza una password efficace -
ancora meglio se una passphrase.</p> ancora meglio se una passphrase.</p>
<p>Inserisci il tuo indirizzo Monero nel campo \"Indirizzo Pubblico\" e riempi il campo \"Chiave di Visualizzazione\".</p> <p>Inserisci il tuo indirizzo Monero nel campo \"Indirizzo Pubblico\" e riempi il campo \"Chiave di Visualizzazione\".</p>
<p>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'<em>intera</em> blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere <em>parecchio</em> tempo.</p> <p>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&apos;<em>intera</em> blockchain alla ricerca di transazioni che appartengono al tuo indirizzo. Questo processo può richiedere <em>parecchio</em> tempo.</p>
]]></string> ]]></string>
<string name="help_details"><![CDATA[ <string name="help_details"><![CDATA[
@ -53,10 +53,30 @@
<h2>Indirizzo pubblico</h2> <h2>Indirizzo pubblico</h2>
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. 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.
<h2>Seed Mnemonico</h2> <h2>Seed Mnemonico</h2>
Questa è l'unica informazione necessaria per recuperare il tuo portafoglio in futuro Questa è l&apos;unica informazione necessaria per recuperare il tuo portafoglio in futuro
e avere pieno accesso ai tuoi fondi. e avere pieno accesso ai tuoi fondi.
E' molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a <em>chiunque</em> E&apos; molto importante mantenerlo privato e conservarlo in un luogo sicuro, poiché può concedere a <em>chiunque</em>
pieno accesso ai tuoi Moneroj! Se non lo hai già fatto, annotati il Seed Mnemonico e conservalo in un luogo sicuro! pieno accesso ai tuoi Moneroj! Se non lo hai già fatto, annotati il Seed Mnemonico e conservalo in un luogo sicuro!
<h2>Wallet Files Recovery Password</h2>
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.<br/>
<h3>CrAzYpass</h3>
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&apos;s security
features based on the passphrase you chose (on creation or by changing it). This makes it
extremenly difficult to hack!<br/>
This feature is mandatory for all newly created wallets.
<h3>Legacy Password</h3>
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!
<h3>CrAzYpass wallets</h3>
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.<br/>
By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
that this will generate a new Recovery Password. Write it down!
<h2>Chiave di Visualizzazione</h2> <h2>Chiave di Visualizzazione</h2>
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. 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.
<h2>Chiave di Spesa</h2> <h2>Chiave di Spesa</h2>
@ -69,8 +89,8 @@
<p>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/<p> <p>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/<p>
<p>Monerujo contiene già una lista di nodi remoti e tiene memoria degli ultimi cinque nodi utilizzati.</p> <p>Monerujo contiene già una lista di nodi remoti e tiene memoria degli ultimi cinque nodi utilizzati.</p>
<h2>Portafogli</h2> <h2>Portafogli</h2>
<p>Qui trovi la lista dei portafogli. I portafogli sono fisicamente posizionati nella cartella <tt>monerujo</tt> nella memoria interna del tuo dispositivo. Puoi usare un'applicazione di file explorer per vederli. <p>Qui trovi la lista dei portafogli. I portafogli sono fisicamente posizionati nella cartella <tt>monerujo</tt> nella memoria interna del tuo dispositivo. Puoi usare un&apos;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.</p> E&apos; buona regola effettuare dei backup periodici di questa cartella su un&apos;unità di memoria esterna al tuo dispositivo nel caso in cui il tuo dispositivo esploda o venga rubato.</p>
<p>Seleziona un portafoglio per aprirlo o premere \"+\" per crearne uno nuovo. <p>Seleziona un portafoglio per aprirlo o premere \"+\" per crearne uno nuovo.
Oppure seleziona una delle operazioni di portafoglio:</p> Oppure seleziona una delle operazioni di portafoglio:</p>
<h3>Dettagli</h3> <h3>Dettagli</h3>
@ -80,9 +100,9 @@
<h3>Rinomina</h3> <h3>Rinomina</h3>
<p>Rinomina il portafoglio. Le copie di backup non vengono rinominate.</p> <p>Rinomina il portafoglio. Le copie di backup non vengono rinominate.</p>
<h3>Backup</h3> <h3>Backup</h3>
<p>Fai una copia del portafoglio all'interno della cartella <tt>backups</tt>, a sua volta all'interno della cartella <tt>monerujo</tt>, sovrascrivendo eventuali copie precedenti.</p> <p>Fai una copia del portafoglio all&apos;interno della cartella <tt>backups</tt>, a sua volta all&apos;interno della cartella <tt>monerujo</tt>, sovrascrivendo eventuali copie precedenti.</p>
<h3>Archivia</h3> <h3>Archivia</h3>
<p>Effettua un backup e successivamente elimina il portafoglio. La copia rimane nella cartella <tt>backups</tt>. 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.</p> <p>Effettua un backup e successivamente elimina il portafoglio. La copia rimane nella cartella <tt>backups</tt>. Se non hai più bisogno dei backup, è meglio cancellare i file interessati utilizzando un&apos;applicazione di tipo file explorer o un&apos;applicazione di rimozione dati sicura.</p>
]]></string> ]]></string>
<string name="help_wallet"><![CDATA[ <string name="help_wallet"><![CDATA[
@ -102,11 +122,11 @@
<string name="help_tx_details"><![CDATA[ <string name="help_tx_details"><![CDATA[
<h1>Dettagli della transazione</h1> <h1>Dettagli della transazione</h1>
<h2>Destinazione</h2> <h2>Destinazione</h2>
Questo è l'indirizzo pubblico del portafoglio cui hai inviato Moneroj Questo è l&apos;indirizzo pubblico del portafoglio cui hai inviato Moneroj
<h2>ID Pagamento</h2> <h2>ID Pagamento</h2>
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&apos;informazione opzionale e privata. Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.
<h2>TX ID (ID di Transazione)</h2> <h2>TX ID (ID di Transazione)</h2>
Questo è l'ID della transazione che puoi usare per identificare la tua transazione offuscata su un explorer della blockchain Monero, ad esempio <a href="https://xmrchain.net/">https://xmrchain.net/</a> Questo è l&apos;ID della transazione che puoi usare per identificare la tua transazione offuscata su un explorer della blockchain Monero, ad esempio <a href="https://xmrchain.net/">https://xmrchain.net/</a>
<h2>TX KEY (Chiave di transazione)</h2> <h2>TX KEY (Chiave di transazione)</h2>
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. 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.
<h2>Blocco</h2> <h2>Blocco</h2>
@ -116,27 +136,27 @@
<string name="help_send"><![CDATA[ <string name="help_send"><![CDATA[
<h1>Invia</h1> <h1>Invia</h1>
<h2>Indirizzo del ricevente</h2> <h2>Indirizzo del ricevente</h2>
<p>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.</p> <p>Questo è l&apos;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&apos;indirizzo corretto e che tu non stia inviando Moneroj ad un indirizzo sbagliato.</p>
<p>Oltre ad inviare Moneroj (XMR), puoi anche inviare Bitcoin (BTC) attraverso il servizio XMR.TO (vedi https://xmr.to <p>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.</p> per ulteriori dettagli). Controlla la sezione sull&apos;invio di BTC più avanti.</p>
<h2>ID Pagamento</h2> <h2>ID Pagamento</h2>
<p>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.<p> <p>Puoi usare un ID Pagamento per identificare la causale della transazione. Questa è un&apos;informazione opzionale e privata. Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.<p>
<h2>Dimensione dell'anello (ring size)</h2> <h2>Dimensione dell&apos;anello (ring size)</h2>
<p>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.</p> <p>Monerujo dà la possibilità di scegliere la dimensione dell&apos;anello (ring size) da utilizzare in una transazione. Se sei un utente poco esperto, ti raccomandiamo di utilizzare una dimensione dell&apos;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&apos;anello elevata rischia di mettere in risalto la tua transazione sulla blockchain.</p>
<h2>Priorità</h2> <h2>Priorità</h2>
<p>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 è <p>Questa impostazione determina la velocità con la quale la tua transazione verrà inclusa nella blockchain. Un&apos;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&apos;interno della blockchain. La priorità di default è
\"Media\".</p> \"Media\".</p>
<h1>Inviare BTC</h1> <h1>Inviare BTC</h1>
<h2>XMR.TO</h2> <h2>XMR.TO</h2>
<p>XMR.TO è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin. <p>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.</p> Utilizziamo le API XMR.TO per integrare pagamenti Bitcoin all&apos;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.</p>
<h2>Tasso di cambio XMR.TO<h2> <h2>Tasso di cambio XMR.TO<h2>
<p>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?</p> <p>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&apos;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?</p>
<h2>Ordine XMR.TO<h2> <h2>Ordine XMR.TO<h2>
<p>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.</p> <p>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.</p>
<h2>Chiave segreta XMR.TO<h2> <h2>Chiave segreta XMR.TO<h2>
<p>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.</p> <p>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.</p>
<p>Considera che questa chiave segreta è valida solamente per 24 ore dall'inizio della transazione!</p> <p>Considera che questa chiave segreta è valida solamente per 24 ore dall&apos;inizio della transazione!</p>
<h2>Conto alla rovescia XMR.TO!</h2> <h2>Conto alla rovescia XMR.TO!</h2>
<p>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\".</p> <p>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\".</p>
]]></string> ]]></string>
@ -145,14 +165,14 @@
<h1>Inviare BTC</h1> <h1>Inviare BTC</h1>
<h2>XMR.TO</h2> <h2>XMR.TO</h2>
<p>XMR.TO è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin. <p>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.</p> Utilizziamo le API XMR.TO per integrare pagamenti Bitcoin all&apos;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.</p>
<h2>Tasso di cambio XMR.TO<h2> <h2>Tasso di cambio XMR.TO<h2>
<p>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?</p> <p>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&apos;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?</p>
<h2>XMR.TO Order<h2> <h2>XMR.TO Order<h2>
<p>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.</p> <p>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.</p>
<h2>Chiave segreta XMR.TO<h2> <h2>Chiave segreta XMR.TO<h2>
<p>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.</p> <p>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.</p>
<p>Considera che questa chiave segreta è valida solamente per 24 ore dall'inizio della transazione!</p> <p>Considera che questa chiave segreta è valida solamente per 24 ore dall&apos;inizio della transazione!</p>
<h2>Conto alla rovescia XMR.TO!</h2> <h2>Conto alla rovescia XMR.TO!</h2>
<p>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\".</p> <p>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\".</p>
]]></string> ]]></string>

View File

@ -1,6 +1,4 @@
<resources> <resources>
<string name="app_name" translatable="false">monerujo</string>
<string name="login_activity_name" translatable="false">monerujo</string>
<string name="wallet_activity_name">Portafoglio</string> <string name="wallet_activity_name">Portafoglio</string>
<string name="menu_testnet">Testnet</string> <string name="menu_testnet">Testnet</string>
@ -14,6 +12,7 @@
<string name="menu_rename">Rinomina &#8230;</string> <string name="menu_rename">Rinomina &#8230;</string>
<string name="menu_archive">Archivia</string> <string name="menu_archive">Archivia</string>
<string name="menu_backup">Backup</string> <string name="menu_backup">Backup</string>
<string name="menu_changepw">[Change Passphrase]</string>
<string name="password_weak">Continua a scrivere &#8230;</string> <string name="password_weak">Continua a scrivere &#8230;</string>
<string name="password_fair">Mah &#8230;</string> <string name="password_fair">Mah &#8230;</string>
@ -44,9 +43,7 @@
<string name="info_send_xmrto_success_order_label">Ordine XMR.TO</string> <string name="info_send_xmrto_success_order_label">Ordine XMR.TO</string>
<string name="info_send_xmrto_success_sending">Invio in corso</string> <string name="info_send_xmrto_success_sending">Invio in corso</string>
<string name="info_send_xmrto_success_status_label">Stato:</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string> <string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_status">%1$s è %1$s (#%1$d)</string>
<string name="info_txdetails_xmrto_key">Chiave:</string> <string name="info_txdetails_xmrto_key">Chiave:</string>
<string name="info_txdetails_xmrto_address">Indirizzo:</string> <string name="info_txdetails_xmrto_address">Indirizzo:</string>
@ -73,8 +70,8 @@
<string name="info_paymentid_intergrated">ID pagamento integrato</string> <string name="info_paymentid_intergrated">ID pagamento integrato</string>
<string name="info_prepare_tx">Preparando la tua transazione</string> <string name="info_prepare_tx">Preparando la tua transazione</string>
<string name="label_send_progress_xmrto_create">Creando l'ordine XMR.TO</string> <string name="label_send_progress_xmrto_create">Creando l\'ordine XMR.TO</string>
<string name="label_send_progress_xmrto_query">Richiedendo l'ordine XMR.TO</string> <string name="label_send_progress_xmrto_query">Richiedendo l\'ordine XMR.TO</string>
<string name="label_send_progress_create_tx">Preparando la transazione Monero</string> <string name="label_send_progress_create_tx">Preparando la transazione Monero</string>
<string name="label_send_progress_queryparms">Richiedendo i parametri XMR.TO</string> <string name="label_send_progress_queryparms">Richiedendo i parametri XMR.TO</string>
@ -111,6 +108,7 @@
<string name="archive_progress">Archiviazione in corso</string> <string name="archive_progress">Archiviazione in corso</string>
<string name="rename_progress">Rinomina in corso</string> <string name="rename_progress">Rinomina in corso</string>
<string name="open_progress">Controllando connessione con daemon</string> <string name="open_progress">Controllando connessione con daemon</string>
<string name="changepw_progress">[Change Password in progress]</string>
<string name="service_progress">Rimettendo le cose a posto &#8230;\nPuò richiedere del tempo!</string> <string name="service_progress">Rimettendo le cose a posto &#8230;\nPuò richiedere del tempo!</string>
@ -120,6 +118,8 @@
<string name="archive_failed">Archiviazione fallita!</string> <string name="archive_failed">Archiviazione fallita!</string>
<string name="delete_failed">Cancellazione fallita!</string> <string name="delete_failed">Cancellazione fallita!</string>
<string name="rename_failed">Rinomina fallita!</string> <string name="rename_failed">Rinomina fallita!</string>
<string name="changepw_failed">[Change Password failed!]</string>
<string name="changepw_success">[Password changed]</string>
<string name="label_daemon">Nodo</string> <string name="label_daemon">Nodo</string>
<string name="prompt_daemon">([&lt;utente&gt;:&lt;password&gt;@]&lt;daemon&gt;[:&lt;porta&gt;])</string> <string name="prompt_daemon">([&lt;utente&gt;:&lt;password&gt;@]&lt;daemon&gt;[:&lt;porta&gt;])</string>
@ -151,12 +151,14 @@
<string name="prompt_rename">Rinomina %1$s</string> <string name="prompt_rename">Rinomina %1$s</string>
<string name="prompt_changepw">[New Passphrase for %1$s]</string>
<string name="prompt_changepwB">[Repeat Passphrase for %1$s]</string>
<string name="prompt_password">Password per %1$s</string> <string name="prompt_password">Password per %1$s</string>
<string name="prompt_send_password">Conferma Password</string> <string name="prompt_send_password">Conferma Password</string>
<string name="bad_password">Password errata!</string> <string name="bad_password">Password errata!</string>
<string name="bad_wallet">Il portafoglio non esiste!</string> <string name="bad_wallet">Il portafoglio non esiste!</string>
<string name="error_not_wallet">Questo non è un portafoglio!</string> <string name="error_not_wallet">Questo non è un portafoglio!</string>
<string name="prompt_daemon_missing">Deve essere impostato l'indirizzo del Daemon!</string> <string name="prompt_daemon_missing">Deve essere impostato l\'indirizzo del Daemon!</string>
<string name="prompt_wrong_net">Il portafoglio non si abbina con la rete selezionata</string> <string name="prompt_wrong_net">Il portafoglio non si abbina con la rete selezionata</string>
<string name="warn_daemon_unavailable">Impossibile connettersi al daemon! Prova di nuovo.</string> <string name="warn_daemon_unavailable">Impossibile connettersi al daemon! Prova di nuovo.</string>
<string name="panic">Qualcosa è sbagliato!</string> <string name="panic">Qualcosa è sbagliato!</string>
@ -169,7 +171,6 @@
<string name="title_amount">Ammontare</string> <string name="title_amount">Ammontare</string>
<string name="title_date">Data</string> <string name="title_date">Data</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR non confermati</string> <string name="xmr_unconfirmed_amount">+ %1$s XMR non confermati</string>
<string name="xmr" translatable="false">XMR</string>
<string name="label_transactions">Transazioni</string> <string name="label_transactions">Transazioni</string>
<string name="text_daemonConnected">Daemon connesso!</string> <string name="text_daemonConnected">Daemon connesso!</string>
@ -185,8 +186,8 @@
<string name="status_syncing">Scansionando:</string> <string name="status_syncing">Scansionando:</string>
<string name="prompt_problems">Problemi</string> <string name="prompt_problems">Problemi</string>
<string name="message_strorage_not_writable">L'unità di memoria esterna non è scrivibile! Aiuto!</string> <string name="message_strorage_not_writable">L\'unità di memoria esterna non è scrivibile! Aiuto!</string>
<string name="message_strorage_not_permitted">Abbiamo veramente bisogno di questi permessi sull'unità di memoria esterna!</string> <string name="message_strorage_not_permitted">Abbiamo veramente bisogno di questi permessi sull\'unità di memoria esterna!</string>
<string name="message_camera_not_permitted">Nessuna telecamera = Nessuna scansione QR!</string> <string name="message_camera_not_permitted">Nessuna telecamera = Nessuna scansione QR!</string>
<string name="label_copy_viewkey">Chiave di visualizzazione</string> <string name="label_copy_viewkey">Chiave di visualizzazione</string>
@ -205,9 +206,11 @@
<string name="generate_title">Crea portafoglio</string> <string name="generate_title">Crea portafoglio</string>
<string name="generate_name_hint">Nome del portafoglio</string> <string name="generate_name_hint">Nome del portafoglio</string>
<string name="generate_password_hint">Passphrase del portafoglio</string> <string name="generate_password_hint">Passphrase del portafoglio</string>
<string name="generate_bad_passwordB">[Passphrases do not match]</string>
<string name="generate_empty_passwordB">[Passphrase may not be empty]</string>
<string name="generate_buttonGenerate">Fammi subito un portafoglio!</string> <string name="generate_buttonGenerate">Fammi subito un portafoglio!</string>
<string name="generate_seed">Seed mnemonico</string> <string name="generate_seed">Seed mnemonico</string>
<string name="generate_button_accept">Ho preso nota di queste 25 parole!</string> <string name="generate_button_accept">[I have noted the above info!]</string>
<string name="generate_button_backup">Backup</string> <string name="generate_button_backup">Backup</string>
<string name="generate_button_export">Esporta chiavi</string> <string name="generate_button_export">Esporta chiavi</string>
@ -240,6 +243,7 @@
<string name="generate_spendkey_label">Chiave di spesa</string> <string name="generate_spendkey_label">Chiave di spesa</string>
<string name="generate_mnemonic_label">Seed mnemonico</string> <string name="generate_mnemonic_label">Seed mnemonico</string>
<string name="generate_restoreheight_label">Altezza di ripristino:</string> <string name="generate_restoreheight_label">Altezza di ripristino:</string>
<string name="generate_crazypass_label">[Wallet Files Restore Password]</string>
<string name="generate_check_key">Inserisci una chiave valida</string> <string name="generate_check_key">Inserisci una chiave valida</string>
<string name="generate_check_address">Inserisci un indirizzo valido</string> <string name="generate_check_address">Inserisci un indirizzo valido</string>
@ -348,13 +352,6 @@
<string name="archive_alert_yes">Sì, procedi!</string> <string name="archive_alert_yes">Sì, procedi!</string>
<string name="archive_alert_no">No grazie!</string> <string name="archive_alert_no">No grazie!</string>
<string-array name="mixin" translatable="false">
<item>Ringsize 7</item>
<item>Ringsize 10</item>
<item>Ringsize 13</item>
<item>Ringsize 26</item>
</string-array>
<string-array name="priority"> <string-array name="priority">
<item>Priority Default</item> <item>Priority Default</item>
<item>Priority Bassa</item> <item>Priority Bassa</item>
@ -362,12 +359,6 @@
<item>Priority Alta</item> <item>Priority Alta</item>
</string-array> </string-array>
<string-array name="currency" translatable="false">
<item>XMR</item>
<item>EUR</item>
<item>USD</item>
</string-array>
<string name="fab_create_new">Crea un nuovo portafoglio</string> <string name="fab_create_new">Crea un nuovo portafoglio</string>
<string name="fab_restore_viewonly">Recupera un portafoglio solo-visualizzazione</string> <string name="fab_restore_viewonly">Recupera un portafoglio solo-visualizzazione</string>
<string name="fab_restore_key">Recupera un portafoglio dalle chiavi private</string> <string name="fab_restore_key">Recupera un portafoglio dalle chiavi private</string>

View File

@ -45,569 +45,4 @@
<h2>聯絡我們</h2> <h2>聯絡我們</h2>
<p>若您對於本隱私權政策或如何處理您的個人資料仍有問題,歡迎寄送電子郵件至 privacy@monerujo.io。</p> <p>若您對於本隱私權政策或如何處理您的個人資料仍有問題,歡迎寄送電子郵件至 privacy@monerujo.io。</p>
]]></string> ]]></string>
<string name="about_licenses" translatable="false"><![CDATA[
<h1>開放原始碼條款</h1>
<h2>Licensed under the Apache License, Version 2.0</h2>
<h3>monerujo (https://github.com/m2049r/xmrwallet)</h3>
Copyright (c) 2017 m2049r et al.
<h3>The Android Open Source Project</h3>
<ul>
<li>com.android.support:design</li>
<li>com.android.support:support-v4</li>
<li>com.android.support:appcompat-v7</li>
<li>com.android.support:recyclerview-v7</li>
<li>com.android.support:cardview-v7</li>
<li>com.android.support.constraint:constraint-layout</li>
<li>com.android.support:support-annotations</li>
<li>com.android.support:support-vector-drawable</li>
<li>com.android.support:animated-vector-drawable</li>
<li>com.android.support:transition</li>
<li>com.android.support:support-compat</li>
<li>com.android.support:support-media-compat</li>
<li>com.android.support:support-core-utils</li>
<li>com.android.support:support-core-ui</li>
<li>com.android.support:support-fragment</li>
<li>com.android.support.constraint:constraint-layout-solver</li>
</ul>
Copyright (c) The Android Open Source Project
<h3>OkHttp</h3>
Copyright (c) 2014 Square, Inc.
<h3>Timber</h3>
Copyright (c) 2013 Jake Wharton
<h3>com.google.zxing:core</h3>
Copyright (c) 2012 ZXing authors
<h3>me.dm7.barcodescanner</h3>
<ul>
<li>me.dm7.barcodescanner:core</li>
<li>me.dm7.barcodescanner:zxing</li>
</ul>
Copyright (c) 2014 Dushyanth Maguluru
<h3>AndroidLicensesPage (https://github.com/adamsp/AndroidLicensesPage)</h3>
Copyright (c) 2013 Adam Speakman
<h3>Apache License, Version 2.0, January 2004</h3>
http://www.apache.org/licenses/<br/>
<br/>
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION<br/>
<br/>
1. Definitions.<br/>
<br/>
\"License\" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.<br/>
<br/>
\"Licensor\" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.<br/>
<br/>
\"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.<br/>
<br/>
\"You\" (or \"Your\") shall mean an individual or Legal Entity
exercising permissions granted by this License.<br/>
<br/>
\"Source\" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.<br/>
<br/>
\"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.<br/>
<br/>
\"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).<br/>
<br/>
\"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.<br/>
<br/>
\"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.\"<br/>
<br/>
\"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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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:<br/>
<br/>
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and<br/>
<br/>
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and<br/>
<br/>
(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<br/>
<br/>
(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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.
<h2>Licensed under the MIT License</h2>
<h3>rapidjson (https://github.com/monero-project/monero/blob/master/external/rapidjson)</h3>
Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
<h3>easylogging++ (https://github.com/monero-project/monero/tree/master/external/easylogging%2B%2B)</h3>
Copyright (c) 2017 muflihun.com
<h3>zxcvbn4j (https://github.com/nulab/zxcvbn4j)</h3>
Copyright (c) 2014 Nulab Inc
<h3>The MIT License</h3>
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:<br/>
<br/>
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br/>
<br/>
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.<br/>
<h2>Monero (https://github.com/monero-project/monero)</h2>
<h3>The Monero Project License</h3>
Copyright (c) 2014-2017, The Monero Project. All rights reserved.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:<br/>
<br/>
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
Parts of the project are originally copyright (c) 2012-2013 The Cryptonote
developers
<h2>OpenSSL (https://github.com/openssl/openssl)</h2>
<h3>LICENSE ISSUES</h3>
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.
<h3>OpenSSL License</h3>
Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:<br/>
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.<br/>
<br/>
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.<br/>
<br/>
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/)\"<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
6. Redistributions of any form whatsoever must retain the following
acknowledgment:<br/>
\"This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/)\"<br/>
<br/>
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.<br/>
<br/>
This product includes cryptographic software written by Eric Young
(eay@cryptsoft.com). This product includes software written by Tim
Hudson (tjh@cryptsoft.com).
<h3>Original SSLeay License</h3>
Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com). All rights reserved.<br/>
<br/>
This package is an SSL implementation written
by Eric Young (eay@cryptsoft.com).
The implementation was written so as to conform with Netscapes SSL.<br/>
<br/>
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).<br/>
<br/>
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.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:<br/>
1. Redistributions of source code must retain the copyright
notice, this list of conditions and the following disclaimer.<br/>
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.<br/>
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:<br/>
\"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 :-).<br/>
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)\"<br/>
<br/>
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.<br/>
<br/>
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.]
<h2>Boost</h2>
<ul>
<li>Boost (https://sourceforge.net/projects/boost)</li>
<li>Boost/Archive (https://github.com/monero-project/monero/tree/master/external/boost/archive)</li>
</ul>
<h3>Boost Software License - Version 1.0 - August 17th, 2003</h3>
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:<br/>
<br/>
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.<br/>
<br/>
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.
<h2>Unbound (https://github.com/monero-project/monero/blob/master/external/unbound)</h2>
<h3>Unbound Software License</h3>
Copyright (c) 2007, NLnet Labs. All rights reserved.<br/>
<br/>
This software is open source.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:<br/>
<br/>
Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.
<h2>MiniUPnPc (https://github.com/monero-project/monero/blob/master/external/miniupnpc)</h2>
Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
<h3>The MiniUPnPc License</h3>
Copyright (c) 2005-2015, Thomas BERNARD. All rights reserved.<br/>
<br/>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:<br/>
<br/>
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.<br/>
* 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.<br/>
* The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.<br/>
<br/>
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.
<h2>liblmdb (https://github.com/monero-project/monero/blob/master/external/db_drivers/liblmdb)</h2>
<h3>The OpenLDAP Public License, Version 2.8, 17 August 2003</h3>
Redistribution and use of this software and associated documentation
(\"Software\"), with or without modification, are permitted provided
that the following conditions are met:<br/>
<br/>
1. Redistributions in source form must retain copyright statements
and notices,<br/>
<br/>
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<br/>
<br/>
3. Redistributions must contain a verbatim copy of this document.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
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.<br/>
<br/>
OpenLDAP is a registered trademark of the OpenLDAP Foundation.<br/>
<br/>
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.
<h2>epee (https://github.com/monero-project/monero/blob/master/contrib/epee)</h2>
Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net. All rights reserved.
<h3>The epee License</h3>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:<br/>
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.<br/>
* 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.<br/>
* 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.<br/>
<br/>
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.
<h2>'Poppins' Font</h2>
<h3>SIL Open Font License</h3>
<p>Copyright (c) 2014, Indian Type Foundry (info@indiantypefoundry.com).</p>
<p>This Font Software is licensed under the SIL Open Font License, Version 1.1.<br />
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>PREAMBLE<br />
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.</p>
<p>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.</p>
<p>DEFINITIONS<br />
&#8220;Font Software&#8221; 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.</p>
<p>&#8220;Reserved Font Name&#8221; refers to any names specified as such after the copyright statement(s).</p>
<p>&#8220;Original Version&#8221; refers to the collection of Font Software components as distributed by the Copyright Holder(s).</p>
<p>&#8220;Modified Version&#8221; refers to any derivative made by adding to, deleting, or substituting&#8212;in part or in whole&#8212;any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.</p>
<p>&#8220;Author&#8221; refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.</p>
<p>PERMISSION &amp; CONDITIONS<br />
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:</p>
<p>1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>TERMINATION<br />
This license becomes null and void if any of the above conditions are not met.</p>
<p>DISCLAIMER<br />
THE FONT SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, 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.</p>
]]></string>
</resources> </resources>

View File

@ -56,6 +56,26 @@
會失去你的Monero其他人可以透過這個地址發送Monero到你的錢包。 會失去你的Monero其他人可以透過這個地址發送Monero到你的錢包。
<h2>記憶種子碼</h2> <h2>記憶種子碼</h2>
這是你唯一需要用來回復錢包的資訊並且可以用來取用錢包的完全權限。妥善保護好這份種子碼是相當重要的事情,因為它可以給予<em>任何人</em>對你的錢包操作的權限! 如果你還尚未在安全的地方抄寫保存這份種子碼,請盡速進行。 這是你唯一需要用來回復錢包的資訊並且可以用來取用錢包的完全權限。妥善保護好這份種子碼是相當重要的事情,因為它可以給予<em>任何人</em>對你的錢包操作的權限! 如果你還尚未在安全的地方抄寫保存這份種子碼,請盡速進行。
<h2>Wallet Files Recovery Password</h2>
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.<br/>
<h3>CrAzYpass</h3>
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&apos;s security
features based on the passphrase you chose (on creation or by changing it). This makes it
extremenly difficult to hack!<br/>
This feature is mandatory for all newly created wallets.
<h3>Legacy Password</h3>
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!
<h3>CrAzYpass wallets</h3>
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.<br/>
By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
that this will generate a new Recovery Password. Write it down!
<h2>查看金鑰</h2> <h2>查看金鑰</h2>
查看金鑰可以被用在查看錢包的入帳金額而不包含花費錢包資金的權限。 查看金鑰可以被用在查看錢包的入帳金額而不包含花費錢包資金的權限。
<h2>花費金鑰</h2> <h2>花費金鑰</h2>

View File

@ -12,6 +12,7 @@
<string name="menu_rename">重新命名 &#8230;</string> <string name="menu_rename">重新命名 &#8230;</string>
<string name="menu_archive">封存</string> <string name="menu_archive">封存</string>
<string name="menu_backup">備份</string> <string name="menu_backup">備份</string>
<string name="menu_changepw">[Change Passphrase]</string>
<string name="password_weak">再長一點 &#8230;</string> <string name="password_weak">再長一點 &#8230;</string>
<string name="password_fair">&#8230;</string> <string name="password_fair">&#8230;</string>
@ -42,9 +43,7 @@
<string name="info_send_xmrto_success_order_label">XMR.TO訂單</string> <string name="info_send_xmrto_success_order_label">XMR.TO訂單</string>
<string name="info_send_xmrto_success_sending">發送中</string> <string name="info_send_xmrto_success_sending">發送中</string>
<string name="info_send_xmrto_success_status_label">狀態:</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string> <string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_status">%1$s 是 %1$s (#%1$d)</string>
<string name="info_txdetails_xmrto_key">金鑰:</string> <string name="info_txdetails_xmrto_key">金鑰:</string>
<string name="info_txdetails_xmrto_address">地址:</string> <string name="info_txdetails_xmrto_address">地址:</string>
@ -109,6 +108,7 @@
<string name="archive_progress">正在封存中</string> <string name="archive_progress">正在封存中</string>
<string name="rename_progress">正在重新命名</string> <string name="rename_progress">正在重新命名</string>
<string name="open_progress">正在檢查daemon連線</string> <string name="open_progress">正在檢查daemon連線</string>
<string name="changepw_progress">[Change Password in progress]</string>
<string name="service_progress">正在關閉錢包 &#8230;\n可能會花費些許時間!</string> <string name="service_progress">正在關閉錢包 &#8230;\n可能會花費些許時間!</string>
@ -118,6 +118,8 @@
<string name="archive_failed">封存失敗!</string> <string name="archive_failed">封存失敗!</string>
<string name="delete_failed">刪除失敗!</string> <string name="delete_failed">刪除失敗!</string>
<string name="rename_failed">重新命名失敗!</string> <string name="rename_failed">重新命名失敗!</string>
<string name="changepw_failed">[Change Password failed!]</string>
<string name="changepw_success">[Password changed]</string>
<string name="label_daemon">節點</string> <string name="label_daemon">節點</string>
<string name="prompt_daemon">([&lt;名稱&gt;:&lt;密碼&gt;@]&lt;節點&gt;[:&lt;port&gt;])</string> <string name="prompt_daemon">([&lt;名稱&gt;:&lt;密碼&gt;@]&lt;節點&gt;[:&lt;port&gt;])</string>
@ -149,6 +151,8 @@
<string name="prompt_rename">重新命名 %1$s</string> <string name="prompt_rename">重新命名 %1$s</string>
<string name="prompt_changepw">[New Passphrase for %1$s]</string>
<string name="prompt_changepwB">[Repeat Passphrase for %1$s]</string>
<string name="prompt_password">%1$s 的密碼</string> <string name="prompt_password">%1$s 的密碼</string>
<string name="prompt_send_password">確認密碼</string> <string name="prompt_send_password">確認密碼</string>
<string name="bad_password">密碼錯誤!</string> <string name="bad_password">密碼錯誤!</string>
@ -202,9 +206,11 @@
<string name="generate_title">建立錢包</string> <string name="generate_title">建立錢包</string>
<string name="generate_name_hint">錢包名稱</string> <string name="generate_name_hint">錢包名稱</string>
<string name="generate_password_hint">錢包密碼</string> <string name="generate_password_hint">錢包密碼</string>
<string name="generate_bad_passwordB">[Passphrases do not match]</string>
<string name="generate_empty_passwordB">[Passphrase may not be empty]</string>
<string name="generate_buttonGenerate">建立錢包!</string> <string name="generate_buttonGenerate">建立錢包!</string>
<string name="generate_seed">記憶種子碼</string> <string name="generate_seed">記憶種子碼</string>
<string name="generate_button_accept">我已抄寫下這25個單字!</string> <string name="generate_button_accept">[I have noted the above info!]</string>
<string name="generate_button_backup">備份</string> <string name="generate_button_backup">備份</string>
<string name="generate_button_export">匯出金鑰</string> <string name="generate_button_export">匯出金鑰</string>
@ -237,6 +243,7 @@
<string name="generate_spendkey_label">花費金鑰</string> <string name="generate_spendkey_label">花費金鑰</string>
<string name="generate_mnemonic_label">記憶種子碼</string> <string name="generate_mnemonic_label">記憶種子碼</string>
<string name="generate_restoreheight_label">回復高度:</string> <string name="generate_restoreheight_label">回復高度:</string>
<string name="generate_crazypass_label">[Wallet Files Restore Password]</string>
<string name="generate_check_key">輸入有效的金鑰</string> <string name="generate_check_key">輸入有效的金鑰</string>
<string name="generate_check_address">輸入有效的地址</string> <string name="generate_check_address">輸入有效的地址</string>

View File

@ -62,6 +62,26 @@
This is the only data needed to recover your wallet at a later point and gain full access to 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 <em>anyone</em> full your funds. Keeping this private and secure is very important, as it gives <em>anyone</em> full
access to your Monero! If you havent written this down somewhere safe please do! access to your Monero! If you havent written this down somewhere safe please do!
<h2>Wallet Files Recovery Password</h2>
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.<br/>
<h3>CrAzYpass</h3>
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&apos;s security
features based on the passphrase you chose (on creation or by changing it). This makes it
extremenly difficult to hack!<br/>
This feature is mandatory for all newly created wallets.
<h3>Legacy Password</h3>
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!
<h3>CrAzYpass wallets</h3>
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.<br/>
By selecting \"Change Passphrase\" from the menu, you can choose another passphrase. Beware
that this will generate a new Recovery Password. Write it down!
<h2>View key</h2> <h2>View key</h2>
Your view key can be used to monitor incoming transactions to your wallet without giving Your view key can be used to monitor incoming transactions to your wallet without giving
permission to spend the funds inside your wallet. permission to spend the funds inside your wallet.

View File

@ -14,6 +14,7 @@
<string name="menu_rename">Rename &#8230;</string> <string name="menu_rename">Rename &#8230;</string>
<string name="menu_archive">Archive</string> <string name="menu_archive">Archive</string>
<string name="menu_backup">Backup</string> <string name="menu_backup">Backup</string>
<string name="menu_changepw">Change Passphrase</string>
<string name="password_weak">Continue typing &#8230;</string> <string name="password_weak">Continue typing &#8230;</string>
<string name="password_fair">Meh &#8230;</string> <string name="password_fair">Meh &#8230;</string>
@ -44,9 +45,7 @@
<string name="info_send_xmrto_success_order_label">XMR.TO Order</string> <string name="info_send_xmrto_success_order_label">XMR.TO Order</string>
<string name="info_send_xmrto_success_sending">Sending</string> <string name="info_send_xmrto_success_sending">Sending</string>
<string name="info_send_xmrto_success_status_label">Status:</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string> <string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_status">%1$s is %1$s (#%1$d)</string>
<string name="info_txdetails_xmrto_key">Key:</string> <string name="info_txdetails_xmrto_key">Key:</string>
<string name="info_txdetails_xmrto_address">Address:</string> <string name="info_txdetails_xmrto_address">Address:</string>
@ -111,6 +110,7 @@
<string name="archive_progress">Archive in progress</string> <string name="archive_progress">Archive in progress</string>
<string name="rename_progress">Rename in progress</string> <string name="rename_progress">Rename in progress</string>
<string name="open_progress">Checking daemon connection</string> <string name="open_progress">Checking daemon connection</string>
<string name="changepw_progress">Change Password in progress</string>
<string name="service_progress">Wrapping things up &#8230;\nThis can take a while!</string> <string name="service_progress">Wrapping things up &#8230;\nThis can take a while!</string>
@ -120,6 +120,8 @@
<string name="archive_failed">Archive failed!</string> <string name="archive_failed">Archive failed!</string>
<string name="delete_failed">Delete failed!</string> <string name="delete_failed">Delete failed!</string>
<string name="rename_failed">Rename failed!</string> <string name="rename_failed">Rename failed!</string>
<string name="changepw_failed">Change Password failed!</string>
<string name="changepw_success">Password changed</string>
<string name="label_daemon">Node</string> <string name="label_daemon">Node</string>
<string name="prompt_daemon">([&lt;user&gt;:&lt;pass&gt;@]&lt;daemon&gt;[:&lt;port&gt;])</string> <string name="prompt_daemon">([&lt;user&gt;:&lt;pass&gt;@]&lt;daemon&gt;[:&lt;port&gt;])</string>
@ -151,6 +153,8 @@
<string name="prompt_rename">Rename %1$s</string> <string name="prompt_rename">Rename %1$s</string>
<string name="prompt_changepw">New Passphrase for %1$s</string>
<string name="prompt_changepwB">Repeat Passphrase for %1$s</string>
<string name="prompt_password">Password for %1$s</string> <string name="prompt_password">Password for %1$s</string>
<string name="prompt_send_password">Confirm Password</string> <string name="prompt_send_password">Confirm Password</string>
<string name="bad_password">Incorrect password!</string> <string name="bad_password">Incorrect password!</string>
@ -205,9 +209,11 @@
<string name="generate_title">Create Wallet</string> <string name="generate_title">Create Wallet</string>
<string name="generate_name_hint">Wallet Name</string> <string name="generate_name_hint">Wallet Name</string>
<string name="generate_password_hint">Wallet Passphrase</string> <string name="generate_password_hint">Wallet Passphrase</string>
<string name="generate_bad_passwordB">Passphrases do not match</string>
<string name="generate_empty_passwordB">Passphrase may not be empty</string>
<string name="generate_buttonGenerate">Make me a wallet already!</string> <string name="generate_buttonGenerate">Make me a wallet already!</string>
<string name="generate_seed">Mnemonic Seed</string> <string name="generate_seed">Mnemonic Seed</string>
<string name="generate_button_accept">I have noted these 25 words!</string> <string name="generate_button_accept">I have noted the mnemonic seed</string>
<string name="generate_button_backup">Backup</string> <string name="generate_button_backup">Backup</string>
<string name="generate_button_export">Export Keys</string> <string name="generate_button_export">Export Keys</string>
@ -240,6 +246,7 @@
<string name="generate_spendkey_label">Spend Key</string> <string name="generate_spendkey_label">Spend Key</string>
<string name="generate_mnemonic_label">Mnemonic Seed</string> <string name="generate_mnemonic_label">Mnemonic Seed</string>
<string name="generate_restoreheight_label">Restore Height:</string> <string name="generate_restoreheight_label">Restore Height:</string>
<string name="generate_crazypass_label">Wallet Files Restore Password</string>
<string name="generate_check_key">Enter valid Key</string> <string name="generate_check_key">Enter valid Key</string>
<string name="generate_check_address">Enter valid Address</string> <string name="generate_check_address">Enter valid Address</string>

View File

@ -28,5 +28,5 @@ ext {
okHttpVersion = '3.9.0' okHttpVersion = '3.9.0'
junitVersion = '4.12' junitVersion = '4.12'
mockitoVersion = '1.10.19' mockitoVersion = '1.10.19'
timberVersion = '4.6.0' timberVersion = '4.7.0'
} }