You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2021/07/05 13:01:54 UTC
[syncope] 02/03: [SYNCOPE-1455] Adding Route sessions to Console
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git
commit a17545cd145c619d3bf44e5a51b8de8ffdf0fd6b
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon Jul 5 14:40:52 2021 +0200
[SYNCOPE-1455] Adding Route sessions to Console
---
.../apache/syncope/client/console/pages/SRA.java | 17 +++-
.../apache/syncope/client/console/pages/WA.java | 6 +-
...toryPanel.java => AMSessionDirectoryPanel.java} | 81 ++++++++-------
.../{WASessionPanel.java => AMSessionPanel.java} | 22 ++--
.../client/console/panels/SRAStatisticsPanel.java | 3 +-
...eserializer.java => AMSessionDeserializer.java} | 15 +--
.../client/console/rest/AMSessionRestClient.java | 81 +++++++++++++++
...csRestClient.java => SRASessionRestClient.java} | 43 ++++----
.../console/rest/SRAStatisticsRestClient.java | 8 +-
.../client/console/rest/WASessionRestClient.java | 71 +++++--------
.../syncope/client/console/pages/SRA.properties | 1 +
.../client/console/pages/SRA_fr_CA.properties | 1 +
.../syncope/client/console/pages/SRA_it.properties | 1 +
.../syncope/client/console/pages/SRA_ja.properties | 1 +
.../client/console/pages/SRA_pt_BR.properties | 1 +
.../syncope/client/console/pages/SRA_ru.properties | 1 +
...operties => AMSessionDirectoryPanel.properties} | 2 +-
...es => AMSessionDirectoryPanel_fr_CA.properties} | 2 +-
...rties => AMSessionDirectoryPanel_it.properties} | 2 +-
...rties => AMSessionDirectoryPanel_ja.properties} | 2 +-
...es => AMSessionDirectoryPanel_pt_BR.properties} | 2 +-
...rties => AMSessionDirectoryPanel_ru.properties} | 2 +-
.../{WASessionPanel.html => AMSessionPanel.html} | 0
.../org/apache/syncope/common/lib/AMSession.java | 16 ++-
.../syncope/common/lib/types/AMEntitlement.java | 4 +
.../sra/src/main/resources/application.properties | 2 +-
pom.xml | 7 +-
.../apache/syncope/sra/SyncopeSRAApplication.java | 12 +++
.../apache/syncope/sra/actuator/SRASessions.java | 112 +++++++++++++++++++++
sra/src/main/resources/application.properties | 2 +-
30 files changed, 368 insertions(+), 152 deletions(-)
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/pages/SRA.java b/client/am/console/src/main/java/org/apache/syncope/client/console/pages/SRA.java
index 45f23a2..721a014 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/pages/SRA.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/pages/SRA.java
@@ -26,7 +26,9 @@ import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.console.annotations.AMPage;
import org.apache.syncope.client.console.panels.SRARouteDirectoryPanel;
import org.apache.syncope.client.console.panels.SRAStatisticsPanel;
+import org.apache.syncope.client.console.panels.AMSessionPanel;
import org.apache.syncope.client.console.rest.SRARouteRestClient;
+import org.apache.syncope.client.console.rest.SRASessionRestClient;
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.syncope.common.keymaster.client.api.ServiceOps;
import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
@@ -103,7 +105,20 @@ public class SRA extends BasePage {
@Override
public Panel getPanel(final String panelId) {
- return new SRAStatisticsPanel(panelId, instances, getPageReference());
+ return new SRAStatisticsPanel(panelId, instances);
+ }
+ });
+ }
+
+ if (!instances.isEmpty() && SyncopeConsoleSession.get().owns(AMEntitlement.SRA_SESSION_LIST)) {
+ tabs.add(new AbstractTab(new ResourceModel("sessions")) {
+
+ private static final long serialVersionUID = 5211692813425391144L;
+
+ @Override
+ public Panel getPanel(final String panelId) {
+ return new AMSessionPanel(panelId, new SRASessionRestClient(instances),
+ AMEntitlement.SRA_SESSION_LIST, AMEntitlement.SRA_SESSION_DELETE, getPageReference());
}
});
}
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/pages/WA.java b/client/am/console/src/main/java/org/apache/syncope/client/console/pages/WA.java
index 6287b19..90b83d4 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/pages/WA.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/pages/WA.java
@@ -38,8 +38,9 @@ import org.apache.syncope.client.console.clientapps.ClientApps;
import org.apache.syncope.client.console.panels.OIDC;
import org.apache.syncope.client.console.panels.SAML2;
import org.apache.syncope.client.console.panels.WAConfigDirectoryPanel;
-import org.apache.syncope.client.console.panels.WASessionPanel;
+import org.apache.syncope.client.console.panels.AMSessionPanel;
import org.apache.syncope.client.console.rest.WAConfigRestClient;
+import org.apache.syncope.client.console.rest.WASessionRestClient;
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
import org.apache.syncope.common.keymaster.client.api.ServiceOps;
@@ -210,7 +211,8 @@ public class WA extends BasePage {
@Override
public Panel getPanel(final String panelId) {
- return new WASessionPanel(panelId, instances, getPageReference());
+ return new AMSessionPanel(panelId, new WASessionRestClient(instances),
+ AMEntitlement.WA_SESSION_LIST, AMEntitlement.WA_SESSION_DELETE, getPageReference());
}
});
}
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/WASessionDirectoryPanel.java b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.java
similarity index 72%
rename from client/am/console/src/main/java/org/apache/syncope/client/console/panels/WASessionDirectoryPanel.java
rename to client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.java
index db74094..74ef526 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/WASessionDirectoryPanel.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.java
@@ -27,10 +27,9 @@ import java.util.stream.Stream;
import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.console.commons.AMConstants;
import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
-import org.apache.syncope.client.console.panels.WASessionDirectoryPanel.WASessionProvider;
-import org.apache.syncope.client.console.panels.WASessionPanel.WASessionSearchEvent;
-import org.apache.syncope.client.console.rest.WASession;
-import org.apache.syncope.client.console.rest.WASessionRestClient;
+import org.apache.syncope.client.console.panels.AMSessionDirectoryPanel.AMSessionProvider;
+import org.apache.syncope.client.console.panels.AMSessionPanel.AMSessionSearchEvent;
+import org.apache.syncope.client.console.rest.AMSessionRestClient;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -40,9 +39,8 @@ import org.apache.syncope.client.console.wicket.markup.html.form.JsonEditorPanel
import org.apache.syncope.client.ui.commons.Constants;
import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
-import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
+import org.apache.syncope.common.lib.AMSession;
import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.types.AMEntitlement;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.IEvent;
@@ -55,24 +53,31 @@ import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
-public class WASessionDirectoryPanel
- extends DirectoryPanel<WASession, WASession, WASessionProvider, WASessionRestClient> {
+public class AMSessionDirectoryPanel
+ extends DirectoryPanel<AMSession, AMSession, AMSessionProvider, AMSessionRestClient> {
private static final long serialVersionUID = 24083331272114L;
- private final BaseModal<String> viewModal;
+ private final String listEntitlement;
+
+ private final String deleteEntitlement;
- private final List<NetworkService> waInstances;
+ private final BaseModal<String> viewModal;
private String keyword;
- public WASessionDirectoryPanel(
+ public AMSessionDirectoryPanel(
final String id,
- final List<NetworkService> waInstances,
+ final AMSessionRestClient restClient,
+ final String listEntitlement,
+ final String deleteEntitlement,
final PageReference pageRef) {
super(id, pageRef);
- this.waInstances = waInstances;
+
+ this.listEntitlement = listEntitlement;
+ this.deleteEntitlement = deleteEntitlement;
+ this.restClient = restClient;
disableCheckBoxes();
@@ -94,53 +99,53 @@ public class WASessionDirectoryPanel
}
@Override
- protected List<IColumn<WASession, String>> getColumns() {
- List<IColumn<WASession, String>> columns = new ArrayList<>();
+ protected List<IColumn<AMSession, String>> getColumns() {
+ List<IColumn<AMSession, String>> columns = new ArrayList<>();
columns.add(new KeyPropertyColumn<>(
new StringResourceModel(Constants.KEY_FIELD_NAME, this), Constants.KEY_FIELD_NAME));
columns.add(new DatePropertyColumn<>(
new ResourceModel("authenticationDate"), "authenticationDate", "authenticationDate"));
columns.add(new PropertyColumn<>(
- new ResourceModel("authenticatedPrincipal"), "authenticatedPrincipal", "authenticatedPrincipal"));
+ new ResourceModel("principal"), "principal", "principal"));
return columns;
}
@Override
- protected ActionsPanel<WASession> getActions(final IModel<WASession> model) {
- ActionsPanel<WASession> panel = super.getActions(model);
+ protected ActionsPanel<AMSession> getActions(final IModel<AMSession> model) {
+ ActionsPanel<AMSession> panel = super.getActions(model);
- panel.add(new ActionLink<WASession>() {
+ panel.add(new ActionLink<AMSession>() {
private static final long serialVersionUID = 22687128346032L;
@Override
- public void onClick(final AjaxRequestTarget target, final WASession ignore) {
+ public void onClick(final AjaxRequestTarget target, final AMSession ignore) {
viewModal.header(new ResourceModel("details"));
target.add(viewModal.setContent(
new JsonEditorPanel(viewModal, Model.of(model.getObject().getJson()), true, pageRef)));
viewModal.show(true);
}
- }, ActionLink.ActionType.VIEW, AMEntitlement.WA_SESSION_LIST);
+ }, ActionLink.ActionType.VIEW, listEntitlement);
- panel.add(new ActionLink<WASession>() {
+ panel.add(new ActionLink<AMSession>() {
private static final long serialVersionUID = -4608353559809323466L;
@Override
- public void onClick(final AjaxRequestTarget target, final WASession ignore) {
- WASession waSession = model.getObject();
+ public void onClick(final AjaxRequestTarget target, final AMSession ignore) {
+ AMSession session = model.getObject();
try {
- WASessionRestClient.delete(waInstances, waSession.getKey());
+ restClient.delete(session.getKey());
SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
target.add(container);
} catch (SyncopeClientException e) {
- LOG.error("While deleting {}", waSession.getKey(), e);
+ LOG.error("While deleting {}", session.getKey(), e);
SyncopeConsoleSession.get().onException(e);
}
((BaseWebPage) pageRef.getPage()).getNotificationPanel().refresh(target);
}
- }, ActionLink.ActionType.DELETE, AMEntitlement.WA_SESSION_DELETE, true);
+ }, ActionLink.ActionType.DELETE, deleteEntitlement, true);
return panel;
}
@@ -151,8 +156,8 @@ public class WASessionDirectoryPanel
}
@Override
- protected WASessionProvider dataProvider() {
- return new WASessionProvider(rows);
+ protected AMSessionProvider dataProvider() {
+ return new AMSessionProvider(rows);
}
@Override
@@ -162,8 +167,8 @@ public class WASessionDirectoryPanel
@Override
public void onEvent(final IEvent<?> event) {
- if (event.getPayload() instanceof WASessionSearchEvent) {
- WASessionSearchEvent payload = WASessionSearchEvent.class.cast(event.getPayload());
+ if (event.getPayload() instanceof AMSessionSearchEvent) {
+ AMSessionSearchEvent payload = AMSessionSearchEvent.class.cast(event.getPayload());
keyword = payload.getKeyword();
updateResultTable(payload.getTarget());
@@ -172,27 +177,27 @@ public class WASessionDirectoryPanel
}
}
- protected final class WASessionProvider extends DirectoryDataProvider<WASession> {
+ protected final class AMSessionProvider extends DirectoryDataProvider<AMSession> {
private static final long serialVersionUID = 18002870965042L;
- private final SortableDataProviderComparator<WASession> comparator;
+ private final SortableDataProviderComparator<AMSession> comparator;
- public WASessionProvider(final int paginatorRows) {
+ public AMSessionProvider(final int paginatorRows) {
super(paginatorRows);
setSort("authenticationDate", SortOrder.ASCENDING);
comparator = new SortableDataProviderComparator<>(this);
}
- private Stream<WASession> filtered() {
- Stream<WASession> stream = WASessionRestClient.list(waInstances).stream();
+ private Stream<AMSession> filtered() {
+ Stream<AMSession> stream = restClient.list().stream();
return keyword == null
? stream
: stream.filter(s -> s.getJson().contains(keyword));
}
@Override
- public Iterator<? extends WASession> iterator(final long first, final long count) {
+ public Iterator<? extends AMSession> iterator(final long first, final long count) {
return filtered().skip(first).limit(count).sorted(comparator).iterator();
}
@@ -202,7 +207,7 @@ public class WASessionDirectoryPanel
}
@Override
- public IModel<WASession> model(final WASession waSession) {
+ public IModel<AMSession> model(final AMSession waSession) {
return new CompoundPropertyModel<>(waSession);
}
}
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/WASessionPanel.java b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionPanel.java
similarity index 80%
rename from client/am/console/src/main/java/org/apache/syncope/client/console/panels/WASessionPanel.java
rename to client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionPanel.java
index 407de1a..840855e 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/WASessionPanel.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionPanel.java
@@ -19,10 +19,9 @@
package org.apache.syncope.client.console.panels;
import java.io.Serializable;
-import java.util.List;
import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.rest.AMSessionRestClient;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -32,11 +31,17 @@ import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
-public class WASessionPanel extends Panel {
+public class AMSessionPanel extends Panel {
private static final long serialVersionUID = 30189416462011L;
- public WASessionPanel(final String id, final List<NetworkService> instances, final PageReference pageRef) {
+ public AMSessionPanel(
+ final String id,
+ final AMSessionRestClient restClient,
+ final String listEntitlement,
+ final String deleteEntitlement,
+ final PageReference pageRef) {
+
super(id);
Model<String> keywordModel = new Model<>(StringUtils.EMPTY);
@@ -44,7 +49,8 @@ public class WASessionPanel extends Panel {
WebMarkupContainer searchBoxContainer = new WebMarkupContainer("searchBox");
add(searchBoxContainer);
- WASessionDirectoryPanel directoryPanel = new WASessionDirectoryPanel("directoryPanel", instances, pageRef);
+ AMSessionDirectoryPanel directoryPanel = new AMSessionDirectoryPanel(
+ "directoryPanel", restClient, listEntitlement, deleteEntitlement, pageRef);
add(directoryPanel);
Form<?> form = new Form<>("form");
@@ -59,7 +65,7 @@ public class WASessionPanel extends Panel {
@Override
protected void onSubmit(final AjaxRequestTarget target) {
- send(directoryPanel, Broadcast.EXACT, new WASessionSearchEvent(target, keywordModel.getObject()));
+ send(directoryPanel, Broadcast.EXACT, new AMSessionSearchEvent(target, keywordModel.getObject()));
}
};
search.setOutputMarkupId(true);
@@ -67,7 +73,7 @@ public class WASessionPanel extends Panel {
form.setDefaultButton(search);
}
- public static class WASessionSearchEvent implements Serializable {
+ public static class AMSessionSearchEvent implements Serializable {
private static final long serialVersionUID = 5063826346823013424L;
@@ -75,7 +81,7 @@ public class WASessionPanel extends Panel {
private final String keyword;
- WASessionSearchEvent(final AjaxRequestTarget target, final String keyword) {
+ AMSessionSearchEvent(final AjaxRequestTarget target, final String keyword) {
this.target = target;
this.keyword = keyword;
}
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SRAStatisticsPanel.java b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SRAStatisticsPanel.java
index 5c6e2b7..c8467fb 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SRAStatisticsPanel.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SRAStatisticsPanel.java
@@ -30,7 +30,6 @@ import org.apache.syncope.client.console.rest.SRAStatisticsRestClient;
import org.apache.syncope.client.console.widgets.NumberWidget;
import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
import org.apache.syncope.common.lib.to.SRARouteTO;
-import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.ComponentTag;
@@ -69,7 +68,7 @@ public class SRAStatisticsPanel extends Panel {
private int current;
- public SRAStatisticsPanel(final String id, final List<NetworkService> instances, final PageReference pageRef) {
+ public SRAStatisticsPanel(final String id, final List<NetworkService> instances) {
super(id);
SRAStatistics stats = SRAStatisticsRestClient.get(instances, selected);
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionDeserializer.java b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionDeserializer.java
similarity index 85%
rename from client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionDeserializer.java
rename to client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionDeserializer.java
index 12d39d9..3bd9c4c 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionDeserializer.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionDeserializer.java
@@ -29,30 +29,31 @@ import java.io.IOException;
import java.io.StringWriter;
import java.text.ParseException;
import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.syncope.common.lib.AMSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class WASessionDeserializer extends StdDeserializer<WASession> {
+public class AMSessionDeserializer extends StdDeserializer<AMSession> {
private static final long serialVersionUID = 24527200564172L;
- private static final Logger LOG = LoggerFactory.getLogger(WASessionDeserializer.class);
+ private static final Logger LOG = LoggerFactory.getLogger(AMSessionDeserializer.class);
- public WASessionDeserializer() {
+ public AMSessionDeserializer() {
this(null);
}
- public WASessionDeserializer(final Class<?> vc) {
+ public AMSessionDeserializer(final Class<?> vc) {
super(vc);
}
@Override
- public WASession deserialize(final JsonParser jp, final DeserializationContext ctxt)
+ public AMSession deserialize(final JsonParser jp, final DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
- WASession waSession = new WASession();
+ AMSession waSession = new AMSession();
if (node.has("authentication_date_formatted")) {
String authenticationDate = node.get("authentication_date_formatted").textValue();
@@ -65,7 +66,7 @@ public class WASessionDeserializer extends StdDeserializer<WASession> {
}
if (node.has("authenticated_principal")) {
- waSession.setAuthenticatedPrincipal(node.get("authenticated_principal").textValue());
+ waSession.setPrincipal(node.get("authenticated_principal").textValue());
}
if (node.has("ticket_granting_ticket")) {
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionRestClient.java b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionRestClient.java
new file mode 100644
index 0000000..8f36d03
--- /dev/null
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionRestClient.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.rest;
+
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import java.util.List;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.syncope.client.console.SyncopeWebApplication;
+import org.apache.syncope.client.ui.commons.rest.RestClient;
+import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
+import org.apache.syncope.common.lib.AMSession;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AMSessionRestClient implements RestClient {
+
+ private static final long serialVersionUID = 17371816842780L;
+
+ protected static final Logger LOG = LoggerFactory.getLogger(AMSessionRestClient.class);
+
+ protected static final List<?> JAX_RS_PROVIDERS = List.of(new JacksonJsonProvider());
+
+ protected final List<NetworkService> instances;
+
+ protected AMSessionRestClient(final List<NetworkService> instances) {
+ this.instances = instances;
+ }
+
+ protected abstract String getActuatorEndpoint();
+
+ public abstract List<AMSession> list();
+
+ public void delete(final String key) {
+ SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.Unknown);
+
+ try {
+ Response response = WebClient.create(
+ getActuatorEndpoint(),
+ SyncopeWebApplication.get().getAnonymousUser(),
+ SyncopeWebApplication.get().getAnonymousKey(),
+ null).
+ path(key).
+ accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).delete();
+ if (response.getStatus() != Response.Status.OK.getStatusCode()
+ && response.getStatus() != Response.Status.NO_CONTENT.getStatusCode()) {
+
+ LOG.error("Unexpected response when deleting SSO Session {} from {}: {}",
+ key, getActuatorEndpoint(), response.getStatus());
+ sce.getElements().add("Unexpected response code: " + response.getStatus());
+ }
+ } catch (Exception e) {
+ LOG.error("Could not delete SSO Session {} from {}",
+ key, getActuatorEndpoint(), e);
+ sce.getElements().add("Unexpected error: " + e.getMessage());
+ }
+
+ if (!sce.getElements().isEmpty()) {
+ throw sce;
+ }
+ }
+}
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRASessionRestClient.java
similarity index 55%
copy from client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
copy to client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRASessionRestClient.java
index cd56204..e661531 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRASessionRestClient.java
@@ -18,56 +18,51 @@
*/
package org.apache.syncope.client.console.rest;
-import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import java.util.List;
+import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.apache.commons.lang3.tuple.Pair;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.syncope.client.console.SyncopeWebApplication;
import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.syncope.common.lib.AMSession;
-public final class SRAStatisticsRestClient {
+public final class SRASessionRestClient extends AMSessionRestClient {
- private static final Logger LOG = LoggerFactory.getLogger(SRAStatisticsRestClient.class);
+ private static final long serialVersionUID = 22118820292494L;
- private static final List<?> JAX_RS_PROVIDERS = List.of(new JacksonJsonProvider());
+ public SRASessionRestClient(final List<NetworkService> list) {
+ super(list);
+ }
- private static String getActuatorEndpoint(final List<NetworkService> instances) {
- return instances.get(0).getAddress() + "actuator/metrics/spring.cloud.gateway.requests";
+ @Override
+ protected String getActuatorEndpoint() {
+ return instances.get(0).getAddress() + "actuator/sraSessions";
}
- public static SRAStatistics get(final List<NetworkService> waInstances, final List<Pair<String, String>> selected) {
+ @Override
+ public List<AMSession> list() {
try {
WebClient client = WebClient.create(
- getActuatorEndpoint(waInstances),
+ getActuatorEndpoint(),
JAX_RS_PROVIDERS,
SyncopeWebApplication.get().getAnonymousUser(),
SyncopeWebApplication.get().getAnonymousKey(),
null).
accept(MediaType.APPLICATION_JSON_TYPE);
- if (!selected.isEmpty()) {
- client.query("tag", selected.stream().map(s -> s.getKey() + ":" + s.getValue()).toArray());
- }
-
Response response = client.get();
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
- return response.readEntity(SRAStatistics.class);
+ return response.readEntity(new GenericType<List<AMSession>>() {
+ });
}
- LOG.error("Unexpected response for SRA statistics from {}: {}",
- getActuatorEndpoint(waInstances), response.getStatus());
+ LOG.error("Unexpected response for SSO Sessions from {}: {}",
+ getActuatorEndpoint(), response.getStatus());
} catch (Exception e) {
- LOG.error("Could not fetch SRA statistics from {}", getActuatorEndpoint(waInstances), e);
+ LOG.error("Could not fetch SSO Sessions from {}", getActuatorEndpoint(), e);
}
- return new SRAStatistics();
- }
-
- private SRAStatisticsRestClient() {
- // private constructor for static utility class
+ return List.of();
}
}
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
index cd56204..fc8ad7b 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
@@ -39,10 +39,10 @@ public final class SRAStatisticsRestClient {
return instances.get(0).getAddress() + "actuator/metrics/spring.cloud.gateway.requests";
}
- public static SRAStatistics get(final List<NetworkService> waInstances, final List<Pair<String, String>> selected) {
+ public static SRAStatistics get(final List<NetworkService> instances, final List<Pair<String, String>> selected) {
try {
WebClient client = WebClient.create(
- getActuatorEndpoint(waInstances),
+ getActuatorEndpoint(instances),
JAX_RS_PROVIDERS,
SyncopeWebApplication.get().getAnonymousUser(),
SyncopeWebApplication.get().getAnonymousKey(),
@@ -59,9 +59,9 @@ public final class SRAStatisticsRestClient {
}
LOG.error("Unexpected response for SRA statistics from {}: {}",
- getActuatorEndpoint(waInstances), response.getStatus());
+ getActuatorEndpoint(instances), response.getStatus());
} catch (Exception e) {
- LOG.error("Could not fetch SRA statistics from {}", getActuatorEndpoint(waInstances), e);
+ LOG.error("Could not fetch SRA statistics from {}", getActuatorEndpoint(instances), e);
}
return new SRAStatistics();
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionRestClient.java b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionRestClient.java
index d903b34..474d6ac 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionRestClient.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionRestClient.java
@@ -21,35 +21,44 @@ package org.apache.syncope.client.console.rest;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.InputStream;
import java.util.List;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.syncope.client.console.SyncopeWebApplication;
-import org.apache.syncope.client.ui.commons.rest.RestClient;
import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.types.ClientExceptionType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.syncope.common.lib.AMSession;
-public final class WASessionRestClient implements RestClient {
+public final class WASessionRestClient extends AMSessionRestClient {
private static final long serialVersionUID = 22118820292494L;
- private static final Logger LOG = LoggerFactory.getLogger(WASessionRestClient.class);
+ private static final ObjectMapper MAPPER;
- private static final ObjectMapper MAPPER = new ObjectMapper();
+ static {
+ MAPPER = new ObjectMapper();
- private static String getActuatorEndpoint(final List<NetworkService> instances) {
+ SimpleModule module = new SimpleModule();
+ module.addDeserializer(AMSession.class, new AMSessionDeserializer());
+ MAPPER.registerModule(module);
+ }
+
+ public WASessionRestClient(final List<NetworkService> instances) {
+ super(instances);
+ }
+
+ @Override
+ protected String getActuatorEndpoint() {
return instances.get(0).getAddress() + "actuator/ssoSessions";
}
- public static List<WASession> list(final List<NetworkService> waInstances) {
+ @Override
+ public List<AMSession> list() {
try {
Response response = WebClient.create(
- getActuatorEndpoint(waInstances),
+ getActuatorEndpoint(),
SyncopeWebApplication.get().getAnonymousUser(),
SyncopeWebApplication.get().getAnonymousKey(),
null).
@@ -57,50 +66,18 @@ public final class WASessionRestClient implements RestClient {
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
JsonNode node = MAPPER.readTree((InputStream) response.getEntity());
if (node.has("activeSsoSessions")) {
- return MAPPER.readValue(
- MAPPER.treeAsTokens(node.get("activeSsoSessions")),
- new TypeReference<List<WASession>>() {
+ return MAPPER.readValue(MAPPER.treeAsTokens(node.get("activeSsoSessions")),
+ new TypeReference<List<AMSession>>() {
});
}
} else {
LOG.error("Unexpected response for SSO Sessions from {}: {}",
- getActuatorEndpoint(waInstances), response.getStatus());
+ getActuatorEndpoint(), response.getStatus());
}
} catch (Exception e) {
- LOG.error("Could not fetch SSO Sessions from {}", getActuatorEndpoint(waInstances), e);
+ LOG.error("Could not fetch SSO Sessions from {}", getActuatorEndpoint(), e);
}
return List.of();
}
-
- public static void delete(final List<NetworkService> waInstances, final String ticketGrantingTicket) {
- SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.Unknown);
-
- try {
- Response response = WebClient.create(
- getActuatorEndpoint(waInstances),
- SyncopeWebApplication.get().getAnonymousUser(),
- SyncopeWebApplication.get().getAnonymousKey(),
- null).
- path(ticketGrantingTicket).
- accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).delete();
- if (response.getStatus() != Response.Status.OK.getStatusCode()) {
- LOG.error("Unexpected response when deleting SSO Session {} from {}: {}",
- ticketGrantingTicket, getActuatorEndpoint(waInstances), response.getStatus());
- sce.getElements().add("Unexpected response code: " + response.getStatus());
- }
- } catch (Exception e) {
- LOG.error("Could not delete SSO Session {} from {}",
- ticketGrantingTicket, getActuatorEndpoint(waInstances), e);
- sce.getElements().add("Unexpected error: " + e.getMessage());
- }
-
- if (!sce.getElements().isEmpty()) {
- throw sce;
- }
- }
-
- private WASessionRestClient() {
- // private constructor for static utility class
- }
}
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA.properties
index bfb4155..1475ed5 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA.properties
@@ -29,3 +29,4 @@ csrf=CSRF
error=Error URI
postLogout=Post-logout URI
push=Push
+sessions=Sessions
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_fr_CA.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_fr_CA.properties
index bfb4155..1475ed5 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_fr_CA.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_fr_CA.properties
@@ -29,3 +29,4 @@ csrf=CSRF
error=Error URI
postLogout=Post-logout URI
push=Push
+sessions=Sessions
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_it.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_it.properties
index ebb61e6..e725ef5 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_it.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_it.properties
@@ -29,3 +29,4 @@ csrf=CSRF
error=URI di errore
postLogout=URI di post-logout
push=Applica
+sessions=Sessioni
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_ja.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_ja.properties
index fd47c1e..8ff1ace 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_ja.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_ja.properties
@@ -29,3 +29,4 @@ csrf=CSRF
error=Error URI
postLogout=Post-logout URI
push=Push
+sessions=Sessions
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_pt_BR.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_pt_BR.properties
index bfb4155..1475ed5 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_pt_BR.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_pt_BR.properties
@@ -29,3 +29,4 @@ csrf=CSRF
error=Error URI
postLogout=Post-logout URI
push=Push
+sessions=Sessions
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_ru.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_ru.properties
index bfb4155..1475ed5 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_ru.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/pages/SRA_ru.properties
@@ -29,3 +29,4 @@ csrf=CSRF
error=Error URI
postLogout=Post-logout URI
push=Push
+sessions=Sessions
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.properties
similarity index 96%
rename from client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel.properties
rename to client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.properties
index 7883872..6fe80e8 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.properties
@@ -18,5 +18,5 @@ any.edit=Edit ${key}
any.finish=Submit ${key}
any.cancel=Cancel ${key}
authenticationDate=Creation Date
-authenticatedPrincipal=Principal
+principal=Principal
details=Details
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_fr_CA.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_fr_CA.properties
similarity index 96%
rename from client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_fr_CA.properties
rename to client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_fr_CA.properties
index 0baec19..771efc8 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_fr_CA.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_fr_CA.properties
@@ -18,5 +18,5 @@ any.edit=Modifier ${key}
any.finish=Soumettre ${key}
any.cancel=Annuler ${key}
authenticationDate=Creation Date
-authenticatedPrincipal=Principal
+principal=Principal
details=Details
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_it.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_it.properties
similarity index 96%
rename from client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_it.properties
rename to client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_it.properties
index 6df8cdc..40d1ec2 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_it.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_it.properties
@@ -18,5 +18,5 @@ any.edit=Modifica ${key}
any.finish=Invia ${key}
any.cancel=Annulla ${key}
authenticationDate=Data di Creazione
-authenticatedPrincipal=Soggetto
+principal=Soggetto
details=Dettagli
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_ja.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_ja.properties
similarity index 96%
rename from client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_ja.properties
rename to client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_ja.properties
index c5c1d0d..3474abb 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_ja.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_ja.properties
@@ -18,5 +18,5 @@ any.edit=${key} \u3092\u7de8\u96c6
any.finish=${key} \u3092\u5b9f\u884c
any.cancel=${key} \u3092\u30ad\u30e3\u30f3\u30bb\u30eb
authenticationDate=Creation Date
-authenticatedPrincipal=Principal
+principal=Principal
details=Details
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_pt_BR.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_pt_BR.properties
similarity index 96%
rename from client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_pt_BR.properties
rename to client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_pt_BR.properties
index 7883872..6fe80e8 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_pt_BR.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_pt_BR.properties
@@ -18,5 +18,5 @@ any.edit=Edit ${key}
any.finish=Submit ${key}
any.cancel=Cancel ${key}
authenticationDate=Creation Date
-authenticatedPrincipal=Principal
+principal=Principal
details=Details
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_ru.properties b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_ru.properties
similarity index 96%
rename from client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_ru.properties
rename to client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_ru.properties
index 63e4a85..5327783 100644
--- a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionDirectoryPanel_ru.properties
+++ b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel_ru.properties
@@ -18,5 +18,5 @@ any.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c ${key}
any.finish=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c ${key}
any.cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c ${key}
authenticationDate=Creation Date
-authenticatedPrincipal=Principal
+principal=Principal
details=Details
diff --git a/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionPanel.html b/client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionPanel.html
similarity index 100%
rename from client/am/console/src/main/resources/org/apache/syncope/client/console/panels/WASessionPanel.html
rename to client/am/console/src/main/resources/org/apache/syncope/client/console/panels/AMSessionPanel.html
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASession.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/AMSession.java
similarity index 76%
rename from client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASession.java
rename to common/am/lib/src/main/java/org/apache/syncope/common/lib/AMSession.java
index 2ecdda2..1636555 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASession.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/AMSession.java
@@ -16,14 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.syncope.client.console.rest;
+package org.apache.syncope.common.lib;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.util.Date;
import org.apache.syncope.common.lib.to.EntityTO;
-@JsonDeserialize(using = WASessionDeserializer.class)
-public class WASession implements EntityTO {
+public class AMSession implements EntityTO {
private static final long serialVersionUID = 18201657700802L;
@@ -31,7 +29,7 @@ public class WASession implements EntityTO {
private Date authenticationDate;
- private String authenticatedPrincipal;
+ private String principal;
private String json;
@@ -53,12 +51,12 @@ public class WASession implements EntityTO {
this.authenticationDate = authenticationDate;
}
- public String getAuthenticatedPrincipal() {
- return authenticatedPrincipal;
+ public String getPrincipal() {
+ return principal;
}
- public void setAuthenticatedPrincipal(final String authenticatedPrincipal) {
- this.authenticatedPrincipal = authenticatedPrincipal;
+ public void setPrincipal(final String authenticatedPrincipal) {
+ this.principal = authenticatedPrincipal;
}
public String getJson() {
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/AMEntitlement.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/AMEntitlement.java
index 1869e18..1935279 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/AMEntitlement.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/AMEntitlement.java
@@ -34,6 +34,10 @@ public final class AMEntitlement {
public static final String SRA_ROUTE_PUSH = "SRA_ROUTE_PUSH";
+ public static final String SRA_SESSION_LIST = "SRA_SESSION_LIST";
+
+ public static final String SRA_SESSION_DELETE = "SRA_SESSION_DELETE";
+
public static final String CLIENTAPP_READ = "CLIENTAPP_READ";
public static final String CLIENTAPP_LIST = "CLIENTAPP_LIST";
diff --git a/docker/sra/src/main/resources/application.properties b/docker/sra/src/main/resources/application.properties
index 92fcc3c..52c7a72 100644
--- a/docker/sra/src/main/resources/application.properties
+++ b/docker/sra/src/main/resources/application.properties
@@ -22,6 +22,6 @@ server.port=8080
management.security.enabled=true
management.endpoint.gateway.enabled=true
-management.endpoints.web.exposure.include=health,loggers,metrics,gateway
+management.endpoints.web.exposure.include=health,loggers,metrics,gateway,sraSessions
service.discovery.address=${SERVICE_DISCOVERY_ADDRESS}
diff --git a/pom.xml b/pom.xml
index edc6fcc..c2aa0e7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -508,7 +508,7 @@ under the License.
<cargo.log>${log.directory}/cargo.log</cargo.log>
<cargo.output>${log.directory}/cargo-output.log</cargo.output>
- <tomcat.version>9.0.46</tomcat.version>
+ <tomcat.version>9.0.50</tomcat.version>
<wildfly.version>23.0.2.Final</wildfly.version>
<payara.version>5.2021.4</payara.version>
<javax.faces.version>2.3.14</javax.faces.version>
@@ -2129,7 +2129,10 @@ under the License.
<useIncrementalCompilation>false</useIncrementalCompilation>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
- <compilerArgument>-Xlint:unchecked</compilerArgument>
+ <compilerArgs>
+ <arg>-Xlint:unchecked</arg>
+ <arg>-parameters</arg>
+ </compilerArgs>
</configuration>
</plugin>
diff --git a/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java b/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java
index f553a20..d065458 100644
--- a/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java
+++ b/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java
@@ -21,9 +21,12 @@ package org.apache.syncope.sra;
import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStart;
import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStop;
+import org.apache.syncope.sra.actuator.SRASessions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.cache.CacheManager;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.context.annotation.Bean;
@@ -42,11 +45,20 @@ public class SyncopeSRAApplication {
@Autowired
private RouteProvider provider;
+ @Autowired
+ private CacheManager cacheManager;
+
@Bean
public RouteLocator routes() {
return () -> Flux.fromIterable(provider.fetch()).map(Route.AbstractBuilder::build);
}
+ @ConditionalOnMissingBean
+ @Bean
+ public SRASessions sraSessionsActuatorEndpoint() {
+ return new SRASessions(cacheManager);
+ }
+
@Bean
public KeymasterStart keymasterStart() {
return new KeymasterStart(NetworkService.Type.SRA);
diff --git a/sra/src/main/java/org/apache/syncope/sra/actuator/SRASessions.java b/sra/src/main/java/org/apache/syncope/sra/actuator/SRASessions.java
new file mode 100644
index 0000000..aedd1b5
--- /dev/null
+++ b/sra/src/main/java/org/apache/syncope/sra/actuator/SRASessions.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.sra.actuator;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
+import org.apache.syncope.common.lib.AMSession;
+import org.apache.syncope.sra.SessionConfig;
+import org.apache.syncope.sra.security.cas.CASAuthenticationToken;
+import org.apache.syncope.sra.security.saml2.SAML2AuthenticationToken;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.actuate.endpoint.annotation.DeleteOperation;
+import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
+import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
+import org.springframework.boot.actuate.endpoint.annotation.Selector;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
+import org.springframework.security.web.server.context.WebSessionServerSecurityContextRepository;
+import org.springframework.session.MapSession;
+
+@Endpoint(id = "sraSessions")
+public class SRASessions {
+
+ private static final Logger LOG = LoggerFactory.getLogger(SRASessions.class);
+
+ private static final ObjectMapper MAPPER = new ObjectMapper().findAndRegisterModules();
+
+ private final CacheManager cacheManager;
+
+ public SRASessions(final CacheManager cacheManager) {
+ this.cacheManager = cacheManager;
+ }
+
+ private static AMSession map(final MapSession mapSession) {
+ SecurityContext ctx = mapSession.getAttribute(
+ WebSessionServerSecurityContextRepository.DEFAULT_SPRING_SECURITY_CONTEXT_ATTR_NAME);
+ if (ctx == null) {
+ return null;
+ }
+
+ AMSession session = new AMSession();
+ session.setKey(mapSession.getId());
+ session.setAuthenticationDate(new Date(mapSession.getCreationTime().toEpochMilli()));
+
+ String principal;
+ if (ctx.getAuthentication() instanceof SAML2AuthenticationToken) {
+ principal = ((SAML2AuthenticationToken) ctx.getAuthentication()).getPrincipal().getNameId().getValue();
+ } else if (ctx.getAuthentication() instanceof CASAuthenticationToken) {
+ principal = ((CASAuthenticationToken) ctx.getAuthentication()).getPrincipal().getPrincipal().getName();
+ } else if (ctx.getAuthentication() instanceof OAuth2AuthenticationToken) {
+ principal = ((OAuth2AuthenticationToken) ctx.getAuthentication()).getPrincipal().getName();
+ } else {
+ principal = ctx.getAuthentication().getPrincipal().toString();
+ }
+ session.setPrincipal(principal);
+
+ try {
+ session.setJson(MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(ctx.getAuthentication()));
+ } catch (JsonProcessingException e) {
+ LOG.error("While serializing session {}", mapSession.getId(), e);
+ }
+
+ return session;
+ }
+
+ @ReadOperation
+ @SuppressWarnings("unchecked")
+ public List<AMSession> list() {
+ return ((ConcurrentMap<Object, Object>) cacheManager.getCache(SessionConfig.DEFAULT_CACHE).getNativeCache()).
+ values().stream().map(MapSession.class::cast).map(SRASessions::map).
+ filter(Objects::nonNull).collect(Collectors.toList());
+ }
+
+ @ReadOperation
+ public AMSession read(@Selector final String id) {
+ Cache.ValueWrapper value = cacheManager.getCache(SessionConfig.DEFAULT_CACHE).get(id);
+ if (value == null || !(value.get() instanceof MapSession)) {
+ return null;
+ }
+
+ return map((MapSession) value.get());
+ }
+
+ @DeleteOperation
+ public void delete(@Selector final String id) {
+ cacheManager.getCache(SessionConfig.DEFAULT_CACHE).evict(id);
+ }
+}
diff --git a/sra/src/main/resources/application.properties b/sra/src/main/resources/application.properties
index 145bfcc..4f5003b 100644
--- a/sra/src/main/resources/application.properties
+++ b/sra/src/main/resources/application.properties
@@ -22,6 +22,6 @@ server.port=8080
management.security.enabled=true
management.endpoint.gateway.enabled=true
-management.endpoints.web.exposure.include=health,loggers,metrics,gateway
+management.endpoints.web.exposure.include=health,loggers,metrics,gateway,sraSessions
service.discovery.address=http://localhost:8080/