Files
ZYZ/web-server/app/middleware/parmsDecode.ts

95 lines
3.3 KiB
TypeScript

import { ENCRYPT_KEY, ENCRYPT_IV } from '@consts';
import { genCode } from 'app/pubUtils/util';
import { Context } from 'egg';
const crypto = require('crypto');
const isJSON = require('koa-is-json');
import fs = require('fs');
import path = require('path');
const privateKey = fs.readFileSync(path.resolve(__dirname, `../resource/privateKey`));
function aesEncrypt(data, key, iv) {
const cipher = crypto.createCipheriv('aes-192-cbc', key, iv);
let crypted = cipher.update(data, 'utf8', 'hex');
crypted += cipher.final('hex');
return crypted;
}
function aesDecrypt(data, key, iv) {
const decipher = crypto.createDecipheriv('aes-192-cbc', key, iv);
let decrypted = decipher.update(data, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
function privateDecrypt(encryptMsg) {
const decryptMsg = crypto.privateDecrypt(
{ key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING },
encryptMsg
);
return decryptMsg;
}
module.exports = options => {
return async function parmsDecode(ctx: Context, next) {
let url = ctx.request.url;
ctx.logcode = genCode(10);
if(url.indexOf("/dev") == 0 || url.indexOf("/web") == 0 || url.indexOf("/cb") == 0) {
ctx.service.utils.log('INFO', `[${ctx.request.url}] [${ctx.logcode}] request: ${JSON.stringify(ctx.request.body)}`);
await next();
ctx.service.utils.log('INFO', `[${ctx.request.url}] [${ctx.logcode}] res: ${JSON.stringify(ctx.body)}`)
return;
}
if (options.threshold && ctx.length < options.threshold) return;
const reqBody = ctx.request.body;
const reqHeader = ctx.request.header;
const aesKey = reqHeader['k'] ? privateDecrypt(new Buffer(reqHeader['k'], 'base64')) : ENCRYPT_KEY;
const aesIV = reqHeader['v'] ? privateDecrypt(new Buffer(reqHeader['v'], 'base64')) : ENCRYPT_IV;
if (isJSON(reqBody)) {
const encodeStr = aesEncrypt(JSON.stringify(reqBody), aesKey, aesIV);
console.log(`encoded str: ${encodeStr}`);
}
console.log(ctx.app.config.decodeParm)
if(ctx.app.config.decodeParm == false) {
await next();
return;
}
if (!reqBody.data) return;
const decodeStr = aesDecrypt(reqBody.data, aesKey, aesIV);
ctx.logger.debug('decoded str:', decodeStr);
try {
ctx.request.body = JSON.parse(decodeStr);
console.log('req body', ctx.request.body);
ctx.service.utils.log('INFO', `[${ctx.request.url}] [${ctx.logcode}] request: ${JSON.stringify(ctx.request.body)}`)
} catch (e) {
console.error('parms parse err');
ctx.service.utils.log('ERROR', `[${ctx.request.url}] [${ctx.logcode}] request: parms parse err`)
}
try{
await next();
} catch(e) {
ctx.service.utils.log('ERROR', `[${ctx.request.url}] [${ctx.logcode}] err: ${(<Error>e).stack}`);
throw e;
}
const resBody = ctx.body;
console.log('return value:', JSON.stringify(resBody));
if (isJSON(resBody)) {
ctx.body = { result: aesEncrypt(JSON.stringify(resBody), aesKey, aesIV) };
ctx.service.utils.log('INFO', `[${ctx.request.url}] [${ctx.logcode}] res: ${JSON.stringify(resBody)}`)
} else {
ctx.body = { result: aesEncrypt(JSON.stringify({ status: 3, data: 'internal err' }), aesKey, aesIV) };
ctx.service.utils.log('ERROR', `[${ctx.request.url}] [${ctx.logcode}] res: ${resBody}`)
}
};
};