Coder Social home page Coder Social logo

cuba-platform / ldap-addon Goto Github PK

View Code? Open in Web Editor NEW
5.0 8.0 8.0 2.14 MB

The purpose of the LDAP Integration CUBA component is to provide a readily available instrument of employing features of a directory server, e.g. Active Directory, in any CUBA-based application.

License: Apache License 2.0

Java 86.12% XSLT 13.88%
cuba-platform cuba-component ldap apache2

ldap-addon's Introduction

LDAP

license Build Status

Overview

The LDAP integration CUBA component provides readily available instruments to enhance any CUBA-based application with the features of a directory server, e.g. Active Directory. The component is available for CUBA applications of any complexity and does not require any additional third-party frameworks or libraries.

The component provides the following functionality:

  • Using LDAP credentials to log in to CUBA applications
  • Configuring rules of role and user access group assignment
  • Populating user details from the LDAP server automatically
  • Logging LDAP synchronization details.

The following sample application can be used to test the component functionality.

Getting Started

Prerequisites

Before enabling the add-on, configure your directory server.

Installation

The add-on can be added to your project in one of the ways described below. Installation from the Marketplace is the simplest way. The last version of the add-on compatible with the used version of the platform will be installed. Also, you can install the add-on by coordinates choosing the required version of the add-on from the table.

In case you want to install the add-on by manual editing or by building from sources see the complete add-ons installation guide in CUBA Platform documentation.

From the Marketplace

  1. Open your application in CUBA Studio. Check the latest version of CUBA Studio on the CUBA Platform site.
  2. Go to CUBA -> Marketplace in the main menu.

marketplace

  1. Find the LDAP add-on there.

addons

  1. Click Install and apply the changes. The add-on corresponding to the used platform version will be installed.

By Coordinates

  1. Open your application in CUBA Studio. Check the latest version of CUBA Studio on the CUBA Platform site.
  2. Go to CUBA -> Marketplace in the main menu.
  3. Click the icon in the upper-right corner.

by-coordinates

  1. Paste the add-on coordinates in the corresponding field as follows:

com.haulmont.addon.ldap:ldap-global:<add-on version>

where <add-on version> is compatible with the used version of the CUBA platform.

Platform Version Add-on Version
7.2.x 1.5.2
7.1.x 1.4.0
7.0.x 1.3.2
6.10.x 1.2.0
6.9.x 1.1.1
6.8.x 1.0.1
  1. Click Install and apply the changes. The add-on will be installed to your project.

Configuration

Before using the add-on as a part of your application, configure initial values for connecting to the LDAP server and set up basic attribute names of the LDAP user in the app.properties file. An example of how to set up these properties is given below. Learn more about the application properties in Aappendix A.

ldap.contextSourceUrl = ldap://localhost:10389
ldap.contextSourceBase = dc=example,dc=com
ldap.contextSourceUserName = uid=admin,ou=system
ldap.contextSourcePassword = secret
ldap.referral = follow
ldap.sessionExpiringPeriodSec = 120
ldap.userSynchronizationBatchSize = 100
ldap.userSynchronizationOnlyActiveProperty = true
ldap.cubaGroupForSynchronization = Company
ldap.cubaGroupForSynchronizationInverse = false
ldap.synchronizeCommonInfoFromLdap = true
cuba.web.standardAuthenticationUsers = admin,anonymous

Then, specify the following properties in the web-app.properties file:

cuba.web.standardAuthenticationUsers = admin,anonymous
ldap.expiringSessionNotificationCron = */10 * * * * *
ldap.addonEnabled = true
ldap.expiringSessionsEnable = true

Note: If the component is enabled, users cannot log in to the application using CUBA credentials. However, you can permit particular users (e.g. system administrators) to log in using CUBA credentials by specifying their usernames as values of the cuba.web.standardAuthenticationUsers property.

Additional Information

If you want to use the component functionality in several CUBA applications, you have to enable it for each of them separately.

Component Functionalities

Predefined Roles

  • LDAP Admin role - LDAP configuration role.
  • Default LDAP role - default LDAP role, allows user to login with LDAP credentials.

LDAP Config

After installation, check that all configured property values are displayed properly on the LDAP Config screen (Menu: LDAP Component → LDAP Config).

LDAP-component-menu

LDAP-Config-Screen

The screen comprises three sections: Connection settings, Attribute Settings and Schema Settings. The description of each section is given below.

LDAP Connection Settings

The Connection settings section allows you to preview and test LDAP connection properties from the application UI.

LDAP-Config-Connection

Clicking the Test Connection button at the bottom of the screen launches connection testing. If the connection is successfully established, the corresponding message is displayed.

Attribute Settings

When a user logs in using LDAP credentials for the first time, your CUBA application creates a new User entity. The LDAP server passes all user details to the application. Make sure you provide user information when configuring your LDAP server. The Attribute Settings section enables you to match LDAP attributes and the fields of the User entity.

LDAP-Config-Basic-Attributes

LDAP Schema

The Schema Settings section allows you to define what can be stored as LDAP directory entries.

LDAP_Schema-Settings

Using the table, you can set up conditions of matching rule application.

Clicking the Refresh LDAP Attributes button uploads all attributes of the specified LDAP user object class. You can add attributes manually by using the Create button.

LDAP Matching Rules

LDAP matching rules are special rules to configure access rights for new application users (those created after logging in via LDAP). There are four rule types intended for this purpose:

  • Custom
  • Default
  • Simple
  • Scripting. You can create and manage LDAP matching rules using the LDAP Matching Rule screen (Menu: LDAP Component → LDAP Matching Rules).

LDAP Matching Rules Screen

The screen comprises the table of matching rules and testing section. Using the table, you can enable/disable certain rules using checkboxes in the Active column. The testing section allows you to check how the existing matching rules are applied to a particular user (see Testing LDAP Matching Rules).

Matching rules have order numbers defining the sequence of their application.

Custom Rule

The LDAP component provides the means to process programmatically defined custom rules. You can create custom rules by adding new classes to the classpath of your application. They have to be implemented as Spring beans and provided with the @LdapMatchingRule annotation. Custom rules can be viewed from the application UI. However, you cannot configure or edit them there.

The advantage of custom rules is that they allow you to specify conditions not related to LDAP attributes or schema. The example of a custom rule is provided below.

@Component
@LdapMatchingRule(name = "Custom Rule 1", condition = "Test Rule")
public class TestCustomRule implements CustomLdapMatchingRule {
	@Inject
	private CubaUserDao cubaUserDao;

	@Inject
	private RolesService rolesService;

	@Override
	public boolean applyCustomMatchingRule(LdapMatchingRuleContext ldapMatchingRuleContext) {
		if (ldapMatchingRuleContext.getLdapUser().getLogin().equalsIgnoreCase("barts")) {
			User admin = cubaUserDao.getOrCreateCubaUser("admin");
			Role role = rolesService.getRoleDefinitionAndTransformToRole(admin.getUserRoles().get(0).getRoleName());
			ldapMatchingRuleContext.getRoles().add(role);
			ldapMatchingRuleContext.setGroup(admin.getGroup());
		}
		return true;
	}
}

Default Rule

When you launch your application for the first time after component installation, the system automatically creates the default rule.

