summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorLauri Ojansivu <x@xet7.org>2019-02-08 12:33:39 +0200
committerLauri Ojansivu <x@xet7.org>2019-02-08 12:33:39 +0200
commit7125357a4440f5c95ae6c8f5bcd92fdfdbefa397 (patch)
tree19e21456f5ee10e444ad055b7761235d1e78661f /client
parent329c8d64a824f12b1352dc2f6277ee08e1c4df58 (diff)
parentec453b89b8238adcbb9334e1d006675aa8a7fe06 (diff)
downloadwekan-7125357a4440f5c95ae6c8f5bcd92fdfdbefa397.tar.gz
wekan-7125357a4440f5c95ae6c8f5bcd92fdfdbefa397.tar.bz2
wekan-7125357a4440f5c95ae6c8f5bcd92fdfdbefa397.zip
Merge remote-tracking branch 'upstream/feature-improve-authentication' into feature-improve-authentication
Diffstat (limited to 'client')
-rw-r--r--client/components/main/layouts.jade6
-rw-r--r--client/components/main/layouts.js132
-rw-r--r--client/components/settings/settingBody.jade19
-rw-r--r--client/components/settings/settingBody.js40
4 files changed, 128 insertions, 69 deletions
diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade
index 55ee2686..a6115ec1 100644
--- a/client/components/main/layouts.jade
+++ b/client/components/main/layouts.jade
@@ -23,10 +23,8 @@ template(name="userFormsLayout")
br
section.auth-dialog
+Template.dynamic(template=content)
- +connectionMethod
- if isCas
- .at-form
- button#cas(class='at-btn submit' type='submit') {{casSignInLabel}}
+ if currentSetting.displayAuthenticationMethod
+ +connectionMethod
div.at-form-lang
select.select-lang.js-userform-set-language
each languages
diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js
index a50d167e..6f7c914a 100644
--- a/client/components/main/layouts.js
+++ b/client/components/main/layouts.js
@@ -20,13 +20,19 @@ const validator = {
},
};
-Template.userFormsLayout.onCreated(() => {
- Meteor.subscribe('setting');
-
+Template.userFormsLayout.onCreated(function() {
+ const instance = this;
+ instance.currentSetting = new ReactiveVar();
+
+ Meteor.subscribe('setting', {
+ onReady() {
+ instance.currentSetting.set(Settings.findOne());
+ return this.stop();
+ },
+ });
});
Template.userFormsLayout.onRendered(() => {
-
AccountsTemplates.state.form.keys = new Proxy(AccountsTemplates.state.form.keys, validator);
const i18nTag = navigator.language;
@@ -37,12 +43,10 @@ Template.userFormsLayout.onRendered(() => {
});
Template.userFormsLayout.helpers({
-
currentSetting() {
- return Settings.findOne();
+ return Template.instance().currentSetting.get();
},
-
afterBodyStart() {
return currentSetting.customHTMLafterBodyStart;
},
@@ -75,17 +79,6 @@ Template.userFormsLayout.helpers({
const curLang = T9n.getLanguage() || 'en';
return t9nTag === curLang;
},
-/*
- isCas() {
- return Meteor.settings.public &&
- Meteor.settings.public.cas &&
- Meteor.settings.public.cas.loginUrl;
- },
-
- casSignInLabel() {
- return TAPi18n.__('casSignIn', {}, T9n.getLanguage() || 'en');
- },
-*/
});
Template.userFormsLayout.events({
@@ -94,55 +87,74 @@ Template.userFormsLayout.events({
T9n.setLanguage(i18nTagToT9n(i18nTag));
evt.preventDefault();
},
- 'click button#cas'() {
+ 'click #at-btn'(event, instance) {
+ if (FlowRouter.getRouteName() === 'atSignIn') {
+ authentication(event, instance);
+ }
+ },
+});
+
+Template.defaultLayout.events({
+ 'click .js-close-modal': () => {
+ Modal.close();
+ },
+});
+
+async function authentication(event, instance) {
+ const match = $('#at-field-username_and_email').val();
+ const password = $('#at-field-password').val();
+
+ if (!match || !password) return;
+
+ const result = await getAuthenticationMethod(instance.currentSetting.get(), match);
+
+ if (result === 'password') return;
+
+ // Stop submit #at-pwd-form
+ event.preventDefault();
+ event.stopImmediatePropagation();
+
+ switch (result) {
+ case 'ldap':
+ Meteor.loginWithLDAP(match, password, function() {
+ FlowRouter.go('/');
+ });
+ break;
+
+ case 'cas':
Meteor.loginWithCas(function() {
- if (FlowRouter.getRouteName() === 'atSignIn') {
- FlowRouter.go('/');
- }
+ FlowRouter.go('/');
});
- },
- 'click #at-btn'(event) {
- /* All authentication method can be managed/called here.
- !! DON'T FORGET to correctly fill the fields of the user during its creation if necessary authenticationMethod : String !!
- */
- const authenticationMethodSelected = $('.select-authentication').val();
- // Local account
- if (authenticationMethodSelected === 'password') {
- return;
- }
+ break;
- // Stop submit #at-pwd-form
- event.preventDefault();
- event.stopImmediatePropagation();
+ default:
+ break;
+ }
+}
- const email = $('#at-field-username_and_email').val();
- const password = $('#at-field-password').val();
+function getAuthenticationMethod({displayAuthenticationMethod, defaultAuthenticationMethod}, match) {
+ if (displayAuthenticationMethod) {
+ return $('.select-authentication').val();
+ }
+ return getUserAuthenticationMethod(defaultAuthenticationMethod, match);
+}
- // Ldap account
- if (authenticationMethodSelected === 'ldap') {
- // Check if the user can use the ldap connection
- Meteor.subscribe('user-authenticationMethod', email, {
+function getUserAuthenticationMethod(defaultAuthenticationMethod, match) {
+ return new Promise((resolve) => {
+ try {
+ Meteor.subscribe('user-authenticationMethod', match, {
onReady() {
const user = Users.findOne();
- if (user === undefined || user.authenticationMethod === 'ldap') {
- // Use the ldap connection package
- Meteor.loginWithLDAP(email, password, function(error) {
- if (!error) {
- // Connection
- return FlowRouter.go('/');
- }
- return error;
- });
- }
- return this.stop();
+
+ const authenticationMethod = user
+ ? user.authenticationMethod
+ : defaultAuthenticationMethod;
+
+ resolve(authenticationMethod);
},
});
+ } catch(error) {
+ resolve(defaultAuthenticationMethod);
}
- },
-});
-
-Template.defaultLayout.events({
- 'click .js-close-modal': () => {
- Modal.close();
- },
-});
+ });
+}
diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade
index 153649fc..220dbb50 100644
--- a/client/components/settings/settingBody.jade
+++ b/client/components/settings/settingBody.jade
@@ -142,6 +142,16 @@ template(name='layoutSettings')
input.form-control#hide-logo(type="radio" name="hideLogo" value="false" checked="{{#unless currentSetting.hideLogo}}checked{{/unless}}")
span {{_ 'no'}}
li.layout-form
+ .title {{_ 'display-authentication-method'}}
+ .form-group.flex
+ input.form-control#display-authentication-method(type="radio" name="displayAuthenticationMethod" value="true" checked="{{#if currentSetting.displayAuthenticationMethod}}checked{{/if}}")
+ span {{_ 'yes'}}
+ input.form-control#display-authentication-method(type="radio" name="displayAuthenticationMethod" value="false" checked="{{#unless currentSetting.displayAuthenticationMethod}}checked{{/unless}}")
+ span {{_ 'no'}}
+ li.layout-form
+ .title {{_ 'default-authentication-method'}}
+ +selectAuthenticationMethod(authenticationMethod=currentSetting.defaultAuthenticationMethod)
+ li.layout-form
.title {{_ 'custom-product-name'}}
.form-group
input.form-control#product-name(type="text", placeholder="Wekan" value="{{currentSetting.productName}}")
@@ -153,3 +163,12 @@ template(name='layoutSettings')
textarea#customHTMLbeforeBodyEnd.form-control= currentSetting.customHTMLbeforeBodyEnd
li
button.js-save-layout.primary {{_ 'save'}}
+
+
+template(name='selectAuthenticationMethod')
+ select#defaultAuthenticationMethod
+ each authentications
+ if isSelected value
+ option(value="{{value}}" selected) {{_ value}}
+ else
+ option(value="{{value}}") {{_ value}} \ No newline at end of file
diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js
index 4f07c84c..2f58d551 100644
--- a/client/components/settings/settingBody.js
+++ b/client/components/settings/settingBody.js
@@ -62,6 +62,9 @@ BlazeComponent.extendComponent({
toggleHideLogo() {
$('#hide-logo').toggleClass('is-checked');
},
+ toggleDisplayAuthenticationMethod() {
+ $('#display-authentication-method').toggleClass('is-checked');
+ },
switchMenu(event) {
const target = $(event.target);
if (!target.hasClass('active')) {
@@ -140,17 +143,20 @@ BlazeComponent.extendComponent({
const productName = $('#product-name').val().trim();
const hideLogoChange = ($('input[name=hideLogo]:checked').val() === 'true');
+ const displayAuthenticationMethod = ($('input[name=displayAuthenticationMethod]:checked').val() === 'true');
+ const defaultAuthenticationMethod = $('#defaultAuthenticationMethod').val();
const customHTMLafterBodyStart = $('#customHTMLafterBodyStart').val().trim();
const customHTMLbeforeBodyEnd = $('#customHTMLbeforeBodyEnd').val().trim();
try {
-
Settings.update(Settings.findOne()._id, {
$set: {
productName,
hideLogo: hideLogoChange,
customHTMLafterBodyStart,
customHTMLbeforeBodyEnd,
+ displayAuthenticationMethod,
+ defaultAuthenticationMethod,
},
});
} catch (e) {
@@ -165,17 +171,14 @@ BlazeComponent.extendComponent({
sendSMTPTestEmail() {
Meteor.call('sendSMTPTestEmail', (err, ret) => {
- if (!err && ret) { /* eslint-disable no-console */
+ if (!err && ret) {
const message = `${TAPi18n.__(ret.message)}: ${ret.email}`;
- console.log(message);
alert(message);
} else {
const reason = err.reason || '';
const message = `${TAPi18n.__(err.error)}\n${reason}`;
- console.log(message, err);
alert(message);
}
- /* eslint-enable no-console */
});
},
@@ -190,6 +193,7 @@ BlazeComponent.extendComponent({
'click button.js-send-smtp-test-email': this.sendSMTPTestEmail,
'click a.js-toggle-hide-logo': this.toggleHideLogo,
'click button.js-save-layout': this.saveLayout,
+ 'click a.js-toggle-display-authentication-method': this.toggleDisplayAuthenticationMethod,
}];
},
}).register('setting');
@@ -262,3 +266,29 @@ BlazeComponent.extendComponent({
}];
},
}).register('announcementSettings');
+
+
+Template.selectAuthenticationMethod.onCreated(function() {
+ this.authenticationMethods = new ReactiveVar([]);
+
+ Meteor.call('getAuthenticationsEnabled', (_, result) => {
+ if (result) {
+ // TODO : add a management of different languages
+ // (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')})
+ this.authenticationMethods.set([
+ {value: 'password'},
+ // Gets only the authentication methods availables
+ ...Object.entries(result).filter((e) => e[1]).map((e) => ({value: e[0]})),
+ ]);
+ }
+ });
+});
+
+Template.selectAuthenticationMethod.helpers({
+ authentications() {
+ return Template.instance().authenticationMethods.get();
+ },
+ isSelected(match) {
+ return Template.instance().data.authenticationMethod === match;
+ },
+});