core: better blacklist

This commit is contained in:
undefined committed 2021-08-20 17:47:39 +08:00
1 parent 42f920d25c
commit 0676cc0a27
9 files changed
+21 -90

No files matched your search

+2 -2
View File
@@ -16,7 +16,7 @@ async function _address(
if (bset.has(ip)) return;
bset.add(ip);
report({ message: `ip ${ip}` });
const users = await db.collection('user').find({ loginip: ip }).toArray();
const users = await db.collection('user').find({ $or: [{ loginip: ip }, { regip: ip }] }).toArray();
const tasks = [];
for (const udoc of users) {
tasks.push(_user(udoc._id, bset, uset, dset, dryrun, report));
@@ -50,7 +50,7 @@ async function _user(
const udoc = await user.getById('system', uid);
if (!udoc) return;
report({ message: `user ${udoc._id} ${udoc.uname}` });
await _address(udoc.loginip(), bset, uset, dset, dryrun, report);
await _address(udoc._loginip, bset, uset, dset, dryrun, report);
const ddocs = await db.collection('document').find({ docType: document.TYPE_DISCUSSION, owner: uid })
.sort({ domainId: 1, docId: 1 }).toArray();
const tasks = [];
+6 -77
View File
@@ -1,91 +1,20 @@
/* eslint-disable no-await-in-loop */
import { Udoc } from '../interface';
import { Value } from '../typeutils';
import user from '../model/user';
import * as document from '../model/document';
import * as setting from '../model/setting';
import db from '../service/db';
import paginate from '../lib/paginate';
import { STATUS, PRIV } from '../model/builtin';
import { PRIV } from '../model/builtin';
export const description = 'Delete a user';
const collDocument = db.collection('document');
const collDomainUser = db.collection('domain.user');
const collRecord = db.collection('record');
const collMessage = db.collection('message');
const $unset: Value<Partial<Udoc>> = {
regip: '', regat: '', loginat: '', loginip: '',
};
for (const s of setting.PREFERENCE_SETTINGS) {
$unset[s.key] = '';
}
async function deleteRecord(uid: number) {
const [, pcount] = await paginate(
collRecord.find(),
1,
100,
);
for (let i = 1; i <= pcount; i++) {
const [rdocs] = await paginate(
collRecord.find(),
1,
100,
);
const tasks = [];
for (const rdoc of rdocs) {
if (rdoc.pid) {
tasks.push(document.inc(rdoc.domainId, document.TYPE_PROBLEM, rdoc.pid, 'nSubmit', -1));
}
if (rdoc.status === STATUS.STATUS_ACCEPTED) {
tasks.push(document.inc(rdoc.domainId, document.TYPE_PROBLEM, rdoc.pid, 'nAccept', -1));
}
}
await Promise.all(tasks);
}
export async function run({ uid }) {
await collDocument.deleteMany({ owner: uid });
await collRecord.deleteMany({ uid });
}
async function deleteDiscussion(uid: number) {
const [, pcount] = await paginate(
collDocument.find({ docType: document.TYPE_DISCUSSION, owner: uid }),
1,
100,
);
for (let i = 1; i <= pcount; i++) {
const [ddocs] = await paginate(
collDocument.find({ docType: document.TYPE_DISCUSSION, owner: uid }),
1,
100,
);
const tasks = [];
for (const ddoc of ddocs) {
tasks.push(document.deleteMulti(ddoc.domainId, document.TYPE_DISCUSSION_REPLY, {
parentId: ddoc.docId,
parentType: document.TYPE_DISCUSSION,
}));
}
await Promise.all(tasks);
}
await collDocument.deleteMany({ docType: document.TYPE_DISCUSSION, owner: uid });
// TODO delete replies
}
export async function run({
uid,
}) {
await deleteRecord(uid);
await deleteDiscussion(uid);
await collDomainUser.deleteMany({ uid });
const uname = String.random(32);
await user.setById(uid, {
uname,
unameLower: uname.toLowerCase(),
priv: PRIV.PRIV_NONE,
}, $unset);
await user.setPassword(uid, String.random(32));
// TODO delete contest, homework, etc
await collMessage.deleteMany({ $or: [{ from: uid }, { to: uid }] });
await user.setPriv(uid, PRIV.PRIV_NONE);
return uid;
}