It is used if none of other rules were applied, i.e. conditions for applying the existing rules were not met. The system always applies the default rule the last. That is why it contains the LAST value in the Order field.

You can edit the default rule by clicking the Edit button. All fields and settings present in Default Matching Rule Editor are described in the section below.

Default Matching Rule Editor

Default Rule Editor

  • Description: a short description of the default rule.
  • Terminal rule: if checked, then rules coming after the current one (according to the rule order) are not applied.
  • Access group: an access group to be assigned to the user, if the default rule is applied.
  • Override existing access group: if checked, then the system removes the previously assigned access group and uses the one specified in the Access group field.
  • Override existing roles: if checked, then the system removes all previously assigned roles and uses the ones specified in the 'Roles' section.

The Roles table allows you to create a set of roles to be assigned to a user, if the default rule is used.

Simple Rule

Simple rules grant access rights (by assigning an access group and roles) to users, if the specified conditions are met. To create a simple rule, select the Create Simple Rule option from the menu of the Create Matching Rule button.

Simple Matching Rule Editor

Simple Rule Editor

Simple Matching Rule Editor comprises settings and tables to configure simple matching rules:

  1. General details and settings. The fields are similar to the ones described in Default Matching Rule Editor.
  2. Conditions. The section enables you to add conditions to be met for successful rule application. Click the Create button to open Simple Rule Condition Editor.

Simple Rule Condition Editor

The editor contains the following fields:

  • Attribute: an LDAP attribute to be checked before applying the current simple rule.

Note: Before creating conditions it is required to add them to the existing LDAP Schema (for more details, refer to LDAP Schema).

  • Attribute Value: a value of the selected attribute. The system applies the rule to those user entities having the specified value of the selected attribute.
  1. Roles. In this section, you can add user roles to be assigned to the user in case of successful rule application.

Scripting Rule

You can provide a Groovy script with a set of conditions to be met to grant a user access rights. To create a new scripting rule, select the Create Scripting Rule option from the Create matching rule button menu.

Scripting Matching Rule Editor

Scripting Matching Rule Editor contains a set of general fields (these fields are similar to the ones described in Default Matching Rule Editor), a section for specifying and testing Groovy scripts and a table of roles.

Scripting Matching Rule Editor

The component uses the specified condition to evaluate the matching rule context. Note that the {ldapContext} placeholder has to be used as an alias for the LDAP matching rule context. The {ldapContext} provides the following fields:

  • ldapUser: main LDAP person properties (login, cn, sn, email, memberOf, accessGroups, isDisabled, position, language, ou)
  • appliedRules: matching rules that were applied to the context
  • roles: previously assigned user roles
  • group: an access group that the user currently belongs to
  • cubaUser: a CUBA user to whom a current matching rule is applied.
  • isTerminalRuleApply: if checked, a current rule is a terminal one, i.e. once it is used, no other rules are applied.

Testing LDAP Matching Rules

After creating all required matching rules, you can test them right from the LDAP Matching Rule screen. For this purpose, enter a user login in the corresponding field and click Test Rules.

After that, the applied matching rules, access groups and roles are displayed in the corresponding fields and tables. This functionality is useful when you need to check the accuracy of rule application.

LDAP Log

You can use the LDAP Log screen to view all activities related to LDAP connection from the application UI. This includes user authentication checks, rule application, user entity updates and errors that occur while using the component features.

LDAP Log

In order to view any log entry, just double-click it, or select it in the table and click the View button.

Clicking the Excel button enables you to download details of the selected rows (or all rows if required) to an *.XLS file.

Scheduled Task Configuration

Before setting up scheduled tasks, make sure that application properties are configured in the web-app.properties and app.properties files.

There are several scheduled tasks that you can configure for the LDAP component:

  • checkExpiredSessions(): checks if a new access group or role was assigned to the current user, or if they were activated/deactivated.
  • killExpiredSessions(): terminates the current user session, if the user was activated/deactivated, or a new access group/set of roles was assigned to them.
  • synchronizeUsersFromLdap(): synchronizes CUBA user details in accordance with their state in LDAP.

In order to register scheduled tasks in your application, follow the guidelines below.

Scheduled Task to Check User Sessions

  1. Open Menu: Administration → Scheduled Tasks.
  2. Click the Create button.
  3. Fill in the required fields as follows:
    • Bean Name: ldap_UserSynchronizationSchedulerService
    • Method Name: checkExpiredSessions()
    • Scheduling Type: Cron
    • Cron Expression: specify a required cron expression (see documentation for more details)

Scheduled Task 1

  1. Click OK to save the changes.
  2. Activate the created task by clicking the corresponding button on the Scheduled Tasks screen.

Scheduled Task to Kill User Sessions

  1. Open Menu: Administration → Scheduled Tasks.
  2. Click the Create button.
  3. Fill in the required fields as follows:
    • Bean Name: ldap_UserSynchronizationSchedulerService
    • Method Name: killExpiredSessions()
    • Scheduling Type: Cron
    • Cron Expression: specify a required cron expression (see documentation for more details)

Scheduled Task 2

  1. Click OK to save the changes.
  2. Activate the created task by clicking the corresponding button on the Scheduled Tasks screen.

Scheduled Task to Synchronize Users

  1. Open Menu: Administration → Scheduled Tasks.
  2. Click the Create button.
  3. Fill in the required fields as follows:
    • Bean Name: ldap_UserSynchronizationSchedulerService
    • Method Name: synchronizeUsersFromLdap()
    • Scheduling Type: Cron
    • Cron Expression: specify a required cron expression (see documentation for more details)

Scheduled Task 3

  1. Click OK to save the changes.
  2. Activate the created task by clicking the corresponding button on the Scheduled Tasks screen.

Enabling Scheduled Tasks

  1. Open Menu: Administration → Application Properties.
  2. Set the value of the cuba.schedulingActive property to true.

Enabling Scheduling

After you have created the scheduled tasks and enabled scheduling, the system will check user sessions once in the specified period of time.

If there are any changes related to access groups, user roles or user status (i.e. activation/deactivation), the system shows the notification that the current session is about to expire and terminates it once the time threshold is passed.

If user details change on the LDAP server side, the component updates CUBA user details as well.

EventListeners to Interact with LDAP Add-on Events

In order to make your application react to the events related to the LDAP component, register the @Component methods as event listeners using the @EventListener annotation. The example of how to configure an event listener is given below:

import org.springframework.context.event.EventListener;

@Component
public class LdapEventListener {

    @EventListener
    public void userCreatedFromLdap(UserCreatedFromLdapEvent event) {
      // handles user creation event
    }
}

Event types

The application component supports the following LDAP event types:

  • BeforeUserRolesAndAccessGroupUpdatedFromLdapEvent: defines the state of the CUBA user before matching rule application, i.e. before the system assigns user roles and an access group to them.
  • AfterUserRolesAndAccessGroupUpdatedFromLdapEvent: defines the state of the CUBA user after matching rule application, i.e. after the system assigns user roles and an access group to them.
  • UserCreatedFromLdapEvent: describes the state of the new CUBA user, i.e. after logging in using LDAP credentials.
  • UserActivatedFromLdapEvent: defines the state of the CUBA user that was previously inactive and then activated.
  • UserDeactivatedFromLdapEvent: defines the state of the CUBA user that was previously active and then deactivated.

Appendix A. Application Properties

