From deffa9b4e17489bfbd8ea3547a4628c0054be9ee Mon Sep 17 00:00:00 2001 From: Bill Burke Date: Fri, 10 Oct 2014 16:55:57 -0400 Subject: [PATCH] oauth id in admin console --- .../resources/js/controllers/oauth-clients.js | 44 +++++++++---------- .../theme/admin/base/resources/js/services.js | 22 +++++----- .../partials/oauth-client-installation.html | 2 +- .../resources/partials/oauth-client-list.html | 2 +- .../partials/oauth-client-revocation.html | 2 +- .../partials/oauth-client-scope-mappings.html | 2 +- .../templates/kc-navigation-oauth-client.html | 12 ++--- .../admin/OAuthClientsByIdResource.java | 42 ++++++++++++++++++ .../resources/admin/OAuthClientsResource.java | 6 ++- .../resources/admin/RealmAdminResource.java | 15 ++++++- .../testsuite/pages/LoginConfigTotpPage.java | 2 +- 11 files changed, 105 insertions(+), 46 deletions(-) mode change 100644 => 100755 forms/common-themes/src/main/resources/theme/admin/base/resources/templates/kc-navigation-oauth-client.html create mode 100755 services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsByIdResource.java mode change 100644 => 100755 testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginConfigTotpPage.java diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/oauth-clients.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/oauth-clients.js index dfd93d3fccf..87dece90661 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/oauth-clients.js +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/oauth-clients.js @@ -17,7 +17,7 @@ module.controller('OAuthClientClaimsCtrl', function($scope, realm, oauth, claims $scope.save = function () { OAuthClientClaims.update({ realm: realm.realm, - oauth: oauth.name + oauth: oauth.id }, $scope.claims, function () { $scope.changed = false; claims = angular.copy($scope.claims); @@ -27,7 +27,7 @@ module.controller('OAuthClientClaimsCtrl', function($scope, realm, oauth, claims }; $scope.reset = function () { - $location.url("/realms/" + realm.realm + "/oauth-clients/" + oauth.name + "/claims"); + $location.url("/realms/" + realm.realm + "/oauth-clients/" + oauth.id + "/claims"); }; }); @@ -36,14 +36,14 @@ module.controller('OAuthClientCredentialsCtrl', function($scope, $location, real $scope.realm = realm; $scope.oauth = oauth; - var secret = OAuthClientCredentials.get({ realm : realm.realm, oauth : oauth.name }, + var secret = OAuthClientCredentials.get({ realm : realm.realm, oauth : oauth.id }, function() { $scope.secret = secret.value; } ); $scope.changePassword = function() { - var secret = OAuthClientCredentials.update({ realm : realm.realm, oauth : oauth.name }, + var secret = OAuthClientCredentials.update({ realm : realm.realm, oauth : oauth.id }, function() { Notifications.success('The secret has been changed.'); $scope.secret = secret.value; @@ -148,11 +148,11 @@ module.controller('OAuthClientDetailCtrl', function($scope, realm, oauth, OAuthC } else { OAuthClient.update({ realm : realm.realm, - oauth : oauth.name + oauth : oauth.id }, $scope.oauth, function() { $scope.changed = false; oauth = angular.copy($scope.oauth); - $location.url("/realms/" + realm.realm + "/oauth-clients/" + oauth.name); + $location.url("/realms/" + realm.realm + "/oauth-clients/" + oauth.id); Notifications.success("Your changes have been saved to the oauth client."); }); } @@ -169,10 +169,10 @@ module.controller('OAuthClientDetailCtrl', function($scope, realm, oauth, OAuthC }; $scope.remove = function() { - Dialog.confirmDelete($scope.oauth.name, 'oauth', function() { + Dialog.confirmDelete($scope.oauth.id, 'oauth', function() { $scope.oauth.$remove({ realm : realm.realm, - oauth : $scope.oauth.name + oauth : $scope.oauth.id }, function() { $location.url("/realms/" + realm.realm + "/oauth-clients"); Notifications.success("The oauth client has been deleted."); @@ -205,7 +205,7 @@ module.controller('OAuthClientScopeMappingCtrl', function($scope, $http, realm, console.log('change full scope'); OAuthClient.update({ realm : realm.realm, - oauth : oauth.name + oauth : oauth.id }, $scope.oauth, function() { $scope.changed = false; oauth = angular.copy($scope.oauth); @@ -216,17 +216,17 @@ module.controller('OAuthClientScopeMappingCtrl', function($scope, $http, realm, function updateRealmRoles() { - $scope.realmRoles = OAuthClientAvailableRealmScopeMapping.query({realm : realm.realm, oauth : oauth.name}); - $scope.realmMappings = OAuthClientRealmScopeMapping.query({realm : realm.realm, oauth : oauth.name}); - $scope.realmComposite = OAuthClientCompositeRealmScopeMapping.query({realm : realm.realm, oauth : oauth.name}); + $scope.realmRoles = OAuthClientAvailableRealmScopeMapping.query({realm : realm.realm, oauth : oauth.id}); + $scope.realmMappings = OAuthClientRealmScopeMapping.query({realm : realm.realm, oauth : oauth.id}); + $scope.realmComposite = OAuthClientCompositeRealmScopeMapping.query({realm : realm.realm, oauth : oauth.id}); } function updateAppRoles() { if ($scope.targetApp) { console.debug($scope.targetApp.name); - $scope.applicationRoles = OAuthClientAvailableApplicationScopeMapping.query({realm : realm.realm, oauth : oauth.name, targetApp : $scope.targetApp.id}); - $scope.applicationMappings = OAuthClientApplicationScopeMapping.query({realm : realm.realm, oauth : oauth.name, targetApp : $scope.targetApp.id}); - $scope.applicationComposite = OAuthClientCompositeApplicationScopeMapping.query({realm : realm.realm, oauth : oauth.name, targetApp : $scope.targetApp.id}); + $scope.applicationRoles = OAuthClientAvailableApplicationScopeMapping.query({realm : realm.realm, oauth : oauth.id, targetApp : $scope.targetApp.id}); + $scope.applicationMappings = OAuthClientApplicationScopeMapping.query({realm : realm.realm, oauth : oauth.id, targetApp : $scope.targetApp.id}); + $scope.applicationComposite = OAuthClientCompositeApplicationScopeMapping.query({realm : realm.realm, oauth : oauth.id, targetApp : $scope.targetApp.id}); } else { $scope.applicationRoles = null; $scope.applicationMappings = null; @@ -239,7 +239,7 @@ module.controller('OAuthClientScopeMappingCtrl', function($scope, $http, realm, }; $scope.addRealmRole = function() { - $http.post(authUrl + '/admin/realms/' + realm.realm + '/oauth-clients/' + oauth.name + '/scope-mappings/realm', + $http.post(authUrl + '/admin/realms/' + realm.realm + '/oauth-clients-by-id/' + oauth.id + '/scope-mappings/realm', $scope.selectedRealmRoles).success(function () { updateRealmRoles(); Notifications.success("Scope mappings updated."); @@ -247,7 +247,7 @@ module.controller('OAuthClientScopeMappingCtrl', function($scope, $http, realm, }; $scope.deleteRealmRole = function() { - $http.delete(authUrl + '/admin/realms/' + realm.realm + '/oauth-clients/' + oauth.name + '/scope-mappings/realm', + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/oauth-clients-by-id/' + oauth.id + '/scope-mappings/realm', {data : $scope.selectedRealmMappings, headers : {"content-type" : "application/json"}}).success(function () { updateRealmRoles(); Notifications.success("Scope mappings updated."); @@ -256,7 +256,7 @@ module.controller('OAuthClientScopeMappingCtrl', function($scope, $http, realm, }; $scope.addApplicationRole = function() { - $http.post(authUrl + '/admin/realms/' + realm.realm + '/oauth-clients/' + oauth.name + '/scope-mappings/applications-by-id/' + $scope.targetApp.id, + $http.post(authUrl + '/admin/realms/' + realm.realm + '/oauth-clients-by-id/' + oauth.id + '/scope-mappings/applications-by-id/' + $scope.targetApp.id, $scope.selectedApplicationRoles).success(function () { updateAppRoles(); Notifications.success("Scope mappings updated."); @@ -265,7 +265,7 @@ module.controller('OAuthClientScopeMappingCtrl', function($scope, $http, realm, }; $scope.deleteApplicationRole = function() { - $http.delete(authUrl + '/admin/realms/' + realm.realm + '/oauth-clients/' + oauth.name + '/scope-mappings/applications-by-id/' + $scope.targetApp.id, + $http.delete(authUrl + '/admin/realms/' + realm.realm + '/oauth-clients-by-id/' + oauth.id + '/scope-mappings/applications-by-id/' + $scope.targetApp.id, {data : $scope.selectedApplicationMappings, headers : {"content-type" : "application/json"}}).success(function () { updateAppRoles(); Notifications.success("Scope mappings updated."); @@ -300,7 +300,7 @@ module.controller('OAuthClientRevocationCtrl', function($scope, realm, oauth, OA setNotBefore(); var refresh = function() { - OAuthClient.get({ realm : realm.realm, oauth: $scope.oauth.name }, function(updated) { + OAuthClient.get({ realm : realm.realm, oauth: $scope.oauth.id }, function(updated) { $scope.oauth = updated; setNotBefore(); }) @@ -309,7 +309,7 @@ module.controller('OAuthClientRevocationCtrl', function($scope, realm, oauth, OA $scope.clear = function() { $scope.oauth.notBefore = 0; - OAuthClient.update({ realm : realm.realm, oauth: $scope.oauth.name}, $scope.oauth, function () { + OAuthClient.update({ realm : realm.realm, oauth: $scope.oauth.id}, $scope.oauth, function () { $scope.notBefore = "None"; Notifications.success('Not Before cleared for application.'); refresh(); @@ -317,7 +317,7 @@ module.controller('OAuthClientRevocationCtrl', function($scope, realm, oauth, OA } $scope.setNotBeforeNow = function() { $scope.oauth.notBefore = new Date().getTime()/1000; - OAuthClient.update({ realm : realm.realm, oauth: $scope.oauth.name}, $scope.oauth, function () { + OAuthClient.update({ realm : realm.realm, oauth: $scope.oauth.id}, $scope.oauth, function () { Notifications.success('Not Before cleared for application.'); refresh(); }); diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/services.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/services.js index 3fafb68f86c..fec1e991c79 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/services.js +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/services.js @@ -749,7 +749,7 @@ module.factory('ApplicationOrigins', function($resource) { }); module.factory('OAuthClient', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth', { realm : '@realm', oauth : '@oauth' }, { @@ -760,7 +760,7 @@ module.factory('OAuthClient', function($resource) { }); module.factory('OAuthClientClaims', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/claims', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/claims', { realm : '@realm', oauth : "@oauth" }, { @@ -772,7 +772,7 @@ module.factory('OAuthClientClaims', function($resource) { module.factory('OAuthClientCredentials', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/client-secret', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/client-secret', { realm : '@realm', oauth : '@oauth' }, { @@ -784,28 +784,28 @@ module.factory('OAuthClientCredentials', function($resource) { }); module.factory('OAuthClientRealmScopeMapping', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/scope-mappings/realm', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/scope-mappings/realm', { realm : '@realm', oauth : '@oauth' }); }); module.factory('OAuthClientCompositeRealmScopeMapping', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/scope-mappings/realm/composite', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/scope-mappings/realm/composite', { realm : '@realm', oauth : '@oauth' }); }); module.factory('OAuthClientAvailableRealmScopeMapping', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/scope-mappings/realm/available', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/scope-mappings/realm/available', { realm : '@realm', oauth : '@oauth' }); }); module.factory('OAuthClientApplicationScopeMapping', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/scope-mappings/applications-by-id/:targetApp', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/scope-mappings/applications-by-id/:targetApp', { realm : '@realm', oauth : '@oauth', targetApp : '@targetApp' @@ -813,7 +813,7 @@ module.factory('OAuthClientApplicationScopeMapping', function($resource) { }); module.factory('OAuthClientCompositeApplicationScopeMapping', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/scope-mappings/applications-by-id/:targetApp/composite', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/scope-mappings/applications-by-id/:targetApp/composite', { realm : '@realm', oauth : '@oauth', targetApp : '@targetApp' @@ -821,7 +821,7 @@ module.factory('OAuthClientCompositeApplicationScopeMapping', function($resource }); module.factory('OAuthClientAvailableApplicationScopeMapping', function($resource) { - return $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/scope-mappings/applications-by-id/:targetApp/available', { + return $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/scope-mappings/applications-by-id/:targetApp/available', { realm : '@realm', oauth : '@oauth', targetApp : '@targetApp' @@ -831,8 +831,8 @@ module.factory('OAuthClientAvailableApplicationScopeMapping', function($resource module.factory('OAuthClientInstallation', function($resource) { - var url = authUrl + '/admin/realms/:realm/oauth-clients/:oauth/installation'; - var resource = $resource(authUrl + '/admin/realms/:realm/oauth-clients/:oauth/installation', { + var url = authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/installation'; + var resource = $resource(authUrl + '/admin/realms/:realm/oauth-clients-by-id/:oauth/installation', { realm : '@realm', oauth : '@oauth' }, { diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-installation.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-installation.html index a2df72bdb79..15ba1ded8ab 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-installation.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-installation.html @@ -4,7 +4,7 @@

{{oauth.name}} Adapter Installation

diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-list.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-list.html index f6ffbbfe221..f5638b47a45 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-list.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-list.html @@ -43,7 +43,7 @@ --> - {{client.name}} + {{client.name}} {{client.enabled}} diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-revocation.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-revocation.html index 8d378a570de..b36082f85e9 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-revocation.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-revocation.html @@ -4,7 +4,7 @@

{{oauth.name}} Revocation Policies

diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-scope-mappings.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-scope-mappings.html index e28dc56eccf..788525c1150 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-scope-mappings.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-scope-mappings.html @@ -4,7 +4,7 @@

{{oauth.name}} Scope Mappings

diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/templates/kc-navigation-oauth-client.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/templates/kc-navigation-oauth-client.html old mode 100644 new mode 100755 index 4853bef0038..ffca27183d4 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/templates/kc-navigation-oauth-client.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/templates/kc-navigation-oauth-client.html @@ -1,8 +1,8 @@ \ No newline at end of file diff --git a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsByIdResource.java b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsByIdResource.java new file mode 100755 index 00000000000..e479827b107 --- /dev/null +++ b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsByIdResource.java @@ -0,0 +1,42 @@ +package org.keycloak.services.resources.admin; + +import org.jboss.logging.Logger; +import org.jboss.resteasy.annotations.cache.NoCache; +import org.jboss.resteasy.spi.NotFoundException; +import org.jboss.resteasy.spi.ResteasyProviderFactory; +import org.keycloak.models.KeycloakSession; +import org.keycloak.models.ModelDuplicateException; +import org.keycloak.models.OAuthClientModel; +import org.keycloak.models.RealmModel; +import org.keycloak.models.utils.ModelToRepresentation; +import org.keycloak.models.utils.RepresentationToModel; +import org.keycloak.representations.idm.OAuthClientRepresentation; +import org.keycloak.services.resources.flows.Flows; + +import javax.ws.rs.Consumes; +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; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bill Burke + * @version $Revision: 1 $ + */ +public class OAuthClientsByIdResource extends OAuthClientsResource { + public OAuthClientsByIdResource(RealmModel realm, RealmAuth auth, KeycloakSession session) { + super(realm, auth, session); + } + + protected OAuthClientModel getOAuthClientModel(String id) { + return realm.getOAuthClientById(id); + } + +} diff --git a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java index 612f539935a..0f15347119f 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java @@ -106,7 +106,7 @@ public class OAuthClientsResource { public OAuthClientResource getOAuthClient(final @PathParam("clientId") String clientId) { auth.requireView(); - OAuthClientModel oauth = realm.getOAuthClient(clientId); + OAuthClientModel oauth = getOAuthClientModel(clientId); if (oauth == null) { throw new NotFoundException("OAuth Client not found"); } @@ -116,4 +116,8 @@ public class OAuthClientsResource { return oAuthClientResource; } + protected OAuthClientModel getOAuthClientModel(String clientId) { + return realm.getOAuthClient(clientId); + } + } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java index 9c6047ac9fc..1a45769962e 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java @@ -99,7 +99,7 @@ public class RealmAdminResource { } /** - * base path for managing oauth clients in this realm + * base path for managing oauth clients in this realm uses name of client * * @return */ @@ -111,6 +111,19 @@ public class RealmAdminResource { return oauth; } + /** + * base path for managing oauth clients in this realm uses ids + * + * @return + */ + @Path("oauth-clients-by-id") + public OAuthClientsByIdResource getOAuthClientsById() { + OAuthClientsByIdResource oauth = new OAuthClientsByIdResource(realm, auth, session); + ResteasyProviderFactory.getInstance().injectProperties(oauth); + //resourceContext.initResource(oauth); + return oauth; + } + /** * base path for managing realm-level roles of this realm * diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginConfigTotpPage.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginConfigTotpPage.java old mode 100644 new mode 100755 index 5b1613ad0c7..edb8cc5a36a --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginConfigTotpPage.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginConfigTotpPage.java @@ -48,7 +48,7 @@ public class LoginConfigTotpPage extends AbstractPage { } public boolean isCurrent() { - return driver.getTitle().equals("Google Authenticator Setup"); + return driver.getTitle().equals("FreeOTP Authenticator Setup"); } public void open() {