From 919c288ba93c89ca91b05d4c7d1fda81639c2612 Mon Sep 17 00:00:00 2001 From: Brian Long Date: Thu, 21 Oct 2021 15:24:18 -0400 Subject: [PATCH] added support for builds against keycloak v6-v15 --- .gitignore | 11 + pom.xml | 346 +++++++++++++++++- .../jpicht/keycloak/policy/FakeRealmV10.java | 41 +++ .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../jpicht/keycloak/policy/FakeRealmV11.java | 41 +++ .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../jpicht/keycloak/policy/FakeRealmV12.java | 202 ++++++++++ .../policy/GroupPasswordPolicyProvider.java | 75 ++++ .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../jpicht/keycloak/policy/FakeRealmV13.java | 73 ++++ .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../jpicht/keycloak/policy/FakeRealmV14.java | 31 ++ .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../jpicht/keycloak/policy/FakeRealmV15.java | 28 ++ .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../jpicht/keycloak/policy/FakeRealmV6.java} | 10 +- .../policy/GroupPasswordPolicyProvider.java | 0 .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../jpicht/keycloak/policy/FakeRealmV8.java | 39 ++ .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../jpicht/keycloak/policy/FakeRealmV9.java | 74 ++++ .../jpicht/keycloak/policy/FakeRealm.java | 36 ++ .../policy/PolicyProviderMultiplexer.java | 2 +- 23 files changed, 1271 insertions(+), 26 deletions(-) create mode 100644 src/keycloak-v10-common/java/com/github/jpicht/keycloak/policy/FakeRealmV10.java create mode 100644 src/keycloak-v10/java/com/github/jpicht/keycloak/policy/FakeRealm.java create mode 100644 src/keycloak-v11-common/java/com/github/jpicht/keycloak/policy/FakeRealmV11.java create mode 100644 src/keycloak-v11/java/com/github/jpicht/keycloak/policy/FakeRealm.java create mode 100644 src/keycloak-v12-common/java/com/github/jpicht/keycloak/policy/FakeRealmV12.java create mode 100644 src/keycloak-v12-common/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java create mode 100644 src/keycloak-v12/java/com/github/jpicht/keycloak/policy/FakeRealm.java create mode 100644 src/keycloak-v13-common/java/com/github/jpicht/keycloak/policy/FakeRealmV13.java create mode 100644 src/keycloak-v13/java/com/github/jpicht/keycloak/policy/FakeRealm.java create mode 100644 src/keycloak-v14-common/java/com/github/jpicht/keycloak/policy/FakeRealmV14.java create mode 100644 src/keycloak-v14/java/com/github/jpicht/keycloak/policy/FakeRealm.java create mode 100644 src/keycloak-v15-common/java/com/github/jpicht/keycloak/policy/FakeRealmV15.java create mode 100644 src/keycloak-v15/java/com/github/jpicht/keycloak/policy/FakeRealm.java rename src/{main/java/com/github/jpicht/keycloak/policy/FakeRealm.java => keycloak-v6-common/java/com/github/jpicht/keycloak/policy/FakeRealmV6.java} (99%) rename src/{main => keycloak-v6-v11}/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java (100%) create mode 100644 src/keycloak-v6/java/com/github/jpicht/keycloak/policy/FakeRealm.java create mode 100644 src/keycloak-v8-common/java/com/github/jpicht/keycloak/policy/FakeRealmV8.java create mode 100644 src/keycloak-v8/java/com/github/jpicht/keycloak/policy/FakeRealm.java create mode 100644 src/keycloak-v9-common/java/com/github/jpicht/keycloak/policy/FakeRealmV9.java create mode 100644 src/keycloak-v9/java/com/github/jpicht/keycloak/policy/FakeRealm.java diff --git a/.gitignore b/.gitignore index eb5a316..683f09c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,12 @@ +# Maven target +pom.xml.versionsBackup + +# Eclipse +.project +.classpath +.settings + +# VS Code +.factorypath +.vscode diff --git a/pom.xml b/pom.xml index 47b7e07..72f52ba 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.github.jpicht.keycloak.policy keycloak-group-password-policy - 0.1-SNAPSHOT + 0.2-SNAPSHOT jar @@ -13,8 +13,8 @@ ${java.version} ${java.version} - 6.0.1 - 1.0-rc5 + ${keycloak.majorVersion}.0.0 + 1.0 @@ -45,23 +45,6 @@ provided true - - org.keycloak.testsuite - integration-arquillian-tests-base - 6.0.1 - test - - - org.keycloak - keycloak-test-helper - 6.0.1 - test - - - org.keycloak - keycloak-services - 6.0.1 - @@ -71,7 +54,330 @@ maven-jar-plugin 3.1.1 + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + + + org.apache.maven.plugins + maven-jar-plugin + + keycloak-v${keycloak.majorVersion} + + + + + + + keycloak-v6 + + 6 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v6 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v6-v11/java + ${basedir}/src/keycloak-v6/java + + + + + + + + + + keycloak-v7 + + true + + + 7 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v7 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v6-v11/java + ${basedir}/src/keycloak-v6/java + + + + + + + + + + keycloak-v8 + + 8 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v8 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v8-common/java + ${basedir}/src/keycloak-v6-v11/java + ${basedir}/src/keycloak-v8/java + + + + + + + + + + keycloak-v9 + + 9 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v9 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v8-common/java + ${basedir}/src/keycloak-v9-common/java + ${basedir}/src/keycloak-v6-v11/java + ${basedir}/src/keycloak-v9/java + + + + + + + + + + keycloak-v10 + + 10 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v10 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v8-common/java + ${basedir}/src/keycloak-v9-common/java + ${basedir}/src/keycloak-v10-common/java + ${basedir}/src/keycloak-v6-v11/java + ${basedir}/src/keycloak-v10/java + + + + + + + + + + keycloak-v11 + + 11 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v11 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v8-common/java + ${basedir}/src/keycloak-v9-common/java + ${basedir}/src/keycloak-v10-common/java + ${basedir}/src/keycloak-v11-common/java + ${basedir}/src/keycloak-v6-v11/java + ${basedir}/src/keycloak-v11/java + + + + + + + + + + keycloak-v12 + + 12 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v12 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v8-common/java + ${basedir}/src/keycloak-v9-common/java + ${basedir}/src/keycloak-v10-common/java + ${basedir}/src/keycloak-v11-common/java + ${basedir}/src/keycloak-v12-common/java + ${basedir}/src/keycloak-v12/java + + + + + + + + + + keycloak-v13 + + 13 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v13 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v8-common/java + ${basedir}/src/keycloak-v9-common/java + ${basedir}/src/keycloak-v10-common/java + ${basedir}/src/keycloak-v11-common/java + ${basedir}/src/keycloak-v12-common/java + ${basedir}/src/keycloak-v13-common/java + ${basedir}/src/keycloak-v13/java + + + + + + + + + + keycloak-v14 + + 14 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v14 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v8-common/java + ${basedir}/src/keycloak-v9-common/java + ${basedir}/src/keycloak-v10-common/java + ${basedir}/src/keycloak-v11-common/java + ${basedir}/src/keycloak-v12-common/java + ${basedir}/src/keycloak-v13-common/java + ${basedir}/src/keycloak-v14-common/java + ${basedir}/src/keycloak-v14/java + + + + + + + + + + keycloak-v15 + + 15 + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source-keycloak-v15 + add-source + + + ${basedir}/src/keycloak-v6-common/java + ${basedir}/src/keycloak-v8-common/java + ${basedir}/src/keycloak-v9-common/java + ${basedir}/src/keycloak-v10-common/java + ${basedir}/src/keycloak-v11-common/java + ${basedir}/src/keycloak-v12-common/java + ${basedir}/src/keycloak-v13-common/java + ${basedir}/src/keycloak-v14-common/java + ${basedir}/src/keycloak-v15-common/java + ${basedir}/src/keycloak-v15/java + + + + + + + + + diff --git a/src/keycloak-v10-common/java/com/github/jpicht/keycloak/policy/FakeRealmV10.java b/src/keycloak-v10-common/java/com/github/jpicht/keycloak/policy/FakeRealmV10.java new file mode 100644 index 0000000..11fee0a --- /dev/null +++ b/src/keycloak-v10-common/java/com/github/jpicht/keycloak/policy/FakeRealmV10.java @@ -0,0 +1,41 @@ +/* + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +public abstract class FakeRealmV10 extends FakeRealmV9 { + + @Override + public int getClientSessionIdleTimeout() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setClientSessionIdleTimeout(int seconds) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getClientSessionMaxLifespan() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setClientSessionMaxLifespan(int seconds) { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/keycloak-v10/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v10/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..7d79c71 --- /dev/null +++ b/src/keycloak-v10/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV10 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/keycloak-v11-common/java/com/github/jpicht/keycloak/policy/FakeRealmV11.java b/src/keycloak-v11-common/java/com/github/jpicht/keycloak/policy/FakeRealmV11.java new file mode 100644 index 0000000..ed6de27 --- /dev/null +++ b/src/keycloak-v11-common/java/com/github/jpicht/keycloak/policy/FakeRealmV11.java @@ -0,0 +1,41 @@ +/* + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +public abstract class FakeRealmV11 extends FakeRealmV10 { + + @Override + public int getClientOfflineSessionIdleTimeout() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setClientOfflineSessionIdleTimeout(int seconds) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getClientOfflineSessionMaxLifespan() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setClientOfflineSessionMaxLifespan(int seconds) { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/keycloak-v11/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v11/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..6ad6c88 --- /dev/null +++ b/src/keycloak-v11/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV11 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/keycloak-v12-common/java/com/github/jpicht/keycloak/policy/FakeRealmV12.java b/src/keycloak-v12-common/java/com/github/jpicht/keycloak/policy/FakeRealmV12.java new file mode 100644 index 0000000..d3960e2 --- /dev/null +++ b/src/keycloak-v12-common/java/com/github/jpicht/keycloak/policy/FakeRealmV12.java @@ -0,0 +1,202 @@ +/* + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import java.util.Map; +import java.util.stream.Stream; + +import org.keycloak.component.ComponentModel; +import org.keycloak.models.AuthenticationExecutionModel; +import org.keycloak.models.AuthenticationFlowModel; +import org.keycloak.models.AuthenticatorConfigModel; +import org.keycloak.models.ClientModel; +import org.keycloak.models.ClientScopeModel; +import org.keycloak.models.GroupModel; +import org.keycloak.models.IdentityProviderMapperModel; +import org.keycloak.models.IdentityProviderModel; +import org.keycloak.models.RequiredActionProviderModel; +import org.keycloak.models.RequiredCredentialModel; +import org.keycloak.models.RoleModel; + +public abstract class FakeRealmV12 extends FakeRealmV11 { + + @Override + public Stream getRequiredCredentialsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getDefaultGroupsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getClientsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getClientsStream(Integer firstResult, Integer maxResults) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getAlwaysDisplayInConsoleClientsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream searchClientByClientIdStream(String clientId, Integer firstResult, Integer maxResults) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getAuthenticationFlowsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getAuthenticationExecutionsStream(String flowId) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getAuthenticatorConfigsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getRequiredActionProvidersStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getIdentityProvidersStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getIdentityProviderMappersStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getIdentityProviderMappersByAliasStream(String brokerAlias) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getComponentsStream(String parentId, String providerType) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getComponentsStream(String parentId) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getComponentsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getEventsListenersStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getEnabledEventTypesStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getSupportedLocalesStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getGroupsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getTopLevelGroupsStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getTopLevelGroupsStream(Integer first, Integer max) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream searchForGroupByNameStream(String search, Integer first, Integer max) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getClientScopesStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void patchRealmLocalizationTexts(String locale, Map localizationTexts) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean removeRealmLocalizationTexts(String locale) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Map> getRealmLocalizationTexts() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Map getRealmLocalizationTextsByLocale(String locale) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getDefaultClientScopesStream(boolean defaultScope) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getRolesStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getRolesStream(Integer firstResult, Integer maxResults) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream searchForRolesStream(String search, Integer first, Integer max) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getDefaultRolesStream() { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/keycloak-v12-common/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java b/src/keycloak-v12-common/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java new file mode 100644 index 0000000..bc42684 --- /dev/null +++ b/src/keycloak-v12-common/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java @@ -0,0 +1,75 @@ +/* + * Copyright 2019 Julian Picht + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import java.util.LinkedList; +import java.util.function.Consumer; + +import org.jboss.logging.Logger; +import org.keycloak.models.GroupModel; +import org.keycloak.models.KeycloakSession; +import org.keycloak.models.RealmModel; +import org.keycloak.models.UserModel; +import org.keycloak.policy.PasswordPolicyConfigException; + +public class GroupPasswordPolicyProvider extends PolicyProviderMultiplexer { + + private static final Logger logger = Logger.getLogger(GroupPasswordPolicyProvider.class); + + public GroupPasswordPolicyProvider(KeycloakSession session) { + super(session); + } + + @Override + protected LinkedList findPolicies(RealmModel realm, UserModel user) { + // First get the name of the attribute + String groupAttribute = realm.getPasswordPolicy().getPolicyConfig(GroupPasswordPolicyProviderFactory.ID); + logger.debugf("groupAttribute %s", groupAttribute); + logger.debugf("user %s", user.getUsername()); + + LinkedList policyDefinitions = new LinkedList<>(); + + // Iterate groups and collect policy strings + user.getGroupsStream().forEach(new Consumer() { + @Override + public void accept(GroupModel group) { + logger.debugf("group %s", group.getName()); + group.getAttributeStream(groupAttribute).forEach(new Consumer() { + @Override + public void accept(String policyString) { + logger.infof("adding group password policy: %s", policyString); + policyDefinitions.add(policyString); + } + }); + } + }); + + return policyDefinitions; + } + + @Override + public Object parseConfig(String value) { + if (value == null || value.isEmpty()) { + throw new PasswordPolicyConfigException("Attribute name cannot be blank"); + } + return value; + } + + @Override + public void close() { + } +} diff --git a/src/keycloak-v12/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v12/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..e450f75 --- /dev/null +++ b/src/keycloak-v12/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV12 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/keycloak-v13-common/java/com/github/jpicht/keycloak/policy/FakeRealmV13.java b/src/keycloak-v13-common/java/com/github/jpicht/keycloak/policy/FakeRealmV13.java new file mode 100644 index 0000000..db28517 --- /dev/null +++ b/src/keycloak-v13-common/java/com/github/jpicht/keycloak/policy/FakeRealmV13.java @@ -0,0 +1,73 @@ +/* + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import java.util.stream.Stream; + +import org.keycloak.models.CibaConfig; +import org.keycloak.models.ClientInitialAccessModel; +import org.keycloak.models.OAuth2DeviceConfig; +import org.keycloak.models.RoleModel; + +public abstract class FakeRealmV13 extends FakeRealmV12 { + + @Override + public OAuth2DeviceConfig getOAuth2DeviceConfig() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public CibaConfig getCibaPolicy() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public RoleModel getDefaultRole() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setDefaultRole(RoleModel role) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public ClientInitialAccessModel createClientInitialAccessModel(int expiration, int count) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public ClientInitialAccessModel getClientInitialAccessModel(String id) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void removeClientInitialAccessModel(String id) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Stream getClientInitialAccesses() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void decreaseRemainingCount(ClientInitialAccessModel clientInitialAccess) { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/keycloak-v13/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v13/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..cdef8d4 --- /dev/null +++ b/src/keycloak-v13/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV13 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/keycloak-v14-common/java/com/github/jpicht/keycloak/policy/FakeRealmV14.java b/src/keycloak-v14-common/java/com/github/jpicht/keycloak/policy/FakeRealmV14.java new file mode 100644 index 0000000..092f7e9 --- /dev/null +++ b/src/keycloak-v14-common/java/com/github/jpicht/keycloak/policy/FakeRealmV14.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import java.util.Map; +import java.util.stream.Stream; + +import org.keycloak.models.ClientModel; + +public abstract class FakeRealmV14 extends FakeRealmV13 { + + @Override + public Stream searchClientByAttributes(Map attributes, Integer firstResult, Integer maxResults) { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/keycloak-v14/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v14/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..f482c08 --- /dev/null +++ b/src/keycloak-v14/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV14 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/keycloak-v15-common/java/com/github/jpicht/keycloak/policy/FakeRealmV15.java b/src/keycloak-v15-common/java/com/github/jpicht/keycloak/policy/FakeRealmV15.java new file mode 100644 index 0000000..9197a5a --- /dev/null +++ b/src/keycloak-v15-common/java/com/github/jpicht/keycloak/policy/FakeRealmV15.java @@ -0,0 +1,28 @@ +/* + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.ParConfig; + +public class FakeRealmV15 extends FakeRealmV14 { + + @Override + public ParConfig getParPolicy() { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/keycloak-v15/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v15/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..d335bf9 --- /dev/null +++ b/src/keycloak-v15/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV15 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/main/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v6-common/java/com/github/jpicht/keycloak/policy/FakeRealmV6.java similarity index 99% rename from src/main/java/com/github/jpicht/keycloak/policy/FakeRealm.java rename to src/keycloak-v6-common/java/com/github/jpicht/keycloak/policy/FakeRealmV6.java index 1fd552a..6d92de7 100644 --- a/src/main/java/com/github/jpicht/keycloak/policy/FakeRealm.java +++ b/src/keycloak-v6-common/java/com/github/jpicht/keycloak/policy/FakeRealmV6.java @@ -1,5 +1,6 @@ /* * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,8 +37,8 @@ import org.keycloak.models.RequiredActionProviderModel; import org.keycloak.models.RequiredCredentialModel; import org.keycloak.models.RoleModel; -public class FakeRealm implements RealmModel { - +public abstract class FakeRealmV6 implements RealmModel { + @Override public String getId() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. @@ -508,15 +509,14 @@ public class FakeRealm implements RealmModel { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - private PasswordPolicy passwordPolicy; @Override public PasswordPolicy getPasswordPolicy() { - return passwordPolicy; + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void setPasswordPolicy(PasswordPolicy policy) { - passwordPolicy = policy; + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override diff --git a/src/main/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java b/src/keycloak-v6-v11/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java similarity index 100% rename from src/main/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java rename to src/keycloak-v6-v11/java/com/github/jpicht/keycloak/policy/GroupPasswordPolicyProvider.java diff --git a/src/keycloak-v6/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v6/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..efcb777 --- /dev/null +++ b/src/keycloak-v6/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV6 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/keycloak-v8-common/java/com/github/jpicht/keycloak/policy/FakeRealmV8.java b/src/keycloak-v8-common/java/com/github/jpicht/keycloak/policy/FakeRealmV8.java new file mode 100644 index 0000000..0736533 --- /dev/null +++ b/src/keycloak-v8-common/java/com/github/jpicht/keycloak/policy/FakeRealmV8.java @@ -0,0 +1,39 @@ +/* + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.AuthenticationExecutionModel; +import org.keycloak.models.WebAuthnPolicy; + +public abstract class FakeRealmV8 extends FakeRealmV6 { + + @Override + public WebAuthnPolicy getWebAuthnPolicy() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setWebAuthnPolicy(WebAuthnPolicy policy) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public AuthenticationExecutionModel getAuthenticationExecutionByFlowId(String flowId) { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/keycloak-v8/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v8/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..edb6df1 --- /dev/null +++ b/src/keycloak-v8/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV8 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/keycloak-v9-common/java/com/github/jpicht/keycloak/policy/FakeRealmV9.java b/src/keycloak-v9-common/java/com/github/jpicht/keycloak/policy/FakeRealmV9.java new file mode 100644 index 0000000..55919d5 --- /dev/null +++ b/src/keycloak-v9-common/java/com/github/jpicht/keycloak/policy/FakeRealmV9.java @@ -0,0 +1,74 @@ +/* + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import java.util.List; +import java.util.Set; + +import org.keycloak.models.ClientModel; +import org.keycloak.models.GroupModel; +import org.keycloak.models.RoleModel; +import org.keycloak.models.WebAuthnPolicy; + +public abstract class FakeRealmV9 extends FakeRealmV8 { + + @Override + public WebAuthnPolicy getWebAuthnPolicyPasswordless() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setWebAuthnPolicyPasswordless(WebAuthnPolicy policy) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public List getClients(Integer firstResult, Integer maxResults) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Long getClientsCount() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public List getAlwaysDisplayInConsoleClients() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public List searchClientByClientId(String clientId, Integer firstResult, Integer maxResults) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public GroupModel createGroup(String id, String name, GroupModel toParent) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Set getRoles(Integer firstResult, Integer maxResults) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Set searchForRoles(String search, Integer first, Integer max) { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/keycloak-v9/java/com/github/jpicht/keycloak/policy/FakeRealm.java b/src/keycloak-v9/java/com/github/jpicht/keycloak/policy/FakeRealm.java new file mode 100644 index 0000000..7fcc17a --- /dev/null +++ b/src/keycloak-v9/java/com/github/jpicht/keycloak/policy/FakeRealm.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Julian Picht + * Copyright 2021 Brian Long (brian@inteligr8.com) + * + * Licensed 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 com.github.jpicht.keycloak.policy; + +import org.keycloak.models.PasswordPolicy; + +public class FakeRealm extends FakeRealmV9 { + + private PasswordPolicy passwordPolicy; + + @Override + public PasswordPolicy getPasswordPolicy() { + return passwordPolicy; + } + + @Override + public void setPasswordPolicy(PasswordPolicy policy) { + passwordPolicy = policy; + } + +} diff --git a/src/main/java/com/github/jpicht/keycloak/policy/PolicyProviderMultiplexer.java b/src/main/java/com/github/jpicht/keycloak/policy/PolicyProviderMultiplexer.java index 00a245c..f6b199d 100644 --- a/src/main/java/com/github/jpicht/keycloak/policy/PolicyProviderMultiplexer.java +++ b/src/main/java/com/github/jpicht/keycloak/policy/PolicyProviderMultiplexer.java @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Properties; + import org.keycloak.models.KeycloakSession; import org.keycloak.models.PasswordPolicy; import org.keycloak.models.RealmModel; @@ -65,7 +66,6 @@ abstract public class PolicyProviderMultiplexer implements PasswordPolicyProvide // use org.keycloak.models.PasswordPolicy to parse the policy string protected PasswordPolicy parsePolicy(String policy) { - LinkedList list = new LinkedList<>(); PasswordPolicy parsedPolicy = PasswordPolicy.parse(session, policy); return parsedPolicy; }