From ea0a4b1e6e21c25c2ddf22261ca217435aa2a8f8 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Tue, 5 Nov 2019 17:01:51 +0800 Subject: [PATCH] feat(app-plus): add crypto --- .../build/webpack.nvue.conf.js | 20 ++++-- packages/vue-cli-plugin-uni/lib/crypto.js | 65 +++++++++++++++++++ packages/vue-cli-plugin-uni/lib/mp.js | 3 +- 3 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 packages/vue-cli-plugin-uni/lib/crypto.js diff --git a/packages/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js b/packages/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js index 679166918..1d0d04392 100644 --- a/packages/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js +++ b/packages/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js @@ -1,3 +1,4 @@ +const fs = require('fs') const path = require('path') const webpack = require('webpack') const VueLoaderPlugin = require('vue-loader/lib/plugin') @@ -49,6 +50,7 @@ if ( process.env.UNI_USING_V8 ) { provide['__f__'] = [require.resolve('@dcloudio/vue-cli-plugin-uni/lib/format-log.js'), 'default'] + provide['crypto'] = [require.resolve('@dcloudio/vue-cli-plugin-uni/lib/crypto.js'), 'default'] } const plugins = [ @@ -159,14 +161,24 @@ rules.unshift({ if (process.env.UNI_USING_NATIVE) { plugins.push(new WebpackUniMPPlugin()) + + let nativeTemplatePath = path.resolve( + process.env.UNI_HBUILDERX_PLUGINS, + 'weapp-tools/template/v8-native' + ) + + if (!fs.existsSync(nativeTemplatePath)) { // 兼容旧版本 + nativeTemplatePath = path.resolve( + process.env.UNI_HBUILDERX_PLUGINS, + 'weapp-tools/template/v8' + ) + } + plugins.push(new CopyWebpackPlugin([{ from: path.resolve(process.env.UNI_INPUT_DIR, 'static'), to: 'static' }, { - from: path.resolve( - process.env.UNI_HBUILDERX_PLUGINS, - 'weapp-tools/template/v8-native' - ), + from: nativeTemplatePath, to: process.env.UNI_OUTPUT_DIR }, { from: path.resolve( diff --git a/packages/vue-cli-plugin-uni/lib/crypto.js b/packages/vue-cli-plugin-uni/lib/crypto.js new file mode 100644 index 000000000..d5061c861 --- /dev/null +++ b/packages/vue-cli-plugin-uni/lib/crypto.js @@ -0,0 +1,65 @@ +var lookup = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 62, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 0, 0, 0, 0, 63, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 +] + +function base64Decode (source, target) { + var sourceLength = source.length + var paddingLength = (source[sourceLength - 2] === '=' ? 2 : (source[sourceLength - 1] === '=' ? 1 + : 0)) + + var tmp + var byteIndex = 0 + var baseLength = (sourceLength - paddingLength) & 0xfffffffc + + for (var i = 0; i < baseLength; i += 4) { + tmp = (lookup[source.charCodeAt(i)] << 18) | + (lookup[source.charCodeAt(i + 1)] << 12) | + (lookup[source.charCodeAt(i + 2)] << 6) | + (lookup[source.charCodeAt(i + 3)]) + + target[byteIndex++] = (tmp >> 16) & 0xFF + target[byteIndex++] = (tmp >> 8) & 0xFF + target[byteIndex++] = (tmp) & 0xFF + } + + if (paddingLength === 1) { + tmp = (lookup[source.charCodeAt(i)] << 10) | + (lookup[source.charCodeAt(i + 1)] << 4) | + (lookup[source.charCodeAt(i + 2)] >> 2) + + target[byteIndex++] = (tmp >> 8) & 0xFF + target[byteIndex++] = tmp & 0xFF + } + + if (paddingLength === 2) { + tmp = (lookup[source.charCodeAt(i)] << 2) | (lookup[source.charCodeAt(i + 1)] >> 4) + + target[byteIndex++] = tmp & 0xFF + } +} + +export default { + getRandomValues (arr) { + if (!( + arr instanceof Int8Array || + arr instanceof Uint8Array || + arr instanceof Int16Array || + arr instanceof Uint16Array || + arr instanceof Int32Array || + arr instanceof Uint32Array || + arr instanceof Uint8ClampedArray + )) { + throw new Error('Expected an integer array') + } + if (arr.byteLength > 65536) { + throw new Error('Can only request a maximum of 65536 bytes') + } + var crypto = uni.requireNativePlugin('DCloud-Crypto') + base64Decode(crypto.getRandomValues(arr.byteLength), new Uint8Array(arr.buffer, arr.byteOffset, + arr.byteLength)) + return arr + } +} diff --git a/packages/vue-cli-plugin-uni/lib/mp.js b/packages/vue-cli-plugin-uni/lib/mp.js index 947ce123a..ad8f49d9c 100644 --- a/packages/vue-cli-plugin-uni/lib/mp.js +++ b/packages/vue-cli-plugin-uni/lib/mp.js @@ -42,7 +42,8 @@ function getProvides () { process.env.UNI_PLATFORM === 'app-plus' && process.env.UNI_USING_V8 ) { - provides['__f__'] = [path.resolve(__dirname, 'format-log.js'), 'default'] + provides['__f__'] = [path.resolve(__dirname, 'format-log.js'), 'default'] + provides['crypto'] = [path.resolve(__dirname, 'crypto.js'), 'default'] } // TODO 目前依赖库 megalo 通过判断 wx 对象是否存在来识别平台做不同处理 -- GitLab