Rebased MongoDB on top of latest master. Divide testsuite into integration and performance submodules

This commit is contained in:
mposolda 2013-10-09 19:41:59 +02:00
parent ae4bd42ff7
commit 71cd9cffa4
115 changed files with 1098 additions and 701 deletions

View file

@ -0,0 +1,15 @@
package org.keycloak.models.utils;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class KeycloakSessionUtils {
private static AtomicLong counter = new AtomicLong(1);
public static String generateId() {
return counter.getAndIncrement() + "-" + System.currentTimeMillis();
}
}

View file

@ -4,7 +4,7 @@
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.0-alpha-1</version> <version>1.0-alpha-1</version>
<relativePath>../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

77
model/mongo/pom.xml Normal file
View file

@ -0,0 +1,77 @@
<?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>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-alpha-1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-model-mongo</artifactId>
<name>Keycloak Model Mongo</name>
<description/>
<dependencies>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-common</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-idm-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api; package org.keycloak.models.mongo.api;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api; package org.keycloak.models.mongo.api;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api; package org.keycloak.models.mongo.api;
import java.util.Map; import java.util.Map;

View file

@ -1,9 +1,9 @@
package org.keycloak.services.models.nosql.api; package org.keycloak.models.mongo.api;
import java.util.List; import java.util.List;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.nosql.api.query.NoSQLQueryBuilder; import org.keycloak.models.mongo.api.query.NoSQLQueryBuilder;
import org.picketlink.common.properties.Property; import org.picketlink.common.properties.Property;
/** /**

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api; package org.keycloak.models.mongo.api;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Inherited; import java.lang.annotation.Inherited;

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api; package org.keycloak.models.mongo.api;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api; package org.keycloak.models.mongo.api;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api; package org.keycloak.models.mongo.api;
/** /**
* Base interface for object, which is persisted in NoSQL database * Base interface for object, which is persisted in NoSQL database

View file

@ -1,7 +1,6 @@
package org.keycloak.services.models.nosql.api.query; package org.keycloak.models.mongo.api.query;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api.query; package org.keycloak.models.mongo.api.query;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api.types; package org.keycloak.models.mongo.api.types;
/** /**
* SPI object to convert object from application type to database type and vice versa. Shouldn't be directly used by application. * SPI object to convert object from application type to database type and vice versa. Shouldn't be directly used by application.

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.api.types; package org.keycloak.models.mongo.api.types;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.impl; package org.keycloak.models.mongo.impl;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
@ -14,23 +14,23 @@ import com.mongodb.DBCollection;
import com.mongodb.DBCursor; import com.mongodb.DBCursor;
import com.mongodb.DBObject; import com.mongodb.DBObject;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.jboss.resteasy.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId; import org.keycloak.models.mongo.api.NoSQLId;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.api.NoSQLObject;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.nosql.api.query.NoSQLQueryBuilder; import org.keycloak.models.mongo.api.query.NoSQLQueryBuilder;
import org.keycloak.services.models.nosql.api.types.Converter; import org.keycloak.models.mongo.api.types.Converter;
import org.keycloak.services.models.nosql.api.types.TypeConverter; import org.keycloak.models.mongo.api.types.TypeConverter;
import org.keycloak.services.models.nosql.impl.types.EnumToStringConverter; import org.keycloak.models.mongo.impl.types.EnumToStringConverter;
import org.keycloak.services.models.nosql.impl.types.ListConverter; import org.keycloak.models.mongo.impl.types.ListConverter;
import org.keycloak.services.models.nosql.impl.types.BasicDBListConverter; import org.keycloak.models.mongo.impl.types.BasicDBListConverter;
import org.keycloak.services.models.nosql.impl.types.BasicDBObjectConverter; import org.keycloak.models.mongo.impl.types.BasicDBObjectConverter;
import org.keycloak.services.models.nosql.impl.types.NoSQLObjectConverter; import org.keycloak.models.mongo.impl.types.NoSQLObjectConverter;
import org.keycloak.services.models.nosql.impl.types.SimpleConverter; import org.keycloak.models.mongo.impl.types.SimpleConverter;
import org.keycloak.services.models.nosql.impl.types.StringToEnumConverter; import org.keycloak.models.mongo.impl.types.StringToEnumConverter;
import org.picketlink.common.properties.Property; import org.picketlink.common.properties.Property;
import org.picketlink.common.properties.query.AnnotatedPropertyCriteria; import org.picketlink.common.properties.query.AnnotatedPropertyCriteria;
import org.picketlink.common.properties.query.PropertyQueries; import org.picketlink.common.properties.query.PropertyQueries;

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.impl; package org.keycloak.models.mongo.impl;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
@ -6,7 +6,7 @@ import java.util.List;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.keycloak.services.models.nosql.api.query.NoSQLQueryBuilder; import org.keycloak.models.mongo.api.query.NoSQLQueryBuilder;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.impl; package org.keycloak.models.mongo.impl;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -6,7 +6,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.api.NoSQLObject;
import org.picketlink.common.properties.Property; import org.picketlink.common.properties.Property;
/** /**

View file

@ -1,11 +1,11 @@
package org.keycloak.services.models.nosql.impl.types; package org.keycloak.models.mongo.impl.types;
import java.util.ArrayList; import java.util.ArrayList;
import com.mongodb.BasicDBList; import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import org.keycloak.services.models.nosql.api.types.Converter; import org.keycloak.models.mongo.api.types.Converter;
import org.keycloak.services.models.nosql.api.types.TypeConverter; import org.keycloak.models.mongo.api.types.TypeConverter;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,13 +1,13 @@
package org.keycloak.services.models.nosql.impl.types; package org.keycloak.models.mongo.impl.types;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import org.jboss.resteasy.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.services.models.nosql.api.AttributedNoSQLObject; import org.keycloak.models.mongo.api.AttributedNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.api.NoSQLObject;
import org.keycloak.services.models.nosql.api.types.Converter; import org.keycloak.models.mongo.api.types.Converter;
import org.keycloak.services.models.nosql.api.types.TypeConverter; import org.keycloak.models.mongo.api.types.TypeConverter;
import org.keycloak.services.models.nosql.impl.MongoDBImpl; import org.keycloak.models.mongo.impl.MongoDBImpl;
import org.keycloak.services.models.nosql.impl.ObjectInfo; import org.keycloak.models.mongo.impl.ObjectInfo;
import org.picketlink.common.properties.Property; import org.picketlink.common.properties.Property;
import org.picketlink.common.reflection.Types; import org.picketlink.common.reflection.Types;

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.impl.types; package org.keycloak.models.mongo.impl.types;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;

View file

@ -1,6 +1,6 @@
package org.keycloak.services.models.nosql.impl.types; package org.keycloak.models.mongo.impl.types;
import org.keycloak.services.models.nosql.api.types.Converter; import org.keycloak.models.mongo.api.types.Converter;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,11 +1,11 @@
package org.keycloak.services.models.nosql.impl.types; package org.keycloak.models.mongo.impl.types;
import java.util.List; import java.util.List;
import com.mongodb.BasicDBList; import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import org.keycloak.services.models.nosql.api.types.Converter; import org.keycloak.models.mongo.api.types.Converter;
import org.keycloak.services.models.nosql.api.types.TypeConverter; import org.keycloak.models.mongo.api.types.TypeConverter;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,18 +1,16 @@
package org.keycloak.services.models.nosql.impl.types; package org.keycloak.models.mongo.impl.types;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Map; import java.util.Map;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import org.keycloak.services.models.nosql.api.AttributedNoSQLObject; import org.keycloak.models.mongo.api.AttributedNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.api.NoSQLObject;
import org.keycloak.services.models.nosql.api.types.Converter; import org.keycloak.models.mongo.api.types.Converter;
import org.keycloak.services.models.nosql.api.types.TypeConverter; import org.keycloak.models.mongo.api.types.TypeConverter;
import org.keycloak.services.models.nosql.impl.MongoDBImpl; import org.keycloak.models.mongo.impl.MongoDBImpl;
import org.keycloak.services.models.nosql.impl.ObjectInfo; import org.keycloak.models.mongo.impl.ObjectInfo;
import org.picketlink.common.properties.Property; import org.picketlink.common.properties.Property;
import org.picketlink.common.reflection.Types;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,6 +1,6 @@
package org.keycloak.services.models.nosql.impl.types; package org.keycloak.models.mongo.impl.types;
import org.keycloak.services.models.nosql.api.types.Converter; import org.keycloak.models.mongo.api.types.Converter;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,6 +1,6 @@
package org.keycloak.services.models.nosql.impl.types; package org.keycloak.models.mongo.impl.types;
import org.keycloak.services.models.nosql.api.types.Converter; import org.keycloak.models.mongo.api.types.Converter;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,18 +1,18 @@
package org.keycloak.services.models.nosql.keycloak.adapters; package org.keycloak.models.mongo.keycloak.adapters;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.keycloak.services.models.ApplicationModel; import org.keycloak.models.ApplicationModel;
import org.keycloak.services.models.RoleModel; import org.keycloak.models.RoleModel;
import org.keycloak.services.models.UserModel; import org.keycloak.models.UserModel;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.nosql.keycloak.data.ApplicationData; import org.keycloak.models.mongo.keycloak.data.ApplicationData;
import org.keycloak.services.models.nosql.keycloak.data.RoleData; import org.keycloak.models.mongo.keycloak.data.RoleData;
import org.keycloak.services.models.nosql.keycloak.data.UserData; import org.keycloak.models.mongo.keycloak.data.UserData;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@ -30,12 +30,12 @@ public class ApplicationAdapter implements ApplicationModel {
} }
@Override @Override
public void updateResource() { public void updateApplication() {
noSQL.saveObject(application); noSQL.saveObject(application);
} }
@Override @Override
public UserModel getResourceUser() { public UserModel getApplicationUser() {
// This is not thread-safe. Assumption is that ApplicationAdapter instance is per-client object // This is not thread-safe. Assumption is that ApplicationAdapter instance is per-client object
if (resourceUser == null) { if (resourceUser == null) {
resourceUser = noSQL.loadObject(UserData.class, application.getResourceUserId()); resourceUser = noSQL.loadObject(UserData.class, application.getResourceUserId());
@ -89,6 +89,16 @@ public class ApplicationAdapter implements ApplicationModel {
application.setManagementUrl(url); application.setManagementUrl(url);
} }
@Override
public void setBaseUrl(String url) {
application.setBaseUrl(url);
}
@Override
public String getBaseUrl() {
return application.getBaseUrl();
}
@Override @Override
public RoleAdapter getRole(String name) { public RoleAdapter getRole(String name) {
NoSQLQuery query = noSQL.createQueryBuilder() NoSQLQuery query = noSQL.createQueryBuilder()
@ -103,6 +113,22 @@ public class ApplicationAdapter implements ApplicationModel {
} }
} }
@Override
public RoleModel getRoleById(String id) {
RoleData role = noSQL.loadObject(RoleData.class, id);
if (role == null) {
return null;
} else {
return new RoleAdapter(role, noSQL);
}
}
@Override
public void grantRole(UserModel user, RoleModel role) {
UserData userData = ((UserAdapter)user).getUser();
noSQL.pushItemToList(userData, "roleIds", role.getId());
}
@Override @Override
public RoleAdapter addRole(String name) { public RoleAdapter addRole(String name) {
if (getRole(name) != null) { if (getRole(name) != null) {
@ -132,17 +158,21 @@ public class ApplicationAdapter implements ApplicationModel {
return result; return result;
} }
@Override // Static so that it can be used from RealmAdapter as well
public Set<String> getRoleMappings(UserModel user) { static List<RoleData> getAllRolesOfUser(UserModel user, NoSQL noSQL) {
UserData userData = ((UserAdapter)user).getUser(); UserData userData = ((UserAdapter)user).getUser();
List<String> roleIds = userData.getRoleIds(); List<String> roleIds = userData.getRoleIds();
Set<String> result = new HashSet<String>();
NoSQLQuery query = noSQL.createQueryBuilder() NoSQLQuery query = noSQL.createQueryBuilder()
.inCondition("_id", roleIds) .inCondition("_id", roleIds)
.build(); .build();
List<RoleData> roles = noSQL.loadObjects(RoleData.class, query); return noSQL.loadObjects(RoleData.class, query);
}
@Override
public Set<String> getRoleMappingValues(UserModel user) {
Set<String> result = new HashSet<String>();
List<RoleData> roles = getAllRolesOfUser(user, noSQL);
// TODO: Maybe improve as currently we need to obtain all roles and then filter programmatically... // TODO: Maybe improve as currently we need to obtain all roles and then filter programmatically...
for (RoleData role : roles) { for (RoleData role : roles) {
if (getId().equals(role.getApplicationId())) { if (getId().equals(role.getApplicationId())) {
@ -153,23 +183,42 @@ public class ApplicationAdapter implements ApplicationModel {
} }
@Override @Override
public void addScope(UserModel agent, String roleName) { public List<RoleModel> getRoleMappings(UserModel user) {
List<RoleModel> result = new ArrayList<RoleModel>();
List<RoleData> roles = getAllRolesOfUser(user, noSQL);
// TODO: Maybe improve as currently we need to obtain all roles and then filter programmatically...
for (RoleData role : roles) {
if (getId().equals(role.getApplicationId())) {
result.add(new RoleAdapter(role, noSQL));
}
}
return result;
}
@Override
public void deleteRoleMapping(UserModel user, RoleModel role) {
UserData userData = ((UserAdapter)user).getUser();
noSQL.pullItemFromList(userData, "roleIds", role.getId());
}
@Override
public void addScopeMapping(UserModel agent, String roleName) {
RoleAdapter role = getRole(roleName); RoleAdapter role = getRole(roleName);
if (role == null) { if (role == null) {
throw new RuntimeException("Role not found"); throw new RuntimeException("Role not found");
} }
addScope(agent, role); addScopeMapping(agent, role);
} }
@Override @Override
public void addScope(UserModel agent, RoleModel role) { public void addScopeMapping(UserModel agent, RoleModel role) {
UserData userData = ((UserAdapter)agent).getUser(); UserData userData = ((UserAdapter)agent).getUser();
noSQL.pushItemToList(userData, "scopeIds", role.getId()); noSQL.pushItemToList(userData, "scopeIds", role.getId());
} }
@Override @Override
public Set<String> getScope(UserModel agent) { public Set<String> getScopeMapping(UserModel agent) {
UserData userData = ((UserAdapter)agent).getUser(); UserData userData = ((UserAdapter)agent).getUser();
List<String> scopeIds = userData.getScopeIds(); List<String> scopeIds = userData.getScopeIds();

View file

@ -1,27 +1,24 @@
package org.keycloak.services.models.nosql.keycloak.adapters; package org.keycloak.models.mongo.keycloak.adapters;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import com.mongodb.DB; import com.mongodb.DB;
import com.mongodb.MongoClient; import com.mongodb.MongoClient;
import org.jboss.resteasy.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.services.managers.RealmManager; import org.keycloak.models.KeycloakSession;
import org.keycloak.services.models.KeycloakSession; import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.services.models.KeycloakSessionFactory; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.keycloak.data.ApplicationData;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.keycloak.data.OAuthClientData;
import org.keycloak.services.models.nosql.api.query.NoSQLQueryBuilder; import org.keycloak.models.mongo.keycloak.data.RealmData;
import org.keycloak.services.models.nosql.keycloak.data.ApplicationData; import org.keycloak.models.mongo.keycloak.data.RequiredCredentialData;
import org.keycloak.services.models.nosql.keycloak.data.RealmData; import org.keycloak.models.mongo.keycloak.data.RoleData;
import org.keycloak.services.models.nosql.keycloak.data.RequiredCredentialData; import org.keycloak.models.mongo.keycloak.data.SocialLinkData;
import org.keycloak.services.models.nosql.keycloak.data.RoleData; import org.keycloak.models.mongo.keycloak.data.UserData;
import org.keycloak.services.models.nosql.keycloak.data.SocialLinkData; import org.keycloak.models.mongo.impl.MongoDBImpl;
import org.keycloak.services.models.nosql.keycloak.data.UserData; import org.keycloak.models.mongo.keycloak.data.credentials.OTPData;
import org.keycloak.services.models.nosql.impl.MongoDBImpl; import org.keycloak.models.mongo.keycloak.data.credentials.PasswordData;
import org.keycloak.services.models.nosql.impl.MongoDBQueryBuilder;
import org.keycloak.services.models.nosql.keycloak.data.credentials.OTPData;
import org.keycloak.services.models.nosql.keycloak.data.credentials.PasswordData;
/** /**
* NoSQL implementation based on MongoDB * NoSQL implementation based on MongoDB
@ -39,7 +36,8 @@ public class MongoDBSessionFactory implements KeycloakSessionFactory {
PasswordData.class, PasswordData.class,
OTPData.class, OTPData.class,
SocialLinkData.class, SocialLinkData.class,
ApplicationData.class ApplicationData.class,
OAuthClientData.class
}; };
private final MongoClient mongoClient; private final MongoClient mongoClient;

View file

@ -1,19 +1,16 @@
package org.keycloak.services.models.nosql.keycloak.adapters; package org.keycloak.models.mongo.keycloak.adapters;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.jboss.resteasy.spi.NotImplementedYetException; import org.keycloak.models.KeycloakSession;
import org.keycloak.services.models.KeycloakSession; import org.keycloak.models.KeycloakTransaction;
import org.keycloak.services.models.KeycloakTransaction; import org.keycloak.models.RealmModel;
import org.keycloak.services.models.RealmModel; import org.keycloak.models.UserModel;
import org.keycloak.services.models.UserModel; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.keycloak.data.RealmData;
import org.keycloak.services.models.nosql.api.query.NoSQLQueryBuilder; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.impl.MongoDBQueryBuilder; import org.keycloak.models.utils.KeycloakSessionUtils;
import org.keycloak.services.models.nosql.keycloak.data.RealmData;
import org.keycloak.services.models.nosql.api.NoSQL;
import org.keycloak.services.models.picketlink.PicketlinkKeycloakSession;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@ -38,7 +35,7 @@ public class NoSQLSession implements KeycloakSession {
@Override @Override
public RealmModel createRealm(String name) { public RealmModel createRealm(String name) {
return createRealm(PicketlinkKeycloakSession.generateId(), name); return createRealm(KeycloakSessionUtils.generateId(), name);
} }
@Override @Override

View file

@ -1,6 +1,6 @@
package org.keycloak.services.models.nosql.keycloak.adapters; package org.keycloak.models.mongo.keycloak.adapters;
import org.keycloak.services.models.KeycloakTransaction; import org.keycloak.models.KeycloakTransaction;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -0,0 +1,43 @@
package org.keycloak.models.mongo.keycloak.adapters;
import org.keycloak.models.OAuthClientModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.models.mongo.keycloak.data.OAuthClientData;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class OAuthClientAdapter implements OAuthClientModel {
private final OAuthClientData delegate;
private final UserAdapter oauthAgent;
private final NoSQL noSQL;
public OAuthClientAdapter(OAuthClientData oauthClientData, UserAdapter oauthAgent, NoSQL noSQL) {
this.delegate = oauthClientData;
this.oauthAgent = oauthAgent;
this.noSQL = noSQL;
}
@Override
public String getId() {
return delegate.getId();
}
@Override
public UserModel getOAuthAgent() {
return oauthAgent;
}
@Override
public String getBaseUrl() {
return delegate.getBaseUrl();
}
@Override
public void setBaseUrl(String base) {
delegate.setBaseUrl(base);
noSQL.saveObject(delegate);
}
}

View file

@ -1,4 +1,4 @@
package org.keycloak.services.models.nosql.keycloak.adapters; package org.keycloak.models.mongo.keycloak.adapters;
import java.io.IOException; import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;
@ -12,28 +12,30 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import org.bouncycastle.openssl.PEMWriter; import org.bouncycastle.openssl.PEMWriter;
import org.jboss.resteasy.security.PemUtils; import org.keycloak.PemUtils;
import org.keycloak.models.ApplicationModel;
import org.keycloak.models.OAuthClientModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RequiredCredentialModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.SocialLinkModel;
import org.keycloak.models.UserCredentialModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.mongo.api.query.NoSQLQueryBuilder;
import org.keycloak.models.mongo.keycloak.data.OAuthClientData;
import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.CredentialRepresentation;
import org.keycloak.services.models.ApplicationModel; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.RealmModel; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.RequiredCredentialModel; import org.keycloak.models.mongo.keycloak.credentials.PasswordCredentialHandler;
import org.keycloak.services.models.RoleModel; import org.keycloak.models.mongo.keycloak.credentials.TOTPCredentialHandler;
import org.keycloak.services.models.SocialLinkModel; import org.keycloak.models.mongo.keycloak.data.ApplicationData;
import org.keycloak.services.models.UserCredentialModel; import org.keycloak.models.mongo.keycloak.data.RealmData;
import org.keycloak.services.models.UserModel; import org.keycloak.models.mongo.keycloak.data.RequiredCredentialData;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.keycloak.data.RoleData;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.keycloak.data.SocialLinkData;
import org.keycloak.services.models.nosql.keycloak.credentials.PasswordCredentialHandler; import org.keycloak.models.mongo.keycloak.data.UserData;
import org.keycloak.services.models.nosql.keycloak.credentials.TOTPCredentialHandler;
import org.keycloak.services.models.nosql.keycloak.data.ApplicationData;
import org.keycloak.services.models.nosql.keycloak.data.RealmData;
import org.keycloak.services.models.nosql.keycloak.data.RequiredCredentialData;
import org.keycloak.services.models.nosql.keycloak.data.RoleData;
import org.keycloak.services.models.nosql.keycloak.data.SocialLinkData;
import org.keycloak.services.models.nosql.keycloak.data.UserData;
import org.picketlink.idm.credential.Credentials; import org.picketlink.idm.credential.Credentials;
import org.picketlink.idm.credential.Password; import org.picketlink.idm.model.sample.User;
import org.picketlink.idm.credential.TOTPCredentials;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@ -152,6 +154,17 @@ public class RealmAdapter implements RealmModel {
updateRealm(); updateRealm();
} }
@Override
public boolean isResetPasswordAllowed() {
return realm.isResetPasswordAllowed();
}
@Override
public void setResetPasswordAllowed(boolean resetPassword) {
realm.setResetPasswordAllowed(resetPassword);
updateRealm();
}
@Override @Override
public int getTokenLifespan() { public int getTokenLifespan() {
return realm.getTokenLifespan(); return realm.getTokenLifespan();
@ -290,6 +303,7 @@ public class RealmAdapter implements RealmModel {
UserData userData = new UserData(); UserData userData = new UserData();
userData.setLoginName(username); userData.setLoginName(username);
userData.setEnabled(true);
userData.setRealmId(getOid()); userData.setRealmId(getOid());
noSQL.saveObject(userData); noSQL.saveObject(userData);
@ -405,7 +419,7 @@ public class RealmAdapter implements RealmModel {
} }
@Override @Override
public Map<String, ApplicationModel> getResourceNameMap() { public Map<String, ApplicationModel> getApplicationNameMap() {
Map<String, ApplicationModel> resourceMap = new HashMap<String, ApplicationModel>(); Map<String, ApplicationModel> resourceMap = new HashMap<String, ApplicationModel>();
for (ApplicationModel resource : getApplications()) { for (ApplicationModel resource : getApplications()) {
resourceMap.put(resource.getName(), resource); resourceMap.put(resource.getName(), resource);
@ -439,7 +453,7 @@ public class RealmAdapter implements RealmModel {
ApplicationModel resource = new ApplicationAdapter(appData, noSQL); ApplicationModel resource = new ApplicationAdapter(appData, noSQL);
resource.addRole("*"); resource.addRole("*");
resource.addScope(resourceUser, "*"); resource.addScopeMapping(resourceUser, "*");
return resource; return resource;
} }
@ -466,16 +480,22 @@ public class RealmAdapter implements RealmModel {
} }
@Override @Override
public Set<String> getRoleMappings(UserModel user) { public List<RoleModel> getRoleMappings(UserModel user) {
UserData userData = ((UserAdapter)user).getUser(); List<RoleModel> result = new ArrayList<RoleModel>();
List<String> roleIds = userData.getRoleIds(); List<RoleData> roles = ApplicationAdapter.getAllRolesOfUser(user, noSQL);
// TODO: Maybe improve as currently we need to obtain all roles and then filter programmatically...
for (RoleData role : roles) {
if (getOid().equals(role.getRealmId())) {
result.add(new RoleAdapter(role, noSQL));
}
}
return result;
}
@Override
public Set<String> getRoleMappingValues(UserModel user) {
Set<String> result = new HashSet<String>(); Set<String> result = new HashSet<String>();
List<RoleData> roles = ApplicationAdapter.getAllRolesOfUser(user, noSQL);
NoSQLQuery query = noSQL.createQueryBuilder()
.inCondition("_id", roleIds)
.build();
List<RoleData> roles = noSQL.loadObjects(RoleData.class, query);
// TODO: Maybe improve as currently we need to obtain all roles and then filter programmatically... // TODO: Maybe improve as currently we need to obtain all roles and then filter programmatically...
for (RoleData role : roles) { for (RoleData role : roles) {
if (getOid().equals(role.getRealmId())) { if (getOid().equals(role.getRealmId())) {
@ -486,7 +506,13 @@ public class RealmAdapter implements RealmModel {
} }
@Override @Override
public void addScope(UserModel agent, String roleName) { public void deleteRoleMapping(UserModel user, RoleModel role) {
UserData userData = ((UserAdapter)user).getUser();
noSQL.pullItemFromList(userData, "roleIds", role.getId());
}
@Override
public void addScopeMapping(UserModel agent, String roleName) {
UserData userData = ((UserAdapter)agent).getUser(); UserData userData = ((UserAdapter)agent).getUser();
RoleAdapter role = getRole(roleName); RoleAdapter role = getRole(roleName);
if (role == null) { if (role == null) {
@ -497,7 +523,31 @@ public class RealmAdapter implements RealmModel {
} }
@Override @Override
public Set<String> getScope(UserModel agent) { public OAuthClientModel addOAuthClient(String name) {
UserAdapter oauthAgent = addUser(name);
OAuthClientData oauthClient = new OAuthClientData();
oauthClient.setOauthAgentId(oauthAgent.getUser().getId());
oauthClient.setRealmId(getOid());
noSQL.saveObject(oauthClient);
return new OAuthClientAdapter(oauthClient, oauthAgent, noSQL);
}
@Override
public OAuthClientModel getOAuthClient(String name) {
UserAdapter user = getUser(name);
if (user == null) return null;
NoSQLQuery query = noSQL.createQueryBuilder()
.andCondition("realmId", getOid())
.andCondition("oauthAgentId", user.getUser().getId())
.build();
OAuthClientData oauthClient = noSQL.loadSingleObject(OAuthClientData.class, query);
return oauthClient == null ? null : new OAuthClientAdapter(oauthClient, user, noSQL);
}
@Override
public Set<String> getScopeMapping(UserModel agent) {
UserData userData = ((UserAdapter)agent).getUser(); UserData userData = ((UserAdapter)agent).getUser();
List<String> scopeIds = userData.getScopeIds(); List<String> scopeIds = userData.getScopeIds();
@ -755,4 +805,28 @@ public class RealmAdapter implements RealmModel {
} }
return model; return model;
} }
@Override
public List<UserModel> searchForUserByAttributes(Map<String, String> attributes) {
NoSQLQueryBuilder queryBuilder = noSQL.createQueryBuilder();
for (Map.Entry<String, String> entry : attributes.entrySet()) {
if (entry.getKey().equals(UserModel.LOGIN_NAME)) {
queryBuilder.andCondition("loginName", entry.getValue());
} else if (entry.getKey().equalsIgnoreCase(UserModel.FIRST_NAME)) {
queryBuilder.andCondition(UserModel.FIRST_NAME, entry.getValue());
} else if (entry.getKey().equalsIgnoreCase(UserModel.LAST_NAME)) {
queryBuilder.andCondition(UserModel.LAST_NAME, entry.getValue());
} else if (entry.getKey().equalsIgnoreCase(UserModel.EMAIL)) {
queryBuilder.andCondition(UserModel.EMAIL, entry.getValue());
}
}
List<UserData> users = noSQL.loadObjects(UserData.class, queryBuilder.build());
List<UserModel> userModels = new ArrayList<UserModel>();
for (UserData user : users) {
userModels.add(new UserAdapter(user, noSQL));
}
return userModels;
}
} }

View file

@ -1,8 +1,8 @@
package org.keycloak.services.models.nosql.keycloak.adapters; package org.keycloak.models.mongo.keycloak.adapters;
import org.keycloak.services.models.RoleModel; import org.keycloak.models.RoleModel;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.keycloak.data.RoleData; import org.keycloak.models.mongo.keycloak.data.RoleData;
/** /**
* Wrapper around RoleData object, which will persist wrapped object after each set operation (compatibility with picketlink based impl) * Wrapper around RoleData object, which will persist wrapped object after each set operation (compatibility with picketlink based impl)

View file

@ -1,11 +1,14 @@
package org.keycloak.services.models.nosql.keycloak.adapters; package org.keycloak.models.mongo.keycloak.adapters;
import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.keycloak.services.models.UserModel; import org.keycloak.models.UserModel;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.keycloak.data.UserData; import org.keycloak.models.mongo.keycloak.data.UserData;
/** /**
* Wrapper around UserData object, which will persist wrapped object after each set operation (compatibility with picketlink based impl) * Wrapper around UserData object, which will persist wrapped object after each set operation (compatibility with picketlink based impl)
@ -33,17 +36,11 @@ public class UserAdapter implements UserModel {
} }
@Override @Override
public void setStatus(Status status) { public void setEnabled(boolean enabled) {
user.setStatus(status); user.setEnabled(enabled);
noSQL.saveObject(user); noSQL.saveObject(user);
} }
@Override
public Status getStatus() {
Status status = user.getStatus();
return status != null ? status : Status.ENABLED;
}
@Override @Override
public String getFirstName() { public String getFirstName() {
return user.getFirstName(); return user.getFirstName();
@ -114,15 +111,19 @@ public class UserAdapter implements UserModel {
} }
@Override @Override
public List<RequiredAction> getRequiredActions() { public Set<RequiredAction> getRequiredActions() {
List<RequiredAction> requiredActions = user.getRequiredActions(); List<RequiredAction> actions = user.getRequiredActions();
// Compatibility with picketlink impl // Compatibility with picketlink impl
if (requiredActions == null || requiredActions.size() == 0) { if (actions == null) {
return null; return Collections.emptySet();
} else {
Set<RequiredAction> s = new HashSet<RequiredAction>();
for (RequiredAction a : actions) {
s.add(a);
}
return Collections.unmodifiableSet(s);
} }
return requiredActions;
} }
@Override @Override

View file

@ -1,13 +1,13 @@
package org.keycloak.services.models.nosql.keycloak.credentials; package org.keycloak.models.mongo.keycloak.credentials;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.nosql.keycloak.data.UserData; import org.keycloak.models.mongo.keycloak.data.UserData;
import org.keycloak.services.models.nosql.keycloak.data.credentials.PasswordData; import org.keycloak.models.mongo.keycloak.data.credentials.PasswordData;
import org.picketlink.idm.credential.Credentials; import org.picketlink.idm.credential.Credentials;
import org.picketlink.idm.credential.encoder.PasswordEncoder; import org.picketlink.idm.credential.encoder.PasswordEncoder;
import org.picketlink.idm.credential.encoder.SHAPasswordEncoder; import org.picketlink.idm.credential.encoder.SHAPasswordEncoder;

View file

@ -1,12 +1,12 @@
package org.keycloak.services.models.nosql.keycloak.credentials; package org.keycloak.models.mongo.keycloak.credentials;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.nosql.keycloak.data.UserData; import org.keycloak.models.mongo.keycloak.data.UserData;
import org.keycloak.services.models.nosql.keycloak.data.credentials.OTPData; import org.keycloak.models.mongo.keycloak.data.credentials.OTPData;
import org.picketlink.idm.credential.Credentials; import org.picketlink.idm.credential.Credentials;
import org.picketlink.idm.credential.util.TimeBasedOTP; import org.picketlink.idm.credential.util.TimeBasedOTP;

View file

@ -1,11 +1,11 @@
package org.keycloak.services.models.nosql.keycloak.data; package org.keycloak.models.mongo.keycloak.data;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId; import org.keycloak.models.mongo.api.NoSQLId;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.api.NoSQLObject;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@ -18,6 +18,7 @@ public class ApplicationData implements NoSQLObject {
private boolean enabled; private boolean enabled;
private boolean surrogateAuthRequired; private boolean surrogateAuthRequired;
private String managementUrl; private String managementUrl;
private String baseUrl;
private String resourceUserId; private String resourceUserId;
private String realmId; private String realmId;
@ -67,6 +68,15 @@ public class ApplicationData implements NoSQLObject {
this.managementUrl = managementUrl; this.managementUrl = managementUrl;
} }
@NoSQLField
public String getBaseUrl() {
return baseUrl;
}
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
@NoSQLField @NoSQLField
public String getResourceUserId() { public String getResourceUserId() {
return resourceUserId; return resourceUserId;

View file

@ -0,0 +1,62 @@
package org.keycloak.models.mongo.keycloak.data;
import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.models.mongo.api.NoSQLId;
import org.keycloak.models.mongo.api.NoSQLObject;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
@NoSQLCollection(collectionName = "oauthClients")
public class OAuthClientData implements NoSQLObject {
private String id;
private String baseUrl;
private String oauthAgentId;
private String realmId;
@NoSQLId
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@NoSQLField
public String getBaseUrl() {
return baseUrl;
}
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
@NoSQLField
public String getOauthAgentId() {
return oauthAgentId;
}
public void setOauthAgentId(String oauthUserId) {
this.oauthAgentId = oauthUserId;
}
@NoSQLField
public String getRealmId() {
return realmId;
}
public void setRealmId(String realmId) {
this.realmId = realmId;
}
@Override
public void afterRemove(NoSQL noSQL) {
// Remove user of this oauthClient
noSQL.removeObject(UserData.class, oauthAgentId);
}
}

View file

@ -1,16 +1,13 @@
package org.keycloak.services.models.nosql.keycloak.data; package org.keycloak.models.mongo.keycloak.data;
import java.security.SecureRandom;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.UUID;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId; import org.keycloak.models.mongo.api.NoSQLId;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.api.NoSQLObject;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@ -27,6 +24,7 @@ public class RealmData implements NoSQLObject {
private boolean cookieLoginAllowed; private boolean cookieLoginAllowed;
private boolean registrationAllowed; private boolean registrationAllowed;
private boolean verifyEmail; private boolean verifyEmail;
private boolean resetPasswordAllowed;
private boolean social; private boolean social;
private boolean automaticRegistrationAfterSocialLogin; private boolean automaticRegistrationAfterSocialLogin;
private int tokenLifespan; private int tokenLifespan;
@ -110,6 +108,15 @@ public class RealmData implements NoSQLObject {
this.verifyEmail = verifyEmail; this.verifyEmail = verifyEmail;
} }
@NoSQLField
public boolean isResetPasswordAllowed() {
return resetPasswordAllowed;
}
public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
this.resetPasswordAllowed = resetPasswordAllowed;
}
@NoSQLField @NoSQLField
public boolean isSocial() { public boolean isSocial() {
return social; return social;

View file

@ -1,10 +1,9 @@
package org.keycloak.services.models.nosql.keycloak.data; package org.keycloak.models.mongo.keycloak.data;
import org.keycloak.services.models.nosql.api.AbstractNoSQLObject; import org.keycloak.models.mongo.api.AbstractNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId; import org.keycloak.models.mongo.api.NoSQLId;
import org.keycloak.services.models.nosql.api.NoSQLObject;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,14 +1,14 @@
package org.keycloak.services.models.nosql.keycloak.data; package org.keycloak.models.mongo.keycloak.data;
import java.util.List; import java.util.List;
import org.jboss.resteasy.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId; import org.keycloak.models.mongo.api.NoSQLId;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.api.NoSQLObject;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,10 +1,8 @@
package org.keycloak.services.models.nosql.keycloak.data; package org.keycloak.models.mongo.keycloak.data;
import org.keycloak.services.models.nosql.api.AbstractNoSQLObject; import org.keycloak.models.mongo.api.AbstractNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId;
import org.keycloak.services.models.nosql.api.NoSQLObject;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,16 +1,16 @@
package org.keycloak.services.models.nosql.keycloak.data; package org.keycloak.models.mongo.keycloak.data;
import java.util.List; import java.util.List;
import org.jboss.resteasy.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.services.models.UserModel; import org.keycloak.models.UserModel;
import org.keycloak.services.models.nosql.api.AbstractAttributedNoSQLObject; import org.keycloak.models.mongo.api.AbstractAttributedNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId; import org.keycloak.models.mongo.api.NoSQLId;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.nosql.keycloak.data.credentials.PasswordData; import org.keycloak.models.mongo.keycloak.data.credentials.PasswordData;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@ -27,7 +27,7 @@ public class UserData extends AbstractAttributedNoSQLObject {
private String email; private String email;
private boolean emailVerified; private boolean emailVerified;
private boolean totp; private boolean totp;
private UserModel.Status status; private boolean enabled;
private String realmId; private String realmId;
@ -89,8 +89,13 @@ public class UserData extends AbstractAttributedNoSQLObject {
this.emailVerified = emailVerified; this.emailVerified = emailVerified;
} }
@NoSQLField
public boolean isEnabled() { public boolean isEnabled() {
return !UserModel.Status.DISABLED.equals(getStatus()); return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
} }
@NoSQLField @NoSQLField
@ -102,15 +107,6 @@ public class UserData extends AbstractAttributedNoSQLObject {
this.totp = totp; this.totp = totp;
} }
@NoSQLField
public UserModel.Status getStatus() {
return status;
}
public void setStatus(UserModel.Status status) {
this.status = status;
}
@NoSQLField @NoSQLField
public String getRealmId() { public String getRealmId() {
return realmId; return realmId;

View file

@ -1,10 +1,10 @@
package org.keycloak.services.models.nosql.keycloak.data.credentials; package org.keycloak.models.mongo.keycloak.data.credentials;
import java.util.Date; import java.util.Date;
import org.keycloak.services.models.nosql.api.AbstractNoSQLObject; import org.keycloak.models.mongo.api.AbstractNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,12 +1,10 @@
package org.keycloak.services.models.nosql.keycloak.data.credentials; package org.keycloak.models.mongo.keycloak.data.credentials;
import java.util.Date; import java.util.Date;
import org.keycloak.services.models.nosql.api.AbstractNoSQLObject; import org.keycloak.models.mongo.api.AbstractNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId;
import org.keycloak.services.models.nosql.api.NoSQLObject;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,9 +1,9 @@
package org.keycloak.test.nosql; package org.keycloak.models.mongo.test;
import java.util.List; import java.util.List;
import org.keycloak.services.models.nosql.api.AbstractNoSQLObject; import org.keycloak.models.mongo.api.AbstractNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,4 +1,4 @@
package org.keycloak.test.nosql; package org.keycloak.models.mongo.test;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.ArrayList; import java.util.ArrayList;
@ -10,11 +10,10 @@ import com.mongodb.MongoClient;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.keycloak.models.mongo.api.NoSQL;
import org.keycloak.services.models.nosql.api.NoSQL; import org.keycloak.models.mongo.api.NoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLObject; import org.keycloak.models.mongo.api.query.NoSQLQuery;
import org.keycloak.services.models.nosql.api.query.NoSQLQuery; import org.keycloak.models.mongo.impl.MongoDBImpl;
import org.keycloak.services.models.nosql.impl.MongoDBImpl;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -1,11 +1,11 @@
package org.keycloak.test.nosql; package org.keycloak.models.mongo.test;
import java.util.List; import java.util.List;
import org.keycloak.services.models.nosql.api.AbstractNoSQLObject; import org.keycloak.models.mongo.api.AbstractNoSQLObject;
import org.keycloak.services.models.nosql.api.NoSQLCollection; import org.keycloak.models.mongo.api.NoSQLCollection;
import org.keycloak.services.models.nosql.api.NoSQLField; import org.keycloak.models.mongo.api.NoSQLField;
import org.keycloak.services.models.nosql.api.NoSQLId; import org.keycloak.models.mongo.api.NoSQLId;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>

View file

@ -4,7 +4,7 @@
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.0-alpha-1</version> <version>1.0-alpha-1</version>
<relativePath>../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -6,6 +6,7 @@ import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel; import org.keycloak.models.UserModel;
import org.keycloak.models.picketlink.mappings.RealmData; import org.keycloak.models.picketlink.mappings.RealmData;
import org.keycloak.models.picketlink.relationships.RealmAdminRelationship; import org.keycloak.models.picketlink.relationships.RealmAdminRelationship;
import org.keycloak.models.utils.KeycloakSessionUtils;
import org.picketlink.idm.PartitionManager; import org.picketlink.idm.PartitionManager;
import org.picketlink.idm.RelationshipManager; import org.picketlink.idm.RelationshipManager;
import org.picketlink.idm.query.RelationshipQuery; import org.picketlink.idm.query.RelationshipQuery;
@ -25,11 +26,6 @@ public class PicketlinkKeycloakSession implements KeycloakSession {
protected PartitionManager partitionManager; protected PartitionManager partitionManager;
protected EntityManager entityManager; protected EntityManager entityManager;
private static AtomicLong counter = new AtomicLong(1);
public static String generateId() {
return counter.getAndIncrement() + "-" + System.currentTimeMillis();
}
public PicketlinkKeycloakSession(PartitionManager partitionManager, EntityManager entityManager) { public PicketlinkKeycloakSession(PartitionManager partitionManager, EntityManager entityManager) {
this.partitionManager = partitionManager; this.partitionManager = partitionManager;
this.entityManager = entityManager; this.entityManager = entityManager;
@ -50,7 +46,7 @@ public class PicketlinkKeycloakSession implements KeycloakSession {
@Override @Override
public RealmAdapter createRealm(String name) { public RealmAdapter createRealm(String name) {
return createRealm(generateId(), name); return createRealm(KeycloakSessionUtils.generateId(), name);
} }
@Override @Override

View file

@ -37,5 +37,6 @@
<module>api</module> <module>api</module>
<module>picketlink</module> <module>picketlink</module>
<module>jpa</module> <module>jpa</module>
<module>mongo</module>
</modules> </modules>
</project> </project>

View file

@ -18,6 +18,7 @@
<hibernate.entitymanager.version>3.6.6.Final</hibernate.entitymanager.version> <hibernate.entitymanager.version>3.6.6.Final</hibernate.entitymanager.version>
<h2.version>1.3.161</h2.version> <h2.version>1.3.161</h2.version>
<dom4j.version>1.6.1</dom4j.version> <dom4j.version>1.6.1</dom4j.version>
<mysql.version>5.1.25</mysql.version>
<slf4j.version>1.6.1</slf4j.version> <slf4j.version>1.6.1</slf4j.version>
</properties> </properties>
@ -295,7 +296,7 @@
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version> <version>${mysql.version}</version>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -34,6 +34,12 @@
<artifactId>keycloak-model-picketlink</artifactId> <artifactId>keycloak-model-picketlink</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- TODO: Remove -->
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-mongo</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<artifactId>keycloak-social-core</artifactId> <artifactId>keycloak-social-core</artifactId>

View file

@ -1,18 +1,13 @@
package org.keycloak.services.resources; package org.keycloak.services.resources;
import org.keycloak.SkeletonKeyContextResolver; import org.keycloak.SkeletonKeyContextResolver;
import org.keycloak.models.mongo.keycloak.adapters.MongoDBSessionFactory;
import org.keycloak.services.managers.TokenManager; import org.keycloak.services.managers.TokenManager;
import org.keycloak.models.KeycloakSessionFactory; import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.picketlink.PicketlinkKeycloakSession; import org.keycloak.models.picketlink.PicketlinkKeycloakSession;
import org.keycloak.models.picketlink.PicketlinkKeycloakSessionFactory; import org.keycloak.models.picketlink.PicketlinkKeycloakSessionFactory;
import org.keycloak.models.picketlink.mappings.ApplicationEntity; import org.keycloak.models.picketlink.mappings.ApplicationEntity;
import org.keycloak.models.picketlink.mappings.RealmEntity; import org.keycloak.models.picketlink.mappings.RealmEntity;
import org.keycloak.services.models.KeycloakSessionFactory;
import org.keycloak.services.models.nosql.keycloak.adapters.MongoDBSessionFactory;
import org.keycloak.services.models.picketlink.PicketlinkKeycloakSession;
import org.keycloak.services.models.picketlink.PicketlinkKeycloakSessionFactory;
import org.keycloak.services.models.picketlink.mappings.ApplicationEntity;
import org.keycloak.services.models.picketlink.mappings.RealmEntity;
import org.keycloak.social.SocialRequestManager; import org.keycloak.social.SocialRequestManager;
import org.picketlink.idm.PartitionManager; import org.picketlink.idm.PartitionManager;
import org.picketlink.idm.config.IdentityConfigurationBuilder; import org.picketlink.idm.config.IdentityConfigurationBuilder;
@ -25,8 +20,6 @@ import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory; import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence; import javax.persistence.Persistence;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.ws.rs.core.Application; import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import java.util.HashSet; import java.util.HashSet;

View file

@ -141,6 +141,8 @@ public class AdapterTest extends AbstractKeycloakTest {
user.setEmail("bburke@redhat.com"); user.setEmail("bburke@redhat.com");
} }
RealmManager adapter = getRealmManager();
{ {
List<UserModel> userModels = adapter.searchUsers("total junk query", realmModel); List<UserModel> userModels = adapter.searchUsers("total junk query", realmModel);
Assert.assertEquals(userModels.size(), 0); Assert.assertEquals(userModels.size(), 0);

View file

@ -11,11 +11,6 @@ import org.keycloak.services.managers.AuthenticationManager;
import org.keycloak.services.managers.RealmManager; import org.keycloak.services.managers.RealmManager;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.services.models.KeycloakSession;
import org.keycloak.services.models.RealmModel;
import org.keycloak.services.resources.KeycloakApplication;
import org.keycloak.test.common.AbstractKeycloakTest;
import org.keycloak.test.common.SessionFactoryTestContext;
import javax.ws.rs.NotAuthorizedException; import javax.ws.rs.NotAuthorizedException;
import javax.ws.rs.client.Entity; import javax.ws.rs.client.Entity;

View file

@ -10,9 +10,9 @@ import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.Parameterized; import org.junit.runners.Parameterized;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.services.managers.RealmManager; import org.keycloak.services.managers.RealmManager;
import org.keycloak.services.models.KeycloakSession;
import org.keycloak.services.models.KeycloakSessionFactory;
import org.keycloak.services.resources.KeycloakApplication; import org.keycloak.services.resources.KeycloakApplication;
/** /**

View file

@ -1,7 +1,5 @@
package org.keycloak.test.common; package org.keycloak.test.common;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import de.flapdoodle.embed.mongo.MongodExecutable; import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodProcess; import de.flapdoodle.embed.mongo.MongodProcess;
import de.flapdoodle.embed.mongo.MongodStarter; import de.flapdoodle.embed.mongo.MongodStarter;
@ -9,7 +7,6 @@ import de.flapdoodle.embed.mongo.config.MongodConfig;
import de.flapdoodle.embed.mongo.distribution.Version; import de.flapdoodle.embed.mongo.distribution.Version;
import de.flapdoodle.embed.process.runtime.Network; import de.flapdoodle.embed.process.runtime.Network;
import org.jboss.resteasy.logging.Logger; import org.jboss.resteasy.logging.Logger;
import org.keycloak.services.models.KeycloakSessionFactory;
import org.keycloak.services.resources.KeycloakApplication; import org.keycloak.services.resources.KeycloakApplication;
/** /**

View file

@ -1,6 +1,5 @@
package org.keycloak.test.common; package org.keycloak.test.common;
import org.keycloak.services.models.KeycloakSessionFactory;
import org.keycloak.services.resources.KeycloakApplication; import org.keycloak.services.resources.KeycloakApplication;
/** /**

View file

@ -1,7 +1,5 @@
package org.keycloak.test.common; package org.keycloak.test.common;
import org.keycloak.services.models.KeycloakSessionFactory;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/ */

