diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2019-01-19 09:50:38 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2019-01-19 09:50:38 +0900 |
| commit | d2a7c56149b11948ba33c518d04060c26d3e6e94 (patch) | |
| tree | 9f8bcd1ee10e862339c3d36bf40abb599cf9491c /src/server/api | |
| parent | Update .eslintrc (diff) | |
| download | sharkey-d2a7c56149b11948ba33c518d04060c26d3e6e94.tar.gz sharkey-d2a7c56149b11948ba33c518d04060c26d3e6e94.tar.bz2 sharkey-d2a7c56149b11948ba33c518d04060c26d3e6e94.zip | |
Improve drive file operation
Resolve #3789
Resolve #3790
Diffstat (limited to 'src/server/api')
| -rw-r--r-- | src/server/api/endpoints/admin/drive/show-file.ts | 28 | ||||
| -rw-r--r-- | src/server/api/endpoints/drive/files/show.ts | 55 |
2 files changed, 76 insertions, 7 deletions
diff --git a/src/server/api/endpoints/admin/drive/show-file.ts b/src/server/api/endpoints/admin/drive/show-file.ts new file mode 100644 index 0000000000..6dfab19643 --- /dev/null +++ b/src/server/api/endpoints/admin/drive/show-file.ts @@ -0,0 +1,28 @@ +import $ from 'cafy'; +import ID, { transform } from '../../../../../misc/cafy-id'; +import define from '../../../define'; +import DriveFile from '../../../../../models/drive-file'; + +export const meta = { + requireCredential: true, + requireModerator: true, + + params: { + fileId: { + validator: $.type(ID), + transform: transform, + }, + } +}; + +export default define(meta, (ps, me) => new Promise(async (res, rej) => { + const file = await DriveFile.findOne({ + _id: ps.fileId + }); + + if (file == null) { + return rej('file not found'); + } + + res(file); +})); diff --git a/src/server/api/endpoints/drive/files/show.ts b/src/server/api/endpoints/drive/files/show.ts index 95c3323fbb..57a22d1178 100644 --- a/src/server/api/endpoints/drive/files/show.ts +++ b/src/server/api/endpoints/drive/files/show.ts @@ -1,6 +1,9 @@ -import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; -import DriveFile, { pack } from '../../../../../models/drive-file'; +import $ from 'cafy'; +import * as mongo from 'mongodb'; +import ID, { transform } from '../../../../../misc/cafy-id'; +import DriveFile, { pack, IDriveFile } from '../../../../../models/drive-file'; import define from '../../../define'; +import config from '../../../../../config'; export const meta = { stability: 'stable', @@ -16,24 +19,62 @@ export const meta = { params: { fileId: { - validator: $.type(ID), + validator: $.type(ID).optional, transform: transform, desc: { 'ja-JP': '対象のファイルID', 'en-US': 'Target file ID' } + }, + + url: { + validator: $.str.optional, + desc: { + 'ja-JP': '対象のファイルのURL', + 'en-US': 'Target file URL' + } } } }; export default define(meta, (ps, user) => new Promise(async (res, rej) => { - // Fetch file - const file = await DriveFile - .findOne({ + let file: IDriveFile; + + if (ps.fileId) { + file = await DriveFile.findOne({ _id: ps.fileId, - 'metadata.userId': user._id, 'metadata.deletedAt': { $exists: false } }); + } else if (ps.url) { + const isInternalStorageUrl = ps.url.startsWith(config.drive_url); + if (isInternalStorageUrl) { + // Extract file if from url + // e.g. + // http://misskey.local/files/foo?original=bar --> foo + const fileId = new mongo.ObjectID(ps.url.replace(config.drive_url, '').replace(/\?(.*)$/, '').replace(/\//g, '')); + file = await DriveFile.findOne({ + _id: fileId, + 'metadata.deletedAt': { $exists: false } + }); + } else { + file = await DriveFile.findOne({ + $or: [{ + 'metadata.url': ps.url + }, { + 'metadata.webpublicUrl': ps.url + }, { + 'metadata.thumbnailUrl': ps.url + }], + 'metadata.deletedAt': { $exists: false } + }); + } + } else { + return rej('fileId or url required'); + } + + if (!user.isAdmin && !user.isModerator && !file.metadata.userId.equals(user._id)) { + return rej('access denied'); + } if (file === null) { return rej('file-not-found'); |