Before working with the component you need to configure application properties. Specify them in the app.properties and web-app.properties files of your application.

app.properties

ldap.contextSourceUrl

  • Description: defines a URL for reaching an LDAP server.
  • Default value: ldap://localhost:10389

ldap.contextSourceBase

  • Description: defines a base DN. If configured, all LDAP operations on contexts retrieved from this ContextSource relate to this DN. The default value is an empty distinguished name (i.e. all operations relate to the directory root).
  • Default value: dc=springframework,dc=org

ldap.contextSourceUserName

  • Description: indicates a username (principal) used for authentication. This is normally the distinguished name of the admin user.
  • Default value: uid=admin,ou=system

ldap.contextSourcePassword

  • Description: defines a password used for authentication.
  • Default value: secret

ldap.referral

  • Description: defines the strategy to handle referrals, as described in this documentation.
  • Default value: follow

ldap.sessionExpiringPeriodSec

  • Description: indicates a period in seconds after which the system terminates a user session, if you deactivate the user or assign a new access group / matching rules to them.
  • Default value: 30

cuba.web.standardAuthenticationUsers

  • Description: defines users that can log in to the system using standard CUBA credentials.
  • Default value: admin,anonymous

ldap.userSynchronizationBatchSize

  • Description: defines the number of users that can be synchronized during the execution of the synchronizeUsersFromLdap() scheduled task.
  • Default value: 100

ldap.userSynchronizationOnlyActiveProperty

  • Description: if set to true, the synchronizeUsersFromLdap() scheduled task updates only the value of the Active attribute. Otherwise, the system updates all user details.
  • Default value: true

ldap.cubaGroupForSynchronization

  • Description: defines access groups that are checked when the system executes the synchronizeUsersFromLdap() scheduled task.
  • Default value: Company

ldap.cubaGroupForSynchronizationInverse

  • Description: if set to true, then the system checks all groups when executing the synchronizeUsersFromLdap() scheduled task (except for the ones specified in ldap.cubaGroupForSynchronization).
  • Default value: false

ldap.synchronizeCommonInfoFromLdap

  • Description: if set to true, then the synchronizeUsersFromLdap() scheduled task updates the values of the following user attributes in accordance with their state on the LDAP server side: Email, Name, First name, Last name, Middle name, Position, Language).
  • Default value: true

web-app.properties

cuba.web.standardAuthenticationUsers

  • Description: defines users that can log in to the system using standard CUBA credentials.
  • Default value: admin,anonymous

ldap.expiringSessionNotificationCron

  • Description: defines the cron expression for retrieving expired sessions from the middleware layer.
  • Default value: */10 * * * * *

ldap.addonEnabled

  • Description: if set to true, then the LDAP add-on is enabled.
  • Default value: true

ldap.expiringSessionsEnable

  • Description: if set to true, the system sends notifications to inform the user that their session is about to expire.
  • Default value: true

ldap-addon's People

Contributors

aleksey-stukalov avatar alx-mag avatar antmarr avatar avagulov avatar desire456 avatar glebshalyganov avatar gorbunkov avatar nikitashchienko avatar shmelev-haulmont avatar smianna avatar testuser346 avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ldap-addon's Issues

Default rule is not created when launching the application for the first time

Steps to reproduce:

  1. Add the component to a project.
  2. Launch the application.
  3. Run the following SQL script:
select * from LDAP_MATCHING_RULE

Expected Result: The default matching rule is created automatically when launching a project for the first time.

Actual result: The default rule is not created or shown neither in the database nor in the application UI (LDAP Component → LDAP matching rule).

Refactoring expiring session functionality.

1)Switch to CopyOnWriteArrayList instead direct use of ReadWriteLock.
2)Use WeakReference in user sessions storage.
3)Add property to on/off expiring session functionality in web-app.

Cosmetics

  1. Straighten the captions of the 'User Login' and 'Group' fields on LDAP Matching Rules Screen.
    image.png

  2. Straighten the caption of the 'User Login' field in Scripting Matching Rule Editor.
    image.png

  3. Enlarge the 'Error' field in LDAP Log (make it 8 or, if possible, 10 lines instead of 4). There is a lot of unused space in the bottom of the screen and the current size makes it hard to read error details, even though scrolling is available.
    image.png

  4. The names of the 'Applied Roles' and 'Applied Matching Rules' tables on LDAP Matching Rules Screen should be farther from the tables themselves. They will also look better in bold.
    default

Issues related to custom rules

  1. New custom rules always have the '1' value in the order field. Order numbers of freshly created custom rules should be set in accordance with the existing order, e.g. if there are 4 rules in the system, a new custom rule should have the '5' value in the order field.
  2. Rename the attributes in LdapMatchingRule.java and UI: name and condition should be used (attribute captions should be capitalized in the UI).
  3. The 'Edit' and 'Remove' buttons should be disabled when a custom rule is selected in the table.

'rule_type' column is duplicated in 'LDAP_MATCHING_RULE' table

The following database types were tested for compatibility with the LDAP addon:

  • HSQLDB
  • PostgreSQL
  • Microsoft SQL Server
  • Microsoft SQL Server 2005
  • Microsoft SQL Server 2012+
  • Oracle Database
  • MySQL

As a result, the component works properly only when using the PostgreSQL database type. In all other cases, the update scripts fail and the following exception is shown:

java.sql.SQLException: Column names in each table must be unique. Column name 'RULE_TYPE' in table 'LDAP_MATCHING_RULE' is specified more than once.

The easiest way to reproduce the issue:

Preconditions:

  • The component should be imported and installed in CUBA Studio.

Steps to reproduce:

  1. Open the Samples tab in Studio and download the sample-sales project.
  2. Once the project is opened, edit project properties:
  • Change the platform version to 6.8.8;
  • Select HSQLDB in the Database type field;
  • Click Apply;
  • Add the component to the App components section;
  • Open the Advanced tab and tick the Use local maven repository checkbox;
  • Click OK to save the changes.
  1. Invoke Run → Create database.
  2. Open the Data Model section and click Generate DB scripts.
  3. Click Update database.

Refactoring

1)Change before/after userCreated & userDeactivated events with userCreated & userDeactivated
2)Delete status and order with matching rule
3)If user preserve some roles after matcing rules applying do not overwrite them in DB
4)Remove SoftDelete from LdapAttribute entity
5)Switch to eager LdapCondition's fetching in SimpleMatchingRule
6)If user was deactivated don't apply matching rules
7)Add pooling for spring ldapContext bean

Oracle and MySQL databases cannot be created

  1. When creating a new Oracle database, the ORA-00911 error occurs.

  2. When creating a new MySQL database, the following script cannot be executed:

INSERT INTO LDAP_MATCHING_RULE_ORDER(id,version,create_ts,created_by,order_) values('ff2ebe743836465b918560141a6a0548',0,curdate(),'admin',2147483647);
INSERT INTO LDAP_MATCHING_RULE_STATUS(id,version,create_ts,created_by,is_active) values('ff2ebe743836465b918560141a6a0548',0,curdate(),'admin',true);
INSERT INTO LDAP_MATCHING_RULE (id,version,create_ts,created_by,rule_type,description,is_terminal_rule,is_override_existing_roles,
is_override_exist_access_grp,matching_rule_order_id,matching_rule_status_id)
values
('ff2ebe743836465b918560141a6a0548',0,now(),'admin','DEFAULT','Default rule',false,false,false,'ff2ebe743836465b918560141a6a0548','ff2ebe743836465b918560141a6a0548');
update LDAP_MATCHING_RULE set access_group_id = (select id from sec_group where name='Company') where id = 'ff2ebe743836465b918560141a6a0548';
insert into LDAP_MATCHING_RULE_ROLE_LINK (matching_rule_id, role_id) values ('ff2ebe743836465b918560141a6a0548', (select id from sec_role where name='Administrators'));
INSERT INTO LDAP_LDAP_CONFIG (id,version,update_ts,updated_by,SCHEMA_BASE,LDAP_USER_OBJECT_CLASSES,OBJECT_CLASS_PROPERTY_NAME,ATTRIBUTE_PROPERTY_NAMES,
EMAIL_ATTRIBUTE,CN_ATTRIBUTE,SN_ATTRIBUTE,MEMBER_OF_ATTRIBUTE,POSITION_ATTRIBUTE,OU_ATTRIBUTE,LANGUAGE_ATTRIBUTE,INACTIVE_USER_ATTRIBUTE,USER_BASE,LOGIN_ATTRIBUTE,
GIVEN_NAME_ATTRIBUTE,MIDDLE_NAME_ATTRIBUTE,DEFAULT_ACCESS_GROUP_NAME)
values
('ff2ebe743836465b918560141a6a0548',0,curdate(),'admin','CN=Schema,CN=Configuration','person;inetOrgPerson','CN','systemMustContain;systemMayContain;mayContain;MustContain',
'mail','cn','sn','memberOf','employeeType','ou','preferredLanguage','userAccountControl','','sAMAccountName','givenName','middleName','Company');

rule_type column is specified more than once

When creating a new application database, the following exception occurs:

Failed to execute: -- begin LDAP_MATCHING_RULE
create table LDAP_MATCHING_RULE (
ID uuid,
VERSION integer not null,
CREATE_TS timestamp,
CREATED_BY varchar(50),
UPDATE_TS timestamp,
UPDATED_BY varchar(50),
DELETE_TS timestamp,
DELETED_BY varchar(50),
RULE_TYPE varchar(50) not null,
MATCHING_RULE_STATUS_ID uuid not null,
MATCHING_RULE_ORDER_ID uuid not null,
DESCRIPTION varchar(1500),
RULE_TYPE varchar(31),
--
ACCESS_GROUP_ID uuid,
IS_TERMINAL_RULE boolean,
IS_OVERRIDE_EXISTING_ROLES boolean,
IS_OVERRIDE_EXIST_ACCESS_GRP boolean,
--
-- from ldap$ScriptingMatchingRule
STRING_CONDITION text,
--
primary key (ID)
) because: ОШИБКА: столбец "rule_type" указан неоднократно
:app-core:createDb FAILED

Login fails if LDAP server is stopped

The following error is shown in Tomcat when logging in using LDAP credentials and having the LDAP server stopped:

18:52:16.630 ERROR c.h.cuba.core.sys.ServiceInterceptor - Exception:
org.springframework.ldap.CommunicationException: localhost:10389; nested exception is javax.naming.CommunicationException: localhost:10389 [Root exception is java.net.ConnectException: Connection refu
sed: connect]
        at org.springframework.ldap.support.LdapUtils.convertLdapException(LdapUtils.java:108) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:355) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.support.AbstractContextSource.doGetContext(AbstractContextSource.java:139) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.support.AbstractContextSource.getReadWriteContext(AbstractContextSource.java:174) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.transaction.compensating.manager.TransactionAwareContextSourceProxy.getReadWriteContext(TransactionAwareContextSourceProxy.java:88) ~[spring-ldap-core-2.3.2.RELEASE
.jar:2.3.2.RELEASE]
        at org.springframework.ldap.transaction.compensating.manager.TransactionAwareContextSourceProxy.getReadOnlyContext(TransactionAwareContextSourceProxy.java:61) ~[spring-ldap-core-2.3.2.RELEASE.
jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:357) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:309) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:642) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:578) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.LdapTemplate.authenticate(LdapTemplate.java:1441) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.LdapTemplate.authenticate(LdapTemplate.java:1426) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.LdapTemplate.authenticate(LdapTemplate.java:1359) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at com.haulmont.addon.ldap.core.dao.LdapUserDao.authenticateLdapUser(LdapUserDao.java:83) ~[ldap-core-0.1-SNAPSHOT.jar:na]
        at com.haulmont.addon.ldap.core.service.AuthUserServiceBean.ldapAuth(AuthUserServiceBean.java:20) ~[ldap-core-0.1-SNAPSHOT.jar:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:117) ~[cuba-core-6.8.6.jar:6.8.6]
        at sun.reflect.GeneratedMethodAccessor136.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at com.sun.proxy.$Proxy269.ldapAuth(Unknown Source) [na:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94) [cuba-core-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154) [cuba-web-6.8.6.jar:6.8.6]
        at com.sun.proxy.$Proxy63.ldapAuth(Unknown Source) [na:na]
        at com.haulmont.addon.ldap.web.security.ldapcomponent.LdapAddonLoginProvider.login(LdapAddonLoginProvider.java:60) [ldap-web-0.1-SNAPSHOT.jar:na]
        at com.haulmont.cuba.web.security.ConnectionImpl.loginInternal(ConnectionImpl.java:209) [cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.security.ConnectionImpl.login(ConnectionImpl.java:89) [cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.app.loginwindow.AppLoginWindow.doLogin(AppLoginWindow.java:342) [cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.app.loginwindow.AppLoginWindow.doLogin(AppLoginWindow.java:311) [cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.app.loginwindow.AppLoginWindow.login(AppLoginWindow.java:257) [cuba-web-6.8.6.jar:6.8.6]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.haulmont.cuba.gui.xml.DeclarativeAction.actionPerform(DeclarativeAction.java:92) [cuba-gui-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.gui.WebWindow$1.handleAction(WebWindow.java:142) [cuba-web-6.8.6.jar:6.8.6]
        at com.vaadin.event.ActionManager.handleAction(ActionManager.java:245) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.event.ActionManager.handleActions(ActionManager.java:228) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.haulmont.cuba.web.toolkit.ui.CubaOrderedActionsLayout.changeVariables(CubaOrderedActionsLayout.java:83) [cuba-web-6.8.6.jar:6.8.6]
        at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:623) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:470) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:413) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300) [cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191) [cuba-web-6.8.6.jar:6.8.6]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [servlet-api.jar:na]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
        at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) [spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) [spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107) [cuba-web-6.8.6.jar:6.8.6]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.23]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:8.5.23]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:8.5.23]
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) [catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:8.5.23]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [catalina.jar:8.5.23]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-coyote.jar:8.5.23]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.23]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-coyote.jar:8.5.23]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-coyote.jar:8.5.23]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.23]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.23]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
Caused by: javax.naming.CommunicationException: localhost:10389
        at com.sun.jndi.ldap.Connection.<init>(Connection.java:226) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:137) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1615) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2749) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:319) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:192) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:210) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:153) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:83) ~[na:1.8.0_171]
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684) ~[na:1.8.0_171]
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313) ~[na:1.8.0_171]
        at javax.naming.InitialContext.init(InitialContext.java:244) ~[na:1.8.0_171]
        at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:154) ~[na:1.8.0_171]
        at org.springframework.ldap.core.support.LdapContextSource.getDirContextInstance(LdapContextSource.java:42) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:343) ~[spring-ldap-core-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        ... 93 common frames omitted
Caused by: java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[na:1.8.0_171]
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) ~[na:1.8.0_171]
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_171]
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_171]
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_171]
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_171]
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_171]
        at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_171]
        at java.net.Socket.connect(Socket.java:538) ~[na:1.8.0_171]
        at java.net.Socket.<init>(Socket.java:434) ~[na:1.8.0_171]
        at java.net.Socket.<init>(Socket.java:211) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.Connection.createSocket(Connection.java:363) ~[na:1.8.0_171]
        at com.sun.jndi.ldap.Connection.<init>(Connection.java:203) ~[na:1.8.0_171]
        ... 107 common frames omitted
