You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mp...@apache.org on 2016/06/29 16:23:12 UTC

[4/4] ambari git commit: AMBARI-17481. Incorrect error message on login page. (mpapirkovskyy)

AMBARI-17481. Incorrect error message on login page. (mpapirkovskyy)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/661c2623
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/661c2623
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/661c2623

Branch: refs/heads/branch-2.4
Commit: 661c262394e0c7e2d1aac0518dfef4ca62b28094
Parents: be17fbe
Author: Myroslav Papirkovskyi <mp...@hortonworks.com>
Authored: Wed Jun 29 18:09:53 2016 +0300
Committer: Myroslav Papirkovskyi <mp...@hortonworks.com>
Committed: Wed Jun 29 19:22:24 2016 +0300

----------------------------------------------------------------------
 .../AmbariLdapAuthenticationProvider.java       |  7 ++--
 .../AmbariLdapAuthoritiesPopulator.java         |  3 +-
 .../authorization/AmbariLocalUserProvider.java  | 16 +++-----
 ...lidUsernamePasswordCombinationException.java | 34 +++++++++++++++++
 .../server/security/authorization/Users.java    |  6 +--
 .../AmbariInternalAuthenticationProvider.java   |  5 +--
 .../ambari/server/state/ConfigHelper.java       |  8 +++-
 ...ariAuthorizationProviderDisableUserTest.java | 13 +++----
 ...uthenticationProviderForDNWithSpaceTest.java |  4 +-
 .../AmbariLdapAuthenticationProviderTest.java   | 18 +++------
 .../AmbariLocalUserProviderTest.java            |  8 ++--
 .../svccomphost/ServiceComponentHostTest.java   | 40 ++++++++++++++++++++
 12 files changed, 108 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProvider.java
index 0bf7ec2..6be7e10 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProvider.java
@@ -30,7 +30,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.dao.IncorrectResultSizeDataAccessException;
 import org.springframework.ldap.core.support.LdapContextSource;
 import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
@@ -86,7 +85,7 @@ public class AmbariLdapAuthenticationProvider implements AuthenticationProvider
                     "connecting to LDAP server) are invalid.", e);
           }
         }
-        throw e;
+        throw new InvalidUsernamePasswordCombinationException(e);
       } catch (IncorrectResultSizeDataAccessException multipleUsersFound) {
         String message = configuration.isLdapAlternateUserSearchEnabled() ?
           String.format("Login Failed: Please append your domain to your username and try again.  Example: %s@domain", username) :
@@ -197,13 +196,13 @@ public class AmbariLdapAuthenticationProvider implements AuthenticationProvider
 
     if (userEntity == null || !StringUtils.equals(userEntity.getUserName(), userName)) {
       LOG.info("user not found ");
-      throw new UsernameNotFoundException("Username " + userName + " not found");
+      throw new InvalidUsernamePasswordCombinationException();
     }
 
     if (!userEntity.getActive()) {
       LOG.debug("User account is disabled");
 
-      throw new DisabledException("Username " + userName + " is disabled");
+      throw new InvalidUsernamePasswordCombinationException();
     }
 
     return userEntity.getUserId();

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthoritiesPopulator.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthoritiesPopulator.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthoritiesPopulator.java
index 7df8dc3..b3be046 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthoritiesPopulator.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthoritiesPopulator.java
@@ -32,7 +32,6 @@ import org.apache.ambari.server.orm.entities.UserEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;
 
@@ -73,7 +72,7 @@ public class AmbariLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator
       return Collections.emptyList();
     }
     if(!user.getActive()){
-      throw new DisabledException("User is disabled");
+      throw new InvalidUsernamePasswordCombinationException();
     }
     // get all of the privileges for the user
     List<PrincipalEntity> principalEntities = new LinkedList<PrincipalEntity>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProvider.java
index a8c9b19..e225f5a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProvider.java
@@ -23,15 +23,12 @@ import org.apache.ambari.server.orm.entities.UserEntity;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
 
 import java.util.Collection;
 
