summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/api/endpoints/admin/show-users.ts123
-rw-r--r--src/server/api/endpoints/admin/suspend-user.ts4
-rw-r--r--src/server/api/endpoints/users/notes.ts14
-rw-r--r--src/server/web/index.ts24
-rw-r--r--src/server/web/views/info.pug113
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}:
+ = ' '
+