From 64380fe6f30f3a6c81ff4e60e798a2912bbfc58e Mon Sep 17 00:00:00 2001 From: Benoit Lavenier <benoit.lavenier@e-is.pro> Date: Fri, 14 Aug 2020 20:15:50 +0200 Subject: [PATCH] [enh] QR Code can hold G1 Link (june:// or web+june://) --- .run/Cesium.run.xml | 6 -- dist/desktop | 2 +- gulpfile.js | 83 +++++---------- package.json | 3 +- scripts/release-android-sign.sh | 12 +-- scripts/run-android.sh | 2 +- www/js/controllers/app-controllers.js | 135 +++++++++++++++---------- www/js/controllers/home-controllers.js | 4 +- 8 files changed, 114 insertions(+), 133 deletions(-) delete mode 100644 .run/Cesium.run.xml diff --git a/.run/Cesium.run.xml b/.run/Cesium.run.xml deleted file mode 100644 index 68640a859..000000000 --- a/.run/Cesium.run.xml +++ /dev/null @@ -1,6 +0,0 @@ -<component name="ProjectRunConfigurationManager"> - <configuration default="false" name="Cesium" type="JavascriptDebugType" uri="http://localhost:8100/"> - <mapping url="http://localhost:8100" local-file="$PROJECT_DIR$/www" /> - <method v="2" /> - </configuration> -</component> \ No newline at end of file diff --git a/dist/desktop b/dist/desktop index 2737fb8bc..366b85e16 160000 --- a/dist/desktop +++ b/dist/desktop @@ -1 +1 @@ -Subproject commit 2737fb8bc928e634cd86748567467ecee96791f5 +Subproject commit 366b85e16a589746f53ad260a02abdaa346a1212 diff --git a/gulpfile.js b/gulpfile.js index 212ab096b..344d39f91 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -8,7 +8,6 @@ const gulp = require('gulp'), rename = require('gulp-rename'), ngConstant = require('gulp-ng-constant'), fs = require("fs"), - es = require('event-stream'), header = require('gulp-header'), footer = require('gulp-footer'), removeCode = require('gulp-remove-code'), @@ -149,7 +148,7 @@ function appConfig() { const env = argv.env || 'default'; const config = allConfig[env]; - if(!config) { + if (!config) { throw new Error(colors.red("=> Could not load `" + env + "` environment!")); } @@ -197,7 +196,7 @@ function appNgTemplate() { .pipe(sort()) .pipe(templateCache({ standalone: true, - module:"cesium.templates", + module: "cesium.templates", root: "templates/" })) .pipe(gulp.dest('./www/dist/dist_js/app')); @@ -258,8 +257,8 @@ function pluginNgTemplate() { return gulp.src(paths.templatecache_plugin) .pipe(sort()) .pipe(templateCache({ - standalone:true, - module:"cesium.plugins.templates", + standalone: true, + module: "cesium.plugins.templates", root: "plugins/" })) .pipe(gulp.dest('./www/dist/dist_js/plugins')); @@ -273,8 +272,7 @@ function pluginNgAnnotate(event) { path = path.substring(0, path.lastIndexOf('/')); return gulp.src(event.path) .pipe(ngAnnotate({single_quotes: true})) - .pipe(gulp.dest('./www/dist/dist_js/app' + path)) - ; + .pipe(gulp.dest('./www/dist/dist_js/app' + path)); } log(colors.green('Building Plugins JS file...')); @@ -295,7 +293,7 @@ function pluginNgTranslate() { } function pluginLeafletImages(dest) { - dest = dest ||Â './www/img/'; + dest = dest || './www/img/'; // Leaflet images return gulp.src(['scss/leaflet/images/*.*', 'www/lib/leaflet/dist/images/*.*', @@ -358,13 +356,7 @@ function webCopyFiles() { log(colors.green('Preparing dist/web files...')); let htmlminOptions = {removeComments: true, collapseWhitespace: true}; - const debugOptions = { - title: 'Copying', - minimal: true, - showFiles: argv.debug || false, - showCount: argv.debug || false, - logger: m => log(colors.grey(m)) - }; + const debugOptions = { ...debugBaseOptions, title: 'Copying' }; var targetPath = './dist/web/www'; return merge( @@ -453,8 +445,8 @@ function webNgTemplate() { return gulp.src(targetPath + '/templates/**/*.html') .pipe(sort()) .pipe(templateCache({ - standalone:true, - module:"cesium.templates", + standalone: true, + module: "cesium.templates", root: "templates/" })) .pipe(gulp.dest(targetPath + '/dist/dist_js/app')); @@ -585,13 +577,8 @@ function webIntegrity() { .pipe(sriHash()) .pipe(rename({ extname: '.integrity.html' })) - .pipe(gulp.dest(targetPath)), - - gulp.src(targetPath + '/index.html', {base: targetPath}) - .pipe(rename({ extname: '.test.html' })) - .pipe(gulp.dest(targetPath)); + .pipe(gulp.dest(targetPath)); } - else { return Promise.resolve(); } @@ -662,12 +649,9 @@ function webCleanUnusedFiles(done) { const targetPath = './dist/web/www'; const enableUglify = argv.release || argv.uglify || false; const cleanSources = enableUglify; - const debugOptions = { + const debugOptions = {...debugBaseOptions, title: 'Deleting', - minimal: true, - showFiles: argv.debug || false, - showCount: !argv.debug, - logger: m => log(colors.grey(m)) + showCount: !argv.debug }; if (cleanSources) { @@ -677,6 +661,11 @@ function webCleanUnusedFiles(done) { .pipe(debug(debugOptions)) .pipe(clean()), + // Clean core CSS + gulp.src(targetPath + '/css/**/*.css', {read: false}) + .pipe(debug(debugOptions)) + .pipe(clean()), + // Clean plugins JS + CSS gulp.src(targetPath + '/plugins/**/*.js', {read: false}) .pipe(debug(debugOptions)) @@ -700,12 +689,9 @@ function webCleanUnusedFiles(done) { function webCleanUnusedDirectories() { log(colors.green('Clean unused directories...')); const enableUglify = argv.release || argv.uglify || false; - const debugOptions = { + const debugOptions = { ...debugBaseOptions, title: 'Deleting', - minimal: true, - showFiles: argv.debug || false, - showCount: !argv.debug, - logger: m => log(colors.grey(m)) + showCount: !argv.debug }; // Clean dir @@ -913,18 +899,7 @@ function cdvNgAnnotate() { // Ng annotate app JS file gulp.src(wwwPath + '/plugins/**/*.js') .pipe(ngAnnotate({single_quotes: true})) - .pipe(gulp.dest(wwwPath + '/dist/dist_js/plugins')), -/* - // Copy plugin CSS - gulp.src(wwwPath + '/plugins/!*!/css/!**!/!*.css') - .pipe(gulp.dest(wwwPath + '/dist/dist_css/plugins')), - - // Copy Leaflet images - pluginLeafletImages(wwwPath + '/img'), - - // Copy Leaflet CSS - gulp.src('./www/css/!**!/leaflet.*') - .pipe(gulp.dest(wwwPath + '/css'))*/ + .pipe(gulp.dest(wwwPath + '/dist/dist_js/plugins')) ); } @@ -948,12 +923,8 @@ function cdvRemoveCode() { removeCodeOptions[platform] = true; // = {<platform>: true} const htmlminOptions = {removeComments: true, collapseWhitespace: true}; - const debugOptions = { - title: 'Processing', - minimal: true, - showFiles: argv.debug || false, - showCount: false, - logger: m => log(colors.grey(m)) + const debugOptions = {...debugBaseOptions, + showCount: false }; // Do not remove desktop code for iOS and macOS (support for tablets and desktop macs) @@ -1239,7 +1210,6 @@ function cdvCleanUnusedDirectories() { function cdvCopyBuildFiles() { - log(colors.green('Copy build files... ')); const projectRoot = argv.root || '.'; @@ -1247,12 +1217,9 @@ function cdvCopyBuildFiles() { const srcPath = path.join(projectRoot, 'resources', platform, 'build'); const targetPath = path.join(projectRoot, 'platforms', platform); - const debugOptions = { - title: 'Copying', - minimal: true, + const debugOptions = { ...debugBaseOptions, title: 'Copying', showFiles: argv.debug || false, - showCount: !argv.debug, - logger: m => log(colors.grey(m)) + showCount: !argv.debug }; if (fs.existsSync(srcPath)) { @@ -1424,7 +1391,7 @@ exports.webExtClean = webExtClean; exports.webExtCompile = webExtCompile; exports.webExtBuild = webExtBuild; exports.webExtCopyFiles = webExtCopyFiles; -exports['build:webExt'] = exports.webBuild; // Alias +exports['build:webExt'] = exports.webExtBuild; // Alias // Cordova (hooks) const cdvAfterPrepare = gulp.series( diff --git a/package.json b/package.json index a7164e214..ec897ac99 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "git@git.duniter.org:clients/cesium/cesium.git" }, "scripts": { - "clean": "trash www/dist/** dist/web/* dist/desktop/**/*.deb platforms/android/**/*.apk", + "clean": "clean webClean webExtClean && trash dist/desktop/**/*.deb platforms/android/**/*.apk", "postinstall": "node scripts/node/postinstall.js", "lint": "gulp lint", "install-platforms": "ionic cordova prepare", @@ -19,6 +19,7 @@ "start:android": "ionic cordova run android --color", "docker:build": "sudo docker build . -t cesium/release", "docker:run": "sudo docker run -ti --rm -p 8100:8100 -p 35729:35729 -v .:/cesium:rw cesium/release", + "build": "gulp build", "build:web": "gulp config --env default && gulp webBuild --release", "build:webExt": "gulp config --env default && gulp webExtBuild --release", "build:android": "ionic cordova build android --color --release", diff --git a/scripts/release-android-sign.sh b/scripts/release-android-sign.sh index 96ad116f9..dce529aaf 100755 --- a/scripts/release-android-sign.sh +++ b/scripts/release-android-sign.sh @@ -41,9 +41,7 @@ fi echo "Executing jarsigner..." jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ${KEYSTORE_FILE} ${APK_UNSIGNED_FILE} Cesium -if [[ $? -ne 0 ]]; then - exit 1 -fi +[[ $? -ne 0 ]] && exit 1 echo "Executing jarsigner [OK]" BUILD_TOOLS_DIR="${ANDROID_SDK_ROOT}/build-tools/28.*/" @@ -51,16 +49,12 @@ cd ${BUILD_TOOLS_DIR} echo "Executing zipalign..." ./zipalign -v 4 ${APK_UNSIGNED_FILE} ${APK_SIGNED_FILE} -if [[ $? -ne 0 ]]; then - exit 1 -fi +[[ $? -ne 0 ]] && exit 1 echo "Executing zipalign [OK]" echo "Verify APK signature..." ./apksigner verify ${APK_SIGNED_FILE} -if [[ $? -ne 0 ]]; then - exit 1 -fi +[[ $? -ne 0 ]] && exit 1 echo "Verify APK signature [OK]" echo "Successfully generated signed APK at: ${APK_SIGNED_FILE}" diff --git a/scripts/run-android.sh b/scripts/run-android.sh index 0a8727987..552953def 100755 --- a/scripts/run-android.sh +++ b/scripts/run-android.sh @@ -26,6 +26,6 @@ if [[ "$1" == "--release" ]]; then native-run android --app ${ANDROID_OUTPUT_APK_RELEASE}/app-release-unsigned.apk fi else - native-run android --app ${ls }/app-debug.apk + native-run android --app ${ANDROID_OUTPUT_APK_DEBUG}/app-debug.apk fi diff --git a/www/js/controllers/app-controllers.js b/www/js/controllers/app-controllers.js index 9e3c703f9..99ddf9a56 100644 --- a/www/js/controllers/app-controllers.js +++ b/www/js/controllers/app-controllers.js @@ -393,12 +393,13 @@ function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $ /** * Parse an external URI (see g1lien), and open the expected state * @param uri + * @param reject optional function, to avoid error to be displayed * @returns {*} */ - $scope.handleUri = function(uri) { + $scope.handleUri = function(uri, reject) { if (!uri) return $q.when(); // Skip - console.info('[app] Parsing external uri: ', uri); + console.info('[app] Trying to parse as uri: ', uri); var fromHomeState = $state.current && $state.current.name === 'app.home'; // Parse the URI @@ -448,21 +449,76 @@ function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $ }) .catch(function(err) { + if (reject) { + reject(err); + return; + } console.error("[home] Error while handle uri {" + uri + "': ", err); return UIUtils.onError(uri)(err); }); }; + /** + * Try to parse as auth data (e.g. WIF/EWIF format) + * @param data + * @param reject optional function, to avoid error to be displayed + * @returns {*} + */ + $scope.handleAuthData = function(data, reject) { + console.debug("[app] Trying to parse as a auth data (WIF, EWIF)..."); + + return csCrypto.keyfile.parseData(data) + .then(function (keypair) { + if (!keypair || !keypair.signPk || !keypair.signSk) throw err; // rethrow the first error (e.g. Bad URI) + + var pubkey = CryptoUtils.base58.encode(keypair.signPk); + console.debug("[app] Detected WIF/EWIF format. Will login to wallet {" + pubkey.substring(0, 8) + "}"); + + // Create a new wallet (if default wallet is already used) + var wallet = !csWallet.isLogin() ? csWallet : csWallet.children.create({store: false}); + + // Login using keypair + return wallet.login({ + silent: true, + forceAuth: true, + minData: false, + authData: { + pubkey: pubkey, + keypair: keypair + } + }) + .then(function () { + + // Open transfer all wallet + $ionicHistory.nextViewOptions({ + historyRoot: true + }); + return $state.go('app.new_transfer', { + all: true, // transfer all sources + wallet: !wallet.isDefault() ? wallet.id : undefined + }); + }); + }) + .catch(function(err) { + if (reject) { + reject(err); + return; + } + console.error("[home] Error while handle auth data", err); + return UIUtils.onError('ERROR.AUTH_INVALID_FILE')(err); + }); + } + $scope.registerProtocolHandlers = function() { var protocols = ['web+june', /*'june' - NOT yet accepted by web browser */]; _.each(protocols, function(protocol) { - console.debug("[app] Registering protocol '%s'...".format(protocol)); + console.debug("[app] Registering protocol '{0}'...".format(protocol)); try { navigator.registerProtocolHandler(protocol, "#/app/home?uri=%s", "Cesium"); } catch(err) { - console.error("[app] Error while registering protocol '%s'".format(protocol), err); + console.error("[app] Error while registering protocol '{0}'".format(protocol), err); } }); }; @@ -522,59 +578,30 @@ function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $ .then(function(data) { if (!data) return; - // Try to parse as an URI - return BMA.uri.parse(data) - .then(function(res){ - if (!res || !res.pubkey) throw {message: 'ERROR.SCAN_UNKNOWN_FORMAT'}; - // If pubkey: open the identity - return $state.go('app.wot_identity', { - pubkey: res.pubkey, - node: res.host ? res.host: null} - ); + var throwIfError = function (err) { + if (err) throw err; + }; + + // First, try to handle as an URI + var firstError; + return $scope.handleUri(data, throwIfError) + + // If failed + .catch(function(e) { + firstError = e; + console.error("[app] Failed to parse as URI: " + (e && e.message || e)); + + // Try as an auth data + return $scope.handleAuthData(data, throwIfError) }) - // Not an URI: try WIF or EWIF format - .catch(function(err) { - console.debug("[app] Scan data is not an URI (get error: " + (err && err.message || err) + "). Trying to decode as a WIF or EWIF format..."); - - // Try to read as WIF format - return csCrypto.keyfile.parseData(data) - .then(function(keypair) { - if (!keypair || !keypair.signPk || !keypair.signSk) throw err; // rethrow the first error (e.g. Bad URI) - - var pubkey = CryptoUtils.base58.encode(keypair.signPk); - console.debug("[app] Detected WIF/EWIF format. Will login to wallet {" + pubkey.substring(0, 8) + "}"); - - // Create a new wallet (if default wallet is already used) - var wallet = !csWallet.isLogin() ? csWallet : csWallet.children.create({store: false}); - - // Login using keypair - return wallet.login({ - silent: true, - forceAuth: true, - minData: false, - authData: { - pubkey: pubkey, - keypair: keypair - } - }) - .then(function () { - - // Open transfer all wallet - $ionicHistory.nextViewOptions({ - historyRoot: true - }); - return $state.go('app.new_transfer', { - all: true, // transfer all sources - wallet: !wallet.isDefault() ? wallet.id : undefined - }); - }); - }) - // Unknown format (nor URI, nor WIF/EWIF) - .catch(UIUtils.onError('ERROR.SCAN_UNKNOWN_FORMAT')); + // Both failed + .catch(function(e) { + // Log second error, then display the first error + console.error("[app] Failed to parse as Auth data: " + (e && e.message || e)); + return UIUtils.onError('ERROR.SCAN_UNKNOWN_FORMAT')(firstError); }); - }) - .catch(UIUtils.onError('ERROR.SCAN_FAILED')); + }); }; /** diff --git a/www/js/controllers/home-controllers.js b/www/js/controllers/home-controllers.js index 2632b18f1..e2a925de2 100644 --- a/www/js/controllers/home-controllers.js +++ b/www/js/controllers/home-controllers.js @@ -14,9 +14,7 @@ angular.module('cesium.home.controllers', ['cesium.platform', 'cesium.services'] controller: 'HomeCtrl' } } - }) - - ; + }); // if none of the above states are matched, use this as the fallback $urlRouterProvider.otherwise('/app/home'); -- GitLab