Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E4A8E187C3 for ; Tue, 12 Jan 2016 17:14:56 +0000 (UTC) Received: (qmail 32632 invoked by uid 500); 12 Jan 2016 17:14:56 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 32568 invoked by uid 500); 12 Jan 2016 17:14:56 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 32559 invoked by uid 99); 12 Jan 2016 17:14:56 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 12 Jan 2016 17:14:56 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8305FE041C; Tue, 12 Jan 2016 17:14:56 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sergeyb@apache.org To: commits@cxf.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: cxf-fediz git commit: Adding a page for presenting more complete info about Client and prototyping the code/pages for removing the client, resetting a secret, and managing client access/refresh tokens and code grants Date: Tue, 12 Jan 2016 17:14:56 +0000 (UTC) Repository: cxf-fediz Updated Branches: refs/heads/master f46137383 -> 159bf90ef Adding a page for presenting more complete info about Client and prototyping the code/pages for removing the client, resetting a secret, and managing client access/refresh tokens and code grants Project: http://git-wip-us.apache.org/repos/asf/cxf-fediz/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf-fediz/commit/159bf90e Tree: http://git-wip-us.apache.org/repos/asf/cxf-fediz/tree/159bf90e Diff: http://git-wip-us.apache.org/repos/asf/cxf-fediz/diff/159bf90e Branch: refs/heads/master Commit: 159bf90ef220ffa8b5dfb42f2b7ffc6f10c15f86 Parents: f461373 Author: Sergey Beryozkin Authored: Tue Jan 12 17:14:37 2016 +0000 Committer: Sergey Beryozkin Committed: Tue Jan 12 17:14:37 2016 +0000 ---------------------------------------------------------------------- .../fediz/service/oidc/ClientAccessTokens.java | 48 +++++++ .../fediz/service/oidc/ClientCodeGrants.java | 48 +++++++ .../fediz/service/oidc/ClientRefreshTokens.java | 48 +++++++ .../service/oidc/ClientRegistrationService.java | 71 +++++++++ .../main/webapp/WEB-INF/applicationContext.xml | 1 + .../src/main/webapp/WEB-INF/views/client.jsp | 143 +++++++++++++++++++ .../webapp/WEB-INF/views/clientAccessTokens.jsp | 85 +++++++++++ .../webapp/WEB-INF/views/clientCodeGrants.jsp | 85 +++++++++++ .../WEB-INF/views/clientRefreshTokens.jsp | 85 +++++++++++ .../webapp/WEB-INF/views/registeredClients.jsp | 27 ++-- 10 files changed, 628 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientAccessTokens.java ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientAccessTokens.java b/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientAccessTokens.java new file mode 100644 index 0000000..061e61d --- /dev/null +++ b/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientAccessTokens.java @@ -0,0 +1,48 @@ +/** + * 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.cxf.fediz.service.oidc; + +import java.util.LinkedList; +import java.util.List; + +import org.apache.cxf.rs.security.oauth2.common.Client; +import org.apache.cxf.rs.security.oauth2.common.ServerAccessToken; + +public class ClientAccessTokens { + private Client client; + private List accessTokens = new LinkedList(); + public ClientAccessTokens(Client c, List accessTokens) { + this.client = c; + this.accessTokens = accessTokens; + } + public Client getClient() { + return client; + } + public void setClient(Client client) { + this.client = client; + } + public List getAccessTokens() { + return accessTokens; + } + public void setAccessTokens(List accessTokens) { + this.accessTokens = accessTokens; + } + + +} http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientCodeGrants.java ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientCodeGrants.java b/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientCodeGrants.java new file mode 100644 index 0000000..6134fcc --- /dev/null +++ b/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientCodeGrants.java @@ -0,0 +1,48 @@ +/** + * 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.cxf.fediz.service.oidc; + +import java.util.LinkedList; +import java.util.List; + +import org.apache.cxf.rs.security.oauth2.common.Client; +import org.apache.cxf.rs.security.oauth2.grants.code.ServerAuthorizationCodeGrant; + +public class ClientCodeGrants { + private Client client; + private List codeGrants = new LinkedList(); + public ClientCodeGrants(Client c, List codeGrants) { + this.client = c; + this.setCodeGrants(codeGrants); + } + public Client getClient() { + return client; + } + public void setClient(Client client) { + this.client = client; + } + public List getCodeGrants() { + return codeGrants; + } + public void setCodeGrants(List codeGrants) { + this.codeGrants = codeGrants; + } + + +} http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRefreshTokens.java ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRefreshTokens.java b/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRefreshTokens.java new file mode 100644 index 0000000..12f246f --- /dev/null +++ b/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRefreshTokens.java @@ -0,0 +1,48 @@ +/** + * 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.cxf.fediz.service.oidc; + +import java.util.LinkedList; +import java.util.List; + +import org.apache.cxf.rs.security.oauth2.common.Client; +import org.apache.cxf.rs.security.oauth2.tokens.refresh.RefreshToken; + +public class ClientRefreshTokens { + private Client client; + private List refreshTokens = new LinkedList(); + public ClientRefreshTokens(Client c, List refreshTokens) { + this.client = c; + this.refreshTokens = refreshTokens; + } + public Client getClient() { + return client; + } + public void setClient(Client client) { + this.client = client; + } + public List getRefreshTokens() { + return refreshTokens; + } + public void setRefreshTokens(List refreshTokens) { + this.refreshTokens = refreshTokens; + } + + +} http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRegistrationService.java ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRegistrationService.java b/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRegistrationService.java index da6b96b..6e4f295 100644 --- a/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRegistrationService.java +++ b/services/oidc/src/main/java/org/apache/cxf/fediz/service/oidc/ClientRegistrationService.java @@ -22,6 +22,7 @@ package org.apache.cxf.fediz.service.oidc; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -67,6 +69,73 @@ public class ClientRegistrationService { return getClientRegistrations(); } + @GET + @Produces(MediaType.TEXT_HTML) + @Path("/{id}") + public Client getRegisteredClient(@PathParam("id") String id) { + for (Client c : getClientRegistrations()) { + if (c.getClientId().equals(id)) { + return c; + } + } + return null; + } + + + @POST + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + @Produces(MediaType.TEXT_HTML) + @Path("/{id}/remove") + public Collection removeClient(@PathParam("id") String id) { + Collection clients = getClientRegistrations(); + for (Iterator it = clients.iterator(); it.hasNext();) { + Client c = it.next(); + if (c.getClientId().equals(id)) { + it.remove(); + manager.removeClient(id); + break; + } + } + return clients; + } + @POST + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + @Produces(MediaType.TEXT_HTML) + @Path("/{id}/reset") + public Client resetClient(@PathParam("id") String id) { + Client c = getRegisteredClient(id); + if (c.isConfidential()) { + c.setClientSecret(generateClientSecret()); + } + manager.setClient(c); + return c; + } + + @GET + @Produces(MediaType.TEXT_HTML) + @Path("/{id}/at") + public ClientAccessTokens getClientAccessTokens(@PathParam("id") String id) { + Client c = getRegisteredClient(id); + return new ClientAccessTokens(c, manager.getAccessTokens(c)); + } + + @GET + @Produces(MediaType.TEXT_HTML) + @Path("/{id}/rt") + public ClientRefreshTokens getClientRefreshTokens(@PathParam("id") String id) { + Client c = getRegisteredClient(id); + return new ClientRefreshTokens(c, manager.getRefreshTokens(c)); + } + + @GET + @Produces(MediaType.TEXT_HTML) + @Path("/{id}/codes") + public ClientCodeGrants getClientCodeGrants(@PathParam("id") String id) { + Client c = getRegisteredClient(id); + return new ClientCodeGrants(c, manager.getCodeGrants(c)); + } + + @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.TEXT_HTML) @@ -91,6 +160,8 @@ public class ClientRegistrationService { UserSubject userSubject = new UserSubject(userName); newClient.setResourceOwnerSubject(userSubject); + newClient.setRegisteredAt(System.currentTimeMillis() / 1000); + return registerNewClient(newClient); } http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/webapp/WEB-INF/applicationContext.xml ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/webapp/WEB-INF/applicationContext.xml b/services/oidc/src/main/webapp/WEB-INF/applicationContext.xml index 85f5e41..4e3b004 100644 --- a/services/oidc/src/main/webapp/WEB-INF/applicationContext.xml +++ b/services/oidc/src/main/webapp/WEB-INF/applicationContext.xml @@ -115,6 +115,7 @@ + http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/webapp/WEB-INF/views/client.jsp ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/webapp/WEB-INF/views/client.jsp b/services/oidc/src/main/webapp/WEB-INF/views/client.jsp new file mode 100644 index 0000000..c704511 --- /dev/null +++ b/services/oidc/src/main/webapp/WEB-INF/views/client.jsp @@ -0,0 +1,143 @@ +<%@ page import="org.apache.cxf.rs.security.oauth2.common.Client"%> +<%@ page import="java.text.SimpleDateFormat"%> +<%@ page import="java.util.Date"%> +<%@ page import="java.util.Locale"%> +<%@ page import="java.util.TimeZone"%> +<%@ page import="javax.servlet.http.HttpServletRequest" %> + +<% + Client client = (Client)request.getAttribute("data"); + String basePath = request.getContextPath() + request.getServletPath(); + if (!basePath.endsWith("/")) { + basePath += "/"; + } +%> + + + API Client Information + + + +
+

