Merge pull request #3375 from bitpay/v1.4

v1.4 -> master
This commit is contained in:
Gustavo Maximiliano Cortez 2015-10-30 15:43:17 -03:00
commit f3d12f5a14
17 changed files with 140 additions and 90 deletions

View File

@ -5,6 +5,22 @@ sign:
verify:
gpg --verify browser-extensions/chrome/copay-chrome-extension.zip.sig browser-extensions/chrome/copay-chrome-extension.zip
sign-desktop:
gpg -u 1112CFA1 --output webkitbuilds/copay-linux32.zip.sig --detach-sig webkitbuilds/copay-linux32.zip
gpg -u 1112CFA1 --output webkitbuilds/copay-linux64.zip.sig --detach-sig webkitbuilds/copay-linux64.zip
gpg -u 1112CFA1 --output webkitbuilds/copay-osx32.dmg.sig --detach-sig webkitbuilds/copay-osx32.dmg
gpg -u 1112CFA1 --output webkitbuilds/copay-osx64.dmg.sig --detach-sig webkitbuilds/copay-osx64.dmg
gpg -u 1112CFA1 --output webkitbuilds/copay-win32.exe.sig --detach-sig webkitbuilds/copay-win32.exe
gpg -u 1112CFA1 --output webkitbuilds/copay-win64.exe.sig --detach-sig webkitbuilds/copay-win64.exe
verify-desktop:
gpg --verify webkitbuilds/copay-linux32.zip.sig webkitbuilds/copay-linux32.zip
gpg --verify webkitbuilds/copay-linux64.zip.sig webkitbuilds/copay-linux64.zip
gpg --verify webkitbuilds/copay-osx32.dmg.sig webkitbuilds/copay-osx32.dmg
gpg --verify webkitbuilds/copay-osx64.dmg.sig webkitbuilds/copay-osx64.dmg
gpg --verify webkitbuilds/copay-win32.exe.sig webkitbuilds/copay-win32.exe
gpg --verify webkitbuilds/copay-win64.exe.sig webkitbuilds/copay-win64.exe
chrome:
browser-extensions/chrome/build.sh

View File