18:52:16.657 ERROR c.h.c.w.a.loginwindow.AppLoginWindow - Internal error during login
com.haulmont.cuba.security.global.InternalAuthenticationException: Exception is thrown by login provider
        at com.haulmont.cuba.web.security.ConnectionImpl.loginInternal(ConnectionImpl.java:225) ~[cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.security.ConnectionImpl.login(ConnectionImpl.java:89) ~[cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.app.loginwindow.AppLoginWindow.doLogin(AppLoginWindow.java:342) [cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.app.loginwindow.AppLoginWindow.doLogin(AppLoginWindow.java:311) [cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.app.loginwindow.AppLoginWindow.login(AppLoginWindow.java:257) [cuba-web-6.8.6.jar:6.8.6]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.haulmont.cuba.gui.xml.DeclarativeAction.actionPerform(DeclarativeAction.java:92) [cuba-gui-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.gui.WebWindow$1.handleAction(WebWindow.java:142) [cuba-web-6.8.6.jar:6.8.6]
        at com.vaadin.event.ActionManager.handleAction(ActionManager.java:245) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.event.ActionManager.handleActions(ActionManager.java:228) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.haulmont.cuba.web.toolkit.ui.CubaOrderedActionsLayout.changeVariables(CubaOrderedActionsLayout.java:83) [cuba-web-6.8.6.jar:6.8.6]
        at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:623) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:470) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:413) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361) [vaadin-server-7.7.13.cuba.8.jar:7.7.13.cuba.8]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300) [cuba-web-6.8.6.jar:6.8.6]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191) [cuba-web-6.8.6.jar:6.8.6]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [servlet-api.jar:na]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
        at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) [spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) [spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107) [cuba-web-6.8.6.jar:6.8.6]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.23]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:8.5.23]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:8.5.23]
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) [catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:8.5.23]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [catalina.jar:8.5.23]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-coyote.jar:8.5.23]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.23]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-coyote.jar:8.5.23]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-coyote.jar:8.5.23]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.23]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.23]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
Caused by: com.haulmont.cuba.core.global.RemoteException: Connection refused: connect
        at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:129) ~[na:na]
        at sun.reflect.GeneratedMethodAccessor136.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at com.sun.proxy.$Proxy269.ldapAuth(Unknown Source) ~[na:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94) ~[na:na]
        at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154) ~[cuba-web-6.8.6.jar:6.8.6]
        at com.sun.proxy.$Proxy63.ldapAuth(Unknown Source) ~[na:na]
        at com.haulmont.addon.ldap.web.security.ldapcomponent.LdapAddonLoginProvider.login(LdapAddonLoginProvider.java:60) ~[ldap-web-0.1-SNAPSHOT.jar:na]
        at com.haulmont.cuba.web.security.ConnectionImpl.loginInternal(ConnectionImpl.java:209) ~[cuba-web-6.8.6.jar:6.8.6]
        ... 51 common frames omitted

Users cannot be disabled

Steps to reproduce:

  1. Disable a user on the LDAP server side.
  2. Log in to the CUBA application using credentials of this inactive user.

Expected Result: Login should be restricted to the inactive user.
Actual Result: The user is considered active and can log in to the system.

Values of LDAP attributes are populated incorrectly

When a user logs in to the application using LDAP credentials for the first time, a new CUBA user is created in the system. Currently, values of the sn LDAP attribute are not populated from LDAP at all, and values of the cn LDAP attribute are set in the Name field of the User entity.

Instead of this, values of the cn LDAP attribute have to be set in the First Name field and values of sn have to be specified in the Second Name field.

[Cosmetics] Straighten captions in Matching Rule Editors

The 'Override existing roles' field (in Scripting Rule Editor, Simple Rule Editor and Default Rule Editor) is currently implemented as a combination of a checkbox and label and this makes it hard to straighten it all up. Thus, the combination should be replaced with something more proper.

LDAP_Config is not created when launching the application for the first time

Steps to reproduce:

  1. Add the component to a project
  2. Launch the application.
  3. Log in to the application
  4. Open LDAP Component → LDAP Config

Expected Result: LDAP Config Screen is opened.
Actual Result:

com.haulmont.cuba.core.global.RemoteException:
---
javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.
    at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:129)
    at sun.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy269.getLdapConfig(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94)
    at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154)
    at com.sun.proxy.$Proxy61.getLdapConfig(Unknown Source)
    at com.haulmont.addon.ldap.web.ldapconfig.LdapConfigEdit.postInit(LdapConfigEdit.java:65)
    at com.haulmont.cuba.gui.components.AbstractEditor.setItem(AbstractEditor.java:70)
    at com.haulmont.cuba.gui.WindowManager.openEditor(WindowManager.java:888)
    at com.haulmont.cuba.web.WebWindowManager.openEditor(WebWindowManager.java:175)
    at com.haulmont.cuba.gui.WindowManager.openEditor(WindowManager.java:837)
    at com.haulmont.cuba.gui.config.MenuCommand$ScreenCommand.run(MenuCommand.java:179)
    at com.haulmont.cuba.gui.config.MenuCommand.execute(MenuCommand.java:76)
    at com.haulmont.cuba.web.sys.MenuBuilder.lambda$createMenuBarCommand$0(MenuBuilder.java:176)
    at com.haulmont.cuba.web.gui.components.mainwindow.WebAppMenu$MenuItemImpl.lambda$setCommand$2434f46b$1(WebAppMenu.java:342)
    at com.vaadin.ui.MenuBar.changeVariables(MenuBar.java:212)
    at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:623)
    at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:470)
    at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:413)
    at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
    at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
    at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
    at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300)
    at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
    at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
    at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

IllegalStateException when viewing log details

Steps to reproduce:

  1. Open LDAP Component → LDAP Log
  2. Select an entry and click Edit
  3. Click OK

Expected Result: Log details are closed.
Actual Result:

