You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ha...@apache.org on 2022/10/26 20:22:23 UTC

[cloudstack] 07/17: Plugin changes

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

harikrishna pushed a commit to branch 2FA
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 269969cc36cad6a2d228993989f97fd9fbf954ca
Author: Harikrishna Patnala <ha...@gmail.com>
AuthorDate: Mon Oct 10 15:34:55 2022 +0530

    Plugin changes
---
 api/src/main/java/com/cloud/user/UserAccount.java  |  5 +++
 client/pom.xml                                     |  2 +-
 .../main/java/com/cloud/user/UserAccountVO.java    | 12 +++++++
 .../src/main/java/com/cloud/user/UserVO.java       | 12 +++++++
 .../contrail/management/MockAccountManager.java    |  5 +++
 plugins/pom.xml                                    |  5 ++-
 .../{plaintext => google}/module.properties        |  0
 .../spring-google-context.xml                      |  0
 .../static-pin/pom.xml                             |  2 +-
 .../{static-pin => staticpin}/module.properties    |  2 +-
 .../spring-staticpin-context.xml}                  |  2 +-
 .../com/cloud/server/ManagementServerImpl.java     | 10 ++++++
 .../main/java/com/cloud/user/AccountManager.java   |  7 ++--
 .../java/com/cloud/user/AccountManagerImpl.java    | 38 ++++++++++++++++++++++
 .../com/cloud/user/MockAccountManagerImpl.java     |  5 +++
 setup/db/22beta4to22GA.sql                         |  2 +-
 16 files changed, 101 insertions(+), 8 deletions(-)

diff --git a/api/src/main/java/com/cloud/user/UserAccount.java b/api/src/main/java/com/cloud/user/UserAccount.java
index fd8cce19145..c41e3564502 100644
--- a/api/src/main/java/com/cloud/user/UserAccount.java
+++ b/api/src/main/java/com/cloud/user/UserAccount.java
@@ -76,4 +76,9 @@ public interface UserAccount extends InternalIdentity {
 
     public void setKeyFor2fa(String keyFor2fa);
 
+    public String getUser2faProvider();
+
+    public void setUser2faProvider(String user2faProvider);
+
+
 }
