arvid-e 2 месяцев назад
Родитель
Сommit
8251ab32e7

+ 30 - 0
apps/app/src/pages/[[...path]]/page-data-props.ts

@@ -162,6 +162,36 @@ export async function getPageDataForInitial(
     { pageId, path: resolvedPagePath, user },
     { pageId, path: resolvedPagePath, user },
   );
   );
 
 
+  const isHidingUserPages = configManager.getConfig(
+    'security:isHidingUserPages',
+  );
+
+  if (isHidingUserPages && pageWithMeta.data != null) {
+    const pagePath = pageWithMeta.data.path;
+
+    if (pagePath.startsWith('/user')) {
+      const isOwnPage = user != null && pagePath === `/user/${user.username}`;
+
+      if (!isOwnPage) {
+        return {
+          props: {
+            currentPathname: resolvedPagePath,
+            isIdenticalPathPage: false,
+            pageWithMeta: {
+              data: null,
+              meta: {
+                isNotFound: true,
+                isForbidden: true,
+              },
+            } satisfies IDataWithRequiredMeta<null, IPageNotFoundInfo>,
+            skipSSR: false,
+            redirectFrom,
+          },
+        };
+      }
+    }
+  }
+
   // Handle URL conversion
   // Handle URL conversion
   const currentPathname = resolveFinalizedPathname(
   const currentPathname = resolveFinalizedPathname(
     resolvedPagePath,
     resolvedPagePath,

+ 18 - 0
apps/app/src/server/routes/apiv3/page/index.ts

@@ -193,6 +193,10 @@ module.exports = (crowi: Crowi) => {
       const { pageId, path, findAll, revisionId, shareLinkId, includeEmpty } =
       const { pageId, path, findAll, revisionId, shareLinkId, includeEmpty } =
         req.query;
         req.query;
 
 
+      const isHidingUserPages = crowi.configManager.getConfig(
+        'security:isHidingUserPages',
+      );
+
       const respondWithSinglePage = async (
       const respondWithSinglePage = async (
         pageWithMeta:
         pageWithMeta:
           | IDataWithMeta<HydratedDocument<PageDocument>, IPageInfoExt>
           | IDataWithMeta<HydratedDocument<PageDocument>, IPageInfoExt>
@@ -219,6 +223,20 @@ module.exports = (crowi: Crowi) => {
           );
           );
         }
         }
 
 
+        if (isHidingUserPages && page != null) {
+          const pagePath = page.path;
+          if (pagePath.startsWith('/user')) {
+            const isOwnPage =
+              user != null && pagePath === `/user/${user.username}`;
+            if (!isOwnPage) {
+              return res.apiv3Err(
+                new ErrorV3('Page is forbidden', 'page-is-forbidden'),
+                403,
+              );
+            }
+          }
+        }
+
         if (page != null) {
         if (page != null) {
           try {
           try {
             page.initLatestRevisionField(revisionId);
             page.initLatestRevisionField(revisionId);

+ 0 - 1
apps/app/src/server/service/page-listing/page-listing.ts

@@ -60,7 +60,6 @@ class PageListingService implements IPageListingService {
     user?: IUser,
     user?: IUser,
     showPagesRestrictedByOwner = false,
     showPagesRestrictedByOwner = false,
     showPagesRestrictedByGroup = false,
     showPagesRestrictedByGroup = false,
-    hideUserPages = false,
   ): Promise<IPageForTreeItem[]> {
   ): Promise<IPageForTreeItem[]> {
     const Page = mongoose.model<HydratedDocument<PageDocument>, PageModel>(
     const Page = mongoose.model<HydratedDocument<PageDocument>, PageModel>(
       'Page',
       'Page',