keycloak-memoizeit

Details

diff --git a/forms/common-themes/src/main/resources/theme/base/login/login.ftl b/forms/common-themes/src/main/resources/theme/base/login/login.ftl
index 388d180..840bf4e 100755
--- a/forms/common-themes/src/main/resources/theme/base/login/login.ftl
+++ b/forms/common-themes/src/main/resources/theme/base/login/login.ftl
@@ -70,9 +70,7 @@
             <div id="kc-social-providers">
                 <ul>
                     <#list social.providers as p>
-                        <#assign zocialclass=p.alias>
-                        <#if zocialclass=="microsoft"><#assign zocialclass="windows"></#if>
-                        <li><a href="${p.loginUrl}" id="zocial-${p.alias}" class="zocial ${zocialclass}"> <span class="text">${p.alias}</span></a></li>
+                        <li><a href="${p.loginUrl}" id="zocial-${p.alias}" class="zocial ${p.providerId}"> <span class="text">${p.alias}</span></a></li>
                     </#list>
                 </ul>
             </div>
diff --git a/forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css b/forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css
index 0c05a4b..1258b22 100644
--- a/forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css
+++ b/forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css
@@ -246,6 +246,9 @@ ol#kc-totp-settings li:first-of-type {
 .zocial.facebook,
 .zocial.github,
 .zocial.google,
+.zocial.microsoft,
+.zocial.stackoverflow,
+.zocial.linkedin,
 .zocial.twitter {
     background-image: none;
     border-radius: 2px;
@@ -267,10 +270,18 @@ ol#kc-totp-settings li:first-of-type {
 .zocial.facebook:hover,
 .zocial.github:hover,
 .zocial.google:hover,
+.zocial.microsoft:hover,
+.zocial.stackoverflow:hover,
+.zocial.linkedin:hover,
 .zocial.twitter:hover {
     background-image: linear-gradient(rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0.2) 100%) !important;
 }
 
+/* Copy of zocial windows classes to be used for microsoft's social provider button */
+.zocial.microsoft {background-color: #0052a4; color: #fff;}
+.zocial.microsoft:before { content: "\f15d"; }
+
+
 @media (min-width: 768px) {
     #kc-container-wrapper {
         bottom: 13%;
diff --git a/social/microsoft/src/main/java/org/keycloak/social/microsoft/MicrosoftIdentityProvider.java b/social/microsoft/src/main/java/org/keycloak/social/microsoft/MicrosoftIdentityProvider.java
index 6d84c7e..b2f3856 100755
--- a/social/microsoft/src/main/java/org/keycloak/social/microsoft/MicrosoftIdentityProvider.java
+++ b/social/microsoft/src/main/java/org/keycloak/social/microsoft/MicrosoftIdentityProvider.java
@@ -15,62 +15,64 @@ import org.keycloak.broker.provider.IdentityBrokerException;
 import org.keycloak.broker.provider.util.SimpleHttp;
 import org.keycloak.social.SocialIdentityProvider;
 
-
 /**
+ * 
+ * Identity provider for Microsoft account. Uses OAuth 2 protocol of Windows Live Services as documented at <a href="https://msdn.microsoft.com/en-us/library/hh243647.aspx">https://msdn.microsoft.com/en-us/library/hh243647.aspx</a>  
+ * 
  * @author Vlastimil Elias (velias at redhat dot com)
  */
 public class MicrosoftIdentityProvider extends AbstractOAuth2IdentityProvider implements SocialIdentityProvider {
-    
+
     private static final Logger log = Logger.getLogger(MicrosoftIdentityProvider.class);
 
-	public static final String AUTH_URL = "https://login.live.com/oauth20_authorize.srf";
-	public static final String TOKEN_URL = "https://login.live.com/oauth20_token.srf";
-	public static final String PROFILE_URL = "https://apis.live.net/v5.0/me";
-	public static final String DEFAULT_SCOPE = "wl.basic,wl.emails";
+    public static final String AUTH_URL = "https://login.live.com/oauth20_authorize.srf";
+    public static final String TOKEN_URL = "https://login.live.com/oauth20_token.srf";
+    public static final String PROFILE_URL = "https://apis.live.net/v5.0/me";
+    public static final String DEFAULT_SCOPE = "wl.basic,wl.emails";
 
-	public MicrosoftIdentityProvider(OAuth2IdentityProviderConfig config) {
-		super(config);
-		config.setAuthorizationUrl(AUTH_URL);
-		config.setTokenUrl(TOKEN_URL);
-		config.setUserInfoUrl(PROFILE_URL);
-	}
+    public MicrosoftIdentityProvider(OAuth2IdentityProviderConfig config) {
+        super(config);
+        config.setAuthorizationUrl(AUTH_URL);
+        config.setTokenUrl(TOKEN_URL);
+        config.setUserInfoUrl(PROFILE_URL);
+    }
 
-	@Override
-	protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
-		try {
-		    String URL = PROFILE_URL + "?access_token=" + URLEncoder.encode(accessToken,"UTF-8");
+    @Override
+    protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
+        try {
+            String URL = PROFILE_URL + "?access_token=" + URLEncoder.encode(accessToken, "UTF-8");
             if (log.isDebugEnabled()) {
                 log.debug("Microsoft Live user profile request to: " + URL);
             }
-			JsonNode profile = JsonSimpleHttp.asJson(SimpleHttp.doGet(URL));
+            JsonNode profile = JsonSimpleHttp.asJson(SimpleHttp.doGet(URL));
+
+            String id = getJsonProperty(profile, "id");
+
+            String email = null;
+            if (profile.has("emails")) {
+                email = getJsonProperty(profile.get("emails"), "preferred");
+            }
 
-			String id = getJsonProperty(profile, "id");
-			
-			String email = null; 
-			if(profile.has("emails")){
-			    email = getJsonProperty(profile.get("emails"), "preferred");
-			}
-			
-			BrokeredIdentityContext user = new BrokeredIdentityContext(id);
+            BrokeredIdentityContext user = new BrokeredIdentityContext(id);
 
-			user.setUsername(email!=null?email:id);
-			user.setFirstName(getJsonProperty(profile, "first_name"));
-			user.setLastName(getJsonProperty(profile, "last_name"));
-			if(email!=null)
-			  user.setEmail(email);
-			user.setIdpConfig(getConfig());
-			user.setIdp(this);
+            user.setUsername(email != null ? email : id);
+            user.setFirstName(getJsonProperty(profile, "first_name"));
+            user.setLastName(getJsonProperty(profile, "last_name"));
+            if (email != null)
+                user.setEmail(email);
+            user.setIdpConfig(getConfig());
+            user.setIdp(this);
 
-			AbstractJsonUserAttributeMapper.storeUserProfileForMapper(user, profile, getConfig().getAlias());
+            AbstractJsonUserAttributeMapper.storeUserProfileForMapper(user, profile, getConfig().getAlias());
 
-			return user;
-		} catch (Exception e) {
-			throw new IdentityBrokerException("Could not obtain user profile from Microsoft Live ID.", e);
-		}
-	}
+            return user;
+        } catch (Exception e) {
+            throw new IdentityBrokerException("Could not obtain user profile from Microsoft Live ID.", e);
+        }
+    }
 
-	@Override
-	protected String getDefaultScopes() {
-		return DEFAULT_SCOPE;
-	}
+    @Override
+    protected String getDefaultScopes() {
+        return DEFAULT_SCOPE;
+    }
 }