Sfoglia il codice sorgente

WIP: Impl "Associate LDAP account" and "Disassociate LDAP account" operations

Add routes and page
Yuki Takei 8 anni fa
parent
commit
6cb9763ef2

+ 1 - 0
lib/form/index.js

@@ -7,6 +7,7 @@ module.exports = {
   me: {
     user: require('./me/user'),
     password: require('./me/password'),
+    associateExternalAccount: require('./me/associate-external-account'),
     imagetype: require('./me/imagetype'),
     apiToken: require('./me/apiToken'),
   },

+ 7 - 0
lib/form/me/associate-external-account.js

@@ -0,0 +1,7 @@
+'use strict';
+
+var form = require('express-form')
+  , field = form.field;
+
+module.exports = form(
+);

+ 3 - 0
lib/routes/index.js

@@ -106,9 +106,12 @@ module.exports = function(crowi, app) {
   app.post('/admin/users/external-accounts/:id/remove'   , loginRequired(crowi, app) , middleware.adminRequired() , admin.externalAccount.remove);
 
   app.get('/me'                       , loginRequired(crowi, app) , me.index);
+  app.get('/me/external-accounts'     , loginRequired(crowi, app) , me.externalAccounts.list);
   app.get('/me/password'              , loginRequired(crowi, app) , me.password);
   app.get('/me/apiToken'              , loginRequired(crowi, app) , me.apiToken);
   app.post('/me'                      , form.me.user              , loginRequired(crowi, app) , me.index);
+  app.post('/me/external-accounts/associate'    , form.me.associateExternalAccount , loginRequired(crowi, app) , me.externalAccounts.associate);
+  app.post('/me/external-accounts/disassociate' , loginRequired(crowi, app) , me.externalAccounts.disassociate);
   app.post('/me/password'             , form.me.password          , loginRequired(crowi, app) , me.password);
   app.post('/me/imagetype'            , form.me.imagetype         , loginRequired(crowi, app) , me.imagetype);
   app.post('/me/apiToken'             , form.me.apiToken          , loginRequired(crowi, app) , me.apiToken);

+ 31 - 0
lib/routes/me.js

@@ -7,6 +7,7 @@ module.exports = function(crowi, app) {
     , config = crowi.getConfig()
     , Page = models.Page
     , User = models.User
+    , ExternalAccount = models.ExternalAccount
     , Revision = models.Revision
     //, pluginService = require('../service/plugin')
     , actions = {}
@@ -155,6 +156,36 @@ module.exports = function(crowi, app) {
     });
   }
 
+  actions.externalAccounts = {};
+  actions.externalAccounts.list = function(req, res) {
+    const userData = req.user;
+
+    let renderVars = {};
+    ExternalAccount.find({user: userData})
+      .then((externalAccounts) => {
+        renderVars.externalAccounts = externalAccounts;
+        return;
+      })
+      .then(() => {
+        if (req.method == 'POST' && req.form.isValid) {
+          // TODO impl
+          return res.render('me/external-accounts', renderVars);
+        }
+        else { // method GET
+          return res.render('me/external-accounts', renderVars);
+        }
+      });
+  }
+
+  actions.externalAccounts.associate = function(req, res) {
+
+  }
+
+  actions.externalAccounts.disassociate = function(req, res) {
+    // TODO impl
+    // TODO check password is set
+  }
+
   actions.password = function(req, res) {
     var passwordForm = req.body.mePassword;
     var userData = req.user;

+ 1 - 0
lib/views/me/api_token.html

@@ -16,6 +16,7 @@
 
   <ul class="nav nav-tabs">
     <li><a href="/me"><i class="fa fa-gears"></i> {{ t('User Information') }}</a></li>
+    <li><a href="/me/external-accounts"><i class="fa fa-user-plus"></i> {{ t('External Accounts') }}</a></li>
     <li><a href="/me/password"><i class="fa fa-key"></i> {{ t('Password Settings') }}</a></li>
     <li class="active"><a href="/me/apiToken"><i class="fa fa-rocket"></i> {{ t('API Settings') }}</a></li>
   </ul>

+ 118 - 0
lib/views/me/external-accounts.html

@@ -0,0 +1,118 @@
+{% extends '../layout/2column.html' %}
+
+{% block html_title %}{{ t('Password Settings') }} · {{ path }}{% endblock %}
+
+{% block content_head %}
+<div class="header-wrap">
+  <header id="page-header">
+    <h1 class="title" id="">{{ t('User Settings') }}</h1>
+  </header>
+</div>
+{% endblock %}
+
+{% block content_main %}
+<div class="content-main">
+
+  <ul class="nav nav-tabs">
+    <li><a href="/me"><i class="fa fa-gears"></i> {{ t('User Information') }}</a></li>
+    <li class="active"><a href="/me/external-accounts"><i class="fa fa-user-plus"></i> {{ t('External Accounts') }}</a></li>
+    <li><a href="/me/password"><i class="fa fa-key"></i> {{ t('Password Settings') }}</a></li>
+    <li><a href="/me/apiToken"><i class="fa fa-rocket"></i> {{ t('API Settings') }}</a></li>
+  </ul>
+
+  <div class="tab-content">
+
+  {% set message = req.flash('successMessage') %}
+  {% if message.length %}
+  <div class="alert alert-success">
+    {{ message }}
+  </div>
+  {% endif %}
+
+  {% if req.form.errors.length > 0 %}
+  <div class="alert alert-danger">
+    <ul>
+    {% for error in req.form.errors %}
+      <li>{{ error }}</li>
+    {% endfor %}
+    </ul>
+  </div>
+  {% endif %}
+
+  <legend>{{ t('External Accounts') }}</legend>
+
+  <table class="table table-hover table-striped table-bordered table-user-list">
+    <thead>
+      <tr>
+        <th width="120px">Authentication Provider</th>
+        <th><code>accountId</code></th>
+        <th width="200px">{{ t('Created') }}</th>
+        <th width="150px">{{ t('Admin') }}</th>
+      </tr>
+    </thead>
+    <tbody>
+      {% for account in externalAccounts %}
+      <tr>
+        <td>{{ account.providerType }}</td>
+        <td>
+          <strong>{{ account.accountId }}</strong>
+        </td>
+        <td>{{ account.createdAt|date('Y-m-d', account.createdAt.getTimezoneOffset()) }}</td>
+        <td>
+          <div class="btn-group">
+
+            <form action="/me/external-accounts/disassociate" method="post">
+              <input type="hidden" name="_csrf" value="{{ csrf() }}">
+              <button type="submit" class="btn btn-sm btn-danger">
+                <i class="fa fa-unlink"></i>
+                {{ t('Diassociate') }}
+              </button>
+            </form>
+
+          </div>{# end of .btn-group #}
+        </td>
+      </tr>
+      {% endfor %}
+    </tbody>
+  </table>
+
+  <div id="form-box">
+
+    <form action="/me/password" method="post" class="form-horizontal" role="form">
+    <fieldset>
+      <legend>{{ t('External Accounts') }}</legend>
+      <div class="form-group {% if not user.password %}has-error{% endif %}">
+        <label for="mePassword[newPassword]" class="col-xs-3 control-label">{{ t('New password') }}</label>
+        <div class="col-xs-6">
+          <input class="form-control" type="password" name="mePassword[newPassword]" required>
+        </div>
+      </div>
+      <div class="form-group">
+        <label for="mePassword[newPasswordConfirm]" class="col-xs-3 control-label">{{ t('Re-enter new password') }}</label>
+        <div class="col-xs-6">
+          <input class="form-control col-xs-4" type="password" name="mePassword[newPasswordConfirm]" required>
+
+          <p class="help-block">{{ t('page_register.form_help.password') }}</p>
+        </div>
+      </div>
+
+      <div class="form-group">
+        <div class="col-xs-offset-2 col-xs-10">
+          <button type="submit" class="btn btn-primary">{{ t('Update') }}</button>
+        </div>
+      </div>
+
+    </fieldset>
+    </form>
+  </div>
+
+
+  </div>
+</div>
+{% endblock content_main %}
+
+{% block content_footer %}
+{% endblock %}
+
+{% block footer %}
+{% endblock %}

+ 1 - 0
lib/views/me/index.html

@@ -15,6 +15,7 @@
 
   <ul class="nav nav-tabs">
     <li class="active"><a href="/me"><i class="fa fa-gears"></i> {{ t('User Information') }}</a></li>
+    <li><a href="/me/external-accounts"><i class="fa fa-user-plus"></i> {{ t('External Accounts') }}</a></li>
     <li><a href="/me/password"><i class="fa fa-key"></i> {{ t('Password Settings') }}</a></li>
     <li><a href="/me/apiToken"><i class="fa fa-rocket"></i> {{ t('API Settings') }}</a></li>
   </ul>

+ 1 - 0
lib/views/me/password.html

@@ -15,6 +15,7 @@
 
   <ul class="nav nav-tabs">
     <li><a href="/me"><i class="fa fa-gears"></i> {{ t('User Information') }}</a></li>
+    <li><a href="/me/external-accounts"><i class="fa fa-user-plus"></i> {{ t('External Accounts') }}</a></li>
     <li class="active"><a href="/me/password"><i class="fa fa-key"></i> {{ t('Password Settings') }}</a></li>
     <li><a href="/me/apiToken"><i class="fa fa-rocket"></i> {{ t('API Settings') }}</a></li>
   </ul>