Taichi Masuyama 4 лет назад
Родитель
Сommit
3fe50c69e4

+ 12 - 10
packages/app/src/components/Page/RevisionLoader.jsx

@@ -24,8 +24,7 @@ class LegacyRevisionLoader extends React.Component {
       markdown: '',
       markdown: '',
       isLoading: false,
       isLoading: false,
       isLoaded: false,
       isLoaded: false,
-      error: null,
-      isForbidden: null,
+      errors: null,
     };
     };
 
 
     this.loadData = this.loadData.bind(this);
     this.loadData = this.loadData.bind(this);
@@ -52,16 +51,15 @@ class LegacyRevisionLoader extends React.Component {
 
 
       this.setState({
       this.setState({
         markdown: res.data?.revision?.body,
         markdown: res.data?.revision?.body,
-        error: null,
-        isForbidden: res.data.isForbidden,
+        errors: null,
       });
       });
 
 
       if (this.props.onRevisionLoaded != null) {
       if (this.props.onRevisionLoaded != null) {
         this.props.onRevisionLoaded(res.data.revision);
         this.props.onRevisionLoaded(res.data.revision);
       }
       }
     }
     }
-    catch (error) {
-      this.setState({ error });
+    catch (errors) {
+      this.setState({ errors });
     }
     }
     finally {
     finally {
       this.setState({ isLoaded: true, isLoading: false });
       this.setState({ isLoaded: true, isLoading: false });
@@ -97,13 +95,17 @@ class LegacyRevisionLoader extends React.Component {
     }
     }
 
 
     // ----- after load -----
     // ----- after load -----
+    const isForbidden = this.state.errors != null && this.state.errors[0].code === 'forbidden-page';
     let markdown = this.state.markdown;
     let markdown = this.state.markdown;
-    if (this.state.error != null) {
-      markdown = `<i class="icon-exclamation p-1"></i><span class="text-muted"><em>${this.state.error.message}</em></span>`;
-    }
-    else if (this.state.isForbidden) {
+    if (isForbidden) {
       markdown = `<i class="icon-exclamation p-1"></i>${this.props.t('not_allowed_to_see_this_page')}`;
       markdown = `<i class="icon-exclamation p-1"></i>${this.props.t('not_allowed_to_see_this_page')}`;
     }
     }
+    else if (this.state.errors != null) {
+      const errorMessages = this.state.errors.map((error) => {
+        return `<i class="icon-exclamation p-1"></i><span class="text-muted"><em>${error.message}</em></span>`;
+      });
+      markdown = errorMessages.join('\n');
+    }
 
 
     return (
     return (
       <RevisionRenderer
       <RevisionRenderer

+ 2 - 2
packages/app/src/server/routes/apiv3/revisions.js

@@ -182,7 +182,7 @@ module.exports = (crowi) => {
 
 
     // check whether accessible
     // check whether accessible
     if (!isSharedPage && !(await Page.isAccessiblePageByViewer(pageId, req.user))) {
     if (!isSharedPage && !(await Page.isAccessiblePageByViewer(pageId, req.user))) {
-      return res.apiv3({ isForbidden: true });
+      return res.apiv3Err(new ErrorV3('Current user is not accessible to this page.', 'forbidden-page'), 403);
     }
     }
 
 
     try {
     try {
@@ -192,7 +192,7 @@ module.exports = (crowi) => {
         revision.author = serializeUserSecurely(revision.author);
         revision.author = serializeUserSecurely(revision.author);
       }
       }
 
 
-      return res.apiv3({ revision, isForbidden: false });
+      return res.apiv3({ revision });
     }
     }
     catch (err) {
     catch (err) {
       const msg = 'Error occurred in getting revision data by id';
       const msg = 'Error occurred in getting revision data by id';