java.lang.IllegalStateException: Cannot get unfetched attribute [createTs] from detached object com.haulmont.addon.ldap.entity.UserSynchronizationLog-81028f76-b068-8e9d-3a22-cbb11f1aa3e0 [detached].
	at org.eclipse.persistence.internal.queries.EntityFetchGroup.onUnfetchedAttribute(EntityFetchGroup.java:98)
	at com.haulmont.cuba.core.sys.persistence.CubaEntityFetchGroup.onUnfetchedAttribute(CubaEntityFetchGroup.java:61)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.processUnfetchedAttribute(EntityManagerImpl.java:2846)
	at com.haulmont.chile.core.model.impl.AbstractInstance._persistence_checkFetched(AbstractInstance.java)
	at com.haulmont.addon.ldap.entity.UserSynchronizationLog._persistence_get_createTs(UserSynchronizationLog.java)
	at com.haulmont.addon.ldap.entity.UserSynchronizationLog.getCreateTs(UserSynchronizationLog.java:187)
	at sun.reflect.GeneratedMethodAccessor258.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.haulmont.chile.core.model.utils.MethodsCache.invokeGetter(MethodsCache.java:72)
	at com.haulmont.chile.core.model.impl.AbstractInstance.getValue(AbstractInstance.java:102)
	at com.haulmont.cuba.core.entity.BaseGenericIdEntity.getValue(BaseGenericIdEntity.java:139)
	at com.haulmont.chile.core.model.utils.InstanceUtils.getValueEx(InstanceUtils.java:139)
	at com.haulmont.cuba.web.gui.data.PropertyWrapper.getValue(PropertyWrapper.java:76)
	at com.haulmont.cuba.web.gui.components.WebAbstractTable$TablePropertyWrapper.getValue(WebAbstractTable.java:2044)
	at com.haulmont.cuba.web.gui.data.PropertyWrapper.getFormattedValue(PropertyWrapper.java:149)
	at com.haulmont.cuba.web.gui.components.WebAbstractTable$TablePropertyWrapper.getFormattedValue(WebAbstractTable.java:2030)
	at com.haulmont.cuba.web.toolkit.ui.CubaGroupTable.formatPropertyValue(CubaGroupTable.java:61)
	at com.haulmont.cuba.web.toolkit.ui.CubaTable.getPropertyValue(CubaTable.java:200)
	at com.vaadin.ui.Table.parseItemIdToCells(Table.java:2387)
	at com.vaadin.ui.Table.getVisibleCellsNoCache(Table.java:2237)
	at com.vaadin.ui.Table.refreshRenderedCells(Table.java:1780)
	at com.vaadin.ui.Table.refreshRowCache(Table.java:2687)
	at com.vaadin.ui.Table.containerItemSetChange(Table.java:4616)
	at com.vaadin.data.util.ContainerOrderedWrapper$PiggybackListener.containerItemSetChange(ContainerOrderedWrapper.java:706)
	at com.haulmont.cuba.web.gui.data.CollectionDsWrapper.fireItemSetChanged(CollectionDsWrapper.java:109)
	at com.haulmont.cuba.web.gui.data.CollectionDsWrapper$ContainerDatasourceCollectionChangeListener.collectionChanged(CollectionDsWrapper.java:270)
	at com.haulmont.cuba.web.gui.components.WebGroupTable$GroupTableDsWrapper$3.collectionChanged(WebGroupTable.java:785)
	at com.haulmont.bali.events.EventRouter.fireEvent(EventRouter.java:45)
	at com.haulmont.cuba.gui.data.impl.CollectionDsListenersWrapper.collectionChanged(CollectionDsListenersWrapper.java:53)
	at com.haulmont.cuba.web.gui.components.WebAbstractTable$TableCollectionDsListenersWrapper.collectionChanged(WebAbstractTable.java:3037)
	at com.haulmont.cuba.gui.data.impl.WeakCollectionChangeListener.collectionChanged(WeakCollectionChangeListener.java:41)
	at com.haulmont.bali.events.EventRouter.fireEvent(EventRouter.java:45)
	at com.haulmont.cuba.gui.data.impl.AbstractCollectionDatasource.fireCollectionChanged(AbstractCollectionDatasource.java:373)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.updateItem(CollectionDatasourceImpl.java:524)
	at com.haulmont.cuba.gui.components.actions.EditAction.lambda$internalOpenEditor$1(EditAction.java:285)
	at com.haulmont.cuba.web.gui.WebWindow.fireWindowClosed(WebWindow.java:910)
	at com.haulmont.cuba.web.gui.WebWindow.onClose(WebWindow.java:902)
	at com.haulmont.cuba.web.gui.WebWindow$Editor.onClose(WebWindow.java:1689)
	at com.haulmont.cuba.web.gui.WebWindow.close(WebWindow.java:1199)
	at com.haulmont.cuba.web.gui.WebWindow$Editor.commitAndClose(WebWindow.java:1756)
	at com.haulmont.cuba.gui.components.AbstractEditor.commitAndClose(AbstractEditor.java:109)
	at com.haulmont.cuba.gui.components.EditorWindowDelegate$2.actionPerform(EditorWindowDelegate.java:102)
	at com.haulmont.cuba.web.gui.components.WebButton.performAction(WebButton.java:44)
	at com.haulmont.cuba.web.gui.components.WebButton.lambda$new$61446b05$1(WebButton.java:36)
	at sun.reflect.GeneratedMethodAccessor254.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
	at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037)
	at com.vaadin.ui.Button.fireClick(Button.java:377)
	at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:54)
	at com.vaadin.ui.Button$1.click(Button.java:54)
	at sun.reflect.GeneratedMethodAccessor253.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409)
	at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
	at com.haulmont.addon.ldap.web.extauth.LdapComponentAuthProvider.doFilter(LdapComponentAuthProvider.java:33)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:112)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

Error occurs after killing a user session

When a user session is killed (e.g. when matching rules are changed), the following errors occur:
1.

16:30:21.989 ERROR com.haulmont.cuba.web.log.AppLog - Exception in com.haulmont.cuba.web.toolkit.ui.CubaMenuBar: com.haulmont.cuba.security.global.NoUserSessionException: User session not found: 27d45
069-8aea-4ceb-6128-ca419025ba2c
╨░╨┐╤А 28, 2018 4:30:46 PM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE:
org.apache.catalina.connector.ClientAbortException: java.io.IOException: ╨Я╤А╨╛╨│╤А╨░╨╝╨╝╨░ ╨╜╨░ ╨▓╨░╤И╨╡╨╝ ╤Е╨╛╤Б╤В-╨║╨╛╨╝╨┐╤М╤О╤В╨╡╤А╨╡ ╤А╨░╨╖╨╛╤А╨▓╨░╨╗╨░ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╜╨╛╨╡ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡
╨╜╨╕╨╡
        at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:356)
        at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:815)
        at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:720)
        at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:391)
        at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:369)
        at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96)
        at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2147)
        at org.apache.commons.io.IOUtils.copy(IOUtils.java:2102)
        at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2123)
        at org.apache.commons.io.IOUtils.copy(IOUtils.java:2078)
        at com.haulmont.cuba.web.sys.CubaWebJarsHandler.handleRequest(CubaWebJarsHandler.java:108)
        at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
        at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300)
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
        at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
        at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: ╨Я╤А╨╛╨│╤А╨░╨╝╨╝╨░ ╨╜╨░ ╨▓╨░╤И╨╡╨╝ ╤Е╨╛╤Б╤В-╨║╨╛╨╝╨┐╤М╤О╤В╨╡╤А╨╡ ╤А╨░╨╖╨╛╤А╨▓╨░╨╗╨░ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╜╨╛╨╡ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╕╨╡
        at sun.nio.ch.SocketDispatcher.write0(Native Method)
        at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
        at sun.nio.ch.IOUtil.write(IOUtil.java:65)
        at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
        at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:134)
        at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101)
        at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:157)
        at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1267)
        at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:670)
        at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:450)
        at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:388)
        at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:644)
        at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:123)
        at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:235)
        at org.apache.coyote.Response.doWrite(Response.java:541)
        at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351)
        ... 42 more
