GC-1894

完全削除ボタンが押された時に呼ばれるのは

203行目

app.post('/_api/pages.remove' , loginRequired(crowi, app) , csrf, page.api.remove); // (Avoid from API Token)

ここで権限の確認を行う。

page.jsの920~975行目

api.remove = async function(req, res) { const pageId = req.body.page_id; const previousRevision = req.body.revision_id || null; const socketClientId = req.body.socketClientId || undefined; // get completely flag const isCompletely = (req.body.completely != null); // get recursively flag const isRecursively = (req.body.recursively != null); const options = { socketClientId }; let page = await Page.findByIdAndViewer(pageId, req.user); if (page == null) { return res.json(ApiResponse.error(`Page '${pageId}' is not found or forbidden`, 'notfound_or_forbidden')); } debug('Delete page', page._id, page.path); try { if (isCompletely) { if (isRecursively) { page = await Page.completelyDeletePageRecursively(page, req.user, options); } else { page = await Page.completelyDeletePage(page, req.user, options); } } else { if (!page.isUpdatable(previousRevision)) { return res.json(ApiResponse.error('Someone could update this page, so couldn\'t delete.', 'outdated')); } if (isRecursively) { page = await Page.deletePageRecursively(page, req.user, options); } else { page = await Page.deletePage(page, req.user, options); } } } catch (err) { logger.error('Error occured while get setting', err); return res.json(ApiResponse.error('Failed to delete page.', 'unknown')); } debug('Page deleted', page.path); const result = {}; result.page = page; // TODO consider to use serializeToObj method -- 2018.08.06 Yuki Takei res.json(ApiResponse.success(result)); // global notification return globalNotificationService.notifyPageDelete(page); };

呼ばれているものを確認する

ここでブロックする!

ブロックできている

今はpage != nullで実装したため、userがadminかどうかをチェックする。

エラーに飛んでしまう。

this.user.adminでは呼び出せていない。

実は req に情報が多数渡されていた!

apiで渡そうとしているのはbody.caram.queryなど一部しかない

そのため今回権限を確認するのはrew.user.adminでよい!