keycloak-aplcache

Changes

Details

diff --git a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
index 45d47d8..2793053 100755
--- a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
+++ b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
@@ -2,6 +2,7 @@ package org.keycloak.representations.idm;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -36,7 +37,8 @@ public class RealmRepresentation {
     protected List<ScopeMappingRepresentation> scopeMappings;
     protected List<SocialMappingRepresentation> socialMappings;
     protected List<ApplicationRepresentation> applications;
-
+    protected Map<String, String> socialProviders;
+    protected Map<String, String> smtpServer;
 
     public String getSelf() {
         return self;
@@ -281,4 +283,20 @@ public class RealmRepresentation {
     public void setAutomaticRegistrationAfterSocialLogin(Boolean automaticRegistrationAfterSocialLogin) {
         this.automaticRegistrationAfterSocialLogin = automaticRegistrationAfterSocialLogin;
     }
+
+    public Map<String, String> getSocialProviders() {
+        return socialProviders;
+    }
+
+    public void setSocialProviders(Map<String, String> socialProviders) {
+        this.socialProviders = socialProviders;
+    }
+
+    public Map<String, String> getSmtpServer() {
+        return smtpServer;
+    }
+
+    public void setSmtpServer(Map<String, String> smtpServer) {
+        this.smtpServer = smtpServer;
+    }
 }
diff --git a/forms/src/main/java/org/keycloak/forms/SocialBean.java b/forms/src/main/java/org/keycloak/forms/SocialBean.java
index 2492ca9..19baaa7 100644
--- a/forms/src/main/java/org/keycloak/forms/SocialBean.java
+++ b/forms/src/main/java/org/keycloak/forms/SocialBean.java
@@ -22,9 +22,7 @@
 package org.keycloak.forms;
 
 import java.net.URI;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 
 import javax.imageio.spi.ServiceRegistry;
 import javax.ws.rs.core.UriBuilder;
@@ -45,7 +43,7 @@ public class SocialBean {
 
     private List<SocialProvider> providers;
 
-    public SocialBean(RealmBean realm, RegisterBean registerBean, UrlBean url) {
+    public SocialBean(RealmBean realm, List<org.keycloak.social.SocialProvider> providers, RegisterBean registerBean, UrlBean url) {
         this.realm = realm;
         this.registerBean = registerBean;
         this.url = url;
@@ -54,13 +52,10 @@ public class SocialBean {
 
         UriBuilder socialLoginUrlBuilder = UriBuilder.fromUri(Urls.socialRedirectToProviderAuth(baseURI, realm.getId()));
 
-        providers = new LinkedList<SocialProvider>();
-        for (Iterator<org.keycloak.social.SocialProvider> itr = ServiceRegistry
-                .lookupProviders(org.keycloak.social.SocialProvider.class); itr.hasNext();) {
-            org.keycloak.social.SocialProvider p = itr.next();
-
+        this.providers = new LinkedList<SocialProvider>();
+        for (org.keycloak.social.SocialProvider p : providers) {
             String loginUrl = socialLoginUrlBuilder.replaceQueryParam("provider_id", p.getId()).build().toString();
-            providers.add(new SocialProvider(p.getId(), p.getName(), loginUrl));
+            this.providers.add(new SocialProvider(p.getId(), p.getName(), loginUrl));
         }
     }
 
@@ -70,7 +65,7 @@ public class SocialBean {
 
     // Display panel with social providers just in case that social is enabled for realm, but we are not in the middle of registration with social
     public boolean isDisplaySocialProviders() {
-        return realm.isSocial() && !registerBean.isSocialRegistration();
+        return realm.isSocial() && !providers.isEmpty() && !registerBean.isSocialRegistration();
     }
 
     public RealmBean getRealm() {
diff --git a/forms/src/main/java/org/keycloak/service/FormServiceImpl.java b/forms/src/main/java/org/keycloak/service/FormServiceImpl.java
index 64624e4..6ec433e 100644
--- a/forms/src/main/java/org/keycloak/service/FormServiceImpl.java
+++ b/forms/src/main/java/org/keycloak/service/FormServiceImpl.java
@@ -174,7 +174,7 @@ public class FormServiceImpl implements FormService {
 
             RegisterBean register = new RegisterBean(dataBean.getFormData(), dataBean.getSocialRegistration());
 
-            SocialBean social = new SocialBean(realm, register, url);
+            SocialBean social = new SocialBean(realm, dataBean.getSocialProviders(), register, url);
             attributes.put("social", social);
         }
     }
@@ -215,7 +215,7 @@ public class FormServiceImpl implements FormService {
 
             RegisterBean register = new RegisterBean(dataBean.getFormData(), dataBean.getSocialRegistration());
 
-            SocialBean social = new SocialBean(realm, register, url);
+            SocialBean social = new SocialBean(realm, dataBean.getSocialProviders(), register, url);
             attributes.put("social", social);
         }
     }
@@ -236,7 +236,7 @@ public class FormServiceImpl implements FormService {
             RegisterBean register = new RegisterBean(dataBean.getFormData(), dataBean.getSocialRegistration());
             attributes.put("register", register);
 
-            SocialBean social = new SocialBean(realm, register, url);
+            SocialBean social = new SocialBean(realm, dataBean.getSocialProviders(), register, url);
             attributes.put("social", social);
         }
     }
diff --git a/model/api/src/main/java/org/keycloak/models/RealmModel.java b/model/api/src/main/java/org/keycloak/models/RealmModel.java
index c2300ef..5c1b468 100755
--- a/model/api/src/main/java/org/keycloak/models/RealmModel.java
+++ b/model/api/src/main/java/org/keycloak/models/RealmModel.java
@@ -2,6 +2,7 @@ package org.keycloak.models;
 
 import java.security.PrivateKey;
 import java.security.PublicKey;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -136,4 +137,12 @@ public interface RealmModel extends RoleContainerModel, RoleMapperModel, ScopeMa
     OAuthClientModel getOAuthClient(String name);
 
     List<OAuthClientModel> getOAuthClients();
+
+    HashMap<String, String> getSmtpConfig();
+
+    void setSmtpConfig(HashMap<String, String> smtpConfig);
+
+    HashMap<String, String> getSocialConfig();
+
+    void setSocialConfig(HashMap<String, String> socialConfig);
 }
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 7712490..4a8ea65 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
@@ -3,6 +3,7 @@ package org.keycloak.models.jpa.entities;
 
 import javax.persistence.*;
 import java.util.Collection;
+import java.util.HashMap;
 
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
@@ -24,6 +25,10 @@ public class RealmEntity {
     @Column(length = 2048)
     protected String privateKeyPem;
     protected String[] defaultRoles;
+    @Lob
+    protected HashMap<String, String> smtpConfig;
+    @Lob
+    protected HashMap<String, String> socialConfig;
 
     @OneToMany(cascade ={CascadeType.REMOVE}, orphanRemoval = true)
     Collection<RequiredCredentailEntity> requiredCredentials;
diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/mappings/RealmData.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/mappings/RealmData.java
index 8329e28..24e1f03 100755
--- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/mappings/RealmData.java
+++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/mappings/RealmData.java
@@ -3,6 +3,9 @@ package org.keycloak.models.picketlink.mappings;
 import org.picketlink.idm.model.AbstractPartition;
 import org.picketlink.idm.model.annotation.AttributeProperty;
 
+import java.io.Serializable;
+import java.util.HashMap;
+
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
@@ -23,6 +26,8 @@ public class RealmData extends AbstractPartition {
     private String publicKeyPem;
     private String privateKeyPem;
     private String[] defaultRoles;
+    private HashMap<String, String> smtpConfig;
+    private HashMap<String, String> socialConfig;
 
     public RealmData() {
         super(null);
@@ -163,4 +168,22 @@ public class RealmData extends AbstractPartition {
     public void setDefaultRoles(String[] defaultRoles) {
         this.defaultRoles = defaultRoles;
     }
+
+    @AttributeProperty
+    public HashMap<String, String> getSmtpConfig() {
+        return smtpConfig;
+    }
+
+    public void setSmtpConfig(HashMap<String, String> smtpConfig) {
+        this.smtpConfig = smtpConfig;
+    }
+
+    @AttributeProperty
+    public HashMap<String, String> getSocialConfig() {
+        return socialConfig;
+    }
+
+    public void setSocialConfig(HashMap<String, String> socialConfig) {
+        this.socialConfig = socialConfig;
+    }
 }
diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/mappings/RealmEntity.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/mappings/RealmEntity.java
index b44c218..74a3f09 100755
--- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/mappings/RealmEntity.java
+++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/mappings/RealmEntity.java
@@ -5,11 +5,9 @@ import org.picketlink.idm.jpa.annotations.OwnerReference;
 import org.picketlink.idm.jpa.annotations.entity.IdentityManaged;
 import org.picketlink.idm.jpa.model.sample.simple.PartitionTypeEntity;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
+import javax.persistence.*;
 import java.io.Serializable;
+import java.util.HashMap;
 
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
@@ -56,6 +54,12 @@ public class RealmEntity implements Serializable {
     private String privateKeyPem;
     @AttributeValue
     private String[] defaultRoles;
+    @AttributeValue
+    @Lob
+    private HashMap<String, String> smtpConfig;
+    @AttributeValue
+    @Lob
+    private HashMap<String, String> socialConfig;
 
 
     public PartitionTypeEntity getPartitionTypeEntity() {
@@ -177,4 +181,20 @@ public class RealmEntity implements Serializable {
     public void setPrivateKeyPem(String privateKeyPem) {
         this.privateKeyPem = privateKeyPem;
     }
+
+    public HashMap<String, String> getSmtpConfig() {
+        return smtpConfig;
+    }
+
+    public void setSmtpConfig(HashMap<String, String> smtpConfig) {
+        this.smtpConfig = smtpConfig;
+    }
+
+    public HashMap<String, String> getSocialConfig() {
+        return socialConfig;
+    }
+
+    public void setSocialConfig(HashMap<String, String> socialConfig) {
+        this.socialConfig = socialConfig;
+    }
 }
diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
index c6959f0..d3268d2 100755
--- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
+++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
@@ -679,7 +679,7 @@ public class RealmAdapter implements RealmModel {
     @Override
     public void addScopeMapping(UserModel agent, RoleModel role) {
         ScopeRelationship scope = new ScopeRelationship();
-        scope.setClient(((UserAdapter)agent).getUser());
+        scope.setClient(((UserAdapter) agent).getUser());
         scope.setScope(((RoleAdapter)role).getRole());
         getRelationshipManager().add(scope);
     }
@@ -873,4 +873,26 @@ public class RealmAdapter implements RealmModel {
         }
         return userModels;
     }
+
+    @Override
+    public HashMap<String, String> getSmtpConfig() {
+        return realm.getSmtpConfig();
+    }
+
+    @Override
+    public void setSmtpConfig(HashMap<String, String> smtpConfig) {
+        realm.setSmtpConfig(smtpConfig);
+        updateRealm();
+    }
+
+    @Override
+    public HashMap<String, String> getSocialConfig() {
+        return realm.getSocialConfig();
+    }
+
+    @Override
+    public void setSocialConfig(HashMap<String, String> socialConfig) {
+        realm.setSocialConfig(socialConfig);
+        updateRealm();
+    }
 }
diff --git a/services/src/main/java/org/keycloak/services/email/EmailSender.java b/services/src/main/java/org/keycloak/services/email/EmailSender.java
index 6fd0907..872f1fe 100755
--- a/services/src/main/java/org/keycloak/services/email/EmailSender.java
+++ b/services/src/main/java/org/keycloak/services/email/EmailSender.java
@@ -22,6 +22,7 @@
 package org.keycloak.services.email;
 
 import java.net.URI;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
@@ -52,20 +53,15 @@ public class EmailSender {
 
     private Properties properties;
 
-    public EmailSender() {
+    public EmailSender(Map<String, String> config) {
         properties = new Properties();
-        for (Entry<Object, Object> e : System.getProperties().entrySet()) {
-            String key = (String) e.getKey();
-            if (key.startsWith("keycloak.mail.smtp.")) {
-                key = key.replace("keycloak.mail.smtp.", "mail.smtp.");
-                properties.put(key, e.getValue());
-            }
+        for (Entry<String, String> e : config.entrySet()) {
+            properties.put("mail.smtp." + e.getKey(), e.getValue());
         }
     }
 
-    public void send(String address, String subject, String body) throws AddressException, MessagingException {
-
-        Session session = Session.getDefaultInstance(properties);
+    public void send(String address, String subject, String body) throws MessagingException {
+        Session session = Session.getInstance(properties);
 
         Message msg = new MimeMessage(session);
         msg.setFrom(new InternetAddress(properties.getProperty("mail.smtp.from")));
diff --git a/services/src/main/java/org/keycloak/services/FormService.java b/services/src/main/java/org/keycloak/services/FormService.java
index 70e4c0f..210fad6 100755
--- a/services/src/main/java/org/keycloak/services/FormService.java
+++ b/services/src/main/java/org/keycloak/services/FormService.java
@@ -22,14 +22,19 @@
 package org.keycloak.services;
 
 import java.net.URI;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 
+import javax.imageio.spi.ServiceRegistry;
 import javax.ws.rs.core.MultivaluedMap;
 
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.services.resources.flows.FormFlows;
+import org.keycloak.social.SocialProvider;
 
 /**
  * @author <a href="mailto:vrockai@redhat.com">Viliam Rockai</a>
@@ -51,6 +56,8 @@ public interface FormService {
         private MultivaluedMap<String, String> formData;
         private URI baseURI;
 
+        private List<SocialProvider> socialProviders;
+
         public Boolean getSocialRegistration() {
             return socialRegistration;
         }
@@ -81,11 +88,22 @@ public interface FormService {
 
         private String contextPath;
 
-        public FormServiceDataBean(RealmModel realm, UserModel userModel, MultivaluedMap<String, String> formData, String message){
+        public FormServiceDataBean(RealmModel realm, UserModel userModel, MultivaluedMap<String, String> formData, String message) {
             this.realm = realm;
             this.userModel = userModel;
             this.formData = formData;
             this.message = message;
+
+            socialProviders = new LinkedList<SocialProvider>();
+            HashMap<String, String> socialConfig = realm.getSocialConfig();
+            if (socialConfig != null) {
+                for (Iterator<SocialProvider> itr = ServiceRegistry.lookupProviders(org.keycloak.social.SocialProvider.class); itr.hasNext(); ) {
+                    SocialProvider p = itr.next();
+                    if (socialConfig.containsKey(p.getId() + ".key") && socialConfig.containsKey(p.getId() + ".secret")) {
+                        socialProviders.add(p);
+                    }
+                }
+            }
         }
 
         public URI getBaseURI() {
@@ -128,6 +146,10 @@ public interface FormService {
             this.userModel = userModel;
         }
 
+        public List<SocialProvider> getSocialProviders() {
+            return socialProviders;
+        }
+
         public FormFlows.MessageType getMessageType() {
             return messageType;
         }
diff --git a/services/src/main/java/org/keycloak/services/managers/RealmManager.java b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
index bae0cc2..fdb8ea7 100755
--- a/services/src/main/java/org/keycloak/services/managers/RealmManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
@@ -96,6 +96,14 @@ public class RealmManager {
         } else {
             disableAccountManagement(realm);
         }
+
+        if (rep.getSmtpServer() != null) {
+            realm.setSmtpConfig(new HashMap(rep.getSmtpServer()));
+        }
+
+        if (rep.getSocialProviders() != null) {
+            realm.setSocialConfig(new HashMap(rep.getSocialProviders()));
+        }
     }
 
     private void enableAccountManagement(RealmModel realm) {
@@ -248,6 +256,14 @@ public class RealmManager {
         if (rep.isAccountManagement() != null && rep.isAccountManagement()) {
             enableAccountManagement(newRealm);
         }
+
+        if (rep.getSmtpServer() != null) {
+            newRealm.setSmtpConfig(new HashMap(rep.getSmtpServer()));
+        }
+
+        if (rep.getSocialProviders() != null) {
+            newRealm.setSocialConfig(new HashMap(rep.getSocialProviders()));
+        }
     }
 
     public void createRole(RealmModel newRealm, RoleRepresentation roleRep) {
@@ -403,6 +419,8 @@ public class RealmManager {
         rep.setTokenLifespan(realm.getTokenLifespan());
         rep.setAccessCodeLifespan(realm.getAccessCodeLifespan());
         rep.setAccessCodeLifespanUserAction(realm.getAccessCodeLifespanUserAction());
+        rep.setSmtpServer(realm.getSmtpConfig());
+        rep.setSocialProviders(realm.getSocialConfig());
 
         ApplicationModel accountManagementApplication = realm.getApplicationNameMap().get(Constants.ACCOUNT_MANAGEMENT_APPLICATION);
         rep.setAccountManagement(accountManagementApplication != null && accountManagementApplication.isEnabled());
diff --git a/services/src/main/java/org/keycloak/services/resources/flows/FormFlows.java b/services/src/main/java/org/keycloak/services/resources/flows/FormFlows.java
index fe924fb..68df5a9 100755
--- a/services/src/main/java/org/keycloak/services/resources/flows/FormFlows.java
+++ b/services/src/main/java/org/keycloak/services/resources/flows/FormFlows.java
@@ -89,7 +89,7 @@ public class FormFlows {
             case UPDATE_PASSWORD:
                 return forwardToActionForm(Pages.LOGIN_UPDATE_PASSWORD, Messages.ACTION_WARN_PASSWD);
             case VERIFY_EMAIL:
-                new EmailSender().sendEmailVerification(userModel, realm, accessCode, uriInfo);
+                new EmailSender(realm.getSmtpConfig()).sendEmailVerification(userModel, realm, accessCode, uriInfo);
                 return forwardToActionForm(Pages.LOGIN_VERIFY_EMAIL, Messages.ACTION_WARN_EMAIL);
             default:
                 return Response.serverError().build();
diff --git a/services/src/main/java/org/keycloak/services/resources/RequiredActionsService.java b/services/src/main/java/org/keycloak/services/resources/RequiredActionsService.java
index eeed370..869a477 100755
--- a/services/src/main/java/org/keycloak/services/resources/RequiredActionsService.java
+++ b/services/src/main/java/org/keycloak/services/resources/RequiredActionsService.java
@@ -260,7 +260,7 @@ public class RequiredActionsService {
         accessCode.setRequiredActions(requiredActions);
         accessCode.setExpiration(System.currentTimeMillis() / 1000 + realm.getAccessCodeLifespanUserAction());
 
-        new EmailSender().sendPasswordReset(user, realm, accessCode, uriInfo);
+        new EmailSender(realm.getSmtpConfig()).sendPasswordReset(user, realm, accessCode, uriInfo);
 
         return Flows.forms(realm, request, uriInfo).setError("emailSent").setErrorType(FormFlows.MessageType.SUCCESS)
                 .forwardToPasswordReset();
diff --git a/services/src/main/java/org/keycloak/services/resources/SocialResource.java b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
index 57a5aaf..b25285b 100755
--- a/services/src/main/java/org/keycloak/services/resources/SocialResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
@@ -136,8 +136,8 @@ public class SocialResource {
             return oauth.forwardToSecurityFailure("Login requester not enabled.");
         }
 
-        String key = System.getProperty("keycloak.social." + requestData.getProviderId() + ".key");
-        String secret = System.getProperty("keycloak.social." + requestData.getProviderId() + ".secret");
+        String key = realm.getSocialConfig().get(requestData.getProviderId() + ".key");
+        String secret = realm.getSocialConfig().get(requestData.getProviderId() + ".secret");
         String callbackUri = Urls.socialCallback(uriInfo.getBaseUri()).toString();
         SocialProviderConfig config = new SocialProviderConfig(key, secret, callbackUri);
 
@@ -228,8 +228,8 @@ public class SocialResource {
             return Flows.forms(realm, request, uriInfo).setError("Social provider not found").forwardToErrorPage();
         }
 
-        String key = System.getProperty("keycloak.social." + providerId + ".key");
-        String secret = System.getProperty("keycloak.social." + providerId + ".secret");
+        String key = realm.getSocialConfig().get(providerId + ".key");
+        String secret = realm.getSocialConfig().get(providerId + ".secret");
         String callbackUri = Urls.socialCallback(uriInfo.getBaseUri()).toString();
 
         SocialProviderConfig config = new SocialProviderConfig(key, secret, callbackUri);
diff --git a/services/src/test/java/org/keycloak/services/email/EmailSenderTest.java b/services/src/test/java/org/keycloak/services/email/EmailSenderTest.java
index 08354dd..720af17 100644
--- a/services/src/test/java/org/keycloak/services/email/EmailSenderTest.java
+++ b/services/src/test/java/org/keycloak/services/email/EmailSenderTest.java
@@ -3,6 +3,7 @@ package org.keycloak.services.email;
 import java.io.IOException;
 import java.lang.Thread.UncaughtExceptionHandler;
 import java.net.SocketException;
+import java.util.HashMap;
 
 import javax.mail.MessagingException;
 import javax.mail.internet.AddressException;
@@ -19,6 +20,7 @@ import com.icegreen.greenmail.util.ServerSetup;
 public class EmailSenderTest {
 
     private GreenMail greenMail;
+    private EmailSender emailSender;
 
     @Before
     public void before() {
@@ -27,9 +29,12 @@ public class EmailSenderTest {
         greenMail = new GreenMail(setup);
         greenMail.start();
 
-        System.setProperty("keycloak.mail.smtp.from", "auto@keycloak.org");
-        System.setProperty("keycloak.mail.smtp.host", "localhost");
-        System.setProperty("keycloak.mail.smtp.port", "3025");
+        HashMap<String,String> config = new HashMap<String, String>();
+        config.put("from", "auto@keycloak.org");
+        config.put("host", "localhost");
+        config.put("port", "3025");
+
+        emailSender = new EmailSender(config);
     }
 
     @After
@@ -53,7 +58,6 @@ public class EmailSenderTest {
 
     @Test
     public void sendMail() throws AddressException, MessagingException, IOException {
-        EmailSender emailSender = new EmailSender();
         emailSender.send("test@test.com", "Test subject", "Test body");
 
         MimeMessage[] receivedMessages = greenMail.getReceivedMessages();
diff --git a/services/src/test/java/org/keycloak/test/ModelTest.java b/services/src/test/java/org/keycloak/test/ModelTest.java
index a75fa76..9f9400c 100755
--- a/services/src/test/java/org/keycloak/test/ModelTest.java
+++ b/services/src/test/java/org/keycloak/test/ModelTest.java
@@ -1,7 +1,9 @@
 package org.keycloak.test;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import org.junit.After;
 import org.junit.Assert;
@@ -51,6 +53,16 @@ public class ModelTest extends AbstractKeycloakServerTest {
         realm.setPrivateKeyPem("1234234");
         realm.addDefaultRole("default-role");
 
+        HashMap<String, String> smtp = new HashMap<String,String>();
+        smtp.put("from", "auto@keycloak");
+        smtp.put("hostname", "localhost");
+        realm.setSmtpConfig(smtp);
+
+        HashMap<String, String> social = new HashMap<String,String>();
+        social.put("google.key", "1234");
+        social.put("google.secret", "5678");
+        realm.setSmtpConfig(social);
+
         RealmModel peristed = manager.getRealm(realm.getId());
         assertEquals(realm, peristed);
 
@@ -75,6 +87,9 @@ public class ModelTest extends AbstractKeycloakServerTest {
         Assert.assertEquals(expected.getPrivateKeyPem(), actual.getPrivateKeyPem());
 
         assertEquals(expected.getDefaultRoles(), actual.getDefaultRoles());
+
+        Assert.assertEquals(expected.getSmtpConfig(), actual.getSmtpConfig());
+        Assert.assertEquals(expected.getSocialConfig(), actual.getSocialConfig());
     }
 
     public static void assertEquals(List<RoleModel> expected, List<RoleModel> actual) {
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/GreenMailRule.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/GreenMailRule.java
index 7954942..386ddb7 100644
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/GreenMailRule.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/GreenMailRule.java
@@ -41,23 +41,8 @@ public class GreenMailRule extends ExternalResource {
 
     private GreenMail greenMail;
 
-    private Properties originalProperties = new Properties();
-
     @Override
     protected void before() throws Throwable {
-        Iterator<Entry<Object, Object>> itr = System.getProperties().entrySet().iterator();
-        while (itr.hasNext()) {
-            Entry<Object, Object> e = itr.next();
-            if (((String) e.getKey()).startsWith("keycloak.mail")) {
-                originalProperties.put(e.getKey(), e.getValue());
-                itr.remove();
-            }
-        }
-        
-        System.setProperty("keycloak.mail.smtp.from", "auto@keycloak.org");
-        System.setProperty("keycloak.mail.smtp.host", "localhost");
-        System.setProperty("keycloak.mail.smtp.port", "3025");
-        
         ServerSetup setup = new ServerSetup(3025, "localhost", "smtp");
 
         greenMail = new GreenMail(setup);
@@ -81,11 +66,6 @@ public class GreenMailRule extends ExternalResource {
 
             greenMail.stop();
         }
-
-        System.getProperties().remove("keycloak.mail.smtp.from");
-        System.getProperties().remove("keycloak.mail.smtp.host");
-        System.getProperties().remove("keycloak.mail.smtp.port");
-        System.getProperties().putAll(originalProperties);
     }
 
     public MimeMessage[] getReceivedMessages() {
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/social/SocialLoginTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/social/SocialLoginTest.java
index 056af5c..4f87a10 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/social/SocialLoginTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/social/SocialLoginTest.java
@@ -43,6 +43,9 @@ import org.keycloak.testsuite.rule.WebRule;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
@@ -54,6 +57,11 @@ public class SocialLoginTest {
         public void config(RealmManager manager, RealmModel defaultRealm, RealmModel appRealm) {
             appRealm.setSocial(true);
             appRealm.setAutomaticRegistrationAfterSocialLogin(true);
+
+            HashMap<String, String> socialConfig = new HashMap<String, String>();
+            socialConfig.put("dummy.key", "1234");
+            socialConfig.put("dummy.secret", "1234");
+            appRealm.setSocialConfig(socialConfig);
         }
     });
 
diff --git a/testsuite/integration/src/test/resources/testrealm.json b/testsuite/integration/src/test/resources/testrealm.json
index 161f11e..f4ef0c5 100755
--- a/testsuite/integration/src/test/resources/testrealm.json
+++ b/testsuite/integration/src/test/resources/testrealm.json
@@ -16,6 +16,11 @@
     "requiredApplicationCredentials": [ "password" ],
     "requiredOAuthClientCredentials": [ "password" ],
     "defaultRoles": [ "user" ],
+    "smtpServer": {
+        "from": "auto@keycloak.org",
+        "host": "localhost",
+        "port":"3025"
+    },
     "users" : [
         {
             "username" : "test-user@localhost",