@@ -65,22 +62,20 @@ public class AmbariLocalUserProvider extends AbstractUserDetailsAuthenticationPr
 
     if (userEntity == null || !StringUtils.equals(userEntity.getUserName(), userName)) {
       //TODO case insensitive name comparison is a temporary solution, until users API will change to use id as PK
-      LOG.info("user not found ");
-      throw new UsernameNotFoundException("Username " + userName + " not found");
+      LOG.info("user not found");
+      throw new InvalidUsernamePasswordCombinationException();
     }
 
     if (!userEntity.getActive()) {
       logger.debug("User account is disabled");
 
-      throw new DisabledException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.disabled",
-        "User is disabled"));
+      throw new InvalidUsernamePasswordCombinationException();
     }
 
     if (authentication.getCredentials() == null) {
       logger.debug("Authentication failed: no credentials provided");
 
-      throw new BadCredentialsException(messages.getMessage(
-        "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
+      throw new InvalidUsernamePasswordCombinationException();
     }
 
     String password = userEntity.getUserPassword();
@@ -89,8 +84,7 @@ public class AmbariLocalUserProvider extends AbstractUserDetailsAuthenticationPr
     if (!passwordEncoder.matches(presentedPassword, password)) {
       logger.debug("Authentication failed: password does not match stored value");
 
-      throw new BadCredentialsException(messages.getMessage(
-        "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
+      throw new InvalidUsernamePasswordCombinationException();
     }
     Collection<AmbariGrantedAuthority> userAuthorities =
       users.getUserAuthorities(userEntity.getUserName(), userEntity.getUserType());

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/InvalidUsernamePasswordCombinationException.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/InvalidUsernamePasswordCombinationException.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/InvalidUsernamePasswordCombinationException.java
new file mode 100644
index 0000000..db82381
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/InvalidUsernamePasswordCombinationException.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.security.authorization;
+
+import org.springframework.security.core.AuthenticationException;
+
+public class InvalidUsernamePasswordCombinationException extends AuthenticationException {
+
+  public static final String MESSAGE = "Unable to sign in. Invalid username/password combination.";
+
+  public InvalidUsernamePasswordCombinationException() {
+    super(MESSAGE);
+  }
+
+  public InvalidUsernamePasswordCombinationException(Throwable t) {
+    super(MESSAGE, t);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java
index 1a7b58d..0d4267e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java
@@ -42,7 +42,6 @@ import org.apache.ambari.server.security.ldap.LdapUserGroupMemberDto;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -168,9 +167,8 @@ public class Users {
         ldapAuthenticationProvider.authenticate(
             new UsernamePasswordAuthenticationToken(currentUserName, currentUserPassword));
       isLdapUser = true;
-      } catch (BadCredentialsException ex) {
-        throw new AmbariException("Incorrect password provided for LDAP user " +
-            currentUserName);
+      } catch (InvalidUsernamePasswordCombinationException ex) {
+        throw new AmbariException(ex.getMessage());
       }
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/internal/AmbariInternalAuthenticationProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/internal/AmbariInternalAuthenticationProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/internal/AmbariInternalAuthenticationProvider.java
index 243c843..dd21aaf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/internal/AmbariInternalAuthenticationProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/internal/AmbariInternalAuthenticationProvider.java
@@ -19,8 +19,8 @@
 package org.apache.ambari.server.security.authorization.internal;
 
 import com.google.inject.Inject;
+import org.apache.ambari.server.security.authorization.InvalidUsernamePasswordCombinationException;
 import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
 
@@ -39,8 +39,7 @@ public class AmbariInternalAuthenticationProvider implements AuthenticationProvi
     if (internalTokenStorage.isValidInternalToken(token.getCredentials())) {
       token.setAuthenticated(true);
     } else {
-      String message = "Bad credentials";
-      throw new BadCredentialsException(message);
+      throw new InvalidUsernamePasswordCombinationException();
     }
     return token;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
index 4feba62..ecb4a75 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
@@ -128,8 +128,7 @@ public class ConfigHelper {
    * has completed, otherwise it's possible to cache invalid data before the
    * transaction is committed.
    */
-  private final ExecutorService cacheInvalidationExecutor = Executors.newSingleThreadExecutor(
-      cacheInvalidationThreadFactory);
+  private final ExecutorService cacheInvalidationExecutor = createCacheInvalidationExecutor();
 
   /**
    * Used to ensure that methods which rely on the completion of
@@ -1369,4 +1368,9 @@ public class ConfigHelper {
     }
   }
 
+  private ExecutorService createCacheInvalidationExecutor() {
+    return Executors.newSingleThreadExecutor(
+      cacheInvalidationThreadFactory);
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationProviderDisableUserTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationProviderDisableUserTest.java b/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationProviderDisableUserTest.java
index 16cba8b..90d4be0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationProviderDisableUserTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationProviderDisableUserTest.java
@@ -27,7 +27,6 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
-import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.crypto.password.PasswordEncoder;
@@ -64,12 +63,12 @@ public class AmbariAuthorizationProviderDisableUserTest {
   }
   
   @Test public void testDisabledUserViaDaoProvider(){
-    try{
+    try {
       alup.authenticate(new UsernamePasswordAuthenticationToken("disabledUser","pwd"));
       Assert.fail("Disabled user passes authentication");
-    }catch(DisabledException e){
+    } catch (InvalidUsernamePasswordCombinationException e){
       //expected
-      Assert.assertEquals("User is disabled", e.getMessage());//UI depends on this
+      Assert.assertEquals(InvalidUsernamePasswordCombinationException.MESSAGE, e.getMessage());//UI depends on this
     }
     Authentication auth = alup.authenticate(new UsernamePasswordAuthenticationToken("activeUser","pwd"));
     Assert.assertNotNull(auth);
@@ -77,12 +76,12 @@ public class AmbariAuthorizationProviderDisableUserTest {
   }
 
   @Test public void testDisabledUserViaLdapProvider(){
-    try{
+    try {
       ldapPopulator.getGrantedAuthorities(null, "disabledUser");
       Assert.fail("Disabled user passes authentication");
-    }catch(DisabledException e){
+    } catch (InvalidUsernamePasswordCombinationException e) {
       //expected
-      Assert.assertEquals("User is disabled", e.getMessage());//UI depends on this
+      Assert.assertEquals(InvalidUsernamePasswordCombinationException.MESSAGE, e.getMessage());//UI depends on this
     }
   }
   

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderForDNWithSpaceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderForDNWithSpaceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderForDNWithSpaceTest.java
index ece3dab..1a18ff2 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderForDNWithSpaceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderForDNWithSpaceTest.java
@@ -33,11 +33,9 @@ import org.apache.directory.server.core.annotations.ApplyLdifFiles;
 import org.apache.directory.server.core.annotations.ContextEntry;
 import org.apache.directory.server.core.annotations.CreateDS;
 import org.apache.directory.server.core.annotations.CreatePartition;
-import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
 import org.apache.directory.server.core.integ.FrameworkRunner;
 import org.junit.*;
 import org.junit.runner.RunWith;
-import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 
@@ -89,7 +87,7 @@ public class AmbariLdapAuthenticationProviderForDNWithSpaceTest extends AmbariLd
     injector.getInstance(PersistService.class).stop();
   }
 
-  @Test(expected = BadCredentialsException.class)
+  @Test(expected = InvalidUsernamePasswordCombinationException.class)
   public void testBadCredential() throws Exception {
     Authentication authentication = new UsernamePasswordAuthenticationToken("notFound", "wrong");
     authenticationProvider.authenticate(authentication);

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderTest.java
index 9392910..c011fc8 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLdapAuthenticationProviderTest.java
@@ -36,23 +36,15 @@ import org.apache.directory.server.core.annotations.ApplyLdifFiles;
 import org.apache.directory.server.core.annotations.ContextEntry;
 import org.apache.directory.server.core.annotations.CreateDS;
 import org.apache.directory.server.core.annotations.CreatePartition;
-import org.apache.directory.server.core.api.DirectoryService;
-import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
 import org.apache.directory.server.core.integ.FrameworkRunner;
-import org.apache.directory.server.kerberos.kdc.KdcServer;
-import org.apache.directory.server.ldap.LdapServer;
-import org.easymock.EasyMockSupport;
 import org.easymock.IAnswer;
 import org.junit.After;
-import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.Logger;
-import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
-import org.springframework.security.ldap.authentication.LdapAuthenticationProvider;
 
 import static org.easymock.EasyMock.*;
 
@@ -106,7 +98,7 @@ public class AmbariLdapAuthenticationProviderTest extends AmbariLdapAuthenticati
     injector.getInstance(PersistService.class).stop();
   }
 
-  @Test(expected = BadCredentialsException.class)
+  @Test(expected = InvalidUsernamePasswordCombinationException.class)
   public void testBadCredential() throws Exception {
     Authentication authentication = new UsernamePasswordAuthenticationToken("notFound", "wrong");
     authenticationProvider.authenticate(authentication);
@@ -220,7 +212,7 @@ public class AmbariLdapAuthenticationProviderTest extends AmbariLdapAuthenticati
     assertTrue(result.isAuthenticated());
   }
 
-  @Test(expected = BadCredentialsException.class)
+  @Test(expected = InvalidUsernamePasswordCombinationException.class)
   public void testBadCredentialsForMissingLoginAlias() throws Exception {
     // Given
     assertNull("User already exists in DB", userDAO.findLdapUserByName("allowedUser"));
@@ -232,11 +224,11 @@ public class AmbariLdapAuthenticationProviderTest extends AmbariLdapAuthenticati
     authenticationProvider.authenticate(authentication);
 
     // Then
-    // BadCredentialsException should be thrown due to no user with 'missingloginalias@ambari.apache.org'  is found in ldap
+    // InvalidUsernamePasswordCombinationException should be thrown due to no user with 'missingloginalias@ambari.apache.org'  is found in ldap
   }
 
 
-  @Test(expected = BadCredentialsException.class)
+  @Test(expected = InvalidUsernamePasswordCombinationException.class)
   public void testBadCredentialsBadPasswordForLoginAlias() throws Exception {
     // Given
     assertNull("User already exists in DB", userDAO.findLdapUserByName("allowedUser"));
@@ -248,6 +240,6 @@ public class AmbariLdapAuthenticationProviderTest extends AmbariLdapAuthenticati
     authenticationProvider.authenticate(authentication);
 
     // Then
-    // BadCredentialsException should be thrown due to wrong password
+    // InvalidUsernamePasswordCombinationException should be thrown due to wrong password
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProviderTest.java
index 6dda3f2..f3fcca4 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/security/authorization/AmbariLocalUserProviderTest.java
@@ -29,10 +29,8 @@ import org.apache.ambari.server.orm.entities.UserEntity;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.security.crypto.password.PasswordEncoder;
 
 import static org.easymock.EasyMock.createMock;
@@ -92,7 +90,7 @@ public class AmbariLocalUserProviderTest {
     assertEquals(1, ((User) resultedAuth.getPrincipal()).getUserId());
   }
 
-  @Test(expected = UsernameNotFoundException.class)
+  @Test(expected = InvalidUsernamePasswordCombinationException.class)
   public void testAuthWithIncorrectName() {
     Users users = createMock(Users.class);
     UserDAO userDAO = createMock(UserDAO.class);
@@ -107,7 +105,7 @@ public class AmbariLocalUserProviderTest {
     ambariLocalUserProvider.authenticate(authentication);
   }
 
-  @Test(expected = BadCredentialsException.class)
+  @Test(expected = InvalidUsernamePasswordCombinationException.class)
   public void testAuthWithoutPass() {
     Users users = createMock(Users.class);
     UserDAO userDAO = createMock(UserDAO.class);
@@ -125,7 +123,7 @@ public class AmbariLocalUserProviderTest {
     ambariLocalUserProvider.authenticate(authentication);
   }
 
-  @Test(expected = BadCredentialsException.class)
+  @Test(expected = InvalidUsernamePasswordCombinationException.class)
   public void testAuthWithIncorrectPass() {
     Users users = createMock(Users.class);
     UserDAO userDAO = createMock(UserDAO.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/661c2623/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
index ffde57f..44afdaa 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
@@ -18,6 +18,9 @@
 
 package org.apache.ambari.server.state.svccomphost;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -25,6 +28,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
 
 import javax.persistence.EntityManager;
 
@@ -790,6 +795,7 @@ public class ServiceComponentHostTest {
 
     makeConfig(cluster, "foo", "version1",
         new HashMap<String,String>() {{ put("a", "c"); }}, new HashMap<String, Map<String,String>>());
+    waitToStaleConfigsCacheClear();
 
     // HDP-x/HDFS does not define type 'foo', so changes do not count to stale
     Assert.assertFalse(sch1.convertToResponse(null).isStaleConfig());
@@ -797,6 +803,7 @@ public class ServiceComponentHostTest {
 
     makeConfig(cluster, "hdfs-site", "version1",
         new HashMap<String,String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>());
+    waitToStaleConfigsCacheClear();
 
     // HDP-x/HDFS/hdfs-site is not on the actual, but it is defined, so it is stale
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
@@ -810,6 +817,7 @@ public class ServiceComponentHostTest {
     //reset restartRequired flag + invalidating isStale cache
     // after start/restart command execution completed
     sch1.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     // HDP-x/HDFS/hdfs-site up to date, only for sch1
     Assert.assertFalse(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertTrue(sch2.convertToResponse(null).isStaleConfig());
@@ -820,6 +828,7 @@ public class ServiceComponentHostTest {
     //reset restartRequired flag + invalidating isStale cache(
     // after start/restart command execution completed)
     sch2.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     // HDP-x/HDFS/hdfs-site up to date for both
     Assert.assertFalse(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertFalse(sch2.convertToResponse(null).isStaleConfig());
@@ -827,6 +836,7 @@ public class ServiceComponentHostTest {
     makeConfig(cluster, "hdfs-site", "version2",
         new HashMap<String, String>() {{ put("dfs.journalnode.http-address", "http://foo"); }},
         new HashMap<String, Map<String,String>>());
+    waitToStaleConfigsCacheClear();
 
     // HDP-x/HDFS/hdfs-site updated to changed property
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
@@ -839,6 +849,7 @@ public class ServiceComponentHostTest {
     // after start/restart command execution completed
     sch1.setRestartRequired(false);
     sch2.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     // HDP-x/HDFS/hdfs-site updated to changed property
     Assert.assertFalse(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertFalse(sch2.convertToResponse(null).isStaleConfig());
@@ -859,6 +870,7 @@ public class ServiceComponentHostTest {
       new HashMap<Long, Host>() {{ put(hostEntity.getHostId(), host); }});
     configGroup.persist();
     cluster.addConfigGroup(configGroup);
+    waitToStaleConfigsCacheClear();
 
     // HDP-x/HDFS/hdfs-site updated host to changed property
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
@@ -871,6 +883,7 @@ public class ServiceComponentHostTest {
     //reset restartRequired flag + invalidating isStale cache
     // after start/restart command execution completed
     sch2.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     // HDP-x/HDFS/hdfs-site updated host to changed property
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertFalse(sch2.convertToResponse(null).isStaleConfig());
@@ -881,6 +894,7 @@ public class ServiceComponentHostTest {
     //reset restartRequired flag + invalidating isStale cache
     // after start/restart command execution completed
     sch1.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     // HDP-x/HDFS/hdfs-site updated host to changed property
     Assert.assertFalse(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertFalse(sch2.convertToResponse(null).isStaleConfig());
@@ -892,6 +906,7 @@ public class ServiceComponentHostTest {
         put("dfs_namenode_name_dir", "/foo3"); // HDFS only
         put("mapred_log_dir_prefix", "/foo2"); // MR2 only
       }}, new HashMap<String, Map<String,String>>());
+    waitToStaleConfigsCacheClear();
 
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertTrue(sch2.convertToResponse(null).isStaleConfig());
@@ -903,6 +918,7 @@ public class ServiceComponentHostTest {
         put("a", "b");
         put("fs.trash.interval", "360"); // HDFS only
       }}, new HashMap<String, Map<String,String>>());
+    waitToStaleConfigsCacheClear();
 
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertTrue(sch2.convertToResponse(null).isStaleConfig());
@@ -942,10 +958,12 @@ public class ServiceComponentHostTest {
     //reset restartRequired flag + invalidating isStale cache
     // after start/restart command execution completed
     sch3.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
 
     Assert.assertFalse(sch3.convertToResponse(null).isStaleConfig());
 
     cluster.deleteConfigGroup(id);
+    waitToStaleConfigsCacheClear();
     Assert.assertNull(cluster.getConfigGroups().get(id));
 
     sch3.updateActualConfigs(actual);
@@ -958,6 +976,7 @@ public class ServiceComponentHostTest {
     //reset restartRequired flag + invalidating isStale cache
     // after start/restart command execution completed
     sch3.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     Assert.assertFalse(sch3.convertToResponse(null).isStaleConfig());
   }
 
@@ -1023,6 +1042,7 @@ public class ServiceComponentHostTest {
          put("a", "true");
        }});
       }});
+    waitToStaleConfigsCacheClear();
     // HDP-x/HDFS does not define type 'foo', so changes do not count to stale
     Assert.assertFalse(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertFalse(sch2.convertToResponse(null).isStaleConfig());
@@ -1032,6 +1052,7 @@ public class ServiceComponentHostTest {
       put("mapred-site", new HashMap<String,String>() {{ put("tag", "version1"); }});
     }};
     sch3.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     sch3.updateActualConfigs(actual);
     Assert.assertFalse(sch3.convertToResponse(null).isStaleConfig());
 
@@ -1046,6 +1067,7 @@ public class ServiceComponentHostTest {
     sch1.setRestartRequired(false);
     sch2.setRestartRequired(false);
     sch3.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertTrue(sch2.convertToResponse(null).isStaleConfig());
     Assert.assertFalse(sch3.convertToResponse(null).isStaleConfig());
@@ -1061,6 +1083,7 @@ public class ServiceComponentHostTest {
     sch1.setRestartRequired(false);
     sch2.setRestartRequired(false);
     sch3.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertTrue(sch2.convertToResponse(null).isStaleConfig());
     Assert.assertFalse(sch3.convertToResponse(null).isStaleConfig());
@@ -1073,6 +1096,7 @@ public class ServiceComponentHostTest {
     sch1.setRestartRequired(false);
     sch2.setRestartRequired(false);
     sch3.setRestartRequired(false);
+    waitToStaleConfigsCacheClear();
     Assert.assertTrue(sch1.convertToResponse(null).isStaleConfig());
     Assert.assertTrue(sch2.convertToResponse(null).isStaleConfig());
     Assert.assertFalse(sch3.convertToResponse(null).isStaleConfig());
@@ -1188,4 +1212,20 @@ public class ServiceComponentHostTest {
       }
     }
   }
+
+  /*
+  Stale configs cache invalidating in separate thread, so sometimes it can not be cleared in time before check.
+  So it is needed to wait until thread with cache invalidating complete his work.
+   */
+  private void waitToStaleConfigsCacheClear() throws NoSuchFieldException, InterruptedException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
+    Field f = ConfigHelper.class.getDeclaredField("cacheInvalidationExecutor");
+    f.setAccessible(true);
+    ExecutorService configHelperExecutor = (ExecutorService) f.get(configHelper);
+    configHelperExecutor.shutdown();
+    configHelperExecutor.awaitTermination(10, TimeUnit.SECONDS);
+
+    Method m = ConfigHelper.class.getDeclaredMethod("createCacheInvalidationExecutor");
+    m.setAccessible(true);
+    f.set(configHelper, m.invoke(configHelper));
+  }
 }