[Pkg-owncloud-commits] [owncloud] 13/46: backport of #11478

David Prévot taffit at moszumanska.debian.org
Fri Oct 24 15:11:41 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository owncloud.

commit ada93bab0cd0cdb14a66b2ebdecba68c26a1107e
Author: Arthur Schiwon <blizzz at owncloud.com>
Date:   Tue Oct 7 16:29:06 2014 +0200

    backport of #11478
    
    add checkbox for experienced users to server tab
    
    must be empty not auto
    
    sets user filters to raw mode when marking user as experienced
    
    Objectlasses, Groups and Attributes are now loaded only in assisted mode and only once
    
    user and group counts are only upated on demand in experienced mode
    
    confirmation before switching to assisted mode when admin is experienced
    
    rename internal var name to avoid collision
    
    more beautiful white spaces
    
    smaller corrections to make scruitinizer happier, no effective changes
    
    bump version
    
    fix triggering of group update counts. improves the basic code which is also responsible for user counts. i did not find regressions, please doublecheck
    
    remove debug output
    
    coding style, no effective code changes
    
    always abort running ajax request when the method is fired up again
    
    show a spinner next to test filter button when the test is running
    
    show Spinner when stuff is being saved
    
    show busy cursor and lock tabs on save
    
    instead of dis/enabling tabs on save, cancel tab change. avoids noisy ui
    
    remove debug output
    
    rephrase xp'ed user mode label
    
    left-align checkbox on server tab
---
 apps/user_ldap/appinfo/update.php                  |   4 +-
 apps/user_ldap/appinfo/version                     |   2 +-
 apps/user_ldap/css/settings.css                    |  25 ++
 apps/user_ldap/js/experiencedAdmin.js              | 100 ++++++
 apps/user_ldap/js/ldapFilter.js                    |  73 ++++-
 apps/user_ldap/js/settings.js                      | 348 +++++++++++++++------
 apps/user_ldap/lib/configuration.php               | 179 +++++------
 apps/user_ldap/settings.php                        |   1 +
 .../templates/part.wizard-groupfilter.php          |   7 +-
 apps/user_ldap/templates/part.wizard-server.php    |  10 +
 .../user_ldap/templates/part.wizard-userfilter.php |   7 +-
 apps/user_ldap/templates/part.wizardcontrols.php   |   1 +
 12 files changed, 551 insertions(+), 206 deletions(-)

diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php
index 1e706ce..5fad23d 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 17b2ccd..6f2743d 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 3051cc8..8f33945 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 0000000..fac8dd6
--- /dev/null
+++ b/apps/user_ldap/js/experiencedAdmin.js
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2014, Arthur Schiwon <blizzz at owncloud.com>
+ * 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 e9f60e7..bb66c1d 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 fd84ca1..1627528 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("<option value='"+objc+"'>"+objc+"</option>");
@@ -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("<option value='"+objc+"'>"+objc+"</option>");
@@ -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 4cb0056..28e456a 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 fcde5df..e24ecf4 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 e460997..1953d2e 100644
--- a/apps/user_ldap/templates/part.wizard-groupfilter.php
+++ b/apps/user_ldap/templates/part.wizard-groupfilter.php
@@ -30,13 +30,16 @@
 			placeholder="<?php p($l->t('Raw LDAP filter'));?>"
 			title="<?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', $theme->getName()));?>"
 			/>
+			<button class="ldapGetEntryCount hidden" name="ldapGetEntryCount" type="button">
+				<?php p($l->t('Test Filter'));?>
+			</button>
 		</p>
 		<p>
 			<div class="ldapWizardInfo invisible"> </div>
 		</p>
-		<p>
+		<p class="ldap_count">
 			<span id="ldap_group_count">0 <?php p($l->t('groups found'));?></span>
 		</p>
 		<?php print_unescaped($_['wizardControls']); ?>
 	</div>
-</fieldset>
\ No newline at end of file
+</fieldset>
diff --git a/apps/user_ldap/templates/part.wizard-server.php b/apps/user_ldap/templates/part.wizard-server.php
index bee2b87..c174414 100644
--- a/apps/user_ldap/templates/part.wizard-server.php
+++ b/apps/user_ldap/templates/part.wizard-server.php
@@ -69,6 +69,16 @@
 				</textarea>
 			</div>
 
+			<div class="tablerow left">
+				<input type="checkbox" id="ldap_experienced_admin" value="1"
+					name="ldap_experienced_admin" class="tablecell lwautosave"
+					title="<?php p($l->t('Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge.'));?>"
+					/>
+				<label for="ldap_experienced_admin" class="tablecell">
+					<?php p($l->t('Manually enter LDAP filters (recommended for large directories)'));?>
+				</label>
+			</div>
+
 			<div class="tablerow">
 				<div class="tablecell ldapWizardInfo invisible"> 
 				</div>
diff --git a/apps/user_ldap/templates/part.wizard-userfilter.php b/apps/user_ldap/templates/part.wizard-userfilter.php
index eff9f89..99a6e75 100644
--- a/apps/user_ldap/templates/part.wizard-userfilter.php
+++ b/apps/user_ldap/templates/part.wizard-userfilter.php
@@ -30,13 +30,16 @@
 			placeholder="<?php p($l->t('Raw LDAP filter'));?>"
 			title="<?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', $theme->getName()));?>"
 			/>
+			<button class="ldapGetEntryCount hidden" name="ldapGetEntryCount" type="button">
+				<?php p($l->t('Test Filter'));?>
+			</button>
 		</p>
 		<p>
 			<div class="ldapWizardInfo invisible"> </div>
 		</p>
-		<p>
+		<p class="ldap_count">
 			<span id="ldap_user_count">0 <?php p($l->t('users found'));?></span>
 		</p>
 		<?php print_unescaped($_['wizardControls']); ?>
 	</div>
-</fieldset>
\ No newline at end of file
+</fieldset>
diff --git a/apps/user_ldap/templates/part.wizardcontrols.php b/apps/user_ldap/templates/part.wizardcontrols.php
index 33e1614..90d558e 100644
--- a/apps/user_ldap/templates/part.wizardcontrols.php
+++ b/apps/user_ldap/templates/part.wizardcontrols.php
@@ -1,4 +1,5 @@
 <div class="ldapWizardControls">
+	<span class="ldap_saving hidden"><?php p($l->t('Saving'));?> <img class="wizSpinner" src="<?php p(image_path('core', 'loading.gif')); ?>"/></span>
 	<span class="ldap_config_state_indicator"></span> <span class="ldap_config_state_indicator_sign"></span>
 	<button class="ldap_action_back invisible" name="ldap_action_back"
 			type="button">

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list