diff --git a/client/pom.xml b/client/pom.xml
index c0e7fc6116d..4aa47680095 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -179,7 +179,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.cloudstack</groupId>
-            <artifactId>cloud-plugin-user-two-factor-authenticator-static-pin</artifactId>
+            <artifactId>cloud-plugin-user-two-factor-authenticator-staticpin</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/engine/schema/src/main/java/com/cloud/user/UserAccountVO.java b/engine/schema/src/main/java/com/cloud/user/UserAccountVO.java
index 6cab3b7380d..b06ace6c620 100644
--- a/engine/schema/src/main/java/com/cloud/user/UserAccountVO.java
+++ b/engine/schema/src/main/java/com/cloud/user/UserAccountVO.java
@@ -112,6 +112,9 @@ public class UserAccountVO implements UserAccount, InternalIdentity {
     @Column(name = "is_2fa_enabled")
     boolean is2faEnabled;
 
+    @Column(name = "user_2fa_provider")
+    private String user2faProvider;
+
     @Column(name = "key_for_2fa")
     private String keyFor2fa;
 
@@ -333,4 +336,13 @@ public class UserAccountVO implements UserAccount, InternalIdentity {
     public void setKeyFor2fa(String keyFor2fa) {
         this.keyFor2fa = keyFor2fa;
     }
+
+    public String getUser2faProvider() {
+        return user2faProvider;
+    }
+
+    public void setUser2faProvider(String user2faProvider) {
+        this.user2faProvider = user2faProvider;
+    }
+
 }
diff --git a/engine/schema/src/main/java/com/cloud/user/UserVO.java b/engine/schema/src/main/java/com/cloud/user/UserVO.java
index ebfec77f236..c26770daac6 100644
--- a/engine/schema/src/main/java/com/cloud/user/UserVO.java
+++ b/engine/schema/src/main/java/com/cloud/user/UserVO.java
@@ -109,6 +109,9 @@ public class UserVO implements User, Identity, InternalIdentity {
     @Column(name = "is_2fa_enabled")
     boolean is2faEnabled;
 
+    @Column(name = "user_2fa_provider")
+    private String user2faProvider;
+
     @Column(name = "key_for_2fa")
     private String keyFor2fa;
 
@@ -338,4 +341,13 @@ public class UserVO implements User, Identity, InternalIdentity {
     public void setKeyFor2fa(String keyFor2fa) {
         this.keyFor2fa = keyFor2fa;
     }
+
+    public String getUser2faProvider() {
+        return user2faProvider;
+    }
+
+    public void setUser2faProvider(String user2faProvider) {
+        this.user2faProvider = user2faProvider;
+    }
+
 }
diff --git a/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java b/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
index 8605ae5fe5d..4cd2aedbded 100644
--- a/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
+++ b/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
@@ -327,6 +327,11 @@ public class MockAccountManager extends ManagerBase implements AccountManager {
         return false;
     }
 
+    @Override
+    public UserTwoFactorAuthenticator getUserTwoFactorAuthenticator(Long domainId, Long userAccountId) {
+        return null;
+    }
+
     @Override
     public boolean deleteUserAccount(long arg0) {
         // TODO Auto-generated method stub
diff --git a/plugins/pom.xml b/plugins/pom.xml
index f1d2c5dfbe3..c91609ef125 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -135,7 +135,10 @@
         <module>user-authenticators/saml2</module>
         <module>user-authenticators/sha256salted</module>
 
-   </modules>
+        <module>user-two-factor-authenticators/google</module>
+        <module>user-two-factor-authenticators/static-pin</module>
+
+    </modules>
     <dependencies>
         <dependency>
             <groupId>org.apache.cloudstack</groupId>
diff --git a/plugins/user-two-factor-authenticators/google/src/main/resources/META-INF/cloudstack/plaintext/module.properties b/plugins/user-two-factor-authenticators/google/src/main/resources/META-INF/cloudstack/google/module.properties
similarity index 100%
rename from plugins/user-two-factor-authenticators/google/src/main/resources/META-INF/cloudstack/plaintext/module.properties
rename to plugins/user-two-factor-authenticators/google/src/main/resources/META-INF/cloudstack/google/module.properties
diff --git a/plugins/user-two-factor-authenticators/google/src/main/resources/META-INF/cloudstack/plaintext/spring-google-context.xml b/plugins/user-two-factor-authenticators/google/src/main/resources/META-INF/cloudstack/google/spring-google-context.xml
similarity index 100%
rename from plugins/user-two-factor-authenticators/google/src/main/resources/META-INF/cloudstack/plaintext/spring-google-context.xml
rename to plugins/user-two-factor-authenticators/google/src/main/resources/META-INF/cloudstack/google/spring-google-context.xml
diff --git a/plugins/user-two-factor-authenticators/static-pin/pom.xml b/plugins/user-two-factor-authenticators/static-pin/pom.xml
index 1bb140edb7e..1d0118a5851 100644
--- a/plugins/user-two-factor-authenticators/static-pin/pom.xml
+++ b/plugins/user-two-factor-authenticators/static-pin/pom.xml
@@ -19,7 +19,7 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>cloud-plugin-user-two-factor-authenticator-static-pin</artifactId>
+    <artifactId>cloud-plugin-user-two-factor-authenticator-staticpin</artifactId>
     <name>Apache CloudStack Plugin - User Two Factor Authenticator Static Pin</name>
     <parent>
         <groupId>org.apache.cloudstack</groupId>
diff --git a/plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/static-pin/module.properties b/plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/staticpin/module.properties
similarity index 96%
rename from plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/static-pin/module.properties
rename to plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/staticpin/module.properties
index ca0902de549..14deddd5bfc 100644
--- a/plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/static-pin/module.properties
+++ b/plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/staticpin/module.properties
@@ -14,5 +14,5 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-name=static-pin
+name=staticpin
 parent=api
\ No newline at end of file
diff --git a/plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/static-pin/spring-static-pin-context.xml b/plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/staticpin/spring-staticpin-context.xml
similarity index 96%
rename from plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/static-pin/spring-static-pin-context.xml
rename to plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/staticpin/spring-staticpin-context.xml
index 89c1d5a2be2..ac27ba527db 100644
--- a/plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/static-pin/spring-static-pin-context.xml
+++ b/plugins/user-two-factor-authenticators/static-pin/src/main/resources/META-INF/cloudstack/staticpin/spring-staticpin-context.xml
@@ -28,7 +28,7 @@
                       >
 
     <bean id="StaticPinUserTwoFactorAuthenticator" class="org.apache.cloudstack.auth.StaticPinUserTwoFactorAuthenticator">
-        <property name="name" value="StaticPin" />
+        <property name="name" value="STATICPIN" />
     </bean>
 
     
diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
index bdde132eb50..ffaddcbc3fb 100644
--- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
@@ -583,6 +583,7 @@ import org.apache.cloudstack.api.command.user.vpn.UpdateVpnConnectionCmd;
 import org.apache.cloudstack.api.command.user.vpn.UpdateVpnCustomerGatewayCmd;
 import org.apache.cloudstack.api.command.user.vpn.UpdateVpnGatewayCmd;
 import org.apache.cloudstack.api.command.user.zone.ListZonesCmd;
+import org.apache.cloudstack.auth.UserTwoFactorAuthenticator;
 import org.apache.cloudstack.config.ApiServiceConfiguration;
 import org.apache.cloudstack.config.Configuration;
 import org.apache.cloudstack.context.CallContext;
@@ -947,6 +948,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     private Map<String, Boolean> _availableIdsMap;
 
     private List<UserAuthenticator> _userAuthenticators;
+    private List<UserTwoFactorAuthenticator> _userTwoFactorAuthenticators;
     private List<UserAuthenticator> _userPasswordEncoders;
     protected boolean _executeInSequence;
 
@@ -991,6 +993,14 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
         _userAuthenticators = authenticators;
     }
 
+    public List<UserTwoFactorAuthenticator> getUserTwoFactorAuthenticators() {
+        return _userTwoFactorAuthenticators;
+    }
+
+    public void setUserTwoFactorAuthenticators(final List<UserTwoFactorAuthenticator> userTwoFactorAuthenticators) {
+        _userTwoFactorAuthenticators = userTwoFactorAuthenticators;
+    }
+
     public List<UserAuthenticator> getUserPasswordEncoders() {
         return _userPasswordEncoders;
     }
diff --git a/server/src/main/java/com/cloud/user/AccountManager.java b/server/src/main/java/com/cloud/user/AccountManager.java
index 0c5407c1495..0e65a0caa78 100644
--- a/server/src/main/java/com/cloud/user/AccountManager.java
+++ b/server/src/main/java/com/cloud/user/AccountManager.java
@@ -25,6 +25,7 @@ import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd;
 import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
 import org.apache.cloudstack.api.command.admin.user.MoveUserCmd;
 import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
+import org.apache.cloudstack.auth.UserTwoFactorAuthenticator;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
 
@@ -197,8 +198,10 @@ public interface AccountManager extends AccountService, Configurable {
 
     ConfigKey<String> userTwoFactorAuthenticationProviderPlugin = new ConfigKey<>("Advanced", String.class,
             "user.two.factor.authentication.provider.plugin",
-            "google",
-            "The user two factor authentication provider plugin. Eg. google, static-pin", true, ConfigKey.Scope.Domain);
+            "GOOGLE",
+            "The user two factor authentication provider plugin. Eg. GOOGLE, STATICPIN", true, ConfigKey.Scope.Domain);
 
     boolean moveUser(long id, Long domainId, Account newAccount);
+
+    UserTwoFactorAuthenticator getUserTwoFactorAuthenticator(final Long domainId, final Long userAccountId);
 }
diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
index 599d27a1edb..12b1eef8513 100644
--- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
@@ -292,7 +292,11 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
     @Inject
     private GlobalLoadBalancingRulesService _gslbService;
 
+    @Inject
+    public AccountService _accountService;
+
     private List<UserAuthenticator> _userAuthenticators;
+    private List<UserTwoFactorAuthenticator> _userTwoFactorAuthenticators;
     protected List<UserAuthenticator> _userPasswordEncoders;
     protected List<PluggableService> services;
     private List<APIChecker> apiAccessCheckers;
@@ -332,6 +336,14 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
         _userAuthenticators = authenticators;
     }
 
