mirror of
https://github.com/en-lwj/cordova-plugin-cescit-integrity.git
synced 2026-04-17 00:04:16 +08:00
[add]添加cordova完整性检验
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var crypto = require('crypto');
|
||||
var helpers = require('./helpers');
|
||||
|
||||
module.exports = function (context) {
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
var cordovaUtil = context.requireCordovaModule('cordova-lib/src/cordova/util');
|
||||
var platforms = context.requireCordovaModule('cordova-lib/src/platforms/platforms');
|
||||
var projectRoot = cordovaUtil.isCordova();
|
||||
|
||||
process.stdout.write('[完整性检验] Saving a hash for each platforms asset \n');
|
||||
|
||||
function getPlatformAssets (dir) {
|
||||
var assetsList = [];
|
||||
var list = fs.readdirSync(dir);
|
||||
list.map(function (file) {
|
||||
var filePath = path.join(dir, file);
|
||||
if (fs.statSync(filePath).isDirectory()) {
|
||||
var subDirList = getPlatformAssets(filePath);
|
||||
assetsList = assetsList.concat(subDirList);
|
||||
}
|
||||
if (fs.statSync(filePath).isFile()) {
|
||||
assetsList.push(filePath);
|
||||
}
|
||||
});
|
||||
return assetsList;
|
||||
}
|
||||
|
||||
helpers.getPlatformsList(context).forEach(function (platform) {
|
||||
var platformPath = path.join(projectRoot, 'platforms', platform);
|
||||
var platformApi = platforms.getPlatformApi(platform, platformPath);
|
||||
var platformInfo = platformApi.getPlatformInfo();
|
||||
var platformWww = platformInfo.locations.www;
|
||||
var platformAssets = path.resolve(platformWww, '../') // assets文件夹
|
||||
var source = helpers.getFileMapContent(context, platform, 'AssetsIntegrity');
|
||||
var content = source.content;
|
||||
|
||||
var hashes = getPlatformAssets(platformAssets).map(function (file) {
|
||||
var fileName = file.replace(/\\/g, '/');
|
||||
fileName = fileName.replace(platformAssets.replace(/\\/g, '/') + '/', '');
|
||||
var hash;
|
||||
var hashHex;
|
||||
hash = crypto.createHash('sha256');
|
||||
try {
|
||||
hash.update(fs.readFileSync(file), 'utf8');
|
||||
} catch (e) {
|
||||
helpers.exit('Unable to read file at path ' + file, e);
|
||||
}
|
||||
hashHex = hash.digest('hex');
|
||||
if (helpers.isVerbose(context)) {
|
||||
process.stdout.write('Hash: ' + hashHex + ' < ' + fileName + '\n');
|
||||
}
|
||||
return {
|
||||
// file: Buffer.from(fileName).toString('base64'),
|
||||
file: fileName,
|
||||
hash: hashHex
|
||||
};
|
||||
});
|
||||
|
||||
if (platform === 'android') {
|
||||
content = content.replace(/\s*put\("[^"]+",\s"[^"]{64}"\);/g, '')
|
||||
.replace(/hashList\s*=.+\s*new.*(\(\d+\)[^\w]*)\);/, function (match, group) {
|
||||
return match.replace(group, '()\n' + tab());
|
||||
})
|
||||
.replace(/hashList\s*=.+\s*new.*(\(.*\))/, function (match, group) {
|
||||
var replace = match.replace(group, '(' + (hashes.length || '') + ')');
|
||||
if (hashes.length) {
|
||||
replace += ' {{\n' + tab();
|
||||
hashes.forEach(function (h) {
|
||||
replace += tab(2) + 'put("' + h.file + '", "' + h.hash + '");\n' + tab();
|
||||
});
|
||||
replace += tab() + '}}';
|
||||
}
|
||||
return replace;
|
||||
});
|
||||
|
||||
try {
|
||||
fs.writeFileSync(source.path, content, 'utf-8');
|
||||
} catch (e) {
|
||||
helpers.exit('Unable to write java class source at path ' + source.path, e);
|
||||
}
|
||||
}
|
||||
|
||||
if (platform === 'ios') {
|
||||
content = content.replace(/hashList = (@{([^}]*)});/, function (a, b) {
|
||||
var list = '@{\n' + tab();
|
||||
hashes.forEach(function (h) {
|
||||
list += tab() + '@"' + h.file + '": @"' + h.hash + '",\n' + tab();
|
||||
});
|
||||
list += '}';
|
||||
return a.replace(b, list);
|
||||
});
|
||||
|
||||
try {
|
||||
fs.writeFileSync(source.path, content, 'utf-8');
|
||||
} catch (e) {
|
||||
helpers.exit('Unable to write obj-c source at path ' + source.path, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function tab (size) {
|
||||
var str = '';
|
||||
for (var i = 0; i < (size || 1); i++) {
|
||||
str += ' ';
|
||||
}
|
||||
return str;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user