Merge branch 'master-upstream' into feature-lithuanian-locale

# Conflicts:
#	themes/src/main/resources/theme/base/account/messages/messages_en.properties
#	themes/src/main/resources/theme/base/account/theme.properties
#	themes/src/main/resources/theme/base/admin/theme.properties
#	themes/src/main/resources/theme/base/email/theme.properties
#	themes/src/main/resources/theme/base/login/theme.properties
This commit is contained in:
Ramūnas Kraujutis 2016-09-06 10:51:01 +03:00
commit e67f8c7a61
78 changed files with 3212 additions and 3881 deletions

View file

@ -380,6 +380,7 @@
var req = new XMLHttpRequest();
req.open('POST', url, true);
req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
req.withCredentials = true;
if (kc.clientId && kc.clientSecret) {
req.setRequestHeader('Authorization', 'Basic ' + btoa(kc.clientId + ':' + kc.clientSecret));

View file

@ -16,31 +16,21 @@
-->
<assembly>
<id>auth-server-jboss-kc14</id>
<id>fuse-adapter-dist</id>
<formats>
<format>zip</format>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.3.1.Final</outputDirectory>
<excludes>
<exclude>**/*.sh</exclude>
</excludes>
</fileSet>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.3.1.Final</outputDirectory>
<directory>${project.build.directory}/system</directory>
<includes>
<include>**/*.sh</include>
<include>*/**</include>
</includes>
<fileMode>0755</fileMode>
<outputDirectory>system</outputDirectory>
</fileSet>
</fileSets>
</assembly>
</assembly>

View file

@ -0,0 +1,173 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>2.2.0-SNAPSHOT</version>
<relativePath>../../../pom.xml</relativePath>
</parent>
<artifactId>keycloak-fuse-adapter-dist</artifactId>
<packaging>pom</packaging>
<name>Keycloak Fuse Adapter Distro</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-osgi-features</artifactId>
<version>${project.version}</version>
<type>xml</type>
<classifier>features</classifier>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-osgi-thirdparty</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-base</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-common</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-authz-client</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-adapter-spi</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-adapter-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-osgi-adapter</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-jetty-adapter-spi</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-jetty-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-jetty81-adapter</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-osgi-jaas</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-jetty92-adapter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/system</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<useRepositoryLayout>true</useRepositoryLayout>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>assemble</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
<outputDirectory>target</outputDirectory>
<workDirectory>target/assembly/work</workDirectory>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View file

@ -32,6 +32,7 @@
<modules>
<module>as7-eap6-adapter</module>
<module>fuse-adapter-zip</module>
<module>jetty81-adapter-zip</module>
<module>jetty91-adapter-zip</module>
<module>jetty92-adapter-zip</module>

View file

@ -17,6 +17,10 @@
package org.keycloak.protocol;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.ProtocolMapperContainerModel;
import org.keycloak.models.ProtocolMapperModel;
import org.keycloak.models.RealmModel;
import org.keycloak.provider.ConfiguredProvider;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
@ -30,4 +34,16 @@ public interface ProtocolMapper extends Provider, ProviderFactory<ProtocolMapper
String getDisplayCategory();
String getDisplayType();
/**
* Called when instance of mapperModel is created/updated for this protocolMapper through admin endpoint
*
* @param session
* @param realm
* @param client client or clientTemplate
* @param mapperModel
* @throws ProtocolMapperConfigException if configuration provided in mapperModel is not valid
*/
default void validateConfig(KeycloakSession session, RealmModel realm, ProtocolMapperContainerModel client, ProtocolMapperModel mapperModel) throws ProtocolMapperConfigException {
};
}

View file

@ -0,0 +1,48 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* 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 org.keycloak.protocol;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class ProtocolMapperConfigException extends Exception {
private Object[] parameters;
public ProtocolMapperConfigException(String message) {
super(message);
}
public ProtocolMapperConfigException(String message, Throwable cause) {
super(message, cause);
}
public ProtocolMapperConfigException(String message, Object ... parameters) {
super(message);
this.parameters = parameters;
}
public Object[] getParameters() {
return parameters;
}
public void setParameters(Object[] parameters) {
this.parameters = parameters;
}
}

View file

@ -1,387 +0,0 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* 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 org.keycloak.storage.changeset;
import org.keycloak.common.util.MultivaluedHashMap;
import org.keycloak.models.UserCredentialValueModel;
import org.keycloak.models.entities.AbstractIdentifiableEntity;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class UserData {
private String id;
private boolean idChanged;
private String username;
private boolean usernameChanged;
private Long createdTimestamp;
private boolean createdTimestampChanged;
private String firstName;
private boolean firstNameChanged;
private String lastName;
private boolean lastNameChanged;
private String email;
private boolean emailChanged;
private boolean emailVerified;
private boolean emailVerifiedChanged;
private boolean totp;
private boolean totpChanged;
private boolean enabled;
private boolean enabledChanged;
private Set<String> roleIds = new HashSet<>();
private boolean rolesChanged;
private Set<String> groupIds = new HashSet<>();
private boolean groupsChanged;
private MultivaluedHashMap<String, String> attributes = new MultivaluedHashMap<>();
private boolean attributesChanged;
private Set<String> requiredActions = new HashSet<>();
private boolean requiredActionsChanged;
private List<UserCredentialValueModel> credentials = new LinkedList<>();
private boolean credentialsChanged;
public void rememberState() {
original = new UserData();
original.id = id;
original.username = username;
original.createdTimestamp = createdTimestamp;
original.firstName = firstName;
original.lastName = lastName;
original.email = email;
original.emailVerified = emailVerified;
original.totp = totp;
original.enabled = enabled;
original.attributes.putAll(attributes);
original.requiredActions.addAll(requiredActions);
original.credentials.addAll(credentials);
}
private UserData original = null;
public void clearChangeFlags() {
original = null;
idChanged = false;
usernameChanged = false;
createdTimestampChanged = false;
firstNameChanged = false;
lastNameChanged = false;
emailChanged = false;
emailVerifiedChanged = false;
totpChanged = false;
enabledChanged = false;
rolesChanged = false;
groupsChanged = false;
attributesChanged = false;
requiredActionsChanged = false;
credentialsChanged = false;
}
public boolean isChanged() {
return !idChanged
&& !usernameChanged
&& !createdTimestampChanged
&& !firstNameChanged
&& !lastNameChanged
&& !emailChanged
&& !emailVerifiedChanged
&& !totpChanged
&& !enabledChanged
&& !rolesChanged
&& !groupsChanged
&& !attributesChanged
&& !requiredActionsChanged
&& !credentialsChanged;
}
public boolean isIdChanged() {
return idChanged;
}
public boolean isUsernameChanged() {
return usernameChanged;
}
public boolean isCreatedTimestampChanged() {
return createdTimestampChanged;
}
public boolean isFirstNameChanged() {
return firstNameChanged;
}
public boolean isLastNameChanged() {
return lastNameChanged;
}
public boolean isEmailChanged() {
return emailChanged;
}
public boolean isEmailVerifiedChanged() {
return emailVerifiedChanged;
}
public boolean isTotpChanged() {
return totpChanged;
}
public boolean isEnabledChanged() {
return enabledChanged;
}
public boolean isRolesChanged() {
return rolesChanged;
}
public boolean isGroupsChanged() {
return groupsChanged;
}
public boolean isAttributesChanged() {
return attributesChanged;
}
public boolean isRequiredActionsChanged() {
return requiredActionsChanged;
}
public boolean isCredentialsChanged() {
return credentialsChanged;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
idChanged = true;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
usernameChanged = true;
}
public Long getCreatedTimestamp() {
return createdTimestamp;
}
public void setCreatedTimestamp(Long timestamp) {
this.createdTimestamp = timestamp;
createdTimestampChanged = true;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
firstNameChanged = true;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
lastNameChanged = true;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
emailChanged = true;
}
public boolean isEmailVerified() {
return emailVerified;
}
public void setEmailVerified(boolean emailVerified) {
this.emailVerified = emailVerified;
emailVerifiedChanged = true;
}
public boolean isTotp() {
return totp;
}
public void setTotp(boolean totp) {
this.totp = totp;
totpChanged = true;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
enabledChanged = true;
}
public Set<String> getRoleMappings() {
return Collections.unmodifiableSet(roleIds);
}
public void grantRole(String roleId) {
if (roleIds.contains(roleId)) return;
roleIds.add(roleId);
rolesChanged = true;
}
public void deleteRoleMapping(String roleId) {
if (!roleIds.contains(roleId)) return;
roleIds.remove(roleId);
rolesChanged = true;
}
public MultivaluedHashMap<String, String> getAttributes() {
return attributes;
}
public void setSingleAttribute(String name, String value) {
attributes.putSingle(name, value);
attributesChanged = true;
}
public void setAttribute(String name, List<String> values) {
attributes.put(name, values);
attributesChanged = true;
}
public void removeAttribute(String name) {
attributes.remove(name);
attributesChanged = true;
}
public Set<String> getRequiredActions() {
return Collections.unmodifiableSet(requiredActions);
}
public void addRequiredAction(String action) {
if (requiredActions.contains(action)) return;
requiredActions.add(action);
requiredActionsChanged = true;
}
public void removeRequiredAction(String action) {
if (!requiredActions.contains(action)) return;
requiredActions.remove(action);
requiredActionsChanged = true;
}
public List<UserCredentialValueModel> getCredentials() {
return Collections.unmodifiableList(credentials);
}
public void removeCredentialType(String type) {
Iterator<UserCredentialValueModel> it = credentials.iterator();
while (it.hasNext()) {
if (it.next().getType().equals(type)) {
it.remove();
credentialsChanged = true;
}
}
}
public void removeCredentialDevice(String type, String device) {
Iterator<UserCredentialValueModel> it = credentials.iterator();
while (it.hasNext()) {
UserCredentialValueModel next = it.next();
if (next.getType().equals(type) && next.getDevice().equals(device)) {
it.remove();
credentialsChanged = true;
}
}
}
public void setCredential(UserCredentialValueModel cred) {
removeCredentialType(cred.getType());
addCredential(cred);
}
public void addCredential(UserCredentialValueModel cred) {
credentials.add(cred);
credentialsChanged = true;
}
public Set<String> getGroupIds() {
return Collections.unmodifiableSet(groupIds);
}
public void joinGroup(String groupId) {
if (groupIds.contains(groupId)) return;
groupIds.add(groupId);
groupsChanged = true;
}
public void leaveGroup(String groupId) {
if (!groupIds.contains(groupId)) return;
groupIds.remove(groupId);
groupsChanged = true;
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (this.id == null) return false;
if (o == null || getClass() != o.getClass()) return false;
AbstractIdentifiableEntity that = (AbstractIdentifiableEntity) o;
if (!getId().equals(that.getId())) return false;
return true;
}
@Override
public int hashCode() {
return id!=null ? id.hashCode() : super.hashCode();
}
@Override
public String toString() {
return String.format("%s [ id=%s ]", getClass().getSimpleName(), getId());
}
}

View file

@ -1,340 +0,0 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* 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 org.keycloak.storage.changeset;
import org.keycloak.common.util.Time;
import org.keycloak.hash.PasswordHashManager;
import org.keycloak.models.ClientModel;
import org.keycloak.models.GroupModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.OTPPolicy;
import org.keycloak.models.PasswordPolicy;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleContainerModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserCredentialModel;
import org.keycloak.models.UserCredentialValueModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
*
*
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class UserDataAdapter implements UserModel {
protected UserData userData;
protected RealmModel realm;
protected KeycloakSession session;
protected Set<String> managedCredentialTypes;
protected List<UserCredentialModel> updatedManagedCredentials = new LinkedList<>();
public UserDataAdapter(KeycloakSession session, RealmModel realm, UserData userData) {
this.session = session;
this.realm = realm;
this.userData = userData;
this.userData.rememberState();
}
@Override
public String getId() {
return userData.getId();
}
@Override
public String getUsername() {
return userData.getUsername();
}
@Override
public void setUsername(String username) {
userData.setUsername(username);
}
@Override
public Long getCreatedTimestamp() {
return userData.getCreatedTimestamp();
}
@Override
public void setCreatedTimestamp(Long timestamp) {
userData.setCreatedTimestamp(timestamp);
}
@Override
public boolean isEnabled() {
return userData.isEnabled();
}
@Override
public boolean isOtpEnabled() {
return userData.isTotp();
}
@Override
public void setEnabled(boolean enabled) {
userData.setEnabled(enabled);
}
@Override
public void setSingleAttribute(String name, String value) {
userData.setSingleAttribute(name, value);
}
@Override
public void setAttribute(String name, List<String> values) {
userData.setAttribute(name, values);
}
@Override
public void removeAttribute(String name) {
userData.removeAttribute(name);
}
@Override
public String getFirstAttribute(String name) {
return userData.getAttributes().getFirst(name);
}
@Override
public List<String> getAttribute(String name) {
return userData.getAttributes().get(name);
}
@Override
public Map<String, List<String>> getAttributes() {
return userData.getAttributes();
}
@Override
public Set<String> getRequiredActions() {
return userData.getRequiredActions();
}
@Override
public void addRequiredAction(String action) {
userData.addRequiredAction(action);
}
@Override
public void removeRequiredAction(String action) {
userData.removeRequiredAction(action);
}
@Override
public void addRequiredAction(RequiredAction action) {
userData.addRequiredAction(action.name());
}
@Override
public void removeRequiredAction(RequiredAction action) {
userData.removeRequiredAction(action.name());
}
@Override
public String getFirstName() {
return userData.getFirstName();
}
@Override
public void setFirstName(String firstName) {
userData.setFirstName(firstName);
}
@Override
public String getLastName() {
return userData.getLastName();
}
@Override
public void setLastName(String lastName) {
userData.setLastName(lastName);
}
@Override
public String getEmail() {
return userData.getEmail();
}
@Override
public void setEmail(String email) {
userData.setEmail(email);
}
@Override
public boolean isEmailVerified() {
return userData.isEmailVerified();
}
@Override
public void setEmailVerified(boolean verified) {
userData.setEmailVerified(verified);
}
@Override
public void setOtpEnabled(boolean totp) {
userData.setTotp(totp);
}
@Override
public void updateCredential(UserCredentialModel cred) {
}
@Override
public List<UserCredentialValueModel> getCredentialsDirectly() {
return null;
}
@Override
public void updateCredentialDirectly(UserCredentialValueModel cred) {
}
@Override
public Set<GroupModel> getGroups() {
Set<String> groups = userData.getGroupIds();
Set<GroupModel> set = new HashSet<>();
for (String id : groups) {
GroupModel group = realm.getGroupById(id);
if (group != null) set.add(group);
}
return set;
}
@Override
public void joinGroup(GroupModel group) {
userData.joinGroup(group.getId());
}
@Override
public void leaveGroup(GroupModel group) {
userData.leaveGroup(group.getId());
}
@Override
public boolean isMemberOf(GroupModel group) {
Set<GroupModel> roles = getGroups();
return KeycloakModelUtils.isMember(roles, group);
}
@Override
public String getFederationLink() {
return null;
}
@Override
public void setFederationLink(String link) {
}
@Override
public String getServiceAccountClientLink() {
return null;
}
@Override
public void setServiceAccountClientLink(String clientInternalId) {
}
@Override
public Set<RoleModel> getRealmRoleMappings() {
Set<RoleModel> roleMappings = getRoleMappings();
Set<RoleModel> realmRoles = new HashSet<RoleModel>();
for (RoleModel role : roleMappings) {
RoleContainerModel container = role.getContainer();
if (container instanceof RealmModel) {
realmRoles.add(role);
}
}
return realmRoles;
}
@Override
public Set<RoleModel> getClientRoleMappings(ClientModel app) {
Set<RoleModel> roleMappings = getRoleMappings();
Set<RoleModel> roles = new HashSet<RoleModel>();
for (RoleModel role : roleMappings) {
RoleContainerModel container = role.getContainer();
if (container instanceof ClientModel) {
ClientModel appModel = (ClientModel)container;
if (appModel.getId().equals(app.getId())) {
roles.add(role);
}
}
}
return roles;
}
@Override
public boolean hasRole(RoleModel role) {
Set<RoleModel> roles = getRoleMappings();
return KeycloakModelUtils.hasRole(roles, role);
}
@Override
public void grantRole(RoleModel role) {
userData.grantRole(role.getId());
}
@Override
public Set<RoleModel> getRoleMappings() {
Set<String> roles = userData.getRoleMappings();
Set<RoleModel> set = new HashSet<>();
for (String id : roles) {
RoleModel role = realm.getRoleById(id);
if (role != null) set.add(role);
}
return set;
}
@Override
public void deleteRoleMapping(RoleModel role) {
userData.deleteRoleMapping(role.getId());
}
}

View file