+    public List<UserTwoFactorAuthenticator> getUserTwoFactorAuthenticators() {
+        return _userTwoFactorAuthenticators;
+    }
+
+    public void setUserTwoFactorAuthenticators(List<UserTwoFactorAuthenticator> twoFactorAuthenticators) {
+        _userTwoFactorAuthenticators = _userTwoFactorAuthenticators;
+    }
+
     public List<UserAuthenticator> getUserPasswordEncoders() {
         return _userPasswordEncoders;
     }
@@ -3132,6 +3144,10 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
         return new ConfigKey<?>[] {UseSecretKeyInResponse, enable2FA, userTwoFactorAuthenticationProviderPlugin};
     }
 
+    public List<UserTwoFactorAuthenticator> getUserTwoFactorAuthenticationProviders() {
+        return userTwoFactorAuthenticationProviders;
+    }
+
     public void setUserTwoFactorAuthenticationProviders(final List<UserTwoFactorAuthenticator> userTwoFactorAuthenticationProviders) {
         this.userTwoFactorAuthenticationProviders = userTwoFactorAuthenticationProviders;
     }
@@ -3144,4 +3160,26 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
         }
     }
 
+    @Override
+    public UserTwoFactorAuthenticator getUserTwoFactorAuthenticator(Long domainId, Long userAccountId) {
+        if (userAccountId != null) {
+            UserAccount userAccount = _accountService.getUserAccountById(userAccountId);
+            if (userAccount.getUser2faProvider() != null) {
+                return getUserTwoFactorAuthenticator(userAccount.getUser2faProvider());
+            }
+        }
+        final String name = userTwoFactorAuthenticationProviderPlugin.valueIn(domainId);
+        return getUserTwoFactorAuthenticator(name);
+    }
+
+    public UserTwoFactorAuthenticator getUserTwoFactorAuthenticator(final String name) {
+        if (StringUtils.isEmpty(name)) {
+            throw new CloudRuntimeException("Invalid UserTwoFactorAuthenticator name provided");
+        }
+        if (!userTwoFactorAuthenticationProvidersMap.containsKey(name)) {
+            throw new CloudRuntimeException("Failed to find UserTwoFactorAuthenticator by the name: " + name);
+        }
+        return userTwoFactorAuthenticationProvidersMap.get(name);
+    }
+
 }
