Browse Source

Merge commit 'a9804fc09e03e8be4fa8b9ea736c74f1701aa612' into feat/use-MongoDB-GridFS-for-file-storage

yusueketk 7 years ago
parent
commit
d73c542bd1

+ 2 - 1
resource/locales/en-US/translation.json

@@ -442,11 +442,12 @@
     "Page break setting": "Page break Setting",
     "Page break setting": "Page break Setting",
     "Preset one separator": "Preset 1",
     "Preset one separator": "Preset 1",
     "Preset one separator desc": "3 Blank lines",
     "Preset one separator desc": "3 Blank lines",
+    "Preset one separator value": "\\n\\n\\n",
     "Preset two separator": "Preset 2",
     "Preset two separator": "Preset 2",
     "Preset two separator desc": "5 Hyphens",
     "Preset two separator desc": "5 Hyphens",
     "Preset two separator value": "-----",
     "Preset two separator value": "-----",
     "Custom separator": "Custom",
     "Custom separator": "Custom",
-    "Custom separator desc": "Any character",
+    "Custom separator desc": "Regular Expression",
     "XSS_setting": "Prevent XSS(Cross Site Scripting) Setting",
     "XSS_setting": "Prevent XSS(Cross Site Scripting) Setting",
     "XSS_setting_desc": "You can change the handling of HTML tags in markdown text.",
     "XSS_setting_desc": "You can change the handling of HTML tags in markdown text.",
     "Enable XSS prevention": "Enable XSS Prevention",
     "Enable XSS prevention": "Enable XSS Prevention",

+ 2 - 1
resource/locales/ja/translation.json

@@ -459,11 +459,12 @@
     "Page break setting": "改頁を設定する",
     "Page break setting": "改頁を設定する",
     "Preset one separator": "プリセット 1",
     "Preset one separator": "プリセット 1",
     "Preset one separator desc": "連続した空行3行で改頁します",
     "Preset one separator desc": "連続した空行3行で改頁します",
+    "Preset one separator value": "\\n\\n\\n",
     "Preset two separator": "プリセット 2",
     "Preset two separator": "プリセット 2",
     "Preset two separator desc": "連続したハイフン5つで改頁します",
     "Preset two separator desc": "連続したハイフン5つで改頁します",
     "Preset two separator value": "-----",
     "Preset two separator value": "-----",
     "Custom separator": "カスタム",
     "Custom separator": "カスタム",
-    "Custom separator desc": "任意の文字で改頁します",
+    "Custom separator desc": "正規表現を設定できます",
     "XSS_setting": "XSS(Cross Site Scripting)対策設定",
     "XSS_setting": "XSS(Cross Site Scripting)対策設定",
     "XSS_setting_desc": "マークダウンテキスト内の HTML タグの扱いを設定し、悪意のあるプログラムからの攻撃を防ぎます",
     "XSS_setting_desc": "マークダウンテキスト内の HTML タグの扱いを設定し、悪意のあるプログラムからの攻撃を防ぎます",
     "Enable XSS prevention": "XSSを抑制する",
     "Enable XSS prevention": "XSSを抑制する",

+ 58 - 21
src/server/routes/login-passport.js

