This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.19 by this push:
     new 87b55af1979 Fixup response code on incorrect credentials (#8671)
87b55af1979 is described below

commit 87b55af1979faa7020850842b1d72ecbdb77938a
Author: Vishesh <[email protected]>
AuthorDate: Thu May 30 12:18:53 2024 +0530

    Fixup response code on incorrect credentials (#8671)
---
 .../cloudstack/oauth2/OAuth2UserAuthenticator.java | 26 ++++++++++----
 .../oauth2/OAuth2UserAuthenticatorTest.java        | 40 ++++++++++++++++------
 .../java/com/cloud/user/AccountManagerImpl.java    |  4 ++-
 .../com/cloud/user/AccountManagerImplTest.java     |  1 +
 4 files changed, 53 insertions(+), 18 deletions(-)

diff --git 
a/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticator.java
 
b/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticator.java
index 8484a5ef798..3a6d2bd6fae 100644
--- 
a/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticator.java
+++ 
b/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticator.java
@@ -32,16 +32,18 @@ import org.apache.log4j.Logger;
 import javax.inject.Inject;
 import java.util.Map;
 
+import static 
org.apache.cloudstack.oauth2.OAuth2AuthManager.OAuth2IsPluginEnabled;
+
 public class OAuth2UserAuthenticator extends AdapterBase implements 
UserAuthenticator {
     public static final Logger s_logger = 
Logger.getLogger(OAuth2UserAuthenticator.class);
 
     @Inject
-    private UserAccountDao _userAccountDao;
+    private UserAccountDao userAccountDao;
     @Inject
-    private UserDao _userDao;
+    private UserDao userDao;
 
     @Inject
-    private OAuth2AuthManager _userOAuth2mgr;
+    private OAuth2AuthManager userOAuth2mgr;
 
     @Override
     public Pair<Boolean, ActionOnFailedAuthentication> authenticate(String 
username, String password, Long domainId, Map<String, Object[]> 
requestParameters) {
@@ -49,12 +51,20 @@ public class OAuth2UserAuthenticator extends AdapterBase 
implements UserAuthenti
             s_logger.debug("Trying OAuth2 auth for user: " + username);
         }
 
-        final UserAccount userAccount = 
_userAccountDao.getUserAccount(username, domainId);
+        if (!isOAuthPluginEnabled()) {
+            s_logger.debug("OAuth2 plugin is disabled");
+            return new Pair<Boolean, ActionOnFailedAuthentication>(false, 
null);
+        } else if (requestParameters == null) {
+            s_logger.debug("Request parameters are null");
+            return new Pair<Boolean, ActionOnFailedAuthentication>(false, 
null);
+        }
+
+        final UserAccount userAccount = 
userAccountDao.getUserAccount(username, domainId);
         if (userAccount == null) {
             s_logger.debug("Unable to find user with " + username + " in 
domain " + domainId + ", or user source is not OAUTH2");
             return new Pair<Boolean, ActionOnFailedAuthentication>(false, 
null);
         } else {
-            User user = _userDao.getUser(userAccount.getId());
+            User user = userDao.getUser(userAccount.getId());
             final String[] provider = 
(String[])requestParameters.get(ApiConstants.PROVIDER);
             final String[] emailArray = 
(String[])requestParameters.get(ApiConstants.EMAIL);
             final String[] secretCodeArray = 
(String[])requestParameters.get(ApiConstants.SECRET_CODE);
@@ -62,7 +72,7 @@ public class OAuth2UserAuthenticator extends AdapterBase 
implements UserAuthenti
             String email = ((emailArray == null) ? null : emailArray[0]);
             String secretCode = ((secretCodeArray == null) ? null : 
secretCodeArray[0]);
 
-            UserOAuth2Authenticator authenticator = 
_userOAuth2mgr.getUserOAuth2AuthenticationProvider(oauthProvider);
+            UserOAuth2Authenticator authenticator = 
userOAuth2mgr.getUserOAuth2AuthenticationProvider(oauthProvider);
             if (user != null && authenticator.verifyUser(email, secretCode)) {
                 return new Pair<Boolean, ActionOnFailedAuthentication>(true, 
null);
             }
@@ -75,4 +85,8 @@ public class OAuth2UserAuthenticator extends AdapterBase 
implements UserAuthenti
     public String encode(String password) {
         return null;
     }
+
+    protected boolean isOAuthPluginEnabled() {
+        return OAuth2IsPluginEnabled.value();
+    }
 }
diff --git 
a/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticatorTest.java
 
b/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticatorTest.java
index 06aa04d729c..9a6e8812679 100644
--- 
a/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticatorTest.java
+++ 
b/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticatorTest.java
@@ -24,23 +24,32 @@ import com.cloud.user.dao.UserAccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.utils.Pair;
 import org.apache.cloudstack.auth.UserOAuth2Authenticator;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 
 import java.util.HashMap;
 import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+@RunWith(MockitoJUnitRunner.class)
 public class OAuth2UserAuthenticatorTest {
 
     @Mock
@@ -53,13 +62,22 @@ public class OAuth2UserAuthenticatorTest {
     private OAuth2AuthManager userOAuth2mgr;
 
     @InjectMocks
+    @Spy
     private OAuth2UserAuthenticator authenticator;
+    private AutoCloseable closeable;
 
     @Before
     public void setUp() {
-        MockitoAnnotations.initMocks(this);
+        closeable = MockitoAnnotations.openMocks(this);
+        doReturn(true).when(authenticator).isOAuthPluginEnabled();
     }
 
+    @After
+    public void tearDown() throws Exception {
+        closeable.close();
+    }
+
+
     @Test
     public void testAuthenticateWithValidCredentials() {
         String username = "testuser";
@@ -84,13 +102,13 @@ public class OAuth2UserAuthenticatorTest {
 
         Pair<Boolean, OAuth2UserAuthenticator.ActionOnFailedAuthentication> 
result = authenticator.authenticate(username, null, domainId, 
requestParameters);
 
+        assertTrue(result.first());
+        assertNull(result.second());
+
         verify(userAccountDao).getUserAccount(username, domainId);
         verify(userDao).getUser(userAccount.getId());
         verify(userOAuth2mgr).getUserOAuth2AuthenticationProvider(provider[0]);
         verify(userOAuth2Authenticator).verifyUser(email[0], secretCode[0]);
-
-        assertEquals(true, result.first().booleanValue());
-        assertEquals(null, result.second());
     }
 
     @Test
@@ -106,7 +124,7 @@ public class OAuth2UserAuthenticatorTest {
         UserOAuth2Authenticator userOAuth2Authenticator = 
mock(UserOAuth2Authenticator.class);
 
         when(userAccountDao.getUserAccount(username, 
domainId)).thenReturn(userAccount);
-        when(userDao.getUser(userAccount.getId())).thenReturn( user);
+        when(userDao.getUser(userAccount.getId())).thenReturn(user);
         
when(userOAuth2mgr.getUserOAuth2AuthenticationProvider(provider[0])).thenReturn(userOAuth2Authenticator);
         when(userOAuth2Authenticator.verifyUser(email[0], 
secretCode[0])).thenReturn(false);
 
@@ -117,13 +135,13 @@ public class OAuth2UserAuthenticatorTest {
 
         Pair<Boolean, OAuth2UserAuthenticator.ActionOnFailedAuthentication> 
result = authenticator.authenticate(username, null, domainId, 
requestParameters);
 
+        assertFalse(result.first());
+        
assertEquals(OAuth2UserAuthenticator.ActionOnFailedAuthentication.INCREMENT_INCORRECT_LOGIN_ATTEMPT_COUNT,
 result.second());
+
         verify(userAccountDao).getUserAccount(username, domainId);
         verify(userDao).getUser(userAccount.getId());
         verify(userOAuth2mgr).getUserOAuth2AuthenticationProvider(provider[0]);
         verify(userOAuth2Authenticator).verifyUser(email[0], secretCode[0]);
-
-        assertEquals(false, result.first().booleanValue());
-        
assertEquals(OAuth2UserAuthenticator.ActionOnFailedAuthentication.INCREMENT_INCORRECT_LOGIN_ATTEMPT_COUNT,
 result.second());
     }
 
     @Test
@@ -143,11 +161,11 @@ public class OAuth2UserAuthenticatorTest {
 
         Pair<Boolean, OAuth2UserAuthenticator.ActionOnFailedAuthentication> 
result = authenticator.authenticate(username, null, domainId, 
requestParameters);
 
+        assertFalse(result.first());
+        assertNull(result.second());
+
         verify(userAccountDao).getUserAccount(username, domainId);
         verify(userDao, never()).getUser(anyLong());
         verify(userOAuth2mgr, 
never()).getUserOAuth2AuthenticationProvider(anyString());
-
-        assertEquals(false, result.first().booleanValue());
-        assertEquals(null, result.second());
     }
 }
diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java 
b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
index 86a359a3348..3eed429ed21 100644
--- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
@@ -332,6 +332,7 @@ public class AccountManagerImpl extends ManagerBase 
implements AccountManager, M
 
     private List<SecurityChecker> _securityCheckers;
     private int _cleanupInterval;
+    private static final String OAUTH2_PROVIDER_NAME = "oauth2";
     private List<String> apiNameList;
 
     protected static Map<String, UserTwoFactorAuthenticator> 
userTwoFactorAuthenticationProvidersMap = new HashMap<>();
@@ -2650,7 +2651,8 @@ public class AccountManagerImpl extends ManagerBase 
implements AccountManager, M
                     continue;
                 }
             }
-            if (secretCode != null && 
!authenticator.getName().equals("oauth2")) {
+            if ((secretCode != null && 
!authenticator.getName().equals(OAUTH2_PROVIDER_NAME))
+                    || (secretCode == null && 
authenticator.getName().equals(OAUTH2_PROVIDER_NAME))) {
                 continue;
             }
             Pair<Boolean, ActionOnFailedAuthentication> result = 
authenticator.authenticate(username, password, domainId, requestParameters);
diff --git a/server/src/test/java/com/cloud/user/AccountManagerImplTest.java 
b/server/src/test/java/com/cloud/user/AccountManagerImplTest.java
index 6d9211dd526..9014af523fd 100644
--- a/server/src/test/java/com/cloud/user/AccountManagerImplTest.java
+++ b/server/src/test/java/com/cloud/user/AccountManagerImplTest.java
@@ -203,6 +203,7 @@ public class AccountManagerImplTest extends 
AccountManagetImplTestBase {
         Mockito.when(userAuthenticator.authenticate("test", "fail", 1L, new 
HashMap<>())).thenReturn(failureAuthenticationPair);
         Mockito.lenient().when(userAuthenticator.authenticate("test", null, 
1L, new HashMap<>())).thenReturn(successAuthenticationPair);
         Mockito.lenient().when(userAuthenticator.authenticate("test", "", 1L, 
new HashMap<>())).thenReturn(successAuthenticationPair);
+        Mockito.when(userAuthenticator.getName()).thenReturn("test");
 
         //Test for incorrect password. authentication should fail
         UserAccount userAccount = accountManagerImpl.authenticateUser("test", 
"fail", 1L, InetAddress.getByName("127.0.0.1"), new HashMap<>());

Reply via email to