diff options
Diffstat (limited to 'apps/user_ldap/js')
42 files changed, 1211 insertions, 259 deletions
diff --git a/apps/user_ldap/js/renewPassword.js b/apps/user_ldap/js/renewPassword.js new file mode 100644 index 00000000000..65615d90889 --- /dev/null +++ b/apps/user_ldap/js/renewPassword.js @@ -0,0 +1,35 @@ +/** + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +OCA = OCA || {}; +OCA.LDAP = _.extend(OC.LDAP || {}, { + onRenewPassword: function () { + $('#submit') + .removeClass('icon-confirm-white') + .addClass('icon-loading-small') + .attr('value', t('core', 'Renewing …')); + return true; + }, +}); + +window.addEventListener('DOMContentLoaded', function() { + $('form[name=renewpassword]').submit(OCA.LDAP.onRenewPassword); + + if($('#newPassword').length) { + $('#newPassword').showPassword().keyup(); + } + $('#newPassword').strengthify({ + zxcvbn: OC.linkTo('core','vendor/zxcvbn/dist/zxcvbn.js'), + titles: [ + t('core', 'Very weak password'), + t('core', 'Weak password'), + t('core', 'So-so password'), + t('core', 'Good password'), + t('core', 'Strong password') + ], + drawTitles: true, + $addAfter: $('input[name="newPassword-clone"]'), + }); +}); diff --git a/apps/user_ldap/js/vendor/ui-multiselect/src/jquery.multiselect.js b/apps/user_ldap/js/vendor/ui-multiselect/src/jquery.multiselect.js new file mode 100644 index 00000000000..4dc6ab5ffbe --- /dev/null +++ b/apps/user_ldap/js/vendor/ui-multiselect/src/jquery.multiselect.js @@ -0,0 +1,707 @@ +/* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */ +/* + * jQuery MultiSelect UI Widget 1.13 + * Copyright (c) 2012 Eric Hynds + * + * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/ + * + * Depends: + * - jQuery 1.4.2+ + * - jQuery UI 1.8 widget factory + * + * Optional: + * - jQuery UI effects + * - jQuery UI position utility + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * SPDX-FileCopyrightText: 2012 Eric Hynds + * SPDX-License-Identifier: MIT + */ +(function($, undefined){ + +var multiselectID = 0; + +$.widget("ech.multiselect", { + + // default options + options: { + header: true, + height: 175, + minWidth: 225, + classes: '', + checkAllText: 'Check all', + uncheckAllText: 'Uncheck all', + noneSelectedText: 'Select options', + selectedText: '# selected', + selectedList: 0, + show: null, + hide: null, + autoOpen: false, + multiple: true, + position: {} + }, + + _create: function(){ + var el = this.element.hide(), + o = this.options; + + this.speed = $.fx.speeds._default; // default speed for effects + this._isOpen = false; // assume no + + var + button = (this.button = $('<button type="button"><span class="ui-icon ui-icon-triangle-2-n-s"></span></button>')) + .addClass('ui-multiselect ui-widget ui-state-default ui-corner-all') + .addClass( o.classes ) + .attr({ 'title':el.attr('title'), 'aria-haspopup':true, 'tabIndex':el.attr('tabIndex') }) + .insertAfter( el ), + + buttonlabel = (this.buttonlabel = $('<span />')) + .html( o.noneSelectedText ) + .appendTo( button ), + + menu = (this.menu = $('<div />')) + .addClass('ui-multiselect-menu ui-widget ui-widget-content ui-corner-all') + .addClass( o.classes ) + .appendTo( document.body ), + + header = (this.header = $('<div />')) + .addClass('ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix') + .appendTo( menu ), + + headerLinkContainer = (this.headerLinkContainer = $('<ul />')) + .addClass('ui-helper-reset') + .html(function(){ + if( o.header === true ){ + return '<li><a class="ui-multiselect-all" href="#"><span class="ui-icon ui-icon-check"></span><span>' + o.checkAllText + '</span></a></li><li><a class="ui-multiselect-none" href="#"><span class="ui-icon ui-icon-closethick"></span><span>' + o.uncheckAllText + '</span></a></li>'; + } else if(typeof o.header === "string"){ + return '<li>' + o.header + '</li>'; + } else { + return ''; + } + }) + .append('<li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-close"></span></a></li>') + .appendTo( header ), + + checkboxContainer = (this.checkboxContainer = $('<ul />')) + .addClass('ui-multiselect-checkboxes ui-helper-reset') + .appendTo( menu ); + + // perform event bindings + this._bindEvents(); + + // build menu + this.refresh( true ); + + // some addl. logic for single selects + if( !o.multiple ){ + menu.addClass('ui-multiselect-single'); + } + }, + + _init: function(){ + if( this.options.header === false ){ + this.header.hide(); + } + if( !this.options.multiple ){ + this.headerLinkContainer.find('.ui-multiselect-all, .ui-multiselect-none').hide(); + } + if( this.options.autoOpen ){ + this.open(); + } + if( this.element.is(':disabled') ){ + this.disable(); + } + }, + + refresh: function( init ){ + var el = this.element, + o = this.options, + menu = this.menu, + checkboxContainer = this.checkboxContainer, + optgroups = [], + html = "", + id = el.attr('id') || multiselectID++; // unique ID for the label & option tags + + // build items + el.find('option').each(function( i ){ + var $this = $(this), + parent = this.parentNode, + title = this.innerHTML, + description = this.title, + value = this.value, + inputID = 'ui-multiselect-' + (this.id || id + '-option-' + i), + isDisabled = this.disabled, + isSelected = this.selected, + labelClasses = [ 'ui-corner-all' ], + liClasses = (isDisabled ? 'ui-multiselect-disabled ' : ' ') + this.className, + optLabel; + + // is this an optgroup? + if( parent.tagName === 'OPTGROUP' ){ + optLabel = parent.getAttribute( 'label' ); + + // has this optgroup been added already? + if( $.inArray(optLabel, optgroups) === -1 ){ + html += '<li class="ui-multiselect-optgroup-label ' + parent.className + '"><a href="#">' + optLabel + '</a></li>'; + optgroups.push( optLabel ); + } + } + + if( isDisabled ){ + labelClasses.push( 'ui-state-disabled' ); + } + + // browsers automatically select the first option + // by default with single selects + if( isSelected && !o.multiple ){ + labelClasses.push( 'ui-state-active' ); + } + + html += '<li class="' + liClasses + '">'; + + // create the label + html += '<label for="' + inputID + '" title="' + description + '" class="' + labelClasses.join(' ') + '">'; + html += '<input id="' + inputID + '" name="multiselect_' + id + '" type="' + (o.multiple ? "checkbox" : "radio") + '" value="' + value + '" title="' + title + '"'; + + // pre-selected? + if( isSelected ){ + html += ' checked="checked"'; + html += ' aria-selected="true"'; + } + + // disabled? + if( isDisabled ){ + html += ' disabled="disabled"'; + html += ' aria-disabled="true"'; + } + + // add the title and close everything off + html += ' /><span>' + title + '</span></label></li>'; + }); + + // insert into the DOM + checkboxContainer.html( html ); + + // cache some moar useful elements + this.labels = menu.find('label'); + this.inputs = this.labels.children('input'); + + // set widths + this._setButtonWidth(); + this._setMenuWidth(); + + // remember default value + this.button[0].defaultValue = this.update(); + + // broadcast refresh event; useful for widgets + if( !init ){ + this._trigger('refresh'); + } + }, + + // updates the button text. call refresh() to rebuild + update: function(){ + var o = this.options, + $inputs = this.inputs, + $checked = $inputs.filter(':checked'), + numChecked = $checked.length, + value; + + if( numChecked === 0 ){ + value = o.noneSelectedText; + } else { + if($.isFunction( o.selectedText )){ + value = o.selectedText.call(this, numChecked, $inputs.length, $checked.get()); + } else if( /\d/.test(o.selectedList) && o.selectedList > 0 && numChecked <= o.selectedList){ + value = $checked.map(function(){ return $(this).next().html(); }).get().join(', '); + } else { + value = o.selectedText.replace('#', numChecked).replace('#', $inputs.length); + } + } + + this.buttonlabel.html( value ); + return value; + }, + + // binds events + _bindEvents: function(){ + var self = this, button = this.button; + + function clickHandler(){ + self[ self._isOpen ? 'close' : 'open' ](); + return false; + } + + // webkit doesn't like it when you click on the span :( + button + .find('span') + .bind('click.multiselect', clickHandler); + + // button events + button.bind({ + click: clickHandler, + keypress: function( e ){ + switch(e.which){ + case 27: // esc + case 38: // up + case 37: // left + self.close(); + break; + case 39: // right + case 40: // down + self.open(); + break; + } + }, + mouseenter: function(){ + if( !button.hasClass('ui-state-disabled') ){ + $(this).addClass('ui-state-hover'); + } + }, + mouseleave: function(){ + $(this).removeClass('ui-state-hover'); + }, + focus: function(){ + if( !button.hasClass('ui-state-disabled') ){ + $(this).addClass('ui-state-focus'); + } + }, + blur: function(){ + $(this).removeClass('ui-state-focus'); + } + }); + + // header links + this.header + .delegate('a', 'click.multiselect', function( e ){ + // close link + if( $(this).hasClass('ui-multiselect-close') ){ + self.close(); + + // check all / uncheck all + } else { + self[ $(this).hasClass('ui-multiselect-all') ? 'checkAll' : 'uncheckAll' ](); + } + + e.preventDefault(); + }); + + // optgroup label toggle support + this.menu + .delegate('li.ui-multiselect-optgroup-label a', 'click.multiselect', function( e ){ + e.preventDefault(); + + var $this = $(this), + $inputs = $this.parent().nextUntil('li.ui-multiselect-optgroup-label').find('input:visible:not(:disabled)'), + nodes = $inputs.get(), + label = $this.parent().text(); + + // trigger event and bail if the return is false + if( self._trigger('beforeoptgrouptoggle', e, { inputs:nodes, label:label }) === false ){ + return; + } + + // toggle inputs + self._toggleChecked( + $inputs.filter(':checked').length !== $inputs.length, + $inputs + ); + + self._trigger('optgrouptoggle', e, { + inputs: nodes, + label: label, + checked: nodes[0].checked + }); + }) + .delegate('label', 'mouseenter.multiselect', function(){ + if( !$(this).hasClass('ui-state-disabled') ){ + self.labels.removeClass('ui-state-hover'); + $(this).addClass('ui-state-hover').find('input').focus(); + } + }) + .delegate('label', 'keydown.multiselect', function( e ){ + e.preventDefault(); + + switch(e.which){ + case 9: // tab + case 27: // esc + self.close(); + break; + case 38: // up + case 40: // down + case 37: // left + case 39: // right + self._traverse(e.which, this); + break; + case 13: // enter + $(this).find('input')[0].click(); + break; + } + }) + .delegate('input[type="checkbox"], input[type="radio"]', 'click.multiselect', function( e ){ + var $this = $(this), + val = this.value, + checked = this.checked, + tags = self.element.find('option'); + + // bail if this input is disabled or the event is cancelled + if( this.disabled || self._trigger('click', e, { value: val, text: this.title, checked: checked }) === false ){ + e.preventDefault(); + return; + } + + // make sure the input has focus. otherwise, the esc key + // won't close the menu after clicking an item. + $this.focus(); + + // toggle aria state + $this.attr('aria-selected', checked); + + // change state on the original option tags + tags.each(function(){ + if( this.value === val ){ + this.selected = checked; + } else if( !self.options.multiple ){ + this.selected = false; + } + }); + + // some additional single select-specific logic + if( !self.options.multiple ){ + self.labels.removeClass('ui-state-active'); + $this.closest('label').toggleClass('ui-state-active', checked ); + + // close menu + self.close(); + } + + // fire change on the select box + self.element.trigger("change"); + + // setTimeout is to fix multiselect issue #14 and #47. caused by jQuery issue #3827 + // http://bugs.jquery.com/ticket/3827 + setTimeout($.proxy(self.update, self), 10); + }); + + // close each widget when clicking on any other element/anywhere else on the page + $(document).bind('mousedown.multiselect', function( e ){ + if(self._isOpen && !$.contains(self.menu[0], e.target) && !$.contains(self.button[0], e.target) && e.target !== self.button[0]){ + self.close(); + } + }); + + // deal with form resets. the problem here is that buttons aren't + // restored to their defaultValue prop on form reset, and the reset + // handler fires before the form is actually reset. delaying it a bit + // gives the form inputs time to clear. + $(this.element[0].form).bind('reset.multiselect', function(){ + setTimeout($.proxy(self.refresh, self), 10); + }); + }, + + // set button width + _setButtonWidth: function(){ + var width = this.element.outerWidth(), + o = this.options; + + if( /\d/.test(o.minWidth) && width < o.minWidth){ + width = o.minWidth; + } + + // set widths + this.button.width( width ); + }, + + // set menu width + _setMenuWidth: function(){ + var m = this.menu, + width = this.button.outerWidth()- + parseInt(m.css('padding-left'),10)- + parseInt(m.css('padding-right'),10)- + parseInt(m.css('border-right-width'),10)- + parseInt(m.css('border-left-width'),10); + + m.width( width || this.button.outerWidth() ); + }, + + // move up or down within the menu + _traverse: function( which, start ){ + var $start = $(start), + moveToLast = which === 38 || which === 37, + + // select the first li that isn't an optgroup label / disabled + $next = $start.parent()[moveToLast ? 'prevAll' : 'nextAll']('li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)')[ moveToLast ? 'last' : 'first'](); + + // if at the first/last element + if( !$next.length ){ + var $container = this.menu.find('ul').last(); + + // move to the first/last + this.menu.find('label')[ moveToLast ? 'last' : 'first' ]().trigger('mouseover'); + + // set scroll position + $container.scrollTop( moveToLast ? $container.height() : 0 ); + + } else { + $next.find('label').trigger('mouseover'); + } + }, + + // This is an internal function to toggle the checked property and + // other related attributes of a checkbox. + // + // The context of this function should be a checkbox; do not proxy it. + _toggleState: function( prop, flag ){ + return function(){ + if( !this.disabled ) { + this[ prop ] = flag; + } + + if( flag ){ + this.setAttribute('aria-selected', true); + } else { + this.removeAttribute('aria-selected'); + } + }; + }, + + _toggleChecked: function( flag, group ){ + var $inputs = (group && group.length) ? group : this.inputs, + self = this; + + // toggle state on inputs + $inputs.each(this._toggleState('checked', flag)); + + // give the first input focus + $inputs.eq(0).focus(); + + // update button text + this.update(); + + // gather an array of the values that actually changed + var values = $inputs.map(function(){ + return this.value; + }).get(); + + // toggle state on original option tags + this.element + .find('option') + .each(function(){ + if( !this.disabled && $.inArray(this.value, values) > -1 ){ + self._toggleState('selected', flag).call( this ); + } + }); + + // trigger the change event on the select + if( $inputs.length ) { + this.element.trigger("change"); + } + }, + + _toggleDisabled: function( flag ){ + this.button + .attr({ 'disabled':flag, 'aria-disabled':flag })[ flag ? 'addClass' : 'removeClass' ]('ui-state-disabled'); + + var inputs = this.menu.find('input'); + var key = "ech-multiselect-disabled"; + + if(flag) { + // remember which elements this widget disabled (not pre-disabled) + // elements, so that they can be restored if the widget is re-enabled. + inputs = inputs.filter(':enabled') + .data(key, true) + } else { + inputs = inputs.filter(function() { + return $.data(this, key) === true; + }).removeData(key); + } + + inputs + .attr({ 'disabled':flag, 'arial-disabled':flag }) + .parent()[ flag ? 'addClass' : 'removeClass' ]('ui-state-disabled'); + + this.element + .attr({ 'disabled':flag, 'aria-disabled':flag }); + }, + + // open the menu + open: function( e ){ + var self = this, + button = this.button, + menu = this.menu, + speed = this.speed, + o = this.options, + args = []; + + // bail if the multiselectopen event returns false, this widget is disabled, or is already open + if( this._trigger('beforeopen') === false || button.hasClass('ui-state-disabled') || this._isOpen ){ + return; + } + + var $container = menu.find('ul').last(), + effect = o.show, + pos = button.offset(); + + // figure out opening effects/speeds + if( $.isArray(o.show) ){ + effect = o.show[0]; + speed = o.show[1] || self.speed; + } + + // if there's an effect, assume jQuery UI is in use + // build the arguments to pass to show() + if( effect ) { + args = [ effect, speed ]; + } + + // set the scroll of the checkbox container + $container.scrollTop(0).height(o.height); + + // position and show menu + if( $.ui.position && !$.isEmptyObject(o.position) ){ + o.position.of = o.position.of || button; + + menu + .show() + .position( o.position ) + .hide(); + + // if position utility is not available... + } else { + menu.css({ + top: pos.top + button.outerHeight(), + 'inset-inline-start': pos.left + }); + } + + // show the menu, maybe with a speed/effect combo + $.fn.show.apply(menu, args); + + // select the first option + // triggering both mouseover and mouseover because 1.4.2+ has a bug where triggering mouseover + // will actually trigger mouseenter. the mouseenter trigger is there for when it's eventually fixed + this.labels.eq(0).trigger('mouseover').trigger('mouseenter').find('input').trigger('focus'); + + button.addClass('ui-state-active'); + this._isOpen = true; + this._trigger('open'); + }, + + // close the menu + close: function(){ + if(this._trigger('beforeclose') === false){ + return; + } + + var o = this.options, + effect = o.hide, + speed = this.speed, + args = []; + + // figure out opening effects/speeds + if( $.isArray(o.hide) ){ + effect = o.hide[0]; + speed = o.hide[1] || this.speed; + } + + if( effect ) { + args = [ effect, speed ]; + } + + $.fn.hide.apply(this.menu, args); + this.button.removeClass('ui-state-active').trigger('blur').trigger('mouseleave'); + this._isOpen = false; + this._trigger('close'); + }, + + enable: function(){ + this._toggleDisabled(false); + }, + + disable: function(){ + this._toggleDisabled(true); + }, + + checkAll: function( e ){ + this._toggleChecked(true); + this._trigger('checkAll'); + }, + + uncheckAll: function(){ + this._toggleChecked(false); + this._trigger('uncheckAll'); + }, + + getChecked: function(){ + return this.menu.find('input').filter(':checked'); + }, + + destroy: function(){ + // remove classes + data + $.Widget.prototype.destroy.call( this ); + + this.button.remove(); + this.menu.remove(); + this.element.show(); + + return this; + }, + + isOpen: function(){ + return this._isOpen; + }, + + widget: function(){ + return this.menu; + }, + + getButton: function(){ + return this.button; + }, + + // react to option changes after initialization + _setOption: function( key, value ){ + var menu = this.menu; + + switch(key){ + case 'header': + menu.find('div.ui-multiselect-header')[ value ? 'show' : 'hide' ](); + break; + case 'checkAllText': + menu.find('a.ui-multiselect-all span').eq(-1).text(value); + break; + case 'uncheckAllText': + menu.find('a.ui-multiselect-none span').eq(-1).text(value); + break; + case 'height': + menu.find('ul').last().height( parseInt(value,10) ); + break; + case 'minWidth': + this.options[ key ] = parseInt(value,10); + this._setButtonWidth(); + this._setMenuWidth(); + break; + case 'selectedText': + case 'selectedList': + case 'noneSelectedText': + this.options[key] = value; // these all needs to update immediately for the update() call + this.update(); + break; + case 'classes': + menu.add(this.button).removeClass(this.options.classes).addClass(value); + break; + case 'multiple': + menu.toggleClass('ui-multiselect-single', !value); + this.options.multiple = value; + this.element[0].multiple = value; + this.refresh(); + } + + $.Widget.prototype._setOption.apply( this, arguments ); + } +}); + +})(jQuery); diff --git a/apps/user_ldap/js/wizard/configModel.js b/apps/user_ldap/js/wizard/configModel.js index c3f1e85b592..85c87e2ef15 100644 --- a/apps/user_ldap/js/wizard/configModel.js +++ b/apps/user_ldap/js/wizard/configModel.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -10,11 +10,11 @@ OCA = OCA || {}; /** * @classdesc this class represents a server configuration. It communicates - * with the ownCloud server to ensure to always have the up to date LDAP + * with the Nextcloud server to ensure to always have the up to date LDAP * configuration. It sends various events that views can listen to and * provides methods so they can modify the configuration based upon user * input. This model is also extended by so-called "detectors" who let the - * ownCloud server try to auto-detect settings and manipulate the + * Nextcloud server try to auto-detect settings and manipulate the * configuration as well. * * @constructor @@ -108,7 +108,7 @@ OCA = OCA || {}; */ /** - * calls an AJAX endpoint at ownCloud. This method should be called by + * calls an AJAX endpoint at Nextcloud. This method should be called by * detectors only! * * @param {string} [params] - as return by OC.buildQueryString @@ -121,7 +121,7 @@ OCA = OCA || {}; }, /** - * calls an AJAX endpoint at ownCloud. This method should be called by + * calls an AJAX endpoint at Nextcloud. This method should be called by * detectors only! * * @param {string} destination - the desired end point @@ -148,7 +148,7 @@ OCA = OCA || {}; /** * modifies a configuration key. If a provided configuration key does * not exist or the provided value equals the current setting, false is - * returned. Otherwise ownCloud server will be called to save the new + * returned. Otherwise Nextcloud server will be called to save the new * value, an event will notify when this is done. True is returned when * the request is sent, however it does not mean whether saving was * successful or not. @@ -195,7 +195,7 @@ OCA = OCA || {}; /** * updates the model's configuration data. This should be called only, - * when a new configuration value was received from the ownCloud server. + * when a new configuration value was received from the Nextcloud server. * This is typically done by detectors, but never by views. * * Cancels with false if old and new values already match. @@ -314,11 +314,11 @@ OCA = OCA || {}; }, /** - * starts a configuration test on the ownCloud server + * starts a configuration test on the Nextcloud server */ requestConfigurationTest: function() { var url = OC.generateUrl('apps/user_ldap/ajax/testConfiguration.php'); - var params = OC.buildQueryString(this.configuration); + var params = OC.buildQueryString({ldap_serverconfig_chooser: this.configID}); var model = this; $.post(url, params, function(result) { model._processTestResult(model, result) }); //TODO: make sure only one test is running at a time diff --git a/apps/user_ldap/js/wizard/controller.js b/apps/user_ldap/js/wizard/controller.js index 7c1f0d5d818..0bfa0fb7ffd 100644 --- a/apps/user_ldap/js/wizard/controller.js +++ b/apps/user_ldap/js/wizard/controller.js @@ -1,7 +1,6 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/view.js b/apps/user_ldap/js/wizard/view.js index 39133554121..ba77d287141 100644 --- a/apps/user_ldap/js/wizard/view.js +++ b/apps/user_ldap/js/wizard/view.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -24,6 +24,8 @@ OCA = OCA || {}; STATUS_INCOMPLETE: 1, /** @constant {number} */ STATUS_SUCCESS: 2, + /** @constant {number} */ + STATUS_UNTESTED: 3, /** * initializes the instance. Always call it after creating the instance. @@ -38,7 +40,7 @@ OCA = OCA || {}; }, /** - * applies click events to the forward and backword buttons + * applies click events to the forward and backward buttons */ initControls: function() { var view = this; @@ -84,7 +86,8 @@ OCA = OCA || {}; var agent = view.configModel.configuration.ldap_dn; var pwd = view.configModel.configuration.ldap_agent_password; - if((host && port && base) && ((!agent && !pwd) || (agent && pwd))) { + if(((host && port && base) || (host && base && host.indexOf('ldapi://') > -1 )) + && ((!agent && !pwd) || (agent && pwd))) { view.enableTabs(); } else { view.disableTabs(); @@ -105,7 +108,8 @@ OCA = OCA || {}; var userFilter = this.configModel.configuration.ldap_userlist_filter; var loginFilter = this.configModel.configuration.ldap_login_filter; - if(host && port && base && userFilter && loginFilter) { + if((host && port && base && userFilter && loginFilter) || + (host && base && host.indexOf('ldapi://') > -1 && userFilter && loginFilter)) { this.configModel.requestConfigurationTest(); } else { this._updateStatusIndicator(this.STATUS_INCOMPLETE); @@ -210,6 +214,7 @@ OCA = OCA || {}; * @listens ConfigModel#configLoaded */ onConfigLoaded: function(view) { + view._updateStatusIndicator(view.STATUS_UNTESTED); view.basicStatusCheck(view); view.functionalityCheck(); }, @@ -268,7 +273,7 @@ OCA = OCA || {}; * requests a configuration test */ onTestButtonClick: function() { - this.configModel.requestWizard('ldap_action_test_connection', this.configModel.configuration); + this.configModel.requestWizard('ldap_action_test_connection', {ldap_serverconfig_chooser: this.configModel.configID}); }, /** @@ -351,7 +356,6 @@ OCA = OCA || {}; this.$settings.tabs({}); $('#ldapSettings button:not(.icon-default-style):not(.ui-multiselect)').button(); $('#ldapSettings').tabs({ beforeActivate: this.onTabChange }); - $('#ldapSettings :input').tooltip({placement: "right", container: "body", trigger: "hover"}); this.initControls(); this.disableTabs(); @@ -370,6 +374,14 @@ OCA = OCA || {}; var $indicatorLight = $('.ldap_config_state_indicator_sign'); switch(state) { + case this.STATUS_UNTESTED: + $indicator.text(t('user_ldap', + 'Testing configuration…' + )); + $indicator.addClass('ldap_grey'); + $indicatorLight.removeClass('error'); + $indicatorLight.removeClass('success'); + break; case this.STATUS_ERROR: $indicator.text(t('user_ldap', 'Configuration incorrect' diff --git a/apps/user_ldap/js/wizard/wizard.js b/apps/user_ldap/js/wizard/wizard.js index e8450d1c78f..b8a3d74b881 100644 --- a/apps/user_ldap/js/wizard/wizard.js +++ b/apps/user_ldap/js/wizard/wizard.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -45,7 +45,7 @@ OCA = OCA || {}; // for example, BaseDN detector needs the port. The port is typically found // by the Port Detector. If BaseDN detector was run first, it will not have // all necessary information. Only after Port Detector was executed… - for (var i = 0; i <= detectors.length; i++) { + for (var i = 0; i < detectors.length; i++) { model.registerDetector(detectors[i]); } @@ -61,7 +61,7 @@ OCA = OCA || {}; var view = new OCA.LDAP.Wizard.WizardView(model); view.init(); view.setModel(model); - for (var j = 0; j <= tabs.length; j++) { + for (var j = 0; j < tabs.length; j++) { view.registerTab(tabs[j], '#ldapWizard' + (j + 2)); } @@ -70,11 +70,11 @@ OCA = OCA || {}; controller.setView(view); controller.setModel(model); controller.run(); - } + }; OCA.LDAP.Wizard.Wizard = Wizard; })(); -$(document).ready(function() { +window.addEventListener('DOMContentLoaded', function() { new OCA.LDAP.Wizard.Wizard(); }); diff --git a/apps/user_ldap/js/wizard/wizardDetectorAvailableAttributes.js b/apps/user_ldap/js/wizard/wizardDetectorAvailableAttributes.js index f0272351749..4fae1ef5e99 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorAvailableAttributes.js +++ b/apps/user_ldap/js/wizard/wizardDetectorAvailableAttributes.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc an Attributes Detector. It executes the auto-detection of - * available attributes by the ownCloud server, if requirements are met. + * available attributes by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorBaseDN.js b/apps/user_ldap/js/wizard/wizardDetectorBaseDN.js index 70b9923e58d..3d3bba4f821 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorBaseDN.js +++ b/apps/user_ldap/js/wizard/wizardDetectorBaseDN.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Base DN Detector. It executes the auto-detection of the base - * DN by the ownCloud server, if requirements are met. + * DN by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorClearGroupMappings.js b/apps/user_ldap/js/wizard/wizardDetectorClearGroupMappings.js index c6ef0a9cab1..740fc3a3f6b 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorClearGroupMappings.js +++ b/apps/user_ldap/js/wizard/wizardDetectorClearGroupMappings.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorClearUserMappings.js b/apps/user_ldap/js/wizard/wizardDetectorClearUserMappings.js index 0e4811b39ea..1032682d926 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorClearUserMappings.js +++ b/apps/user_ldap/js/wizard/wizardDetectorClearUserMappings.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorEmailAttribute.js b/apps/user_ldap/js/wizard/wizardDetectorEmailAttribute.js index 5f177734681..007a9cc8079 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorEmailAttribute.js +++ b/apps/user_ldap/js/wizard/wizardDetectorEmailAttribute.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorFeatureAbstract.js b/apps/user_ldap/js/wizard/wizardDetectorFeatureAbstract.js index e025d8d6242..3d43cd369d5 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorFeatureAbstract.js +++ b/apps/user_ldap/js/wizard/wizardDetectorFeatureAbstract.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorFilterGroup.js b/apps/user_ldap/js/wizard/wizardDetectorFilterGroup.js index cca889839e4..507f7490731 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorFilterGroup.js +++ b/apps/user_ldap/js/wizard/wizardDetectorFilterGroup.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Port Detector. It executes the auto-detection of the port - * by the ownCloud server, if requirements are met. + * by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorFilterLogin.js b/apps/user_ldap/js/wizard/wizardDetectorFilterLogin.js index e796b81e0eb..827886c840c 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorFilterLogin.js +++ b/apps/user_ldap/js/wizard/wizardDetectorFilterLogin.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Port Detector. It executes the auto-detection of the port - * by the ownCloud server, if requirements are met. + * by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorFilterUser.js b/apps/user_ldap/js/wizard/wizardDetectorFilterUser.js index d34e244a1f5..11e990a36e0 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorFilterUser.js +++ b/apps/user_ldap/js/wizard/wizardDetectorFilterUser.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Port Detector. It executes the auto-detection of the port - * by the ownCloud server, if requirements are met. + * by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorGeneric.js b/apps/user_ldap/js/wizard/wizardDetectorGeneric.js index fd80018943e..ab1c0c96d99 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGeneric.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGeneric.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -90,7 +89,7 @@ OCA = OCA || {}; }, /** - * processes the result of the ownCloud server + * processes the result of the Nextcloud server * * @param {OCA.LDAP.Wizard.ConfigModel} model * @param {WizardDetectorGeneric} detector diff --git a/apps/user_ldap/js/wizard/wizardDetectorGroupCount.js b/apps/user_ldap/js/wizard/wizardDetectorGroupCount.js index 12d7df7514b..9e29cf093ea 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGroupCount.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGroupCount.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Port Detector. It executes the auto-detection of the port - * by the ownCloud server, if requirements are met. + * by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorGroupObjectClasses.js b/apps/user_ldap/js/wizard/wizardDetectorGroupObjectClasses.js index 6d6048b7986..cbfb1f91a41 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGroupObjectClasses.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGroupObjectClasses.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorGroupsForGroups.js b/apps/user_ldap/js/wizard/wizardDetectorGroupsForGroups.js index fbb3f02e10a..2e898f5317e 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGroupsForGroups.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGroupsForGroups.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorGroupsForUsers.js b/apps/user_ldap/js/wizard/wizardDetectorGroupsForUsers.js index fe67854c794..de8407a0edd 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGroupsForUsers.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGroupsForUsers.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorPort.js b/apps/user_ldap/js/wizard/wizardDetectorPort.js index ba075189667..10055cd1cdd 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorPort.js +++ b/apps/user_ldap/js/wizard/wizardDetectorPort.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Port Detector. It executes the auto-detection of the port - * by the ownCloud server, if requirements are met. + * by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorQueue.js b/apps/user_ldap/js/wizard/wizardDetectorQueue.js index b6fa644558e..c00064f5c45 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorQueue.js +++ b/apps/user_ldap/js/wizard/wizardDetectorQueue.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorSimpleRequestAbstract.js b/apps/user_ldap/js/wizard/wizardDetectorSimpleRequestAbstract.js index 37e41f42a64..80d14f8466c 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorSimpleRequestAbstract.js +++ b/apps/user_ldap/js/wizard/wizardDetectorSimpleRequestAbstract.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Port Detector. It executes the auto-detection of the port - * by the ownCloud server, if requirements are met. + * by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorTestAbstract.js b/apps/user_ldap/js/wizard/wizardDetectorTestAbstract.js index df0b0a2200a..929ea0e84e8 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorTestAbstract.js +++ b/apps/user_ldap/js/wizard/wizardDetectorTestAbstract.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Port Detector. It executes the auto-detection of the port - * by the ownCloud server, if requirements are met. + * by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorTestBaseDN.js b/apps/user_ldap/js/wizard/wizardDetectorTestBaseDN.js index 52848819bd8..de01726e1c1 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorTestBaseDN.js +++ b/apps/user_ldap/js/wizard/wizardDetectorTestBaseDN.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorTestConfiguration.js b/apps/user_ldap/js/wizard/wizardDetectorTestConfiguration.js index 1308c182909..5049c101f09 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorTestConfiguration.js +++ b/apps/user_ldap/js/wizard/wizardDetectorTestConfiguration.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -11,7 +10,7 @@ OCA = OCA || {}; /** * @classdesc a Port Detector. It executes the auto-detection of the port - * by the ownCloud server, if requirements are met. + * by the Nextcloud server, if requirements are met. * * @constructor */ diff --git a/apps/user_ldap/js/wizard/wizardDetectorTestLoginName.js b/apps/user_ldap/js/wizard/wizardDetectorTestLoginName.js index 260df5a0fe0..5e0319586b3 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorTestLoginName.js +++ b/apps/user_ldap/js/wizard/wizardDetectorTestLoginName.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorUserCount.js b/apps/user_ldap/js/wizard/wizardDetectorUserCount.js index bcff2cf3b10..144c64d24be 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorUserCount.js +++ b/apps/user_ldap/js/wizard/wizardDetectorUserCount.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorUserDisplayNameAttribute.js b/apps/user_ldap/js/wizard/wizardDetectorUserDisplayNameAttribute.js index ae734480c1c..64e5bb50371 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorUserDisplayNameAttribute.js +++ b/apps/user_ldap/js/wizard/wizardDetectorUserDisplayNameAttribute.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorUserGroupAssociation.js b/apps/user_ldap/js/wizard/wizardDetectorUserGroupAssociation.js index 953a0b909a6..a0051532388 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorUserGroupAssociation.js +++ b/apps/user_ldap/js/wizard/wizardDetectorUserGroupAssociation.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -27,7 +26,7 @@ OCA = OCA || {}; run: function(model, configID) { // TODO: might be better with configuration marker as uniqueMember // is a valid value (although probably less common then member and memberUid). - if(model.configuration.ldap_group_member_assoc_attribute && model.configuration.ldap_group_member_assoc_attribute !== 'uniqueMember') { + if(model.configuration.ldap_group_member_assoc_attribute && model.configuration.ldap_group_member_assoc_attribute !== '') { // a value is already set. Don't overwrite and don't ask LDAP // without reason. return false; diff --git a/apps/user_ldap/js/wizard/wizardDetectorUserObjectClasses.js b/apps/user_ldap/js/wizard/wizardDetectorUserObjectClasses.js index 0fa324a0809..13e034e353e 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorUserObjectClasses.js +++ b/apps/user_ldap/js/wizard/wizardDetectorUserObjectClasses.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardFilterOnType.js b/apps/user_ldap/js/wizard/wizardFilterOnType.js index bb1871023a2..80232ffd91b 100644 --- a/apps/user_ldap/js/wizard/wizardFilterOnType.js +++ b/apps/user_ldap/js/wizard/wizardFilterOnType.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -21,7 +21,6 @@ OCA = OCA || {}; init: function($select, $textInput) { this.$select = $select; this.$textInput = $textInput; - this.updateOptions(); this.lastSearch = ''; var fity = this; @@ -36,22 +35,6 @@ OCA = OCA || {}; }, /** - * the options will be read in again. Should be called after a - * configuration switch. - */ - updateOptions: function() { - var options = []; - this.$select.find('option').each(function() { - options.push({ - value: $(this).val(), - normalized: $(this).val().toLowerCase() - } - ); - }); - this._options = options; - }, - - /** * the actual search or filter method * * @param {FilterOnType} fity @@ -62,10 +45,12 @@ OCA = OCA || {}; return; } fity.lastSearch = filterVal; - fity.$select.empty(); - $.each(fity._options, function() { - if(!filterVal || this.normalized.indexOf(filterVal) > -1) { - fity.$select.append($('<option>').val(this.value).text(this.value)); + + fity.$select.find('option').each(function() { + if(!filterVal || $(this).val().toLowerCase().indexOf(filterVal) > -1) { + $(this).removeAttr('hidden') + } else { + $(this).attr('hidden', 'hidden'); } }); delete(fity.runID); diff --git a/apps/user_ldap/js/wizard/wizardFilterOnTypeFactory.js b/apps/user_ldap/js/wizard/wizardFilterOnTypeFactory.js index bd6511dc8b0..de207574539 100644 --- a/apps/user_ldap/js/wizard/wizardFilterOnTypeFactory.js +++ b/apps/user_ldap/js/wizard/wizardFilterOnTypeFactory.js @@ -1,7 +1,6 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardObject.js b/apps/user_ldap/js/wizard/wizardObject.js index a90f1533a26..9ae574d4ffd 100644 --- a/apps/user_ldap/js/wizard/wizardObject.js +++ b/apps/user_ldap/js/wizard/wizardObject.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js b/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js index c9c3aeb241d..f5cfd4a14fb 100644 --- a/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -170,7 +170,7 @@ OCA = OCA || {}; } else { var $element = $(this.tabID).find('.ldapGroupListSelected'); this.equipMultiSelect($element, groups); - this.updateFilterOnType('selected'); + this.updateFilterOnType(); } }, @@ -212,10 +212,8 @@ OCA = OCA || {}; /** * updates (creates, if necessary) filterOnType instances - * - * @param {string} [only] - if only one search index should be updated */ - updateFilterOnType: function(only) { + updateFilterOnType: function() { if(_.isUndefined(this.filterOnType)) { this.filterOnType = []; @@ -227,13 +225,6 @@ OCA = OCA || {}; this.filterOnType.push(this.foTFactory.get( $selectedGroups, $(this.tabID).find('.ldapManyGroupsSearch') )); - } else { - if(_.isUndefined(only) || only.toLowerCase() === 'available') { - this.filterOnType[0].updateOptions(); - } - if(_.isUndefined(only) || only.toLowerCase() === 'selected') { - this.filterOnType[1].updateOptions(); - } } }, @@ -282,7 +273,7 @@ OCA = OCA || {}; // we reimplement it here to update the filter index // for groups. Maybe we can isolate it? if(methodName === 'setGroups') { - view.updateFilterOnType('selected'); + view.updateFilterOnType(); } } } @@ -302,7 +293,7 @@ OCA = OCA || {}; if( !view.getFilterItem().$element.val() && view.parsedFilterMode === view.configModel.FILTER_MODE_ASSISTED ) { - view.configModel.requestWizard(view.getFilterItem().keyName) + view.configModel.requestWizard(view.getFilterItem().keyName); } } else if (payload.feature === view.getGroupsItem().featureName) { if(view.manyGroupsSupport && payload.data.length > view._groupElementSwitchThreshold) { @@ -312,7 +303,6 @@ OCA = OCA || {}; var selected = view.configModel.configuration[view.getGroupsItem().keyName]; var available = $(payload.data).not(selected).get(); view.equipMultiSelect($element, available); - view.updateFilterOnType('available'); $(view.tabID).find(".ldapManyGroupsSupport").removeClass('hidden'); view.getGroupsItem().$element.multiselect({classes: view.multiSelectPluginClass + ' forceHidden'}); view.isComplexGroupChooser = true; @@ -356,12 +346,22 @@ OCA = OCA || {}; */ onSelectGroup: function() { var $available = $(this.tabID).find('.ldapGroupListAvailable'); + if(!$available.val()) { + return; // no selection – nothing to do + } + var $selected = $(this.tabID).find('.ldapGroupListSelected'); var selected = $.map($selected.find('option'), function(e) { return e.value; }); - this._saveGroups(selected.concat($available.val())); - $available.find('option:selected').prependTo($selected); - this.updateFilterOnType('available'); // selected groups are not updated yet + let selectedGroups = []; + $available.find('option:selected:visible').each(function() { + selectedGroups.push($(this).val()); + }); + + this._saveGroups(selected.concat(selectedGroups)); + $available.find('option:selected:visible').prependTo($selected); + this.updateFilterOnType(); // selected groups are not updated yet + $available.find('option:selected').prop("selected", false); }, /** @@ -370,11 +370,12 @@ OCA = OCA || {}; onDeselectGroup: function() { var $available = $(this.tabID).find('.ldapGroupListAvailable'); var $selected = $(this.tabID).find('.ldapGroupListSelected'); - var selected = $.map($selected.find('option:not(:selected)'), function(e) { return e.value; }); + var selected = $.map($selected.find('option:not(:selected:visible)'), function(e) { return e.value; }); this._saveGroups(selected); - $selected.find('option:selected').appendTo($available); - this.updateFilterOnType('available'); // selected groups are not updated yet + $selected.find('option:selected:visible').appendTo($available); + this.updateFilterOnType(); // selected groups are not updated yet + $selected.find('option:selected').prop("selected", false); } }); diff --git a/apps/user_ldap/js/wizard/wizardTabAdvanced.js b/apps/user_ldap/js/wizard/wizardTabAdvanced.js index d1e5002d40a..8f0d0aa7973 100644 --- a/apps/user_ldap/js/wizard/wizardTabAdvanced.js +++ b/apps/user_ldap/js/wizard/wizardTabAdvanced.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -17,8 +16,8 @@ OCA = OCA || {}; /** * initializes the instance. Always call it after initialization. * - * @param tabIndex - * @param tabID + * @param {any} tabIndex - + * @param {any} tabID - */ init: function (tabIndex, tabID) { this._super(tabIndex, tabID); @@ -67,6 +66,10 @@ OCA = OCA || {}; $element: $('#ldap_attributes_for_user_search'), setMethod: 'setSearchAttributesUsers' }, + ldap_mark_remnants_as_disabled: { + $element: $('#ldap_mark_remnants_as_disabled'), + setMethod: 'setMarkRemnantsAsDisabled' + }, ldap_group_display_name: { $element: $('#ldap_group_display_name'), setMethod: 'setGroupDisplayName' @@ -95,6 +98,14 @@ OCA = OCA || {}; $element: $('#ldap_paging_size'), setMethod: 'setPagingSize' }, + ldap_turn_on_pwd_change: { + $element: $('#ldap_turn_on_pwd_change'), + setMethod: 'setPasswordChangeEnabled' + }, + ldap_default_ppolicy_dn: { + $element: $('#ldap_default_ppolicy_dn'), + setMethod: 'setDefaultPPolicyDN' + }, //Special Attributes ldap_quota_attr: { @@ -112,7 +123,53 @@ OCA = OCA || {}; home_folder_naming_rule: { $element: $('#home_folder_naming_rule'), setMethod: 'setHomeFolderAttribute' - } + }, + ldap_ext_storage_home_attribute: { + $element: $('#ldap_ext_storage_home_attribute'), + setMethod: 'setExternalStorageHomeAttribute' + }, + + //User Profile Attributes + ldap_attr_phone: { + $element: $('#ldap_attr_phone'), + setMethod: 'setPhoneAttribute' + }, + ldap_attr_website: { + $element: $('#ldap_attr_website'), + setMethod: 'setWebsiteAttribute' + }, + ldap_attr_address: { + $element: $('#ldap_attr_address'), + setMethod: 'setAddressAttribute' + }, + ldap_attr_twitter: { + $element: $('#ldap_attr_twitter'), + setMethod: 'setTwitterAttribute' + }, + ldap_attr_fediverse: { + $element: $('#ldap_attr_fediverse'), + setMethod: 'setFediverseAttribute' + }, + ldap_attr_organisation: { + $element: $('#ldap_attr_organisation'), + setMethod: 'setOrganisationAttribute' + }, + ldap_attr_role: { + $element: $('#ldap_attr_role'), + setMethod: 'setRoleAttribute' + }, + ldap_attr_headline: { + $element: $('#ldap_attr_headline'), + setMethod: 'setHeadlineAttribute' + }, + ldap_attr_biography: { + $element: $('#ldap_attr_biography'), + setMethod: 'setBiographyAttribute' + }, + ldap_attr_birthdate: { + $element: $('#ldap_attr_birthdate'), + setMethod: 'setBirthdateAttribute' + }, }; this.setManagedItems(items); }, @@ -226,6 +283,15 @@ OCA = OCA || {}; }, /** + * enables or disables marking remnants as disabled + * + * @param {string} markRemnantsAsDisabled contains an int + */ + setMarkRemnantsAsDisabled: function(markRemnantsAsDisabled) { + this.setElementValue(this.managedItems.ldap_mark_remnants_as_disabled.$element, markRemnantsAsDisabled); + }, + + /** * sets the display name attribute for groups * * @param {string} attribute @@ -269,7 +335,7 @@ OCA = OCA || {}; setDynamicGroupMemberURL: function(attribute) { this.setElementValue(this.managedItems.ldap_dynamic_group_member_url.$element, attribute); }, - + /** * enabled or disables the use of nested groups (groups in groups in * groups…) @@ -290,6 +356,26 @@ OCA = OCA || {}; }, /** + * sets whether the password changes per user should be enabled + * + * @param {string} doPasswordChange contains an int + */ + setPasswordChangeEnabled: function(doPasswordChange) { + this.setElementValue( + this.managedItems.ldap_turn_on_pwd_change.$element, doPasswordChange + ); + }, + + /** + * sets the default ppolicy attribute + * + * @param {string} attribute + */ + setDefaultPPolicyDN: function(attribute) { + this.setElementValue(this.managedItems.ldap_default_ppolicy_dn.$element, attribute); + }, + + /** * sets the email attribute * * @param {string} attribute @@ -299,6 +385,15 @@ OCA = OCA || {}; }, /** + * sets the external storage home attribute + * + * @param {string} attribute + */ + setExternalStorageHomeAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_ext_storage_home_attribute.$element, attribute); + }, + + /** * sets the quota attribute * * @param {string} attribute @@ -317,7 +412,7 @@ OCA = OCA || {}; }, /** - * sets the attribute for the ownCloud user specific home folder location + * sets the attribute for the Nextcloud user specific home folder location * * @param {string} attribute */ @@ -326,6 +421,96 @@ OCA = OCA || {}; }, /** + * sets the attribute for the Nextcloud user profile phone Number + * + * @param {string} attribute + */ + setPhoneAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_phone.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile website + * + * @param {string} attribute + */ + setWebsiteAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_website.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile postal address + * + * @param {string} attribute + */ + setAddressAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_address.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile twitter + * + * @param {string} attribute + */ + setTwitterAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_twitter.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile fediverse + * + * @param {string} attribute + */ + setFediverseAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_fediverse.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile organisation + * + * @param {string} attribute + */ + setOrganisationAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_organisation.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile role + * + * @param {string} attribute + */ + setRoleAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_role.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile headline + * + * @param {string} attribute + */ + setHeadlineAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_headline.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile biography + * + * @param {string} attribute + */ + setBiographyAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_biography.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile birthday + * + * @param {string} attribute + */ + setBirthdateAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_birthdate.$element, attribute); + }, + + /** * deals with the result of the Test Connection test * * @param {WizardTabAdvanced} view diff --git a/apps/user_ldap/js/wizard/wizardTabElementary.js b/apps/user_ldap/js/wizard/wizardTabElementary.js index c8cb308952b..2a04d773058 100644 --- a/apps/user_ldap/js/wizard/wizardTabElementary.js +++ b/apps/user_ldap/js/wizard/wizardTabElementary.js @@ -1,8 +1,8 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -22,8 +22,8 @@ OCA = OCA || {}; /** * initializes the instance. Always call it after initialization. * - * @param tabIndex - * @param tabID + * @param {any} tabIndex - + * @param {any} tabID - */ init: function (tabIndex, tabID) { tabIndex = 0; @@ -43,11 +43,15 @@ OCA = OCA || {}; }, ldap_dn: { $element: $('#ldap_dn'), - setMethod: 'setAgentDN' + setMethod: 'setAgentDN', + preventAutoSave: true, + $saveButton: $('.ldapSaveAgentCredentials') }, ldap_agent_password: { $element: $('#ldap_agent_password'), - setMethod: 'setAgentPwd' + setMethod: 'setAgentPwd', + preventAutoSave: true, + $saveButton: $('.ldapSaveAgentCredentials') }, ldap_base: { $element: $('#ldap_base'), @@ -65,7 +69,11 @@ OCA = OCA || {}; } }; this.setManagedItems(items); - _.bindAll(this, 'onPortButtonClick', 'onBaseDNButtonClick', 'onBaseDNTestButtonClick'); + _.bindAll(this, + 'onPortButtonClick', + 'onBaseDNButtonClick', + 'onBaseDNTestButtonClick' + ); this.managedItems.ldap_port.$relatedElements.click(this.onPortButtonClick); this.managedItems.ldap_base.$detectButton.click(this.onBaseDNButtonClick); this.managedItems.ldap_base.$testButton.click(this.onBaseDNTestButtonClick); @@ -206,6 +214,7 @@ OCA = OCA || {}; onConfigSwitch: function(view, configuration) { this.baseDNTestTriggered = false; view.disableElement(view.managedItems.ldap_port.$relatedElements); + view.managedItems.ldap_dn.$saveButton.removeClass('primary'); view.onConfigLoaded(view, configuration); }, @@ -236,8 +245,8 @@ OCA = OCA || {}; * updates the configuration chooser upon the deletion of a * configuration and, if necessary, loads an existing one. * - * @param view - * @param result + * @param {any} view - + * @param {any} result - */ onDeleteConfiguration: function(view, result) { if(result.isSuccess === true) { @@ -277,7 +286,14 @@ OCA = OCA || {}; } else if(objectsFound > 1000) { message = t('user_ldap', 'More than 1,000 directory entries available.'); } else { - message = t('user_ldap', objectsFound + ' entries available within the provided Base DN'); + message = n( + 'user_ldap', + '{objectsFound} entry available within the provided Base DN', + '{objectsFound} entries available within the provided Base DN', + objectsFound, + { + objectsFound: objectsFound + }); } } else { message = view.overrideErrorMessage(payload.data.message); diff --git a/apps/user_ldap/js/wizard/wizardTabExpert.js b/apps/user_ldap/js/wizard/wizardTabExpert.js index 7cfd49ba0f6..4848ced40fe 100644 --- a/apps/user_ldap/js/wizard/wizardTabExpert.js +++ b/apps/user_ldap/js/wizard/wizardTabExpert.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -17,8 +16,8 @@ OCA = OCA || {}; /** * initializes the instance. Always call it after initialization. * - * @param tabIndex - * @param tabID + * @param {any} tabIndex - + * @param {any} tabID - */ init: function (tabIndex, tabID) { this._super(tabIndex, tabID); @@ -65,7 +64,7 @@ OCA = OCA || {}; }, /** - * sets the attribute to be used to create an ownCloud ID (username) + * sets the attribute to be used to create an Nextcloud ID (username) * * @param {string} attribute */ diff --git a/apps/user_ldap/js/wizard/wizardTabGeneric.js b/apps/user_ldap/js/wizard/wizardTabGeneric.js index 21085e3a584..3496dee5009 100644 --- a/apps/user_ldap/js/wizard/wizardTabGeneric.js +++ b/apps/user_ldap/js/wizard/wizardTabGeneric.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -29,7 +28,7 @@ OCA = OCA || {}; bjQuiButtonClass: 'ui-button', /** - * @property {bool} - indicates whether a filter mode toggle operation + * @property {boolean} - indicates whether a filter mode toggle operation * is still in progress */ isToggling: false, @@ -53,6 +52,7 @@ OCA = OCA || {}; setManagedItems: function(managedItems) { this.managedItems = managedItems; this._enableAutoSave(); + this._enableSaveButton(); }, /** @@ -73,7 +73,7 @@ OCA = OCA || {}; /** * the method can be used to display a different error/information - * message than provided by the ownCloud server response. The concrete + * message than provided by the Nextcloud server response. The concrete * Tab View may optionally implement it. Returning an empty string will * avoid any notification. * @@ -146,8 +146,8 @@ OCA = OCA || {}; /** * displays server error messages. * - * @param view - * @param payload + * @param {any} view - + * @param {any} payload - */ onServerError: function(view, payload) { if ( !_.isUndefined(view.managedItems[payload.relatedKey])) { @@ -227,10 +227,12 @@ OCA = OCA || {}; * @param {Array} options */ equipMultiSelect: function($element, options) { - $element.empty(); - for (var i in options) { - var name = options[i]; - $element.append($('<option>').val(name).text(name).attr('title', name)); + if($element.find('option').length === 0) { + $element.empty(); + for (var i in options) { + var name = options[i]; + $element.append($('<option>').val(name).text(name).attr('title', name)); + } } if(!$element.hasClass('ldapGroupList')) { $element.multiselect('refresh'); @@ -319,7 +321,10 @@ OCA = OCA || {}; for(var id in this.managedItems) { if(_.isUndefined(this.managedItems[id].$element) - || _.isUndefined(this.managedItems[id].setMethod)) { + || _.isUndefined(this.managedItems[id].setMethod) + || (!_.isUndefined(this.managedItems[id].preventAutoSave) + && this.managedItems[id].preventAutoSave === true) + ) { continue; } var $element = this.managedItems[id].$element; @@ -332,6 +337,39 @@ OCA = OCA || {}; }, /** + * set's up save-button behavior (essentially used for agent dn and pwd) + * + * @private + */ + _enableSaveButton: function() { + var view = this; + + // TODO: this is not nice, because it fires one request per change + // in the scenario this happens twice, causes detectors to run + // duplicated etc. To have this work properly, the wizard endpoint + // must accept setting multiple changes. Instead of messing around + // with old ajax/wizard.php use this opportunity and create a + // Controller + for(var id in this.managedItems) { + if(_.isUndefined(this.managedItems[id].$element) + || _.isUndefined(this.managedItems[id].$saveButton) + ) { + continue; + } + (function (item) { + item.$saveButton.click(function(event) { + event.preventDefault(); + view._requestSave(item.$element); + item.$saveButton.removeClass('primary'); + }); + item.$element.change(function () { + item.$saveButton.addClass('primary'); + }); + })(this.managedItems[id]); + } + }, + + /** * initializes a multiSelect element * * @param {jQuery} $element @@ -353,9 +391,9 @@ OCA = OCA || {}; /** * @typedef {object} viewSaveInfo - * @property {function} val - * @property {function} attr - * @property {function} is + * @property {Function} val + * @property {Function} attr + * @property {Function} is */ /** @@ -391,7 +429,7 @@ OCA = OCA || {}; */ _setCheckBox: function($element, value) { if(parseInt(value, 10) === 1) { - $element.attr('checked', 'checked'); + $element.prop('checked', 'checked'); } else { $element.removeAttr('checked'); } @@ -417,7 +455,7 @@ OCA = OCA || {}; * sets the filter mode initially and resets the "isToggling" marker. * This method is called after a save operation against the mode key. * - * @param mode + * @param {any} mode - */ setFilterModeOnce: function(mode) { this.isToggling = false; @@ -514,7 +552,7 @@ OCA = OCA || {}; ) { toggleFnc(true); } else { - OCdialogs.confirm( + OC.dialogs.confirm( t('user_ldap', '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?'), t('user_ldap', 'Mode switch'), toggleFnc diff --git a/apps/user_ldap/js/wizard/wizardTabGroupFilter.js b/apps/user_ldap/js/wizard/wizardTabGroupFilter.js index 3fbff9de9a0..850387b4589 100644 --- a/apps/user_ldap/js/wizard/wizardTabGroupFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabGroupFilter.js @@ -1,7 +1,6 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabLoginFilter.js b/apps/user_ldap/js/wizard/wizardTabLoginFilter.js index 7b9a408784a..d907957ac95 100644 --- a/apps/user_ldap/js/wizard/wizardTabLoginFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabLoginFilter.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -16,8 +16,8 @@ OCA = OCA || {}; /** * initializes the instance. Always call it after initialization. * - * @param tabIndex - * @param tabID + * @param {any} tabIndex - + * @param {any} tabID - */ init: function (tabIndex, tabID) { this._super(tabIndex, tabID); @@ -85,6 +85,7 @@ OCA = OCA || {}; setModel: function(configModel) { this._super(configModel); this.configModel.on('configLoaded', this.onConfigSwitch, this); + this.configModel.on('configUpdated', this.onConfigUpdated, this); this.configModel.on('receivedLdapFeature', this.onFeatureReceived, this); }, @@ -133,7 +134,7 @@ OCA = OCA || {}; /** * presents the result of the login name test * - * @param result + * @param {any} result - */ handleLoginTestResult: function(result) { var message; @@ -142,25 +143,25 @@ OCA = OCA || {}; var usersFound = parseInt(result.changes.ldap_test_loginname, 10); if(usersFound < 1) { var filter = $('<p>').text(result.changes.ldap_test_effective_filter).html(); - message = t('user_ldap', 'User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>' + filter); + message = t('user_ldap', 'User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>' + filter); console.warn(filter); isHtml = true; } else if(usersFound === 1) { message = t('user_ldap', 'User found and settings verified.'); } else if(usersFound > 1) { - message = t('user_ldap', 'Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter.'); + message = t('user_ldap', 'Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in.'); } } else { - message = t('user_ldap', 'An unspecified error occurred. Please check the settings and the log.'); + message = t('user_ldap', 'An unspecified error occurred. Please check log and settings.'); if(!_.isUndefined(result.message) && result.message) { message = result.message; } if(message === 'Bad search filter') { message = t('user_ldap', 'The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise.'); } else if(message === 'connection error') { - message = t('user_ldap', 'A connection error to LDAP / AD occurred, please check host, port and credentials.'); + message = t('user_ldap', 'A connection error to LDAP/AD occurred. Please check host, port and credentials.'); } else if(message === 'missing placeholder') { - message = t('user_ldap', 'The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD.'); + message = t('user_ldap', 'The "%uid" placeholder is missing. It will be replaced with the login name when querying LDAP/AD.'); } } OC.Notification.showTemporary(message, {isHTML: isHtml}); @@ -205,6 +206,22 @@ OCA = OCA || {}; }, /** + * @param {WizardTabLoginFilter} view + * @param {Object} configuration + */ + onConfigUpdated: function(view, configuration) { + // When the user list filter is updated in assisted mode, also + // update the login filter automatically. + if( + !_.isUndefined(configuration.ldap_userlist_filter) + && view.parsedFilterMode === view.configModel.FILTER_MODE_ASSISTED + && _.toArray(configuration).length === 1 + ) { + view.configModel.requestWizard('ldap_login_filter'); + } + }, + + /** * if UserObjectClasses are found, the corresponding element will be * updated * diff --git a/apps/user_ldap/js/wizard/wizardTabUserFilter.js b/apps/user_ldap/js/wizard/wizardTabUserFilter.js index da7cb77568e..00aa62f0cd7 100644 --- a/apps/user_ldap/js/wizard/wizardTabUserFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabUserFilter.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -131,7 +131,7 @@ OCA = OCA || {}; if( key === 'ldap_userfilter_groups' && message === 'memberOf is not supported by the server' ) { - message = t('user_ldap', 'The group box was disabled, because the LDAP / AD server does not support memberOf.'); + message = t('user_ldap', 'The group box was disabled, because the LDAP/AD server does not support memberOf.'); } return message; } |