Username/Password for daemon
This commit is contained in:
parent
807d217aac
commit
cb1d541474
|
@ -592,12 +592,16 @@ Java_com_m2049r_xmrwallet_model_Wallet_getFilename(JNIEnv *env, jobject instance
|
||||||
JNIEXPORT jboolean JNICALL
|
JNIEXPORT jboolean JNICALL
|
||||||
Java_com_m2049r_xmrwallet_model_Wallet_initJ(JNIEnv *env, jobject instance,
|
Java_com_m2049r_xmrwallet_model_Wallet_initJ(JNIEnv *env, jobject instance,
|
||||||
jstring daemon_address,
|
jstring daemon_address,
|
||||||
jlong upper_transaction_size_limit) {
|
jlong upper_transaction_size_limit,
|
||||||
// const std::string &daemon_username = "", const std::string &daemon_password = "") = 0;
|
jstring daemon_username, jstring daemon_password) {
|
||||||
const char *_daemon_address = env->GetStringUTFChars(daemon_address, JNI_FALSE);
|
const char *_daemon_address = env->GetStringUTFChars(daemon_address, JNI_FALSE);
|
||||||
|
const char *_daemon_username = env->GetStringUTFChars(daemon_username, JNI_FALSE);
|
||||||
|
const char *_daemon_password = env->GetStringUTFChars(daemon_password, JNI_FALSE);
|
||||||
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
|
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
|
||||||
bool status = wallet->init(_daemon_address, upper_transaction_size_limit);
|
bool status = wallet->init(_daemon_address, upper_transaction_size_limit, _daemon_username, _daemon_password);
|
||||||
env->ReleaseStringUTFChars(daemon_address, _daemon_address);
|
env->ReleaseStringUTFChars(daemon_address, _daemon_address);
|
||||||
|
env->ReleaseStringUTFChars(daemon_username, _daemon_username);
|
||||||
|
env->ReleaseStringUTFChars(daemon_password, _daemon_password);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -322,48 +322,58 @@ public class LoginFragment extends Fragment {
|
||||||
editor.apply();
|
editor.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkAndSetWalletDaemon(String daemonAddress, boolean testnet) {
|
private boolean checkAndSetWalletDaemon(String daemon, boolean testnet) {
|
||||||
if (!daemonAddress.isEmpty()) {
|
String daemonAddress = "";
|
||||||
String d[] = daemonAddress.split(":");
|
String username = "";
|
||||||
if (d.length > 2) return false;
|
String password = "";
|
||||||
if (d.length < 1) return false;
|
if (!daemon.isEmpty()) { // no actual daemon is also fine
|
||||||
String host = d[0];
|
String a[] = daemon.split("@");
|
||||||
|
if (a.length == 1) { // no credentials
|
||||||
|
daemonAddress = a[0];
|
||||||
|
} else if (a.length == 2) { // credentials
|
||||||
|
String up[] = a[0].split(":");
|
||||||
|
if (up.length != 2) return false;
|
||||||
|
username = up[0];
|
||||||
|
if (!username.isEmpty()) password = up[1];
|
||||||
|
daemonAddress = a[1];
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String da[] = daemonAddress.split(":");
|
||||||
|
if ((da.length > 2) || (da.length < 1)) return false;
|
||||||
|
String host = da[0];
|
||||||
int port;
|
int port;
|
||||||
if (d.length == 2) {
|
if (da.length == 2) {
|
||||||
try {
|
try {
|
||||||
port = Integer.parseInt(d[1]);
|
port = Integer.parseInt(da[1]);
|
||||||
} catch (NumberFormatException ex) {
|
} catch (NumberFormatException ex) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
port = (testnet ? 28081 : 18081);
|
port = (testnet ? 28081 : 18081);
|
||||||
}
|
}
|
||||||
|
//Log.d(TAG, "DAEMON " + username + "/" + password + "/" + host + "/" + port);
|
||||||
// if (android.os.Build.VERSION.SDK_INT > 9) {
|
// if (android.os.Build.VERSION.SDK_INT > 9) {
|
||||||
StrictMode.ThreadPolicy prevPolicy = StrictMode.getThreadPolicy();
|
StrictMode.ThreadPolicy prevPolicy = StrictMode.getThreadPolicy();
|
||||||
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder(prevPolicy).permitNetwork().build();
|
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder(prevPolicy).permitNetwork().build();
|
||||||
StrictMode.setThreadPolicy(policy);
|
StrictMode.setThreadPolicy(policy);
|
||||||
Socket socket = new Socket();
|
Socket socket = new Socket();
|
||||||
long a = new Date().getTime();
|
long timeA = new Date().getTime();
|
||||||
try {
|
try {
|
||||||
socket.connect(new InetSocketAddress(host, port), LoginActivity.DAEMON_TIMEOUT);
|
socket.connect(new InetSocketAddress(host, port), LoginActivity.DAEMON_TIMEOUT);
|
||||||
socket.close();
|
socket.close();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
Log.d(TAG, "Cannot reach daemon " + host + ":" + port + " because " + ex.getLocalizedMessage());
|
Log.d(TAG, "Cannot reach daemon " + host + "/" + port + " because " + ex.getLocalizedMessage());
|
||||||
return false;
|
return false;
|
||||||
} finally {
|
} finally {
|
||||||
StrictMode.setThreadPolicy(prevPolicy);
|
StrictMode.setThreadPolicy(prevPolicy);
|
||||||
}
|
}
|
||||||
long b = new Date().getTime();
|
long timeB = new Date().getTime();
|
||||||
Log.d(TAG, "Daemon is " + (b - a) + "ms away.");
|
Log.d(TAG, "Daemon is " + (timeB - timeA) + "ms away.");
|
||||||
}
|
}
|
||||||
WalletManager mgr = WalletManager.getInstance();
|
WalletManager mgr = WalletManager.getInstance();
|
||||||
mgr.setDaemon(daemonAddress, testnet);
|
mgr.setDaemon(daemonAddress, testnet, username, password);
|
||||||
if (!daemonAddress.isEmpty()) {
|
return true;
|
||||||
int version = mgr.getDaemonVersion();
|
|
||||||
Log.d(TAG, "Daemon is v" + version);
|
|
||||||
return (version >= WalletActivity.MIN_DAEMON_VERSION);
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,8 +42,6 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment.
|
||||||
WalletService.Observer, SendFragment.Listener, TxFragment.Listener, GenerateReviewFragment.ListenerWithWallet {
|
WalletService.Observer, SendFragment.Listener, TxFragment.Listener, GenerateReviewFragment.ListenerWithWallet {
|
||||||
private static final String TAG = "WalletActivity";
|
private static final String TAG = "WalletActivity";
|
||||||
|
|
||||||
static final int MIN_DAEMON_VERSION = 65544;
|
|
||||||
|
|
||||||
public static final String REQUEST_ID = "id";
|
public static final String REQUEST_ID = "id";
|
||||||
public static final String REQUEST_PW = "pw";
|
public static final String REQUEST_PW = "pw";
|
||||||
|
|
||||||
|
@ -342,6 +340,20 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment.
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWalletStarted(final boolean success) {
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if (!success) {
|
||||||
|
Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_connect_failed), Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!success) {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatedTransaction(final PendingTransaction pendingTransaction) {
|
public void onCreatedTransaction(final PendingTransaction pendingTransaction) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -96,10 +96,13 @@ public class Wallet {
|
||||||
|
|
||||||
// virtual std::string keysFilename() const = 0;
|
// virtual std::string keysFilename() const = 0;
|
||||||
public boolean init(long upper_transaction_size_limit) {
|
public boolean init(long upper_transaction_size_limit) {
|
||||||
return initJ(WalletManager.getInstance().getDaemonAddress(), upper_transaction_size_limit);
|
return initJ(WalletManager.getInstance().getDaemonAddress(), upper_transaction_size_limit,
|
||||||
|
WalletManager.getInstance().getDaemonUsername(),
|
||||||
|
WalletManager.getInstance().getDaemonPassword());
|
||||||
}
|
}
|
||||||
|
|
||||||
private native boolean initJ(String daemon_address, long upper_transaction_size_limit);
|
private native boolean initJ(String daemon_address, long upper_transaction_size_limit,
|
||||||
|
String daemon_username, String daemon_password);
|
||||||
|
|
||||||
// virtual bool createWatchOnly(const std::string &path, const std::string &password, const std::string &language) const = 0;
|
// virtual bool createWatchOnly(const std::string &path, const std::string &password, const std::string &language) const = 0;
|
||||||
// virtual void setRefreshFromBlockHeight(uint64_t refresh_from_block_height) = 0;
|
// virtual void setRefreshFromBlockHeight(uint64_t refresh_from_block_height) = 0;
|
||||||
|
|
|
@ -197,9 +197,12 @@ public class WalletManager {
|
||||||
return testnet;
|
return testnet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDaemon(String address, boolean testnet) {
|
public void setDaemon(String address, boolean testnet, String username, String password) {
|
||||||
|
//Log.d(TAG, "SETDAEMON " + username + "/" + password + "/" + address);
|
||||||
this.daemonAddress = address;
|
this.daemonAddress = address;
|
||||||
this.testnet = testnet;
|
this.testnet = testnet;
|
||||||
|
this.daemonUsername = username;
|
||||||
|
this.daemonPassword = password;
|
||||||
setDaemonAddressJ(address);
|
setDaemonAddressJ(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,6 +216,18 @@ public class WalletManager {
|
||||||
|
|
||||||
private native void setDaemonAddressJ(String address);
|
private native void setDaemonAddressJ(String address);
|
||||||
|
|
||||||
|
String daemonUsername = "";
|
||||||
|
|
||||||
|
public String getDaemonUsername() {
|
||||||
|
return daemonUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
String daemonPassword = "";
|
||||||
|
|
||||||
|
public String getDaemonPassword() {
|
||||||
|
return daemonPassword;
|
||||||
|
}
|
||||||
|
|
||||||
public native int getDaemonVersion();
|
public native int getDaemonVersion();
|
||||||
|
|
||||||
public native long getBlockchainHeight();
|
public native long getBlockchainHeight();
|
||||||
|
|
|
@ -224,6 +224,8 @@ public class WalletService extends Service {
|
||||||
void onSentTransaction(boolean success);
|
void onSentTransaction(boolean success);
|
||||||
|
|
||||||
void onSetNotes(boolean success);
|
void onSetNotes(boolean success);
|
||||||
|
|
||||||
|
void onWalletStarted(boolean success);
|
||||||
}
|
}
|
||||||
|
|
||||||
String progressText = null;
|
String progressText = null;
|
||||||
|
@ -263,6 +265,8 @@ public class WalletService extends Service {
|
||||||
private Looper mServiceLooper;
|
private Looper mServiceLooper;
|
||||||
private WalletService.ServiceHandler mServiceHandler;
|
private WalletService.ServiceHandler mServiceHandler;
|
||||||
|
|
||||||
|
private boolean errorState = false;
|
||||||
|
|
||||||
// Handler that receives messages from the thread
|
// Handler that receives messages from the thread
|
||||||
private final class ServiceHandler extends Handler {
|
private final class ServiceHandler extends Handler {
|
||||||
ServiceHandler(Looper looper) {
|
ServiceHandler(Looper looper) {
|
||||||
|
@ -272,6 +276,11 @@ public class WalletService extends Service {
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(Message msg) {
|
public void handleMessage(Message msg) {
|
||||||
Log.d(TAG, "Handling " + msg.arg2);
|
Log.d(TAG, "Handling " + msg.arg2);
|
||||||
|
if (errorState) {
|
||||||
|
Log.i(TAG, "In error state.");
|
||||||
|
// also, we have already stopped ourselves
|
||||||
|
return;
|
||||||
|
}
|
||||||
switch (msg.arg2) {
|
switch (msg.arg2) {
|
||||||
case START_SERVICE: {
|
case START_SERVICE: {
|
||||||
Bundle extras = msg.getData();
|
Bundle extras = msg.getData();
|
||||||
|
@ -283,7 +292,12 @@ public class WalletService extends Service {
|
||||||
if (walletId != null) {
|
if (walletId != null) {
|
||||||
showProgress(getString(R.string.status_wallet_loading));
|
showProgress(getString(R.string.status_wallet_loading));
|
||||||
showProgress(10);
|
showProgress(10);
|
||||||
start(walletId, walletPw); // TODO What if this fails?
|
boolean success = start(walletId, walletPw);
|
||||||
|
if (observer != null) observer.onWalletStarted(success);
|
||||||
|
if (!success) {
|
||||||
|
errorState = true;
|
||||||
|
stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (cmd.equals(REQUEST_CMD_STORE)) {
|
} else if (cmd.equals(REQUEST_CMD_STORE)) {
|
||||||
Wallet myWallet = getWallet();
|
Wallet myWallet = getWallet();
|
||||||
|
@ -461,7 +475,7 @@ public class WalletService extends Service {
|
||||||
return true; // true is important so that onUnbind is also called next time
|
return true; // true is important so that onUnbind is also called next time
|
||||||
}
|
}
|
||||||
|
|
||||||
private void start(String walletName, String walletPassword) {
|
private boolean start(String walletName, String walletPassword) {
|
||||||
startNotfication();
|
startNotfication();
|
||||||
// if there is an listener it is always started / syncing
|
// if there is an listener it is always started / syncing
|
||||||
Log.d(TAG, "start()");
|
Log.d(TAG, "start()");
|
||||||
|
@ -470,7 +484,10 @@ public class WalletService extends Service {
|
||||||
if (listener == null) {
|
if (listener == null) {
|
||||||
Log.d(TAG, "start() loadWallet");
|
Log.d(TAG, "start() loadWallet");
|
||||||
Wallet aWallet = loadWallet(walletName, walletPassword);
|
Wallet aWallet = loadWallet(walletName, walletPassword);
|
||||||
// TODO check aWallet and die gracefully if neccessary
|
if ((aWallet == null) || (aWallet.getConnectionStatus() != Wallet.ConnectionStatus.ConnectionStatus_Connected)) {
|
||||||
|
if (aWallet != null) aWallet.close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
listener = new MyWalletListener(aWallet);
|
listener = new MyWalletListener(aWallet);
|
||||||
listener.start();
|
listener.start();
|
||||||
showProgress(100);
|
showProgress(100);
|
||||||
|
@ -480,6 +497,7 @@ public class WalletService extends Service {
|
||||||
// if we try to refresh the history here we get occasional segfaults!
|
// if we try to refresh the history here we get occasional segfaults!
|
||||||
// doesnt matter since we update as soon as we get a new block anyway
|
// doesnt matter since we update as soon as we get a new block anyway
|
||||||
Log.d(TAG, "start() done");
|
Log.d(TAG, "start() done");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
|
@ -512,7 +530,7 @@ public class WalletService extends Service {
|
||||||
showProgress(55);
|
showProgress(55);
|
||||||
wallet.init(0);
|
wallet.init(0);
|
||||||
showProgress(90);
|
showProgress(90);
|
||||||
Log.d(TAG, wallet.getConnectionStatus().toString());
|
//Log.d(TAG, wallet.getConnectionStatus().toString());
|
||||||
}
|
}
|
||||||
return wallet;
|
return wallet;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
<string name="status_wallet_unloaded">Wallet saved</string>
|
<string name="status_wallet_unloaded">Wallet saved</string>
|
||||||
<string name="status_wallet_unload_failed">Wallet save failed!</string>
|
<string name="status_wallet_unload_failed">Wallet save failed!</string>
|
||||||
<string name="status_wallet_connecting">Connecting …</string>
|
<string name="status_wallet_connecting">Connecting …</string>
|
||||||
|
<string name="status_wallet_connect_failed">Daemon connection failed!\nCheck username/password</string>
|
||||||
<string name="status_working">Working on it …</string>
|
<string name="status_working">Working on it …</string>
|
||||||
|
|
||||||
<string name="status_transaction_sent">Transaction sent!</string>
|
<string name="status_transaction_sent">Transaction sent!</string>
|
||||||
|
|
Loading…
Reference in New Issue