@ -212,15 +212,20 @@ if [ $CURRENT_OS == "WP8" ]; then
echo "Wp8 project!!!"
cp -R $PROJECT/www/* $PROJECT/platforms/wp8/www
checkOK
cp -vf wp/Properties/* $PROJECT/platforms/wp8/Properties/
cp -vf wp/Package.appxmanifest $PROJECT/platforms/wp8/
cp -vf wp/MainPage.xaml $PROJECT/platforms/wp8/
checkOK
cp -vf wp/Assets/* $PROJECT/platforms/wp8/Assets/
cp -vf wp/SplashScreenImage.jpg $PROJECT/platforms/wp8/
cp -vf wp/ApplicationIcon.png $PROJECT/platforms/wp8/
cp -vf wp/Background.png $PROJECT/platforms/wp8/
checkOK
if ! $CLEAR
then
cp -vf wp/Properties/* $PROJECT/platforms/wp8/Properties/
checkOK
cp -vf wp/MainPage.xaml $PROJECT/platforms/wp8/
checkOK
cp -vf wp/Package.appxmanifest $PROJECT/platforms/wp8/
checkOK
cp -vf wp/Assets/* $PROJECT/platforms/wp8/Assets/
cp -vf wp/SplashScreenImage.jpg $PROJECT/platforms/wp8/
cp -vf wp/ApplicationIcon.png $PROJECT/platforms/wp8/
cp -vf wp/Background.png $PROJECT/platforms/wp8/
checkOK
fi
fi

View File

@ -1,8 +1,8 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.bitpay.copay"
version="1.4.1"
android-versionCode="51"
ios-CFBundleVersion="1.4.1">
version="1.4.3"
android-versionCode="53"
ios-CFBundleVersion="1.4.3">
<name>Copay</name>
<description>
A secure bitcoin wallet for friends and companies.

View File

@ -57,11 +57,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.4.1</string>
<string>1.4.3</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.4.1</string>
<string>1.4.3</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSMainNibFile</key>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest" xmlns:m3="http://schemas.microsoft.com/appx/2014/manifest" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest">
<Identity Name="18C7659D.CopayWallet" Publisher="CN=F89609D1-EB3E-45FD-A58A-C2E3895FCE7B" Version="1.4.1.0" />
<Identity Name="18C7659D.CopayWallet" Publisher="CN=F89609D1-EB3E-45FD-A58A-C2E3895FCE7B" Version="1.4.3.0" />
<mp:PhoneIdentity PhoneProductId="5381aa50-9069-11e4-84cc-293caf9cbdc8" PhonePublisherId="F89609D1-EB3E-45FD-A58A-C2E3895FCE7B" />
<Properties>
<DisplayName>Copay Wallet</DisplayName>
<DisplayName>Copay Bitcoin Wallet</DisplayName>
<PublisherDisplayName>BitPay Inc.</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
@ -16,7 +16,7 @@
</Resources>
<Applications>
<Application Id="x5381aa50y9069y11e4y84ccy293caf9cbdc8x" Executable="AGHost.exe" EntryPoint="MainPage.xaml">
<m3:VisualElements DisplayName="Copay Wallet" Square150x150Logo="Assets\SquareTile150x150.png" Square44x44Logo="Assets\Logo.png" Description="Copay" ForegroundText="light" BackgroundColor="#464646">
<m3:VisualElements DisplayName="Copay Bitcoin Wallet" Square150x150Logo="Assets\SquareTile150x150.png" Square44x44Logo="Assets\Logo.png" Description="A multisignature Bitcoin Wallet" ForegroundText="light" BackgroundColor="#464646">
<m3:DefaultTile Square71x71Logo="Assets\SquareTile71x71.png">
</m3:DefaultTile>
<m3:SplashScreen Image="SplashScreenImage.jpg" />

View File

@ -3,9 +3,13 @@
<DefaultLanguage code="en-US" xmlns="" />
<Languages xmlns="">
<Language code="en-US" />
<Language code="fr" />
<Language code="de" />
<Language code="ja" />
<Language code="es" />
</Languages>
<App Author="Bitpay Inc." BitsPerPixel="32" Description="A multisignature Bitcoin Wallet" Genre="apps.normal" ProductID="{5381aa50-9069-11e4-84cc-293caf9cbdc8}" Publisher="Copay Wallet" PublisherID="{31cdd08b-457c-413d-b440-f6665eec847d}" RuntimeType="Silverlight" Title="Copay Wallet" Version="0.9.9.0" xmlns="" SDOptOut="false" NotificationService="MPN">
<IconPath IsRelative="true" IsResource="false">Assets/icon@2.png</IconPath>
<App Author="Bitpay Inc." BitsPerPixel="32" Description="A multisignature Bitcoin Wallet" Genre="apps.normal" ProductID="{5381aa50-9069-11e4-84cc-293caf9cbdc8}" Publisher="Copay Bitcoin Wallet" PublisherID="{31cdd08b-457c-413d-b440-f6665eec847d}" RuntimeType="Silverlight" Title="Copay Bitcoin Wallet" Version="1.4.3.0" xmlns="" SDOptOut="true" NotificationService="MPN">
<IconPath IsRelative="true" IsResource="false">Assets\icon@2.png</IconPath>
<Capabilities>
<Capability Name="ID_CAP_WEBBROWSERCOMPONENT" />
<Capability Name="ID_CAP_NETWORKING" />
@ -18,10 +22,10 @@
<Tokens>
<PrimaryToken TaskName="_default" TokenID="CopayToken">
<TemplateFlip>
<SmallImageURI IsRelative="true" IsResource="false">Assets/200x200@1.png</SmallImageURI>
<SmallImageURI IsRelative="true" IsResource="false">Assets\200x200@1.png</SmallImageURI>
<Count>0</Count>
<BackgroundImageURI IsRelative="true" IsResource="false">Assets/200x200@2.png</BackgroundImageURI>
<Title>Copay Wallet</Title>
<BackgroundImageURI IsRelative="true" IsResource="false">Assets\200x200@2.png</BackgroundImageURI>
<Title>Copay Bitcoin Wallet</Title>
<BackContent />
<BackBackgroundImageURI />
<BackTitle />

View File

@ -2,7 +2,7 @@
"name": "copay",
"description": "A multisignature wallet",
"author": "BitPay",
"version": "1.4.1",
"version": "1.4.3",
"keywords": [
"wallet",
"copay",

View File

@ -8,7 +8,6 @@
<div class="content preferences" ng-controller="wordsController as wordsC">
<h4></h4>
<div class="box-notification" ng-show="wordsC.error">
<span class="text-warning">
{{wordsC.error|translate}}
@ -17,7 +16,7 @@
<div ng-show="wordsC.mnemonicWords">
<div ng-show="wordsC.mnemonicWords || (wordsC.credentialsEncrypted && !wordsC.deleted)">
<div class="row" ng-show="index.n==1">
<div class="m10t columns size-14 text-gray">
<span translate>
@ -33,11 +32,11 @@
<span translate>
To restore this {{index.m}}-{{index.n}} <b>shared</b> wallet you will need
</span>:
<ol class="m10t columns size-14 text-gray">
<li translate>Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.</li>
<li translate><b>OR</b> the wallet seed of <b>all</b> copayers in the wallet</li>
<li translate><b>OR</b> 1 wallet export file and the remaining quorum of wallet seeds (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet seeds of any of the other copayers).</li>
</ol>
<ol class="m10t columns size-14 text-gray">
<li translate>Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.</li>
<li translate><b>OR</b> the wallet seed of <b>all</b> copayers in the wallet</li>
<li translate><b>OR</b> 1 wallet export file and the remaining quorum of wallet seeds (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet seeds of any of the other copayers).</li>
</ol>
</span>
</div>
</div>
@ -46,22 +45,22 @@
<span translate>
To restore this {{index.m}}-{{index.n}} <b>shared</b> wallet you will need
</span>:
<ol class="m10t columns size-14 text-gray">
<li translate>Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.</li>
<li translate><b>OR</b> the wallet seeds of <b>all</b> copayers in the wallet</li>
</ol>
<ol class="m10t columns size-14 text-gray">
<li translate>Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.</li>
<li translate><b>OR</b> the wallet seeds of <b>all</b> copayers in the wallet</li>
</ol>
</span>
</div>
</div>
</div>
<div class="row m20t" ng-show="!wordsC.mnemonicWords && !wordsC.credentialsEncrypted">
<div class="row m20t" ng-show="wordsC.deleted">
<div class="columns size-14 text-gray text-center" translate>
Wallet seed not available. You can still export it from Advanced &gt; Export.
</div>
</div>
<div ng-show="wordsC.mnemonicWords">
<div ng-show="wordsC.mnemonicWords || (wordsC.credentialsEncrypted && !wordsC.deleted)">
<div class="row">
<div class="m10t columns">
<a class="button outline light-gray expand tiny" ng-click="wordsC.toggle()">

View File

@ -5,27 +5,38 @@ angular.module('copayApp.controllers').controller('wordsController',
var msg = gettext('Are you sure you want to delete the backup words?');
var successMsg = gettext('Backup words deleted');
this.show = false;
var self = this;
self.show = false;
var fc = profileService.focusedClient;
this.toggle = function() {
this.show = !this.show;
if (fc.isPrivKeyEncrypted()) self.credentialsEncrypted = true;
else {
setWords(fc.getMnemonic());
$rootScope.$emit('Local/BackupDone');
}
if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) {
self.deleted = true;
}
if (this.show)
$rootScope.$emit('Local/BackupDone');
self.toggle = function() {
self.error = "";
if (!self.credentialsEncrypted)
self.show = !self.show;
$timeout(function(){
if (self.credentialsEncrypted)
self.passwordRequest();
$timeout(function() {
$scope.$apply();
}, 1);
};
this.delete = function() {
var fc = profileService.focusedClient;
self.delete = function() {
confirmDialog.show(msg, function(ok) {
if (ok) {
fc.clearMnemonic();
profileService.updateCredentialsFC(function() {
self.deleted = true;
notification.success(successMsg);
go.walletHome();
});
@ -33,12 +44,10 @@ angular.module('copayApp.controllers').controller('wordsController',
});
};
$scope.$on('$destroy', function() {
profileService.lockFC();
});
function setWords(words) {
if (words) {
self.mnemonicWords = words.split(/[\u3000\s]+/);
@ -47,26 +56,30 @@ angular.module('copayApp.controllers').controller('wordsController',
}
};
var fc = profileService.focusedClient;
try {
setWords(fc.getMnemonic());
} catch (e) {
if (e.message && e.message.match(/encrypted/) && fc.isPrivKeyEncrypted()) {
self.credentialsEncrypted = true;
self.passwordRequest = function() {
try {
setWords(fc.getMnemonic());
} catch (e) {
if (e.message && e.message.match(/encrypted/) && fc.isPrivKeyEncrypted()) {
self.credentialsEncrypted = true;
$timeout(function(){
$scope.$apply();
}, 1);
$timeout(function() {
$scope.$apply();
}, 1);
profileService.unlockFC(function(err) {
if (err) {
self.error = bwsError.msg(err, gettext('Could not decrypt'));
$log.warn('Error decrypting credentials:',self.error); //TODO
return;
}
self.credentialsEncrypted = false;
setWords(fc.getMnemonic());
});
}
profileService.unlockFC(function(err) {
if (err) {
self.error = bwsError.msg(err, gettext('Could not decrypt'));
$log.warn('Error decrypting credentials:', self.error); //TODO
return;
}
if (!self.show && self.credentialsEncrypted)
self.show = !self.show;
self.credentialsEncrypted = false;
setWords(fc.getMnemonic());
$rootScope.$emit('Local/BackupDone');
});
}
}
}
});
});

View File

@ -1116,13 +1116,16 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.needsBackup = false;
$log.debug('Backup done');
storageService.setBackupFlag(self.walletId, function(err) {
if (err) root.showErrorPopup(err);
$log.debug('Backup done stored');
});
});
$rootScope.$on('Local/DeviceError', function(event, err) {
root.showErrorPopup(err);
self.showErrorPopup(err, function() {
if (self.isCordova && navigator && navigator.app) {
navigator.app.exitApp();
}
});
});
$rootScope.$on('Local/WalletImported', function(event, walletId) {

View File

@ -67,7 +67,11 @@ angular.module('copayApp.directives')
localMediaStreamTrack[i].stop();
}
} else {
localMediaStream.stop();
try {
localMediaStream.stop();
} catch(e) {
// Older Chromium not support the STOP function
};
}
localMediaStream = null;
video.src = '';

View File

@ -515,10 +515,10 @@ angular
// Try to open local profile
profileService.loadAndBindProfile(function(err) {
if (err) {
if (err.message.match('NOPROFILE')) {
if (err.message && err.message.match('NOPROFILE')) {
$log.debug('No profile... redirecting');
$state.transitionTo('splash');
} else if (err.message.match('NONAGREEDDISCLAIMER')) {
} else if (err.message && err.message.match('NONAGREEDDISCLAIMER')) {
$log.debug('Display disclaimer... redirecting');
$state.transitionTo('disclaimer');
} else {
@ -545,4 +545,4 @@ angular
}, 50);
}
});
});
});

View File

@ -14,17 +14,15 @@ angular.module('copayApp.services')
} else {
// Go home reloading the application
if (isChromeApp) {
if (nodeWebkit.isDefined()) {
go.walletHome();
$timeout(function() {
var win = require('nw.gui').Window.get();
win.reload(3);
//or
win.reloadDev();
}, 100);
} else {
chrome.runtime.reload();
}
chrome.runtime.reload();
} else if (nodeWebkit.isDefined()) {
go.walletHome();
$timeout(function() {
var win = require('nw.gui').Window.get();
win.reload(3);
//or
win.reloadDev();
}, 100);
} else {
window.location = window.location.href.substr(0, hashIndex);
}

View File

@ -41,15 +41,23 @@ angular.module('copayApp.services')
json = JSON.parse(text);
} catch (e) {};
if (!json) return cb('Could not access storage')
if (!json.iter || !json.ct)
return cb(null, text);
$log.debug('Profile is encrypted');
getUUID(function(uuid) {
$log.debug('Device UUID:' + uuid);
if (!uuid)
return cb(new Error('Could not decrypt localstorage profile'));
return cb('Could not decrypt storage: could not get device ID');
text = sjcl.decrypt(uuid, text);
try {
text = sjcl.decrypt(uuid, text);
} catch(e) {
$log.warn('Decrypt error: ', e);
return cb('Could not decrypt storage: device ID mismatch');
};
return cb(null, text);
});
};

View File

@ -1,6 +1,6 @@
[Desktop Entry]
Type=Application
Version=1.4.1
Version=1.4.3
Name=Copay
Comment=A multisignature wallet
Exec=copay

View File

@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Copay"
#define MyAppVersion "1.4.1"
#define MyAppVersion "1.4.3"
#define MyAppPublisher "BitPay"
#define MyAppURL "https://copay.io"
#define MyAppExeName "copay.exe"

View File

@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Copay"
#define MyAppVersion "1.4.1"
#define MyAppVersion "1.4.3"
#define MyAppPublisher "BitPay"
#define MyAppURL "https://copay.io"
#define MyAppExeName "copay.exe"