From 67292a534587e3490762aa5db9716517cab079fa Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 7 Oct 2014 16:29:06 +0200 Subject: [PATCH 01/21] add checkbox for experienced users to server tab --- apps/user_ldap/css/settings.css | 9 +++++++++ apps/user_ldap/lib/configuration.php | 3 +++ apps/user_ldap/templates/part.wizard-server.php | 11 +++++++++++ 3 files changed, 23 insertions(+) diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index 3051cc8058e..48a8626ea9a 100644 --- a/apps/user_ldap/css/settings.css +++ b/apps/user_ldap/css/settings.css @@ -6,6 +6,7 @@ .tablerow { display: table-row; white-space: nowrap; + text-align: left; } .tablerow input, .tablerow textarea { @@ -16,6 +17,10 @@ height: 15px; } +#ldap .tablerow label { + margin-left: 3px; +} + .invisible { visibility: hidden; } @@ -103,6 +108,10 @@ vertical-align: bottom; } +#ldap input[type=checkbox] { + width: 15px !important; +} + select[multiple=multiple] + button { height: 28px; padding-top: 6px !important; diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php index 4cb00561b3f..75d3d5ea04d 100644 --- a/apps/user_ldap/lib/configuration.php +++ b/apps/user_ldap/lib/configuration.php @@ -69,6 +69,7 @@ class Configuration { 'ldapConfigurationActive' => false, 'ldapAttributesForUserSearch' => null, 'ldapAttributesForGroupSearch' => null, + 'ldapExperiencedAdmin' => false, 'homeFolderNamingRule' => null, 'hasPagedResultSupport' => false, 'hasMemberOfFilterSupport' => false, @@ -391,6 +392,7 @@ class Configuration { 'last_jpegPhoto_lookup' => 0, 'ldap_nested_groups' => 0, 'ldap_paging_size' => 500, + 'ldap_experienced_admin' => 0, ); } @@ -444,6 +446,7 @@ class Configuration { 'last_jpegPhoto_lookup' => 'lastJpegPhotoLookup', 'ldap_nested_groups' => 'ldapNestedGroups', 'ldap_paging_size' => 'ldapPagingSize', + 'ldap_experienced_admin' => 'ldapExperiencedAdmin' ); return $array; } diff --git a/apps/user_ldap/templates/part.wizard-server.php b/apps/user_ldap/templates/part.wizard-server.php index 422faad028b..b829c775ad0 100644 --- a/apps/user_ldap/templates/part.wizard-server.php +++ b/apps/user_ldap/templates/part.wizard-server.php @@ -69,6 +69,17 @@ +
+ + + +
+
From efd940133b759fb30e7d150fdc147e6a7e4faa28 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 7 Oct 2014 16:45:22 +0200 Subject: [PATCH 02/21] must be empty not auto --- apps/user_ldap/appinfo/update.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php index 1e706ce869b..5fad23de4f6 100644 --- a/apps/user_ldap/appinfo/update.php +++ b/apps/user_ldap/appinfo/update.php @@ -19,7 +19,7 @@ foreach($configPrefixes as $config) { 'user_ldap', $config.'ldap_uuid_user_attribute', 'not existing'); if($state === 'non existing') { $value = \OCP\Config::getAppValue( - 'user_ldap', $config.'ldap_uuid_attribute', 'auto'); + 'user_ldap', $config.'ldap_uuid_attribute', ''); \OCP\Config::setAppValue( 'user_ldap', $config.'ldap_uuid_user_attribute', $value); \OCP\Config::setAppValue( @@ -30,7 +30,7 @@ foreach($configPrefixes as $config) { 'user_ldap', $config.'ldap_expert_uuid_user_attr', 'not existing'); if($state === 'non existing') { $value = \OCP\Config::getAppValue( - 'user_ldap', $config.'ldap_expert_uuid_attr', 'auto'); + 'user_ldap', $config.'ldap_expert_uuid_attr', ''); \OCP\Config::setAppValue( 'user_ldap', $config.'ldap_expert_uuid_user_attr', $value); \OCP\Config::setAppValue( From 3ff4c8e3fc5d6249b559b3cd1b4a01ba02bd5c34 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 7 Oct 2014 17:28:09 +0200 Subject: [PATCH 03/21] sets user filters to raw mode when marking user as experienced --- apps/user_ldap/js/experiencedAdmin.js | 59 +++++++++++++++++++++++++++ apps/user_ldap/js/settings.js | 6 +++ apps/user_ldap/settings.php | 1 + 3 files changed, 66 insertions(+) create mode 100644 apps/user_ldap/js/experiencedAdmin.js diff --git a/apps/user_ldap/js/experiencedAdmin.js b/apps/user_ldap/js/experiencedAdmin.js new file mode 100644 index 00000000000..2d500f301b0 --- /dev/null +++ b/apps/user_ldap/js/experiencedAdmin.js @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2014, Arthur Schiwon + * This file is licensed under the Affero General Public License version 3 or later. + * See the COPYING-README file. + */ + +/** + * controls behaviour depend on whether the admin is experienced in LDAP or not. + * + * @class + * @param {object} wizard the LDAP Wizard object + * @param {boolean} initialState whether the admin is experienced or not + */ +function ExperiencedAdmin(wizard, initialState) { + this.wizard = wizard; + this.isExperienced = false; +} + + +/** + * toggles whether the admin is an experienced one or not + * + * @param {boolean} whether the admin is experienced or not + */ +ExperiencedAdmin.prototype.toggle = function(isExperienced) { + this.isExperienced = isExperienced; + if(this.isExperienced) { + this.enableRawMode(); + } +}; + +/** +* answers whether the admin is an experienced one or not +* +* @return {boolean} whether the admin is experienced or not +*/ +ExperiencedAdmin.prototype.isExperienced = function() { + return this.isExperienced; +}; + +/** + * switches all LDAP filters from Assisted to Raw mode. + */ +ExperiencedAdmin.prototype.enableRawMode = function () { + containers = { + 'toggleRawUserFilter' : '#rawGroupFilterContainer', + 'toggleRawLoginFilter': '#rawLoginFilterContainer', + 'toggleRawUserFilter' : '#rawUserFilterContainer' + }; + +// containers.forEach(function(container, method) { + for(method in containers) { + if($(containers[method]).hasClass('invisible')) { + this.wizard[method](); + } + }; + + +}; diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index fd84ca1980b..5982d65ad6c 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -931,4 +931,10 @@ $(document).ready(function() { LdapConfiguration.refreshConfig(); } }); + + expAdminCB = $('#ldap_experienced_admin'); + LdapWizard.admin = new ExperiencedAdmin(LdapWizard, expAdminCB.is(':checked')); + expAdminCB.change(function() { + LdapWizard.admin.toggle($(this).is(':checked')); + }); }); diff --git a/apps/user_ldap/settings.php b/apps/user_ldap/settings.php index e7cdd0d926a..1e588b1cd85 100644 --- a/apps/user_ldap/settings.php +++ b/apps/user_ldap/settings.php @@ -26,6 +26,7 @@ OC_Util::checkAdminUser(); OCP\Util::addScript('user_ldap', 'ldapFilter'); +OCP\Util::addScript('user_ldap', 'experiencedAdmin'); OCP\Util::addScript('user_ldap', 'settings'); OCP\Util::addScript('core', 'jquery.multiselect'); OCP\Util::addStyle('user_ldap', 'settings'); From b6fc7f5599a08ab047e10775b4071514c7cd170d Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Oct 2014 11:38:39 +0200 Subject: [PATCH 04/21] Objectlasses, Groups and Attributes are now loaded only in assisted mode and only once --- apps/user_ldap/js/experiencedAdmin.js | 3 +- apps/user_ldap/js/ldapFilter.js | 43 +++++++++++++++++++++++++-- apps/user_ldap/js/settings.js | 39 ++++++++++++++++++------ 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/apps/user_ldap/js/experiencedAdmin.js b/apps/user_ldap/js/experiencedAdmin.js index 2d500f301b0..96b4bcad6c9 100644 --- a/apps/user_ldap/js/experiencedAdmin.js +++ b/apps/user_ldap/js/experiencedAdmin.js @@ -43,12 +43,11 @@ ExperiencedAdmin.prototype.isExperienced = function() { */ ExperiencedAdmin.prototype.enableRawMode = function () { containers = { - 'toggleRawUserFilter' : '#rawGroupFilterContainer', + 'toggleRawGroupFilter': '#rawGroupFilterContainer', 'toggleRawLoginFilter': '#rawLoginFilterContainer', 'toggleRawUserFilter' : '#rawUserFilterContainer' }; -// containers.forEach(function(container, method) { for(method in containers) { if($(containers[method]).hasClass('invisible')) { this.wizard[method](); diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js index e9f60e7ba3c..cd03ff9b5bf 100644 --- a/apps/user_ldap/js/ldapFilter.js +++ b/apps/user_ldap/js/ldapFilter.js @@ -1,19 +1,30 @@ /* global LdapWizard */ -function LdapFilter(target) { +function LdapFilter(target, determineModeCallback) { this.locked = true; this.target = false; this.mode = LdapWizard.filterModeAssisted; this.lazyRunCompose = false; + this.determineModeCallback = determineModeCallback; + this.foundFeatures = false; + this.activated = false; if( target === 'User' || target === 'Login' || target === 'Group') { this.target = target; - this.determineMode(); } } +LdapFilter.prototype.activate = function() { + if(this.activated) { + return; + } + this.activated = true; + + this.determineMode(); +} + LdapFilter.prototype.compose = function(callback) { var action; @@ -82,6 +93,7 @@ LdapFilter.prototype.determineMode = function() { filter.mode + '« of type ' + typeof filter.mode); } filter.unlock(); + filter.determineModeCallback(filter.mode); }, function () { //on error case get back to default i.e. Assisted @@ -90,10 +102,17 @@ LdapFilter.prototype.determineMode = function() { filter.mode = LdapWizard.filterModeAssisted; } filter.unlock(); + filter.determineModeCallback(filter.mode); } ); }; +LdapFilter.prototype.setMode = function(mode) { + if(mode === LdapWizard.filterModeAssisted || mode === LdapWizard.filterModeRaw) { + this.mode = mode; + } +} + LdapFilter.prototype.unlock = function() { this.locked = false; if(this.lazyRunCompose) { @@ -101,3 +120,23 @@ LdapFilter.prototype.unlock = function() { this.compose(); } }; + +LdapFilter.prototype.findFeatures = function() { + if(!this.foundFeatures && !this.locked && this.mode === LdapWizard.filterModeAssisted) { + this.foundFeatures = true; + if(this.target === 'User') { + objcEl = 'ldap_userfilter_objectclass'; + avgrEl = 'ldap_userfilter_groups'; + } else if (this.target === 'Group') { + objcEl = 'ldap_groupfilter_objectclass'; + avgrEl = 'ldap_groupfilter_groups'; + } else if (this.target === 'Login') { + LdapWizard.findAttributes(); + return; + } else { + return false; + } + LdapWizard.findObjectClasses(objcEl, this.target); + LdapWizard.findAvailableGroups(avgrEl, this.target + "s"); + } +} diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 5982d65ad6c..cf7223d3fa0 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -530,23 +530,21 @@ var LdapWizard = { isConfigurationActiveControlLocked: true, init: function() { + LdapWizard.instantiateFilters(); LdapWizard.basicStatusCheck(); LdapWizard.functionalityCheck(); LdapWizard.isConfigurationActiveControlLocked = false; }, initGroupFilter: function() { - LdapWizard.groupFilter = new LdapFilter('Group'); - LdapWizard.findObjectClasses('ldap_groupfilter_objectclass', 'Group'); - LdapWizard.findAvailableGroups('ldap_groupfilter_groups', 'Groups'); + LdapWizard.groupFilter.activate(); LdapWizard.countGroups(); }, /** init login filter tab section **/ initLoginFilter: function() { - LdapWizard.loginFilter = new LdapFilter('Login'); - LdapWizard.findAttributes(); + LdapWizard.loginFilter.activate(); }, postInitLoginFilter: function() { @@ -571,15 +569,30 @@ var LdapWizard = { /** init user filter tab section **/ + instantiateFilters: function() { + delete LdapWizard.userFilter; + LdapWizard.userFilter = new LdapFilter('User', function(mode) { + LdapWizard.userFilter.findFeatures(); + }); + + delete LdapWizard.loginFilter; + LdapWizard.loginFilter = new LdapFilter('Login', function(mode) { + LdapWizard.loginFilter.findFeatures(); + }); + + delete LdapWizard.groupFilter; + LdapWizard.groupFilter = new LdapFilter('Group', function(mode) { + LdapWizard.groupFilter.findFeatures(); + }); + }, + userFilterObjectClassesHasRun: false, userFilterAvailableGroupsHasRun: false, initUserFilter: function() { LdapWizard.userFilterObjectClassesHasRun = false; LdapWizard.userFilterAvailableGroupsHasRun = false; - LdapWizard.userFilter = new LdapFilter('User'); - LdapWizard.findObjectClasses('ldap_userfilter_objectclass', 'User'); - LdapWizard.findAvailableGroups('ldap_userfilter_groups', 'Users'); + LdapWizard.userFilter.activate(); }, postInitUserFilter: function() { @@ -713,9 +726,12 @@ var LdapWizard = { }, toggleRawFilter: function(container, moc, mg, stateVar, modeKey) { + var isUser = moc.indexOf('user') >= 0; + var filter = isUser ? LdapWizard.userFilter : LdapWizard.groupFilter; //moc = multiselect objectclass //mg = mutliselect groups if($(container).hasClass('invisible')) { + filter.setMode(LdapWizard.filterModeRaw); $(container).removeClass('invisible'); $(moc).multiselect('disable'); if($(mg).multiselect().attr('disabled') == 'disabled') { @@ -726,11 +742,13 @@ var LdapWizard = { $(mg).multiselect('disable'); LdapWizard._save({ id: modeKey }, LdapWizard.filterModeRaw); } else { + filter.setMode(LdapWizard.filterModeAssisted); + filter.findFeatures(); $(container).addClass('invisible'); $(mg).multiselect(LdapWizard[stateVar]); $(moc).multiselect('enable'); LdapWizard._save({ id: modeKey }, LdapWizard.filterModeAssisted); - if(moc.indexOf('user') >= 0) { + if(isUser) { LdapWizard.blacklistRemove('ldap_userlist_filter'); LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute); } else { @@ -764,6 +782,8 @@ var LdapWizard = { property = false; mode = LdapWizard.filterModeAssisted; } + LdapWizard.loginFilter.setMode(mode); + LdapWizard.loginFilter.findFeatures(); $('#ldap_loginfilter_attributes').multiselect(action); $('#ldap_loginfilter_email').prop('disabled', property); $('#ldap_loginfilter_username').prop('disabled', property); @@ -837,6 +857,7 @@ $(document).ready(function() { LdapWizard.initMultiSelect($('#ldap_groupfilter_objectclass'), 'ldap_groupfilter_objectclass', t('user_ldap', 'Select object classes')); + $('.lwautosave').change(function() { LdapWizard.save(this); }); $('#toggleRawUserFilter').click(LdapWizard.toggleRawUserFilter); $('#toggleRawGroupFilter').click(LdapWizard.toggleRawGroupFilter); From 7ba787e649de83da03ea1809d54d74fedc31a9ea Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Oct 2014 13:06:18 +0200 Subject: [PATCH 05/21] user and group counts are only upated on demand in experienced mode --- apps/user_ldap/css/settings.css | 4 ++ apps/user_ldap/js/experiencedAdmin.js | 46 +++++++++++++++++-- apps/user_ldap/js/ldapFilter.js | 15 +++++- apps/user_ldap/js/settings.js | 34 +++++++++++--- .../templates/part.wizard-groupfilter.php | 7 ++- .../templates/part.wizard-userfilter.php | 7 ++- 6 files changed, 98 insertions(+), 15 deletions(-) diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index 48a8626ea9a..0dfcf474256 100644 --- a/apps/user_ldap/css/settings.css +++ b/apps/user_ldap/css/settings.css @@ -82,6 +82,10 @@ margin: 5px; } +.ldap_count { + line-height: 45px; +} + .ldapSettingControls { margin-top: 3px; } diff --git a/apps/user_ldap/js/experiencedAdmin.js b/apps/user_ldap/js/experiencedAdmin.js index 96b4bcad6c9..4b30ed44d00 100644 --- a/apps/user_ldap/js/experiencedAdmin.js +++ b/apps/user_ldap/js/experiencedAdmin.js @@ -13,7 +13,10 @@ */ function ExperiencedAdmin(wizard, initialState) { this.wizard = wizard; - this.isExperienced = false; + this.isExperienced = initialState; + if(this.isExperienced) { + this.hideEntryCounters(); + } } @@ -22,10 +25,13 @@ function ExperiencedAdmin(wizard, initialState) { * * @param {boolean} whether the admin is experienced or not */ -ExperiencedAdmin.prototype.toggle = function(isExperienced) { +ExperiencedAdmin.prototype.setExperienced = function(isExperienced) { this.isExperienced = isExperienced; if(this.isExperienced) { this.enableRawMode(); + this.hideEntryCounters(); + } else { + this.showEntryCounters(); } }; @@ -41,7 +47,7 @@ ExperiencedAdmin.prototype.isExperienced = function() { /** * switches all LDAP filters from Assisted to Raw mode. */ -ExperiencedAdmin.prototype.enableRawMode = function () { +ExperiencedAdmin.prototype.enableRawMode = function() { containers = { 'toggleRawGroupFilter': '#rawGroupFilterContainer', 'toggleRawLoginFilter': '#rawLoginFilterContainer', @@ -53,6 +59,40 @@ ExperiencedAdmin.prototype.enableRawMode = function () { this.wizard[method](); } }; +}; + +ExperiencedAdmin.prototype.updateUserTab = function(mode) { + this._updateTab(mode, $('#ldap_user_count')); +} +ExperiencedAdmin.prototype.updateGroupTab = function(mode) { + this._updateTab(mode, $('#ldap_group_count')); +} +ExperiencedAdmin.prototype._updateTab = function(mode, $countEl) { + if(mode === LdapWizard.filterModeAssisted) { + $countEl.removeClass('hidden'); + } else if(!this.isExperienced) { + $countEl.removeClass('hidden'); + } else { + $countEl.addClass('hidden'); + } +} + +/** + * hide user and group counters, they will be displayed on demand only + */ +ExperiencedAdmin.prototype.hideEntryCounters = function() { + $('#ldap_user_count').addClass('hidden'); + $('#ldap_group_count').addClass('hidden'); + $('.ldapGetEntryCount').removeClass('hidden'); +}; + +/** +* shows user and group counters, they will be displayed on demand only +*/ +ExperiencedAdmin.prototype.showEntryCounters = function() { + $('#ldap_user_count').removeClass('hidden'); + $('#ldap_group_count').removeClass('hidden'); + $('.ldapGetEntryCount').addClass('hidden'); }; diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js index cd03ff9b5bf..2d3ca8b3691 100644 --- a/apps/user_ldap/js/ldapFilter.js +++ b/apps/user_ldap/js/ldapFilter.js @@ -113,6 +113,10 @@ LdapFilter.prototype.setMode = function(mode) { } } +LdapFilter.prototype.getMode = function() { + return this.mode; +} + LdapFilter.prototype.unlock = function() { this.locked = false; if(this.lazyRunCompose) { @@ -122,6 +126,7 @@ LdapFilter.prototype.unlock = function() { }; LdapFilter.prototype.findFeatures = function() { + //TODO: reset this.foundFeatures when any base DN changes if(!this.foundFeatures && !this.locked && this.mode === LdapWizard.filterModeAssisted) { this.foundFeatures = true; if(this.target === 'User') { @@ -139,4 +144,12 @@ LdapFilter.prototype.findFeatures = function() { LdapWizard.findObjectClasses(objcEl, this.target); LdapWizard.findAvailableGroups(avgrEl, this.target + "s"); } -} +}; + +LdapFilter.prototype.updateCount = function() { + if(this.target === 'User') { + LdapWizard.countUsers(); + } else if (this.target === 'Group') { + LdapWizard.countGroups(); + } +}; diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index cf7223d3fa0..9878a2e326e 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -317,27 +317,30 @@ var LdapWizard = { } }, - _countThings: function(method) { + _countThings: function(method, spinnerID) { param = 'action='+method+ '&ldap_serverconfig_chooser='+ encodeURIComponent($('#ldap_serverconfig_chooser').val()); + LdapWizard.showSpinner(spinnerID); LdapWizard.ajax(param, function(result) { LdapWizard.applyChanges(result); + LdapWizard.hideSpinner(spinnerID); }, function (result) { - // error handling + OC.Notification.show('Counting the entries failed with, ' + result.message); + LdapWizard.hideSpinner(spinnerID); } ); }, countGroups: function() { - LdapWizard._countThings('countGroups'); + LdapWizard._countThings('countGroups', '#ldap_group_count'); }, countUsers: function() { - LdapWizard._countThings('countUsers'); + LdapWizard._countThings('countUsers', '#ldap_user_count'); }, detectEmailAttribute: function() { @@ -531,6 +534,7 @@ var LdapWizard = { init: function() { LdapWizard.instantiateFilters(); + LdapWizard.admin.setExperienced($('#ldap_experienced_admin').is(':checked')); LdapWizard.basicStatusCheck(); LdapWizard.functionalityCheck(); LdapWizard.isConfigurationActiveControlLocked = false; @@ -574,6 +578,13 @@ var LdapWizard = { LdapWizard.userFilter = new LdapFilter('User', function(mode) { LdapWizard.userFilter.findFeatures(); }); + $('#rawUserFilterContainer .ldapGetEntryCount').click(function(event) { + event.preventDefault(); + $('#ldap_user_count').text(''); + LdapWizard.userFilter.updateCount(); + LdapWizard.detectEmailAttribute(); + $('#ldap_user_count').removeClass('hidden'); + }); delete LdapWizard.loginFilter; LdapWizard.loginFilter = new LdapFilter('Login', function(mode) { @@ -584,6 +595,13 @@ var LdapWizard = { LdapWizard.groupFilter = new LdapFilter('Group', function(mode) { LdapWizard.groupFilter.findFeatures(); }); + $('#rawGroupFilterContainer .ldapGetEntryCount').click(function(event) { + event.preventDefault(); + $('#ldap_group_count').text(''); + LdapWizard.groupFilter.updateCount(); + LdapWizard.detectGroupMemberAssoc(); + $('#ldap_group_count').removeClass('hidden'); + }); }, userFilterObjectClassesHasRun: false, @@ -638,10 +656,10 @@ var LdapWizard = { } } - if(triggerObj.id == 'ldap_userlist_filter') { + if(triggerObj.id == 'ldap_userlist_filter' && !LdapWizard.admin.isExperienced()) { LdapWizard.countUsers(); LdapWizard.detectEmailAttribute(); - } else if(triggerObj.id == 'ldap_group_filter') { + } else if(triggerObj.id == 'ldap_group_filter' && !LdapWizard.admin.isExperienced()) { LdapWizard.countGroups(); LdapWizard.detectGroupMemberAssoc(); } @@ -766,6 +784,7 @@ var LdapWizard = { 'groupFilterGroupSelectState', 'ldapGroupFilterMode' ); + LdapWizard.admin.updateGroupTab(LdapWizard.groupFilter.getMode()); }, toggleRawLoginFilter: function() { @@ -801,6 +820,7 @@ var LdapWizard = { 'userFilterGroupSelectState', 'ldapUserFilterMode' ); + LdapWizard.admin.updateUserTab(LdapWizard.userFilter.getMode()); }, updateStatusIndicator: function(isComplete) { @@ -956,6 +976,6 @@ $(document).ready(function() { expAdminCB = $('#ldap_experienced_admin'); LdapWizard.admin = new ExperiencedAdmin(LdapWizard, expAdminCB.is(':checked')); expAdminCB.change(function() { - LdapWizard.admin.toggle($(this).is(':checked')); + LdapWizard.admin.setExperienced($(this).is(':checked')); }); }); diff --git a/apps/user_ldap/templates/part.wizard-groupfilter.php b/apps/user_ldap/templates/part.wizard-groupfilter.php index e460997b1bf..1953d2eaa6e 100644 --- a/apps/user_ldap/templates/part.wizard-groupfilter.php +++ b/apps/user_ldap/templates/part.wizard-groupfilter.php @@ -30,13 +30,16 @@ placeholder="t('Raw LDAP filter'));?>" title="t('The filter specifies which LDAP groups shall have access to the %s instance.', $theme->getName()));?>" /> +

-

+

0 t('groups found'));?>

- \ No newline at end of file + diff --git a/apps/user_ldap/templates/part.wizard-userfilter.php b/apps/user_ldap/templates/part.wizard-userfilter.php index eff9f89ce2c..99a6e75370b 100644 --- a/apps/user_ldap/templates/part.wizard-userfilter.php +++ b/apps/user_ldap/templates/part.wizard-userfilter.php @@ -30,13 +30,16 @@ placeholder="t('Raw LDAP filter'));?>" title="t('The filter specifies which LDAP users shall have access to the %s instance.', $theme->getName()));?>" /> +

-

+

0 t('users found'));?>

- \ No newline at end of file + From 29b0e9bfbcec985b191dc14926db849419081435 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Oct 2014 13:29:13 +0200 Subject: [PATCH 06/21] confirmation before switching to assisted mode when admin is experienced --- apps/user_ldap/js/settings.js | 115 +++++++++++++++++++++++----------- 1 file changed, 77 insertions(+), 38 deletions(-) diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 9878a2e326e..8ea303302ae 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -776,51 +776,90 @@ var LdapWizard = { } }, + onToggleRawFilterConfirmation: function(currentMode, callback) { + if(!LdapWizard.admin.isExperienced + || currentMode === LdapWizard.filterModeAssisted + ) { + return callback(true); + } + + var confirmed = OCdialogs.confirm( + 'Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?', + 'Mode switch', + callback + ); + }, + toggleRawGroupFilter: function() { - LdapWizard.blacklistRemove('ldap_group_filter'); - LdapWizard.toggleRawFilter('#rawGroupFilterContainer', - '#ldap_groupfilter_objectclass', - '#ldap_groupfilter_groups', - 'groupFilterGroupSelectState', - 'ldapGroupFilterMode' - ); - LdapWizard.admin.updateGroupTab(LdapWizard.groupFilter.getMode()); + LdapWizard.onToggleRawFilterConfirmation( + LdapWizard.groupFilter.getMode(), + function(confirmed) { + if(confirmed !== true) { + return; + } + + LdapWizard.blacklistRemove('ldap_group_filter'); + LdapWizard.toggleRawFilter('#rawGroupFilterContainer', + '#ldap_groupfilter_objectclass', + '#ldap_groupfilter_groups', + 'groupFilterGroupSelectState', + 'ldapGroupFilterMode' + ); + LdapWizard.admin.updateGroupTab(LdapWizard.groupFilter.getMode()); + } + ); }, toggleRawLoginFilter: function() { - LdapWizard.blacklistRemove('ldap_login_filter'); - container = '#rawLoginFilterContainer'; - if($(container).hasClass('invisible')) { - $(container).removeClass('invisible'); - action = 'disable'; - property = 'disabled'; - mode = LdapWizard.filterModeRaw; - } else { - $(container).addClass('invisible'); - action = 'enable'; - property = false; - mode = LdapWizard.filterModeAssisted; - } - LdapWizard.loginFilter.setMode(mode); - LdapWizard.loginFilter.findFeatures(); - $('#ldap_loginfilter_attributes').multiselect(action); - $('#ldap_loginfilter_email').prop('disabled', property); - $('#ldap_loginfilter_username').prop('disabled', property); - LdapWizard._save({ id: 'ldapLoginFilterMode' }, mode); - if(action == 'enable') { - LdapWizard.loginFilter.compose(); - } + LdapWizard.onToggleRawFilterConfirmation( + LdapWizard.loginFilter.getMode(), + function(confirmed) { + if(confirmed !== true) { + return; + } + + LdapWizard.blacklistRemove('ldap_login_filter'); + container = '#rawLoginFilterContainer'; + if($(container).hasClass('invisible')) { + $(container).removeClass('invisible'); + action = 'disable'; + property = 'disabled'; + mode = LdapWizard.filterModeRaw; + } else { + $(container).addClass('invisible'); + action = 'enable'; + property = false; + mode = LdapWizard.filterModeAssisted; + } + LdapWizard.loginFilter.setMode(mode); + LdapWizard.loginFilter.findFeatures(); + $('#ldap_loginfilter_attributes').multiselect(action); + $('#ldap_loginfilter_email').prop('disabled', property); + $('#ldap_loginfilter_username').prop('disabled', property); + LdapWizard._save({ id: 'ldapLoginFilterMode' }, mode); + if(action == 'enable') { + LdapWizard.loginFilter.compose(); + } + } + ); }, toggleRawUserFilter: function() { - LdapWizard.blacklistRemove('ldap_userlist_filter'); - LdapWizard.toggleRawFilter('#rawUserFilterContainer', - '#ldap_userfilter_objectclass', - '#ldap_userfilter_groups', - 'userFilterGroupSelectState', - 'ldapUserFilterMode' - ); - LdapWizard.admin.updateUserTab(LdapWizard.userFilter.getMode()); + LdapWizard.onToggleRawFilterConfirmation( + LdapWizard.userFilter.getMode(), + function(confirmed) { + if(confirmed === true) { + LdapWizard.blacklistRemove('ldap_userlist_filter'); + LdapWizard.toggleRawFilter('#rawUserFilterContainer', + '#ldap_userfilter_objectclass', + '#ldap_userfilter_groups', + 'userFilterGroupSelectState', + 'ldapUserFilterMode' + ); + LdapWizard.admin.updateUserTab(LdapWizard.userFilter.getMode()); + } + } + ); }, updateStatusIndicator: function(isComplete) { From 39aa5868ac970253a1edc3d4fc90763a44c85100 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Oct 2014 14:55:47 +0200 Subject: [PATCH 07/21] rename internal var name to avoid collision --- apps/user_ldap/js/experiencedAdmin.js | 12 ++++++------ apps/user_ldap/js/settings.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/user_ldap/js/experiencedAdmin.js b/apps/user_ldap/js/experiencedAdmin.js index 4b30ed44d00..bd674a37d6c 100644 --- a/apps/user_ldap/js/experiencedAdmin.js +++ b/apps/user_ldap/js/experiencedAdmin.js @@ -13,8 +13,8 @@ */ function ExperiencedAdmin(wizard, initialState) { this.wizard = wizard; - this.isExperienced = initialState; - if(this.isExperienced) { + this._isExperienced = initialState; + if(this._isExperienced) { this.hideEntryCounters(); } } @@ -26,8 +26,8 @@ function ExperiencedAdmin(wizard, initialState) { * @param {boolean} whether the admin is experienced or not */ ExperiencedAdmin.prototype.setExperienced = function(isExperienced) { - this.isExperienced = isExperienced; - if(this.isExperienced) { + this._isExperienced = isExperienced; + if(this._isExperienced) { this.enableRawMode(); this.hideEntryCounters(); } else { @@ -41,7 +41,7 @@ ExperiencedAdmin.prototype.setExperienced = function(isExperienced) { * @return {boolean} whether the admin is experienced or not */ ExperiencedAdmin.prototype.isExperienced = function() { - return this.isExperienced; + return this._isExperienced; }; /** @@ -72,7 +72,7 @@ ExperiencedAdmin.prototype.updateGroupTab = function(mode) { ExperiencedAdmin.prototype._updateTab = function(mode, $countEl) { if(mode === LdapWizard.filterModeAssisted) { $countEl.removeClass('hidden'); - } else if(!this.isExperienced) { + } else if(!this._isExperienced) { $countEl.removeClass('hidden'); } else { $countEl.addClass('hidden'); diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 8ea303302ae..04b4b91d1f1 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -777,7 +777,7 @@ var LdapWizard = { }, onToggleRawFilterConfirmation: function(currentMode, callback) { - if(!LdapWizard.admin.isExperienced + if(!LdapWizard.admin.isExperienced() || currentMode === LdapWizard.filterModeAssisted ) { return callback(true); From ab3535855fef82783faae50286045b644bbf6d79 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Oct 2014 15:04:29 +0200 Subject: [PATCH 08/21] more beautiful white spaces --- apps/user_ldap/lib/configuration.php | 176 +++++++++++++-------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php index 75d3d5ea04d..28e456ae2ef 100644 --- a/apps/user_ldap/lib/configuration.php +++ b/apps/user_ldap/lib/configuration.php @@ -346,52 +346,52 @@ class Configuration { */ public function getDefaults() { return array( - 'ldap_host' => '', - 'ldap_port' => '', - 'ldap_backup_host' => '', - 'ldap_backup_port' => '', - 'ldap_override_main_server' => '', - 'ldap_dn' => '', - 'ldap_agent_password' => '', - 'ldap_base' => '', - 'ldap_base_users' => '', - 'ldap_base_groups' => '', - 'ldap_userlist_filter' => '', - 'ldap_user_filter_mode' => 0, - 'ldap_userfilter_objectclass' => '', - 'ldap_userfilter_groups' => '', - 'ldap_login_filter' => '', - 'ldap_login_filter_mode' => 0, - 'ldap_loginfilter_email' => 0, - 'ldap_loginfilter_username' => 1, - 'ldap_loginfilter_attributes' => '', - 'ldap_group_filter' => '', - 'ldap_group_filter_mode' => 0, - 'ldap_groupfilter_objectclass' => '', - 'ldap_groupfilter_groups' => '', - 'ldap_display_name' => 'displayName', - 'ldap_group_display_name' => 'cn', - 'ldap_tls' => 1, - 'ldap_nocase' => 0, - 'ldap_quota_def' => '', - 'ldap_quota_attr' => '', - 'ldap_email_attr' => '', - 'ldap_group_member_assoc_attribute' => 'uniqueMember', - 'ldap_cache_ttl' => 600, - 'ldap_uuid_user_attribute' => 'auto', - 'ldap_uuid_group_attribute' => 'auto', - 'home_folder_naming_rule' => '', - 'ldap_turn_off_cert_check' => 0, - 'ldap_configuration_active' => 0, - 'ldap_attributes_for_user_search' => '', - 'ldap_attributes_for_group_search' => '', - 'ldap_expert_username_attr' => '', - 'ldap_expert_uuid_user_attr' => '', - 'ldap_expert_uuid_group_attr' => '', - 'has_memberof_filter_support' => 0, - 'last_jpegPhoto_lookup' => 0, - 'ldap_nested_groups' => 0, - 'ldap_paging_size' => 500, + 'ldap_host' => '', + 'ldap_port' => '', + 'ldap_backup_host' => '', + 'ldap_backup_port' => '', + 'ldap_override_main_server' => '', + 'ldap_dn' => '', + 'ldap_agent_password' => '', + 'ldap_base' => '', + 'ldap_base_users' => '', + 'ldap_base_groups' => '', + 'ldap_userlist_filter' => '', + 'ldap_user_filter_mode' => 0, + 'ldap_userfilter_objectclass' => '', + 'ldap_userfilter_groups' => '', + 'ldap_login_filter' => '', + 'ldap_login_filter_mode' => 0, + 'ldap_loginfilter_email' => 0, + 'ldap_loginfilter_username' => 1, + 'ldap_loginfilter_attributes' => '', + 'ldap_group_filter' => '', + 'ldap_group_filter_mode' => 0, + 'ldap_groupfilter_objectclass' => '', + 'ldap_groupfilter_groups' => '', + 'ldap_display_name' => 'displayName', + 'ldap_group_display_name' => 'cn', + 'ldap_tls' => 1, + 'ldap_nocase' => 0, + 'ldap_quota_def' => '', + 'ldap_quota_attr' => '', + 'ldap_email_attr' => '', + 'ldap_group_member_assoc_attribute' => 'uniqueMember', + 'ldap_cache_ttl' => 600, + 'ldap_uuid_user_attribute' => 'auto', + 'ldap_uuid_group_attribute' => 'auto', + 'home_folder_naming_rule' => '', + 'ldap_turn_off_cert_check' => 0, + 'ldap_configuration_active' => 0, + 'ldap_attributes_for_user_search' => '', + 'ldap_attributes_for_group_search' => '', + 'ldap_expert_username_attr' => '', + 'ldap_expert_uuid_user_attr' => '', + 'ldap_expert_uuid_group_attr' => '', + 'has_memberof_filter_support' => 0, + 'last_jpegPhoto_lookup' => 0, + 'ldap_nested_groups' => 0, + 'ldap_paging_size' => 500, 'ldap_experienced_admin' => 0, ); } @@ -402,48 +402,48 @@ class Configuration { public function getConfigTranslationArray() { //TODO: merge them into one representation static $array = array( - 'ldap_host' => 'ldapHost', - 'ldap_port' => 'ldapPort', - 'ldap_backup_host' => 'ldapBackupHost', - 'ldap_backup_port' => 'ldapBackupPort', - 'ldap_override_main_server' => 'ldapOverrideMainServer', - 'ldap_dn' => 'ldapAgentName', - 'ldap_agent_password' => 'ldapAgentPassword', - 'ldap_base' => 'ldapBase', - 'ldap_base_users' => 'ldapBaseUsers', - 'ldap_base_groups' => 'ldapBaseGroups', - 'ldap_userfilter_objectclass' => 'ldapUserFilterObjectclass', - 'ldap_userfilter_groups' => 'ldapUserFilterGroups', - 'ldap_userlist_filter' => 'ldapUserFilter', - 'ldap_user_filter_mode' => 'ldapUserFilterMode', - 'ldap_login_filter' => 'ldapLoginFilter', - 'ldap_login_filter_mode' => 'ldapLoginFilterMode', - 'ldap_loginfilter_email' => 'ldapLoginFilterEmail', - 'ldap_loginfilter_username' => 'ldapLoginFilterUsername', - 'ldap_loginfilter_attributes' => 'ldapLoginFilterAttributes', - 'ldap_group_filter' => 'ldapGroupFilter', - 'ldap_group_filter_mode' => 'ldapGroupFilterMode', - 'ldap_groupfilter_objectclass' => 'ldapGroupFilterObjectclass', - 'ldap_groupfilter_groups' => 'ldapGroupFilterGroups', - 'ldap_display_name' => 'ldapUserDisplayName', - 'ldap_group_display_name' => 'ldapGroupDisplayName', - 'ldap_tls' => 'ldapTLS', - 'ldap_nocase' => 'ldapNoCase', - 'ldap_quota_def' => 'ldapQuotaDefault', - 'ldap_quota_attr' => 'ldapQuotaAttribute', - 'ldap_email_attr' => 'ldapEmailAttribute', - 'ldap_group_member_assoc_attribute' => 'ldapGroupMemberAssocAttr', - 'ldap_cache_ttl' => 'ldapCacheTTL', - 'home_folder_naming_rule' => 'homeFolderNamingRule', - 'ldap_turn_off_cert_check' => 'turnOffCertCheck', - 'ldap_configuration_active' => 'ldapConfigurationActive', - 'ldap_attributes_for_user_search' => 'ldapAttributesForUserSearch', - 'ldap_attributes_for_group_search' => 'ldapAttributesForGroupSearch', - 'ldap_expert_username_attr' => 'ldapExpertUsernameAttr', - 'ldap_expert_uuid_user_attr' => 'ldapExpertUUIDUserAttr', - 'ldap_expert_uuid_group_attr' => 'ldapExpertUUIDGroupAttr', - 'has_memberof_filter_support' => 'hasMemberOfFilterSupport', - 'last_jpegPhoto_lookup' => 'lastJpegPhotoLookup', + 'ldap_host' => 'ldapHost', + 'ldap_port' => 'ldapPort', + 'ldap_backup_host' => 'ldapBackupHost', + 'ldap_backup_port' => 'ldapBackupPort', + 'ldap_override_main_server' => 'ldapOverrideMainServer', + 'ldap_dn' => 'ldapAgentName', + 'ldap_agent_password' => 'ldapAgentPassword', + 'ldap_base' => 'ldapBase', + 'ldap_base_users' => 'ldapBaseUsers', + 'ldap_base_groups' => 'ldapBaseGroups', + 'ldap_userfilter_objectclass' => 'ldapUserFilterObjectclass', + 'ldap_userfilter_groups' => 'ldapUserFilterGroups', + 'ldap_userlist_filter' => 'ldapUserFilter', + 'ldap_user_filter_mode' => 'ldapUserFilterMode', + 'ldap_login_filter' => 'ldapLoginFilter', + 'ldap_login_filter_mode' => 'ldapLoginFilterMode', + 'ldap_loginfilter_email' => 'ldapLoginFilterEmail', + 'ldap_loginfilter_username' => 'ldapLoginFilterUsername', + 'ldap_loginfilter_attributes' => 'ldapLoginFilterAttributes', + 'ldap_group_filter' => 'ldapGroupFilter', + 'ldap_group_filter_mode' => 'ldapGroupFilterMode', + 'ldap_groupfilter_objectclass' => 'ldapGroupFilterObjectclass', + 'ldap_groupfilter_groups' => 'ldapGroupFilterGroups', + 'ldap_display_name' => 'ldapUserDisplayName', + 'ldap_group_display_name' => 'ldapGroupDisplayName', + 'ldap_tls' => 'ldapTLS', + 'ldap_nocase' => 'ldapNoCase', + 'ldap_quota_def' => 'ldapQuotaDefault', + 'ldap_quota_attr' => 'ldapQuotaAttribute', + 'ldap_email_attr' => 'ldapEmailAttribute', + 'ldap_group_member_assoc_attribute' => 'ldapGroupMemberAssocAttr', + 'ldap_cache_ttl' => 'ldapCacheTTL', + 'home_folder_naming_rule' => 'homeFolderNamingRule', + 'ldap_turn_off_cert_check' => 'turnOffCertCheck', + 'ldap_configuration_active' => 'ldapConfigurationActive', + 'ldap_attributes_for_user_search' => 'ldapAttributesForUserSearch', + 'ldap_attributes_for_group_search' => 'ldapAttributesForGroupSearch', + 'ldap_expert_username_attr' => 'ldapExpertUsernameAttr', + 'ldap_expert_uuid_user_attr' => 'ldapExpertUUIDUserAttr', + 'ldap_expert_uuid_group_attr' => 'ldapExpertUUIDGroupAttr', + 'has_memberof_filter_support' => 'hasMemberOfFilterSupport', + 'last_jpegPhoto_lookup' => 'lastJpegPhotoLookup', 'ldap_nested_groups' => 'ldapNestedGroups', 'ldap_paging_size' => 'ldapPagingSize', 'ldap_experienced_admin' => 'ldapExperiencedAdmin' From 02985c9ec5bb4c9f79754ac696d6aec12722436d Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Oct 2014 16:20:52 +0200 Subject: [PATCH 09/21] smaller corrections to make scruitinizer happier, no effective changes --- apps/user_ldap/js/experiencedAdmin.js | 14 ++++++++------ apps/user_ldap/js/ldapFilter.js | 11 ++++++----- apps/user_ldap/js/settings.js | 4 ++-- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/user_ldap/js/experiencedAdmin.js b/apps/user_ldap/js/experiencedAdmin.js index bd674a37d6c..fac8dd6470f 100644 --- a/apps/user_ldap/js/experiencedAdmin.js +++ b/apps/user_ldap/js/experiencedAdmin.js @@ -4,6 +4,8 @@ * See the COPYING-README file. */ +/* global LdapWizard */ + /** * controls behaviour depend on whether the admin is experienced in LDAP or not. * @@ -48,26 +50,26 @@ ExperiencedAdmin.prototype.isExperienced = function() { * switches all LDAP filters from Assisted to Raw mode. */ ExperiencedAdmin.prototype.enableRawMode = function() { - containers = { + var containers = { 'toggleRawGroupFilter': '#rawGroupFilterContainer', 'toggleRawLoginFilter': '#rawLoginFilterContainer', 'toggleRawUserFilter' : '#rawUserFilterContainer' }; - for(method in containers) { + for(var method in containers) { if($(containers[method]).hasClass('invisible')) { this.wizard[method](); } - }; + } }; ExperiencedAdmin.prototype.updateUserTab = function(mode) { this._updateTab(mode, $('#ldap_user_count')); -} +}; ExperiencedAdmin.prototype.updateGroupTab = function(mode) { this._updateTab(mode, $('#ldap_group_count')); -} +}; ExperiencedAdmin.prototype._updateTab = function(mode, $countEl) { if(mode === LdapWizard.filterModeAssisted) { @@ -77,7 +79,7 @@ ExperiencedAdmin.prototype._updateTab = function(mode, $countEl) { } else { $countEl.addClass('hidden'); } -} +}; /** * hide user and group counters, they will be displayed on demand only diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js index 2d3ca8b3691..5b93d81f371 100644 --- a/apps/user_ldap/js/ldapFilter.js +++ b/apps/user_ldap/js/ldapFilter.js @@ -1,6 +1,6 @@ /* global LdapWizard */ -function LdapFilter(target, determineModeCallback) { +function LdapFilter(target, determineModeCallback) { this.locked = true; this.target = false; this.mode = LdapWizard.filterModeAssisted; @@ -14,7 +14,7 @@ function LdapFilter(target, determineModeCallback) { target === 'Group') { this.target = target; } -} +}; LdapFilter.prototype.activate = function() { if(this.activated) { @@ -23,7 +23,7 @@ LdapFilter.prototype.activate = function() { this.activated = true; this.determineMode(); -} +}; LdapFilter.prototype.compose = function(callback) { var action; @@ -111,11 +111,11 @@ LdapFilter.prototype.setMode = function(mode) { if(mode === LdapWizard.filterModeAssisted || mode === LdapWizard.filterModeRaw) { this.mode = mode; } -} +}; LdapFilter.prototype.getMode = function() { return this.mode; -} +}; LdapFilter.prototype.unlock = function() { this.locked = false; @@ -129,6 +129,7 @@ LdapFilter.prototype.findFeatures = function() { //TODO: reset this.foundFeatures when any base DN changes if(!this.foundFeatures && !this.locked && this.mode === LdapWizard.filterModeAssisted) { this.foundFeatures = true; + var objcEl, avgrEl; if(this.target === 'User') { objcEl = 'ldap_userfilter_objectclass'; avgrEl = 'ldap_userfilter_groups'; diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 04b4b91d1f1..f5b8081497f 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -694,8 +694,8 @@ var LdapWizard = { values = values + "\n" + resultObj[i].value; } LdapWizard._save($('#'+originalObj)[0], $.trim(values)); - if(originalObj == 'ldap_userfilter_objectclass' - || originalObj == 'ldap_userfilter_groups') { + if(originalObj === 'ldap_userfilter_objectclass' + || originalObj === 'ldap_userfilter_groups') { LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute); //when user filter is changed afterwards, login filter needs to //be adjusted, too From 9f036e776ef40553845c47dacaae0d5af02383c9 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 9 Oct 2014 11:15:56 +0200 Subject: [PATCH 10/21] bump version --- apps/user_ldap/appinfo/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/user_ldap/appinfo/version b/apps/user_ldap/appinfo/version index 17b2ccd9bf9..6f2743d65dc 100644 --- a/apps/user_ldap/appinfo/version +++ b/apps/user_ldap/appinfo/version @@ -1 +1 @@ -0.4.3 +0.4.4 From 2cf01027976117cab824a54971a7b97e4c8e0b9d Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 9 Oct 2014 17:17:50 +0200 Subject: [PATCH 11/21] fix triggering of group update counts. improves the basic code which is also responsible for user counts. i did not find regressions, please doublecheck --- apps/user_ldap/js/ldapFilter.js | 19 +++++++++---------- apps/user_ldap/js/settings.js | 10 ++++++---- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js index 5b93d81f371..6b62604efb7 100644 --- a/apps/user_ldap/js/ldapFilter.js +++ b/apps/user_ldap/js/ldapFilter.js @@ -14,7 +14,7 @@ function LdapFilter(target, determineModeCallback) { target === 'Group') { this.target = target; } -}; +} LdapFilter.prototype.activate = function() { if(this.activated) { @@ -33,6 +33,11 @@ LdapFilter.prototype.compose = function(callback) { return false; } + if(this.mode === LdapWizard.filterModeRaw) { + //Raw filter editing, i.e. user defined filter, don't compose + return; + } + if(this.target === 'User') { action = 'getUserListFilter'; } else if(this.target === 'Login') { @@ -41,11 +46,6 @@ LdapFilter.prototype.compose = function(callback) { action = 'getGroupFilter'; } - if(!$('#raw'+this.target+'FilterContainer').hasClass('invisible')) { - //Raw filter editing, i.e. user defined filter, don't compose - return; - } - var param = 'action='+action+ '&ldap_serverconfig_chooser='+ encodeURIComponent($('#ldap_serverconfig_chooser').val()); @@ -55,10 +55,9 @@ LdapFilter.prototype.compose = function(callback) { LdapWizard.ajax(param, function(result) { LdapWizard.applyChanges(result); - if(filter.target === 'User') { - LdapWizard.countUsers(); - } else if(filter.target === 'Group') { - LdapWizard.countGroups(); + console.log(filter.mode); + filter.updateCount(); + if(filter.target === 'Group') { LdapWizard.detectGroupMemberAssoc(); } if(typeof callback !== 'undefined') { diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index f5b8081497f..be643c81b4b 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -542,7 +542,6 @@ var LdapWizard = { initGroupFilter: function() { LdapWizard.groupFilter.activate(); - LdapWizard.countGroups(); }, /** init login filter tab section **/ @@ -576,6 +575,9 @@ var LdapWizard = { instantiateFilters: function() { delete LdapWizard.userFilter; LdapWizard.userFilter = new LdapFilter('User', function(mode) { + if(mode === LdapWizard.filterModeAssisted) { + LdapWizard.groupFilter.updateCount(); + } LdapWizard.userFilter.findFeatures(); }); $('#rawUserFilterContainer .ldapGetEntryCount').click(function(event) { @@ -593,6 +595,9 @@ var LdapWizard = { delete LdapWizard.groupFilter; LdapWizard.groupFilter = new LdapFilter('Group', function(mode) { + if(mode === LdapWizard.filterModeAssisted) { + LdapWizard.groupFilter.updateCount(); + } LdapWizard.groupFilter.findFeatures(); }); $('#rawGroupFilterContainer .ldapGetEntryCount').click(function(event) { @@ -617,7 +622,6 @@ var LdapWizard = { if(LdapWizard.userFilterObjectClassesHasRun && LdapWizard.userFilterAvailableGroupsHasRun) { LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute); - LdapWizard.countUsers(); } }, @@ -657,10 +661,8 @@ var LdapWizard = { } if(triggerObj.id == 'ldap_userlist_filter' && !LdapWizard.admin.isExperienced()) { - LdapWizard.countUsers(); LdapWizard.detectEmailAttribute(); } else if(triggerObj.id == 'ldap_group_filter' && !LdapWizard.admin.isExperienced()) { - LdapWizard.countGroups(); LdapWizard.detectGroupMemberAssoc(); } From 6f83b537fe17bba29b13f8052506e63ed3dbfa9a Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 9 Oct 2014 17:56:27 +0200 Subject: [PATCH 12/21] remove debug output --- apps/user_ldap/js/ldapFilter.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js index 6b62604efb7..7fcf8bfb28b 100644 --- a/apps/user_ldap/js/ldapFilter.js +++ b/apps/user_ldap/js/ldapFilter.js @@ -55,7 +55,6 @@ LdapFilter.prototype.compose = function(callback) { LdapWizard.ajax(param, function(result) { LdapWizard.applyChanges(result); - console.log(filter.mode); filter.updateCount(); if(filter.target === 'Group') { LdapWizard.detectGroupMemberAssoc(); From f31d4caf57c46d648180184868d92f4780ba4b35 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 10 Oct 2014 11:49:45 +0200 Subject: [PATCH 13/21] coding style, no effective code changes --- apps/user_ldap/js/settings.js | 48 +++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index be643c81b4b..5c696000f5c 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -122,7 +122,7 @@ var LdapConfiguration = { OC.filePath('user_ldap','ajax','clearMappings.php'), 'ldap_clear_mapping='+encodeURIComponent(mappingSubject), function(result) { - if(result.status == 'success') { + if(result.status === 'success') { OC.dialogs.info( t('user_ldap', 'mappings cleared'), t('user_ldap', 'Success') @@ -154,7 +154,7 @@ var LdapWizard = { OC.filePath('user_ldap','ajax','wizard.php'), param, function(result) { - if(result.status == 'success') { + if(result.status === 'success') { fnOnSuccess(result); } else { fnOnError(result); @@ -164,7 +164,7 @@ var LdapWizard = { }, applyChanges: function (result) { - for (id in result.changes) { + for (var id in result.changes) { LdapWizard.blacklistAdd(id); if(id.indexOf('count') > 0) { $('#'+id).text(result.changes[id]); @@ -200,7 +200,7 @@ var LdapWizard = { blacklistAdd: function(id) { obj = $('#'+id); - if(!(obj[0].hasOwnProperty('multiple') && obj[0]['multiple'] == true)) { + if(!(obj[0].hasOwnProperty('multiple') && obj[0]['multiple'] === true)) { //no need to blacklist multiselect LdapWizard.saveBlacklist[id] = true; return true; @@ -375,7 +375,7 @@ var LdapWizard = { LdapWizard.ajax(param, function(result) { $('#ldap_loginfilter_attributes').find('option').remove(); - for (i in result.options['ldap_loginfilter_attributes']) { + for (var i in result.options['ldap_loginfilter_attributes']) { //FIXME: move HTML into template attr = result.options['ldap_loginfilter_attributes'][i]; $('#ldap_loginfilter_attributes').append( @@ -411,7 +411,7 @@ var LdapWizard = { LdapWizard.ajax(param, function(result) { $('#'+multisel).find('option').remove(); - for (i in result.options[multisel]) { + for (var i in result.options[multisel]) { //FIXME: move HTML into template objc = result.options[multisel][i]; $('#'+multisel).append(""); @@ -438,7 +438,7 @@ var LdapWizard = { function (result) { LdapWizard.hideSpinner('#'+multisel); $('#'+multisel).multiselect('disable'); - if(type == 'Users') { + if(type === 'Users') { LdapWizard.userFilterAvailableGroupsHasRun = true; LdapWizard.postInitUserFilter(); } @@ -447,7 +447,7 @@ var LdapWizard = { }, findObjectClasses: function(multisel, type) { - if(type != 'User' && type != 'Group') { + if(type !== 'User' && type !== 'Group') { return false; } param = 'action=determine'+encodeURIComponent(type)+'ObjectClasses'+ @@ -458,7 +458,7 @@ var LdapWizard = { LdapWizard.ajax(param, function(result) { $('#'+multisel).find('option').remove(); - for (i in result.options[multisel]) { + for (var i in result.options[multisel]) { //FIXME: move HTML into template objc = result.options[multisel][i]; $('#'+multisel).append(""); @@ -479,7 +479,7 @@ var LdapWizard = { }, function (result) { LdapWizard.hideSpinner('#'+multisel); - if(type == 'User') { + if(type === 'User') { LdapWizard.userFilterObjectClassesHasRun = true; LdapWizard.postInitUserFilter(); } @@ -649,10 +649,10 @@ var LdapWizard = { processChanges: function(triggerObj) { LdapWizard.hideInfoBox(); - if(triggerObj.id == 'ldap_host' - || triggerObj.id == 'ldap_port' - || triggerObj.id == 'ldap_dn' - || triggerObj.id == 'ldap_agent_password') { + if(triggerObj.id === 'ldap_host' + || triggerObj.id === 'ldap_port' + || triggerObj.id === 'ldap_dn' + || triggerObj.id === 'ldap_agent_password') { LdapWizard.checkPort(); if($('#ldap_port').val()) { //if Port is already set, check BaseDN @@ -660,14 +660,14 @@ var LdapWizard = { } } - if(triggerObj.id == 'ldap_userlist_filter' && !LdapWizard.admin.isExperienced()) { + if(triggerObj.id === 'ldap_userlist_filter' && !LdapWizard.admin.isExperienced()) { LdapWizard.detectEmailAttribute(); - } else if(triggerObj.id == 'ldap_group_filter' && !LdapWizard.admin.isExperienced()) { + } else if(triggerObj.id === 'ldap_group_filter' && !LdapWizard.admin.isExperienced()) { LdapWizard.detectGroupMemberAssoc(); } - if(triggerObj.id == 'ldap_loginfilter_username' - || triggerObj.id == 'ldap_loginfilter_email') { + if(triggerObj.id === 'ldap_loginfilter_username' + || triggerObj.id === 'ldap_loginfilter_email') { LdapWizard.loginFilter.compose(); } @@ -705,10 +705,10 @@ var LdapWizard = { LdapWizard.initLoginFilter(); } LdapWizard.loginFilter.compose(); - } else if(originalObj == 'ldap_loginfilter_attributes') { + } else if(originalObj === 'ldap_loginfilter_attributes') { LdapWizard.loginFilter.compose(); - } else if(originalObj == 'ldap_groupfilter_objectclass' - || originalObj == 'ldap_groupfilter_groups') { + } else if(originalObj === 'ldap_groupfilter_objectclass' + || originalObj === 'ldap_groupfilter_groups') { LdapWizard.groupFilter.compose(); } }, @@ -723,7 +723,7 @@ var LdapWizard = { OC.filePath('user_ldap','ajax','wizard.php'), param, function(result) { - if(result.status == 'success') { + if(result.status === 'success') { LdapWizard.processChanges(object); } else { // alert('Oooooooooooh :('); @@ -754,7 +754,7 @@ var LdapWizard = { filter.setMode(LdapWizard.filterModeRaw); $(container).removeClass('invisible'); $(moc).multiselect('disable'); - if($(mg).multiselect().attr('disabled') == 'disabled') { + if($(mg).multiselect().attr('disabled') === 'disabled') { LdapWizard[stateVar] = 'disable'; } else { LdapWizard[stateVar] = 'enable'; @@ -839,7 +839,7 @@ var LdapWizard = { $('#ldap_loginfilter_email').prop('disabled', property); $('#ldap_loginfilter_username').prop('disabled', property); LdapWizard._save({ id: 'ldapLoginFilterMode' }, mode); - if(action == 'enable') { + if(action === 'enable') { LdapWizard.loginFilter.compose(); } } From ea7975ac8ba94b3dfcd3f61ff74847de97a881b4 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 10 Oct 2014 13:30:03 +0200 Subject: [PATCH 14/21] always abort running ajax request when the method is fired up again --- apps/user_ldap/js/settings.js | 40 ++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 5c696000f5c..75a4830b28e 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -148,9 +148,15 @@ var LdapWizard = { userFilter: false, loginFilter: false, groupFilter: false, + ajaxRequests: {}, - ajax: function(param, fnOnSuccess, fnOnError) { - $.post( + ajax: function(param, fnOnSuccess, fnOnError, reqID) { + if(reqID !== undefined) { + if(LdapWizard.ajaxRequests.hasOwnProperty(reqID)) { + LdapWizard.ajaxRequests[reqID].abort(); + } + } + var request = $.post( OC.filePath('user_ldap','ajax','wizard.php'), param, function(result) { @@ -161,6 +167,9 @@ var LdapWizard = { } } ); + if(reqID !== undefined) { + LdapWizard.ajaxRequests[reqID] = request; + } }, applyChanges: function (result) { @@ -244,7 +253,8 @@ var LdapWizard = { LdapWizard.showInfoBox(t('user_ldap', 'Please specify a Base DN')); LdapWizard.showInfoBox(t('user_ldap', 'Could not determine Base DN')); $('#ldap_base').prop('disabled', false); - } + }, + 'guessBaseDN' ); } }, @@ -274,7 +284,8 @@ var LdapWizard = { LdapWizard.hideSpinner('#ldap_port'); $('#ldap_port').prop('disabled', false); LdapWizard.showInfoBox(t('user_ldap', 'Please specify the port')); - } + }, + 'guessPortAndTLS' ); } }, @@ -323,7 +334,7 @@ var LdapWizard = { encodeURIComponent($('#ldap_serverconfig_chooser').val()); LdapWizard.showSpinner(spinnerID); - LdapWizard.ajax(param, + var request = LdapWizard.ajax(param, function(result) { LdapWizard.applyChanges(result); LdapWizard.hideSpinner(spinnerID); @@ -331,7 +342,8 @@ var LdapWizard = { function (result) { OC.Notification.show('Counting the entries failed with, ' + result.message); LdapWizard.hideSpinner(spinnerID); - } + }, + method ); }, @@ -348,7 +360,7 @@ var LdapWizard = { '&ldap_serverconfig_chooser='+ encodeURIComponent($('#ldap_serverconfig_chooser').val()); //runs in the background, no callbacks necessary - LdapWizard.ajax(param, LdapWizard.applyChanges, function(){}); + LdapWizard.ajax(param, LdapWizard.applyChanges, function(){}, 'detectEmailAttribute'); }, detectGroupMemberAssoc: function() { @@ -362,7 +374,8 @@ var LdapWizard = { }, function (result) { // error handling - } + }, + 'determineGroupMemberAssoc' ); }, @@ -395,12 +408,13 @@ var LdapWizard = { {noneSelectedText : 'No attributes found'}); $('#ldap_loginfilter_attributes').multiselect('disable'); LdapWizard.hideSpinner('#ldap_loginfilter_attributes'); - } + }, + 'determineAttributes' ); }, findAvailableGroups: function(multisel, type) { - if(type != 'Users' && type != 'Groups') { + if(type !== 'Users' && type !== 'Groups') { return false; } param = 'action=determineGroupsFor'+encodeURIComponent(type)+ @@ -442,7 +456,8 @@ var LdapWizard = { LdapWizard.userFilterAvailableGroupsHasRun = true; LdapWizard.postInitUserFilter(); } - } + }, + 'findAvailableGroupsFor' + type ); }, @@ -484,7 +499,8 @@ var LdapWizard = { LdapWizard.postInitUserFilter(); } //TODO: error handling - } + }, + 'determine' + type + 'ObjectClasses' ); }, From 836f0839e53baa7c7d8561dec1bf0d36813c715d Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 10 Oct 2014 13:41:32 +0200 Subject: [PATCH 15/21] show a spinner next to test filter button when the test is running --- apps/user_ldap/js/ldapFilter.js | 6 +++--- apps/user_ldap/js/settings.js | 32 +++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js index 7fcf8bfb28b..bb66c1df2ee 100644 --- a/apps/user_ldap/js/ldapFilter.js +++ b/apps/user_ldap/js/ldapFilter.js @@ -145,10 +145,10 @@ LdapFilter.prototype.findFeatures = function() { } }; -LdapFilter.prototype.updateCount = function() { +LdapFilter.prototype.updateCount = function(doneCallback) { if(this.target === 'User') { - LdapWizard.countUsers(); + LdapWizard.countUsers(doneCallback); } else if (this.target === 'Group') { - LdapWizard.countGroups(); + LdapWizard.countGroups(doneCallback); } }; diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 75a4830b28e..6e936a91091 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -328,7 +328,7 @@ var LdapWizard = { } }, - _countThings: function(method, spinnerID) { + _countThings: function(method, spinnerID, doneCallback) { param = 'action='+method+ '&ldap_serverconfig_chooser='+ encodeURIComponent($('#ldap_serverconfig_chooser').val()); @@ -338,21 +338,27 @@ var LdapWizard = { function(result) { LdapWizard.applyChanges(result); LdapWizard.hideSpinner(spinnerID); + if(doneCallback !== undefined) { + doneCallback(method); + } }, function (result) { OC.Notification.show('Counting the entries failed with, ' + result.message); LdapWizard.hideSpinner(spinnerID); + if(doneCallback !== undefined) { + doneCallback(method); + } }, method ); }, - countGroups: function() { - LdapWizard._countThings('countGroups', '#ldap_group_count'); + countGroups: function(doneCallback) { + LdapWizard._countThings('countGroups', '#ldap_group_count', doneCallback); }, - countUsers: function() { - LdapWizard._countThings('countUsers', '#ldap_user_count'); + countUsers: function(doneCallback) { + LdapWizard._countThings('countUsers', '#ldap_user_count', doneCallback); }, detectEmailAttribute: function() { @@ -586,6 +592,16 @@ var LdapWizard = { }); }, + hideTestSpinner:function (countMethod) { + var selector; + if(countMethod === 'countUsers') { + selector = '#rawUserFilterContainer .ldapGetEntryCount'; + } else { + selector = '#rawGroupFilterContainer .ldapGetEntryCount'; + } + LdapWizard.hideSpinner(selector); + }, + /** init user filter tab section **/ instantiateFilters: function() { @@ -599,7 +615,8 @@ var LdapWizard = { $('#rawUserFilterContainer .ldapGetEntryCount').click(function(event) { event.preventDefault(); $('#ldap_user_count').text(''); - LdapWizard.userFilter.updateCount(); + LdapWizard.showSpinner('#rawUserFilterContainer .ldapGetEntryCount'); + LdapWizard.userFilter.updateCount(LdapWizard.hideTestSpinner); LdapWizard.detectEmailAttribute(); $('#ldap_user_count').removeClass('hidden'); }); @@ -619,7 +636,8 @@ var LdapWizard = { $('#rawGroupFilterContainer .ldapGetEntryCount').click(function(event) { event.preventDefault(); $('#ldap_group_count').text(''); - LdapWizard.groupFilter.updateCount(); + LdapWizard.showSpinner('#rawGroupFilterContainer .ldapGetEntryCount'); + LdapWizard.groupFilter.updateCount(LdapWizard.hideTestSpinner); LdapWizard.detectGroupMemberAssoc(); $('#ldap_group_count').removeClass('hidden'); }); From c26e9c675aa6c7fec64f63349c6f25ddbe264d7a Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 14 Oct 2014 17:39:27 +0200 Subject: [PATCH 16/21] show Spinner when stuff is being saved --- apps/user_ldap/css/settings.css | 8 ++++++++ apps/user_ldap/js/settings.js | 9 ++++++++- apps/user_ldap/templates/part.wizardcontrols.php | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index 0dfcf474256..2353bfe1bfd 100644 --- a/apps/user_ldap/css/settings.css +++ b/apps/user_ldap/css/settings.css @@ -123,6 +123,14 @@ select[multiple=multiple] + button { max-width: 40%; } +#ldap .ldap_saving { + margin-right: 15px; + color: orange; + font-weight: bold; +} + +#ldap .ldap_saving img { height: 15px; } + .ldap_config_state_indicator_sign { display: inline-block; height: 16px; diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 6e936a91091..1972447970f 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -747,7 +747,10 @@ var LdapWizard = { } }, + saveProcesses: 0, _save: function(object, value) { + $('#ldap .ldap_saving').removeClass('hidden'); + LdapWizard.saveProcesses += 1; param = 'cfgkey='+encodeURIComponent(object.id)+ '&cfgval='+encodeURIComponent(value)+ '&action=save'+ @@ -757,10 +760,14 @@ var LdapWizard = { OC.filePath('user_ldap','ajax','wizard.php'), param, function(result) { + LdapWizard.saveProcesses -= 1; + if(LdapWizard.saveProcesses === 0) { + $('#ldap .ldap_saving').addClass('hidden'); + } if(result.status === 'success') { LdapWizard.processChanges(object); } else { -// alert('Oooooooooooh :('); + console.log('Could not save value for ' + object.id); } } ); diff --git a/apps/user_ldap/templates/part.wizardcontrols.php b/apps/user_ldap/templates/part.wizardcontrols.php index 33e1614c9c6..90d558e72d1 100644 --- a/apps/user_ldap/templates/part.wizardcontrols.php +++ b/apps/user_ldap/templates/part.wizardcontrols.php @@ -1,4 +1,5 @@
+