16:57:32.325 ERROR c.h.c.s.a.AuthenticationServiceBean - Logout error
com.haulmont.cuba.security.global.NoUserSessionException: User session not found: 0d28b93d-0241-f20e-4bc0-776533dd7f7b
        at com.haulmont.cuba.core.sys.UserSessionSourceImpl.getUserSession(UserSessionSourceImpl.java:56) ~[cuba-core-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.security.auth.AuthenticationServiceBean.logout(AuthenticationServiceBean.java:137) ~[cuba-core-6.8.7.jar:6.8.7]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94) [cuba-core-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154) [cuba-web-6.8.7.jar:6.8.7]
        at com.sun.proxy.$Proxy24.logout(Unknown Source) [na:na]
        at com.haulmont.cuba.web.security.ConnectionImpl.logout(ConnectionImpl.java:318) [cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.App.lambda$logout$2(App.java:528) [cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.WebWindowManager.checkModificationsAndCloseAll(WebWindowManager.java:940) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.WebWindowManager.checkModificationsAndCloseAll(WebWindowManager.java:888) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.App.logout(App.java:526) [cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.App.logout(App.java:510) [cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.gui.components.mainwindow.WebLogoutButton.logout(WebLogoutButton.java:41) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.gui.components.mainwindow.WebLogoutButton.lambda$new$61446b05$1(WebLogoutButton.java:33) ~[cuba-web-6.8.7.jar:6.8.7]
        at sun.reflect.GeneratedMethodAccessor294.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.ui.Button.fireClick(Button.java:377) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:54) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.vaadin.ui.Button$1.click(Button.java:54) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at sun.reflect.GeneratedMethodAccessor292.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191) ~[cuba-web-6.8.7.jar:6.8.7]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[servlet-api.jar:na]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:8.5.23]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-websocket.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:8.5.23]
        at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) ~[spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) ~[spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107) ~[cuba-web-6.8.7.jar:6.8.7]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[catalina.jar:8.5.23]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) ~[catalina.jar:8.5.23]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) ~[catalina.jar:8.5.23]
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) ~[catalina.jar:8.5.23]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[catalina.jar:8.5.23]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) ~[tomcat-coyote.jar:8.5.23]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) ~[tomcat-coyote.jar:8.5.23]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-coyote.jar:8.5.23]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) ~[tomcat-coyote.jar:8.5.23]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote.jar:8.5.23]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_171]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util.jar:8.5.23]
        at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_171]
16:57:32.330 ERROR com.haulmont.cuba.web.App - Error on logout
java.lang.RuntimeException: Logout error: com.haulmont.cuba.security.global.NoUserSessionException: User session not found: 0d28b93d-0241-f20e-4bc0-776533dd7f7b
        at com.haulmont.cuba.security.auth.AuthenticationServiceBean.logout(AuthenticationServiceBean.java:148) ~[na:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94) ~[na:na]
        at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.sun.proxy.$Proxy24.logout(Unknown Source) ~[na:na]
        at com.haulmont.cuba.web.security.ConnectionImpl.logout(ConnectionImpl.java:318) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.App.lambda$logout$2(App.java:528) [cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.WebWindowManager.checkModificationsAndCloseAll(WebWindowManager.java:940) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.WebWindowManager.checkModificationsAndCloseAll(WebWindowManager.java:888) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.App.logout(App.java:526) [cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.App.logout(App.java:510) [cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.gui.components.mainwindow.WebLogoutButton.logout(WebLogoutButton.java:41) [cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.gui.components.mainwindow.WebLogoutButton.lambda$new$61446b05$1(WebLogoutButton.java:33) [cuba-web-6.8.7.jar:6.8.7]
        at sun.reflect.GeneratedMethodAccessor294.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.ui.Button.fireClick(Button.java:377) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:54) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.vaadin.ui.Button$1.click(Button.java:54) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at sun.reflect.GeneratedMethodAccessor292.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361) ~[vaadin-server-7.7.13.cuba.9.jar:7.7.13.cuba.9]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300) ~[cuba-web-6.8.7.jar:6.8.7]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191) ~[cuba-web-6.8.7.jar:6.8.7]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[servlet-api.jar:na]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:8.5.23]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-websocket.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:8.5.23]
        at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) ~[spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) ~[spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
        at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107) ~[cuba-web-6.8.7.jar:6.8.7]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[catalina.jar:8.5.23]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) ~[catalina.jar:8.5.23]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) ~[catalina.jar:8.5.23]
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) ~[catalina.jar:8.5.23]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) ~[catalina.jar:8.5.23]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[catalina.jar:8.5.23]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) ~[tomcat-coyote.jar:8.5.23]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) ~[tomcat-coyote.jar:8.5.23]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-coyote.jar:8.5.23]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) ~[tomcat-coyote.jar:8.5.23]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote.jar:8.5.23]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_171]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util.jar:8.5.23]
        at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_171]

Hide caption of groovy script helper

Open Scripting Matching Rule Editor.
Near the Groovy Condition field there is a button with a question mark for opening the groovy script condition helper. Hide the 'EmptyGroovyScriptHelpAction' caption, which is displayed near the button (see the attached figure).

image

Synchronize CUBA user roles if roles were changed in LDAP

If roles or access group for CUBA user were changed after LDAP rules or properties in LDAP server changes then for authenticated users automatically apply new roles.
If user roles were changed then show message that new user roles will be applied and user will be automatically logged out. Then log out user after configurable timeout.

Wrong access group is assigned if several matching rules are applied

Steps to reproduce:

  1. Open Menu: LDAP Component → LDAP Matching Rules.
  2. Create several matching rules that can be applicable to a test user (also, make sure that these rules assign different access groups to a user and none of them have 'Override access group' set to true).
  3. Enter the username in the corresponding field.
  4. Click Test Rules

Expected Result: The access group from the matching rule applied the last is assigned to the user.
Actual Result: The access group from the matching rule applied the first is assigned to the user.

PSQLException when opening LDAP Config

The recent updates include the addition of a new column. This causes the following exception when opening LDAP Config Screen:

com.haulmont.cuba.core.global.RemoteException:
---
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.cuba22): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ОШИБКА: столбец "default_access_group_name" не существует
  Позиция: 76
