Explorar o código

Merge pull request #9232 from weseek/fix/ogp-when-user-notfound

fix: Set an unknown label when the user is not found
mergify[bot] hai 1 ano
pai
achega
4de317da23
Modificáronse 1 ficheiros con 28 adicións e 16 borrados
  1. 28 16
      apps/app/src/server/routes/ogp.ts

+ 28 - 16
apps/app/src/server/routes/ogp.ts

@@ -1,6 +1,7 @@
 import * as fs from 'fs';
 import path from 'path';
 
+import { getIdStringForRef, type IUser } from '@growi/core';
 import { DevidedPagePath } from '@growi/core/dist/models';
 // eslint-disable-next-line no-restricted-imports
 import axios from 'axios';
@@ -9,11 +10,15 @@ import type {
 } from 'express';
 import type { ValidationError } from 'express-validator';
 import { param, validationResult } from 'express-validator';
+import type { HydratedDocument } from 'mongoose';
+import mongoose from 'mongoose';
 
 import loggerFactory from '~/utils/logger';
 import { projectRoot } from '~/utils/project-dir-utils';
 
 import { Attachment } from '../models/attachment';
+import type { PageDocument, PageModel } from '../models/page';
+import { configManager } from '../service/config-manager';
 import { convertStreamToBuffer } from '../util/stream';
 
 const logger = loggerFactory('growi:routes:ogp');
@@ -56,21 +61,27 @@ module.exports = function(crowi) {
 
   const renderOgp = async(req: Request, res: Response) => {
 
-    const { configManager } = crowi;
+    const User = mongoose.model<IUser>('User');
     const ogpUri = configManager.getConfig('crowi', 'app:ogpUri');
-    const page = req.body.page;
+    const page: PageDocument = req.body.page; // asserted by ogpValidator
 
-    let user;
-    let pageTitle: string;
-    let bufferedUserImage: Buffer;
+    const title = (new DevidedPagePath(page.path)).latter;
 
-    try {
-      const User = crowi.model('User');
-      user = await User.findById(page.creator._id.toString());
+    let user: IUser | null = null;
+    let userName = '(unknown)';
+    let userImage: Buffer = bufferedDefaultUserImageCache;
 
-      bufferedUserImage = user.imageUrlCached === DEFAULT_USER_IMAGE_URL ? bufferedDefaultUserImageCache : (await getBufferedUserImage(user.imageUrlCached));
-      // todo: consider page title
-      pageTitle = (new DevidedPagePath(page.path)).latter;
+    try {
+      if (page.creator != null) {
+        user = await User.findById(getIdStringForRef(page.creator));
+
+        if (user != null) {
+          userName = user.username;
+          userImage = user.imageUrlCached !== DEFAULT_USER_IMAGE_URL
+            ? bufferedDefaultUserImageCache
+            : await getBufferedUserImage(user.imageUrlCached);
+        }
+      }
     }
     catch (err) {
       logger.error(err);
@@ -82,9 +93,9 @@ module.exports = function(crowi) {
       result = await axios.post(
         ogpUri, {
           data: {
-            title: pageTitle,
-            userName: user.username,
-            userImage: bufferedUserImage,
+            title,
+            userName,
+            userImage,
           },
         }, {
           responseType: 'stream',
@@ -118,9 +129,10 @@ module.exports = function(crowi) {
 
     if (errors.isEmpty()) {
 
+      const Page = mongoose.model<HydratedDocument<PageDocument>, PageModel>('Page');
+
       try {
-        const Page = crowi.model('Page');
-        const page = await Page.findByIdAndViewer(req.params.pageId);
+        const page = await Page.findByIdAndViewer(req.params.pageId, null);
 
         if (page == null || page.status !== Page.STATUS_PUBLISHED || (page.grant !== Page.GRANT_PUBLIC && page.grant !== Page.GRANT_RESTRICTED)) {
           return res.status(400).send('the page does not exist');