keycloak-uncached

Details

diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/index.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/index.html
index 8ec75f4..3e50295 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/index.html
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/index.html
@@ -71,7 +71,6 @@
             <span>Loading...</span>
         </div>
     </div>
-    <div id="serverInfo">Keycloak {{serverInfo.version}}</div>
 </div>
 
 </body>
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/app.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/app.js
index 6ebea5f..3198abf 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/app.js
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/app.js
@@ -863,6 +863,9 @@ module.config([ '$routeProvider', function($routeProvider) {
             },
             controller : 'RealmBruteForceCtrl'
         })
+        .when('/server-info', {
+            templateUrl : 'partials/server-info.html'
+        })
         .when('/logout', {
             templateUrl : 'partials/home.html',
             controller : 'LogoutCtrl'
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/menu.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/menu.html
index 13e4ea1..d7b6d7a 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/menu.html
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/menu.html
@@ -20,6 +20,7 @@
 		                </a>
 		                <ul class="dropdown-menu">
 		                    <li><a href="{{authUrl}}/realms/{{auth.user.realm}}/account?referrer=security-admin-console">Manage Account</a></li>
+		                    <li><a href="#/server-info">Server Info</a></li>
 		                    <li class="separator"><a href="" ng-click="auth.authz.logout()">Sign Out</a></li>
 		                </ul>
 		            </li>
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/server-info.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/server-info.html
new file mode 100755
index 0000000..47fabd5
--- /dev/null
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/server-info.html
@@ -0,0 +1,30 @@
+<div id="content-area" class="col-sm-12" role="main">
+    <h2></h2>
+
+    <div id="content">
+
+        <h2>Server Info</h2>
+
+        <table class="table table-striped table-bordered">
+            <tr>
+                <td>Version</td>
+                <td>{{serverInfo.version}}</td>
+            </tr>
+            <tr>
+                <td>Server Time</td>
+                <td>{{serverInfo.serverTime}}</td>
+            </tr>
+            <tr>
+                <td>Providers</td>
+                <td>
+                    <table class="table table-striped table-bordered">
+                        <tr data-ng-repeat="(spi, providers) in serverInfo.providers">
+                            <td>{{spi}}</td>
+                            <td>{{providers.sort().join(', ')}}</td>
+                        </tr>
+                    </table>
+                </td>
+            </tr>
+        </table>
+    </div>
+</div>
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/admin-console.css b/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/admin-console.css
index e72d4d6..e0e2450 100644
--- a/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/admin-console.css
+++ b/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/admin-console.css
@@ -836,11 +836,4 @@ legend .kc-icon-collapse {
 
 table table {
     margin-bottom: 0 !important;
-}
-
-#serverInfo {
-    color: #666;
-    position: absolute;
-    bottom: 10px;
-    right: 10px;
 }
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/base-styles.css b/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/base-styles.css
index e7f8217..f03a064 100755
--- a/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/base-styles.css
+++ b/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/base-styles.css
@@ -33,3 +33,8 @@
     border-top-color: rgba(255,255,255,0.05);
 }
 
+.dropdown-menu .separator {
+    border-top: 1px solid #ddd;
+    margin-top: 5px;
+    padding-top: 5px;
+}
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
index a0af968..837b56b 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
@@ -9,17 +9,21 @@ import org.keycloak.freemarker.ThemeProvider;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.protocol.LoginProtocol;
 import org.keycloak.protocol.LoginProtocolFactory;
+import org.keycloak.provider.Provider;
 import org.keycloak.provider.ProviderFactory;
+import org.keycloak.provider.Spi;
 import org.keycloak.social.SocialProvider;
 import org.keycloak.util.ProviderLoader;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.core.Context;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.ServiceLoader;
 import java.util.Set;
 
 /**
@@ -38,15 +42,25 @@ public class ServerInfoAdminResource {
     @GET
     public ServerInfoRepresentation getInfo() {
         ServerInfoRepresentation info = new ServerInfoRepresentation();
-        info.setVersion(Version.VERSION);
+        info.version = Version.VERSION;
+        info.serverTime = new Date().toString();
         setSocialProviders(info);
         setThemes(info);
         setEventListeners(info);
         setProtocols(info);
         setApplicationImporters(info);
+        setProviders(info);
         return info;
     }
 
+    private void setProviders(ServerInfoRepresentation info) {
+        Map<String, Set<String>> providers = new HashMap<String, Set<String>>();
+        for (Spi spi : ServiceLoader.load(Spi.class)) {
+            providers.put(spi.getName(), session.listProviderIds(spi.getProviderClass()));
+        }
+        info.providers = providers;
+    }
+
     private void setThemes(ServerInfoRepresentation info) {
         ThemeProvider themeProvider = session.getProvider(ThemeProvider.class, "extending");
         info.themes = new HashMap<String, List<String>>();
@@ -100,24 +114,27 @@ public class ServerInfoAdminResource {
 
         private String version;
 
+        private String serverTime;
+
         private Map<String, List<String>> themes;
 
         private List<String> socialProviders;
         private List<String> protocols;
         private List<Map<String, String>> applicationImporters;
 
+        private Map<String, Set<String>> providers;
 
         private List<String> eventListeners;
 
         public ServerInfoRepresentation() {
         }
 
-        public String getVersion() {
-            return version;
+        public String getServerTime() {
+            return serverTime;
         }
 
-        public void setVersion(String version) {
-            this.version = version;
+        public String getVersion() {
+            return version;
         }
 
         public Map<String, List<String>> getThemes() {
@@ -139,6 +156,10 @@ public class ServerInfoAdminResource {
         public List<Map<String, String>> getApplicationImporters() {
             return applicationImporters;
         }
+
+        public Map<String, Set<String>> getProviders() {
+            return providers;
+        }
     }
 
 }