mirror of
https://github.com/Meituan-Dianping/Logan.git
synced 2025-12-08 19:25:57 +00:00
98 lines
3.1 KiB
TypeScript
98 lines
3.1 KiB
TypeScript
import express from "express";
|
|
import logger from "morgan";
|
|
import { AES, enc, mode, pad } from "crypto-js";
|
|
const { JSEncrypt } = require("js-encrypt");
|
|
|
|
interface IReportLog {
|
|
client: string;
|
|
webSource?: string;
|
|
deviceId: string;
|
|
environment?: string;
|
|
customInfo: string;
|
|
logPageNo: number;
|
|
fileDate: string;
|
|
logArray: string;
|
|
}
|
|
|
|
interface ILogItem {
|
|
l: string;
|
|
iv?: string;
|
|
k?: string;
|
|
v?: number;
|
|
}
|
|
|
|
interface ILogContent {
|
|
/**log type */
|
|
t: number;
|
|
|
|
/**log content */
|
|
c: string;
|
|
|
|
/**js timestamp */
|
|
d: string;
|
|
}
|
|
|
|
const port = '9002';
|
|
|
|
const privateKey = '-----BEGIN PRIVATE KEY-----\n' +
|
|
'MIICXAIBAAKBgG2m5VVtZ4mHml3FB9foDRpDW7PwFoa+1eYN777rNmIdnmezQqHW\n' +
|
|
'IRVcnTRVjrgGt2ndP2cYT7MgmWpvr8IjgN0PZ6ngMmKYGpapMqkxsnS/6Q8UZO4P\n' +
|
|
'QNlnsK2hSPoIDeJcHxDvo6Nelg+mRHEpD6K+1FIqzvdwVPCcgK7UbZElAgMBAAEC\n' +
|
|
'gYAXQM9dgGf2iGU6AXCaXsF4klQ+ImoEhS/DK61t5V+RCwrunttAirJVX2CPGp27\n' +
|
|
'dOEseBjb+hHcwMsIAUtadkD7VqDoLg0C63pP6Yr91zoLSq7ru7FL4j8ZDGgHV2tE\n' +
|
|
'6TbtIRGbxuuF+EmztKqrMCvN4qcxqDvTtU6Xq9Us7xC+uQJBANoFtsuTqDaFFOJ0\n' +
|
|
'p0S3+w4lzUcfp+XboVb4+q7wcFumfDCLIuvOTEiCFj5Tj0o2eHtEo3ARHWIcNZqB\n' +
|
|
'OgYPPdMCQQCAwJzubpjr7oXxINLERcQ1PXvjD5HD9Q4A20p6pFkcEYTlDYW/nm60\n' +
|
|
'PMr7JWG54TH0e6w8IfJZVR2xonVasoInAkEAjdIfuUdgqa5iCnkFgb8IEYjngneG\n' +
|
|
'GRCIX/Hv57JB9GxU5qLrYWa92oC8hWiHkifisZTRmAmaCoL9H3cmTmDFvwJAJjwM\n' +
|
|
'3mmNlBLDR/YdYRfuyni1v5oyCWVOgUad+YmwxLsXIgY//8WGzpN3G9ngCZksgpPv\n' +
|
|
'c/QIyiqSpNu/ye1U5QJBAIgSfWXvx+varXagGojcCH8mVtT/E4/w3R+QTLAp6s0L\n' +
|
|
'QTQUDPnDGrxvT4sDoU6ib+nn0FAr/kTyJptdlvaXfeo=' +
|
|
'-----END PRIVATE KEY-----';
|
|
|
|
const app = express();
|
|
|
|
app.use(logger('dev'));
|
|
app.use(express.json());
|
|
app.use(express.urlencoded({ extended: false }));
|
|
|
|
app.use('/', (req, res, next) => {
|
|
const reportLog: IReportLog = req.body;
|
|
const logArray: Array<ILogItem> = reportLog.logArray.split(',').map(it => JSON.parse(decodeURIComponent(it))) as Array<ILogItem>;
|
|
|
|
let logContent: Array<ILogContent> = logArray.map(it => {
|
|
let logContent: ILogContent, content: string;
|
|
|
|
if (it.iv && it.k && it.v) {
|
|
|
|
/**
|
|
* 如果加密过
|
|
* 则先使用RSA解密出AES加密的key
|
|
* 再使用得到的key使用AES解密得到内容
|
|
*/
|
|
|
|
/**
|
|
* if log with encryption
|
|
* first, use RSA decrypt to get the AES encryption key
|
|
* then, use the key do AES decrypt can get our log content
|
|
*/
|
|
|
|
const en = new JSEncrypt();
|
|
en.setPrivateKey(privateKey);
|
|
const key = en.decrypt(it.k).toString(enc.Utf8);
|
|
|
|
content = AES.decrypt(it.l, enc.Utf8.parse(key), { iv: enc.Utf8.parse(it.iv), mode: mode.CTR, padding: pad.NoPadding }).toString(enc.Utf8);
|
|
} else {
|
|
content = enc.Base64.parse(it.l).toString(enc.Utf8);
|
|
}
|
|
|
|
logContent = JSON.parse(content);
|
|
logContent.c = decodeURIComponent(logContent.c);
|
|
return logContent;
|
|
});
|
|
|
|
res.status(200).json(logContent);
|
|
});
|
|
|
|
app.listen(port, () => { console.log(`server run at ${port}`); });
|