Array.prototype.remove = function(from, to) { var rest = this.slice((to || from) + 1 || this.length); this.length = from < 0 ? this.length + from : from; return this.push.apply(this, rest); }; module.controller('ClientTabCtrl', function(Dialog, $scope, Current, Notifications, $location) { $scope.removeClient = function() { Dialog.confirmDelete($scope.client.clientId, 'client', function() { $scope.client.$remove({ realm : Current.realm.realm, client : $scope.client.id }, function() { $location.url("/realms/" + Current.realm.realm + "/clients"); Notifications.success("The client has been deleted."); }); }); }; }); module.controller('ClientRoleListCtrl', function($scope, $location, realm, client, roles, $route, RoleById, Notifications, Dialog) { $scope.realm = realm; $scope.roles = roles; $scope.client = client; $scope.removeRole = function(role) { Dialog.confirmDelete(role.name, 'role', function() { RoleById.remove({ realm: realm.realm, role: role.id }, function () { $route.reload(); Notifications.success("The role has been deleted."); }); }); }; $scope.$watch(function() { return $location.path(); }, function() { $scope.path = $location.path().substring(1).split("/"); }); }); module.controller('ClientCredentialsCtrl', function($scope, $location, realm, client, clientAuthenticatorProviders, clientConfigProperties, Client, ClientRegistrationAccessToken, Notifications) { $scope.realm = realm; $scope.client = angular.copy(client); $scope.clientAuthenticatorProviders = clientAuthenticatorProviders; var updateCurrentPartial = function(val) { $scope.clientAuthenticatorConfigPartial; switch(val) { case 'client-secret': $scope.clientAuthenticatorConfigPartial = 'client-credentials-secret.html'; break; case 'client-jwt': $scope.clientAuthenticatorConfigPartial = 'client-credentials-jwt.html'; break; default: $scope.currentAuthenticatorConfigProperties = clientConfigProperties[val]; $scope.clientAuthenticatorConfigPartial = 'client-credentials-generic.html'; break; } }; updateCurrentPartial(client.clientAuthenticatorType); $scope.$watch('client.clientAuthenticatorType', function() { if (!angular.equals($scope.client.clientAuthenticatorType, client.clientAuthenticatorType)) { Client.update({ realm : realm.realm, client : client.id }, $scope.client, function() { $scope.changed = false; client = angular.copy($scope.client); updateCurrentPartial(client.clientAuthenticatorType) }); } }, true); $scope.regenerateRegistrationAccessToken = function() { var secret = ClientRegistrationAccessToken.update({ realm : $scope.realm.realm, client : $scope.client.id }, function(data) { Notifications.success('The registration access token has been updated.'); $scope.client['registrationAccessToken'] = data.registrationAccessToken; }, function() { Notifications.error('Failed to update the registration access token'); } ); }; }); module.controller('ClientSecretCtrl', function($scope, $location, ClientSecret, Notifications) { var secret = ClientSecret.get({ realm : $scope.realm.realm, client : $scope.client.id }, function() { $scope.secret = secret.value; } ); $scope.changePassword = function() { var secret = ClientSecret.update({ realm : $scope.realm.realm, client : $scope.client.id }, function() { Notifications.success('The secret has been changed.'); $scope.secret = secret.value; }, function() { Notifications.error("The secret was not changed due to a problem."); $scope.secret = "error"; } ); }; $scope.$watch(function() { return $location.path(); }, function() { $scope.path = $location.path().substring(1).split("/"); }); $scope.cancel = function() { $location.url("/realms/" + $scope.realm.realm + "/clients/" + $scope.client.id + "/credentials"); }; }); module.controller('ClientSignedJWTCtrl', function($scope, $location, Client, ClientCertificate, Notifications, $route) { var signingKeyInfo = ClientCertificate.get({ realm : $scope.realm.realm, client : $scope.client.id, attribute: 'jwt.credential' }, function() { $scope.signingKeyInfo = signingKeyInfo; } ); console.log('ClientSignedJWTCtrl invoked'); $scope.clientCopy = angular.copy($scope.client); $scope.changed = false; $scope.$watch('client', function() { if (!angular.equals($scope.client, $scope.clientCopy)) { $scope.changed = true; } }, true); if ($scope.client.attributes["use.jwks.url"]) { if ($scope.client.attributes["use.jwks.url"] == "true") { $scope.useJwksUrl = true; } else { $scope.useJwksUrl = false; } } $scope.switchChange = function() { $scope.changed = true; } $scope.save = function() { if ($scope.useJwksUrl == true) { $scope.client.attributes["use.jwks.url"] = "true"; } else { $scope.client.attributes["use.jwks.url"] = "false"; } Client.update({ realm : $scope.realm.realm, client : $scope.client.id }, $scope.client, function() { $scope.changed = false; $scope.clientCopy = angular.copy($scope.client); Notifications.success("Client authentication configuration has been saved to the client."); }); }; $scope.importCertificate = function() { $location.url("/realms/" + $scope.realm.realm + "/clients/" + $scope.client.id + "/credentials/client-jwt/Signing/import/jwt.credential"); }; $scope.generateSigningKey = function() { $location.url("/realms/" + $scope.realm.realm + "/clients/" + $scope.client.id + "/credentials/client-jwt/Signing/export/jwt.credential"); }; $scope.reset = function() { $route.reload(); }; }); module.controller('ClientGenericCredentialsCtrl', function($scope, $location, Client, Notifications) { console.log('ClientGenericCredentialsCtrl invoked'); $scope.clientCopy = angular.copy($scope.client); $scope.changed = false; $scope.$watch('client', function() { if (!angular.equals($scope.client, $scope.clientCopy)) { $scope.changed = true; } }, true); $scope.save = function() { Client.update({ realm : $scope.realm.realm, client : $scope.client.id }, $scope.client, function() { $scope.changed = false; $scope.clientCopy = angular.copy($scope.client); Notifications.success("Client authentication configuration has been saved to the client."); }); }; $scope.reset = function() { $scope.client = angular.copy($scope.clientCopy); $scope.changed = false; }; }); module.controller('ClientIdentityProviderCtrl', function($scope, $location, $route, realm, client, Client, $location, Notifications) { $scope.realm = realm; $scope.client = angular.copy(client); var length = 0; if ($scope.client.identityProviders) { length = $scope.client.identityProviders.length; for (i = 0; i < $scope.client.identityProviders.length; i++) { var clientProvider = $scope.client.identityProviders[i]; if (clientProvider.retrieveToken) { clientProvider.retrieveToken = clientProvider.retrieveToken.toString(); } } } else { $scope.client.identityProviders = []; } $scope.identityProviders = []; var providersMissingInClient = []; for (j = 0; j < realm.identityProviders.length; j++) { var identityProvider = realm.identityProviders[j]; var clientProvider = null; for (i = 0; i < $scope.client.identityProviders.length; i++) { clientProvider = $scope.client.identityProviders[i]; if (clientProvider) { if (clientProvider.id == identityProvider.id) { $scope.identityProviders[i] = {}; $scope.identityProviders[i].identityProvider = identityProvider; $scope.identityProviders[i].retrieveToken = clientProvider.retrieveToken; break; } clientProvider = null; } } if (clientProvider == null) { providersMissingInClient.push(identityProvider); } } for (j = 0; j < providersMissingInClient.length; j++) { var identityProvider = providersMissingInClient[j]; var currentProvider = {}; currentProvider.identityProvider = identityProvider; currentProvider.retrieveToken = "false"; $scope.identityProviders.push(currentProvider); var currentClientProvider = {}; currentClientProvider.id = identityProvider.id; currentClientProvider.retrieveToken = "false"; $scope.client.identityProviders.push(currentClientProvider); } var oldCopy = angular.copy($scope.client); $scope.save = function() { Client.update({ realm : realm.realm, client : client.id }, $scope.client, function() { $scope.changed = false; $route.reload(); Notifications.success("Your changes have been saved to the client."); }); }; $scope.reset = function() { $scope.client = angular.copy(oldCopy); $scope.changed = false; }; $scope.$watch('client', function() { if (!angular.equals($scope.client, oldCopy)) { $scope.changed = true; } }, true); }); module.controller('ClientSamlKeyCtrl', function($scope, $location, $http, $upload, realm, client, ClientCertificate, ClientCertificateGenerate, ClientCertificateDownload, Notifications) { $scope.realm = realm; $scope.client = client; var signingKeyInfo = ClientCertificate.get({ realm : realm.realm, client : client.id, attribute: 'saml.signing' }, function() { $scope.signingKeyInfo = signingKeyInfo; } ); $scope.generateSigningKey = function() { var keyInfo = ClientCertificateGenerate.generate({ realm : realm.realm, client : client.id, attribute: 'saml.signing' }, function() { Notifications.success('Signing key has been regenerated.'); $scope.signingKeyInfo = keyInfo; }, function() { Notifications.error("Signing key was not regenerated."); } ); }; $scope.importSigningKey = function() { $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/saml/Signing/import/saml.signing"); }; $scope.exportSigningKey = function() { $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/saml/Signing/export/saml.signing"); }; var encryptionKeyInfo = ClientCertificate.get({ realm : realm.realm, client : client.id, attribute: 'saml.encryption' }, function() { $scope.encryptionKeyInfo = encryptionKeyInfo; } ); $scope.generateEncryptionKey = function() { var keyInfo = ClientCertificateGenerate.generate({ realm : realm.realm, client : client.id, attribute: 'saml.encryption' }, function() { Notifications.success('Encryption key has been regenerated.'); $scope.encryptionKeyInfo = keyInfo; }, function() { Notifications.error("Encryption key was not regenerated."); } ); }; $scope.importEncryptionKey = function() { $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/saml/Encryption/import/saml.encryption"); }; $scope.exportEncryptionKey = function() { $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/saml/Encryption/export/saml.encryption"); }; $scope.$watch(function() { return $location.path(); }, function() { $scope.path = $location.path().substring(1).split("/"); }); }); module.controller('ClientCertificateImportCtrl', function($scope, $location, $http, $upload, realm, client, callingContext, $routeParams, ClientCertificate, ClientCertificateGenerate, ClientCertificateDownload, Notifications) { console.log("callingContext: " + callingContext); var keyType = $routeParams.keyType; var attribute = $routeParams.attribute; $scope.realm = realm; $scope.client = client; $scope.keyType = keyType; if (callingContext == 'saml') { var uploadUrl = authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/certificates/' + attribute + '/upload'; var redirectLocation = "/realms/" + realm.realm + "/clients/" + client.id + "/saml/keys"; } else if (callingContext == 'jwt-credentials') { var uploadUrl = authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/certificates/' + attribute + '/upload-certificate'; var redirectLocation = "/realms/" + realm.realm + "/clients/" + client.id + "/credentials"; } $scope.files = []; $scope.onFileSelect = function($files) { $scope.files = $files; }; $scope.cancel = function() { $location.url(redirectLocation); } $scope.keyFormats = [ "JKS", "PKCS12", "Certificate PEM" ]; if (callingContext == 'jwt-credentials') { $scope.keyFormats.push('Public Key PEM'); $scope.keyFormats.push('JSON Web Key Set'); } $scope.hideKeystoreSettings = function() { return $scope.uploadKeyFormat == 'Certificate PEM' || $scope.uploadKeyFormat == 'Public Key PEM' || $scope.uploadKeyFormat == 'JSON Web Key Set'; } $scope.uploadKeyFormat = $scope.keyFormats[0]; $scope.uploadFile = function() { //$files: an array of files selected, each file has name, size, and type. for (var i = 0; i < $scope.files.length; i++) { var $file = $scope.files[i]; $scope.upload = $upload.upload({ url: uploadUrl, // method: POST or PUT, // headers: {'headerKey': 'headerValue'}, withCredential: true, data: {keystoreFormat: $scope.uploadKeyFormat, keyAlias: $scope.uploadKeyAlias, keyPassword: $scope.uploadKeyPassword, storePassword: $scope.uploadStorePassword }, file: $file /* set file formData name for 'Content-Desposition' header. Default: 'file' */ //fileFormDataName: myFile, /* customize how data is added to formData. See #40#issuecomment-28612000 for example */ //formDataAppender: function(formData, key, val){} }).success(function(data, status, headers) { Notifications.success("Keystore uploaded successfully."); $location.url(redirectLocation); }); //.then(success, error, progress); } }; $scope.$watch(function() { return $location.path(); }, function() { $scope.path = $location.path().substring(1).split("/"); }); }); module.controller('ClientCertificateExportCtrl', function($scope, $location, $http, $upload, realm, client, callingContext, $routeParams, ClientCertificate, ClientCertificateGenerate, ClientCertificateDownload, Notifications) { var keyType = $routeParams.keyType; var attribute = $routeParams.attribute; $scope.realm = realm; $scope.client = client; $scope.keyType = keyType; if (callingContext == 'saml') { var downloadUrl = authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/certificates/' + attribute + '/download'; var realmCertificate = true; } else if (callingContext == 'jwt-credentials') { var downloadUrl = authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/certificates/' + attribute + '/generate-and-download' var realmCertificate = false; } var jks = { keyAlias: client.clientId, realmAlias: realm.realm, realmCertificate: realmCertificate }; $scope.keyFormats = [ "JKS", "PKCS12" ]; var keyInfo = ClientCertificate.get({ realm : realm.realm, client : client.id, attribute: attribute }, function() { $scope.keyInfo = keyInfo; } ); $scope.jks = jks; $scope.jks.format = $scope.keyFormats[0]; $scope.download = function() { $http({ url: downloadUrl, method: 'POST', responseType: 'arraybuffer', data: $scope.jks, headers: { 'Content-Type': 'application/json', 'Accept': 'application/octet-stream' } }).then(function(response){ var blob = new Blob([response.data], { type: 'application/octet-stream' }); var ext = ".jks"; if ($scope.jks.format == 'PKCS12') ext = ".p12"; if (callingContext == 'jwt-credentials') { $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/credentials"); Notifications.success("New keypair and certificate generated successfully. Download keystore file") } saveAs(blob, 'keystore' + ext); }).catch(function(response) { var errorMsg = 'Error downloading'; try { var error = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(response.data))); errorMsg = error['error_description'] ? error['error_description'] : errorMsg; } catch (err) { } Notifications.error(errorMsg); }); } $scope.$watch(function() { return $location.path(); }, function() { $scope.path = $location.path().substring(1).split("/"); }); $scope.cancel = function() { $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/credentials"); } }); module.controller('ClientSessionsCtrl', function($scope, realm, sessionCount, client, ClientUserSessions) { $scope.realm = realm; $scope.count = sessionCount.count; $scope.sessions = []; $scope.client = client; $scope.page = 0; $scope.query = { realm : realm.realm, client: $scope.client.id, max : 5, first : 0 } $scope.firstPage = function() { $scope.query.first = 0; if ($scope.query.first < 0) { $scope.query.first = 0; } $scope.loadUsers(); } $scope.previousPage = function() { $scope.query.first -= parseInt($scope.query.max); if ($scope.query.first < 0) { $scope.query.first = 0; } $scope.loadUsers(); } $scope.nextPage = function() { $scope.query.first += parseInt($scope.query.max); $scope.loadUsers(); } $scope.toDate = function(val) { return new Date(val); }; $scope.loadUsers = function() { ClientUserSessions.query($scope.query, function(updated) { $scope.sessions = updated; }) }; }); module.controller('ClientOfflineSessionsCtrl', function($scope, realm, offlineSessionCount, client, ClientOfflineSessions) { $scope.realm = realm; $scope.count = offlineSessionCount.count; $scope.sessions = []; $scope.client = client; $scope.page = 0; $scope.query = { realm : realm.realm, client: $scope.client.id, max : 5, first : 0 } $scope.firstPage = function() { $scope.query.first = 0; if ($scope.query.first < 0) { $scope.query.first = 0; } $scope.loadUsers(); } $scope.previousPage = function() { $scope.query.first -= parseInt($scope.query.max); if ($scope.query.first < 0) { $scope.query.first = 0; } $scope.loadUsers(); } $scope.nextPage = function() { $scope.query.first += parseInt($scope.query.max); $scope.loadUsers(); } $scope.toDate = function(val) { return new Date(val); }; $scope.loadUsers = function() { ClientOfflineSessions.query($scope.query, function(updated) { $scope.sessions = updated; }) }; }); module.controller('ClientRoleDetailCtrl', function($scope, realm, client, role, roles, clients, Role, ClientRole, RoleById, RoleRealmComposites, RoleClientComposites, $http, $location, Dialog, Notifications) { $scope.realm = realm; $scope.client = client; $scope.role = angular.copy(role); $scope.create = !role.name; $scope.changed = $scope.create; $scope.save = function() { if ($scope.create) { ClientRole.save({ realm: realm.realm, client : client.id }, $scope.role, function (data, headers) { $scope.changed = false; role = angular.copy($scope.role); ClientRole.get({ realm: realm.realm, client : client.id, role: role.name }, function(role) { var id = role.id; $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/roles/" + id); Notifications.success("The role has been created."); }); }); } else { $scope.update(); } }; $scope.remove = function() { Dialog.confirmDelete($scope.role.name, 'role', function() { $scope.role.$remove({ realm : realm.realm, client : client.id, role : $scope.role.id }, function() { $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/roles"); Notifications.success("The role has been deleted."); }); }); }; $scope.cancel = function () { $location.url("/realms/" + realm.realm + "/clients/" + client.id + "/roles"); }; roleControl($scope, realm, role, roles, clients, ClientRole, RoleById, RoleRealmComposites, RoleClientComposites, $http, $location, Notifications, Dialog); }); module.controller('ClientImportCtrl', function($scope, $location, $upload, realm, serverInfo, Notifications) { $scope.realm = realm; $scope.files = []; $scope.onFileSelect = function($files) { $scope.files = $files; }; $scope.clearFileSelect = function() { $scope.files = null; } $scope.uploadFile = function() { //$files: an array of files selected, each file has name, size, and type. for (var i = 0; i < $scope.files.length; i++) { var $file = $scope.files[i]; $scope.upload = $upload.upload({ url: authUrl + '/admin/realms/' + realm.realm + '/client-importers/' + $scope.configFormat.id + '/upload', // method: POST or PUT, // headers: {'headerKey': 'headerValue'}, withCredential: true, data: {myObj: ""}, file: $file /* set file formData name for 'Content-Desposition' header. Default: 'file' */ //fileFormDataName: myFile, /* customize how data is added to formData. See #40#issuecomment-28612000 for example */ //formDataAppender: function(formData, key, val){} }).success(function(data, status, headers) { Notifications.success("Uploaded successfully."); $location.url("/realms/" + realm.realm + "/clients"); }) .error(function() { Notifications.error("The file can not be uploaded. Please verify the file."); }); //.then(success, error, progress); } }; $scope.$watch(function() { return $location.path(); }, function() { $scope.path = $location.path().substring(1).split("/"); }); }); module.controller('ClientListCtrl', function($scope, realm, Client, serverInfo, $route, Dialog, Notifications, filterFilter) { $scope.realm = realm; $scope.clients = []; $scope.currentPage = 1; $scope.currentPageInput = 1; $scope.numberOfPages = 1; $scope.pageSize = 20; Client.query({realm: realm.realm, viewableOnly: true}).$promise.then(function(clients) { $scope.numberOfPages = Math.ceil(clients.length/$scope.pageSize); $scope.clients = clients; }); $scope.$watch('search', function (newVal, oldVal) { $scope.filtered = filterFilter($scope.clients, newVal); $scope.totalItems = $scope.filtered.length; $scope.numberOfPages = Math.ceil($scope.totalItems/$scope.pageSize); $scope.currentPage = 1; $scope.currentPageInput = 1; }, true); $scope.removeClient = function(client) { Dialog.confirmDelete(client.clientId, 'client', function() { Client.remove({ realm : realm.realm, client : client.id }, function() { $route.reload(); Notifications.success("The client has been deleted."); }); }); }; $scope.exportClient = function(client) { var clientCopy = angular.copy(client); delete clientCopy.id; for (var i = 0; i < clientCopy.protocolMappers.length; i++) { delete clientCopy.protocolMappers[i].id; } saveAs(new Blob([angular.toJson(clientCopy, 4)], { type: 'application/json' }), clientCopy.clientId + '.json'); } }); module.controller('ClientInstallationCtrl', function($scope, realm, client, serverInfo, ClientInstallation,$http, $routeParams) { $scope.realm = realm; $scope.client = client; $scope.installation = null; $scope.download = null; $scope.configFormat = null; $scope.filename = null; var protocol = client.protocol; if (!protocol) protocol = 'openid-connect'; $scope.configFormats = serverInfo.clientInstallations[protocol]; console.log('configFormats.length: ' + $scope.configFormats.length); $scope.changeFormat = function() { var url = ClientInstallation.url({ realm: $routeParams.realm, client: $routeParams.client, provider: $scope.configFormat.id }); if ($scope.configFormat.mediaType == 'application/zip') { $http({ url: url, method: 'GET', responseType: 'arraybuffer', cache: false }).then(function(response) { var installation = response.data; $scope.installation = installation; } ); } else { $http.get(url).then(function (response) { var installation = response.data; if ($scope.configFormat.mediaType == 'application/json') { installation = angular.fromJson(response.data); installation = angular.toJson(installation, true); } $scope.installation = installation; }); } }; $scope.download = function() { saveAs(new Blob([$scope.installation], { type: $scope.configFormat.mediaType }), $scope.configFormat.filename); } }); module.controller('ClientDetailCtrl', function($scope, realm, client, templates, $route, serverInfo, Client, ClientDescriptionConverter, $location, $modal, Dialog, Notifications) { $scope.accessTypes = [ "confidential", "public", "bearer-only" ]; $scope.protocols = serverInfo.listProviderIds('login-protocol'); $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", "RSA_SHA512", "DSA_SHA1" ]; $scope.nameIdFormats = [ "username", "email", "transient", "persistent" ]; $scope.xmlKeyNameTranformers = [ "NONE", "KEY_ID", "CERT_SUBJECT" ]; $scope.canonicalization = [ {name: "EXCLUSIVE", value: "http://www.w3.org/2001/10/xml-exc-c14n#" }, {name: "EXCLUSIVE_WITH_COMMENTS", value: "http://www.w3.org/2001/10/xml-exc-c14n#WithComments"}, {name: "INCLUSIVE", value: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315" }, {name: "INCLUSIVE_WITH_COMMENTS", value: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"} ]; $scope.oidcSignatureAlgorithms = [ "unsigned", "RS256" ]; $scope.requestObjectSignatureAlgorithms = [ "any", "none", "RS256" ]; $scope.realm = realm; $scope.samlAuthnStatement = false; $scope.samlOneTimeUseCondition = false; $scope.samlMultiValuedRoles = false; $scope.samlServerSignature = false; $scope.samlServerSignatureEnableKeyInfoExtension = false; $scope.samlAssertionSignature = false; $scope.samlClientSignature = false; $scope.samlEncrypt = false; $scope.samlForcePostBinding = false; $scope.samlForceNameIdFormat = false; $scope.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[1]; $scope.disableAuthorizationTab = !client.authorizationServicesEnabled; $scope.disableServiceAccountRolesTab = !client.serviceAccountsEnabled; $scope.disableCredentialsTab = client.publicClient; function updateProperties() { if (!$scope.client.attributes) { $scope.client.attributes = {}; } $scope.accessType = $scope.accessTypes[0]; if ($scope.client.bearerOnly) { $scope.accessType = $scope.accessTypes[2]; } else if ($scope.client.publicClient) { $scope.accessType = $scope.accessTypes[1]; } if ($scope.client.protocol) { $scope.protocol = $scope.protocols[$scope.protocols.indexOf($scope.client.protocol)]; } else { $scope.protocol = $scope.protocols[0]; } if ($scope.client.attributes['saml.signature.algorithm'] == 'RSA_SHA1') { $scope.signatureAlgorithm = $scope.signatureAlgorithms[0]; } else if ($scope.client.attributes['saml.signature.algorithm'] == 'RSA_SHA256') { $scope.signatureAlgorithm = $scope.signatureAlgorithms[1]; } else if ($scope.client.attributes['saml.signature.algorithm'] == 'RSA_SHA512') { $scope.signatureAlgorithm = $scope.signatureAlgorithms[2]; } else if ($scope.client.attributes['saml.signature.algorithm'] == 'DSA_SHA1') { $scope.signatureAlgorithm = $scope.signatureAlgorithms[3]; } if ($scope.client.attributes['saml_name_id_format'] == 'username') { $scope.nameIdFormat = $scope.nameIdFormats[0]; } else if ($scope.client.attributes['saml_name_id_format'] == 'email') { $scope.nameIdFormat = $scope.nameIdFormats[1]; } else if ($scope.client.attributes['saml_name_id_format'] == 'transient') { $scope.nameIdFormat = $scope.nameIdFormats[2]; } else if ($scope.client.attributes['saml_name_id_format'] == 'persistent') { $scope.nameIdFormat = $scope.nameIdFormats[3]; } if ($scope.client.attributes["saml.server.signature"]) { if ($scope.client.attributes["saml.server.signature"] == "true") { $scope.samlServerSignature = true; } else { $scope.samlServerSignature = false; } } if ($scope.client.attributes["saml.server.signature.keyinfo.ext"]) { if ($scope.client.attributes["saml.server.signature.keyinfo.ext"] == "true") { $scope.samlServerSignatureEnableKeyInfoExtension = true; } else { $scope.samlServerSignatureEnableKeyInfoExtension = false; } } if ($scope.client.attributes['saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer'] === 'NONE') { $scope.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[0]; } else if ($scope.client.attributes['saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer'] === 'KEY_ID') { $scope.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[1]; } else if ($scope.client.attributes['saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer'] === 'CERT_SUBJECT') { $scope.samlXmlKeyNameTranformer = $scope.xmlKeyNameTranformers[2]; } if ($scope.client.attributes["saml.assertion.signature"]) { if ($scope.client.attributes["saml.assertion.signature"] == "true") { $scope.samlAssertionSignature = true; } else { $scope.samlAssertionSignature = false; } } if ($scope.client.attributes["saml.client.signature"]) { if ($scope.client.attributes["saml.client.signature"] == "true") { $scope.samlClientSignature = true; } else { $scope.samlClientSignature = false; } } if ($scope.client.attributes["saml.encrypt"]) { if ($scope.client.attributes["saml.encrypt"] == "true") { $scope.samlEncrypt = true; } else { $scope.samlEncrypt = false; } } if ($scope.client.attributes["saml.authnstatement"]) { if ($scope.client.attributes["saml.authnstatement"] == "true") { $scope.samlAuthnStatement = true; } else { $scope.samlAuthnStatement = false; } } if ($scope.client.attributes["saml.onetimeuse.condition"]) { if ($scope.client.attributes["saml.onetimeuse.condition"] == "true") { $scope.samlOneTimeUseCondition = true; } else { $scope.samlOneTimeUseCondition = false; } } if ($scope.client.attributes["saml_force_name_id_format"]) { if ($scope.client.attributes["saml_force_name_id_format"] == "true") { $scope.samlForceNameIdFormat = true; } else { $scope.samlForceNameIdFormat = false; } } if ($scope.client.attributes["saml.multivalued.roles"]) { if ($scope.client.attributes["saml.multivalued.roles"] == "true") { $scope.samlMultiValuedRoles = true; } else { $scope.samlMultiValuedRoles = false; } } if ($scope.client.attributes["saml.force.post.binding"]) { if ($scope.client.attributes["saml.force.post.binding"] == "true") { $scope.samlForcePostBinding = true; } else { $scope.samlForcePostBinding = false; } } var attrVal1 = $scope.client.attributes['user.info.response.signature.alg']; $scope.userInfoSignedResponseAlg = attrVal1==null ? 'unsigned' : attrVal1; var attrVal2 = $scope.client.attributes['request.object.signature.alg']; $scope.requestObjectSignatureAlg = attrVal2==null ? 'any' : attrVal2; } if (!$scope.create) { $scope.client = client; updateProperties(); $scope.clientEdit = angular.copy(client); } $scope.importFile = function(fileContent){ console.debug(fileContent); ClientDescriptionConverter.save({ realm: realm.realm }, fileContent, function (data) { $scope.client = data; updateProperties(); $scope.importing = true; $scope.clientEdit = angular.copy(client); }); }; $scope.viewImportDetails = function() { $modal.open({ templateUrl: resourceUrl + '/partials/modal/view-object.html', controller: 'ObjectModalCtrl', resolve: { object: function () { return $scope.client; } } }) }; $scope.switchChange = function() { $scope.changed = true; } $scope.changeAccessType = function() { if ($scope.accessType == "confidential") { $scope.clientEdit.bearerOnly = false; $scope.clientEdit.publicClient = false; } else if ($scope.accessType == "public") { $scope.clientEdit.bearerOnly = false; $scope.clientEdit.publicClient = true; } else if ($scope.accessType == "bearer-only") { $scope.clientEdit.bearerOnly = true; $scope.clientEdit.publicClient = false; } }; $scope.changeProtocol = function() { if ($scope.protocol == "openid-connect") { $scope.clientEdit.protocol = "openid-connect"; } else if ($scope.protocol == "saml") { $scope.clientEdit.protocol = "saml"; } }; $scope.changeAlgorithm = function() { $scope.clientEdit.attributes['saml.signature.algorithm'] = $scope.signatureAlgorithm; }; $scope.changeNameIdFormat = function() { $scope.clientEdit.attributes['saml_name_id_format'] = $scope.nameIdFormat; }; $scope.changeSamlSigKeyNameTranformer = function() { $scope.clientEdit.attributes['saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer'] = $scope.samlXmlKeyNameTranformer; }; $scope.changeUserInfoSignedResponseAlg = function() { if ($scope.userInfoSignedResponseAlg === 'unsigned') { $scope.clientEdit.attributes['user.info.response.signature.alg'] = null; } else { $scope.clientEdit.attributes['user.info.response.signature.alg'] = $scope.userInfoSignedResponseAlg; } }; $scope.changeRequestObjectSignatureAlg = function() { if ($scope.requestObjectSignatureAlg === 'any') { $scope.clientEdit.attributes['request.object.signature.alg'] = null; } else { $scope.clientEdit.attributes['request.object.signature.alg'] = $scope.requestObjectSignatureAlg; } }; $scope.$watch(function() { return $location.path(); }, function() { $scope.path = $location.path().substring(1).split("/"); }); function isChanged() { if (!angular.equals($scope.client, $scope.clientEdit)) { return true; } if ($scope.newRedirectUri && $scope.newRedirectUri.length > 0) { return true; } if ($scope.newWebOrigin && $scope.newWebOrigin.length > 0) { return true; } return false; } function configureAuthorizationServices() { if ($scope.clientEdit.authorizationServicesEnabled) { if ($scope.accessType == 'public') { $scope.accessType = 'confidential'; } $scope.clientEdit.publicClient = false; $scope.clientEdit.serviceAccountsEnabled = true; } else if ($scope.clientEdit.bearerOnly) { $scope.clientEdit.serviceAccountsEnabled = false; } if ($scope.client.authorizationServicesEnabled && !$scope.clientEdit.authorizationServicesEnabled) { Dialog.confirm("Disable Authorization Settings", "Are you sure you want to disable authorization ? Once you save your changes, all authorization settings associated with this client will be removed. This operation can not be reverted.", function () { }, function () { $scope.clientEdit.authorizationServicesEnabled = true; }); } } $scope.$watch('clientEdit', function() { $scope.changed = isChanged(); configureAuthorizationServices(); }, true); $scope.$watch('newRedirectUri', function() { $scope.changed = isChanged(); }, true); $scope.$watch('newWebOrigin', function() { $scope.changed = isChanged(); }, true); $scope.deleteWebOrigin = function(index) { $scope.clientEdit.webOrigins.splice(index, 1); } $scope.addWebOrigin = function() { $scope.clientEdit.webOrigins.push($scope.newWebOrigin); $scope.newWebOrigin = ""; } $scope.deleteRedirectUri = function(index) { $scope.clientEdit.redirectUris.splice(index, 1); } $scope.addRedirectUri = function() { $scope.clientEdit.redirectUris.push($scope.newRedirectUri); $scope.newRedirectUri = ""; } $scope.save = function() { if ($scope.newRedirectUri && $scope.newRedirectUri.length > 0) { $scope.addRedirectUri(); } if ($scope.newWebOrigin && $scope.newWebOrigin.length > 0) { $scope.addWebOrigin(); } if ($scope.samlServerSignature == true) { $scope.clientEdit.attributes["saml.server.signature"] = "true"; } else { $scope.clientEdit.attributes["saml.server.signature"] = "false"; } if ($scope.samlServerSignatureEnableKeyInfoExtension == true) { $scope.clientEdit.attributes["saml.server.signature.keyinfo.ext"] = "true"; } else { $scope.clientEdit.attributes["saml.server.signature.keyinfo.ext"] = "false"; } if ($scope.samlAssertionSignature == true) { $scope.clientEdit.attributes["saml.assertion.signature"] = "true"; } else { $scope.clientEdit.attributes["saml.assertion.signature"] = "false"; } if ($scope.samlClientSignature == true) { $scope.clientEdit.attributes["saml.client.signature"] = "true"; } else { $scope.clientEdit.attributes["saml.client.signature"] = "false"; } if ($scope.samlEncrypt == true) { $scope.clientEdit.attributes["saml.encrypt"] = "true"; } else { $scope.clientEdit.attributes["saml.encrypt"] = "false"; } if ($scope.samlAuthnStatement == true) { $scope.clientEdit.attributes["saml.authnstatement"] = "true"; } else { $scope.clientEdit.attributes["saml.authnstatement"] = "false"; } if ($scope.samlOneTimeUseCondition == true) { $scope.clientEdit.attributes["saml.onetimeuse.condition"] = "true"; } else { $scope.clientEdit.attributes["saml.onetimeuse.condition"] = "false"; } if ($scope.samlForceNameIdFormat == true) { $scope.clientEdit.attributes["saml_force_name_id_format"] = "true"; } else { $scope.clientEdit.attributes["saml_force_name_id_format"] = "false"; } if ($scope.samlMultiValuedRoles == true) { $scope.clientEdit.attributes["saml.multivalued.roles"] = "true"; } else { $scope.clientEdit.attributes["saml.multivalued.roles"] = "false"; } if ($scope.samlForcePostBinding == true) { $scope.clientEdit.attributes["saml.force.post.binding"] = "true"; } else { $scope.clientEdit.attributes["saml.force.post.binding"] = "false"; } $scope.clientEdit.protocol = $scope.protocol; $scope.clientEdit.attributes['saml.signature.algorithm'] = $scope.signatureAlgorithm; $scope.clientEdit.attributes['saml_name_id_format'] = $scope.nameIdFormat; if ($scope.clientEdit.protocol != 'saml' && !$scope.clientEdit.bearerOnly && ($scope.clientEdit.standardFlowEnabled || $scope.clientEdit.implicitFlowEnabled) && (!$scope.clientEdit.redirectUris || $scope.clientEdit.redirectUris.length == 0)) { Notifications.error("You must specify at least one redirect uri"); } else { Client.update({ realm : realm.realm, client : client.id }, $scope.clientEdit, function() { $route.reload(); Notifications.success("Your changes have been saved to the client."); }); } }; $scope.reset = function() { $route.reload(); }; $scope.cancel = function() { $location.url("/realms/" + realm.realm + "/clients"); }; }); module.controller('CreateClientCtrl', function($scope, realm, client, templates, $route, serverInfo, Client, ClientDescriptionConverter, $location, $modal, Dialog, Notifications) { $scope.protocols = serverInfo.listProviderIds('login-protocol'); $scope.create = true; $scope.templates = [ {name:'NONE'}]; var templateNameMap = new Object(); for (var i = 0; i < templates.length; i++) { var template = templates[i]; templateNameMap[template.name] = template; $scope.templates.push(template); } $scope.realm = realm; $scope.client = { enabled: true, attributes: {} }; $scope.client.redirectUris = []; $scope.protocol = $scope.protocols[0]; $scope.importFile = function(fileContent){ console.debug(fileContent); ClientDescriptionConverter.save({ realm: realm.realm }, fileContent, function (data) { $scope.client = data; if (data.protocol) { $scope.protocol = data.protocol; } $scope.importing = true; }); }; $scope.viewImportDetails = function() { $modal.open({ templateUrl: resourceUrl + '/partials/modal/view-object.html', controller: 'ObjectModalCtrl', resolve: { object: function () { return $scope.client; } } }) }; $scope.switchChange = function() { $scope.changed = true; } $scope.changeTemplate = function() { if ($scope.client.clientTemplate == 'NONE') { $scope.protocol = 'openid-connect'; $scope.client.protocol = 'openid-connect'; $scope.client.clientTemplate = null; } else { var template = templateNameMap[$scope.client.clientTemplate]; $scope.protocol = template.protocol; $scope.client.protocol = template.protocol; } } $scope.changeProtocol = function() { if ($scope.protocol == "openid-connect") { $scope.client.protocol = "openid-connect"; } else if ($scope.protocol == "saml") { $scope.client.protocol = "saml"; } }; $scope.$watch(function() { return $location.path(); }, function() { $scope.path = $location.path().substring(1).split("/"); }); function isChanged() { if (!angular.equals($scope.client, client)) { return true; } return false; } $scope.$watch('client', function() { $scope.changed = isChanged(); }, true); $scope.save = function() { $scope.client.protocol = $scope.protocol; Client.save({ realm: realm.realm, client: '' }, $scope.client, function (data, headers) { $scope.changed = false; var l = headers().location; var id = l.substring(l.lastIndexOf("/") + 1); $location.url("/realms/" + realm.realm + "/clients/" + id); Notifications.success("The client has been created."); }); }; $scope.reset = function() { $route.reload(); }; $scope.cancel = function() { $location.url("/realms/" + realm.realm + "/clients"); }; }); module.controller('ClientScopeMappingCtrl', function($scope, $http, realm, client, clients, templates, Notifications, Client, ClientTemplate, ClientRealmScopeMapping, ClientClientScopeMapping, ClientRole, ClientAvailableRealmScopeMapping, ClientAvailableClientScopeMapping, ClientCompositeRealmScopeMapping, ClientCompositeClientScopeMapping) { $scope.realm = realm; $scope.client = angular.copy(client); $scope.selectedRealmRoles = []; $scope.selectedRealmMappings = []; $scope.realmMappings = []; $scope.clients = clients; $scope.clientRoles = []; $scope.clientComposite = []; $scope.selectedClientRoles = []; $scope.selectedClientMappings = []; $scope.clientMappings = []; $scope.dummymodel = []; if (client.clientTemplate) { for (var i = 0; i < templates.length; i++) { if (templates[i].name == client.clientTemplate) { ClientTemplate.get({realm: realm.realm, template: templates[i].id}, function(data) { $scope.template = data; }); break; } } } $scope.hideRoleSelector = function() { return ($scope.client.useTemplateScope && $scope.template && template.fullScopeAllowed) || (!$scope.template && $scope.client.fullScopeAllowed); } $scope.changeFlag = function() { console.log('changeFlag'); Client.update({ realm : realm.realm, client : client.id }, $scope.client, function() { $scope.changed = false; client = angular.copy($scope.client); updateRealmRoles(); Notifications.success("Scope mappings updated."); }); } function updateRealmRoles() { $scope.realmRoles = ClientAvailableRealmScopeMapping.query({realm : realm.realm, client : client.id}); $scope.realmMappings = ClientRealmScopeMapping.query({realm : realm.realm, client : client.id}); $scope.realmComposite = ClientCompositeRealmScopeMapping.query({realm : realm.realm, client : client.id}); } function updateClientRoles() { if ($scope.targetClient) { $scope.clientRoles = ClientAvailableClientScopeMapping.query({realm : realm.realm, client : client.id, targetClient : $scope.targetClient.id}); $scope.clientMappings = ClientClientScopeMapping.query({realm : realm.realm, client : client.id, targetClient : $scope.targetClient.id}); $scope.clientComposite = ClientCompositeClientScopeMapping.query({realm : realm.realm, client : client.id, targetClient : $scope.targetClient.id}); } else { $scope.clientRoles = null; $scope.clientMappings = null; $scope.clientComposite = null; } } $scope.changeClient = function() { updateClientRoles(); }; $scope.addRealmRole = function() { var roles = $scope.selectedRealmRoles; $scope.selectedRealmRoles = []; $http.post(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/scope-mappings/realm', roles).then(function() { updateRealmRoles(); Notifications.success("Scope mappings updated."); }); }; $scope.deleteRealmRole = function() { var roles = $scope.selectedRealmMappings; $scope.selectedRealmMappings = []; $http.delete(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/scope-mappings/realm', {data : roles, headers : {"content-type" : "application/json"}}).then(function () { updateRealmRoles(); Notifications.success("Scope mappings updated."); }); }; $scope.addClientRole = function() { var roles = $scope.selectedClientRoles; $scope.selectedClientRoles = []; $http.post(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/scope-mappings/clients/' + $scope.targetClient.id, roles).then(function () { updateClientRoles(); Notifications.success("Scope mappings updated."); }); }; $scope.deleteClientRole = function() { var roles = $scope.selectedClientMappings; $scope.selectedClientMappings = []; $http.delete(authUrl + '/admin/realms/' + realm.realm + '/clients/' + client.id + '/scope-mappings/clients/' + $scope.targetClient.id, {data : roles, headers : {"content-type" : "application/json"}}).then(function () { updateClientRoles(); Notifications.success("Scope mappings updated."); }); }; updateRealmRoles(); }); module.controller('ClientRevocationCtrl', function($scope, realm, client, Client, ClientPushRevocation, $location, Dialog, Notifications) { $scope.realm = realm; $scope.client = client; var setNotBefore = function() { if ($scope.client.notBefore == 0) { $scope.notBefore = "None"; } else { $scope.notBefore = new Date($scope.client.notBefore * 1000); } }; setNotBefore(); var refresh = function() { Client.get({ realm : realm.realm, client: $scope.client.id }, function(updated) { $scope.client = updated; setNotBefore(); }) }; $scope.clear = function() { $scope.client.notBefore = 0; Client.update({ realm : realm.realm, client: client.id}, $scope.client, function () { $scope.notBefore = "None"; Notifications.success('Not Before cleared for client.'); refresh(); }); } $scope.setNotBeforeNow = function() { $scope.client.notBefore = new Date().getTime()/1000; Client.update({ realm : realm.realm, client: $scope.client.id}, $scope.client, function () { Notifications.success('Not Before set for client.'); refresh(); }); } $scope.pushRevocation = function() { ClientPushRevocation.save({realm : realm.realm, client: $scope.client.id}, function (globalReqResult) { var successCount = globalReqResult.successRequests ? globalReqResult.successRequests.length : 0; var failedCount = globalReqResult.failedRequests ? globalReqResult.failedRequests.length : 0; if (successCount==0 && failedCount==0) { Notifications.warn('No push sent. No admin URI configured or no registered cluster nodes available'); } else if (failedCount > 0) { var msgStart = successCount>0 ? 'Successfully push notBefore to: ' + globalReqResult.successRequests + ' . ' : ''; Notifications.error(msgStart + 'Failed to push notBefore to: ' + globalReqResult.failedRequests + '. Verify availability of failed hosts and try again'); } else { Notifications.success('Successfully push notBefore to: ' + globalReqResult.successRequests); } }); } }); module.controller('ClientClusteringCtrl', function($scope, client, Client, ClientTestNodesAvailable, ClientClusterNode, realm, $location, $route, Dialog, Notifications, TimeUnit) { $scope.client = client; $scope.realm = realm; var oldCopy = angular.copy($scope.client); $scope.changed = false; $scope.$watch('client', function() { if (!angular.equals($scope.client, oldCopy)) { $scope.changed = true; } }, true); $scope.client.nodeReRegistrationTimeoutUnit = TimeUnit.autoUnit(client.nodeReRegistrationTimeout); $scope.client.nodeReRegistrationTimeout = TimeUnit.toUnit(client.nodeReRegistrationTimeout, $scope.client.nodeReRegistrationTimeoutUnit); $scope.save = function() { var clientCopy = angular.copy($scope.client); delete clientCopy['nodeReRegistrationTimeoutUnit']; clientCopy.nodeReRegistrationTimeout = TimeUnit.toSeconds($scope.client.nodeReRegistrationTimeout, $scope.client.nodeReRegistrationTimeoutUnit) Client.update({ realm : realm.realm, client : client.id }, clientCopy, function () { $route.reload(); Notifications.success('Your changes have been saved to the client.'); }); }; $scope.reset = function() { $route.reload(); }; $scope.testNodesAvailable = function() { ClientTestNodesAvailable.get({ realm : realm.realm, client : client.id }, function(globalReqResult) { $route.reload(); var successCount = globalReqResult.successRequests ? globalReqResult.successRequests.length : 0; var failedCount = globalReqResult.failedRequests ? globalReqResult.failedRequests.length : 0; if (successCount==0 && failedCount==0) { Notifications.warn('No requests sent. No admin URI configured or no registered cluster nodes available'); } else if (failedCount > 0) { var msgStart = successCount>0 ? 'Successfully verify availability for ' + globalReqResult.successRequests + ' . ' : ''; Notifications.error(msgStart + 'Failed to verify availability for: ' + globalReqResult.failedRequests + '. Fix or unregister failed cluster nodes and try again'); } else { Notifications.success('Successfully sent requests to: ' + globalReqResult.successRequests); } }); }; if (client.registeredNodes) { var nodeRegistrations = []; for (node in client.registeredNodes) { reg = { host: node, lastRegistration: new Date(client.registeredNodes[node] * 1000) } nodeRegistrations.push(reg); } $scope.nodeRegistrations = nodeRegistrations; }; $scope.removeNode = function(node) { Dialog.confirmDelete(node.host, 'node', function() { ClientClusterNode.remove({ realm : realm.realm, client : client.id , node: node.host }, function() { Notifications.success('Node ' + node.host + ' unregistered successfully.'); $route.reload(); }); }); }; }); module.controller('ClientClusteringNodeCtrl', function($scope, client, Client, ClientClusterNode, realm, $location, $routeParams, Notifications, Dialog) { $scope.client = client; $scope.realm = realm; $scope.create = !$routeParams.node; $scope.save = function() { ClientClusterNode.save({ realm : realm.realm, client : client.id , node: $scope.node.host }, function() { Notifications.success('Node ' + $scope.node.host + ' registered successfully.'); $location.url('/realms/' + realm.realm + '/clients/' + client.id + '/clustering'); }); } $scope.unregisterNode = function() { Dialog.confirmDelete($scope.node.host, 'node', function() { ClientClusterNode.remove({ realm : realm.realm, client : client.id , node: $scope.node.host }, function() { Notifications.success('Node ' + $scope.node.host + ' unregistered successfully.'); $location.url('/realms/' + realm.realm + '/clients/' + client.id + '/clustering'); }); }); } if ($scope.create) { $scope.node = {} $scope.registered = false; } else { var lastRegTime = client.registeredNodes[$routeParams.node]; if (lastRegTime) { $scope.registered = true; $scope.node = { host: $routeParams.node, lastRegistration: new Date(lastRegTime * 1000) } } else { $scope.registered = false; $scope.node = { host: $routeParams.node } } } }); module.controller('AddBuiltinProtocolMapperCtrl', function($scope, realm, client, serverInfo, ClientProtocolMappersByProtocol, $http, $location, Dialog, Notifications) { $scope.realm = realm; $scope.client = client; if (client.protocol == null) { client.protocol = 'openid-connect'; } var protocolMappers = serverInfo.protocolMapperTypes[client.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 = ClientProtocolMappersByProtocol.query({realm : realm.realm, client : client.id, protocol : client.protocol}, function() { var builtinMappers = serverInfo.builtinProtocolMappers[client.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 + '/clients/' + client.id + '/protocol-mappers/add-models', toAdd).then(function() { Notifications.success("Mappers added"); $location.url('/realms/' + realm.realm + '/clients/' + client.id + '/mappers'); }).catch(function() { Notifications.error("Error adding mappers"); $location.url('/realms/' + realm.realm + '/clients/' + client.id + '/mappers'); }); }; }); module.controller('ClientProtocolMapperListCtrl', function($scope, realm, client, templates, serverInfo, Client, ClientProtocolMappersByProtocol, ClientProtocolMapper, $route, Dialog, Notifications) { $scope.realm = realm; $scope.client = client; if (client.protocol == null) { client.protocol = 'openid-connect'; } if (client.clientTemplate) { for (var i = 0; i < templates.length; i++) { if (client.clientTemplate == templates[i].name) { $scope.template = templates[i]; break; } } } $scope.changeFlag = function() { Client.update({ realm : realm.realm, client : client.id }, $scope.client, function() { $scope.changed = false; client = angular.copy($scope.client); Notifications.success("Client updated."); }); } var protocolMappers = serverInfo.protocolMapperTypes[client.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() { ClientProtocolMapper.remove({ realm: realm.realm, client: client.id, id : mapper.id }, function() { Notifications.success("The mapper has been deleted."); $route.reload(); }); }); }; var updateMappers = function() { $scope.mappers = ClientProtocolMappersByProtocol.query({realm : realm.realm, client : client.id, protocol : client.protocol}); }; updateMappers(); }); module.controller('ClientProtocolMapperCtrl', function($scope, realm, serverInfo, client, clients, mapper, ClientProtocolMapper, Notifications, Dialog, $location) { $scope.realm = realm; $scope.clients = clients; /* $scope.client = client; $scope.create = false; $scope.protocol = client.protocol; $scope.mapper = angular.copy(mapper); $scope.changed = false; */ 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.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() { ClientProtocolMapper.update({ realm : realm.realm, client: client.id, id : $scope.model.mapper.id }, $scope.model.mapper, function() { $scope.model.changed = false; mapper = angular.copy($scope.mapper); $location.url("/realms/" + realm.realm + '/clients/' + client.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.model.mapper.name, 'mapper', 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"); }); }); }; }); module.controller('ClientProtocolMapperCreateCtrl', function($scope, realm, serverInfo, client, clients, ClientProtocolMapper, Notifications, Dialog, $location) { $scope.realm = realm; $scope.clients = clients; if (client.protocol == null) { client.protocol = 'openid-connect'; } var protocol = client.protocol; /* $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] }; // apply default configurations on change for selected protocolmapper type. $scope.$watch('model.mapperType', function() { var currentMapperType = $scope.model.mapperType; var defaultConfig = {}; if (currentMapperType && Array.isArray(currentMapperType.properties)) { for (var i = 0; i < currentMapperType.properties.length; i++) { var property = currentMapperType.properties[i]; if (property && property.name && property.defaultValue) { defaultConfig[property.name] = property.defaultValue; } } } $scope.model.mapper.config = defaultConfig; }, true); $scope.model.mapperType = $scope.model.mapperTypes[0]; $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; ClientProtocolMapper.save({ realm : realm.realm, client: client.id }, $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); Notifications.success("Mapper has been created."); }); }; $scope.cancel = function() { //$location.url("/realms"); window.history.back(); }; }); 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, $location) { $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 = serverInfo.listProviderIds('login-protocol'); $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, clients, ClientTemplateProtocolMapper, Notifications, Dialog, $location, $route) { $scope.realm = realm; $scope.clients = clients; 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() { $route.reload(); 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.model.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, clients, ClientTemplateProtocolMapper, Notifications, Dialog, $location) { $scope.realm = realm; $scope.clients = clients; 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.model.mapperType = $scope.model.mapperTypes[0]; $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).then(function() { Notifications.success("Mappers added"); $location.url('/realms/' + realm.realm + '/client-templates/' + template.id + '/mappers'); }).catch(function() { Notifications.error("Error adding mappers"); $location.url('/realms/' + realm.realm + '/client-templates/' + template.id + '/mappers'); }); }; }); module.controller('ClientTemplateScopeMappingCtrl', function($scope, $http, realm, template, clients, Notifications, ClientTemplate, ClientTemplateRealmScopeMapping, ClientTemplateClientScopeMapping, ClientRole, ClientTemplateAvailableRealmScopeMapping, ClientTemplateAvailableClientScopeMapping, ClientTemplateCompositeRealmScopeMapping, ClientTemplateCompositeClientScopeMapping) { $scope.realm = realm; $scope.template = angular.copy(template); $scope.selectedRealmRoles = []; $scope.selectedRealmMappings = []; $scope.realmMappings = []; $scope.clients = clients; $scope.clientRoles = []; $scope.clientComposite = []; $scope.selectedClientRoles = []; $scope.selectedClientMappings = []; $scope.clientMappings = []; $scope.dummymodel = []; $scope.changeFullScopeAllowed = function() { ClientTemplate.update({ realm : realm.realm, template : template.id }, $scope.template, function() { $scope.changed = false; template = angular.copy($scope.template); updateTemplateRealmRoles(); Notifications.success("Scope mappings updated."); }); } function updateTemplateRealmRoles() { $scope.realmRoles = ClientTemplateAvailableRealmScopeMapping.query({realm : realm.realm, template : template.id}); $scope.realmMappings = ClientTemplateRealmScopeMapping.query({realm : realm.realm, template : template.id}); $scope.realmComposite = ClientTemplateCompositeRealmScopeMapping.query({realm : realm.realm, template : template.id}); } function updateTemplateClientRoles() { if ($scope.targetClient) { $scope.clientRoles = ClientTemplateAvailableClientScopeMapping.query({realm : realm.realm, template : template.id, targetClient : $scope.targetClient.id}); $scope.clientMappings = ClientTemplateClientScopeMapping.query({realm : realm.realm, template : template.id, targetClient : $scope.targetClient.id}); $scope.clientComposite = ClientTemplateCompositeClientScopeMapping.query({realm : realm.realm, template : template.id, targetClient : $scope.targetClient.id}); } else { $scope.clientRoles = null; $scope.clientMappings = null; $scope.clientComposite = null; } } $scope.changeClient = function() { updateTemplateClientRoles(); }; $scope.addRealmRole = function() { var roles = $scope.selectedRealmRoles; $scope.selectedRealmRoles = []; $http.post(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/scope-mappings/realm', roles).then(function() { updateTemplateRealmRoles(); Notifications.success("Scope mappings updated."); }); }; $scope.deleteRealmRole = function() { var roles = $scope.selectedRealmMappings; $scope.selectedRealmMappings = []; $http.delete(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/scope-mappings/realm', {data : roles, headers : {"content-type" : "application/json"}}).then(function () { updateTemplateRealmRoles(); Notifications.success("Scope mappings updated."); }); }; $scope.addClientRole = function() { var roles = $scope.selectedClientRoles; $scope.selectedClientRoles = []; $http.post(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/scope-mappings/clients/' + $scope.targetClient.id, roles).then(function () { updateTemplateClientRoles(); Notifications.success("Scope mappings updated."); }); }; $scope.deleteClientRole = function() { var roles = $scope.selectedClientMappings; $scope.selectedClientMappings = []; $http.delete(authUrl + '/admin/realms/' + realm.realm + '/client-templates/' + template.id + '/scope-mappings/clients/' + $scope.targetClient.id, {data : roles, headers : {"content-type" : "application/json"}}).then(function () { updateTemplateClientRoles(); Notifications.success("Scope mappings updated."); }); }; updateTemplateRealmRoles(); });