ryoji-s 2 лет назад
Родитель
Сommit
8c2eece7e8
1 измененных файлов с 34 добавлено и 16 удалено
  1. 34 16
      apps/app/src/server/service/page.ts

+ 34 - 16
apps/app/src/server/service/page.ts

@@ -47,7 +47,7 @@ const debug = require('debug')('growi:services:page');
 const logger = loggerFactory('growi:services:page');
 const logger = loggerFactory('growi:services:page');
 const {
 const {
   isTrashPage, isTopPage, omitDuplicateAreaPageFromPages,
   isTrashPage, isTopPage, omitDuplicateAreaPageFromPages,
-  canMoveByPath, isUsersProtectedPages, hasSlash, generateChildrenRegExp,
+  canMoveByPath, isUsersTopPage, isUsersHomepage, isUsersProtectedPages, hasSlash, generateChildrenRegExp,
 } = pagePathUtils;
 } = pagePathUtils;
 
 
 const { addTrailingSlash } = pathUtils;
 const { addTrailingSlash } = pathUtils;
@@ -166,16 +166,23 @@ class PageService {
   }
   }
 
 
   async canDeleteCompletely(path: string, creatorId: ObjectIdLike, operator: any | null, isRecursively: boolean): Promise<boolean> {
   async canDeleteCompletely(path: string, creatorId: ObjectIdLike, operator: any | null, isRecursively: boolean): Promise<boolean> {
-    if (operator == null || isTopPage(path)) return false;
+    if (operator == null || isTopPage(path) || isUsersTopPage(path)) {
+      return false;
+    }
 
 
-    if (isUsersProtectedPages(path)) {
+    if (isUsersHomepage(path)) {
       const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
       const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
       if (!isUsersHomepageDeletionEnabled) {
       if (!isUsersHomepageDeletionEnabled) {
         return false;
         return false;
       }
       }
 
 
       const User = mongoose.model('User');
       const User = mongoose.model('User');
-      const creator = await User.findById(creatorId);
+      const creator = await User.findById<IUserHasId | null>(creatorId);
+
+      if (creator == null) {
+        throw new Error('user homepage creator document is not found.');
+      }
+
       if (creator.status !== USER_STATUS.DELETED) {
       if (creator.status !== USER_STATUS.DELETED) {
         return false;
         return false;
       }
       }
@@ -190,16 +197,23 @@ class PageService {
   }
   }
 
 
   async canDelete(path: string, creatorId: ObjectIdLike, operator: any | null, isRecursively: boolean): Promise<boolean> {
   async canDelete(path: string, creatorId: ObjectIdLike, operator: any | null, isRecursively: boolean): Promise<boolean> {
-    if (operator == null || isTopPage(path)) return false;
+    if (operator == null || isTopPage(path) || isUsersTopPage(path)) {
+      return false;
+    }
 
 
-    if (isUsersProtectedPages(path)) {
+    if (isUsersHomepage(path)) {
       const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
       const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
       if (!isUsersHomepageDeletionEnabled) {
       if (!isUsersHomepageDeletionEnabled) {
         return false;
         return false;
       }
       }
 
 
       const User = mongoose.model('User');
       const User = mongoose.model('User');
-      const creator = await User.findById(creatorId);
+      const creator = await User.findById<IUserHasId | null>(creatorId);
+
+      if (creator == null) {
+        throw new Error('user homepage creator document is not found.');
+      }
+
       if (creator.status !== USER_STATUS.DELETED) {
       if (creator.status !== USER_STATUS.DELETED) {
         return false;
         return false;
       }
       }
@@ -1422,20 +1436,20 @@ class PageService {
       throw new Error('This method does NOT support deleting trashed pages.');
       throw new Error('This method does NOT support deleting trashed pages.');
     }
     }
 
 
-    if (isTopPage(page.path)) {
+    if (isTopPage(page.path) || isUsersTopPage(page.path)) {
       throw new Error('Page is not deletable.');
       throw new Error('Page is not deletable.');
     }
     }
 
 
-    if (isUsersProtectedPages(page.path)) {
-      if (page.creator == null) {
-        throw new Error('Page is not deletable.');
-      }
-
+    if (isUsersHomepage(page.path)) {
       const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
       const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
       if (!isUsersHomepageDeletionEnabled) {
       if (!isUsersHomepageDeletionEnabled) {
         throw new Error('Page is not deletable.');
         throw new Error('Page is not deletable.');
       }
       }
 
 
+      if (page.creator == null) {
+        throw new Error('user homepage creator is null.');
+      }
+
       const populatedPage = await page.populate('creator');
       const populatedPage = await page.populate('creator');
       if (populatedPage.creator.status !== USER_STATUS.DELETED) {
       if (populatedPage.creator.status !== USER_STATUS.DELETED) {
         throw new Error('Page is not deletable.');
         throw new Error('Page is not deletable.');
@@ -2443,14 +2457,18 @@ class PageService {
 
 
   async constructBasicPageInfo(page: PageDocument, isGuestUser?: boolean): Promise<IPageInfo | IPageInfoForEntity> {
   async constructBasicPageInfo(page: PageDocument, isGuestUser?: boolean): Promise<IPageInfo | IPageInfoForEntity> {
     let isDeletable = true;
     let isDeletable = true;
-    if (isGuestUser || isTopPage(page.path)) {
+    if (isGuestUser || isTopPage(page.path) || isUsersTopPage(page.path)) {
       isDeletable = false;
       isDeletable = false;
     }
     }
 
 
-    if (isUsersProtectedPages(page.path)) {
+    if (isUsersHomepage(page.path)) {
       const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
       const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
 
 
-      if (page.creator == null || !isUsersHomepageDeletionEnabled) {
+      if (page.creator == null) {
+        throw new Error('user homepage creator is null.');
+      }
+
+      if (!isUsersHomepageDeletionEnabled) {
         isDeletable = false;
         isDeletable = false;
       }
       }
       else {
       else {