Error Code: 0
Call: SELECT ID, ACCESS_GROUP_ATTRIBUTE, ATTRIBUTE_PROPERTY_NAMES, CN_ATTRIBUTE, DEFAULT_ACCESS_GROUP_NAME, EMAIL_ATTRIBUTE, GIVEN_NAME_ATTRIBUTE, INACTIVE_USER_ATTRIBUTE, LANGUAGE_ATTRIBUTE, LDAP_USER_OBJECT_CLASSES, LOGIN_ATTRIBUTE, MEMBER_OF_ATTRIBUTE, MIDDLE_NAME_ATTRIBUTE, OBJECT_CLASS_PROPERTY_NAME, OU_ATTRIBUTE, POSITION_ATTRIBUTE, SCHEMA_BASE, SN_ATTRIBUTE, UPDATE_TS, UPDATED_BY, USER_BASE, VERSION FROM LDAP_LDAP_CONFIG
Query: ReadAllQuery(referenceClass=LdapConfig sql="SELECT ID, ACCESS_GROUP_ATTRIBUTE, ATTRIBUTE_PROPERTY_NAMES, CN_ATTRIBUTE, DEFAULT_ACCESS_GROUP_NAME, EMAIL_ATTRIBUTE, GIVEN_NAME_ATTRIBUTE, INACTIVE_USER_ATTRIBUTE, LANGUAGE_ATTRIBUTE, LDAP_USER_OBJECT_CLASSES, LOGIN_ATTRIBUTE, MEMBER_OF_ATTRIBUTE, MIDDLE_NAME_ATTRIBUTE, OBJECT_CLASS_PROPERTY_NAME, OU_ATTRIBUTE, POSITION_ATTRIBUTE, SCHEMA_BASE, SN_ATTRIBUTE, UPDATE_TS, UPDATED_BY, USER_BASE, VERSION FROM LDAP_LDAP_CONFIG")
---
org.eclipse.persistence.exceptions.DatabaseException: 
Internal Exception: org.postgresql.util.PSQLException: ОШИБКА: столбец "default_access_group_name" не существует
  Позиция: 76
Error Code: 0
Call: SELECT ID, ACCESS_GROUP_ATTRIBUTE, ATTRIBUTE_PROPERTY_NAMES, CN_ATTRIBUTE, DEFAULT_ACCESS_GROUP_NAME, EMAIL_ATTRIBUTE, GIVEN_NAME_ATTRIBUTE, INACTIVE_USER_ATTRIBUTE, LANGUAGE_ATTRIBUTE, LDAP_USER_OBJECT_CLASSES, LOGIN_ATTRIBUTE, MEMBER_OF_ATTRIBUTE, MIDDLE_NAME_ATTRIBUTE, OBJECT_CLASS_PROPERTY_NAME, OU_ATTRIBUTE, POSITION_ATTRIBUTE, SCHEMA_BASE, SN_ATTRIBUTE, UPDATE_TS, UPDATED_BY, USER_BASE, VERSION FROM LDAP_LDAP_CONFIG
Query: ReadAllQuery(referenceClass=LdapConfig sql="SELECT ID, ACCESS_GROUP_ATTRIBUTE, ATTRIBUTE_PROPERTY_NAMES, CN_ATTRIBUTE, DEFAULT_ACCESS_GROUP_NAME, EMAIL_ATTRIBUTE, GIVEN_NAME_ATTRIBUTE, INACTIVE_USER_ATTRIBUTE, LANGUAGE_ATTRIBUTE, LDAP_USER_OBJECT_CLASSES, LOGIN_ATTRIBUTE, MEMBER_OF_ATTRIBUTE, MIDDLE_NAME_ATTRIBUTE, OBJECT_CLASS_PROPERTY_NAME, OU_ATTRIBUTE, POSITION_ATTRIBUTE, SCHEMA_BASE, SN_ATTRIBUTE, UPDATE_TS, UPDATED_BY, USER_BASE, VERSION FROM LDAP_LDAP_CONFIG")
---
org.postgresql.util.PSQLException: ОШИБКА: столбец "default_access_group_name" не существует
  Позиция: 76
	at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:129)
	at sun.reflect.GeneratedMethodAccessor131.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy270.getLdapConfig(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94)
	at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154)
	at com.sun.proxy.$Proxy61.getLdapConfig(Unknown Source)
	at com.haulmont.addon.ldap.web.ldapconfig.LdapConfigEdit.postInit(LdapConfigEdit.java:65)
	at com.haulmont.cuba.gui.components.AbstractEditor.setItem(AbstractEditor.java:70)
	at com.haulmont.cuba.gui.WindowManager.openEditor(WindowManager.java:888)
	at com.haulmont.cuba.web.WebWindowManager.openEditor(WebWindowManager.java:178)
	at com.haulmont.cuba.gui.WindowManager.openEditor(WindowManager.java:837)
	at com.haulmont.cuba.gui.config.MenuCommand$ScreenCommand.run(MenuCommand.java:179)
	at com.haulmont.cuba.gui.config.MenuCommand.execute(MenuCommand.java:76)
	at com.haulmont.cuba.web.sys.MenuBuilder.lambda$createMenuCommandExecutor$0(MenuBuilder.java:197)
	at com.haulmont.cuba.web.gui.components.mainwindow.WebAppMenu$MenuItemImpl.lambda$setCommand$2434f46b$1(WebAppMenu.java:351)
	at com.vaadin.ui.MenuBar.changeVariables(MenuBar.java:212)
	at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:623)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:470)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:413)
	at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

Restrict substitution of inactive users

Preconditions:

  • 2 users are created (both in LDAP and CUBA).
  • User 1 has User 2 as a substituted user.

Steps to reproduce:

  1. Make User 2 inactive in LDAP.
  2. Log in as User 1.
  3. Using the lookup field in the right corner of the main menu, switch to User 2.

Expected Result: Switching to User 2 is impossible because he is inactive.
When substituting a user, the system should check whether this user is active. If not, then the following system message should be shown: "Sorry, this user cannot be substituted. Please contact your system administrator."
Actual Result: It is possible to substitute an inactive user.

Improve localization of attachment titles

Preconditions:

  • Create a connection with the imap.yandex.ru host.

Steps to reproduce:

  1. Open Menu: Administration → IMAP → IMAP Message Browser.
  2. Open an email that contains an attachment with a title is in Cyrillic.
  3. Open the Attachments tab.

Expected Result: Cyrillic letters are displayed properly.
Actual Result:
image

[Matching Rules] IndexOutOfBoundsException when moving the default rule down the list

Steps to reproduce:

  1. Open LDAP Component → LDAP matching rule
  2. Select the default rule in the table of matching rules
  3. Click ▼

Expected Result: The default rule has the 'LAST' value in the 'Order' field so it cannot be moved down the list. Considering this, nothing should happen.
Actual Result:

java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at com.haulmont.addon.ldap.web.screens.MatchingRuleScreen.changeOrderClick(MatchingRuleScreen.java:402)
    at com.haulmont.addon.ldap.web.screens.MatchingRuleScreen.onDownClick(MatchingRuleScreen.java:379)
    at sun.reflect.GeneratedMethodAccessor273.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.haulmont.cuba.gui.xml.DeclarativeAction.actionPerform(DeclarativeAction.java:92)
    at com.haulmont.cuba.web.gui.components.WebButton.performAction(WebButton.java:44)
    at com.haulmont.cuba.web.gui.components.WebButton.lambda$new$61446b05$1(WebButton.java:36)
    at sun.reflect.GeneratedMethodAccessor178.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
    at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
    at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
    at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037)
    at com.vaadin.ui.Button.fireClick(Button.java:377)
    at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:54)
    at com.vaadin.ui.Button$1.click(Button.java:54)
    at sun.reflect.GeneratedMethodAccessor189.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
    at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119)
    at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444)
    at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409)
    at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
    at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
    at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
    at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:300)
    at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
    at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
    at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.