diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php index 1e706ce869..5fad23de4f 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( diff --git a/apps/user_ldap/appinfo/version b/apps/user_ldap/appinfo/version index 17b2ccd9bf..6f2743d65d 100644 --- a/apps/user_ldap/appinfo/version +++ b/apps/user_ldap/appinfo/version @@ -1 +1 @@ -0.4.3 +0.4.4 diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index 3051cc8058..8f339451c6 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; } @@ -77,6 +82,10 @@ margin: 5px; } +.ldap_count { + line-height: 45px; +} + .ldapSettingControls { margin-top: 3px; } @@ -103,6 +112,10 @@ vertical-align: bottom; } +#ldap input[type=checkbox] { + width: 15px !important; +} + select[multiple=multiple] + button { height: 28px; padding-top: 6px !important; @@ -110,6 +123,18 @@ select[multiple=multiple] + button { max-width: 40%; } +.save-cursor { + cursor: wait; +} + +#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/experiencedAdmin.js b/apps/user_ldap/js/experiencedAdmin.js new file mode 100644 index 0000000000..fac8dd6470 --- /dev/null +++ b/apps/user_ldap/js/experiencedAdmin.js @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2014, Arthur Schiwon + * This file is licensed under the Affero General Public License version 3 or later. + * See the COPYING-README file. + */ + +/* global LdapWizard */ + +/** + * 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 = initialState; + if(this._isExperienced) { + this.hideEntryCounters(); + } +} + + +/** + * toggles whether the admin is an experienced one or not + * + * @param {boolean} whether the admin is experienced or not + */ +ExperiencedAdmin.prototype.setExperienced = function(isExperienced) { + this._isExperienced = isExperienced; + if(this._isExperienced) { + this.enableRawMode(); + this.hideEntryCounters(); + } else { + this.showEntryCounters(); + } +}; + +/** +* 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() { + var containers = { + 'toggleRawGroupFilter': '#rawGroupFilterContainer', + 'toggleRawLoginFilter': '#rawLoginFilterContainer', + 'toggleRawUserFilter' : '#rawUserFilterContainer' + }; + + 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) { + $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 e9f60e7ba3..bb66c1df2e 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; @@ -22,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') { @@ -30,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()); @@ -44,10 +55,8 @@ 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(); + filter.updateCount(); + if(filter.target === 'Group') { LdapWizard.detectGroupMemberAssoc(); } if(typeof callback !== 'undefined') { @@ -82,6 +91,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 +100,21 @@ 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.getMode = function() { + return this.mode; +}; + LdapFilter.prototype.unlock = function() { this.locked = false; if(this.lazyRunCompose) { @@ -101,3 +122,33 @@ LdapFilter.prototype.unlock = function() { this.compose(); } }; + +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'; + } 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"); + } +}; + +LdapFilter.prototype.updateCount = function(doneCallback) { + if(this.target === 'User') { + LdapWizard.countUsers(doneCallback); + } else if (this.target === 'Group') { + LdapWizard.countGroups(doneCallback); + } +}; diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index fd84ca1980..1627528200 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') @@ -148,23 +148,32 @@ 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) { - if(result.status == 'success') { + if(result.status === 'success') { fnOnSuccess(result); } else { fnOnError(result); } } ); + if(reqID !== undefined) { + LdapWizard.ajaxRequests[reqID] = request; + } }, 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]); @@ -179,28 +188,41 @@ var LdapWizard = { } }, + enableTabs: function() { + //do not use this function directly, use basicStatusCheck instead. + if(LdapWizard.saveProcesses === 0) { + $('.ldap_action_continue').removeAttr('disabled'); + $('.ldap_action_back').removeAttr('disabled'); + $('#ldapSettings').tabs('option', 'disabled', []); + } + }, + + disableTabs: function() { + $('.ldap_action_continue').attr('disabled', 'disabled'); + $('.ldap_action_back').attr('disabled', 'disabled'); + $('#ldapSettings').tabs('option', 'disabled', [1, 2, 3, 4, 5]); + }, + basicStatusCheck: function() { //criterias to continue from the first tab // - host, port, user filter, agent dn, password, base dn - host = $('#ldap_host').val(); - port = $('#ldap_port').val(); - agent = $('#ldap_dn').val(); - pwd = $('#ldap_agent_password').val(); - base = $('#ldap_base').val(); + var host = $('#ldap_host').val(); + var port = $('#ldap_port').val(); + var agent = $('#ldap_dn').val(); + var pwd = $('#ldap_agent_password').val(); + var base = $('#ldap_base').val(); if((host && port && base) && ((!agent && !pwd) || (agent && pwd))) { - $('.ldap_action_continue').removeAttr('disabled'); - $('#ldapSettings').tabs('option', 'disabled', []); + LdapWizard.enableTabs(); } else { - $('.ldap_action_continue').attr('disabled', 'disabled'); - $('#ldapSettings').tabs('option', 'disabled', [1, 2, 3, 4, 5]); + LdapWizard.disableTabs(); } }, 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; @@ -244,7 +266,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 +297,8 @@ var LdapWizard = { LdapWizard.hideSpinner('#ldap_port'); $('#ldap_port').prop('disabled', false); LdapWizard.showInfoBox(t('user_ldap', 'Please specify the port')); - } + }, + 'guessPortAndTLS' ); } }, @@ -317,27 +341,37 @@ var LdapWizard = { } }, - _countThings: function(method) { + _countThings: function(method, spinnerID, doneCallback) { param = 'action='+method+ '&ldap_serverconfig_chooser='+ encodeURIComponent($('#ldap_serverconfig_chooser').val()); - LdapWizard.ajax(param, + LdapWizard.showSpinner(spinnerID); + var request = LdapWizard.ajax(param, function(result) { LdapWizard.applyChanges(result); + LdapWizard.hideSpinner(spinnerID); + if(doneCallback !== undefined) { + doneCallback(method); + } }, function (result) { - // error handling - } + OC.Notification.show('Counting the entries failed with, ' + result.message); + LdapWizard.hideSpinner(spinnerID); + if(doneCallback !== undefined) { + doneCallback(method); + } + }, + method ); }, - countGroups: function() { - LdapWizard._countThings('countGroups'); + countGroups: function(doneCallback) { + LdapWizard._countThings('countGroups', '#ldap_group_count', doneCallback); }, - countUsers: function() { - LdapWizard._countThings('countUsers'); + countUsers: function(doneCallback) { + LdapWizard._countThings('countUsers', '#ldap_user_count', doneCallback); }, detectEmailAttribute: function() { @@ -345,7 +379,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() { @@ -359,7 +393,8 @@ var LdapWizard = { }, function (result) { // error handling - } + }, + 'determineGroupMemberAssoc' ); }, @@ -372,7 +407,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( @@ -392,12 +427,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)+ @@ -408,7 +444,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(""); @@ -435,16 +471,17 @@ var LdapWizard = { function (result) { LdapWizard.hideSpinner('#'+multisel); $('#'+multisel).multiselect('disable'); - if(type == 'Users') { + if(type === 'Users') { LdapWizard.userFilterAvailableGroupsHasRun = true; LdapWizard.postInitUserFilter(); } - } + }, + 'findAvailableGroupsFor' + type ); }, findObjectClasses: function(multisel, type) { - if(type != 'User' && type != 'Group') { + if(type !== 'User' && type !== 'Group') { return false; } param = 'action=determine'+encodeURIComponent(type)+'ObjectClasses'+ @@ -455,7 +492,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(""); @@ -476,12 +513,13 @@ var LdapWizard = { }, function (result) { LdapWizard.hideSpinner('#'+multisel); - if(type == 'User') { + if(type === 'User') { LdapWizard.userFilterObjectClassesHasRun = true; LdapWizard.postInitUserFilter(); } //TODO: error handling - } + }, + 'determine' + type + 'ObjectClasses' ); }, @@ -530,23 +568,21 @@ var LdapWizard = { isConfigurationActiveControlLocked: true, init: function() { + LdapWizard.instantiateFilters(); + LdapWizard.admin.setExperienced($('#ldap_experienced_admin').is(':checked')); 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.countGroups(); + LdapWizard.groupFilter.activate(); }, /** init login filter tab section **/ initLoginFilter: function() { - LdapWizard.loginFilter = new LdapFilter('Login'); - LdapWizard.findAttributes(); + LdapWizard.loginFilter.activate(); }, postInitLoginFilter: function() { @@ -569,30 +605,80 @@ 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() { + 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) { + event.preventDefault(); + $('#ldap_user_count').text(''); + LdapWizard.showSpinner('#rawUserFilterContainer .ldapGetEntryCount'); + LdapWizard.userFilter.updateCount(LdapWizard.hideTestSpinner); + LdapWizard.detectEmailAttribute(); + $('#ldap_user_count').removeClass('hidden'); + }); + + delete LdapWizard.loginFilter; + LdapWizard.loginFilter = new LdapFilter('Login', function(mode) { + LdapWizard.loginFilter.findFeatures(); + }); + + 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) { + event.preventDefault(); + $('#ldap_group_count').text(''); + LdapWizard.showSpinner('#rawGroupFilterContainer .ldapGetEntryCount'); + LdapWizard.groupFilter.updateCount(LdapWizard.hideTestSpinner); + LdapWizard.detectGroupMemberAssoc(); + $('#ldap_group_count').removeClass('hidden'); + }); + }, + 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() { if(LdapWizard.userFilterObjectClassesHasRun && LdapWizard.userFilterAvailableGroupsHasRun) { LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute); - LdapWizard.countUsers(); } }, /** end of init user filter tab section **/ onTabChange: function(event, ui) { + if(LdapWizard.saveProcesses > 0) { + //do not allow to switch tabs as long as a save process is active + return false; + } newTabIndex = 0; if(ui.newTab[0].id === '#ldapWizard2') { LdapWizard.initUserFilter(); @@ -614,10 +700,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 @@ -625,16 +711,14 @@ var LdapWizard = { } } - if(triggerObj.id == 'ldap_userlist_filter') { - LdapWizard.countUsers(); + if(triggerObj.id === 'ldap_userlist_filter' && !LdapWizard.admin.isExperienced()) { LdapWizard.detectEmailAttribute(); - } else if(triggerObj.id == 'ldap_group_filter') { - LdapWizard.countGroups(); + } 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(); } @@ -663,8 +747,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 @@ -672,15 +756,19 @@ 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(); } }, + saveProcesses: 0, _save: function(object, value) { + $('#ldap .ldap_saving').removeClass('hidden'); + LdapWizard.saveProcesses += 1; + $('#ldap *').addClass('save-cursor'); param = 'cfgkey='+encodeURIComponent(object.id)+ '&cfgval='+encodeURIComponent(value)+ '&action=save'+ @@ -690,10 +778,15 @@ var LdapWizard = { OC.filePath('user_ldap','ajax','wizard.php'), param, function(result) { - if(result.status == 'success') { + LdapWizard.saveProcesses -= 1; + if(LdapWizard.saveProcesses === 0) { + $('#ldap .ldap_saving').addClass('hidden'); + $('#ldap *').removeClass('save-cursor'); + } + if(result.status === 'success') { LdapWizard.processChanges(object); } else { -// alert('Oooooooooooh :('); + console.log('Could not save value for ' + object.id); } } ); @@ -713,12 +806,15 @@ 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') { + if($(mg).multiselect().attr('disabled') === 'disabled') { LdapWizard[stateVar] = 'disable'; } else { LdapWizard[stateVar] = 'enable'; @@ -726,11 +822,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 { @@ -740,47 +838,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.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; - } - $('#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.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) { @@ -837,6 +978,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); @@ -931,4 +1073,10 @@ $(document).ready(function() { LdapConfiguration.refreshConfig(); } }); + + expAdminCB = $('#ldap_experienced_admin'); + LdapWizard.admin = new ExperiencedAdmin(LdapWizard, expAdminCB.is(':checked')); + expAdminCB.change(function() { + LdapWizard.admin.setExperienced($(this).is(':checked')); + }); }); diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php index 4cb00561b3..28e456ae2e 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, @@ -345,52 +346,53 @@ 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, ); } @@ -400,50 +402,51 @@ 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' ); return $array; } diff --git a/apps/user_ldap/settings.php b/apps/user_ldap/settings.php index e7cdd0d926..1e588b1cd8 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'); diff --git a/apps/user_ldap/templates/part.wizard-groupfilter.php b/apps/user_ldap/templates/part.wizard-groupfilter.php index e460997b1b..1953d2eaa6 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-server.php b/apps/user_ldap/templates/part.wizard-server.php index bee2b87417..c1744143f9 100644 --- a/apps/user_ldap/templates/part.wizard-server.php +++ b/apps/user_ldap/templates/part.wizard-server.php @@ -69,6 +69,16 @@ +
+ + +
+
diff --git a/apps/user_ldap/templates/part.wizard-userfilter.php b/apps/user_ldap/templates/part.wizard-userfilter.php index eff9f89ce2..99a6e75370 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 + diff --git a/apps/user_ldap/templates/part.wizardcontrols.php b/apps/user_ldap/templates/part.wizardcontrols.php index 33e1614c9c..90d558e72d 100644 --- a/apps/user_ldap/templates/part.wizardcontrols.php +++ b/apps/user_ldap/templates/part.wizardcontrols.php @@ -1,4 +1,5 @@
+