Details
diff --git a/connections/jpa/src/main/resources/META-INF/persistence.xml b/connections/jpa/src/main/resources/META-INF/persistence.xml
index 94f1fd0..dde200e 100755
--- a/connections/jpa/src/main/resources/META-INF/persistence.xml
+++ b/connections/jpa/src/main/resources/META-INF/persistence.xml
@@ -7,6 +7,7 @@
<class>org.keycloak.models.jpa.entities.CredentialEntity</class>
<class>org.keycloak.models.jpa.entities.OAuthClientEntity</class>
<class>org.keycloak.models.jpa.entities.RealmEntity</class>
+ <class>org.keycloak.models.jpa.entities.RealmAttributeEntity</class>
<class>org.keycloak.models.jpa.entities.RequiredCredentialEntity</class>
<class>org.keycloak.models.jpa.entities.UserFederationProviderEntity</class>
<class>org.keycloak.models.jpa.entities.RoleEntity</class>
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/AttributeMap.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/AttributeMap.java
new file mode 100755
index 0000000..5a4e28b
--- /dev/null
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/AttributeMap.java
@@ -0,0 +1,74 @@
+package org.keycloak.models.jpa.entities;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public class AttributeMap {
+ Map<String, String> attributes = new HashMap<String, String>();
+
+ public void set(String key, String value) {
+ attributes.put(key, value);
+ }
+
+ public void set(String key, Boolean value) {
+ attributes.put(key, value.toString());
+ }
+
+ public void set(String key, Integer value) {
+ attributes.put(key, value.toString());
+ }
+
+ public String get(String key) {
+ return attributes.get(key);
+ }
+
+ public String get(String key, String defaultValue) {
+ String value = attributes.get(key);
+ return value == null ? defaultValue : value;
+ }
+
+ public String[] getArray(String key) {
+ String value = get(key);
+ if (value != null) {
+ String[] a = value.split(",");
+ for (int i = 0; i < a.length; i++) {
+ a[i] = a[i].trim();
+ }
+ return a;
+ } else {
+ return null;
+ }
+ }
+
+ public Integer getInt(String key) {
+ return getInt(key, null);
+ }
+
+ public Integer getInt(String key, Integer defaultValue) {
+ String v = get(key, null);
+ return v != null ? Integer.parseInt(v) : defaultValue;
+ }
+
+ public Long getLong(String key) {
+ return getLong(key, null);
+ }
+
+ public Long getLong(String key, Long defaultValue) {
+ String v = get(key, null);
+ return v != null ? Long.parseLong(v) : defaultValue;
+ }
+
+ public Boolean getBoolean(String key) {
+ return getBoolean(key, null);
+ }
+
+ public Boolean getBoolean(String key, Boolean defaultValue) {
+ String v = get(key, null);
+ return v != null ? Boolean.parseBoolean(v) : defaultValue;
+ }}
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmAttributeEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmAttributeEntity.java
new file mode 100755
index 0000000..2e025cc
--- /dev/null
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmAttributeEntity.java
@@ -0,0 +1,105 @@
+package org.keycloak.models.jpa.entities;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+@NamedQueries({
+ @NamedQuery(name="deleteRealmAttributesByRealm", query="delete from RealmAttributeEntity attr where attr.realm = :realm")
+})
+@Table(name="REALM_ATTRIBUTE")
+@Entity
+@IdClass(RealmAttributeEntity.Key.class)
+public class RealmAttributeEntity {
+
+ @Id
+ @ManyToOne(fetch= FetchType.LAZY)
+ @JoinColumn(name = "REALM_ID")
+ protected RealmEntity realm;
+
+ @Id
+ @Column(name = "NAME")
+ protected String name;
+ @Column(name = "VALUE")
+ protected String value;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public RealmEntity getRealm() {
+ return realm;
+ }
+
+ public void setRealm(RealmEntity realm) {
+ this.realm = realm;
+ }
+
+ public static class Key implements Serializable {
+
+ protected RealmEntity realm;
+
+ protected String name;
+
+ public Key() {
+ }
+
+ public Key(RealmEntity user, String name) {
+ this.realm = user;
+ this.name = name;
+ }
+
+ public RealmEntity getRealm() {
+ return realm;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Key key = (Key) o;
+
+ if (name != null ? !name.equals(key.name) : key.name != null) return false;
+ if (realm != null ? !realm.getId().equals(key.realm != null ? key.realm.getId() : null) : key.realm != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = realm != null ? realm.getId().hashCode() : 0;
+ result = 31 * result + (name != null ? name.hashCode() : 0);
+ return result;
+ }
+ }
+
+}
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
index 39e35c1..de46f37 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
@@ -58,24 +58,6 @@ public class RealmEntity {
protected boolean social;
@Column(name="REMEMBER_ME")
protected boolean rememberMe;
- //--- brute force settings
- @Column(name="BRUTE_FORCE_PROTECTED")
- protected boolean bruteForceProtected;
- @Column(name="MAX_FAILURE_WAIT")
- protected int maxFailureWaitSeconds;
- @Column(name="MINIMUM_QUICK_LOGIN_WAIT")
- protected int minimumQuickLoginWaitSeconds;
- @Column(name="WAIT_INCREMENT_SECONDS")
- protected int waitIncrementSeconds;
- @Column(name="QUICK_LOGIN_CHECK")
- protected long quickLoginCheckMilliSeconds;
- @Column(name="MAX_DELTA_TIME")
- protected int maxDeltaTimeSeconds;
- @Column(name="FAILURE_FACTOR")
- protected int failureFactor;
- //--- end brute force settings
-
-
@Column(name="UPDATE_PROFILE_ON_SOC_LOGIN")
protected boolean updateProfileOnInitialSocialLogin;
@Column(name="PASSWORD_POLICY")
@@ -109,6 +91,9 @@ public class RealmEntity {
protected String emailTheme;
@OneToMany(cascade ={CascadeType.REMOVE}, orphanRemoval = true, mappedBy = "realm")
+ Collection<RealmAttributeEntity> attributes = new ArrayList<RealmAttributeEntity>();
+
+ @OneToMany(cascade ={CascadeType.REMOVE}, orphanRemoval = true, mappedBy = "realm")
Collection<RequiredCredentialEntity> requiredCredentials = new ArrayList<RequiredCredentialEntity>();
@@ -400,62 +385,6 @@ public class RealmEntity {
this.notBefore = notBefore;
}
- public boolean isBruteForceProtected() {
- return bruteForceProtected;
- }
-
- public void setBruteForceProtected(boolean bruteForceProtected) {
- this.bruteForceProtected = bruteForceProtected;
- }
-
- public int getMaxFailureWaitSeconds() {
- return maxFailureWaitSeconds;
- }
-
- public void setMaxFailureWaitSeconds(int maxFailureWaitSeconds) {
- this.maxFailureWaitSeconds = maxFailureWaitSeconds;
- }
-
- public int getMinimumQuickLoginWaitSeconds() {
- return minimumQuickLoginWaitSeconds;
- }
-
- public void setMinimumQuickLoginWaitSeconds(int minimumQuickLoginWaitSeconds) {
- this.minimumQuickLoginWaitSeconds = minimumQuickLoginWaitSeconds;
- }
-
- public int getWaitIncrementSeconds() {
- return waitIncrementSeconds;
- }
-
- public void setWaitIncrementSeconds(int waitIncrementSeconds) {
- this.waitIncrementSeconds = waitIncrementSeconds;
- }
-
- public long getQuickLoginCheckMilliSeconds() {
- return quickLoginCheckMilliSeconds;
- }
-
- public void setQuickLoginCheckMilliSeconds(long quickLoginCheckMilliSeconds) {
- this.quickLoginCheckMilliSeconds = quickLoginCheckMilliSeconds;
- }
-
- public int getMaxDeltaTimeSeconds() {
- return maxDeltaTimeSeconds;
- }
-
- public void setMaxDeltaTimeSeconds(int maxDeltaTimeSeconds) {
- this.maxDeltaTimeSeconds = maxDeltaTimeSeconds;
- }
-
- public int getFailureFactor() {
- return failureFactor;
- }
-
- public void setFailureFactor(int failureFactor) {
- this.failureFactor = failureFactor;
- }
-
public boolean isAuditEnabled() {
return auditEnabled;
}
@@ -495,5 +424,13 @@ public class RealmEntity {
public void setUserFederationProviders(List<UserFederationProviderEntity> userFederationProviders) {
this.userFederationProviders = userFederationProviders;
}
+
+ public Collection<RealmAttributeEntity> getAttributes() {
+ return attributes;
+ }
+
+ public void setAttributes(Collection<RealmAttributeEntity> attributes) {
+ this.attributes = attributes;
+ }
}
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
index 4f0da3c..4b44180 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
@@ -11,10 +11,13 @@ import org.keycloak.models.RequiredCredentialModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserFederationProviderModel;
import org.keycloak.models.jpa.entities.ApplicationEntity;
+import org.keycloak.models.jpa.entities.AttributeMap;
import org.keycloak.models.jpa.entities.OAuthClientEntity;
+import org.keycloak.models.jpa.entities.RealmAttributeEntity;
import org.keycloak.models.jpa.entities.RealmEntity;
import org.keycloak.models.jpa.entities.RequiredCredentialEntity;
import org.keycloak.models.jpa.entities.RoleEntity;
+import org.keycloak.models.jpa.entities.UserAttributeEntity;
import org.keycloak.models.jpa.entities.UserFederationProviderEntity;
import org.keycloak.models.utils.KeycloakModelUtils;
@@ -127,74 +130,146 @@ public class RealmAdapter implements RealmModel {
em.flush();
}
+ public void setAttribute(String name, String value) {
+ for (RealmAttributeEntity attr : realm.getAttributes()) {
+ if (attr.getName().equals(name)) {
+ attr.setValue(value);
+ return;
+ }
+ }
+ RealmAttributeEntity attr = new RealmAttributeEntity();
+ attr.setName(name);
+ attr.setValue(value);
+ attr.setRealm(realm);
+ em.persist(attr);
+ realm.getAttributes().add(attr);
+ }
+
+ public void setAttribute(String name, Boolean value) {
+ setAttribute(name, value.toString());
+ }
+
+ public void setAttribute(String name, Integer value) {
+ setAttribute(name, value.toString());
+ }
+
+ public void setAttribute(String name, Long value) {
+ setAttribute(name, value.toString());
+ }
+
+ public void removeAttribute(String name) {
+ Iterator<RealmAttributeEntity> it = realm.getAttributes().iterator();
+ while (it.hasNext()) {
+ RealmAttributeEntity attr = it.next();
+ if (attr.getName().equals(name)) {
+ it.remove();
+ em.remove(attr);
+ }
+ }
+ }
+
+ public String getAttribute(String name) {
+ for (RealmAttributeEntity attr : realm.getAttributes()) {
+ if (attr.getName().equals(name)) {
+ return attr.getValue();
+ }
+ }
+ return null;
+ }
+
+ public Integer getAttribute(String name, Integer defaultValue) {
+ String v = getAttribute(name);
+ return v != null ? Integer.parseInt(v) : defaultValue;
+
+ }
+
+ public Long getAttribute(String name, Long defaultValue) {
+ String v = getAttribute(name);
+ return v != null ? Long.parseLong(v) : defaultValue;
+
+ }
+
+ public Boolean getAttribute(String name, Boolean defaultValue) {
+ String v = getAttribute(name);
+ return v != null ? Boolean.parseBoolean(v) : defaultValue;
+
+ }
+
+ public Map<String, String> getAttributes() {
+ Map<String, String> result = new HashMap<String, String>();
+ for (RealmAttributeEntity attr : realm.getAttributes()) {
+ result.put(attr.getName(), attr.getValue());
+ }
+ return result;
+ }
@Override
public boolean isBruteForceProtected() {
- return realm.isBruteForceProtected();
+ return getAttribute("bruteForceProtected", false);
}
@Override
public void setBruteForceProtected(boolean value) {
- realm.setBruteForceProtected(value);
+ setAttribute("bruteForceProtected", value);
}
@Override
public int getMaxFailureWaitSeconds() {
- return realm.getMaxFailureWaitSeconds();
+ return getAttribute("maxFailureWaitSeconds", 0);
}
@Override
public void setMaxFailureWaitSeconds(int val) {
- realm.setMaxFailureWaitSeconds(val);
+ setAttribute("maxFailureWaitSeconds", val);
}
@Override
public int getWaitIncrementSeconds() {
- return realm.getWaitIncrementSeconds();
+ return getAttribute("waitIncrementSeconds", 0);
}
@Override
public void setWaitIncrementSeconds(int val) {
- realm.setWaitIncrementSeconds(val);
+ setAttribute("waitIncrementSeconds", val);
}
@Override
public long getQuickLoginCheckMilliSeconds() {
- return realm.getQuickLoginCheckMilliSeconds();
+ return getAttribute("quickLoginCheckMilliSeconds", 0l);
}
@Override
public void setQuickLoginCheckMilliSeconds(long val) {
- realm.setQuickLoginCheckMilliSeconds(val);
+ setAttribute("quickLoginCheckMilliSeconds", val);
}
@Override
public int getMinimumQuickLoginWaitSeconds() {
- return realm.getMinimumQuickLoginWaitSeconds();
+ return getAttribute("minimumQuickLoginWaitSeconds", 0);
}
@Override
public void setMinimumQuickLoginWaitSeconds(int val) {
- realm.setMinimumQuickLoginWaitSeconds(val);
+ setAttribute("minimumQuickLoginWaitSeconds", val);
}
@Override
public int getMaxDeltaTimeSeconds() {
- return realm.getMaxDeltaTimeSeconds();
+ return getAttribute("maxDeltaTimeSeconds", 0);
}
@Override
public void setMaxDeltaTimeSeconds(int val) {
- realm.setMaxDeltaTimeSeconds(val);
+ setAttribute("maxDeltaTimeSeconds", val);
}
@Override
public int getFailureFactor() {
- return realm.getFailureFactor();
+ return getAttribute("failureFactor", 0);
}
@Override
public void setFailureFactor(int failureFactor) {
- realm.setFailureFactor(failureFactor);
+ setAttribute("failureFactor", failureFactor);
}
@Override