From 3220d69a6930151f33928b5d789150aacc4bc382 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 14 Sep 2018 20:11:01 +0900 Subject: 常にメディアを閲覧注意として投稿するオプションを実装 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints/drive/files/create.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/api/endpoints/drive') diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts index dfbd11d0c2..4b5ffa90e0 100644 --- a/src/server/api/endpoints/drive/files/create.ts +++ b/src/server/api/endpoints/drive/files/create.ts @@ -31,8 +31,8 @@ export const meta = { } }), - isSensitive: $.bool.optional.note({ - default: false, + isSensitive: $.bool.optional.nullable.note({ + default: null, desc: { 'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか', 'en-US': 'Whether this media is NSFW' -- cgit v1.2.3-freya From afdacf14b7d114e542dbed60c029948b2ea5910d Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 25 Sep 2018 21:09:38 +0900 Subject: Add excludeNsfw option --- src/client/app/desktop/views/pages/welcome.vue | 1 + src/client/app/mobile/views/pages/welcome.vue | 1 + src/models/note.ts | 1 + src/server/api/endpoints/drive/files/update.ts | 13 +++++++++++++ src/server/api/endpoints/notes/local-timeline.ts | 13 +++++++++++++ 5 files changed, 29 insertions(+) (limited to 'src/server/api/endpoints/drive') diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index baa27dd8df..7f5f4b9c37 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -187,6 +187,7 @@ export default Vue.extend({ (this as any).api('notes/local-timeline', { fileType: image, + excludeNsfw: true, limit: 6 }).then((notes: any[]) => { const files = concat(notes.map((n: any): any[] => n.files)); diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 65a7af93a9..82ccfeaff5 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -111,6 +111,7 @@ export default Vue.extend({ (this as any).api('notes/local-timeline', { fileType: image, + excludeNsfw: true, limit: 6 }).then((notes: any[]) => { const files = concat(notes.map((n: any): any[] => n.files)); diff --git a/src/models/note.ts b/src/models/note.ts index ba88e9f481..f67eeaaf6e 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -20,6 +20,7 @@ Note.createIndex('userId'); Note.createIndex('mentions'); Note.createIndex('visibleUserIds'); Note.createIndex('tagsLower'); +Note.createIndex('_files._id'); Note.createIndex('_files.contentType'); Note.createIndex({ createdAt: -1 diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts index ba9abfec61..3c7932c341 100644 --- a/src/server/api/endpoints/drive/files/update.ts +++ b/src/server/api/endpoints/drive/files/update.ts @@ -4,6 +4,7 @@ import DriveFile, { validateFileName, pack } from '../../../../../models/drive-f import { publishDriveStream } from '../../../../../stream'; import { ILocalUser } from '../../../../../models/user'; import getParams from '../../../get-params'; +import Note from '../../../../../models/note'; export const meta = { desc: { @@ -93,6 +94,18 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = } }); + // ドライブのファイルが非正規化されているドキュメントも更新 + Note.find({ + '_files._id': file._id + }).then(notes => { + notes.forEach(note => { + note._files[note._files.findIndex(f => f._id.equals(file._id))] = file; + Note.findOneAndUpdate({ _id: note._id }, { + _files: note._files + }); + }); + }); + // Serialize const fileObj = await pack(file); diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index ff10e6fbaa..505454a82f 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -30,6 +30,13 @@ export const meta = { } }), + excludeNsfw: $.bool.optional.note({ + default: false, + desc: { + 'ja-JP': 'true にすると、NSFW指定されたファイルを除外します(fileTypeが指定されている場合のみ有効)' + } + }), + limit: $.num.optional.range(1, 100).note({ default: 10 }), @@ -97,6 +104,12 @@ export default async (params: any, user: ILocalUser) => { query['_files.contentType'] = { $in: ps.fileType }; + + if (ps.excludeNsfw) { + query['_files.metadata.isSensitive'] = { + $ne: true + }; + } } if (ps.sinceId) { -- cgit v1.2.3-freya From baf9b658018e6b7d4bc2645eef871e9a57ef23db Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 5 Oct 2018 01:43:47 +0900 Subject: Improve error handling of packaging functions --- package.json | 2 +- src/models/drive-file.ts | 15 ++++++++++++++- src/models/note.ts | 12 ++++++++---- src/models/user.ts | 2 +- src/server/api/endpoints/drive/files.ts | 5 ++--- src/server/api/endpoints/drive/stream.ts | 4 ++-- 6 files changed, 28 insertions(+), 12 deletions(-) (limited to 'src/server/api/endpoints/drive') diff --git a/package.json b/package.json index 8e0a8e6250..e04d9d8b4e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo ", - "version": "9.5.0", + "version": "9.6.0", "clientVersion": "1.0.10090", "codename": "nighthike", "main": "./built/index.js", diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index 215b49b305..c11121126f 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -127,6 +127,15 @@ export async function deleteDriveFile(driveFile: string | mongo.ObjectID | IDriv }); } +export const packMany = async ( + files: any[], + options?: { + detail: boolean + } +) => { + return (await Promise.all(files.map(f => pack(f, options)))).filter(x => x != null); +}; + /** * Pack a drive file for API response */ @@ -155,7 +164,11 @@ export const pack = ( _file = deepcopy(file); } - if (!_file) return reject('invalid file arg.'); + // (データベースの欠損などで)ファイルがデータベース上に見つからなかったとき + if (_file == null) { + console.warn(`in packaging driveFile: driveFile not found on database: ${_file}`); + return null; + } // rendered target let _target: any = {}; diff --git a/src/models/note.ts b/src/models/note.ts index 75518d709f..43b8753195 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -7,7 +7,7 @@ import { IUser, pack as packUser } from './user'; import { pack as packApp } from './app'; import PollVote, { deletePollVote } from './poll-vote'; import Reaction, { deleteNoteReaction } from './note-reaction'; -import { pack as packFile, IDriveFile } from './drive-file'; +import { packMany as packFileMany, IDriveFile } from './drive-file'; import NoteWatching, { deleteNoteWatching } from './note-watching'; import NoteReaction from './note-reaction'; import Favorite, { deleteFavorite } from './favorite'; @@ -309,9 +309,7 @@ export const pack = async ( } // Populate files - _note.files = Promise.all((_note.fileIds || []).map((fileId: mongo.ObjectID) => - packFile(fileId) - )); + _note.files = packFileMany(_note.fileIds || []); // 後方互換性のため _note.mediaIds = _note.fileIds; @@ -380,6 +378,12 @@ export const pack = async ( // resolve promises in _note object _note = await rap(_note); + // (データベースの欠損などで)ユーザーがデータベース上に見つからなかったとき + if (_note.user == null) { + console.warn(`in packaging note: note user not found on database: note(${_note.id})`); + return null; + } + if (_note.user.isCat && _note.text) { _note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ'); } diff --git a/src/models/user.ts b/src/models/user.ts index 3e8aefc4b1..642a993f65 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -361,7 +361,7 @@ export const pack = ( _user = deepcopy(user); } - // ユーザーがデータベース上に見つからなかったとき + // (データベースの欠損などで)ユーザーがデータベース上に見つからなかったとき if (_user == null) { console.warn(`user not found on database: ${user}`); return null; diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts index dc6a602e10..de0bde086b 100644 --- a/src/server/api/endpoints/drive/files.ts +++ b/src/server/api/endpoints/drive/files.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import DriveFile, { pack } from '../../../../models/drive-file'; +import DriveFile, { packMany } from '../../../../models/drive-file'; import { ILocalUser } from '../../../../models/user'; export const meta = { @@ -73,6 +73,5 @@ export default async (params: any, user: ILocalUser) => { }); // Serialize - const _files = await Promise.all(files.map(file => pack(file))); - return _files; + return await packMany(files); }; diff --git a/src/server/api/endpoints/drive/stream.ts b/src/server/api/endpoints/drive/stream.ts index a9f3f7e9a5..3ac7dd0234 100644 --- a/src/server/api/endpoints/drive/stream.ts +++ b/src/server/api/endpoints/drive/stream.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import DriveFile, { pack } from '../../../../models/drive-file'; +import DriveFile, { packMany } from '../../../../models/drive-file'; import { ILocalUser } from '../../../../models/user'; export const meta = { @@ -63,5 +63,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = }); // Serialize - res(await Promise.all(files.map(file => pack(file)))); + res(await packMany(files)); }); -- cgit v1.2.3-freya From 3e897727ca7c8b0b5ba11c9d1866dc87ea136c22 Mon Sep 17 00:00:00 2001 From: sei0o inoue Date: Sun, 7 Oct 2018 16:51:46 +0900 Subject: Fix #2773 (#2841) * Added an API endpoint to check the existence of the file * fix #2773: Now we can prevent users from posting the same images * bug fix --- src/client/app/common/scripts/get-md5.ts | 8 ++ .../app/common/views/components/uploader.vue | 108 +++++++++++++-------- .../api/endpoints/drive/files/check_existence.ts | 38 ++++++++ 3 files changed, 113 insertions(+), 41 deletions(-) create mode 100644 src/client/app/common/scripts/get-md5.ts create mode 100644 src/server/api/endpoints/drive/files/check_existence.ts (limited to 'src/server/api/endpoints/drive') diff --git a/src/client/app/common/scripts/get-md5.ts b/src/client/app/common/scripts/get-md5.ts new file mode 100644 index 0000000000..24ac04c1ad --- /dev/null +++ b/src/client/app/common/scripts/get-md5.ts @@ -0,0 +1,8 @@ +const crypto = require('crypto'); + +export default (data: ArrayBuffer) => { + const buf = new Buffer(data); + const hash = crypto.createHash("md5"); + hash.update(buf); + return hash.digest("hex"); +}; \ No newline at end of file diff --git a/src/client/app/common/views/components/uploader.vue b/src/client/app/common/views/components/uploader.vue index 19b0d15708..fed6477c05 100644 --- a/src/client/app/common/views/components/uploader.vue +++ b/src/client/app/common/views/components/uploader.vue @@ -20,6 +20,7 @@