You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/packages/center/index.ts

76 lines
2.3 KiB
TypeScript

import assert from 'assert';
import crypto from 'crypto-js';
import {
db, definePlugin, ForbiddenError, Handler, post, Types, yaml,
} from 'hydrooj';
function decrypt(encrypted: string) {
return crypto.DES.decrypt(
{ ciphertext: crypto.enc.Hex.parse(encrypted) },
crypto.enc.Utf8.parse('hydro-oj'),
{ mode: crypto.mode.ECB },
).toString(crypto.enc.Utf8);
}
declare module 'hydrooj' {
interface Collections {
dataReport: any;
}
interface EventMap {
'center/report': (thisArg: DataReportHandler, installId: string, old: any, payload: any) => void;
}
}
const coll = db.collection('dataReport');
class DataReportHandler extends Handler {
noCheckPermView = true;
@post('installId', Types.String)
@post('payload', Types.String)
async post(domainId: string, installId: string, _payload: string) {
let payload: any;
try {
payload = yaml.load(decrypt(_payload));
} catch (e) {
payload = yaml.load(_payload);
}
try {
assert(typeof payload.url === 'string');
} catch (e) {
console.log(payload);
throw new ForbiddenError();
}
const old = await coll.findOne({ _id: installId });
await coll.updateOne({ _id: installId }, {
$set: {
version: payload.version,
name: payload.name,
url: payload.url,
addons: payload.addons,
mem: payload.memory,
osinfo: payload.osinfo,
cpu: payload.cpu,
ip: this.request.ip,
flags: payload.flags,
update: new Date(),
domainCount: payload.domainCount,
userCount: payload.userCount,
problemCount: payload.problemCount,
discussionCount: payload.discussionCount,
recordCount: payload.recordCount,
sandbox: payload.sandbox,
dbVersion: payload.dbVersion,
},
}, { upsert: true });
bus.emit('center/report', this, installId, old, payload);
this.response.body = { code: 0 };
}
}
export default definePlugin({
apply(ctx) {
ctx.Route('data_report', '/center/report', DataReportHandler);
},
});