diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/api/endpoints/admin/show-users.ts | 123 | ||||
| -rw-r--r-- | src/server/api/endpoints/admin/suspend-user.ts | 4 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/notes.ts | 14 | ||||
| -rw-r--r-- | src/server/web/index.ts | 24 | ||||
| -rw-r--r-- | src/server/web/views/info.pug | 113 |
5 files changed, 278 insertions, 0 deletions
diff --git a/src/server/api/endpoints/admin/show-users.ts b/src/server/api/endpoints/admin/show-users.ts new file mode 100644 index 0000000000..20ccfbd7f3 --- /dev/null +++ b/src/server/api/endpoints/admin/show-users.ts @@ -0,0 +1,123 @@ +import $ from 'cafy'; +import User, { pack } from '../../../../models/user'; +import define from '../../define'; + +export const meta = { + requireCredential: true, + requireModerator: true, + + params: { + limit: { + validator: $.num.optional.range(1, 100), + default: 10 + }, + + offset: { + validator: $.num.optional.min(0), + default: 0 + }, + + sort: { + validator: $.str.optional.or([ + '+follower', + '-follower', + '+createdAt', + '-createdAt', + '+updatedAt', + '-updatedAt', + ]), + }, + + state: { + validator: $.str.optional.or([ + 'all', + 'admin', + 'moderator', + 'adminOrModerator', + 'verified', + 'suspended', + ]), + default: 'all' + }, + + origin: { + validator: $.str.optional.or([ + 'combined', + 'local', + 'remote', + ]), + default: 'local' + } + } +}; + +export default define(meta, (ps, me) => new Promise(async (res, rej) => { + let _sort; + if (ps.sort) { + if (ps.sort == '+follower') { + _sort = { + followersCount: -1 + }; + } else if (ps.sort == '-follower') { + _sort = { + followersCount: 1 + }; + } else if (ps.sort == '+createdAt') { + _sort = { + createdAt: -1 + }; + } else if (ps.sort == '+updatedAt') { + _sort = { + updatedAt: -1 + }; + } else if (ps.sort == '-createdAt') { + _sort = { + createdAt: 1 + }; + } else if (ps.sort == '-updatedAt') { + _sort = { + updatedAt: 1 + }; + } + } else { + _sort = { + _id: -1 + }; + } + + const q = { + $and: [] + } as any; + + // state + q.$and.push( + ps.state == 'admin' ? { isAdmin: true } : + ps.state == 'moderator' ? { isModerator: true } : + ps.state == 'adminOrModerator' ? { + $or: [{ + isAdmin: true + }, { + isModerator: true + }] + } : + ps.state == 'verified' ? { isVerified: true } : + ps.state == 'suspended' ? { isSuspended: true } : + {} + ); + + // origin + q.$and.push( + ps.origin == 'local' ? { host: null } : + ps.origin == 'remote' ? { host: { $ne: null } } : + {} + ); + + const users = await User + .find(q, { + limit: ps.limit, + sort: _sort, + skip: ps.offset + }); + + res(await Promise.all(users.map(user => pack(user, me, { detail: true })))); +})); diff --git a/src/server/api/endpoints/admin/suspend-user.ts b/src/server/api/endpoints/admin/suspend-user.ts index 5bbd387a20..2ec5196880 100644 --- a/src/server/api/endpoints/admin/suspend-user.ts +++ b/src/server/api/endpoints/admin/suspend-user.ts @@ -37,6 +37,10 @@ export default define(meta, (ps) => new Promise(async (res, rej) => { return rej('cannot suspend admin'); } + if (user.isModerator) { + return rej('cannot suspend moderator'); + } + await User.findOneAndUpdate({ _id: user._id }, { diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts index 6c336683ab..7d73fde1c5 100644 --- a/src/server/api/endpoints/users/notes.ts +++ b/src/server/api/endpoints/users/notes.ts @@ -124,6 +124,14 @@ export const meta = { 'ja-JP': '指定された種類のファイルが添付された投稿のみを取得します' } }, + + excludeNsfw: { + validator: $.bool.optional, + default: false, + desc: { + 'ja-JP': 'true にすると、NSFW指定されたファイルを除外します(fileTypeが指定されている場合のみ有効)' + } + }, } }; @@ -233,6 +241,12 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => { query['_files.contentType'] = { $in: ps.fileType }; + + if (ps.excludeNsfw) { + query['_files.metadata.isSensitive'] = { + $ne: true + }; + } } //#endregion diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 59b8390ab5..7fd9e76cfc 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -2,6 +2,7 @@ * Web Client Server */ +import * as os from 'os'; import ms = require('ms'); import * as Koa from 'koa'; import * as Router from 'koa-router'; @@ -18,6 +19,8 @@ import config from '../../config'; import Note, { pack as packNote } from '../../models/note'; import getNoteSummary from '../../misc/get-note-summary'; import fetchMeta from '../../misc/fetch-meta'; +import Emoji from '../../models/emoji'; +const pkg = require('../../../package.json'); const client = `${__dirname}/../../client/`; @@ -195,6 +198,27 @@ router.get('/notes/:note', async ctx => { }); //#endregion +router.get('/info', async ctx => { + const meta = await fetchMeta(); + const emojis = await Emoji.find({ host: null }, { + fields: { + _id: false + } + }); + await ctx.render('info', { + version: pkg.version, + machine: os.hostname(), + os: os.platform(), + node: process.version, + cpu: { + model: os.cpus()[0].model, + cores: os.cpus().length + }, + emojis: emojis, + meta: meta + }); +}); + // Render base html for all requests router.get('*', async ctx => { const meta = await fetchMeta(); diff --git a/src/server/web/views/info.pug b/src/server/web/views/info.pug new file mode 100644 index 0000000000..3e72d86410 --- /dev/null +++ b/src/server/web/views/info.pug @@ -0,0 +1,113 @@ +doctype html + +html + + head + meta(charset='utf-8') + meta(name='application-name' content='Misskey') + title Misskey + style. + html { + font-family: sans-serif; + } + + main { + max-width: 934px; + margin: 0 auto; + } + + header { + padding: 5px; + background: rgb(153, 153, 204); + border: 1px solid #000; + } + header:after { + content: ''; + display: block; + clear: both; + } + + header > h1 { + float: left; + font-size: 2em; + } + + header > img { + float: right; + width: 220px; + } + + table { + margin: 1em 0; + width: 100%; + border-collapse: collapse; + } + table tr th { + background-color: #ccf; + border: 1px solid #000; + width: 300px; + font-weight: bold; + padding: 4px 5px; + text-align: left; + } + table tr td { + background-color: #ddd; + border: 1px solid #000; + padding: 4px 5px; + } + + body + main + header + h1 Misskey Version #{version} + img(src='/assets/misskey-php-like-logo.png' alt='') + table + tr + th Instance + td= meta.name + tr + th Maintainer + td + = meta.maintainer.name + | <#{meta.maintainer.email}> + tr + th System + td= os + tr + th Node version + td= node + tr + th Machine + td= machine + tr + th CPU + td= cpu.model + tr + th Registration + td= !meta.disableRegistration ? 'yes' : 'no' + tr + th reCAPTCHA enabled + td= meta.enableRecaptcha ? 'yes' : 'no' + tr + th Cache remote files + td= meta.cacheRemoteFiles ? 'yes' : 'no' + tr + th Drive capacity per local user + td + = meta.localDriveCapacityMb + | MB + tr + th Drive capacity per remote user + td + = meta.remoteDriveCapacityMb + | MB + tr + th Max text length + td= meta.maxNoteTextLength + tr + th Emojis + td + each emoji in emojis + | :#{emoji.name}: + = ' ' + |