@ -132,6 +132,9 @@ public class IdpEmailVerificationAuthenticator extends AbstractIdpAuthenticator
clientSession.setNote(IS_DIFFERENT_BROWSER, "true");
}
// User successfully confirmed linking by email verification. His email was defacto verified
existingUser.setEmailVerified(true);
context.setUser(existingUser);
context.success();
} else {

View file

@ -19,10 +19,12 @@ package org.keycloak.protocol.oidc.mappers;
import org.keycloak.models.ClientSessionModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.ProtocolMapperContainerModel;
import org.keycloak.models.ProtocolMapperModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.protocol.ProtocolMapperConfigException;
import org.keycloak.protocol.ProtocolMapperUtils;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.AccessToken;

View file

@ -107,7 +107,7 @@ public class ClientResource {
@Path("protocol-mappers")
public ProtocolMappersResource getProtocolMappers() {
ProtocolMappersResource mappers = new ProtocolMappersResource(client, auth, adminEvent);
ProtocolMappersResource mappers = new ProtocolMappersResource(realm, client, auth, adminEvent);
ResteasyProviderFactory.getInstance().injectProperties(mappers);
return mappers;
}

View file

@ -81,7 +81,7 @@ public class ClientTemplateResource {
@Path("protocol-mappers")
public ProtocolMappersResource getProtocolMappers() {
ProtocolMappersResource mappers = new ProtocolMappersResource(template, auth, adminEvent);
ProtocolMappersResource mappers = new ProtocolMappersResource(realm, template, auth, adminEvent);
ResteasyProviderFactory.getInstance().injectProperties(mappers);
return mappers;
}

View file

@ -20,14 +20,22 @@ import org.jboss.resteasy.annotations.cache.NoCache;
import org.jboss.resteasy.spi.NotFoundException;
import org.keycloak.events.admin.OperationType;
import org.keycloak.events.admin.ResourceType;
import org.keycloak.mappers.FederationConfigValidationException;
import org.keycloak.mappers.UserFederationMapper;
import org.keycloak.mappers.UserFederationMapperFactory;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.ModelDuplicateException;
import org.keycloak.models.ProtocolMapperContainerModel;
import org.keycloak.models.ProtocolMapperModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserFederationMapperModel;
import org.keycloak.models.utils.ModelToRepresentation;
import org.keycloak.models.utils.RepresentationToModel;
import org.keycloak.protocol.ProtocolMapper;
import org.keycloak.protocol.ProtocolMapperConfigException;
import org.keycloak.representations.idm.ProtocolMapperRepresentation;
import org.keycloak.services.ErrorResponse;
import org.keycloak.services.ErrorResponseException;
import org.keycloak.services.ServicesLogger;
import org.keycloak.services.resources.admin.RealmAuth.Resource;
@ -44,8 +52,10 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.text.MessageFormat;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
/**
* Base resource for managing users
@ -56,6 +66,8 @@ import java.util.List;
public class ProtocolMappersResource {
protected static final ServicesLogger logger = ServicesLogger.ROOT_LOGGER;
protected RealmModel realm;
protected ProtocolMapperContainerModel client;
protected RealmAuth auth;
@ -68,7 +80,8 @@ public class ProtocolMappersResource {
@Context
protected KeycloakSession session;
public ProtocolMappersResource(ProtocolMapperContainerModel client, RealmAuth auth, AdminEventBuilder adminEvent) {
public ProtocolMappersResource(RealmModel realm, ProtocolMapperContainerModel client, RealmAuth auth, AdminEventBuilder adminEvent) {
this.realm = realm;
this.auth = auth;
this.client = client;
this.adminEvent = adminEvent.resource(ResourceType.PROTOCOL_MAPPER);
@ -119,6 +132,7 @@ public class ProtocolMappersResource {
ProtocolMapperModel model = null;
try {
model = RepresentationToModel.toModel(rep);
validateModel(model);
model = client.addProtocolMapper(model);
adminEvent.operation(OperationType.CREATE).resourcePath(uriInfo, model.getId()).representation(rep).success();
@ -146,6 +160,7 @@ public class ProtocolMappersResource {
ProtocolMapperModel model = null;
for (ProtocolMapperRepresentation rep : reps) {
model = RepresentationToModel.toModel(rep);
validateModel(model);
model = client.addProtocolMapper(model);
}
adminEvent.operation(OperationType.CREATE).resourcePath(uriInfo).representation(reps).success();
@ -216,6 +231,9 @@ public class ProtocolMappersResource {
ProtocolMapperModel model = client.getProtocolMapperById(id);
if (model == null) throw new NotFoundException("Model not found");
model = RepresentationToModel.toModel(rep);
validateModel(model);
client.updateProtocolMapper(model);
adminEvent.operation(OperationType.UPDATE).resourcePath(uriInfo).representation(rep).success();
}
@ -242,4 +260,18 @@ public class ProtocolMappersResource {
}
private void validateModel(ProtocolMapperModel model) {
try {
ProtocolMapper mapper = (ProtocolMapper)session.getKeycloakSessionFactory().getProviderFactory(ProtocolMapper.class, model.getProtocolMapper());
if (mapper != null) {
mapper.validateConfig(session, realm, client, model);
}
} catch (ProtocolMapperConfigException ex) {
logger.error(ex.getMessage());
Properties messages = AdminRoot.getMessages(session, realm, auth.getAuth().getToken().getLocale());
throw new ErrorResponseException(ex.getMessage(), MessageFormat.format(messages.getProperty(ex.getMessage(), ex.getMessage()), ex.getParameters()),
Response.Status.BAD_REQUEST);
}
}
}

View file

@ -113,12 +113,17 @@
<artifactId>xml-maven-plugin</artifactId>
<version>1.0.1</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<modules>
<module>test-apps</module>
<module>test-utils</module>
<module>servers</module>
<module>tests</module>
</modules>

View file

@ -1,11 +1,7 @@
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:j="urn:jboss:domain:4.0"
xmlns:ds="urn:jboss:domain:datasources:4.0"
xmlns:k="urn:jboss:domain:keycloak:1.1"
xmlns:sec="urn:jboss:domain:security:1.2"
version="2.0"
exclude-result-prefixes="xalan j ds k sec">
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:strip-space elements="*"/>

View file

@ -17,12 +17,8 @@
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:j="urn:jboss:domain:4.0"
xmlns:ds="urn:jboss:domain:datasources:4.0"
xmlns:k="urn:jboss:domain:keycloak:1.1"
xmlns:sec="urn:jboss:domain:security:1.2"
version="2.0"
exclude-result-prefixes="xalan j ds k sec">
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:strip-space elements="*"/>
@ -47,7 +43,7 @@
<xsl:param name="pool.prefill" select="'true'"/>
<xsl:variable name="newDatasourceDefinition">
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" use-java-context="true">
<datasource jndi-name="java:jboss/datasources/KeycloakDS" jta="false" pool-name="KeycloakDS" use-java-context="true">
<connection-url>
<xsl:value-of select="$jdbc.url"/>
</connection-url>

View file

@ -17,7 +17,7 @@
<assembly>
<id>auth-server-jboss-kc14</id>
<id>auth-server-jboss-${migrated.auth.server.version}</id>
<formats>
<format>zip</format>
@ -28,14 +28,14 @@
<fileSets>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.4.0.Final</outputDirectory>
<outputDirectory>keycloak-${migrated.auth.server.version}</outputDirectory>
<excludes>
<exclude>**/*.sh</exclude>
</excludes>
</fileSet>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.4.0.Final</outputDirectory>
<outputDirectory>keycloak-${migrated.auth.server.version}</outputDirectory>
<includes>
<include>**/*.sh</include>
</includes>

View file

@ -1,20 +1,20 @@
<?xml version="1.0"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
@ -25,231 +25,195 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration-arquillian-migration-servers</artifactId>
<artifactId>integration-arquillian-migration-server</artifactId>
<packaging>pom</packaging>
<name>Migration Servers</name>
<name>Migration Server</name>
<properties>
<keycloak.server.home>${project.build.directory}/unpacked/keycloak-${migrated.auth.server.version}</keycloak.server.home>
<jdbc.mvn.driver.deployment.dir>${keycloak.server.home}/modules/system/layers/base/com/${jdbc.mvn.artifactId}/main</jdbc.mvn.driver.deployment.dir>
</properties>
<profiles>
<profile>
<id>migration-kc16</id>
<modules>
<module>wildfly_kc16</module>
</modules>
</profile>
<profile>
<id>migration-kc15</id>
<modules>
<module>wildfly_kc15</module>
</modules>
</profile>
<profile>
<id>migration-kc14</id>
<modules>
<module>wildfly_kc14</module>
</modules>
</profile>
<profile>
<id>migration-kc13</id>
<modules>
<module>wildfly_kc13</module>
</modules>
</profile>
<profile>
<id>migration-kc12</id>
<modules>
<module>wildfly_kc12</module>
</modules>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-properties</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireProperty>
<property>migrated.auth.server.version</property>
</requireProperty>
<requireProperty>
<property>jdbc.mvn.groupId</property>
</requireProperty>
<requireProperty>
<property>jdbc.mvn.artifactId</property>
</requireProperty>
<requireProperty>
<property>jdbc.mvn.version</property>
</requireProperty>
<requireProperty>
<property>keycloak.connectionsJpa.url</property>
</requireProperty>
<requireProperty>
<property>keycloak.connectionsJpa.user</property>
</requireProperty>
<requireProperty>
<property>keycloak.connectionsJpa.password</property>
</requireProperty>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-server</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-dist</artifactId>
<version>${migrated.auth.server.version}</version>
<type>zip</type>
<outputDirectory>${project.build.directory}/unpacked</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
<execution>
<id>jdbc-driver</id>
<phase>process-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${jdbc.mvn.groupId}</groupId>
<artifactId>${jdbc.mvn.artifactId}</artifactId>
<version>${jdbc.mvn.version}</version>
<type>jar</type>
</artifactItem>
</artifactItems>
<outputDirectory>${jdbc.mvn.driver.deployment.dir}</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
<executions>
<execution>
<id>configure-wildfly-datasource</id>
<phase>process-resources</phase>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<!-- create module.xml in modules -->
<transformationSet>
<dir>${keycloak.server.home}/modules/system/layers/base/com/h2database/h2/main</dir>
<stylesheet>src/main/xslt/module.xsl</stylesheet>
<includes>
<include>module.xml</include>
</includes>
<outputDir>${jdbc.mvn.driver.deployment.dir}</outputDir>
<parameters>
<parameter>
<name>database</name>
<value>${jdbc.mvn.artifactId}</value>
</parameter>
<parameter>
<name>version</name>
<value>${jdbc.mvn.version}</value>
</parameter>
</parameters>
</transformationSet>
<!-- add datasource to standalone.xml -->
<transformationSet>
<dir>${keycloak.server.home}/standalone/configuration</dir>
<stylesheet>src/main/xslt/datasource.xsl</stylesheet>
<includes>
<include>standalone.xml</include>
</includes>
<outputDir>${keycloak.server.home}/standalone/configuration</outputDir>
<parameters>
<parameter>
<name>jdbc.url</name>
<value>${keycloak.connectionsJpa.url}</value>
</parameter>
<parameter>
<name>driver</name>
<value>${jdbc.mvn.artifactId}</value>
</parameter>
<parameter>
<name>username</name>
<value>${keycloak.connectionsJpa.user}</value>
</parameter>
<parameter>
<name>password</name>
<value>${keycloak.connectionsJpa.password}</value>
</parameter>
</parameters>
</transformationSet>
<!-- add logger for org.hibernate.dialect.Dialect to standalone.xml-->
<transformationSet>
<dir>${keycloak.server.home}/standalone/configuration</dir>
<stylesheet>src/main/xslt/add-dialect-logger.xsl</stylesheet>
<includes>
<include>standalone.xml</include>
</includes>
<outputDir>${keycloak.server.home}/standalone/configuration</outputDir>
</transformationSet>
</transformationSets>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>create-zip</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-properties</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireProperty>
<property>jdbc.mvn.groupId</property>
</requireProperty>
<requireProperty>
<property>jdbc.mvn.artifactId</property>
</requireProperty>
<requireProperty>
<property>jdbc.mvn.version</property>
</requireProperty>
<requireProperty>
<property>keycloak.connectionsJpa.url</property>
</requireProperty>
<requireProperty>
<property>keycloak.connectionsJpa.user</property>
</requireProperty>
<requireProperty>
<property>keycloak.connectionsJpa.password</property>
</requireProperty>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-server</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-dist</artifactId>
<version>${server.version}</version>
<type>zip</type>
<outputDirectory>${project.build.directory}/unpacked</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
<execution>
<id>jdbc-driver</id>
<phase>process-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${jdbc.mvn.groupId}</groupId>
<artifactId>${jdbc.mvn.artifactId}</artifactId>
<version>${jdbc.mvn.version}</version>
<type>jar</type>
</artifactItem>
</artifactItems>
<outputDirectory>${jdbc.mvn.driver.deployment.dir}</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
<executions>
<execution>
<id>configure-wildfly-datasource</id>
<phase>process-resources</phase>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<!-- create module.xml in modules -->
<transformationSet>
<dir>${keycloak.server.home}/modules/system/layers/base/com/h2database/h2/main</dir>
<stylesheet>src/main/xslt/module.xsl</stylesheet>
<includes>
<include>module.xml</include>
</includes>
<outputDir>${jdbc.mvn.driver.deployment.dir}</outputDir>
<parameters>
<parameter>
<name>database</name>
<value>${jdbc.mvn.artifactId}</value>
</parameter>
<parameter>
<name>version</name>
<value>${jdbc.mvn.version}</value>
</parameter>
</parameters>
</transformationSet>
<!-- add datasource to standalone.xml -->
<transformationSet>
<dir>${keycloak.server.home}/standalone/configuration</dir>
<stylesheet>src/main/xslt/datasource.xsl</stylesheet>
<includes>
<include>standalone.xml</include>
</includes>
<outputDir>${keycloak.server.home}/standalone/configuration</outputDir>
<parameters>
<parameter>
<name>jdbc.url</name>
<value>${keycloak.connectionsJpa.url}</value>
</parameter>
<parameter>
<name>driver</name>
<value>${jdbc.mvn.artifactId}</value>
</parameter>
<parameter>
<name>username</name>
<value>${keycloak.connectionsJpa.user}</value>
</parameter>
<parameter>
<name>password</name>
<value>${keycloak.connectionsJpa.password}</value>
</parameter>
</parameters>
</transformationSet>
<!-- add logger for org.hibernate.dialect.Dialect to standalone.xml-->
<transformationSet>
<dir>${keycloak.server.home}/standalone/configuration</dir>
<stylesheet>src/main/xslt/add-dialect-logger.xsl</stylesheet>
<includes>
<include>standalone.xml</include>
</includes>
<outputDir>${keycloak.server.home}/standalone/configuration</outputDir>
</transformationSet>
</transformationSets>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>create-zip</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View file

@ -17,17 +17,12 @@
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:j="urn:jboss:domain:3.0"
xmlns:ds="urn:jboss:domain:datasources:3.0"
xmlns:k="urn:jboss:domain:keycloak:1.1"
xmlns:sec="urn:jboss:domain:security:1.2"
version="2.0"
exclude-result-prefixes="xalan j ds k sec">
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:datasources:'"/>
<!-- Remove keycloak datasource definition. -->

View file

@ -17,9 +17,8 @@
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:m="urn:jboss:module:1.3"
version="2.0"
exclude-result-prefixes="xalan m">
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" />

View file

@ -1,46 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<assembly>
<id>auth-server-jboss-kc14</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.2.0.Final</outputDirectory>
<excludes>
<exclude>**/*.sh</exclude>
</excludes>
</fileSet>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.2.0.Final</outputDirectory>
<includes>
<include>**/*.sh</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
</assembly>

View file

@ -1,61 +0,0 @@
<?xml version="1.0"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parent>
<groupId>org.keycloak.testsuite</groupId>
<artifactId>integration-arquillian-migration-servers</artifactId>
<version>2.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration-arquillian-server-wildfly-kc12</artifactId>
<packaging>pom</packaging>
<name>Keycloak 1.2.0.Final on Wildfly</name>
<properties>
<server.version>1.2.0.Final</server.version>
<keycloak.server.home>${project.build.directory}/unpacked/keycloak-${server.version}</keycloak.server.home>
<jdbc.mvn.driver.deployment.dir>${keycloak.server.home}/modules/system/layers/base/com/${jdbc.mvn.artifactId}/main</jdbc.mvn.driver.deployment.dir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View file

@ -1,62 +0,0 @@
<?xml version="1.0"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parent>
<groupId>org.keycloak.testsuite</groupId>
<artifactId>integration-arquillian-migration-servers</artifactId>
<version>2.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration-arquillian-server-wildfly-kc13</artifactId>
<packaging>pom</packaging>
<name>Keycloak 1.3.1.Final on Wildfly</name>
<properties>
<server.version>1.3.1.Final</server.version>
<keycloak.server.home>${project.build.directory}/unpacked/keycloak-${server.version}</keycloak.server.home>
<jdbc.mvn.driver.deployment.dir>${keycloak.server.home}/modules/system/layers/base/com/${jdbc.mvn.artifactId}/main</jdbc.mvn.driver.deployment.dir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View file

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
version="2.0"
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:logging:'"/>
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='root-logger' and starts-with(namespace-uri(), $nsDS)]">
<logger category="org.hibernate.dialect.Dialect">
<level name="ALL"/>
</logger>
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Copy everything else. -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,111 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:j="urn:jboss:domain:3.0"
xmlns:ds="urn:jboss:domain:datasources:3.0"
xmlns:k="urn:jboss:domain:keycloak:1.1"
xmlns:sec="urn:jboss:domain:security:1.2"
version="2.0"
exclude-result-prefixes="xalan j ds k sec">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:datasources:'"/>
<!-- Remove keycloak datasource definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasource' and starts-with(namespace-uri(), $nsDS) and @pool-name='KeycloakDS']">
</xsl:template>
<xsl:param name="jdbc.url" select="'jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE'"/>
<xsl:param name="driver" select="'h2'"/>
<xsl:param name="username" select="'sa'"/>
<xsl:param name="password" select="'sa'"/>
<xsl:param name="min.poolsize" select="'10'"/>
<xsl:param name="max.poolsize" select="'50'"/>
<xsl:param name="pool.prefill" select="'true'"/>
<xsl:variable name="newDatasourceDefinition">
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
<connection-url>
<xsl:value-of select="$jdbc.url"/>
</connection-url>
<driver>
<xsl:value-of select="$driver"/>
</driver>
<security>
<user-name>
<xsl:value-of select="$username"/>
</user-name>
<password>
<xsl:value-of select="$password"/>
</password>
</security>
<pool>
<min-pool-size>
<xsl:value-of select="$min.poolsize"/>
</min-pool-size>
<max-pool-size>
<xsl:value-of select="$max.poolsize"/>
</max-pool-size>
<prefill>
<xsl:value-of select="$pool.prefill"/>
</prefill>
</pool>
</datasource>
</xsl:variable>
<xsl:variable name="newDriverDefinition">
<xsl:if test="$driver != 'h2'">
<driver name="{$driver}" module="com.{$driver}" />
</xsl:if>
</xsl:variable>
<!-- Add new datasource definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]">
<xsl:copy>
<xsl:copy-of select="$newDatasourceDefinition"/>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Add new driver definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='drivers' and starts-with(namespace-uri(), $nsDS)]">
<xsl:copy>
<xsl:copy-of select="$newDriverDefinition"/>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Copy everything else. -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,50 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:m="urn:jboss:module:1.3"
version="2.0"
exclude-result-prefixes="xalan m">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" />
<xsl:param name="database" select="''"/>
<xsl:param name="version" select="''"/>
<xsl:variable name="newModuleDefinition">
<module xmlns="urn:jboss:module:1.3" name="com.{$database}">
<resources>
<resource-root path="{$database}-{$version}.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
</xsl:variable>
<!-- clear whole document -->
<xsl:template match="/*" />
<!-- Copy new module definition. -->
<xsl:template match="/*">
<xsl:copy-of select="$newModuleDefinition"/>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,61 +0,0 @@
<?xml version="1.0"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parent>
<groupId>org.keycloak.testsuite</groupId>
<artifactId>integration-arquillian-migration-servers</artifactId>
<version>2.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration-arquillian-server-wildfly-kc14</artifactId>
<packaging>pom</packaging>
<name>Keycloak 1.4.0.Final on Wildfly</name>
<properties>
<server.version>1.4.0.Final</server.version>
<keycloak.server.home>${project.build.directory}/unpacked/keycloak-${server.version}</keycloak.server.home>
<jdbc.mvn.driver.deployment.dir>${keycloak.server.home}/modules/system/layers/base/com/${jdbc.mvn.artifactId}/main</jdbc.mvn.driver.deployment.dir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View file

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
version="2.0"
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:logging:'"/>
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='root-logger' and starts-with(namespace-uri(), $nsDS)]">
<logger category="org.hibernate.dialect.Dialect">
<level name="ALL"/>
</logger>
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Copy everything else. -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,111 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:j="urn:jboss:domain:3.0"
xmlns:ds="urn:jboss:domain:datasources:3.0"
xmlns:k="urn:jboss:domain:keycloak:1.1"
xmlns:sec="urn:jboss:domain:security:1.2"
version="2.0"
exclude-result-prefixes="xalan j ds k sec">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:datasources:'"/>
<!-- Remove keycloak datasource definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasource' and starts-with(namespace-uri(), $nsDS) and @pool-name='KeycloakDS']">
</xsl:template>
<xsl:param name="jdbc.url" select="'jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE'"/>
<xsl:param name="driver" select="'h2'"/>
<xsl:param name="username" select="'sa'"/>
<xsl:param name="password" select="'sa'"/>
<xsl:param name="min.poolsize" select="'10'"/>
<xsl:param name="max.poolsize" select="'50'"/>
<xsl:param name="pool.prefill" select="'true'"/>
<xsl:variable name="newDatasourceDefinition">
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
<connection-url>
<xsl:value-of select="$jdbc.url"/>
</connection-url>
<driver>
<xsl:value-of select="$driver"/>
</driver>
<security>
<user-name>
<xsl:value-of select="$username"/>
</user-name>
<password>
<xsl:value-of select="$password"/>
</password>
</security>
<pool>
<min-pool-size>
<xsl:value-of select="$min.poolsize"/>
</min-pool-size>
<max-pool-size>
<xsl:value-of select="$max.poolsize"/>
</max-pool-size>
<prefill>
<xsl:value-of select="$pool.prefill"/>
</prefill>
</pool>
</datasource>
</xsl:variable>
<xsl:variable name="newDriverDefinition">
<xsl:if test="$driver != 'h2'">
<driver name="{$driver}" module="com.{$driver}" />
</xsl:if>
</xsl:variable>
<!-- Add new datasource definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]">
<xsl:copy>
<xsl:copy-of select="$newDatasourceDefinition"/>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Add new driver definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='drivers' and starts-with(namespace-uri(), $nsDS)]">
<xsl:copy>
<xsl:copy-of select="$newDriverDefinition"/>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Copy everything else. -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,50 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:m="urn:jboss:module:1.3"
version="2.0"
exclude-result-prefixes="xalan m">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" />
<xsl:param name="database" select="''"/>
<xsl:param name="version" select="''"/>
<xsl:variable name="newModuleDefinition">
<module xmlns="urn:jboss:module:1.3" name="com.{$database}">
<resources>
<resource-root path="{$database}-{$version}.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
</xsl:variable>
<!-- clear whole document -->
<xsl:template match="/*" />
<!-- Copy new module definition. -->
<xsl:template match="/*">
<xsl:copy-of select="$newModuleDefinition"/>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,46 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<assembly>
<id>auth-server-jboss-kc15</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.5.1.Final</outputDirectory>
<excludes>
<exclude>**/*.sh</exclude>
</excludes>
</fileSet>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.5.1.Final</outputDirectory>
<includes>
<include>**/*.sh</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
</assembly>

View file

@ -1,61 +0,0 @@
<?xml version="1.0"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parent>
<groupId>org.keycloak.testsuite</groupId>
<artifactId>integration-arquillian-migration-servers</artifactId>
<version>2.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration-arquillian-server-wildfly-kc15</artifactId>
<packaging>pom</packaging>
<name>Keycloak 1.5.1.Final on Wildfly</name>
<properties>
<server.version>1.5.1.Final</server.version>
<keycloak.server.home>${project.build.directory}/unpacked/keycloak-${server.version}</keycloak.server.home>
<jdbc.mvn.driver.deployment.dir>${keycloak.server.home}/modules/system/layers/base/com/${jdbc.mvn.artifactId}/main</jdbc.mvn.driver.deployment.dir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View file

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
version="2.0"
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:logging:'"/>
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='root-logger' and starts-with(namespace-uri(), $nsDS)]">
<logger category="org.hibernate.dialect.Dialect">
<level name="ALL"/>
</logger>
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Copy everything else. -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,111 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:j="urn:jboss:domain:3.0"
xmlns:ds="urn:jboss:domain:datasources:3.0"
xmlns:k="urn:jboss:domain:keycloak:1.1"
xmlns:sec="urn:jboss:domain:security:1.2"
version="2.0"
exclude-result-prefixes="xalan j ds k sec">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:datasources:'"/>
<!-- Remove keycloak datasource definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasource' and starts-with(namespace-uri(), $nsDS) and @pool-name='KeycloakDS']">
</xsl:template>
<xsl:param name="jdbc.url" select="'jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE'"/>
<xsl:param name="driver" select="'h2'"/>
<xsl:param name="username" select="'sa'"/>
<xsl:param name="password" select="'sa'"/>
<xsl:param name="min.poolsize" select="'10'"/>
<xsl:param name="max.poolsize" select="'50'"/>
<xsl:param name="pool.prefill" select="'true'"/>
<xsl:variable name="newDatasourceDefinition">
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
<connection-url>
<xsl:value-of select="$jdbc.url"/>
</connection-url>
<driver>
<xsl:value-of select="$driver"/>
</driver>
<security>
<user-name>
<xsl:value-of select="$username"/>
</user-name>
<password>
<xsl:value-of select="$password"/>
</password>
</security>
<pool>
<min-pool-size>
<xsl:value-of select="$min.poolsize"/>
</min-pool-size>
<max-pool-size>
<xsl:value-of select="$max.poolsize"/>
</max-pool-size>
<prefill>
<xsl:value-of select="$pool.prefill"/>
</prefill>
</pool>
</datasource>
</xsl:variable>
<xsl:variable name="newDriverDefinition">
<xsl:if test="$driver != 'h2'">
<driver name="{$driver}" module="com.{$driver}" />
</xsl:if>
</xsl:variable>
<!-- Add new datasource definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]">
<xsl:copy>
<xsl:copy-of select="$newDatasourceDefinition"/>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Add new driver definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='drivers' and starts-with(namespace-uri(), $nsDS)]">
<xsl:copy>
<xsl:copy-of select="$newDriverDefinition"/>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Copy everything else. -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,50 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:m="urn:jboss:module:1.3"
version="2.0"
exclude-result-prefixes="xalan m">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" />
<xsl:param name="database" select="''"/>
<xsl:param name="version" select="''"/>
<xsl:variable name="newModuleDefinition">
<module xmlns="urn:jboss:module:1.3" name="com.{$database}">
<resources>
<resource-root path="{$database}-{$version}.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
</xsl:variable>
<!-- clear whole document -->
<xsl:template match="/*" />
<!-- Copy new module definition. -->
<xsl:template match="/*">
<xsl:copy-of select="$newModuleDefinition"/>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,46 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<assembly>
<id>auth-server-jboss-kc16</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.6.1.Final</outputDirectory>
<excludes>
<exclude>**/*.sh</exclude>
</excludes>
</fileSet>
<fileSet>
<directory>${keycloak.server.home}</directory>
<outputDirectory>keycloak-1.6.1.Final</outputDirectory>
<includes>
<include>**/*.sh</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
</assembly>

View file

@ -1,61 +0,0 @@
<?xml version="1.0"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parent>
<groupId>org.keycloak.testsuite</groupId>
<artifactId>integration-arquillian-migration-servers</artifactId>
<version>2.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration-arquillian-server-wildfly-kc16</artifactId>
<packaging>pom</packaging>
<name>Keycloak 1.6.1.Final on Wildfly</name>
<properties>
<server.version>1.6.1.Final</server.version>
<keycloak.server.home>${project.build.directory}/unpacked/keycloak-${server.version}</keycloak.server.home>
<jdbc.mvn.driver.deployment.dir>${keycloak.server.home}/modules/system/layers/base/com/${jdbc.mvn.artifactId}/main</jdbc.mvn.driver.deployment.dir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View file

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
version="2.0"
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:logging:'"/>
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='root-logger' and starts-with(namespace-uri(), $nsDS)]">
<logger category="org.hibernate.dialect.Dialect">
<level name="ALL"/>
</logger>
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Copy everything else. -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,111 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:j="urn:jboss:domain:3.0"
xmlns:ds="urn:jboss:domain:datasources:3.0"
xmlns:k="urn:jboss:domain:keycloak:1.1"
xmlns:sec="urn:jboss:domain:security:1.2"
version="2.0"
exclude-result-prefixes="xalan j ds k sec">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="nsDS" select="'urn:jboss:domain:datasources:'"/>
<!-- Remove keycloak datasource definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasource' and starts-with(namespace-uri(), $nsDS) and @pool-name='KeycloakDS']">
</xsl:template>
<xsl:param name="jdbc.url" select="'jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE'"/>
<xsl:param name="driver" select="'h2'"/>
<xsl:param name="username" select="'sa'"/>
<xsl:param name="password" select="'sa'"/>
<xsl:param name="min.poolsize" select="'10'"/>
<xsl:param name="max.poolsize" select="'50'"/>
<xsl:param name="pool.prefill" select="'true'"/>
<xsl:variable name="newDatasourceDefinition">
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
<connection-url>
<xsl:value-of select="$jdbc.url"/>
</connection-url>
<driver>
<xsl:value-of select="$driver"/>
</driver>
<security>
<user-name>
<xsl:value-of select="$username"/>
</user-name>
<password>
<xsl:value-of select="$password"/>
</password>
</security>
<pool>
<min-pool-size>
<xsl:value-of select="$min.poolsize"/>
</min-pool-size>
<max-pool-size>
<xsl:value-of select="$max.poolsize"/>
</max-pool-size>
<prefill>
<xsl:value-of select="$pool.prefill"/>
</prefill>
</pool>
</datasource>
</xsl:variable>
<xsl:variable name="newDriverDefinition">
<xsl:if test="$driver != 'h2'">
<driver name="{$driver}" module="com.{$driver}" />
</xsl:if>
</xsl:variable>
<!-- Add new datasource definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]">
<xsl:copy>
<xsl:copy-of select="$newDatasourceDefinition"/>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Add new driver definition. -->
<xsl:template match="//*[local-name()='subsystem' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='datasources' and starts-with(namespace-uri(), $nsDS)]
/*[local-name()='drivers' and starts-with(namespace-uri(), $nsDS)]">
<xsl:copy>
<xsl:copy-of select="$newDriverDefinition"/>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Copy everything else. -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,50 +0,0 @@
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ 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.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:m="urn:jboss:module:1.3"
version="2.0"
exclude-result-prefixes="xalan m">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" />
<xsl:param name="database" select="''"/>
<xsl:param name="version" select="''"/>
<xsl:variable name="newModuleDefinition">
<module xmlns="urn:jboss:module:1.3" name="com.{$database}">
<resources>
<resource-root path="{$database}-{$version}.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
</xsl:variable>
<!-- clear whole document -->
<xsl:template match="/*" />
<!-- Copy new module definition. -->
<xsl:template match="/*">
<xsl:copy-of select="$newModuleDefinition"/>
</xsl:template>
</xsl:stylesheet>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>integration-arquillian</artifactId>
<groupId>org.keycloak.testsuite</groupId>
<version>2.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration-arquillian-test-utils</artifactId>
<packaging>jar</packaging>
<name>Test utils</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1,269 @@
package org.keycloak.testsuite.util.junit;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.jboss.logging.Logger;
import org.junit.Ignore;
import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
/**
* Aggregates jUnit test results into a single report - XML file.
*/
public class AggregateResultsReporter extends RunListener {
private static final Logger LOGGER = Logger.getLogger(AggregateResultsReporter.class);
private final Document xml;
private final File reportFile;
private final boolean working;
private final AtomicInteger tests = new AtomicInteger(0);
private final AtomicInteger errors = new AtomicInteger(0);
private final AtomicInteger failures = new AtomicInteger(0);
private final AtomicInteger ignored = new AtomicInteger(0);
private final AtomicLong suiteStartTime = new AtomicLong(0L);
private final AtomicReference<Element> testsuite = new AtomicReference<Element>();
private final Map<String, Long> testTimes = new HashMap<String, Long>();
public AggregateResultsReporter() {
boolean working = true;
Document xml = null;
try {
xml = createEmptyDocument();
} catch (ParserConfigurationException ex) {
LOGGER.error("Failed to create XML DOM - reporting will not be done", ex);
working = false;
}
File reportFile = null;
try {
reportFile = createReportFile();
} catch (Exception ex) {
LOGGER.error("Failed to create log file - reporting will not be done", ex);
working = false;
}
this.working = working;
this.xml = xml;
this.reportFile = reportFile;
}
private Document createEmptyDocument() throws ParserConfigurationException {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
return builder.newDocument();
}
private File createReportFile() throws Exception {
PropertiesConfiguration config = new PropertiesConfiguration(System.getProperty("testsuite.constants"));
config.setThrowExceptionOnMissing(true);
final File logDir = new File(config.getString("log-dir"));
logDir.mkdirs();
final File reportFile = new File(logDir, "junit-report.xml").getAbsoluteFile();
reportFile.createNewFile();
return reportFile;
}
@Override
public void testRunStarted(Description description) throws Exception {
if (working) {
suiteStartTime.set(System.currentTimeMillis());
Element testsuite = xml.createElement("testsuite");
if (description.getChildren().size() == 1) {
testsuite.setAttribute("name", safeString(description.getChildren().get(0).getDisplayName()));
}
xml.appendChild(testsuite);
this.testsuite.set(testsuite);
writeXml();
}
}
@Override
public void testStarted(Description description) throws Exception {
if (working) {
testTimes.put(description.getDisplayName(), System.currentTimeMillis());
}
}
@Override
public void testFinished(Description description) throws Exception {
if (working) {
if (testTimes.containsKey(description.getDisplayName())) {
testsuite.get().appendChild(createTestCase(description));
writeXml();
}
}
}
@Override
public void testAssumptionFailure(Failure failure) {
if (working) {
ignored.incrementAndGet();
Element testcase = createTestCase(failure.getDescription());
Element skipped = xml.createElement("skipped");
skipped.setAttribute("message", safeString(failure.getMessage()));
testcase.appendChild(skipped);
testsuite.get().appendChild(testcase);
writeXml();
}
}
@Override
public void testFailure(Failure failure) throws Exception {
if (working) {
if (failure.getDescription().getMethodName() == null) {
// before class failed
for (Description child : failure.getDescription().getChildren()) {
// mark all methods failed
testFailure(new Failure(child, failure.getException()));
}
} else {
// normal failure
Element testcase = createTestCase(failure.getDescription());
Element element;
if (failure.getException() instanceof AssertionError) {
failures.incrementAndGet();
element = xml.createElement("failure");
} else {
errors.incrementAndGet();
element = xml.createElement("error");
}
testcase.appendChild(element);
element.setAttribute("type", safeString(failure.getException().getClass().getName()));
element.setAttribute("message", safeString(failure.getMessage()));
element.appendChild(xml.createCDATASection(safeString(failure.getTrace())));
testsuite.get().appendChild(testcase);
writeXml();
}
}
}
@Override
public void testIgnored(Description description) throws Exception {
if (working) {
ignored.incrementAndGet();
Element testcase = createTestCase(description);
Element skipped = xml.createElement("skipped");
skipped.setAttribute("message", safeString(description.getAnnotation(Ignore.class).value()));
testcase.appendChild(skipped);
testsuite.get().appendChild(testcase);
writeXml();
}
}
@Override
public void testRunFinished(Result result) throws Exception {
if (working) {
writeXml();
}
}
private void writeXml() {
Element testsuite = this.testsuite.get();
testsuite.setAttribute("tests", Integer.toString(tests.get()));
testsuite.setAttribute("errors", Integer.toString(errors.get()));
testsuite.setAttribute("skipped", Integer.toString(ignored.get()));
testsuite.setAttribute("failures", Integer.toString(failures.get()));
testsuite.setAttribute("time", computeTestTime(suiteStartTime.get()));
try {
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(reportFile, false), Charset.forName("UTF-8")));
try {
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
t.transform(new DOMSource(xml), new StreamResult(writer));
} catch (TransformerConfigurationException ex) {
LOGGER.error("Misconfigured transformer", ex);
} catch (TransformerException ex) {
LOGGER.error("Unable to save XML file", ex);
} finally {
writer.close();
}
} catch (IOException ex) {
LOGGER.warn("Unable to open report file", ex);
}
}
private String computeTestTime(Long startTime) {
if (startTime == null) {
return "0";
} else {
long amount = System.currentTimeMillis() - startTime;
return String.format("%.3f", amount / 1000F);
}
}
private Element createTestCase(Description description) {
tests.incrementAndGet();
Element testcase = xml.createElement("testcase");
testcase.setAttribute("name", safeString(description.getMethodName()));
testcase.setAttribute("classname", safeString(description.getClassName()));
testcase.setAttribute("time", computeTestTime(testTimes.remove(description.getDisplayName())));
return testcase;
}
private String safeString(String input) {
if (input == null) {
return "null";
}
return input
// first remove color coding (all of it)
.replaceAll("\u001b\\[\\d+m", "")
// then remove control characters that are not whitespaces
.replaceAll("[\\p{Cntrl}&&[^\\p{Space}]]", "");
}
}

View file

@ -36,8 +36,6 @@
<exclude.console>-</exclude.console>
<exclude.account>-</exclude.account>
<exclude.client>-</exclude.client>
<!--exclude migration tests by default, enabled by 'migration' profile in tests/pom.xml-->
<exclude.migration>**/migration/**/*Test.java</exclude.migration>
<!--exclude cluster tests by default, enabled by 'auth-server-*-cluster' profiles in tests/pom.xml-->
<exclude.cluster>**/cluster/**/*Test.java</exclude.cluster>
</properties>
@ -102,7 +100,6 @@
<exclude>${exclude.console}</exclude>
<exclude>${exclude.account}</exclude>
<exclude>${exclude.client}</exclude>
<exclude>${exclude.migration}</exclude>
<exclude>${exclude.cluster}</exclude>
</excludes>
</configuration>
@ -137,6 +134,7 @@
<goal>copy-resources</goal>
</goals>
<configuration>
<skip>${skip.add.user.json}</skip>
<outputDirectory>${auth.server.config.dir}</outputDirectory>
<resources>
<resource>

View file

@ -26,7 +26,7 @@ import org.jboss.arquillian.container.spi.Container;
import org.jboss.arquillian.container.spi.ContainerRegistry;
import org.jboss.arquillian.container.spi.event.StartContainer;
import org.jboss.arquillian.container.spi.event.StartSuiteContainers;
import org.jboss.arquillian.container.test.api.ContainerController;
import org.jboss.arquillian.container.spi.event.StopContainer;
import org.jboss.arquillian.core.api.Event;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.InstanceProducer;
@ -52,11 +52,10 @@ public class AuthServerTestEnricher {
@Inject
private Instance<ContainerRegistry> containerRegistry;
@Inject
private Instance<ContainerController> containerController;
@Inject
private Event<StartContainer> startContainerEvent;
@Inject
private Event<StopContainer> stopContainerEvent;
private static final String AUTH_SERVER_CONTAINER_DEFAULT = "auth-server-undertow";
private static final String AUTH_SERVER_CONTAINER_PROPERTY = "auth.server.container";
@ -65,8 +64,8 @@ public class AuthServerTestEnricher {
private static final String AUTH_SERVER_CLUSTER_PROPERTY = "auth.server.cluster";
public static final boolean AUTH_SERVER_CLUSTER = Boolean.parseBoolean(System.getProperty(AUTH_SERVER_CLUSTER_PROPERTY, "false"));
private static final String MIGRATED_AUTH_SERVER_CONTAINER_PROPERTY = "migrated.auth.server.container";
public static final String MIGRATED_AUTH_SERVER_CONTAINER = System.getProperty(MIGRATED_AUTH_SERVER_CONTAINER_PROPERTY); // == null if migration not enabled
private static final String MIGRATION_PROPERTY = "auth.server.jboss.migration";
private static final Boolean MIGRATION_ENABLED = Boolean.parseBoolean(System.getProperty(MIGRATION_PROPERTY));
@Inject
@SuiteScoped
@ -132,23 +131,19 @@ public class AuthServerTestEnricher {
throw new RuntimeException(String.format("No auth server container matching '%sN' found in arquillian.xml.", authServerBackend));
}
if (MIGRATED_AUTH_SERVER_CONTAINER != null) {
if (MIGRATION_ENABLED) {
// init migratedAuthServerInfo
if (MIGRATED_AUTH_SERVER_CONTAINER.startsWith("migrated-auth-server-")) {
for (ContainerInfo container : suiteContext.getContainers()) {
// migrated auth server
if (container.getQualifier().equals(MIGRATED_AUTH_SERVER_CONTAINER)) {
updateWithAuthServerInfo(container);
suiteContext.setMigratedAuthServerInfo(container);
}
for (ContainerInfo container : suiteContext.getContainers()) {
// migrated auth server
if (container.getQualifier().equals("auth-server-jboss-migration")) {
updateWithAuthServerInfo(container);
suiteContext.setMigratedAuthServerInfo(container);
}
} else {
throw new IllegalArgumentException(String.format("Value of %s should start with 'migrated-auth-server-' prefix.", MIGRATED_AUTH_SERVER_CONTAINER_PROPERTY));
}
// validate setup
if (suiteContext.getMigratedAuthServerInfo() == null) {
throw new RuntimeException(String.format("Migration test was enabled but no auth server from which to migrate was activated. "
+ "A container matching '%s' needs to be enabled in arquillian.xml.", MIGRATED_AUTH_SERVER_CONTAINER));
+ "A container matching auth-server-jboss-migration needs to be enabled in arquillian.xml."));
}
}
@ -178,7 +173,8 @@ public class AuthServerTestEnricher {
public void stopMigratedContainer(@Observes(precedence = 1) StartSuiteContainers event) {
if (suiteContext.isAuthServerMigrationEnabled()) {
containerController.get().stop(suiteContext.getAuthServerInfo().getQualifier());
log.info("## STOP old container: " + suiteContext.getMigratedAuthServerInfo().getQualifier());
stopContainerEvent.fire(new StopContainer(suiteContext.getMigratedAuthServerInfo().getArquillianContainer()));
}
}
@ -189,14 +185,6 @@ public class AuthServerTestEnricher {
LogChecker.checkJBossServerLog(jbossHomePath);
}
}
//
// public void startAuthServerContainer(@Observes BeforeSuite event) {
// startContainerEvent.fire(new StartContainer(suiteContext.getAuthServerInfo().getArquillianContainer()));
// }
//
// public void stopAuthServerContainer(@Observes AfterSuite event) {
// containerController.get().stop(suiteContext.getAuthServerInfo().getQualifier());
// }
public void initializeTestContext(@Observes(precedence = 2) BeforeClass event) {
TestContext testContext = new TestContext(suiteContext, event.getTestClass().getJavaClass());

View file

@ -98,6 +98,9 @@ public final class SuiteContext {
for (ContainerInfo bInfo : getAuthServerBackendsInfo()) {
containers += "Backend: " + bInfo + "\n";
}
if (isAuthServerMigrationEnabled()) {
containers += "Migrated from: " + System.getProperty("migrated.auth.server.version") + "\n";
}
return "SUITE CONTEXT:\n"
+ containers;
}

View file

@ -38,7 +38,7 @@ public class MigrationTestExecutionDecider implements TestExecutionDecider {
if (migrationTest && migrationAnnotation != null) {
String versionFrom = migrationAnnotation.versionFrom();
if (migratedAuthServerVersion.equals(versionFrom)) {
if (versionFrom.equals(migratedAuthServerVersion)) {
return ExecutionDecision.execute();
} else {
return ExecutionDecision.dontExecute(method.getName() + "doesn't fit with migration version.");

View file

@ -17,69 +17,52 @@
package org.keycloak.testsuite.migration;
import java.util.List;
import static org.junit.Assert.*;
import org.junit.Ignore;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.keycloak.admin.client.resource.ClientsResource;
import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.representations.idm.ClientRepresentation;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.representations.idm.RoleRepresentation;
import org.keycloak.testsuite.AbstractKeycloakTest;
import org.keycloak.testsuite.Assert;
import org.keycloak.testsuite.arquillian.migration.Migration;
/**
* @author <a href="mailto:vramik@redhat.com">Vlastislav Ramik</a>
*/
public class MigrationTest extends AbstractKeycloakTest {
private RealmResource realmResource;
private RealmRepresentation realmRep;
@Override
public void addTestRealms(List<RealmRepresentation> testRealms) {
log.info("Adding no test realms for migration test. Test realm should be migrated from previous vesrion.");
}
@Test
@Migration(versionFrom = "1.6.1.Final")
public void migration16Test() {
RealmResource realmResource = adminClient.realms().realm("Migration");
RealmRepresentation realmRep = realmResource.toRepresentation();
assertEquals("Migration", realmRep.getRealm());
List<RoleRepresentation> realmRoles = realmResource.roles().list();
assertEquals(1, realmRoles.size());
assertEquals("offline_access", realmRoles.get(0).getName());
for (ClientRepresentation client : realmResource.clients().findAll()) {
final String clientId = client.getClientId();
switch (clientId) {
case "realm-management":
assertEquals(13, realmResource.clients().get(client.getId()).roles().list().size());
break;
case "security-admin-console":
assertEquals(0, realmResource.clients().get(client.getId()).roles().list().size());
break;
case "broker":
assertEquals(1, realmResource.clients().get(client.getId()).roles().list().size());
break;
case "account":
assertEquals(2, realmResource.clients().get(client.getId()).roles().list().size());
break;
default:
fail("Migrated realm contains unexpected client " + clientId);
break;
}
}
@Before
public void beforeMigrationTest() {
realmResource = adminClient.realms().realm("Migration");
realmRep = realmResource.toRepresentation();
}
@Test
@Migration(versionFrom = "1.5.1.Final")
@Ignore
public void migration15Test() {
for (RealmRepresentation realm : adminClient.realms().findAll()) {
System.out.println(realm.getRealm());
}
@Migration(versionFrom = "1.9.8.Final")
public void migration198Test() {
Assert.assertNames(realmResource.roles().list(), "offline_access", "uma_authorization");
Assert.assertNames(realmResource.clients().findAll(), "admin-cli", "realm-management", "security-admin-console", "broker", "account");
//TODO
}
/**
* Assumed that there is only one migration test for each version and *remove*
* 'Migration' realm from Keycloak after test to be able to run the rest
* of the testsuite isolated afterward.
*/
@After
public void afterMigrationTest() {
log.info("removing '" + realmRep.getRealm() + "' realm");
removeRealm(realmRep);
}
}

View file

@ -150,11 +150,11 @@
</configuration>
</container>
<!-- PREVIOUS VERSIONS OF KEYCLOAK FOR MIGRATION TESTS -->
<!-- PREVIOUS VERSION OF KEYCLOAK FOR MIGRATION TESTS -->
<container qualifier="auth-server-jboss-kc16" mode="manual" >
<container qualifier="auth-server-jboss-migration" mode="manual" >
<configuration>
<property name="enabled">${auth.server.jboss.kc16}</property>
<property name="enabled">${auth.server.jboss.migration}</property>
<property name="adapterImplClass">org.jboss.as.arquillian.container.managed.ManagedDeployableContainer</property>
<property name="jbossHome">${keycloak.migration.home}</property>
<property name="javaVmArguments">
@ -164,62 +164,10 @@
-Dkeycloak.migration.strategy=OVERWRITE_EXISTING
-Dkeycloak.migration.realmName=Migration
-Djboss.socket.binding.port-offset=${auth.server.port.offset}
-Xms64m -Xmx512m -XX:MaxPermSize=256m
${auth.server.memory.settings}
</property>
<property name="managementPort">${auth.server.management.port}</property>
<property name="startupTimeoutInSeconds">${auth.server.startup.timeout}</property>
</configuration>
</container>
<container qualifier="auth-server-jboss-kc15" mode="manual" >
<configuration>
<property name="enabled">${auth.server.jboss.kc15}</property>
<property name="adapterImplClass">org.jboss.as.arquillian.container.managed.ManagedDeployableContainer</property>
<property name="jbossHome">${keycloak.migration.home}</property>
<property name="javaVmArguments">
-Dkeycloak.migration.action=import
-Dkeycloak.migration.provider=singleFile
-Dkeycloak.migration.file=${keycloak.migration.file}
-Dkeycloak.migration.strategy=OVERWRITE_EXISTING
-Dkeycloak.migration.realmName=Migration
-Djboss.socket.binding.port-offset=${auth.server.port.offset}
-Xms64m -Xmx512m -XX:MaxPermSize=256m
</property>
<property name="managementPort">${auth.server.management.port}</property>
<property name="startupTimeoutInSeconds">${auth.server.startup.timeout}</property>
</configuration>
</container>
<container qualifier="auth-server-jboss-kc14" mode="manual" >
<configuration>
<property name="enabled">${auth.server.jboss.kc14}</property>
<property name="adapterImplClass">org.jboss.as.arquillian.container.managed.ManagedDeployableContainer</property>
<property name="jbossHome">${keycloak.migration.home}</property>
<property name="javaVmArguments">-Djboss.socket.binding.port-offset=${auth.server.port.offset} -Xms64m -Xmx512m -XX:MaxPermSize=256m</property>
<property name="managementPort">${auth.server.management.port}</property>
<property name="startupTimeoutInSeconds">${auth.server.startup.timeout}</property>
</configuration>
</container>
<container qualifier="auth-server-jboss-kc13" mode="manual" >
<configuration>
<property name="enabled">${auth.server.jboss.kc13}</property>
<property name="adapterImplClass">org.jboss.as.arquillian.container.managed.ManagedDeployableContainer</property>
<property name="jbossHome">${keycloak.migration.home}</property>
<property name="javaVmArguments">-Djboss.socket.binding.port-offset=${auth.server.port.offset} -Xms64m -Xmx512m -XX:MaxPermSize=256m</property>
<property name="managementPort">${auth.server.management.port}</property>
<property name="startupTimeoutInSeconds">${auth.server.startup.timeout}</property>
</configuration>
</container>
<container qualifier="auth-server-jboss-kc12" mode="manual" >
<configuration>
<property name="enabled">${auth.server.jboss.kc12}</property>
<property name="adapterImplClass">org.jboss.as.arquillian.container.managed.ManagedDeployableContainer</property>
<property name="jbossHome">${keycloak.migration.home}</property>
<property name="javaVmArguments">-Djboss.socket.binding.port-offset=${auth.server.port.offset} -Xms64m -Xmx512m -XX:MaxPermSize=256m</property>
<property name="managementPort">${auth.server.management.port}</property>
<property name="startupTimeoutInSeconds">${auth.server.startup.timeout}</property>
<property name="startupTimeoutInSeconds">${auth.server.jboss.startup.timeout}</property>
</configuration>
</container>

View file

@ -1,751 +0,0 @@
{
"id" : "9c3a9824-cc8b-46f6-8922-cd576a92850f",
"realm" : "Migration",
"notBefore" : 0,
"accessTokenLifespan" : 300,
"ssoSessionIdleTimeout" : 1800,
"ssoSessionMaxLifespan" : 36000,
"accessCodeLifespan" : 60,
"accessCodeLifespanUserAction" : 300,
"accessCodeLifespanLogin" : 1800,
"enabled" : true,
"sslRequired" : "external",
"registrationAllowed" : false,
"registrationEmailAsUsername" : false,
"rememberMe" : false,
"verifyEmail" : false,
"resetPasswordAllowed" : false,
"editUsernameAllowed" : false,
"bruteForceProtected" : false,
"maxFailureWaitSeconds" : 900,
"minimumQuickLoginWaitSeconds" : 60,
"waitIncrementSeconds" : 60,
"quickLoginCheckMilliSeconds" : 1000,
"maxDeltaTimeSeconds" : 43200,
"failureFactor" : 30,
"privateKey" : "MIIEpAIBAAKCAQEA29+/bYOEg+RFlDgKjX0nv+UMkV8X06E1XvRobuQjXKOV613VJIa1F/nGabXthkM3tC7DadJ5y1tBwhF+bJzMA4w38zNfJdjEp3DRND6ypUn0SJZrSw6l3u3w+s5uemgTWUZk463Xr3HbDxtnG+4t5GuHA2Oq6O2OLniVZKbDTpgF1HxzCBQiAxi2jNJm3tMlTdN6D/nV3Rwp2T1250T3ldkM3TDK/Nlup3oOejy+qRGEmh+omuABOOJ8icCULZ5S2AbiqfojP5ZN3WEpyCqcQvsdop4IawUbTDyy9BCE2K5CCZ6ZgQaSnpJZGUy91crPJXnI4tlg5Mh88l8aSrBLsQIDAQABAoIBAA5J7SPNzzfPBuKJ/c2SG5ox5W4xEthS+qfwFDVYqB+mFeEU2PwlsPEc71MBWq1GAwG3pEVlQzr+9DgLcP7X9b4pR52LchyAiM8k2sOda3ioZLKu68wV6JujNOznq3BTASblFztgmcqyCH1j14COKvdUMZL70CiQ/5NvjK3c1IZv5d/S9B7Qhd2o/6cO51xIodE87Lc4Pghq8cQ/AJJUJokyFtjkCpTNAYxcZgyiEMNbyjrbNMMEpiuspZ50eRbi7SOKOg6mSjwuTeK0cQ57JDuMhE/iyaMwh98uqSTccqeKS672z+7QCu89ce1YZMnWtjfwKEiIcTWB71pvy2gGwgECgYEA9Afv+5Zop4j1kmZvQcdr+UpW3Ia91nNelvlkMYPMrsC24xwrGhO9Hx76VxdBFCzDuYBIyOzbPLV7kFojSKmcWB6hb/S/j6eMd46ZetycrfH5sRpJHmqJpGZiARrWTLsFRNDwi2jwEl2qt3wkq/IBvuzNt9bwbnsajgRVSVWUBtECgYEA5qh+hl1f8R6KcrUro9kSSxjmlqzSIeAYNJ0VJkr2ZjRd984xTRSnUcuVJnbfNgfmywCB9s7QGgcMrs9BejKuP1bq2hnjjA1WOvz0Dq1FRw3wqYSZWHtVO2h/QDaKIcGjQ/PyWAyrOTBaL+bzKrNO66L7CQK63A4/Gj7QivFA7uECgYEAmYW81pyDbpLdW6MR72IUbZr1Fnu2RooCQhzXiccPKAmZhTudaiRs4H1OpSe+C4E2CSfJoo5QRtstx1zNwdLixxVOHu7s7OVNm5GcwQy1jUEkAuU0huwjd8fpdCR8GX23DNod2rbEAennktOJBpuTuZekvDl+vSK5TAsx1JcAL2ECgYB7rPTKjt6Wps2NW98eZ5ILejqJp/iz+TiBXYitk5wyiPmpmYGN1vkwPnymty5QBkSVrJwC/jlO+2CtiquNHgeYJr6eWytLOQt3bZJfHED9LFhSTKr8aoT06b7xa0z9dJpaIT9cPs7AR1DURn0z9Bjo9+aqmjAfNfRX2j5vgZRTgQKBgQC7+9bt4yZ0MAxJYTMVqU/LnyjPuDrgXZJYw5ZYO6r5xF0mdovE9+lY6I8OeAUg428Zk8mxMYeqOFUHF8nVBxofHrZbXR2eJxJLRO8f2GPRFYanA9MNe1Jc0WV5bi1gF+ifC0j//W1kGxCHJX1OeMSV/h8r3OaIHEwuu30ZLHFxRg==",
"publicKey" : "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA29+/bYOEg+RFlDgKjX0nv+UMkV8X06E1XvRobuQjXKOV613VJIa1F/nGabXthkM3tC7DadJ5y1tBwhF+bJzMA4w38zNfJdjEp3DRND6ypUn0SJZrSw6l3u3w+s5uemgTWUZk463Xr3HbDxtnG+4t5GuHA2Oq6O2OLniVZKbDTpgF1HxzCBQiAxi2jNJm3tMlTdN6D/nV3Rwp2T1250T3ldkM3TDK/Nlup3oOejy+qRGEmh+omuABOOJ8icCULZ5S2AbiqfojP5ZN3WEpyCqcQvsdop4IawUbTDyy9BCE2K5CCZ6ZgQaSnpJZGUy91crPJXnI4tlg5Mh88l8aSrBLsQIDAQAB",
"certificate" : "MIICoTCCAYkCBgFQs81zNDANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAlNaWdyYXRpb24wHhcNMTUxMDI5MTMzMTM3WhcNMjUxMDI5MTMzMzE3WjAUMRIwEAYDVQQDDAlNaWdyYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDb379tg4SD5EWUOAqNfSe/5QyRXxfToTVe9Ghu5CNco5XrXdUkhrUX+cZpte2GQze0LsNp0nnLW0HCEX5snMwDjDfzM18l2MSncNE0PrKlSfRIlmtLDqXe7fD6zm56aBNZRmTjrdevcdsPG2cb7i3ka4cDY6ro7Y4ueJVkpsNOmAXUfHMIFCIDGLaM0mbe0yVN03oP+dXdHCnZPXbnRPeV2QzdMMr82W6neg56PL6pEYSaH6ia4AE44nyJwJQtnlLYBuKp+iM/lk3dYSnIKpxC+x2inghrBRtMPLL0EITYrkIJnpmBBpKeklkZTL3Vys8lecji2WDkyHzyXxpKsEuxAgMBAAEwDQYJKoZIhvcNAQELBQADggEBALaDK+wutEjdgY3Ux06Amp0k5qK16dz4jn+QKjdKPB1yThfzY1pisuyCUXPBlkn1OjB5ZvYl6ouwdNXgB8aeblbHZoyXh9ODeywi1xZd7pGxNXSfx0UzRk/YEEy0DAi9pxTyRYxiZ6/XJalS9PembTQvj+mVKqg1SDv7dyv4byvndEYSaUISrtGGrM3bb68PW4zInD793PJYWDSVxmEPOYtdgBJv4HAhPIJhjw15EOGlPv5QxW9P76OgISCutHaEe3UDP+TzIBBxYQFb1ZXA6ob3TFga78mFAkY4g98gEC11QSvZqhaRtLAz6PEisHRV+xDJVROgQ4Qew4qKgwE0gGE=",
"codeSecret" : "32f8634c-2be2-4d4d-8118-f4f7fee80b9f",
"roles" : {
"client" : {
"realm-management" : [ {
"id" : "dad7b3a4-b533-47c8-aba5-32e6429865a2",
"name" : "manage-identity-providers",
"description" : "${role_manage-identity-providers}",
"composite" : false
}, {
"id" : "a1dd3971-3906-4f4a-b4cd-3a198d2d7150",
"name" : "view-users",
"description" : "${role_view-users}",
"composite" : false
}, {
"id" : "6c2d766f-cfa5-4cae-b1ca-81f1f9f242c8",
"name" : "view-clients",
"description" : "${role_view-clients}",
"composite" : false
}, {
"id" : "60bb5b3e-8067-43fe-803e-a7e367967c7c",
"name" : "manage-realm",
"description" : "${role_manage-realm}",
"composite" : false
}, {
"id" : "c55cb35a-2602-47a6-a628-fc5a55341426",
"name" : "manage-users",
"description" : "${role_manage-users}",
"composite" : false
}, {
"id" : "4dc834d0-766b-45aa-ab3b-b7b976baa65d",
"name" : "realm-admin",
"description" : "${role_realm-admin}",
"composite" : true,
"composites" : {
"client" : {
"realm-management" : [ "view-users", "manage-identity-providers", "view-clients", "manage-realm", "manage-users", "impersonation", "view-realm", "view-events", "manage-clients", "manage-events", "view-identity-providers" ]
}
}
}, {
"id" : "d444a98f-ab5e-4857-9300-496e04e498f5",
"name" : "impersonation",
"description" : "${role_impersonation}",
"composite" : false
}, {
"id" : "2f6f1407-f334-434f-becf-771e3ebb5625",
"name" : "view-realm",
"description" : "${role_view-realm}",
"composite" : false
}, {
"id" : "a40d3211-5244-4d92-80c0-0d3215580250",
"name" : "manage-events",
"description" : "${role_manage-events}",
"composite" : false
}, {
"id" : "d11c407e-504f-4923-b243-e794afa0247e",
"name" : "view-events",
"description" : "${role_view-events}",
"composite" : false
}, {
"id" : "3ef6ace4-4e87-4c30-a8b3-1f0df25868c6",
"name" : "manage-clients",
"description" : "${role_manage-clients}",
"composite" : false
}, {
"id" : "fa2a4972-b8d0-452e-8e13-d2cf7eaac7aa",
"name" : "view-identity-providers",
"description" : "${role_view-identity-providers}",
"composite" : false
} ],
"security-admin-console" : [ ],
"broker" : [ {
"id" : "1bc5aeb4-1df1-4402-8195-e2a72f6dca30",
"name" : "read-token",
"description" : "${role_read-token}",
"composite" : false
} ],
"account" : [ {
"id" : "71b5b5ff-b372-41a1-a427-7883fa64a8c7",
"name" : "manage-account",
"description" : "${role_manage-account}",
"composite" : false
}, {
"id" : "04daa556-8aeb-43ba-99c6-b393ec2a32d4",
"name" : "view-profile",
"description" : "${role_view-profile}",
"composite" : false
} ]
}
},
"requiredCredentials" : [ "password" ],
"otpPolicyType" : "totp",
"otpPolicyAlgorithm" : "HmacSHA1",
"otpPolicyInitialCounter" : 0,
"otpPolicyDigits" : 6,
"otpPolicyLookAheadWindow" : 1,
"otpPolicyPeriod" : 30,
"clientScopeMappings" : {
"realm-management" : [ {
"client" : "security-admin-console",
"roles" : [ "realm-admin" ]
} ]
},
"clients" : [ {
"id" : "ba27336f-3f89-471d-98d2-b8856bd6dbf1",
"clientId" : "realm-management",
"name" : "${client_realm-management}",
"surrogateAuthRequired" : false,
"enabled" : true,
"clientAuthenticatorType" : "client-secret",
"secret" : "26aee4e9-8eec-421b-90a9-238538f5897a",
"redirectUris" : [ ],
"webOrigins" : [ ],
"notBefore" : 0,
"bearerOnly" : true,
"consentRequired" : false,
"serviceAccountsEnabled" : false,
"directGrantsOnly" : false,
"publicClient" : false,
"frontchannelLogout" : false,
"attributes" : { },
"fullScopeAllowed" : false,
"nodeReRegistrationTimeout" : 0,
"protocolMappers" : [ {
"id" : "5d56eba1-724e-4904-a8f8-86ca264a82cf",
"name" : "family name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${familyName}",
"config" : {
"user.attribute" : "lastName",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "family_name",
"Claim JSON Type" : "String"
}
}, {
"id" : "18a30786-89f9-4744-8f36-4de811a591ae",
"name" : "email",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${email}",
"config" : {
"user.attribute" : "email",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "email",
"Claim JSON Type" : "String"
}
}, {
"id" : "4d1c4456-0c0d-49b9-bfba-c2c83645aeb2",
"name" : "username",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${username}",
"config" : {
"user.attribute" : "username",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "preferred_username",
"Claim JSON Type" : "String"
}
}, {
"id" : "1a19db43-2346-4a24-b6f0-1b8d7fc1353e",
"name" : "role list",
"protocol" : "saml",
"protocolMapper" : "saml-role-list-mapper",
"consentRequired" : false,
"config" : {
"single" : "false",
"attribute.nameformat" : "Basic",
"attribute.name" : "Role"
}
}, {
"id" : "a18612f0-9eb3-4d81-af0c-b0749b83fbd3",
"name" : "given name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${givenName}",
"config" : {
"user.attribute" : "firstName",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "given_name",
"Claim JSON Type" : "String"
}
}, {
"id" : "70c26044-c7fc-4090-98e1-670fef006e25",
"name" : "full name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-full-name-mapper",
"consentRequired" : true,
"consentText" : "${fullName}",
"config" : {
"id.token.claim" : "true",
"access.token.claim" : "true"
}
} ]
}, {
"id" : "3fdddd5e-0022-4f6d-8fdf-212266db7fd4",
"clientId" : "security-admin-console",
"name" : "${client_security-admin-console}",
"baseUrl" : "/auth/admin/Migration/console/index.html",
"surrogateAuthRequired" : false,
"enabled" : true,
"clientAuthenticatorType" : "client-secret",
"secret" : "38ce8135-738d-4103-85ac-c3470ac8824d",
"redirectUris" : [ "/auth/admin/Migration/console/*" ],
"webOrigins" : [ ],
"notBefore" : 0,
"bearerOnly" : false,
"consentRequired" : false,
"serviceAccountsEnabled" : false,
"directGrantsOnly" : false,
"publicClient" : true,
"frontchannelLogout" : false,
"attributes" : { },
"fullScopeAllowed" : false,
"nodeReRegistrationTimeout" : 0,
"protocolMappers" : [ {
"id" : "be58fe30-b767-4566-9192-a4fa81fafa2c",
"name" : "role list",
"protocol" : "saml",
"protocolMapper" : "saml-role-list-mapper",
"consentRequired" : false,
"config" : {
"single" : "false",
"attribute.nameformat" : "Basic",
"attribute.name" : "Role"
}
}, {
"id" : "c97523fd-fd4f-48d7-8937-bd434fa374fd",
"name" : "given name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${givenName}",
"config" : {
"user.attribute" : "firstName",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "given_name",
"Claim JSON Type" : "String"
}
}, {
"id" : "2323a85d-2686-46d4-bea8-e36524920f2e",
"name" : "email",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${email}",
"config" : {
"user.attribute" : "email",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "email",
"Claim JSON Type" : "String"
}
}, {
"id" : "56f8a80e-9e99-4add-b918-b864ca3f6f5c",
"name" : "username",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${username}",
"config" : {
"user.attribute" : "username",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "preferred_username",
"Claim JSON Type" : "String"
}
}, {
"id" : "f9f51e8d-d5af-456c-be5a-3019fb8c0910",
"name" : "family name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${familyName}",
"config" : {
"user.attribute" : "lastName",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "family_name",
"Claim JSON Type" : "String"
}
}, {
"id" : "3d8fbb0c-9058-4dde-b675-ca77a153ceb8",
"name" : "full name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-full-name-mapper",
"consentRequired" : true,
"consentText" : "${fullName}",
"config" : {
"id.token.claim" : "true",
"access.token.claim" : "true"
}
} ]
}, {
"id" : "068fcf1a-7048-43df-b3dd-e6c484e8b051",
"clientId" : "broker",
"name" : "${client_broker}",
"surrogateAuthRequired" : false,
"enabled" : true,
"clientAuthenticatorType" : "client-secret",
"secret" : "041b50a6-54b5-4cff-84ef-1b7c388d3395",
"redirectUris" : [ ],
"webOrigins" : [ ],
"notBefore" : 0,
"bearerOnly" : false,
"consentRequired" : false,
"serviceAccountsEnabled" : false,
"directGrantsOnly" : false,
"publicClient" : false,
"frontchannelLogout" : false,
"attributes" : { },
"fullScopeAllowed" : false,
"nodeReRegistrationTimeout" : 0,
"protocolMappers" : [ {
"id" : "57c6f779-c96b-4f03-b268-354af2a8731e",
"name" : "email",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${email}",
"config" : {
"user.attribute" : "email",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "email",
"Claim JSON Type" : "String"
}
}, {
"id" : "f17a7b9f-9363-44bd-8320-df36f22ca712",
"name" : "given name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${givenName}",
"config" : {
"user.attribute" : "firstName",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "given_name",
"Claim JSON Type" : "String"
}
}, {
"id" : "ec1bf022-9e98-4f29-9bf0-f0a49bd844ad",
"name" : "role list",
"protocol" : "saml",
"protocolMapper" : "saml-role-list-mapper",
"consentRequired" : false,
"config" : {
"single" : "false",
"attribute.nameformat" : "Basic",
"attribute.name" : "Role"
}
}, {
"id" : "0d54c616-326b-4fe7-bbfa-af9a28304dc5",
"name" : "username",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${username}",
"config" : {
"user.attribute" : "username",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "preferred_username",
"Claim JSON Type" : "String"
}
}, {
"id" : "89ce95b9-a268-4306-a1ad-86066d0cdd03",
"name" : "family name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${familyName}",
"config" : {
"user.attribute" : "lastName",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "family_name",
"Claim JSON Type" : "String"
}
}, {
"id" : "8236274d-af69-4fc4-8804-a02d4af66157",
"name" : "full name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-full-name-mapper",
"consentRequired" : true,
"consentText" : "${fullName}",
"config" : {
"id.token.claim" : "true",
"access.token.claim" : "true"
}
} ]
}, {
"id" : "717b9e58-87ed-402d-a8f8-a37fd5e7c951",
"clientId" : "account",
"name" : "${client_account}",
"baseUrl" : "/auth/realms/Migration/account",
"surrogateAuthRequired" : false,
"enabled" : true,
"clientAuthenticatorType" : "client-secret",
"secret" : "9ea62eb5-5478-454a-a479-4012f8967f9c",
"defaultRoles" : [ "view-profile", "manage-account" ],
"redirectUris" : [ "/auth/realms/Migration/account/*" ],
"webOrigins" : [ ],
"notBefore" : 0,
"bearerOnly" : false,
"consentRequired" : false,
"serviceAccountsEnabled" : false,
"directGrantsOnly" : false,
"publicClient" : false,
"frontchannelLogout" : false,
"attributes" : { },
"fullScopeAllowed" : false,
"nodeReRegistrationTimeout" : 0,
"protocolMappers" : [ {
"id" : "bfb4a165-2a55-4e4b-9b13-05e68822f5d6",
"name" : "family name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${familyName}",
"config" : {
"user.attribute" : "lastName",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "family_name",
"Claim JSON Type" : "String"
}
}, {
"id" : "c505e313-d478-4b1d-94df-c2c9b6036a95",
"name" : "role list",
"protocol" : "saml",
"protocolMapper" : "saml-role-list-mapper",
"consentRequired" : false,
"config" : {
"single" : "false",
"attribute.nameformat" : "Basic",
"attribute.name" : "Role"
}
}, {
"id" : "12fc43f0-19b7-4b4a-b50a-40b6fc344ede",
"name" : "email",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${email}",
"config" : {
"user.attribute" : "email",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "email",
"Claim JSON Type" : "String"
}
}, {
"id" : "250f3bf3-2655-4482-a814-3adcc7cef5a4",
"name" : "full name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-full-name-mapper",
"consentRequired" : true,
"consentText" : "${fullName}",
"config" : {
"id.token.claim" : "true",
"access.token.claim" : "true"
}
}, {
"id" : "6cf70d19-6a9e-4abf-8917-38b87bac15d6",
"name" : "username",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${username}",
"config" : {
"user.attribute" : "username",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "preferred_username",
"Claim JSON Type" : "String"
}
}, {
"id" : "6cdeae21-ca97-4723-b880-d5aa35fa77b0",
"name" : "given name",
"protocol" : "openid-connect",
"protocolMapper" : "oidc-usermodel-property-mapper",
"consentRequired" : true,
"consentText" : "${givenName}",
"config" : {
"user.attribute" : "firstName",
"id.token.claim" : "true",
"access.token.claim" : "true",
"claim.name" : "given_name",
"Claim JSON Type" : "String"
}
} ]
} ],
"browserSecurityHeaders" : {
"contentSecurityPolicy" : "frame-src 'self'",
"xFrameOptions" : "SAMEORIGIN"
},
"smtpServer" : { },
"eventsEnabled" : false,
"eventsListeners" : [ "jboss-logging" ],
"enabledEventTypes" : [ ],
"adminEventsEnabled" : false,
"adminEventsDetailsEnabled" : false,
"identityFederationEnabled" : false,
"internationalizationEnabled" : false,
"supportedLocales" : [ ],
"authenticationFlows" : [ {
"alias" : "registration form",
"description" : "registration form",
"providerId" : "form-flow",
"topLevel" : false,
"builtIn" : true,
"authenticationExecutions" : [ {
"authenticator" : "registration-user-creation",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 20
}, {
"authenticator" : "registration-profile-action",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 40
}, {
"authenticator" : "registration-password-action",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 50
}, {
"authenticator" : "registration-recaptcha-action",
"autheticatorFlow" : false,
"requirement" : "DISABLED",
"userSetupAllowed" : false,
"priority" : 60
} ]
}, {
"alias" : "direct grant",
"description" : "OpenID Connect Resource Owner Grant",
"providerId" : "basic-flow",
"topLevel" : true,
"builtIn" : true,
"authenticationExecutions" : [ {
"authenticator" : "direct-grant-validate-username",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 10
}, {
"authenticator" : "direct-grant-validate-password",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 20
}, {
"authenticator" : "direct-grant-validate-otp",
"autheticatorFlow" : false,
"requirement" : "OPTIONAL",
"userSetupAllowed" : false,
"priority" : 30
} ]
}, {
"alias" : "reset credentials",
"description" : "Reset credentials for a user if they forgot their password or something",
"providerId" : "basic-flow",
"topLevel" : true,
"builtIn" : true,
"authenticationExecutions" : [ {
"authenticator" : "reset-credentials-choose-user",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 10
}, {
"authenticator" : "reset-credential-email",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 20
}, {
"authenticator" : "reset-password",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 30
}, {
"authenticator" : "reset-otp",
"autheticatorFlow" : false,
"requirement" : "OPTIONAL",
"userSetupAllowed" : false,
"priority" : 40
} ]
}, {
"alias" : "forms",
"description" : "Username, password, otp and other auth forms.",
"providerId" : "basic-flow",
"topLevel" : false,
"builtIn" : true,
"authenticationExecutions" : [ {
"authenticator" : "auth-username-password-form",
"autheticatorFlow" : false,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 10
}, {
"authenticator" : "auth-otp-form",
"autheticatorFlow" : false,
"requirement" : "OPTIONAL",
"userSetupAllowed" : false,
"priority" : 20
} ]
}, {
"alias" : "clients",
"description" : "Base authentication for clients",
"providerId" : "client-flow",
"topLevel" : true,
"builtIn" : true,
"authenticationExecutions" : [ {
"authenticator" : "client-secret",
"autheticatorFlow" : false,
"requirement" : "ALTERNATIVE",
"userSetupAllowed" : false,
"priority" : 10
}, {
"authenticator" : "client-jwt",
"autheticatorFlow" : false,
"requirement" : "ALTERNATIVE",
"userSetupAllowed" : false,
"priority" : 20
} ]
}, {
"alias" : "browser",
"description" : "browser based authentication",
"providerId" : "basic-flow",
"topLevel" : true,
"builtIn" : true,
"authenticationExecutions" : [ {
"authenticator" : "auth-cookie",
"autheticatorFlow" : false,
"requirement" : "ALTERNATIVE",
"userSetupAllowed" : false,
"priority" : 10
}, {
"authenticator" : "auth-spnego",
"autheticatorFlow" : false,
"requirement" : "DISABLED",
"userSetupAllowed" : false,
"priority" : 20
}, {
"flowAlias" : "forms",
"autheticatorFlow" : true,
"requirement" : "ALTERNATIVE",
"userSetupAllowed" : false,
"priority" : 30
} ]
}, {
"alias" : "registration",
"description" : "registration flow",
"providerId" : "basic-flow",
"topLevel" : true,
"builtIn" : true,
"authenticationExecutions" : [ {
"authenticator" : "registration-page-form",
"flowAlias" : "registration form",
"autheticatorFlow" : true,
"requirement" : "REQUIRED",
"userSetupAllowed" : false,
"priority" : 10
} ]
} ],
"authenticatorConfig" : [ ],
"requiredActions" : [ {
"alias" : "CONFIGURE_TOTP",
"name" : "Configure Totp",
"providerId" : "CONFIGURE_TOTP",
"enabled" : true,
"defaultAction" : false,
"config" : { }
}, {
"alias" : "VERIFY_EMAIL",
"name" : "Verify Email",
"providerId" : "VERIFY_EMAIL",
"enabled" : true,
"defaultAction" : false,
"config" : { }
}, {
"alias" : "terms_and_conditions",
"name" : "Terms and Conditions",
"providerId" : "terms_and_conditions",
"enabled" : false,
"defaultAction" : false,
"config" : { }
}, {
"alias" : "UPDATE_PASSWORD",
"name" : "Update Password",
"providerId" : "UPDATE_PASSWORD",
"enabled" : true,
"defaultAction" : false,
"config" : { }
}, {
"alias" : "UPDATE_PROFILE",
"name" : "Update Profile",
"providerId" : "UPDATE_PROFILE",
"enabled" : true,
"defaultAction" : false,
"config" : { }
} ],
"browserFlow" : "browser",
"registrationFlow" : "registration",
"directGrantFlow" : "direct grant",
"resetCredentialsFlow" : "reset credentials",
"clientAuthenticationFlow" : "clients"
}

View file

@ -37,7 +37,7 @@
<module>base</module>
<module>other</module>
</modules>
<properties>
<auth.server>undertow</auth.server>
<auth.server.undertow>true</auth.server.undertow>
@ -54,7 +54,6 @@
<auth.server.management.port>10090</auth.server.management.port>
<auth.server.management.port.jmx>10099</auth.server.management.port.jmx>
<auth.server.ssl.required>false</auth.server.ssl.required>
<auth.server.jboss.startup.timeout>60</auth.server.jboss.startup.timeout>
<auth.server.memory.settings>-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m</auth.server.memory.settings>
<auth.server.config.property.name>serverConfig</auth.server.config.property.name>
<auth.server.adapter.impl.class>org.jboss.as.arquillian.container.managed.ManagedDeployableContainer</auth.server.adapter.impl.class>
@ -76,6 +75,7 @@
<testsuite.constants>${project.build.directory}/dependency/test-constants.properties</testsuite.constants>
<skip.add.user.json>false</skip.add.user.json>
</properties>
<build>
@ -116,6 +116,7 @@
<goal>copy-resources</goal>
</goals>
<configuration>
<skip>${skip.add.user.json}</skip>
<outputDirectory>${auth.server.config.dir}</outputDirectory>
<resources>
<resource>
@ -178,7 +179,7 @@
<properties>
<property>
<name>listener</name>
<value>org.keycloak.testsuite.util.TestEventsLogger</value>
<value>org.keycloak.testsuite.util.TestEventsLogger,org.keycloak.testsuite.util.junit.AggregateResultsReporter</value>
</property>
</properties>
</configuration>
@ -402,7 +403,7 @@
</build>
</profile>
<!-- Profiles for migration tests-->
<!-- Profile for migration tests-->
<profile>
<id>migration</id>
@ -411,30 +412,8 @@
<name>migrated.auth.server.version</name>
</property>
</activation>
<properties>
<!--diable exclusion pattern for migration tests, which is enabled by default in the base/pom.xml-->
<exclude.migration>-</exclude.migration>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-properties</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireProperty>
<property>migrated.auth.server.version</property>
</requireProperty>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
@ -448,7 +427,7 @@
<artifactItems>
<artifactItem>
<groupId>org.keycloak.testsuite</groupId>
<artifactId>${migrated.auth.server.jboss.artifactId}</artifactId>
<artifactId>integration-arquillian-migration-server</artifactId>
<version>${project.version}</version>
<type>zip</type>
</artifactItem>
@ -464,158 +443,16 @@
<configuration>
<systemPropertyVariables>
<migrated.auth.server.version>${migrated.auth.server.version}</migrated.auth.server.version>
<auth.server.jboss.migration>true</auth.server.jboss.migration>
<keycloak.migration.home>${containers.home}/keycloak-${migrated.auth.server.version}</keycloak.migration.home>
<keycloak.migration.file>src/test/resources/migration-test/migration-realm-${migrated.auth.server.version}.json</keycloak.migration.file>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>migration-kc16</id>
<activation>
<property>
<name>migrated.auth.server.version</name>
<value>1.6.1.Final</value>
</property>
</activation>
<properties>
<migrated.auth.server.jboss.artifactId>integration-arquillian-server-wildfly-kc16</migrated.auth.server.jboss.artifactId>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<auth.server.jboss.kc16>true</auth.server.jboss.kc16>
<keycloak.migration.home>${containers.home}/keycloak-${migrated.auth.server.version}</keycloak.migration.home>
<keycloak.migration.file>src/test/resources/migration-test/migration-realm-16.json</keycloak.migration.file>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
<profile>
<id>migration-kc15</id>
<activation>
<property>
<name>migrated.auth.server.version</name>
<value>1.5.1.Final</value>
</property>
</activation>
<properties>
<migrated.auth.server.jboss.artifactId>integration-arquillian-server-wildfly-kc15</migrated.auth.server.jboss.artifactId>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<auth.server.jboss.kc15>true</auth.server.jboss.kc15>
<keycloak.migration.home>${containers.home}/keycloak-${migrated.auth.server.version}</keycloak.migration.home>
<keycloak.migration.file>src/test/resources/migration-test/migration-realm-15.json</keycloak.migration.file>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
<profile>
<id>migration-kc14</id>
<activation>
<property>
<name>migrated.auth.server.version</name>
<value>1.4.0.Final</value>
</property>
</activation>
<properties>
<migrated.auth.server.jboss.artifactId>integration-arquillian-server-wildfly-kc14</migrated.auth.server.jboss.artifactId>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<auth.server.jboss.kc14>true</auth.server.jboss.kc14>
<keycloak.migration.home>${containers.home}/keycloak-${migrated.auth.server.version}</keycloak.migration.home>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
<profile>
<id>migration-kc13</id>
<activation>
<property>
<name>migrated.auth.server.version</name>
<value>1.3.1.Final</value>
</property>
</activation>
<properties>
<migrated.auth.server.jboss.artifactId>integration-arquillian-server-wildfly-kc13</migrated.auth.server.jboss.artifactId>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<auth.server.jboss.kc13>true</auth.server.jboss.kc13>
<keycloak.migration.home>${containers.home}/keycloak-${migrated.auth.server.version}</keycloak.migration.home>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
<profile>
<id>migration-kc12</id>
<activation>
<property>
<name>migrated.auth.server.version</name>
<value>1.2.0.Final</value>
</property>
</activation>
<properties>
<migrated.auth.server.jboss.artifactId>integration-arquillian-server-wildfly-kc12</migrated.auth.server.jboss.artifactId>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<auth.server.jboss.kc12>true</auth.server.jboss.kc12>
<keycloak.migration.home>${containers.home}/keycloak-${migrated.auth.server.version}</keycloak.migration.home>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
<profile>
<id>no-account</id>
<properties>
@ -645,6 +482,13 @@
</file>
</activation>
<dependencies>
<dependency>
<groupId>org.keycloak.testsuite</groupId>
<artifactId>integration-arquillian-test-utils</artifactId>
<version>${project.version}</version>
</dependency>
<!-- TEST DEPENDENCIES -->
<dependency>
<groupId>junit</groupId>

View file

@ -287,6 +287,10 @@ public abstract class AbstractFirstBrokerLoginTest extends AbstractIdentityProvi
// authenticated and redirected to app. User is linked with identity provider
assertFederatedUser("pedroigor", "psilva@redhat.com", "pedroigor");
// Assert user's email is verified now
UserModel user = getFederatedUser();
Assert.assertTrue(user.isEmailVerified());
}

View file

@ -158,6 +158,7 @@ locale_es=Espa\u00F1ol
locale_fr=Fran\u00e7ais
locale_it=Italian
locale_ja=\u65E5\u672C\u8A9E
locale_no=Norsk
locale_lt=Lietuvi\u0173
locale_pt-BR=Portugu\u00EAs (Brasil)
locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439

View file

@ -0,0 +1,163 @@
doSave=Lagre
doCancel=Avbryt
doLogOutAllSessions=Logg ut av alle sesjoner
doRemove=Fjern
doAdd=Legg til
doSignOut=Logg ut
editAccountHtmlTitle=Rediger konto
federatedIdentitiesHtmlTitle=Federerte identiteter
accountLogHtmlTitle=Kontologg
changePasswordHtmlTitle=Endre passord
sessionsHtmlTitle=Sesjoner
accountManagementTitle=Keycloak kontoadministrasjon
authenticatorTitle=Autentikator
applicationsHtmlTitle=Applikasjoner
authenticatorCode=Engangskode
email=E-post
firstName=Fornavn
givenName=Fornavn
fullName=Fullt navn
lastName=Etternavn
familyName=Etternavn
password=Passord
passwordConfirm=Bekreftelse
passwordNew=Nytt passord
username=Brukernavn
address=Adresse
street=Gate-/veinavn + husnummer
locality=By
region=Fylke
postal_code=Postnummer
country=Land
emailVerified=E-post bekreftet
gssDelegationCredential=GSS legitimasjonsdelegering
role_admin=Administrator
role_realm-admin=Administrator for sikkerhetsdomene
role_create-realm=Opprette sikkerhetsdomene
role_view-realm=Se sikkerhetsdomene
role_view-users=Se brukere
role_view-applications=Se applikasjoner
role_view-clients=Se klienter
role_view-events=Se hendelser
role_view-identity-providers=Se identitetsleverand\u00F8rer
role_manage-realm=Administrere sikkerhetsdomene
role_manage-users=Administrere brukere
role_manage-applications=Administrere applikasjoner
role_manage-identity-providers=Administrere identitetsleverand\u00F8rer
role_manage-clients=Administrere klienter
role_manage-events=Administrere hendelser
role_view-profile=Se profil
role_manage-account=Administrere konto
role_read-token=Lese token
role_offline-access=Frakoblet tilgang
role_uma_authorization=Skaffe tillatelser
client_account=Konto
client_security-admin-console=Sikkerhetsadministrasjonskonsoll
client_admin-cli=Kommandolinje-grensesnitt for administrator
client_realm-management=Sikkerhetsdomene-administrasjon
client_broker=Broker
requiredFields=Obligatoriske felt
allFieldsRequired=Alle felt m\u00E5 fylles ut
backToApplication=&laquo; Tilbake til applikasjonen
backTo=Tilbake til {0}
date=Dato
event=Hendelse
ip=IP
client=Klient
clients=Klienter
details=Detaljer
started=Startet
lastAccess=Sist benyttet
expires=Utl\u00F8per
applications=Applikasjoner
account=Konto
federatedIdentity=Federert identitet
authenticator=Autentikator
sessions=Sesjoner
log=Logg
application=Applikasjon
availablePermissions=Tilgjengelige rettigheter
grantedPermissions=Innvilgede rettigheter
grantedPersonalInfo=Innvilget personlig informasjon
additionalGrants=Ekstra rettigheter
action=Handling
inResource=i
fullAccess=Full tilgang
offlineToken=Offline token
revoke=Opphev rettighet
configureAuthenticators=Konfigurerte autentikatorer
mobile=Mobiltelefon
totpStep1=Installer <a href="https://fedorahosted.org/freeotp/" target="_blank">FreeOTP</a> eller Google Authenticator p\u00E5 din enhet. Begge applikasjoner er tilgjengelige p\u00E5 <a href="https://play.google.com">Google Play</a> og Apple App Store.
totpStep2=\u00C5pne applikasjonen og skann strekkoden eller skriv inn koden.
totpStep3=Skriv inn engangskoden gitt av applikasjonen og klikk Lagre for \u00E5 fullf\u00F8re.
missingUsernameMessage=Vennligst oppgi brukernavn.
missingFirstNameMessage=Vennligst oppgi fornavn.
invalidEmailMessage=Ugyldig e-postadresse.
missingLastNameMessage=Vennligst oppgi etternavn.
missingEmailMessage=Vennligst oppgi e-postadresse.
missingPasswordMessage=Vennligst oppgi passord.
notMatchPasswordMessage=Passordene er ikke like.
missingTotpMessage=Vennligst oppgi engangskode.
invalidPasswordExistingMessage=Ugyldig eksisterende passord.
invalidPasswordConfirmMessage=Passordene er ikke like.
invalidTotpMessage=Ugyldig engangskode.
usernameExistsMessage=Brukernavnet finnes allerede.
emailExistsMessage=E-postadressen finnes allerede.
readOnlyUserMessage=Du kan ikke oppdatere kontoen din ettersom den er skrivebeskyttet.
readOnlyPasswordMessage=Du kan ikke oppdatere passordet ditt ettersom kontoen din er skrivebeskyttet.
successTotpMessage=Autentikator for mobiltelefon er konfigurert.
successTotpRemovedMessage=Autentikator for mobiltelefon er fjernet.
successGrantRevokedMessage=Vellykket oppheving av rettighet.
accountUpdatedMessage=Kontoen din har blitt oppdatert.
accountPasswordUpdatedMessage=Ditt passord har blitt oppdatert.
missingIdentityProviderMessage=Identitetsleverand\u00F8r er ikke spesifisert.
invalidFederatedIdentityActionMessage=Ugyldig eller manglende handling.
identityProviderNotFoundMessage=Spesifisert identitetsleverand\u00F8r ikke funnet.
federatedIdentityLinkNotActiveMessage=Denne identiteten er ikke lenger aktiv.
federatedIdentityRemovingLastProviderMessage=Du kan ikke fjerne siste federerte identitet ettersom du ikke har et passord.
identityProviderRedirectErrorMessage=Redirect til identitetsleverand\u00F8r feilet.
identityProviderRemovedMessage=Fjerning av identitetsleverand\u00F8r var vellykket.
identityProviderAlreadyLinkedMessage=Federert identitet returnert av {0} er allerede koblet til en annen bruker.
staleCodeAccountMessage=Siden har utl\u00F8pt. Vennligst pr\u00F8v en gang til.
consentDenied=Samtykke avsl\u00E5tt.
accountDisabledMessage=Konto er deaktivert, kontakt administrator.
accountTemporarilyDisabledMessage=Konto er midlertidig deaktivert, kontakt administrator eller pr\u00F8v igjen senere.
invalidPasswordMinLengthMessage=Ugyldig passord: minimum lengde {0}.
invalidPasswordMinLowerCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sm\u00E5 bokstaver.
invalidPasswordMinDigitsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sifre.
invalidPasswordMinUpperCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} store bokstaver.
invalidPasswordMinSpecialCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} spesialtegn.
invalidPasswordNotUsernameMessage=Ugyldig passord: kan ikke v\u00E6re likt brukernavn.
invalidPasswordRegexPatternMessage=Ugyldig passord: tilfredsstiller ikke kravene for passord-m\u00F8nster.
invalidPasswordHistoryMessage=Ugyldig passord: kan ikke v\u00E6re likt noen av de {0} foreg\u00E5ende passordene.
locale_ca=Catal\u00E0
locale_de=Deutsch
locale_en=English
locale_es=Espa\u00F1ol
locale_fr=Fran\u00e7ais
locale_it=Italian
locale_ja=\u65E5\u672C\u8A9E
locale_no=Norsk
locale_pt-BR=Portugu\u00EAs (Brasil)
locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439

View file

@ -1 +1 @@
locales=ca,de,en,es,fr,it,ja,lt,pt-BR,ru
locales=ca,de,en,es,fr,it,ja,lt,no,pt-BR,ru

View file

@ -218,8 +218,8 @@ assertion-consumer-post-binding-url=Assertion Consumer Service POST Binding URL
assertion-consumer-post-binding-url.tooltip=SAML POST Binding URL for the client''s assertion consumer service (login responses). You can leave this blank if you do not have a URL for this binding.
assertion-consumer-redirect-binding-url=Assertion Consumer Service Redirect Binding URL
assertion-consumer-redirect-binding-url.tooltip=Assertion Consumer Service Redirect Binding URL
logout-service-binding-post-url=URL d''enlla\u00E7 SAML POST per a la desconnexi\u00F3
logout-service-binding-post-url.tooltip=URL d''enlla\u00E7 SAML POST per a la desconnexi\u00F3 \u00FAnica del client. Pots deixar-ho en blanc si est\u00E0s fent servir un enlla\u00E7 diferent.
logout-service-post-binding-url=URL d''enlla\u00E7 SAML POST per a la desconnexi\u00F3
logout-service-post-binding-url.tooltip=URL d''enlla\u00E7 SAML POST per a la desconnexi\u00F3 \u00FAnica del client. Pots deixar-ho en blanc si est\u00E0s fent servir un enlla\u00E7 diferent.
logout-service-redir-binding-url=URL d''enlla\u00E7 SAML de redirecci\u00F3 per a la desconnexi\u00F3
logout-service-redir-binding-url.tooltip=URL d''enlla\u00E7 SAML de redirecci\u00F3 per a la desconnexi\u00F3 \u00FAnica del client. Pots deixar-ho en blanc si est\u00E0s fent servir un enlla\u00E7 diferent.

View file

@ -248,8 +248,8 @@ assertion-consumer-post-binding-url=Assertion Consumer Service POST Binding URL
assertion-consumer-post-binding-url.tooltip=SAML POST Binding URL for the client's assertion consumer service (login responses). You can leave this blank if you do not have a URL for this binding.
assertion-consumer-redirect-binding-url=Assertion Consumer Service Redirect Binding URL
assertion-consumer-redirect-binding-url.tooltip=SAML Redirect Binding URL for the client's assertion consumer service (login responses). You can leave this blank if you do not have a URL for this binding.
logout-service-binding-post-url=Logout Service POST Binding URL
logout-service-binding-post-url.tooltip=SAML POST Binding URL for the client's single logout service. You can leave this blank if you are using a different binding
logout-service-post-binding-url=Logout Service POST Binding URL
logout-service-post-binding-url.tooltip=SAML POST Binding URL for the client's single logout service. You can leave this blank if you are using a different binding
logout-service-redir-binding-url=Logout Service Redirect Binding URL
logout-service-redir-binding-url.tooltip=SAML Redirect Binding URL for the client's single logout service. You can leave this blank if you are using a different binding.
@ -318,7 +318,7 @@ available-roles=Available Roles
add-selected=Add selected
associated-roles=Associated Roles
composite.associated-realm-roles.tooltip=Realm level roles associated with this composite role.
composite.available-realm-roles.tooltip=Realm level roles associated with this composite role.
composite.available-realm-roles.tooltip=Realm level roles that you can associate to this composite role.
remove-selected=Remove selected
client-roles=Client Roles
select-client-to-view-roles=Select client to view roles for client
@ -566,7 +566,7 @@ realm-default-roles.tooltip=Realm level roles assigned to new users.
default.available-roles-client.tooltip=Roles from this client that are assignable as a default.
client-default-roles=Client Default Roles
client-default-roles.tooltip=Roles from this client assigned as a default role.
composite.available-roles.tooltip=Realm level roles associated with this composite role.
composite.available-roles.tooltip=Realm level roles that you can associate to this composite role.
composite.associated-roles.tooltip=Realm level roles associated with this composite role.
composite.available-roles-client.tooltip=Roles from this client that you can associate to this composite role.
composite.associated-roles-client.tooltip=Client roles associated with this composite role.
@ -808,6 +808,7 @@ top-level-flow-type.tooltip=What kind of top level flow is it? Type 'client' is
create-execution-flow=Create Execution Flow
flow-type=Flow Type
flow.form.type=form
flow.generic.type=generic
flow-type.tooltip=What kind of form is it
form-provider=Form Provider
default-groups.tooltip=Newly created or registered users will automatically be added to these groups

View file

@ -218,8 +218,8 @@ assertion-consumer-post-binding-url=Assertion Consumer Service POST Binding URL
assertion-consumer-post-binding-url.tooltip=SAML POST Binding URL for the client''s assertion consumer service (login responses). You can leave this blank if you do not have a URL for this binding.
assertion-consumer-redirect-binding-url=Assertion Consumer Service Redirect Binding URL
assertion-consumer-redirect-binding-url.tooltip=Assertion Consumer Service Redirect Binding URL
logout-service-binding-post-url=URL de enlace SAML POST para la desconexi\u00F3n
logout-service-binding-post-url.tooltip=URL de enlace SAML POST para la desconexi\u00F3n \u00FAnica del cliente. Puedes dejar esto en blanco si est\u00E1s usando un enlace distinto.
logout-service-post-binding-url=URL de enlace SAML POST para la desconexi\u00F3n
logout-service-post-binding-url.tooltip=URL de enlace SAML POST para la desconexi\u00F3n \u00FAnica del cliente. Puedes dejar esto en blanco si est\u00E1s usando un enlace distinto.
logout-service-redir-binding-url=URL de enlace SAML de redirecci\u00F3n para la desconexi\u00F3n
logout-service-redir-binding-url.tooltip=URL de enlace SAML de redirecci\u00F3n para la desconexi\u00F3n \u00FAnica del cliente. Puedes dejar esto en blanco si est\u00E1s usando un enlace distinto.

File diff suppressed because it is too large Load diff

View file

@ -233,8 +233,8 @@ assertion-consumer-post-binding-url=\u0421\u0432\u044F\u0437\u044B\u0432\u0430\u
assertion-consumer-post-binding-url.tooltip=SAML POST \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 URL \u0434\u043B\u044F \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043E\u0432 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044F (\u0437\u0430\u043F\u0440\u043E\u0441\u044B \u0432\u0445\u043E\u0434\u0430). \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043F\u0443\u0441\u0442\u044B\u043C, \u0435\u0441\u043B\u0438 \u043D\u0435 \u0438\u043C\u0435\u0435\u0442\u0435 URL \u0434\u043B\u044F \u043E\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043B\u0435\u043D\u0438\u044F \u0442\u0430\u043A\u043E\u0439 \u0441\u0432\u044F\u0437\u043A\u0438.
assertion-consumer-redirect-binding-url=\u0421\u0432\u044F\u0437\u044B\u0432\u0430\u043D\u0438\u0435 URL \u043F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043E\u043C \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044F
assertion-consumer-redirect-binding-url.tooltip=SAML \u043F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u043D\u0430 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 URL \u0434\u043B\u044F \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u043E\u0433\u043E \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044F (\u0437\u0430\u043F\u0440\u043E\u0441\u044B \u0432\u0445\u043E\u0434\u0430). \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043F\u0443\u0441\u0442\u044B\u043C, \u0435\u0441\u043B\u0438 \u0432\u044B \u043D\u0435 \u0438\u043C\u0435\u0435\u0442\u0435 URL \u0434\u043B\u044F \u0442\u0430\u043A\u043E\u0433\u043E \u0441\u0432\u044F\u0437\u044B\u0432\u0430\u043D\u0438\u044F.
logout-service-binding-post-url=\u0421\u0432\u044F\u0437\u044B\u0432\u0430\u043D\u0438\u0435 URL \u0434\u043B\u044F \u0432\u044B\u0445\u043E\u0434\u0430 \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043B\u044F POST-\u043C\u0435\u0442\u043E\u0434\u0430
logout-service-binding-post-url.tooltip=SAML POST \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 URL \u0434\u043B\u044F \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u043E\u0433\u043E \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0435\u0434\u0438\u043D\u043E\u0433\u043E \u0432\u044B\u0445\u043E\u0434\u0430. \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043F\u0443\u0441\u0442\u044B\u043C, \u0435\u0441\u043B\u0438 \u0432\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0441\u0432\u044F\u0437\u0438
logout-service-post-binding-url=\u0421\u0432\u044F\u0437\u044B\u0432\u0430\u043D\u0438\u0435 URL \u0434\u043B\u044F \u0432\u044B\u0445\u043E\u0434\u0430 \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043B\u044F POST-\u043C\u0435\u0442\u043E\u0434\u0430
logout-service-post-binding-url.tooltip=SAML POST \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 URL \u0434\u043B\u044F \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u043E\u0433\u043E \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0435\u0434\u0438\u043D\u043E\u0433\u043E \u0432\u044B\u0445\u043E\u0434\u0430. \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043F\u0443\u0441\u0442\u044B\u043C, \u0435\u0441\u043B\u0438 \u0432\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0441\u0432\u044F\u0437\u0438
logout-service-redir-binding-url=\u0421\u0432\u044F\u0437\u044B\u0432\u0430\u043D\u0438\u0435 URL \u043F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0445\u043E\u0434\u0430 \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u0430
logout-service-redir-binding-url.tooltip=SAML \u043F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442 \u043D\u0430 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 URL \u0434\u043B\u044F \u0435\u0434\u0438\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0438 \u0432\u044B\u0445\u043E\u0434\u0430 \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043B\u044F \u043A\u043B\u0438\u0435\u043D\u0442\u043E\u0432. \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043F\u0443\u0441\u0442\u044B\u043C, \u0435\u0441\u043B\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0441\u0432\u044F\u0437\u0438.

View file

@ -0,0 +1,14 @@
invalidPasswordMinLengthMessage=Ugyldig passord: minimum lengde {0}.
invalidPasswordMinLowerCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minst {0} sm\u00E5 bokstaver.
invalidPasswordMinDigitsMessage=Ugyldig passord: m\u00E5 inneholde minst {0} sifre.
invalidPasswordMinUpperCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minst {0} store bokstaver.
invalidPasswordMinSpecialCharsMessage=Ugyldig passord: m\u00E5 inneholde minst {0} spesialtegn.
invalidPasswordNotUsernameMessage=Ugyldig passord: kan ikke v\u00E6re likt brukernavn.
invalidPasswordRegexPatternMessage=Ugyldig passord: tilfredsstiller ikke kravene for passord-m\u00F8nster.
invalidPasswordHistoryMessage=Ugyldig passord: kan ikke v\u00E6re likt noen av de {0} foreg\u00E5ende passordene.
ldapErrorInvalidCustomFilter=Tilpasset konfigurasjon av LDAP-filter starter ikke med "(" eller slutter ikke med ")".
ldapErrorMissingClientId=KlientID m\u00E5 v\u00E6re tilgjengelig i config n\u00E5r sikkerhetsdomenerollemapping ikke brukes.
ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType=Ikke mulig \u00E5 bevare gruppearv og samtidig bruke UID medlemskapstype.
ldapErrorCantWriteOnlyForReadOnlyLdap=Kan ikke sette write-only n\u00E5r LDAP leverand\u00F8r-modus ikke er WRITABLE
ldapErrorCantWriteOnlyAndReadOnly=Kan ikke sette b\u00E5de write-only og read-only

View file

@ -88,10 +88,10 @@
<select class="form-control" name="policy.config.scannerPeriodUnit"
data-ng-model="policy.config.scannerPeriodUnit"
ng-disabled="!policy.config.sessionName">
<option>{{:: 'seconds' | translate}}</option>
<option>{{:: 'minutes' | translate}}</option>
<option>{{:: 'hours' | translate}}</option>
<option>{{:: 'days' | translate}}</option>
<option value="Seconds">{{:: 'seconds' | translate}}</option>
<option value="Minutes">{{:: 'minutes' | translate}}</option>
<option value="Hours">{{:: 'hours' | translate}}</option>
<option value="Days">{{:: 'days' | translate}}</option>
</select>
</div>
<kc-tooltip>{{:: 'authz-policy-drools-update-period.tooltip' | translate}}</kc-tooltip>

View file

@ -19,10 +19,10 @@
max="31536000" data-ng-model="client.nodeReRegistrationTimeout"
id="nodeReRegistrationTimeout" name="nodeReRegistrationTimeout"/>
<select class="form-control" name="nodeReRegistrationTimeoutUnit" data-ng-model="client.nodeReRegistrationTimeoutUnit" >
<option data-ng-selected="!client.nodeReRegistrationTimeoutUnit">{{:: 'seconds' | translate}}</option>
<option>{{:: 'minutes' | translate}}</option>
<option>{{:: 'hours' | translate}}</option>
<option>{{:: 'days' | translate}}</option>
<option data-ng-selected="!client.nodeReRegistrationTimeoutUnit" value="Seconds">{{:: 'seconds' | translate}}</option>
<option value="Minutes">{{:: 'minutes' | translate}}</option>
<option value="Hours">{{:: 'hours' | translate}}</option>
<option value="Days">{{:: 'days' | translate}}</option>
</select>
</div>
</div>

View file

@ -232,7 +232,7 @@
<kc-tooltip>{{:: 'debug.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group" data-ng-show="instance.config.allowKerberosAuthentication">
<label class="col-md-2 control-label" for="debug">{{:: 'use-kerberos-for-password-authentication' | translate}} </label>
<label class="col-md-2 control-label" for="useKerberosForPasswordAuthentication">{{:: 'use-kerberos-for-password-authentication' | translate}} </label>
<div class="col-md-6">
<input ng-model="instance.config.useKerberosForPasswordAuthentication" id="useKerberosForPasswordAuthentication" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>

View file

@ -84,7 +84,8 @@
</button>
</div>
<div class="col-md-3">
<label class="control-label" for="client-composite">{{:: 'effective-roles' | translate}} <span tooltip-placement="right" tooltip-trigger="mouseover mouseout" tooltip="{{:: 'group.effective-roles-client.tooltip' | translate}}" class="fa fa-info-circle"></span></label>
<label class="control-label" for="client-composite">{{:: 'effective-roles' | translate}}</label>
<kc-tooltip>{{:: 'group.effective-roles-client.tooltip' | translate}}</kc-tooltip>
<select id="client-composite" class="form-control" multiple size=5
disabled="true"
ng-model="dummymodel"

View file

@ -46,10 +46,10 @@
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="resource">{{:: 'resource-path' | translate}}</label>
<kc-tooltip>{{:: 'resource-path.tooltip' | translate}}</kc-tooltip>
<div class="col-sm-4">
<input class="form-control" type="text" id="resource" name="resource" data-ng-model="query.resourcePath">
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'resource-path.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="dateFrom">{{:: 'date-(from)' | translate}}</label>

View file

@ -17,14 +17,12 @@
<fieldset class="border-top">
<div class="form-group">
<label class="col-md-2 control-label" for="eventsListeners" class="control-label">{{:: 'event-listeners' | translate}}</label>
<kc-tooltip>{{:: 'event-listeners.tooltip' | translate}}</kc-tooltip>
<div class="col-md-6">
<select ui-select2 ng-model="eventsConfig.eventsListeners" data-placeholder="{{:: 'select-an-action.placeholder' | translate}}" multiple>
<option ng-repeat="listener in eventListeners" value="{{listener}}">{{listener}}</option>
</select>
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'event-listeners.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
</fieldset>
@ -33,41 +31,37 @@
<div class="form-group">
<label class="col-md-2 control-label" for="enabled">{{:: 'save-events' | translate}}</label>
<kc-tooltip>{{:: 'login.save-events.tooltip' | translate}}</kc-tooltip>
<div class="col-md-6">
<input ng-model="eventsConfig.eventsEnabled" name="enabled" id="enabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'login.save-events.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
<div class="form-group" data-ng-show="eventsConfig.eventsEnabled">
<label class="col-md-2 control-label" for="enabledEventTypes" class="control-label">{{:: 'saved-types' | translate}}</label>
<kc-tooltip>{{:: 'saved-types.tooltip' | translate}}</kc-tooltip>
<div class="col-md-6">
<input ui-select2="eventSelectOptions" id="enabledEventTypes" ng-model="eventsConfig.enabledEventTypes" data-placeholder="{{:: 'select-event-types.placeholder' | translate}}"/>
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'saved-types.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
<div class="form-group" data-ng-show="access.manageEvents && eventsConfig.eventsEnabled">
<label class="col-md-2 control-label" for="password">{{:: 'clear-events' | translate}}</label>
<kc-tooltip>{{:: 'clear-events.tooltip' | translate}}</kc-tooltip>
<div class="col-md-6">
<button class="btn btn-danger" type="submit" data-ng-click="clearEvents()" >{{:: 'clear-events' | translate}}</button>
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'clear-events.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
<div class="form-group input-select" data-ng-show="eventsConfig.eventsEnabled">
<div class="form-group" data-ng-show="eventsConfig.eventsEnabled">
<label class="col-md-2 control-label" for="expiration">{{:: 'expiration' | translate}}</label>
<div class="col-md-6">
<kc-tooltip>{{:: 'events.expiration.tooltip' | translate}}</kc-tooltip>
<div class="col-md-6 time-selector">
<input class="form-control" type="number" data-ng-model="eventsConfig.eventsExpiration" id="expiration" name="expiration" min="0"/>
</div>
<div class="col-md-2 select-kc">
<select name="expirationUnit" data-ng-model="eventsConfig.expirationUnit" >
<option>{{:: 'minutes' | translate}}</option>
<option>{{:: 'hours' | translate}}</option>
<option>{{:: 'days' | translate}}</option>
<select class="form-control" name="expirationUnit" data-ng-model="eventsConfig.expirationUnit">
<option value="Minutes">{{:: 'minutes' | translate}}</option>
<option value="Hours">{{:: 'hours' | translate}}</option>
<option value="Days">{{:: 'days' | translate}}</option>
</select>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'events.expiration.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
</div>
</fieldset>
@ -78,28 +72,26 @@
<div class="form-group">
<label class="col-md-2 control-label" for="adminEventsEnabled">{{:: 'save-events' | translate}}</label>
<kc-tooltip>{{:: 'admin.save-events.tooltip' | translate}}</kc-tooltip>
<div class="col-md-6">
<input ng-model="eventsConfig.adminEventsEnabled" name="adminEventsEnabled" id="adminEventsEnabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'admin.save-events.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
<div class="form-group" data-ng-show="eventsConfig.adminEventsEnabled">
<label class="col-md-2 control-label" for="adminEventsDetailsEnabled">{{:: 'include-representation' | translate}}</label>
<kc-tooltip>{{:: 'include-representation.tooltip' | translate}}</kc-tooltip>
<div class="col-md-6">
<input ng-model="eventsConfig.adminEventsDetailsEnabled" name="adminEventsDetailsEnabled" id="adminEventsDetailsEnabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'include-representation.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
<div class="form-group" data-ng-show="access.manageEvents && eventsConfig.adminEventsEnabled">
<label class="col-md-2 control-label" for="password">{{:: 'clear-admin-events' | translate}}</label>
<kc-tooltip>{{:: 'clear-admin-events.tooltip' | translate}}</kc-tooltip>
<div class="col-md-6">
<button class="btn btn-danger" type="submit" data-ng-click="clearAdminEvents()" >{{:: 'clear-admin-events' | translate}}</button>
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'clear-admin-events.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
</fieldset>

View file

@ -118,13 +118,13 @@
</div>
<kc-tooltip>{{:: 'identity-provider.logout-url.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="backchannelSupported">{{:: 'backchannel-logout' | translate}}</label>
<div class="col-sm-4">
<input ng-model="identityProvider.config.backchannelSupported" id="backchannelSupported" onoffswitchvalue on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'backchannel-logout.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="backchannelSupported">{{:: 'backchannel-logout' | translate}}</label>
<div class="col-sm-4">
<input ng-model="identityProvider.config.backchannelSupported" id="backchannelSupported" onoffswitchvalue on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<kc-tooltip>{{:: 'backchannel-logout.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group clearfix">
<label class="col-md-2 control-label" for="userInfoUrl">{{:: 'user-info-url' | translate}}</label>
<div class="col-md-6">
@ -167,9 +167,9 @@
<select class="form-control" id="prompt" ng-model="identityProvider.config.prompt">
<option value="">{{:: 'unspecified.option' | translate}}</option>
<option value="none">{{:: 'none.option' | translate}}</option>
<option>{{:: 'consent.option' | translate}}</option>
<option>{{:: 'login.option' | translate}}</option>
<option>{{:: 'select-account.option' | translate}}</option>
<option value="consent">{{:: 'consent.option' | translate}}</option>
<option value="login">{{:: 'login.option' | translate}}</option>
<option value="select_account">{{:: 'select-account.option' | translate}}</option>
</select>
</div>
</div>

View file

@ -109,13 +109,13 @@
</div>
<kc-tooltip>{{:: 'saml.single-logout-service-url.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="backchannelSupported">{{:: 'backchannel-logout' | translate}}</label>
<div class="col-sm-4">
<input ng-model="identityProvider.config.backchannelSupported" id="backchannelSupported" onoffswitchvalue on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<span tooltip-trigger="mouseover mouseout" tooltip-placement="right" tooltip="{{:: 'backchannel-logout.tooltip' | translate}}" class="fa fa-info-circle"></span>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="backchannelSupported">{{:: 'backchannel-logout' | translate}}</label>
<div class="col-sm-4">
<input ng-model="identityProvider.config.backchannelSupported" id="backchannelSupported" onoffswitchvalue on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<kc-tooltip>{{:: 'backchannel-logout.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group clearfix">
<label class="col-md-2 control-label" for="nameIDPolicyFormat">{{:: 'nameid-policy-format' | translate}}</label>
<div class="col-md-6">

View file

@ -84,7 +84,8 @@
</button>
</div>
<div class="col-md-3">
<label class="control-label" for="client-composite">{{:: 'effective-roles' | translate}} <span tooltip-placement="right" tooltip-trigger="mouseover mouseout" tooltip="{{:: 'user.effective-roles-client.tooltip' | translate}}" class="fa fa-info-circle"></span></label>
<label class="control-label" for="client-composite">{{:: 'effective-roles' | translate}}</label>
<kc-tooltip>{{:: 'user.effective-roles-client.tooltip' | translate}}</kc-tooltip>
<select id="client-composite" class="form-control" multiple size=5
disabled="true"
ng-model="dummymodel"

View file

@ -1,2 +1,2 @@
import=common/keycloak
locales=ca,de,en,es,fr,it,ja,lt,pt-BR,ru
locales=ca,de,en,es,fr,it,ja,lt,no,pt-BR,ru

View file

@ -0,0 +1,24 @@
emailVerificationSubject=Bekreft e-postadresse
emailVerificationBody=Noen har opprettet en {2} konto med denne e-postadressen. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 bekrefte e-postadressen din\n\n{0}\n\nDenne lenken vil utl\u00F8pe om {1} minutter.\n\nHvis du ikke opprettet denne kontoen, vennligst ignorer denne meldingen.
emailVerificationBodyHtml=<p>Noen har opprettet en {2} konto med denne e-postadressen. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 bekrefte e-postadressen din</p><p><a href="{0}">{0}</a></p><p>Denne lenken vil utl\u00F8pe om {1} minutter.</p><p>Hvis du ikke opprettet denne kontoen, vennligst ignorer denne meldingen.</p>
identityProviderLinkSubject=Lenke {0}
identityProviderLinkBody=Noen vil koble din <b>{1}</b> konto med <b>{0}</b> konto til bruker {2}. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 koble kontoene\n\n{3}\n\nDenne lenken vil utl\u00F8pe om {4} minutter\n\nHvis du ikke vil koble kontoene, vennligst ignorer denne meldingen. Hvis du kobler kontoene sammen vil du kunne logge inn til {1} gjennom {0}.
identityProviderLinkBodyHtml=<p>Noen vil koble din <b>{1}</b> konto med <b>{0}</b> konto til bruker {2}. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 koble kontoene.</p><p><a href="{3}">{3}</a></p><p>Denne lenken vil utl\u00F8pe om {4} minutter.</p><p>Hvis du ikke vil koble kontoene, vennligst ignorer denne meldingen. Hvis du kobler kontoene sammen vil du kunne logge inn til {1} gjennom {0}.</p>
passwordResetSubject=Tilbakestill passord
passwordResetBody=Noen har bedt om \u00E5 endre innloggingsdetaljene til din konto {2}. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 tilbakestille dem.\n\n{0}\n\nDenne lenken vil utl\u00F8pe om {1} minutter.\n\nHvis du ikke vil tilbakestille din innloggingsdata, vennligst ignorer denne meldingen og ingenting vil bli endret.
passwordResetBodyHtml=<p>Noen har bedt om \u00E5 endre innloggingsdetaljene til din konto {2}. Hvis dette var deg, klikk p\u00E5 lenken nedenfor for \u00E5 tilbakestille dem.</p><p><a href="{0}">{0}</a></p><p>Denne lenken vil utl\u00F8pe om {1} minutter.</p><p>Hvis du ikke vil tilbakestille din innloggingsdata, vennligst ignorer denne meldingen og ingenting vil bli endret.</p>
executeActionsSubject=Oppdater kontoen din
executeActionsBody=Administrator har anmodet at du oppdaterer din {2} konto. Klikk p\u00E5 lenken nedenfor for \u00E5 starte denne prosessen\n\n{0}\n\nDenne lenken vil utl\u00F8pe om {1} minutter.\n\nHvis du ikke var klar over at administrator har bedt om dette, vennligst ignorer denne meldingen og ingenting vil bli endret.
executeActionsBodyHtml=<p>Administrator har anmodet at du oppdaterer din {2} konto. Klikk p\u00E5 linken nedenfor for \u00E5 starte denne prosessen.</p><p><a href="{0}">{0}</a></p><p>Denne lenken vil utl\u00F8pe om {1} minutter.</p><p>Hvis du ikke var klar over at administrator har bedt om dette, ignorer denne meldingen og ingenting vil bli endret. </p>
eventLoginErrorSubject=Innlogging feilet
eventLoginErrorBody=Et mislykket innloggingsfors\u00F8k ble oppdaget p\u00E5 din konto p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.
eventLoginErrorBodyHtml=<p>Et mislykket innloggingsfors\u00F8k ble oppdaget p\u00E5 din konto p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.</p>
eventRemoveTotpSubject=Fjern engangskode
eventRemoveTotpBody=Engangskode ble fjernet fra kontoen din p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.
eventRemoveTotpBodyHtml=<p>Engangskode ble fjernet fra kontoen din p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.</p>
eventUpdatePasswordSubject=Oppdater passord
eventUpdatePasswordBody=Ditt passord ble endret i {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.
eventUpdatePasswordBodyHtml=<p>Ditt passord ble endret i {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator. </p>
eventUpdateTotpSubject=Oppdater engangskode
eventUpdateTotpBody=Engangskode ble oppdatert for kontoen din p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.
eventUpdateTotpBodyHtml=<p>Engangskode ble oppdatert for kontoen din p\u00E5 {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator. </p>

View file

@ -1 +1 @@
locales=ca,de,en,es,fr,it,ja,lt,pt-BR,ru
locales=ca,de,en,es,fr,it,ja,lt,no,pt-BR,ru

View file

@ -8,7 +8,7 @@
<form id="kc-reset-password-form" class="${properties.kcFormClass!}" action="${url.loginAction}" method="post">
<div class="${properties.kcFormGroupClass!}">
<div class="${properties.kcLabelWrapperClass!}">
<label for="username" class="${properties.kcLabelClass!}">${msg("usernameOrEmail")}</label>
<label for="username" class="${properties.kcLabelClass!}"><#if !realm.registrationEmailAsUsername>${msg("usernameOrEmail")}<#else>${msg("email")}</#if></label>
</div>
<div class="${properties.kcInputWrapperClass!}">
<input type="text" id="username" name="username" class="${properties.kcInputClass!}" autofocus/>
@ -30,4 +30,4 @@
<#elseif section = "info" >
${msg("emailInstruction")}
</#if>
</@layout.registrationLayout>
</@layout.registrationLayout>

View file

@ -215,6 +215,7 @@ locale_es=Espa\u00F1ol
locale_fr=Fran\u00e7ais
locale_it=Italian
locale_ja=\u65E5\u672C\u8A9E
locale_no=Norsk
locale_pt_BR=Portugu\u00EAs (Brasil)
locale_pt-BR=Portugu\u00EAs (Brasil)
locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439
@ -227,4 +228,4 @@ clientDisabledMessage=Client disabled.
invalidParameterMessage=Invalid parameter\: {0}
alreadyLoggedIn=You are already logged in.
p3pPolicy=CP="This is not a P3P policy!"
p3pPolicy=CP="This is not a P3P policy!"

View file

@ -0,0 +1,229 @@
doLogIn=Logg inn
doRegister=Registrer deg
doCancel=Avbryt
doSubmit=Send inn
doYes=Ja
doNo=Nei
doContinue=Fortsett
doAccept=Aksepter
doDecline=Avsl\u00E5
doForgotPassword=Glemt passord?
doClickHere=Klikk her
doImpersonate=Utgi deg for \u00E5 v\u00E6re en annen bruker
kerberosNotConfigured=Kerberos er ikke konfigurert
kerberosNotConfiguredTitle=Kerberos er ikke konfigurert
bypassKerberosDetail=Enten er du ikke logget inn via Kerberos eller s\u00E5 st\u00F8tter ikke nettleseren innlogging med Kerberos. Vennligst klikk Fortsett for \u00E5 logge inn p\u00E5 andre m\u00E5ter
kerberosNotSetUp=Kerberos er ikke konfigurert. Du kan ikke logge inn.
registerWithTitle=Registrer deg med {0}
registerWithTitleHtml={0}
loginTitle=Logg inn p\u00E5 {0}
loginTitleHtml={0}
impersonateTitle={0} Gi deg ut for \u00E5 v\u00E6re en annen bruker
impersonateTitleHtml=<strong>{0} Gi deg ut for \u00E5 v\u00E6re en annen bruker</strong>
realmChoice=Sikkerhetsdomene
unknownUser=Ukjent bruker
loginTotpTitle=Konfigurer autentifikator for mobil
loginProfileTitle=Oppdater konto
loginTimeout=Du brukte for lang tid p\u00E5 \u00E5 logge inn. Vennligst pr\u00F8v igjen.
oauthGrantTitle=Gi tilgang
oauthGrantTitleHtml={0}
errorTitle=Vi beklager...
errorTitleHtml=Vi <strong>beklager</strong> ...
emailVerifyTitle=E-postbekreftelse
emailForgotTitle=Glemt passord?
updatePasswordTitle=Oppdater passord
codeSuccessTitle=Suksesskode
codeErrorTitle=Feilkode\: {0}
termsTitle=Vilk\u00E5r og betingelser
termsTitleHtml=Vilk\u00E5r og betingelser
termsText=<p>Vilk\u00E5r og betingelser kommer</p>
recaptchaFailed=Ugyldig Bildebekreftelse
recaptchaNotConfigured=Bildebekreftelse er p\u00E5krevet, men er ikke konfigurert
consentDenied=Samtykke avsl\u00E5tt.
noAccount=Ny bruker?
username=Brukernavn
usernameOrEmail=Brukernavn eller e-postadresse
firstName=Fornavn
givenName=Fornavn
fullName=Fullstendig navn
lastName=Etternavn
familyName=Etternavn
email=E-postadresse
password=Passord
passwordConfirm=Bekreft passord
passwordNew=Nytt passord
passwordNewConfirm=Bekreft nytt Passord
rememberMe=Husk meg
authenticatorCode=Engangskode
address=Adresse
street=Gate-/veinavn + husnummer
locality=By
region=Fylke
postal_code=Postnummer
country=Land
emailVerified=E-postadresse bekreftet
gssDelegationCredential=GSS legitimasjons-delegering
loginTotpStep1=Installer <a href="https://fedorahosted.org/freeotp/" target="_blank">FreeOTP</a> eller Google Authenticator p\u00E5 din mobiltelefon. Begge applikasjoner er tilgjengelige p\u00E5 <a href="https://play.google.com">Google Play</a> og Apple App Store.
loginTotpStep2=\u00C5pne applikasjonen og skann strekkoden eller skriv inn koden
loginTotpStep3=Skriv inn engangskoden fra applikasjonen og klikk send inn for \u00E5 fullf\u00F8re
loginTotpOneTime=Engangskode
oauthGrantRequest=Vil du gi disse tilgangsrettighetene?
inResource=i
emailVerifyInstruction1=En e-post med instruksjoner for \u00E5 bekrefte din e-postadresse har blitt sendt til deg.
emailVerifyInstruction2=Ikke mottatt en bekreftelseskode i e-posten vi sendte til deg?
emailVerifyInstruction3=for \u00E5 sende e-post p\u00E5 nytt.
emailLinkIdpTitle=Lenke {0}
emailLinkIdp1=En e-post med instruksjoner for \u00E5 koble {0} konto med din {2} konto har blitt sendt til deg.
emailLinkIdp2=Ikke mottatt en bekreftelseskode i e-posten vi sendte til deg?
emailLinkIdp3=for \u00E5 sende e-post p\u00E5 nytt.
backToLogin=&laquo; Tilbake til innlogging
emailInstruction=Skriv inn e-postadressen din og vi vil sende deg instruksjoner for hvordan du oppretter et nytt passord.
copyCodeInstruction=Vennligst kopier denne koden og lim den inn i applikasjonen din:
personalInfo=Personlig informasjon:
role_admin=Administrator
role_realm-admin=Administrator for sikkerhetsdomene
role_create-realm=Opprette sikkerhetsdomene
role_create-client=Opprette klient
role_view-realm=Se sikkerhetsdomene
role_view-users=Se brukere
role_view-applications=Se applikasjoner
role_view-clients=Se klienter
role_view-events=Se hendelser
role_view-identity-providers=Se identitetsleverand\u00F8rer
role_manage-realm=Administrere sikkerhetsdomene
role_manage-users=Administrere brukere
role_manage-applications=Administrere applikasjoner
role_manage-identity-providers=Administrere identitetsleverand\u00F8rer
role_manage-clients=Administrere klienter
role_manage-events=Administrere hendelser
role_view-profile=Se profil
role_manage-account=Administrere konto
role_read-token=Lese token
role_offline-access=Frakoblet tilgang
role_uma_authorization=Skaffe tillatelser
client_account=Konto
client_security-admin-console=Sikkerthetsadministrasjonskonsoll
client_realm-management=Sikkerhetsdomene-administrasjon
client_broker=Broker
invalidUserMessage=Ugyldig brukernavn eller passord.
invalidEmailMessage=Ugyldig e-postadresse.
accountDisabledMessage=Konto er deaktivert, kontakt administrator.
accountTemporarilyDisabledMessage=Konto er midlertidig deaktivert, kontakt administrator eller pr\u00F8v p\u00E5 nytt senere.
expiredCodeMessage=Login ble tidsavbrutt. Vennligst logg inn p\u00E5 nytt.
missingFirstNameMessage=Vennligst oppgi fornavn.
missingLastNameMessage=Vennligst oppgi etternavn.
missingEmailMessage=Vennligst oppgi e-postadresse.
missingUsernameMessage=Vennligst oppgi brukernavn.
missingPasswordMessage=Vennligst oppgi passord.
missingTotpMessage=Vennligst oppgi autentiseringskode.
notMatchPasswordMessage=Passordene er ikke like.
invalidPasswordExistingMessage=Ugyldig eksisterende passord.
invalidPasswordConfirmMessage=Passord er ikke like.
invalidTotpMessage=Ugyldig engangskode.
usernameExistsMessage=Brukernavnet finnes allerede.
emailExistsMessage=E-post finnes allerede.
federatedIdentityExistsMessage=Bruker med {0} {1} finnes allerede. Vennligst logg inn p\u00E5 kontoadministratsjon for \u00E5 koble sammen kontoene.
confirmLinkIdpTitle=Kontoen finnes allerede
federatedIdentityConfirmLinkMessage=Bruker med {0} {1} finnes allerede. Hvordan vil du fortsette?
federatedIdentityConfirmReauthenticateMessage=Bekreft at du er {0} for \u00E5 koble din konto med {1}
confirmLinkIdpReviewProfile=Se over og bekreft profil
confirmLinkIdpContinue=Legg til eksisterende konto
configureTotpMessage=Du m\u00E5 sette opp en engangskode-generator for \u00E5 aktivere konto.
updateProfileMessage=Du m\u00E5 oppdatere brukerprofilen din for \u00E5 aktivere konto.
updatePasswordMessage=Du m\u00E5 skifte passord for \u00E5 aktivere kontoen din.
verifyEmailMessage=Du m\u00E5 bekrefte e-postadressen din for \u00E5 aktivere konto.
linkIdpMessage=You need to verify your email address to link your account with {0}.
emailSentMessage=Du vil straks motta en e-post med ytterlige instruksjoner.
emailSendErrorMessage=Mislyktes \u00E5 sende e-post, vennligst pr\u00F8v igjen senere.
accountUpdatedMessage=Din konto har blitt oppdatert.
accountPasswordUpdatedMessage=Ditt passord har blitt oppdatert.
noAccessMessage=Ingen tilgang
invalidPasswordMinLengthMessage=Ugyldig passord: minimum lengde {0}.
invalidPasswordMinDigitsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sifre.
invalidPasswordMinLowerCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sm\u00E5 bokstaver.
invalidPasswordMinUpperCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} store bokstaver.
invalidPasswordMinSpecialCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} spesialtegn.
invalidPasswordNotUsernameMessage=Ugyldig passord: kan ikke v\u00E6re likt brukernavn.
invalidPasswordRegexPatternMessage=Ugyldig passord: tilfredsstiller ikke kravene for passord-m\u00F8nster.
invalidPasswordHistoryMessage=Ugyldig passord: kan ikke v\u00E6re likt noen av de {0} foreg\u00E5ende passordene.
failedToProcessResponseMessage=Kunne ikke behandle svar
httpsRequiredMessage=HTTPS p\u00E5krevd
realmNotEnabledMessage=Sikkerhetsdomene er ikke aktivert
invalidRequestMessage=Ugyldig foresp\u00F8rsel
failedLogout=Utlogging feilet
unknownLoginRequesterMessage=Ukjent anmoder for innlogging
loginRequesterNotEnabledMessage=Anmoder for innlogging er ikke aktivert
bearerOnlyMessage=Bearer-only applikasjoner har ikke lov til \u00E5 initiere innlogging via nettleser
standardFlowDisabledMessage=Klienten har ikke lov til \u00E5 initiere innlogging via nettleser med gitt response_type. Standard flow er deaktivert for denne klienten.
implicitFlowDisabledMessage=Klienten har ikke lov til \u00E5 initiere innlogging via nettleser med gitt response_type. Implicit flow er deaktivert for denne klienten.
invalidRedirectUriMessage=Ugyldig redirect uri
unsupportedNameIdFormatMessage=NameIDFormat er ikke st\u00F8ttet
invalidRequesterMessage=Ugyldig sender av foresp\u00F8rsel
registrationNotAllowedMessage=Registrering er ikke lov
resetCredentialNotAllowedMessage=Tilbakestilling av innloggingsdata er ikke lov
permissionNotApprovedMessage=Tillatelse ikke godkjent.
noRelayStateInResponseMessage=Ingen relay state i svar fra identitetsleverand\u00F8r.
insufficientPermissionMessage=Utilstrekkelige rettigheter for \u00E5 koble identiteter.
couldNotProceedWithAuthenticationRequestMessage=Kunne ikke g\u00E5 videre med autentiseringsforesp\u00F8rsel til identitetsleverand\u00F8r.
couldNotObtainTokenMessage=Klarte ikke \u00E5 innhente token fra identitetsleverand\u00F8r.
unexpectedErrorRetrievingTokenMessage=Uventet feil ved henting av token fra identitetsleverand\u00F8r.
unexpectedErrorHandlingResponseMessage=Uventet feil ved h\u00E5ndtering av svar fra identitetsleverand\u00F8r.
identityProviderAuthenticationFailedMessage=Autentisering feilet. Kunne ikke autentisere med identitetsleverand\u00F8r.
identityProviderDifferentUserMessage= Autentisert som {0}, men forventet \u00E5 bli identifisert som {1}
couldNotSendAuthenticationRequestMessage=Kunne ikke sende autentiseringsforesp\u00F8rsel til identitetsleverand\u00F8r.
unexpectedErrorHandlingRequestMessage=Uventet feil ved h\u00E5ndtering av autentiseringsforesp\u00F8rsel til identitetsleverand\u00F8r.
invalidAccessCodeMessage=Ugyldig tilgangskode.
sessionNotActiveMessage=Sesjonen er ikke aktiv.
invalidCodeMessage=En feil oppstod, vennligst logg inn p\u00E5 nytt i din applikasjon.
identityProviderUnexpectedErrorMessage=Uventet feil ved autentisering med identitetsleverand\u00F8r
identityProviderNotFoundMessage=Kunne ikke finne en identitetsleverand\u00F8r med identifikatoren.
identityProviderLinkSuccess=Din konto ble suksessfullt koblet med {0} konto {1}.
staleCodeMessage=Denne siden er ikke lenger gyldig. Vennligst g\u00E5 tilbake til applikasjonen din og logg inn p\u00E5 nytt.
realmSupportsNoCredentialsMessage=Sikkerhetsdomene st\u00F8tter ingen legitimasjonstyper.
identityProviderNotUniqueMessage=Sikkerhetsdomene st\u00F8tter flere identitetsleverand\u00F8rer. Kunne ikke avgj\u00F8re hvilken identitetsleverand\u00F8r som burde brukes for autentisering.
emailVerifiedMessage=Din e-postadresse har blitt verifisert.
staleEmailVerificationLink=Lenken du klikket er utg\u00E5tt og er ikke lenger gyldig. Har du kanskje allerede bekreftet e-postadressen din?
locale_ca=Catal\u00E0
locale_de=Deutsch
locale_en=English
locale_es=Espa\u00F1ol
locale_fr=Fran\u00e7ais
locale_it=Italian
locale_ja=\u65E5\u672C\u8A9E
locale_no=Norsk
locale_pt_BR=Portugu\u00EAs (Brasil)
locale_pt-BR=Portugu\u00EAs (Brasil)
locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439
backToApplication=&laquo; Tilbake til applikasjonen
missingParameterMessage=Manglende parameter\: {0}
clientNotFoundMessage=Klient ikke funnet.
clientDisabledMessage=Klient deaktivert.
invalidParameterMessage=Ugyldig parameter\: {0}
alreadyLoggedIn=Du er allerede innlogget.
p3pPolicy=CP="Dette er ikke en P3P policy!"

View file

@ -1 +1 @@
locales=ca,de,en,es,fr,it,ja,lt,pt-BR,ru
locales=ca,de,en,es,fr,it,ja,lt,no,pt-BR,ru