diff --git a/forms/common-themes/src/main/resources/theme/base/admin/messages/admin-messages_ca.properties b/forms/common-themes/src/main/resources/theme/base/admin/messages/admin-messages_ca.properties old mode 100644 new mode 100755 diff --git a/forms/common-themes/src/main/resources/theme/base/admin/messages/admin-messages_es.properties b/forms/common-themes/src/main/resources/theme/base/admin/messages/admin-messages_es.properties old mode 100644 new mode 100755 diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js index bfbcee9c5bb..826a3daa309 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js @@ -784,7 +784,7 @@ module.config([ '$routeProvider', function($routeProvider) { controller : 'AddBuiltinProtocolMapperCtrl' }) .when('/realms/:realm/clients/:client/mappers/:id', { - templateUrl : resourceUrl + '/partials/protocol-mapper-detail.html', + templateUrl : resourceUrl + '/partials/client-protocol-mapper-detail.html', resolve : { realm : function(RealmLoader) { return RealmLoader(); @@ -803,7 +803,7 @@ module.config([ '$routeProvider', function($routeProvider) { controller : 'ClientProtocolMapperCtrl' }) .when('/create/client/:realm/:client/mappers', { - templateUrl : resourceUrl + '/partials/protocol-mapper-detail.html', + templateUrl : resourceUrl + '/partials/client-protocol-mapper-detail.html', resolve : { realm : function(RealmLoader) { return RealmLoader(); @@ -817,6 +817,70 @@ module.config([ '$routeProvider', function($routeProvider) { }, controller : 'ClientProtocolMapperCreateCtrl' }) + .when('/realms/:realm/client-templates/:template/mappers', { + templateUrl : resourceUrl + '/partials/client-template-mappers.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientTemplateProtocolMapperListCtrl' + }) + .when('/realms/:realm/client-templates/:template/add-mappers', { + templateUrl : resourceUrl + '/partials/client-template-mappers-add.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientTemplateAddBuiltinProtocolMapperCtrl' + }) + .when('/realms/:realm/client-templates/:template/mappers/:id', { + templateUrl : resourceUrl + '/partials/client-template-protocol-mapper-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + mapper : function(ClientTemplateProtocolMapperLoader) { + return ClientTemplateProtocolMapperLoader(); + } + + }, + controller : 'ClientTemplateProtocolMapperCtrl' + }) + .when('/create/client-template/:realm/:template/mappers', { + templateUrl : resourceUrl + '/partials/client-template-protocol-mapper-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + } + }, + controller : 'ClientTemplateProtocolMapperCreateCtrl' + }) .when('/realms/:realm/clients/:client/sessions', { templateUrl : resourceUrl + '/partials/client-sessions.html', resolve : { @@ -1063,6 +1127,9 @@ module.config([ '$routeProvider', function($routeProvider) { realm : function(RealmLoader) { return RealmLoader(); }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, clients : function(ClientListLoader) { return ClientListLoader(); }, @@ -1081,6 +1148,9 @@ module.config([ '$routeProvider', function($routeProvider) { realm : function(RealmLoader) { return RealmLoader(); }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, clients : function(ClientListLoader) { return ClientListLoader(); }, @@ -1093,6 +1163,42 @@ module.config([ '$routeProvider', function($routeProvider) { }, controller : 'ClientDetailCtrl' }) + .when('/create/client-template/:realm', { + templateUrl : resourceUrl + '/partials/client-template-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + template : function() { + return {}; + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientTemplateDetailCtrl' + }) + .when('/realms/:realm/client-templates/:template', { + templateUrl : resourceUrl + '/partials/client-template-detail.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + template : function(ClientTemplateLoader) { + return ClientTemplateLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + }, + controller : 'ClientTemplateDetailCtrl' + }) .when('/realms/:realm/clients', { templateUrl : resourceUrl + '/partials/client-list.html', resolve : { @@ -1109,6 +1215,22 @@ module.config([ '$routeProvider', function($routeProvider) { }, controller : 'ClientListCtrl' }) + .when('/realms/:realm/client-templates', { + templateUrl : resourceUrl + '/partials/client-template-list.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + templates : function(ClientTemplateListLoader) { + return ClientTemplateListLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); + } + + }, + controller : 'ClientTemplateListCtrl' + }) .when('/import/client/:realm', { templateUrl : resourceUrl + '/partials/client-import.html', resolve : { @@ -2025,6 +2147,15 @@ module.directive('kcTabsClient', function () { } }); +module.directive('kcTabsClientTemplate', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-tabs-client-template.html' + } +}); + module.directive('kcNavigationUser', function () { return { scope: true, diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js index 4e81a43035c..420517d0f89 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js @@ -726,7 +726,10 @@ module.controller('ClientInstallationCtrl', function($scope, realm, client, Clie } }); -module.controller('ClientDetailCtrl', function($scope, realm, client, $route, serverInfo, Client, ClientDescriptionConverter, $location, $modal, Dialog, Notifications) { +module.controller('ClientDetailCtrl', function($scope, realm, client, templates, $route, serverInfo, Client, ClientDescriptionConverter, $location, $modal, Dialog, Notifications) { + + + $scope.accessTypes = [ "confidential", "public", @@ -735,6 +738,12 @@ module.controller('ClientDetailCtrl', function($scope, realm, client, $route, se $scope.protocols = Object.keys(serverInfo.providers['login-protocol'].providers).sort(); + $scope.templates = [ {name:'NONE'}]; + for (var i = 0; i < templates.length; i++) { + var template = templates[i]; + $scope.templates.push(template); + } + $scope.signatureAlgorithms = [ "RSA_SHA1", "RSA_SHA256", @@ -1444,22 +1453,32 @@ module.controller('ClientProtocolMapperListCtrl', function($scope, realm, client }); module.controller('ClientProtocolMapperCtrl', function($scope, realm, serverInfo, client, mapper, ClientProtocolMapper, Notifications, Dialog, $location) { + /* $scope.realm = realm; $scope.client = client; $scope.create = false; - if (client.protocol == null) { - client.protocol = 'openid-connect'; - } $scope.protocol = client.protocol; $scope.mapper = angular.copy(mapper); $scope.changed = false; - $scope.boolval = true; - $scope.boolvalId = 'boolval'; + */ + + if (client.protocol == null) { + client.protocol = 'openid-connect'; + } + + $scope.model = { + realm: realm, + client: client, + create: false, + protocol: client.protocol, + mapper: angular.copy(mapper), + changed: false + } var protocolMappers = serverInfo.protocolMapperTypes[client.protocol]; for (var i = 0; i < protocolMappers.length; i++) { if (protocolMappers[i].id == mapper.protocolMapper) { - $scope.mapperType = protocolMappers[i]; + $scope.model.mapperType = protocolMappers[i]; } } $scope.$watch(function() { @@ -1468,9 +1487,9 @@ module.controller('ClientProtocolMapperCtrl', function($scope, realm, serverInfo $scope.path = $location.path().substring(1).split("/"); }); - $scope.$watch('mapper', function() { - if (!angular.equals($scope.mapper, mapper)) { - $scope.changed = true; + $scope.$watch('model.mapper', function() { + if (!angular.equals($scope.model.mapper, mapper)) { + $scope.model.changed = true; } }, true); @@ -1479,17 +1498,17 @@ module.controller('ClientProtocolMapperCtrl', function($scope, realm, serverInfo realm : realm.realm, client: client.id, id : mapper.id - }, $scope.mapper, function() { - $scope.changed = false; + }, $scope.model.mapper, function() { + $scope.model.changed = false; mapper = angular.copy($scope.mapper); - $location.url("/realms/" + realm.realm + '/clients/' + client.id + "/mappers/" + mapper.id); + $location.url("/realms/" + realm.realm + '/clients/' + client.id + "/mappers/" + $scope.model.mapper.id); Notifications.success("Your changes have been saved."); }); }; $scope.reset = function() { - $scope.mapper = angular.copy(mapper); - $scope.changed = false; + $scope.model.mapper = angular.copy(mapper); + $scope.model.changed = false; }; $scope.cancel = function() { @@ -1499,7 +1518,7 @@ module.controller('ClientProtocolMapperCtrl', function($scope, realm, serverInfo $scope.remove = function() { Dialog.confirmDelete($scope.mapper.name, 'mapper', function() { - ClientProtocolMapper.remove({ realm: realm.realm, client: client.id, id : $scope.mapper.id }, function() { + ClientProtocolMapper.remove({ realm: realm.realm, client: client.id, id : $scope.model.mapper.id }, function() { Notifications.success("The mapper has been deleted."); $location.url("/realms/" + realm.realm + '/clients/' + client.id + "/mappers"); }); @@ -1509,16 +1528,27 @@ module.controller('ClientProtocolMapperCtrl', function($scope, realm, serverInfo }); module.controller('ClientProtocolMapperCreateCtrl', function($scope, realm, serverInfo, client, ClientProtocolMapper, Notifications, Dialog, $location) { - $scope.realm = realm; - $scope.client = client; - $scope.create = true; if (client.protocol == null) { client.protocol = 'openid-connect'; } var protocol = client.protocol; + /* + $scope.realm = realm; + $scope.client = client; + $scope.create = true; $scope.protocol = protocol; $scope.mapper = { protocol : client.protocol, config: {}}; $scope.mapperTypes = serverInfo.protocolMapperTypes[protocol]; + */ + $scope.model = { + realm: realm, + client: client, + create: true, + protocol: client.protocol, + mapper: { protocol : client.protocol, config: {}}, + changed: false, + mapperTypes: serverInfo.protocolMapperTypes[protocol] + } $scope.$watch(function() { return $location.path(); @@ -1527,10 +1557,10 @@ module.controller('ClientProtocolMapperCreateCtrl', function($scope, realm, serv }); $scope.save = function() { - $scope.mapper.protocolMapper = $scope.mapperType.id; + $scope.model.mapper.protocolMapper = $scope.model.mapperType.id; ClientProtocolMapper.save({ realm : realm.realm, client: client.id - }, $scope.mapper, function(data, headers) { + }, $scope.model.mapper, function(data, headers) { var l = headers().location; var id = l.substring(l.lastIndexOf("/") + 1); $location.url("/realms/" + realm.realm + '/clients/' + client.id + "/mappers/" + id); @@ -1546,5 +1576,335 @@ module.controller('ClientProtocolMapperCreateCtrl', function($scope, realm, serv }); +module.controller('ClientTemplateTabCtrl', function(Dialog, $scope, Current, Notifications, $location) { + $scope.removeClientTemplate = function() { + Dialog.confirmDelete($scope.template.name, 'client template', function() { + $scope.template.$remove({ + realm : Current.realm.realm, + template : $scope.template.id + }, function() { + $location.url("/realms/" + Current.realm.realm + "/client-templates"); + Notifications.success("The client template has been deleted."); + }); + }); + }; +}); + + + +module.controller('ClientTemplateListCtrl', function($scope, realm, templates, ClientTemplate, serverInfo, $route, Dialog, Notifications) { + $scope.realm = realm; + $scope.templates = templates; + + $scope.removeClientTemplate = function(template) { + Dialog.confirmDelete(template.name, 'client template', function() { + ClientTemplate.remove({ + realm : realm.realm, + template : template.id + }, function() { + $route.reload(); + Notifications.success("The client template been deleted."); + }); + }); + }; +}); + +module.controller('ClientTemplateDetailCtrl', function($scope, realm, template, $route, serverInfo, ClientTemplate, $location, $modal, Dialog, Notifications) { + $scope.protocols = Object.keys(serverInfo.providers['login-protocol'].providers).sort(); + + $scope.realm = realm; + $scope.create = !template.name; + + function updateProperties() { + if ($scope.template.protocol) { + $scope.protocol = $scope.protocols[$scope.protocols.indexOf($scope.template.protocol)]; + } else { + $scope.protocol = $scope.protocols[0]; + } + } + + if (!$scope.create) { + $scope.template = angular.copy(template); + updateProperties(); + } else { + $scope.template = { + }; + $scope.protocol = $scope.protocols[0]; + } + + + $scope.switchChange = function() { + $scope.changed = true; + } + + $scope.changeProtocol = function() { + if ($scope.protocol == "openid-connect") { + $scope.template.protocol = "openid-connect"; + } else if ($scope.protocol == "saml") { + $scope.template.protocol = "saml"; + } + }; + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + function isChanged() { + if (!angular.equals($scope.template, template)) { + return true; + } + return false; + } + + $scope.$watch('template', function() { + $scope.changed = isChanged(); + }, true); + + $scope.save = function() { + $scope.template.protocol = $scope.protocol; + + if ($scope.create) { + ClientTemplate.save({ + realm: realm.realm, + template: '' + }, $scope.template, function (data, headers) { + $scope.changed = false; + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + $location.url("/realms/" + realm.realm + "/client-templates/" + id); + Notifications.success("The client template has been created."); + }); + } else { + ClientTemplate.update({ + realm : realm.realm, + template : template.id + }, $scope.template, function() { + $scope.changed = false; + template = angular.copy($scope.template); + $location.url("/realms/" + realm.realm + "/client-templates/" + template.id); + Notifications.success("Your changes have been saved to the client template."); + }); + } + }; + + $scope.reset = function() { + $route.reload(); + }; + + $scope.cancel = function() { + $location.url("/realms/" + realm.realm + "/client-templates"); + }; +}); + +module.controller('ClientTemplateProtocolMapperListCtrl', function($scope, realm, template, serverInfo, + ClientTemplateProtocolMappersByProtocol, ClientTemplateProtocolMapper, + $route, Dialog, Notifications) { + $scope.realm = realm; + $scope.template = template; + if (template.protocol == null) { + template.protocol = 'openid-connect'; + } + + var protocolMappers = serverInfo.protocolMapperTypes[template.protocol]; + var mapperTypes = {}; + for (var i = 0; i < protocolMappers.length; i++) { + mapperTypes[protocolMappers[i].id] = protocolMappers[i]; + } + $scope.mapperTypes = mapperTypes; + + $scope.removeMapper = function(mapper) { + console.debug(mapper); + Dialog.confirmDelete(mapper.name, 'mapper', function() { + ClientTemplateProtocolMapper.remove({ realm: realm.realm, template: template.id, id : mapper.id }, function() { + Notifications.success("The mapper has been deleted."); + $route.reload(); + }); + }); + }; + + var updateMappers = function() { + $scope.mappers = ClientTemplateProtocolMappersByProtocol.query({realm : realm.realm, template : template.id, protocol : template.protocol}); + }; + + updateMappers(); +}); + +module.controller('ClientTemplateProtocolMapperCtrl', function($scope, realm, serverInfo, template, mapper, ClientTemplateProtocolMapper, Notifications, Dialog, $location) { + + if (template.protocol == null) { + template.protocol = 'openid-connect'; + } + + $scope.model = { + realm: realm, + template: template, + create: false, + protocol: template.protocol, + mapper: angular.copy(mapper), + changed: false + } + + var protocolMappers = serverInfo.protocolMapperTypes[template.protocol]; + for (var i = 0; i < protocolMappers.length; i++) { + if (protocolMappers[i].id == mapper.protocolMapper) { + $scope.model.mapperType = protocolMappers[i]; + } + } + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.$watch('model.mapper', function() { + if (!angular.equals($scope.model.mapper, mapper)) { + $scope.model.changed = true; + } + }, true); + + $scope.save = function() { + ClientTemplateProtocolMapper.update({ + realm : realm.realm, + template: template.id, + id : mapper.id + }, $scope.model.mapper, function() { + $scope.model.changed = false; + mapper = angular.copy($scope.mapper); + $location.url("/realms/" + realm.realm + '/client-templates/' + template.id + "/mappers/" + $scope.model.mapper.id); + Notifications.success("Your changes have been saved."); + }); + }; + + $scope.reset = function() { + $scope.model.mapper = angular.copy(mapper); + $scope.model.changed = false; + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + $scope.remove = function() { + Dialog.confirmDelete($scope.mapper.name, 'mapper', function() { + ClientTemplateProtocolMapper.remove({ realm: realm.realm, template: template.id, id : $scope.model.mapper.id }, function() { + Notifications.success("The mapper has been deleted."); + $location.url("/realms/" + realm.realm + '/client-templates/' + template.id + "/mappers"); + }); + }); + }; + +}); + +module.controller('ClientTemplateProtocolMapperCreateCtrl', function($scope, realm, serverInfo, template, ClientTemplateProtocolMapper, Notifications, Dialog, $location) { + if (template.protocol == null) { + template.protocol = 'openid-connect'; + } + var protocol = template.protocol; + $scope.model = { + realm: realm, + template: template, + create: true, + protocol: template.protocol, + mapper: { protocol : template.protocol, config: {}}, + changed: false, + mapperTypes: serverInfo.protocolMapperTypes[protocol] + } + + $scope.$watch(function() { + return $location.path(); + }, function() { + $scope.path = $location.path().substring(1).split("/"); + }); + + $scope.save = function() { + $scope.model.mapper.protocolMapper = $scope.model.mapperType.id; + ClientTemplateProtocolMapper.save({ + realm : realm.realm, template: template.id + }, $scope.model.mapper, function(data, headers) { + var l = headers().location; + var id = l.substring(l.lastIndexOf("/") + 1); + $location.url("/realms/" + realm.realm + '/client-templates/' + template.id + "/mappers/" + id); + Notifications.success("Mapper has been created."); + }); + }; + + $scope.cancel = function() { + //$location.url("/realms"); + window.history.back(); + }; + + +}); + +module.controller('ClientTemplateAddBuiltinProtocolMapperCtrl', function($scope, realm, template, serverInfo, + ClientTemplateProtocolMappersByProtocol, + $http, $location, Dialog, Notifications) { + $scope.realm = realm; + $scope.template = template; + if (template.protocol == null) { + template.protocol = 'openid-connect'; + } + + var protocolMappers = serverInfo.protocolMapperTypes[template.protocol]; + var mapperTypes = {}; + for (var i = 0; i < protocolMappers.length; i++) { + mapperTypes[protocolMappers[i].id] = protocolMappers[i]; + } + $scope.mapperTypes = mapperTypes; + + + + + var updateMappers = function() { + var clientMappers = ClientTemplateProtocolMappersByProtocol.query({realm : realm.realm, template : template.id, protocol : template.protocol}, function() { + var builtinMappers = serverInfo.builtinProtocolMappers[template.protocol]; + for (var i = 0; i < clientMappers.length; i++) { + for (var j = 0; j < builtinMappers.length; j++) { + if (builtinMappers[j].name == clientMappers[i].name + && builtinMappers[j].protocolMapper == clientMappers[i].protocolMapper) { + builtinMappers.splice(j, 1); + break; + } + } + } + $scope.mappers = builtinMappers; + for (var i = 0; i < $scope.mappers.length; i++) { + $scope.mappers[i].isChecked = false; + } + + + }); + }; + + updateMappers(); + + $scope.add = function() { + var toAdd = []; + for (var i = 0; i < $scope.mappers.length; i++) { + if ($scope.mappers[i].isChecked) { + delete $scope.mappers[i].isChecked; + toAdd.push($scope.mappers[i]); + } + } + $http.post(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/protocol-mappers/add-models', + toAdd).success(function() { + Notifications.success("Mappers added"); + $location.url('/realms/' + realm.realm + '/client-templates/' + template.id + '/mappers'); + }).error(function() { + Notifications.error("Error adding mappers"); + $location.url('/realms/' + realm.realm + '/client-templates/' + template.id + '/mappers'); + }); + }; + +}); + + + + + + diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js index 61b608fe8eb..94854f30e68 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js @@ -107,6 +107,16 @@ module.factory('ClientProtocolMapperLoader', function(Loader, ClientProtocolMapp }); }); +module.factory('ClientTemplateProtocolMapperLoader', function(Loader, ClientTemplateProtocolMapper, $route, $q) { + return Loader.get(ClientTemplateProtocolMapper, function() { + return { + realm : $route.current.params.realm, + template : $route.current.params.template, + id: $route.current.params.id + } + }); +}); + module.factory('UserLoader', function(Loader, User, $route, $q) { return Loader.get(User, function() { return { @@ -311,6 +321,23 @@ module.factory('ClientListLoader', function(Loader, Client, $route, $q) { }); }); +module.factory('ClientTemplateLoader', function(Loader, ClientTemplate, $route, $q) { + return Loader.get(ClientTemplate, function() { + return { + realm : $route.current.params.realm, + template : $route.current.params.template + } + }); +}); + +module.factory('ClientTemplateListLoader', function(Loader, ClientTemplate, $route, $q) { + return Loader.query(ClientTemplate, function() { + return { + realm : $route.current.params.realm + } + }); +}); + module.factory('ClientServiceAccountUserLoader', function(Loader, ClientServiceAccountUser, $route, $q) { return Loader.get(ClientServiceAccountUser, function() { return { diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js index 7b94680e79c..7a47a83a0c4 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js @@ -309,6 +309,18 @@ module.factory('ClientProtocolMapper', function($resource) { }); }); +module.factory('ClientTemplateProtocolMapper', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/protocol-mappers/models/:id', { + realm : '@realm', + template: '@template', + id : "@id" + }, { + update : { + method : 'PUT' + } + }); +}); + module.factory('User', function($resource) { return $resource(authUrl + '/admin/realms/:realm/users/:userId', { realm : '@realm', @@ -828,6 +840,14 @@ module.factory('ClientProtocolMappersByProtocol', function($resource) { }); }); +module.factory('ClientTemplateProtocolMappersByProtocol', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template/protocol-mappers/protocol/:protocol', { + realm : '@realm', + template : "@template", + protocol : "@protocol" + }); +}); + module.factory('ClientSessionStats', function($resource) { return $resource(authUrl + '/admin/realms/:realm/clients/:client/session-stats', { realm : '@realm', @@ -956,6 +976,18 @@ module.factory('Client', function($resource) { }); }); +module.factory('ClientTemplate', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/client-templates/:template', { + realm : '@realm', + template : '@template' + }, { + update : { + method : 'PUT' + } + }); +}); + + module.factory('ClientDescriptionConverter', function($resource) { return $resource(authUrl + '/admin/realms/:realm/client-description-converter', { realm : '@realm' diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html index 5b81a0167b0..6a2bd481df0 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html @@ -72,6 +72,18 @@ {{:: 'client-protocol.tooltip' | translate}} +
+ +
+
+ +
+
+ Client template this client inherits configuration from +
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-protocol-mapper-detail.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-protocol-mapper-detail.html new file mode 100755 index 00000000000..b2af24a932f --- /dev/null +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-protocol-mapper-detail.html @@ -0,0 +1,13 @@ +
+ + +
+
+ + \ No newline at end of file diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-detail.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-detail.html new file mode 100755 index 00000000000..5b286a99a5d --- /dev/null +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-detail.html @@ -0,0 +1,55 @@ +
+ + + + + +
+
+
+ +
+ +
+ Name of the client template. Must be unique in the realm +
+
+ +
+ +
+ Description of the client template +
+
+ +
+
+ +
+
+ Which SSO protocol configuration is being supplied by this client template +
+
+ +
+
+ + +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-list.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-list.html new file mode 100755 index 00000000000..81d6d6f7af5 --- /dev/null +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-list.html @@ -0,0 +1,50 @@ +
+

+ Client Templates + Client templates allow you to define common configuration that is shared between multiple clients +

+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+ +
+
+
+ + +
+
{{:: 'name' | translate}}{{:: 'actions' | translate}}
{{template.name}} + + + +
{{:: 'no-results' | translate}}{{:: 'no-clients-available' | translate}}
+
+ + \ No newline at end of file diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-mappers-add.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-mappers-add.html new file mode 100755 index 00000000000..cb09fbdfe8e --- /dev/null +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-mappers-add.html @@ -0,0 +1,53 @@ +
+ + + +

{{:: 'add-builtin-protocol-mapper' | translate}}

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+ +
+
+
+
+
{{:: 'name' | translate}}{{:: 'category' | translate}}{{:: 'type' | translate}}{{:: 'add' | translate}}
{{mapper.name}}{{mapperTypes[mapper.protocolMapper].category}}{{mapperTypes[mapper.protocolMapper].name}}
{{:: 'no-mappers-available' | translate}}
+ +
+ +
+
+ + \ No newline at end of file diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-mappers.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-mappers.html new file mode 100755 index 00000000000..7b767b28eaa --- /dev/null +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-mappers.html @@ -0,0 +1,57 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
{{:: 'name' | translate}}{{:: 'category' | translate}}{{:: 'type' | translate}}{{:: 'actions' | translate}}
{{mapper.name}}{{mapperTypes[mapper.protocolMapper].category}}{{mapperTypes[mapper.protocolMapper].name}} + + + +
{{:: 'no-mappers-available' | translate}}
+
+ + \ No newline at end of file diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-protocol-mapper-detail.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-protocol-mapper-detail.html new file mode 100755 index 00000000000..78ded5a6e08 --- /dev/null +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-template-protocol-mapper-detail.html @@ -0,0 +1,13 @@ +
+ + +
+
+ + \ No newline at end of file diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/protocol-mapper-detail.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/protocol-mapper-detail.html index afc9a5f5bec..13855adfd70 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/protocol-mapper-detail.html +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/protocol-mapper-detail.html @@ -1,16 +1,6 @@ -
- - - -

{{:: 'create-protocol-mapper' | translate}}

-

{{mapper.name|capitalize}}

+

{{:: 'create-protocol-mapper' | translate}}

+

{{model.mapper.name|capitalize}}

@@ -18,75 +8,72 @@
- +
{{:: 'protocol.tooltip' | translate}}
-
+
- +
- +
{{:: 'mapper.name.tooltip' | translate}}
- +
{{:: 'mapper.consent-required.tooltip' | translate}}
-
+
- +
{{:: 'consent-text.tooltip' | translate}}
-
+
- {{mapperType.helpText}} + {{model.mapperType.helpText}}
-
+
- +
- {{mapperType.helpText}} + {{model.mapperType.helpText}}
- +
-
+
-
- - +
+ +
-
- - \ No newline at end of file diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/templates/kc-menu.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/templates/kc-menu.html index 8da0e561480..5904fd75ed5 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/templates/kc-menu.html +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/templates/kc-menu.html @@ -29,7 +29,8 @@ || path[2] == 'keys-settings' || path[2] == 'smtp-settings' || path[2] == 'ldap-settings' || path[2] == 'auth-settings') && path[3] != 'clients') && 'active'"> Realm Settings -
  • Clients
  • +
  • Clients
  • +
  • Client Templates
  • Roles
  • Identity Providers
  • User Federation
  • diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/templates/kc-tabs-client-template.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/templates/kc-tabs-client-template.html new file mode 100755 index 00000000000..728e0917d70 --- /dev/null +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/templates/kc-tabs-client-template.html @@ -0,0 +1,16 @@ +
    + +

    Add Client Template

    +

    + {{template.name|capitalize}} + +

    + + +
    \ No newline at end of file diff --git a/pom.xml b/pom.xml index c7b2c6942a6..b074d3f498e 100755 --- a/pom.xml +++ b/pom.xml @@ -1393,7 +1393,7 @@ maven-surefire-plugin once - -Xms512m -Xmx1024m -XX:MaxPermSize=512m + -Xms512m -Xmx2048m -XX:MaxPermSize=1024m