diff --git a/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java b/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java
index b6676efced7..f96de988f58 100644
--- a/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java
+++ b/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java
@@ -138,6 +138,11 @@ public class MockAccountManagerImpl extends ManagerBase implements Manager, Acco
         return false;
     }
 
+    @Override
+    public UserTwoFactorAuthenticator getUserTwoFactorAuthenticator(Long domainId, Long userAccountId) {
+        return null;
+    }
+
     @Override
     public boolean isAdmin(Long accountId) {
         // TODO Auto-generated method stub
diff --git a/setup/db/22beta4to22GA.sql b/setup/db/22beta4to22GA.sql
index 913afb19780..0e00062414e 100644
--- a/setup/db/22beta4to22GA.sql
+++ b/setup/db/22beta4to22GA.sql
@@ -61,7 +61,7 @@ ALTER TABLE `cloud`.`user_ip_address` DROP COLUMN public_ip_address;
 ALTER TABLE `cloud`.`user_ip_address` CHANGE public_ip_address1 public_ip_address char(40) NOT NULL COMMENT 'the public ip address';
 
 DROP VIEW if exists port_forwarding_rules_view;
-ALTER TABLE `cloud`.`port_forwarding_rules` ADD COLUMN `dest_ip_address1` char(40) NOT NULL COMMENT 'the destination ip address';
+    ALTER TABLE `cloud`.`port_forwarding_rules` ADD COLUMN `dest_ip_address1` char(40) NOT NULL COMMENT 'the destination ip address';
 UPDATE port_forwarding_rules SET dest_ip_address1 = INET_NTOA(dest_ip_address);
 ALTER TABLE `cloud`.`port_forwarding_rules` DROP COLUMN dest_ip_address;
 ALTER TABLE `cloud`.`port_forwarding_rules` CHANGE dest_ip_address1 dest_ip_address char(40) NOT NULL COMMENT 'the destination ip address';