<%= client.getApplicationName() %>

+
+ + <% + SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + %> + + + + + + + + +
IdentifierSecretCreation DateRedirect URIs
+ <% + if (client.getClientSecret() != null) { + %> + + <% + } else { + %> + Unavailable for public client + <% + } + %> + + <% + Date date = new Date(client.getRegisteredAt() * 1000); + String created = dateFormat.format(date); + %> + <%= created %>
+ +
+ <% if(client.getRedirectUris() != null) { + for (String redirectURI : client.getRedirectUris()) { + %> + <%= redirectURI %>
+ <% } + } %> +
+
+ + +<% + if (client.getClientSecret() != null) { +%> + +<% + } +%> + + +
+
" method="POST"> +
+ +
+
+
+
" method="POST"> +
+ +
+
+
+
+

+

">Current Access Tokens

+

+

+

">Current Refresh Tokens

+

+

+

">Current Code Grants

+

+
+

+

Return to registered Clients

+

+
+
+ + + http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/webapp/WEB-INF/views/clientAccessTokens.jsp ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/webapp/WEB-INF/views/clientAccessTokens.jsp b/services/oidc/src/main/webapp/WEB-INF/views/clientAccessTokens.jsp new file mode 100644 index 0000000..a2884e4 --- /dev/null +++ b/services/oidc/src/main/webapp/WEB-INF/views/clientAccessTokens.jsp @@ -0,0 +1,85 @@ +<%@ page import="org.apache.cxf.rs.security.oauth2.common.Client"%> +<%@ page import="org.apache.cxf.rs.security.oauth2.common.ServerAccessToken"%> +<%@ page import="java.text.SimpleDateFormat"%> +<%@ page import="java.util.Date"%> +<%@ page import="java.util.List"%> +<%@ page import="java.util.Locale"%> +<%@ page import="java.util.TimeZone"%> +<%@ page import="javax.servlet.http.HttpServletRequest" %> +<%@ page import="org.apache.cxf.fediz.service.oidc.ClientAccessTokens" %> + +<% + ClientAccessTokens tokens = (ClientAccessTokens)request.getAttribute("data"); + Client client = tokens.getClient(); + String basePath = request.getContextPath() + request.getServletPath(); + if (!basePath.endsWith("/")) { + basePath += "/"; + } +%> + + + Client Access Tokens + + + +
+