@@ -80,11 +80,18 @@ module.exports = function(crowi, app) {
 
 
     const providerId = 'ldap';
     const providerId = 'ldap';
     const strategyName = 'ldapauth';
     const strategyName = 'ldapauth';
-    const ldapAccountInfo = await promisifiedPassportAuthentication(req, res, next, strategyName);
+    let ldapAccountInfo;
+
+    try {
+      ldapAccountInfo = await promisifiedPassportAuthentication(strategyName, req, res);
+    }
+    catch (err) {
+      return next(err);
+    }
 
 
     // check groups for LDAP
     // check groups for LDAP
     if (!isValidLdapUserByGroupFilter(ldapAccountInfo)) {
     if (!isValidLdapUserByGroupFilter(ldapAccountInfo)) {
-      return loginFailure(req, res, next);
+      return next();
     }
     }
 
 
     /*
     /*
@@ -106,9 +113,9 @@ module.exports = function(crowi, app) {
       'email': mailToBeRegistered,
       'email': mailToBeRegistered,
     };
     };
 
 
-    const externalAccount = await getOrCreateUser(req, res, next, userInfo, providerId);
+    const externalAccount = await getOrCreateUser(req, res, userInfo, providerId);
     if (!externalAccount) {
     if (!externalAccount) {
-      return loginFailure(req, res, next);
+      return next();
     }
     }
 
 
     const user = await externalAccount.getPopulatedUser();
     const user = await externalAccount.getPopulatedUser();
@@ -223,13 +230,21 @@ module.exports = function(crowi, app) {
   const loginPassportGoogleCallback = async(req, res, next) => {
   const loginPassportGoogleCallback = async(req, res, next) => {
     const providerId = 'google';
     const providerId = 'google';
     const strategyName = 'google';
     const strategyName = 'google';
-    const response = await promisifiedPassportAuthentication(req, res, next, strategyName);
+
+    let response;
+    try {
+      response = await promisifiedPassportAuthentication(strategyName, req, res);
+    }
+    catch (err) {
+      return loginFailure(req, res, next);
+    }
+
     const userInfo = {
     const userInfo = {
       'id': response.id,
       'id': response.id,
       'username': response.displayName,
       'username': response.displayName,
       'name': `${response.name.givenName} ${response.name.familyName}`
       'name': `${response.name.givenName} ${response.name.familyName}`
     };
     };
-    const externalAccount = await getOrCreateUser(req, res, next, userInfo, providerId);
+    const externalAccount = await getOrCreateUser(req, res, userInfo, providerId);
     if (!externalAccount) {
     if (!externalAccount) {
       return loginFailure(req, res, next);
       return loginFailure(req, res, next);
     }
     }
@@ -256,14 +271,22 @@ module.exports = function(crowi, app) {
   const loginPassportGitHubCallback = async(req, res, next) => {
   const loginPassportGitHubCallback = async(req, res, next) => {
     const providerId = 'github';
     const providerId = 'github';
     const strategyName = 'github';
     const strategyName = 'github';
-    const response = await promisifiedPassportAuthentication(req, res, next, strategyName);
+
+    let response;
+    try {
+      response = await promisifiedPassportAuthentication(strategyName, req, res);
+    }
+    catch (err) {
+      return loginFailure(req, res, next);
+    }
+
     const userInfo = {
     const userInfo = {
       'id': response.id,
       'id': response.id,
       'username': response.username,
       'username': response.username,
       'name': response.displayName
       'name': response.displayName
     };
     };
 
 
-    const externalAccount = await getOrCreateUser(req, res, next, userInfo, providerId);
+    const externalAccount = await getOrCreateUser(req, res, userInfo, providerId);
     if (!externalAccount) {
     if (!externalAccount) {
       return loginFailure(req, res, next);
       return loginFailure(req, res, next);
     }
     }
@@ -290,14 +313,22 @@ module.exports = function(crowi, app) {
   const loginPassportTwitterCallback = async(req, res, next) => {
   const loginPassportTwitterCallback = async(req, res, next) => {
     const providerId = 'twitter';
     const providerId = 'twitter';
     const strategyName = 'twitter';
     const strategyName = 'twitter';
-    const response = await promisifiedPassportAuthentication(req, res, next, strategyName);
+
+    let response;
+    try {
+      response = await promisifiedPassportAuthentication(strategyName, req, res);
+    }
+    catch (err) {
+      return loginFailure(req, res, next);
+    }
+
     const userInfo = {
     const userInfo = {
       'id': response.id,
       'id': response.id,
       'username': response.username,
       'username': response.username,
       'name': response.displayName
       'name': response.displayName
     };
     };
 
 
-    const externalAccount = await getOrCreateUser(req, res, next, userInfo, providerId);
+    const externalAccount = await getOrCreateUser(req, res, userInfo, providerId);
     if (!externalAccount) {
     if (!externalAccount) {
       return loginFailure(req, res, next);
       return loginFailure(req, res, next);
     }
     }
@@ -330,7 +361,14 @@ module.exports = function(crowi, app) {
     const attrMapFirstName = config.crowi['security:passport-saml:attrMapFirstName'] || 'firstName';
     const attrMapFirstName = config.crowi['security:passport-saml:attrMapFirstName'] || 'firstName';
     const attrMapLastName = config.crowi['security:passport-saml:attrMapLastName'] || 'lastName';
     const attrMapLastName = config.crowi['security:passport-saml:attrMapLastName'] || 'lastName';
 
 
-    const response = await promisifiedPassportAuthentication(req, res, loginFailure, strategyName);
+    let response;
+    try {
+      response = await promisifiedPassportAuthentication(strategyName, req, res);
+    }
+    catch (err) {
+      return loginFailure(req, res);
+    }
+
     const userInfo = {
     const userInfo = {
       'id': response[attrMapId],
       'id': response[attrMapId],
       'username': response[attrMapUsername],
       'username': response[attrMapUsername],
@@ -344,7 +382,7 @@ module.exports = function(crowi, app) {
       userInfo['name'] = `${response[attrMapFirstName]} ${response[attrMapLastName]}`.trim();
       userInfo['name'] = `${response[attrMapFirstName]} ${response[attrMapLastName]}`.trim();
     }
     }
 
 
-    const externalAccount = await getOrCreateUser(req, res, loginFailure, userInfo, providerId);
+    const externalAccount = await getOrCreateUser(req, res, userInfo, providerId);
     if (!externalAccount) {
     if (!externalAccount) {
       return loginFailure(req, res);
       return loginFailure(req, res);
     }
     }
@@ -361,7 +399,7 @@ module.exports = function(crowi, app) {
     });
     });
   };
   };
 
 
-  const promisifiedPassportAuthentication = (req, res, next, strategyName) => {
+  const promisifiedPassportAuthentication = (strategyName, req, res) => {
     return new Promise((resolve, reject) => {
     return new Promise((resolve, reject) => {
       passport.authenticate(strategyName, (err, response, info) => {
       passport.authenticate(strategyName, (err, response, info) => {
         if (res.headersSent) {  // dirty hack -- 2017.09.25
         if (res.headersSent) {  // dirty hack -- 2017.09.25
@@ -372,24 +410,23 @@ module.exports = function(crowi, app) {
 
 
         if (err) {
         if (err) {
           logger.error(`'${strategyName}' passport authentication error: `, err);
           logger.error(`'${strategyName}' passport authentication error: `, err);
-          req.flash('warningMessage', `Error occured in '${strategyName}' passport authentication`);  // pass and the flash message is displayed when all of authentications are failed.
-          return next(req, res);
+          reject(err);
         }
         }
 
 
+        logger.debug('response', response);
+        logger.debug('info', info);
+
         // authentication failure
         // authentication failure
         if (!response) {
         if (!response) {
-          return next(req, res);
+          reject(response);
         }
         }
 
 
-        logger.debug('response', response);
-        logger.debug('info', info);
-
         resolve(response);
         resolve(response);
-      })(req, res, next);
+      })(req, res);
     });
     });
   };
   };
 
 
-  const getOrCreateUser = async(req, res, next, userInfo, providerId) => {
+  const getOrCreateUser = async(req, res, userInfo, providerId) => {
     try {
     try {
       // find or register(create) user
       // find or register(create) user
       const externalAccount = await ExternalAccount.findOrRegister(
       const externalAccount = await ExternalAccount.findOrRegister(

+ 2 - 2
src/server/views/admin/external-accounts.html

@@ -100,11 +100,11 @@
                 </button>
                 </button>
                 <ul class="dropdown-menu" role="menu">
                 <ul class="dropdown-menu" role="menu">
                   <li class="dropdown-header">{{ t('user_management.Edit menu') }}</li>
                   <li class="dropdown-header">{{ t('user_management.Edit menu') }}</li>
-                  <form id="form_remove_{{ account.accountId }}" action="/admin/users/external-accounts/{{ account.accountId }}/remove" method="post">
+                  <form id="form_remove_{{ loop.index }}" action="/admin/users/external-accounts/{{ account.accountId }}/remove" method="post">
                     <input type="hidden" name="_csrf" value="{{ csrf() }}">
                     <input type="hidden" name="_csrf" value="{{ csrf() }}">
                   </form>
                   </form>
                   <li>
                   <li>
-                    <a href="javascript:form_remove_{{ account.accountId }}.submit()">
+                    <a href="javascript:form_remove_{{ loop.index }}.submit()">
                       <i class="icon-fw icon-fire text-danger"></i>
                       <i class="icon-fw icon-fire text-danger"></i>
                       削除する
                       削除する
                     </a>
                     </a>

+ 24 - 21
src/server/views/admin/markdown.html

@@ -94,42 +94,45 @@
         <p class="well">{{ t("markdown_setting.presentation_setting_desc") }}</p>
         <p class="well">{{ t("markdown_setting.presentation_setting_desc") }}</p>
 
 
         <fieldset class="form-group row my-2">
         <fieldset class="form-group row my-2">
-            {% set nameForPageBreakOption = "markdownSetting[markdown:presentation:pageBreakSeparator]" %}
-            {% set pageBreakSeparator = markdownSetting['markdown:presentation:pageBreakSeparator'] %}
+          {% set nameForPageBreakOption = "markdownSetting[markdown:presentation:pageBreakSeparator]" %}
+          {% set pageBreakSeparator = markdownSetting['markdown:presentation:pageBreakSeparator'] %}
 
 
           <label class="col-xs-3 control-label">
           <label class="col-xs-3 control-label">
             {{ t('markdown_setting.Page break setting') }}
             {{ t('markdown_setting.Page break setting') }}
           </label>
           </label>
 
 
           <div class="col-xs-3 radio radio-primary">
           <div class="col-xs-3 radio radio-primary">
-              <input type="radio" id="option1" name="{{nameForPageBreakOption}}" value="1" {% if pageBreakSeparator === 1 %}checked{% endif %}>
-              <label for="option1">
-                <p class="font-weight-bold">{{ t('markdown_setting.Preset one separator') }}</p>
-                <div class="m-t-15">
-                    {{ t('markdown_setting.Preset one separator desc') }}
-                </div>
-              </label>
+            <input type="radio" id="option1" name="{{nameForPageBreakOption}}" value="1" {% if pageBreakSeparator === 1 %}checked{% endif %}>
+            <label for="option1">
+              <p class="font-weight-bold">{{ t('markdown_setting.Preset one separator') }}</p>
+              <p class="mt-3">
+                {{ t('markdown_setting.Preset one separator desc') }}
+                <pre><code>{{ t('markdown_setting.Preset one separator value') }}</code></pre>
+              </p>
+            </label>
           </div>
           </div>
 
 
           <div class="col-xs-3 radio radio-primary">
           <div class="col-xs-3 radio radio-primary">
-              <input type="radio" id="option2" name="{{nameForPageBreakOption}}" value="2" {% if pageBreakSeparator === 2 %}checked{% endif %}>
-              <label for="option2">
-                <p class="font-weight-bold">{{ t('markdown_setting.Preset two separator') }}</p>
-                <div class="m-t-15">
-                    {{ t('markdown_setting.Preset two separator desc') }}
-                    <input class="form-control" type="text" name="presetTwoSeparator" value="{{ t('markdown_setting.Preset two separator value') }}" readonly>
-                </div>
-              </label>
+            <input type="radio" id="option2" name="{{nameForPageBreakOption}}" value="2" {% if pageBreakSeparator === 2 %}checked{% endif %}>
+            <label for="option2">
+              <p class="font-weight-bold">{{ t('markdown_setting.Preset two separator') }}</p>
+              <p class="mt-3">
+                {{ t('markdown_setting.Preset two separator desc') }}
+                <pre><code>{{ t('markdown_setting.Preset two separator value') }}</code></pre>
+              </p>
+            </label>
           </div>
           </div>
 
 
           <div class="col-xs-3 radio radio-primary">
           <div class="col-xs-3 radio radio-primary">
             <input type="radio" id="option3" name="{{nameForPageBreakOption}}" value="3" {% if pageBreakSeparator === 3 %}checked{% endif %}>
             <input type="radio" id="option3" name="{{nameForPageBreakOption}}" value="3" {% if pageBreakSeparator === 3 %}checked{% endif %}>
             <label for="option3">
             <label for="option3">
               <p class="font-weight-bold">{{ t('markdown_setting.Custom separator') }}</p>
               <p class="font-weight-bold">{{ t('markdown_setting.Custom separator') }}</p>
-              <div class="m-t-15">
-                  {{ t('markdown_setting.Custom separator desc') }}
-                  <input class="form-control" type="text" name="markdownSetting[markdown:presentation:pageBreakCustomSeparator]" value="{{markdownSetting['markdown:presentation:pageBreakCustomSeparator']|default('') }}">
-              </div>
+              <p class="mt-3">
+                {{ t('markdown_setting.Custom separator desc') }}
+                <div>
+                  <input class="form-control" name="markdownSetting[markdown:presentation:pageBreakCustomSeparator]" value="{{markdownSetting['markdown:presentation:pageBreakCustomSeparator']|default('') }}">
+                </div>
+              </p>
             </label>
             </label>
           </div>
           </div>
 
 

+ 2 - 2
src/server/views/admin/user-group-detail.html

@@ -199,11 +199,11 @@
                   <i class="icon-settings"></i> <span class="caret"></span>
                   <i class="icon-settings"></i> <span class="caret"></span>
                 </button>
                 </button>
                 <ul class="dropdown-menu" role="menu">
                 <ul class="dropdown-menu" role="menu">
-                  <form id="form_removeFromGroup_{{ sUser.id }}" action="/admin/user-group-relation/{{userGroup._id.toString()}}/remove-relation/{{ sRelation._id.toString() }}" method="post">
+                  <form id="form_removeFromGroup_{{ loop.index }}" action="/admin/user-group-relation/{{userGroup._id.toString()}}/remove-relation/{{ sRelation._id.toString() }}" method="post">
                     <input type="hidden" name="_csrf" value="{{ csrf() }}">
                     <input type="hidden" name="_csrf" value="{{ csrf() }}">
                   </form>
                   </form>
                   <li>
                   <li>
-                    <a href="javascript:form_removeFromGroup_{{ sUser.id }}.submit()">
+                    <a href="javascript:form_removeFromGroup_{{ loop.index }}.submit()">
                       <i class="icon-fw icon-user-unfollow"></i> グループから外す
                       <i class="icon-fw icon-user-unfollow"></i> グループから外す
                     </a>
                     </a>
                   </li>
                   </li>

+ 4 - 8
src/server/views/page_presentation.html

@@ -44,8 +44,6 @@ gh/highlightjs/cdn-release@9.12.0/build/languages/yaml.min.js
     <title>{{ path|path2name }} | {{ path }}</title>
     <title>{{ path|path2name }} | {{ path }}</title>
 
 
     <!-- styles -->
     <!-- styles -->
-    <link rel="stylesheet" href="{{ webpack_asset('styles/style.css') }}">
-    <link rel="stylesheet" href="{{ webpack_asset('styles/theme-default.css') }}">
     <link rel="stylesheet" href="{{ webpack_asset('styles/style-presentation.css') }}">
     <link rel="stylesheet" href="{{ webpack_asset('styles/style-presentation.css') }}">
 
 
     <!-- Google Fonts -->
     <!-- Google Fonts -->
@@ -61,17 +59,15 @@ gh/highlightjs/cdn-release@9.12.0/build/languages/yaml.min.js
         {% set pageBreakSeparator = pageBreakSeparator()|default(1) %}
         {% set pageBreakSeparator = pageBreakSeparator()|default(1) %}
         {% set pageBreakCustomSeparator = pageBreakCustomSeparator()|default('') %}
         {% set pageBreakCustomSeparator = pageBreakCustomSeparator()|default('') %}
 
 
-        {% if 1 === pageBreakSeparator %}
-          {% set dataSeparator = "^\n\n\n" %}
+        {% if 3 === pageBreakSeparator %}
+          {% set dataSeparator = pageBreakCustomSeparator %}
         {% elseif 2 === pageBreakSeparator %}
         {% elseif 2 === pageBreakSeparator %}
           {% set dataSeparator = "^-----$" %}
           {% set dataSeparator = "^-----$" %}
-        {% elseif 3 === pageBreakSeparator %}
-          {% set dataSeparator = "^" + pageBreakCustomSeparator + "$" %}
         {% else %}
         {% else %}
-          {% set dataSeparator = "^\n\n\n" %}
+          {% set dataSeparator = "\n\n\n" %}
         {% endif %}
         {% endif %}
 
 
-        <section data-markdown data-separator={{dataSeparator}}>
+        <section data-markdown data-separator="{{dataSeparator}}">
           <script type="text/template">
           <script type="text/template">
 {{ revision.body|presentation|safe }}
 {{ revision.body|presentation|safe }}
           </script>
           </script>