View file

@ -0,0 +1,223 @@
<?xml version="1.0"?>
<project>
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-alpha-1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-testsuite-integration</artifactId>
<name>Keycloak Integration TestSuite</name>
<description />
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-as7-adapter</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
<version>${project.version}</version>
</dependency>
<!--
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server</artifactId>
<version>${project.version}</version>
</dependency>
-->
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-social-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-social-google</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-social-twitter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-social-facebook</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-forms</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-idm-api</artifactId>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-common</artifactId>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-idm-impl</artifactId>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-idm-simple-schema</artifactId>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-config</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-crypto</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jose-jwt</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-undertow</artifactId>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.servlet</groupId>
<artifactId>jboss-servlet-api_3.0_spec</artifactId>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.161</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.6.Final</version>
</dependency>
<dependency>
<groupId>com.icegreen</groupId>
<artifactId>greenmail</artifactId>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>jboss-managed</id>
<dependencies>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-arquillian-container-managed</artifactId>
<scope>test</scope>
<version>7.1.1.Final</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>jboss-remote</id>
<dependencies>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-arquillian-container-remote</artifactId>
<scope>test</scope>
<version>7.1.1.Final</version>
</dependency>
</dependencies>
</profile>
</profiles>
</project>

Some files were not shown because too many files have changed in this diff Show more