Access Tokens issued to <%= client.getApplicationName() + "(" + client.getClientId() + ")"%>"

+
+ + + <% + SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + + for (ServerAccessToken token : tokens.getAccessTokens()) { + %> + + + + + + <% + } + %> + +
IdentifierIssue DateExpiry Date
+ <% + Date date = new Date(token.getIssuedAt() * 1000); + String issued = dateFormat.format(date); + %> + <%= issued %>
+
+ <% + Date date = new Date((token.getIssuedAt() + token.getExpiresIn()) * 1000); + String expires = dateFormat.format(date); + %> + <%= expires %>
+
+ +
+
+

+">Return +

+
+ + + http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/webapp/WEB-INF/views/clientCodeGrants.jsp ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/webapp/WEB-INF/views/clientCodeGrants.jsp b/services/oidc/src/main/webapp/WEB-INF/views/clientCodeGrants.jsp new file mode 100644 index 0000000..c3afa50 --- /dev/null +++ b/services/oidc/src/main/webapp/WEB-INF/views/clientCodeGrants.jsp @@ -0,0 +1,85 @@ +<%@ page import="org.apache.cxf.rs.security.oauth2.common.Client"%> +<%@ page import="org.apache.cxf.rs.security.oauth2.grants.code.ServerAuthorizationCodeGrant"%> +<%@ page import="java.text.SimpleDateFormat"%> +<%@ page import="java.util.Date"%> +<%@ page import="java.util.List"%> +<%@ page import="java.util.Locale"%> +<%@ page import="java.util.TimeZone"%> +<%@ page import="javax.servlet.http.HttpServletRequest" %> +<%@ page import="org.apache.cxf.fediz.service.oidc.ClientCodeGrants" %> + +<% + ClientCodeGrants tokens = (ClientCodeGrants)request.getAttribute("data"); + Client client = tokens.getClient(); + String basePath = request.getContextPath() + request.getServletPath(); + if (!basePath.endsWith("/")) { + basePath += "/"; + } +%> + + + Client Refresh Tokens + + + +
+

