diff --git a/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/model/LogBean.java b/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/model/LogBean.java
index f138f8d..06a07e7 100644
--- a/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/model/LogBean.java
+++ b/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/model/LogBean.java
@@ -5,6 +5,7 @@ import org.keycloak.audit.Event;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -37,7 +38,7 @@ public class LogBean {
}
public String getEvent() {
- return event.getEvent().replace('_', ' ');
+ return event.getEvent();
}
public String getClient() {
@@ -48,6 +49,32 @@ public class LogBean {
return event.getIpAddress();
}
+ public List<DetailBean> getDetails() {
+ List<DetailBean> details = new LinkedList<DetailBean>();
+ for (Map.Entry<String, String> e : event.getDetails().entrySet()) {
+ details.add(new DetailBean(e));
+ }
+ return details;
+ }
+
+ }
+
+ public static class DetailBean {
+
+ private Map.Entry<String, String> entry;
+
+ public DetailBean(Map.Entry<String, String> entry) {
+ this.entry = entry;
+ }
+
+ public String getKey() {
+ return entry.getKey();
+ }
+
+ public String getValue() {
+ return entry.getValue();
+ }
+
}
}
diff --git a/forms/common-themes/src/main/resources/theme/account/base/log.ftl b/forms/common-themes/src/main/resources/theme/account/base/log.ftl
index 9752317..816722e 100644
--- a/forms/common-themes/src/main/resources/theme/account/base/log.ftl
+++ b/forms/common-themes/src/main/resources/theme/account/base/log.ftl
@@ -14,6 +14,7 @@
<td>Event</td>
<td>IP</td>
<td>Client</td>
+ <td>Details</td>
</tr>
</thead>
@@ -23,10 +24,12 @@
<td>${event.date?datetime}</td>
<td>${event.event}</td>
<td>${event.ipAddress}</td>
- <td>${event.client}</td
+ <td>${event.client}</td>
+ <td><#list event.details as detail>${detail.key} = ${detail.value} <#if detail_has_next>, </#if></#list></td>
</tr>
</#list>
</tbody>
+
</table>
</@layout.mainLayout>
\ No newline at end of file
diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java
index 9f47d7c..febd31c 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -78,7 +78,13 @@ import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.Variant;
import java.net.URI;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.UUID;
/**
@@ -88,6 +94,20 @@ public class AccountService {
private static final Logger logger = Logger.getLogger(AccountService.class);
+ private static final String[] AUDIT_EVENTS = {Events.LOGIN, Events.LOGOUT, Events.REGISTER, Events.REMOVE_SOCIAL_LINK, Events.REMOVE_TOTP, Events.SEND_RESET_PASSWORD,
+ Events.SEND_VERIFY_EMAIL, Events.SOCIAL_LINK, Events.UPDATE_EMAIL, Events.UPDATE_PASSWORD, Events.UPDATE_PASSWORD, Events.UPDATE_TOTP, Events.VERIFY_EMAIL};
+
+ private static final Set<String> AUDIT_DETAILS = new HashSet<String>();
+ static {
+ AUDIT_DETAILS.add(Details.UPDATED_EMAIL);
+ AUDIT_DETAILS.add(Details.EMAIL);
+ AUDIT_DETAILS.add(Details.PREVIOUS_EMAIL);
+ AUDIT_DETAILS.add(Details.USERNAME);
+ AUDIT_DETAILS.add(Details.REMEMBER_ME);
+ AUDIT_DETAILS.add(Details.REGISTER_METHOD);
+ AUDIT_DETAILS.add(Details.AUTH_METHOD);
+ }
+
public static final String KEYCLOAK_ACCOUNT_IDENTITY_COOKIE = "KEYCLOAK_ACCOUNT_IDENTITY";
private RealmModel realm;
@@ -116,7 +136,7 @@ public class AccountService {
this.realm = realm;
this.application = application;
this.audit = audit;
- this.authManager = new AppAuthManager(KEYCLOAK_ACCOUNT_IDENTITY_COOKIE, tokenManager);
+ this.authManager = new AppAuthManager(KEYCLOAK_ACCOUNT_IDENTITY_COOKIE, tokenManager);
this.socialRequestManager = socialRequestManager;
}
@@ -198,7 +218,20 @@ public class AccountService {
@GET
public Response logPage() {
if (auth != null) {
- List<Event> events = auditProvider.createQuery().user(auth.getUser().getId()).maxResults(20).getResultList();
+ List<Event> events = auditProvider.createQuery().event(AUDIT_EVENTS).user(auth.getUser().getId()).maxResults(30).getResultList();
+ for (Event e : events) {
+ e.setEvent(e.getEvent().replace('_', ' '));
+
+ Map<String, String> details = new HashMap<String, String>();
+ Iterator<String> itr = e.getDetails().keySet().iterator();
+ for (Map.Entry<String, String> d : e.getDetails().entrySet()) {
+ if (AUDIT_DETAILS.contains(d.getKey())) {
+ details.put(d.getKey().replace('_', ' '), d.getValue());
+ }
+ }
+
+ e.setDetails(details);
+ }
account.setEvents(events);
}
return forwardToPage("log", AccountPages.LOG);
@@ -475,7 +508,7 @@ public class AccountService {
}
if (referrerUri != null) {
- return new String[] { referrer, referrerUri };
+ return new String[]{referrer, referrerUri};
}
} else if (referrerUri != null) {
ClientModel client = realm.getOAuthClient(referrer);
@@ -483,7 +516,7 @@ public class AccountService {
referrerUri = TokenService.verifyRedirectUri(referrerUri, application);
if (referrerUri != null) {
- return new String[] { referrer, referrerUri };
+ return new String[]{referrer, referrerUri};
}
}
}
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 c06fc3d..815418a 100755
--- a/services/src/main/java/org/keycloak/services/resources/SocialResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
@@ -132,7 +132,7 @@ public class SocialResource {
Audit audit = createAudit(realm)
.event(Events.LOGIN)
.detail(Details.RESPONSE_TYPE, "code")
- .detail(Details.AUTH_METHOD, "social");
+ .detail(Details.AUTH_METHOD, "social@" + provider.getId());
OAuthFlows oauth = Flows.oauth(realm, request, uriInfo, authManager, tokenManager);
@@ -272,7 +272,7 @@ public class SocialResource {
.event(Events.LOGIN).client(clientId)
.detail(Details.REDIRECT_URI, redirectUri)
.detail(Details.RESPONSE_TYPE, "code")
- .detail(Details.AUTH_METHOD, "social");
+ .detail(Details.AUTH_METHOD, "social@" + providerId);
SocialProvider provider = SocialLoader.load(providerId);
if (provider == null) {