diff options
Diffstat (limited to 'src/server/api/endpoints/drive')
| -rw-r--r-- | src/server/api/endpoints/drive/files/show.ts | 55 |
1 files changed, 48 insertions, 7 deletions
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'); |