Code Grants issued to <%= client.getApplicationName() + "(" + client.getClientId() + ")"%>"

+
+ + + <% + SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + + for (ServerAuthorizationCodeGrant token : tokens.getCodeGrants()) { + %> + + + + + + <% + } + %> + +
IdentifierIssue DateExpiry Date
+ <% + Date date = new Date(token.getIssuedAt() * 1000); + String issued = dateFormat.format(date); + %> + <%= issued %>
+
+ <% + Date date = new Date((token.getIssuedAt() + token.getExpiresIn()) * 1000); + String expires = dateFormat.format(date); + %> + <%= expires %>
+
+ +
+
+

+">Return +

+
+ + + http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/webapp/WEB-INF/views/clientRefreshTokens.jsp ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/webapp/WEB-INF/views/clientRefreshTokens.jsp b/services/oidc/src/main/webapp/WEB-INF/views/clientRefreshTokens.jsp new file mode 100644 index 0000000..ddfab90 --- /dev/null +++ b/services/oidc/src/main/webapp/WEB-INF/views/clientRefreshTokens.jsp @@ -0,0 +1,85 @@ +<%@ page import="org.apache.cxf.rs.security.oauth2.common.Client"%> +<%@ page import="org.apache.cxf.rs.security.oauth2.tokens.refresh.RefreshToken"%> +<%@ page import="java.text.SimpleDateFormat"%> +<%@ page import="java.util.Date"%> +<%@ page import="java.util.List"%> +<%@ page import="java.util.Locale"%> +<%@ page import="java.util.TimeZone"%> +<%@ page import="javax.servlet.http.HttpServletRequest" %> +<%@ page import="org.apache.cxf.fediz.service.oidc.ClientRefreshTokens" %> + +<% + ClientRefreshTokens tokens = (ClientRefreshTokens)request.getAttribute("data"); + Client client = tokens.getClient(); + String basePath = request.getContextPath() + request.getServletPath(); + if (!basePath.endsWith("/")) { + basePath += "/"; + } +%> + + + Client Refresh Tokens + + + +
+

Refresh Tokens issued to <%= client.getApplicationName() + "(" + client.getClientId() + ")"%>"

+
+ + + <% + SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + + for (RefreshToken token : tokens.getRefreshTokens()) { + %> + + + + + + <% + } + %> + +
IdentifierIssue DateExpiry Date
+ <% + Date date = new Date(token.getIssuedAt() * 1000); + String issued = dateFormat.format(date); + %> + <%= issued %>
+
+ <% + Date date = new Date((token.getIssuedAt() + token.getExpiresIn()) * 1000); + String expires = dateFormat.format(date); + %> + <%= expires %>
+
+ +
+
+

+">Return +

+
+ + + http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/159bf90e/services/oidc/src/main/webapp/WEB-INF/views/registeredClients.jsp ---------------------------------------------------------------------- diff --git a/services/oidc/src/main/webapp/WEB-INF/views/registeredClients.jsp b/services/oidc/src/main/webapp/WEB-INF/views/registeredClients.jsp index ce8ed9f..ee1455c 100644 --- a/services/oidc/src/main/webapp/WEB-INF/views/registeredClients.jsp +++ b/services/oidc/src/main/webapp/WEB-INF/views/registeredClients.jsp @@ -1,5 +1,9 @@ <%@ page import="org.apache.cxf.rs.security.oauth2.common.Client"%> +<%@ page import="java.text.SimpleDateFormat"%> <%@ page import="java.util.Collection"%> +<%@ page import="java.util.Date"%> +<%@ page import="java.util.Locale"%> +<%@ page import="java.util.TimeZone"%> <%@ page import="javax.servlet.http.HttpServletRequest" %> <% @@ -37,25 +41,22 @@

Registered API Clients


- + <% + SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + for (Client client : regs) { %> - +
Client NameClient IdentifierClient SecretRedirect URIs
NameIdentifierCreation DateRedirect URIs
<%= client.getApplicationName() %>"><%= client.getApplicationName() %> - <% - if (client.getClientSecret() != null) { - %> - - <% - } else { - %> - Unavailable for public client - <% - } - %> + <% + Date date = new Date(client.getRegisteredAt() * 1000); + String created = dateFormat.format(date); + %> + <%= created %>
<% if(client.getRedirectUris() != null) {