Abstract bitpayCardCredentials to appIdentity. Improve alert text on card removal.

This commit is contained in:
Andy Phillipson 2016-11-14 16:24:52 -05:00
commit 43f24ee35e
5 changed files with 87 additions and 60 deletions

View file

@ -1,5 +1,5 @@
'use strict';
angular.module('copayApp.controllers').controller('bitpayCardIntroController', function($scope, $log, $state, $ionicHistory, storageService, externalLinkService, bitpayCardService, gettextCatalog, popupService) {
angular.module('copayApp.controllers').controller('bitpayCardIntroController', function($scope, $log, $state, $ionicHistory, storageService, externalLinkService, bitpayCardService, gettextCatalog, popupService, appIdentityService) {
var checkOtp = function(obj, cb) {
if (obj.otp) {
@ -56,9 +56,9 @@ angular.module('copayApp.controllers').controller('bitpayCardIntroController', f
});
});
} else {
bitpayCardService.getCredentials(function(err, credentials) {
appIdentityService.getIdentity(bitpayCardService.getEnvironment(), function(err, appIdentity) {
if (err) popupService.showAlert(null, err);
else $log.info('BitPay Debit Card Credentials: Ok.');
else $log.info('App identity: Ok.');
});
}
});

View file

@ -4,7 +4,9 @@ angular.module('copayApp.controllers').controller('preferencesBitpayCardControll
function($scope, $state, $timeout, $ionicHistory, bitpayCardService, popupService, gettextCatalog) {
$scope.remove = function(card) {
var msg = gettextCatalog.getString('Are you sure you would like to remove your BitPay Card account from this device?');
var msg = gettextCatalog.getString('Are you sure you would like to remove your BitPay Card account ({{lastFourDigits}}) from this device?', {
lastFourDigits: card.lastFourDigits
});
popupService.showConfirm(null, msg, null, null, function(res) {
if (res) remove(card);
});

View file

@ -0,0 +1,34 @@
'use strict';
angular.module('copayApp.services').factory('appIdentityService', function($log, lodash, storageService, bitauthService) {
var root = {};
root.getIdentity = function(network, cb) {
var pubkey, sin, isNew;
storageService.getAppIdentity(network, function(err, data) {
if (err) return cb(err);
if (lodash.isString(data)) {
data = JSON.parse(data);
}
var appIdentity = data || {};
if (lodash.isEmpty(appIdentity) || (appIdentity && !appIdentity.priv)) {
isNew = true;
appIdentity = bitauthService.generateSin();
}
try {
pubkey = bitauthService.getPublicKeyFromPrivateKey(appIdentity.priv);
sin = bitauthService.getSinFromPublicKey(pubkey);
if (isNew)
storageService.setAppIdentity(network, JSON.stringify(appIdentity), function(err) {});
}
catch (e) {
$log.error(e);
return cb(e);
};
return cb(null, appIdentity);
});
};
return root;
});

View file

@ -1,36 +1,10 @@
'use strict';
angular.module('copayApp.services').factory('bitpayCardService', function($http, $log, lodash, storageService, bitauthService, platformInfo, moment) {
angular.module('copayApp.services').factory('bitpayCardService', function($http, $log, lodash, storageService, bitauthService, platformInfo, moment, appIdentityService) {
var root = {};
var BITPAY_CARD_NETWORK = 'livenet';
var BITPAY_CARD_API_URL = BITPAY_CARD_NETWORK == 'livenet' ? 'https://bitpay.com' : 'https://test.bitpay.com';
var _getCredentials = function(cb) {
var pubkey, sin, isNew;
storageService.getBitpayCardCredentials(BITPAY_CARD_NETWORK, function(err, data) {
if (err) return cb(err);
if (lodash.isString(data)) {
data = JSON.parse(data);
}
var credentials = data || {};
if (lodash.isEmpty(credentials) || (credentials && !credentials.priv)) {
isNew = true;
credentials = bitauthService.generateSin();
}
try {
pubkey = bitauthService.getPublicKeyFromPrivateKey(credentials.priv);
sin = bitauthService.getSinFromPublicKey(pubkey);
if (isNew)
storageService.setBitpayCardCredentials(BITPAY_CARD_NETWORK, JSON.stringify(credentials), function(err) {});
}
catch (e) {
$log.error(e);
return cb(e);
};
return cb(null, credentials);
});
};
var _setError = function(msg, e) {
$log.error(msg);
var error = e.data ? e.data.error : msg;
@ -47,25 +21,25 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http,
};
};
var _post = function(endpoint, json, credentials) {
var _post = function(endpoint, json, appIdentity) {
var dataToSign = BITPAY_CARD_API_URL + endpoint + JSON.stringify(json);
var signedData = bitauthService.sign(dataToSign, credentials.priv);
var signedData = bitauthService.sign(dataToSign, appIdentity.priv);
return {
method: 'POST',
url: BITPAY_CARD_API_URL + endpoint,
headers: {
'content-type': 'application/json',
'x-identity': credentials.pub,
'x-identity': appIdentity.pub,
'x-signature': signedData
},
data: json
};
};
var _postAuth = function(endpoint, json, credentials) {
json['params'].signature = bitauthService.sign(JSON.stringify(json.params), credentials.priv);
json['params'].pubkey = credentials.pub;
var _postAuth = function(endpoint, json, appIdentity) {
json['params'].signature = bitauthService.sign(JSON.stringify(json.params), appIdentity.priv);
json['params'].pubkey = appIdentity.pub;
json['params'] = JSON.stringify(json.params);
var ret = {
@ -81,12 +55,12 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http,
return ret;
};
var _afterBitAuthSuccess = function(token, obj, credentials, cb) {
var _afterBitAuthSuccess = function(token, obj, appIdentity, cb) {
var json = {
method: 'getDebitCards'
};
// Get Debit Cards
$http(_post('/api/v2/' + token, json, credentials)).then(function(data) {
$http(_post('/api/v2/' + token, json, appIdentity)).then(function(data) {
if (data && data.data.error) return cb(data.data.error);
$log.info('BitPay Get Debit Cards: SUCCESS');
return cb(data.data.error, {token: token, cards: data.data.data, email: obj.email});
@ -129,12 +103,6 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http,
return BITPAY_CARD_NETWORK;
};
root.getCredentials = function(cb) {
_getCredentials(function(err, credentials) {
return cb(err, credentials);
});
};
root.bitAuthPair = function(obj, cb) {
var deviceName = 'Unknow device';
if (platformInfo.isNW) {
@ -151,12 +119,12 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http,
code: obj.otp
}
};
_getCredentials(function(err, credentials) {
appIdentityService.getIdentity(root.getEnvironment(), function(err, appIdentity) {
if (err) return cb(err);
$http(_postAuth('/api/v2/', json, credentials)).then(function(data) {
$http(_postAuth('/api/v2/', json, appIdentity)).then(function(data) {
if (data && data.data.error) return cb(data.data.error);
$log.info('BitPay Card BitAuth Create Token: SUCCESS');
_afterBitAuthSuccess(data.data.data, obj, credentials, cb);
_afterBitAuthSuccess(data.data.data, obj, appIdentity, cb);
}, function(data) {
return cb(_setError('BitPay Card Error Create Token: BitAuth', data));
});
@ -170,14 +138,14 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http,
method: 'getInvoiceHistory',
params: JSON.stringify(params)
};
_getCredentials(function(err, credentials) {
appIdentityService.getIdentity(root.getEnvironment(), function(err, appIdentity) {
if (err) return cb(err);
root.getBitpayDebitCards(function(err, data) {
if (err) return cb(err);
var card = lodash.find(data, {id : cardId});
if (!card) return cb(_setError('Not card found'));
// Get invoices
$http(_post('/api/v2/' + card.token, json, credentials)).then(function(data) {
$http(_post('/api/v2/' + card.token, json, appIdentity)).then(function(data) {
$log.info('BitPay Get Invoices: SUCCESS');
invoices = data.data.data || [];
if (lodash.isEmpty(invoices)) $log.info('No invoices');
@ -186,7 +154,7 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http,
params: JSON.stringify(params)
};
// Get transactions list
$http(_post('/api/v2/' + card.token, json, credentials)).then(function(data) {
$http(_post('/api/v2/' + card.token, json, appIdentity)).then(function(data) {
$log.info('BitPay Get Transactions: SUCCESS');
transactions = data.data.data || {};
transactions['txs'] = _processTransactions(invoices, transactions.transactionList);
@ -207,13 +175,13 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http,
method: 'generateTopUpInvoice',
params: JSON.stringify(params)
};
_getCredentials(function(err, credentials) {
appIdentityService.getIdentity(root.getEnvironment(), function(err, appIdentity) {
if (err) return cb(err);
root.getBitpayDebitCards(function(err, data) {
if (err) return cb(err);
var card = lodash.find(data, {id : cardId});
if (!card) return cb(_setError('Not card found'));
$http(_post('/api/v2/' + card.token, json, credentials)).then(function(data) {
$http(_post('/api/v2/' + card.token, json, appIdentity)).then(function(data) {
$log.info('BitPay TopUp: SUCCESS');
if(data.data.error) {
return cb(data.data.error);

View file

@ -95,7 +95,8 @@ angular.module('copayApp.services')
// Upgraders are executed in numerical order per the '##_' object key prefix.
//
var _upgraders = {
'00_bitpayDebitCards' : _upgrade_bitpayDebitCards // 2016-11: Upgrade bitpayDebitCards-x to bitpayAccounts-x
'00_bitpayDebitCards' : _upgrade_bitpayDebitCards, // 2016-11: Upgrade bitpayDebitCards-x to bitpayAccounts-x
'01_bitpayCardCredentials' : _upgrade_bitpayCardCredentials // 2016-11: Upgrade bitpayCardCredentials-x to appIdentity-x
};
function _upgrade_bitpayDebitCards(key, network, cb) {
@ -119,6 +120,28 @@ angular.module('copayApp.services')
}
});
};
function _upgrade_bitpayCardCredentials(key, network, cb) {
key += '-' + network;
storage.get(key, function(err, data) {
if (err) return cb(err);
if (data != null) {
// Needs upgrade
if (lodash.isString(data)) {
data = JSON.parse(data);
}
data = data || {};
root.setAppIdentity(network, data, function(err) {
if (err) return cb(err);
storage.remove(key, function() {
cb(null, 'replaced with \'appIdentity\'');
});
});
} else {
cb();
}
});
};
//
////////////////////////////////////////////////////////////////////////////
@ -488,16 +511,16 @@ angular.module('copayApp.services')
});
};
root.setBitpayCardCredentials = function(network, data, cb) {
storage.set('bitpayCardCredentials-' + network, data, cb);
root.setAppIdentity = function(network, data, cb) {
storage.set('appIdentity-' + network, data, cb);
};
root.getBitpayCardCredentials = function(network, cb) {
storage.get('bitpayCardCredentials-' + network, cb);
root.getAppIdentity = function(network, cb) {
storage.get('appIdentity-' + network, cb);
};
root.removeBitpayCardCredentials = function(network, cb) {
storage.remove('bitpayCardCredentials-' + network, cb);
root.removeAppIdentity = function(network, cb) {
storage.remove('appIdentity-' + network, cb);
};
root.removeAllWalletData = function(walletId, cb) {