Encrypt wallet at create

This commit is contained in:
Gabriel Masclef 2018-01-24 14:43:07 -03:00
parent 52bbb357d0
commit cb569b61cd
No known key found for this signature in database
GPG Key ID: DD6D7EAADE12280D
3 changed files with 113 additions and 47 deletions

View File

@ -1,12 +1,15 @@
import { Injectable } from '@angular/core';
import { LoadingController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger';
import * as _ from 'lodash';
@Injectable()
export class OnGoingProcessProvider {
private loading: any;
private processNames: any;
private pausedOngoingProcess: any;
private ongoingProcess: any;
constructor(
private loadingCtrl: LoadingController,
@ -55,20 +58,29 @@ export class OnGoingProcessProvider {
'topup': 'Top up in progress...',
'duplicatingWallet': 'Duplicating wallet...',
};
this.ongoingProcess = {};
}
public getShowName(processName: string): string {
let showName = this.processNames[processName] || processName;
return showName;
}
public clear() {
this.processNames = {};
private clear() {
this.ongoingProcess = {};
this.loading.dismiss();
};
}
public pause(): void {
this.pausedOngoingProcess = this.ongoingProcess;
this.clear();
}
public resume(): void {
_.forEach(this.pausedOngoingProcess, (v, k) => {
this.set(k, v);
});
this.pausedOngoingProcess = {};
}
public set(processName: string, isOn: boolean): string {
this.logger.debug('ongoingProcess', processName, isOn);
this.ongoingProcess[processName] = isOn;
let showName = this.processNames[processName] || processName;
if (!isOn) {
this.loading.dismiss();

View File

@ -11,6 +11,8 @@ import { BwcErrorProvider } from '../bwc-error/bwc-error';
import { PlatformProvider } from '../platform/platform';
import { AppProvider } from '../../providers/app/app';
import { LanguageProvider } from '../../providers/language/language';
import { PopupProvider } from '../popup/popup';
import { OnGoingProcessProvider } from '../on-going-process/on-going-process';
//models
import { Profile } from '../../models/profile/profile.model';
@ -34,7 +36,9 @@ export class ProfileProvider {
private platformProvider: PlatformProvider,
private appProvider: AppProvider,
private languageProvider: LanguageProvider,
private events: Events
private events: Events,
private popupProvider: PopupProvider,
private onGoingProcessProvider: OnGoingProcessProvider
) {
this.throttledBwsEvent = _.throttle((n, wallet) => {
this.newBwsEvent(n, wallet);
@ -333,6 +337,60 @@ export class ProfileProvider {
});
}
// An alert dialog
private askPassword(name: string, title: string): Promise<any> {
return new Promise((resolve, reject) => {
let opts = {
type: 'password'
}
this.popupProvider.ionicPrompt(title, name, opts).then((res: any) => {
return resolve(res);
});
});
}
private showWarningNoEncrypt(): Promise<any> {
return new Promise((resolve, reject) => {
let title = 'Are you sure?'; //TODO gettextcatalog
let msg = 'Your wallet keys will be stored in plan text in this device, if an other app access the store it will be able to access your Bitcoin'; //TODO gettextcatalog
let okText = 'Yes'; //TODO gettextcatalog
let cancelText = 'No'; //TODO gettextcatalog
this.popupProvider.ionicConfirm(title, msg, okText, cancelText).then((res: any) => {
return resolve(res);
});
});
}
private encrypt(wallet: any): Promise<any> {
return new Promise((resolve, reject) => {
let title = 'Please enter a password to encrypt your wallet keys on this device storage'; //TODO gettextcatalog
let warnMsg = 'Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down.'; //TODO gettextcatalog
this.askPassword(warnMsg, title).then((password: string) => {
if (!password) {
this.showWarningNoEncrypt().then((res: any) => {
if (res) return resolve(); //TODO gettextcatalog
this.encrypt(wallet).then(() => {
return resolve();
});
});
}
else {
title = 'Confirm your new spending password'; //TODO gettextcatalog
this.askPassword(warnMsg, title).then((password2: string) => {
if (!password2 || password != password2) {
this.encrypt(wallet).then(() => {
return resolve();
});
} else {
wallet.encryptPrivateKey(password);
return resolve();
}
});
}
});
});
}
// Adds and bind a new client to the profile
private addAndBindWalletClient(wallet: any, opts: any): Promise<any> {
return new Promise((resolve, reject) => {
@ -340,40 +398,45 @@ export class ProfileProvider {
return reject('Could not access wallet'); // TODO gettextCatalog
}
let walletId: string = wallet.credentials.walletId
// Encrypt wallet
this.onGoingProcessProvider.pause();
this.encrypt(wallet).then(() => {
this.onGoingProcessProvider.resume();
if (!this.profile.addWallet(JSON.parse(wallet.export()))) {
return reject("Wallet already in " + this.appProvider.info.nameCase); // TODO gettextCatalog
}
let walletId: string = wallet.credentials.walletId
if (!this.profile.addWallet(JSON.parse(wallet.export()))) {
return reject("Wallet already in " + this.appProvider.info.nameCase); // TODO gettextCatalog
}
let skipKeyValidation: boolean = this.shouldSkipValidation(walletId);
if (!skipKeyValidation)
this.runValidation(wallet);
let skipKeyValidation: boolean = this.shouldSkipValidation(walletId);
if (!skipKeyValidation)
this.runValidation(wallet);
this.bindWalletClient(wallet);
this.bindWalletClient(wallet);
let saveBwsUrl = (): Promise<any> => {
return new Promise((resolve, reject) => {
let defaults: any = this.configProvider.getDefaults();
let bwsFor: any = {};
bwsFor[walletId] = opts.bwsurl || defaults.bws.url;
let saveBwsUrl = (): Promise<any> => {
return new Promise((resolve, reject) => {
let defaults: any = this.configProvider.getDefaults();
let bwsFor: any = {};
bwsFor[walletId] = opts.bwsurl || defaults.bws.url;
// Dont save the default
if (bwsFor[walletId] == defaults.bws.url) {
// Dont save the default
if (bwsFor[walletId] == defaults.bws.url) {
return resolve();
}
this.configProvider.set({ bwsFor: bwsFor });
return resolve();
}
});
};
this.configProvider.set({ bwsFor: bwsFor });
return resolve();
});
};
saveBwsUrl().then(() => {
this.persistenceProvider.storeProfile(this.profile).then(() => {
return resolve(wallet);
}).catch((err: any) => {
return reject(err);
saveBwsUrl().then(() => {
this.persistenceProvider.storeProfile(this.profile).then(() => {
return resolve(wallet);
}).catch((err: any) => {
return reject(err);
});
});
});
});

View File

@ -16,12 +16,6 @@ import { OnGoingProcessProvider } from '../on-going-process/on-going-process';
import { TouchIdProvider } from '../touchid/touchid';
import { FeeProvider } from '../fee/fee';
/* TODO LIST:
- onGoingProcess provider
*/
@Injectable()
export class WalletProvider {
@ -1089,13 +1083,11 @@ export class WalletProvider {
let opts = {
type: 'password'
}
this.popupProvider.ionicPrompt(title, name, opts, null, null).then((res: any) => {
this.popupProvider.ionicPrompt(title, name, opts).then((res: any) => {
return resolve(res);
}).catch((err: any) => {
return reject(err);
});
});
};
}
public encrypt(wallet: any): Promise<any> {
return new Promise((resolve, reject) => {
@ -1115,8 +1107,7 @@ export class WalletProvider {
return reject(err);
});
});
};
}
public decrypt(wallet: any): Promise<any> {
return new Promise((resolve, reject) => {