diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProviderInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProviderInfo.java index 44c736b2bd..caede16568 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProviderInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProviderInfo.java @@ -25,6 +25,7 @@ import io.cloudbeaver.server.CBPlatform; import org.jkiss.dbeaver.Log; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -79,8 +80,13 @@ public class WebAuthProviderInfo { return result; } + public List getCredentialProfiles() { + return descriptor.getCredentialProfiles(); + } + + @Deprecated public List getCredentialParameters() { - return descriptor.getCredentialParameters(); + return descriptor.getCredentialParameters(Collections.emptySet()); } @Override diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java index 1b5e98bd13..252a3ee25b 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java @@ -26,10 +26,7 @@ import org.jkiss.dbeaver.model.impl.PropertyDescriptor; import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Auth service descriptor @@ -42,10 +39,50 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor { private DBWAuthProvider instance; private final DBPImage icon; private final Map configurationParameters = new LinkedHashMap<>(); - private final Map credentialParameters = new LinkedHashMap<>(); + private final List credentialProfiles = new ArrayList<>(); private final boolean configurable; private final String[] requiredFeatures; + public static class CredentialsProfile { + private final String id; + private final String label; + private final String description; + private final Map credentialParameters = new LinkedHashMap<>(); + public CredentialsProfile(IConfigurationElement cfg) { + this.id = cfg.getAttribute("id"); + this.label = cfg.getAttribute("label"); + this.description = cfg.getAttribute("description"); + for (IConfigurationElement propGroup : ArrayUtils.safeArray(cfg.getChildren(PropertyDescriptor.TAG_PROPERTY_GROUP))) { + String category = propGroup.getAttribute(PropertyDescriptor.ATTR_LABEL); + IConfigurationElement[] propElements = propGroup.getChildren(PropertyDescriptor.TAG_PROPERTY); + for (IConfigurationElement prop : propElements) { + WebAuthProviderPropertyDescriptor propertyDescriptor = new WebAuthProviderPropertyDescriptor(category, prop); + credentialParameters.put(CommonUtils.toString(propertyDescriptor.getId()), propertyDescriptor); + } + } + } + + public String getId() { + return id; + } + + public String getLabel() { + return label; + } + + public String getDescription() { + return description; + } + + public List getCredentialParameters() { + return new ArrayList<>(credentialParameters.values()); + } + + public WebAuthProviderPropertyDescriptor getCredentialParameter(String id) { + return credentialParameters.get(id); + } + } + public WebAuthProviderDescriptor(IConfigurationElement cfg) { super(cfg); this.cfg = cfg; @@ -64,14 +101,7 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor { } } for (IConfigurationElement credElement : cfg.getChildren("credentials")) { - for (IConfigurationElement propGroup : ArrayUtils.safeArray(credElement.getChildren(PropertyDescriptor.TAG_PROPERTY_GROUP))) { - String category = propGroup.getAttribute(PropertyDescriptor.ATTR_LABEL); - IConfigurationElement[] propElements = propGroup.getChildren(PropertyDescriptor.TAG_PROPERTY); - for (IConfigurationElement prop : propElements) { - WebAuthProviderPropertyDescriptor propertyDescriptor = new WebAuthProviderPropertyDescriptor(category, prop); - credentialParameters.put(CommonUtils.toString(propertyDescriptor.getId()), propertyDescriptor); - } - } + credentialProfiles.add(new CredentialsProfile(credElement)); } String rfList = cfg.getAttribute("requiredFeatures"); @@ -107,12 +137,48 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor { return new ArrayList<>(configurationParameters.values()); } - public List getCredentialParameters() { - return new ArrayList<>(credentialParameters.values()); + public List getCredentialProfiles() { + return new ArrayList<>(credentialProfiles); } - public WebAuthProviderPropertyDescriptor getCredentialParameter(String id) { - return credentialParameters.get(id); + public CredentialsProfile getCredentialProfileByParameters(Set keySet) { + if (credentialProfiles.size() > 1) { + for (CredentialsProfile profile : credentialProfiles) { + if (profile.getCredentialParameters().size() == keySet.size()) { + boolean matches = true; + for (String paramName : keySet) { + if (profile.getCredentialParameter(paramName) == null) { + matches = false; + break; + } + } + if (matches) { + return profile; + } + } + } + } + return credentialProfiles.get(0); + } + + public List getCredentialParameters(Set keySet) { + if (credentialProfiles.size() > 1) { + for (CredentialsProfile profile : credentialProfiles) { + if (profile.getCredentialParameters().size() == keySet.size()) { + boolean matches = true; + for (String paramName : keySet) { + if (profile.getCredentialParameter(paramName) == null) { + matches = false; + break; + } + } + if (matches) { + return profile.getCredentialParameters(); + } + } + } + } + return credentialProfiles.get(0).getCredentialParameters(); } @NotNull diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderPropertyDescriptor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderPropertyDescriptor.java index 222a12ad87..4ece3d6c9d 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderPropertyDescriptor.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderPropertyDescriptor.java @@ -26,10 +26,10 @@ import org.jkiss.utils.CommonUtils; */ public class WebAuthProviderPropertyDescriptor extends PropertyDescriptor { - private WebAuthProviderPropertyEncryption encryption; - private boolean identifying; // Identifying parameter. Will be used during auth for user search by credentials - private boolean admin; // Parameter value can be configured in admin panel - private boolean user; // Parameter can be passed by end-user from UI + private final WebAuthProviderPropertyEncryption encryption; + private final boolean identifying; // Identifying parameter. Will be used during auth for user search by credentials + private final boolean admin; // Parameter value can be configured in admin panel + private final boolean user; // Parameter can be passed by end-user from UI public WebAuthProviderPropertyDescriptor(String category, IConfigurationElement config) { super(category, config); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java index 577968b085..b9a7e2e47d 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java @@ -272,9 +272,10 @@ class CBSecurityController implements DBWSecurityController { public void setUserCredentials(String userId, WebAuthProviderDescriptor authProvider, Map credentials) throws DBCException { List transformedCredentials; try { + WebAuthProviderDescriptor.CredentialsProfile credProfile = authProvider.getCredentialProfileByParameters(credentials.keySet()); transformedCredentials = credentials.entrySet().stream().map(cred -> { String propertyName = cred.getKey(); - WebAuthProviderPropertyDescriptor property = authProvider.getCredentialParameter(propertyName); + WebAuthProviderPropertyDescriptor property = credProfile.getCredentialParameter(propertyName); if (property == null) { return null; } @@ -313,7 +314,7 @@ class CBSecurityController implements DBWSecurityController { @Override public String getUserByCredentials(WebAuthProviderDescriptor authProvider, Map authParameters) throws DBCException { Map identCredentials = new LinkedHashMap<>(); - for (WebAuthProviderPropertyDescriptor prop : authProvider.getCredentialParameters()) { + for (WebAuthProviderPropertyDescriptor prop : authProvider.getCredentialParameters(authParameters.keySet())) { if (prop.isIdentifying()) { String propId = CommonUtils.toString(prop.getId()); Object paramValue = authParameters.get(propId); diff --git a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls index 794e1058a4..ffe251dd83 100644 --- a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls +++ b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls @@ -36,6 +36,13 @@ type AuthProviderConfiguration { metadataLink: String } +type AuthProviderCredentialsProfile { + id: String + label: String + description: String + credentialParameters: [AuthCredentialInfo!]! +} + type AuthProviderInfo { id: ID! label: String! @@ -50,7 +57,9 @@ type AuthProviderInfo { # Provider configurations (applicable only if configurable=true) configurations: [AuthProviderConfiguration!] - credentialParameters: [AuthCredentialInfo!]! + crdentialProfiles: [AuthProviderCredentialsProfile!]! + + credentialParameters: [AuthCredentialInfo!]! @deprecated } type UserAuthToken {