keycloak-uncached
Changes
examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java 22(+5 -17)
forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js 60(+48 -12)
forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html 30(+30 -0)
Details
diff --git a/examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java b/examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java
index b0d9925..d79a13b 100755
--- a/examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java
+++ b/examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java
@@ -101,24 +101,7 @@ public abstract class BasePropertiesFederationFactory implements UserFederationP
RealmModel realm = session.realms().getRealm(realmId);
BasePropertiesFederationProvider federationProvider = (BasePropertiesFederationProvider)getInstance(session, model);
Set<String> allUsernames = federationProvider.getProperties().stringPropertyNames();
- for (String username : allUsernames) {
- federationProvider.getUserByUsername(realm, username);
- }
- }
-
- });
- }
-
- @Override
- public void syncChangedUsers(KeycloakSessionFactory sessionFactory, final String realmId, final UserFederationProviderModel model, Date lastSync) {
- KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
-
- @Override
- public void run(KeycloakSession session) {
- RealmModel realm = session.realms().getRealm(realmId);
UserProvider localProvider = session.userStorage();
- BasePropertiesFederationProvider federationProvider = (BasePropertiesFederationProvider)getInstance(session, model);
- Set<String> allUsernames = federationProvider.getProperties().stringPropertyNames();
for (String username : allUsernames) {
UserModel localUser = localProvider.getUserByUsername(username, realm);
@@ -131,4 +114,9 @@ public abstract class BasePropertiesFederationFactory implements UserFederationP
});
}
+
+ @Override
+ public void syncChangedUsers(KeycloakSessionFactory sessionFactory, final String realmId, final UserFederationProviderModel model, Date lastSync) {
+ syncAllUsers(sessionFactory, realmId, model);
+ }
}
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js
index d5f2e2c..46674ec 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js
@@ -359,22 +359,47 @@ module.controller('UserFederationCtrl', function($scope, $location, realm, UserF
module.controller('GenericUserFederationCtrl', function($scope, $location, Notifications, Dialog, realm, instance, providerFactory, UserFederationInstances) {
console.log('GenericUserFederationCtrl');
- $scope.instance = angular.copy(instance);
$scope.create = !instance.providerName;
$scope.providerFactory = providerFactory;
console.log("providerFactory: " + providerFactory.id);
- if ($scope.create) {
- $scope.instance.providerName = providerFactory.id;
- $scope.instance.config = {};
- $scope.instance.priority = 0;
+ function initFederationSettings() {
+ if ($scope.create) {
+ instance.providerName = providerFactory.id;
+ instance.config = {};
+ instance.priority = 0;
+ $scope.fullSyncEnabled = false;
+ $scope.changedSyncEnabled = false;
+ } else {
+ $scope.fullSyncEnabled = (instance.fullSyncPeriod && instance.fullSyncPeriod > 0);
+ $scope.changedSyncEnabled = (instance.changedSyncPeriod && instance.changedSyncPeriod > 0);
+ }
+
+ $scope.changed = false;
}
+ initFederationSettings();
+ $scope.instance = angular.copy(instance);
$scope.realm = realm;
+ $scope.$watch('fullSyncEnabled', function(newVal, oldVal) {
+ if (oldVal == newVal) {
+ return;
+ }
+
+ $scope.instance.fullSyncPeriod = $scope.fullSyncEnabled ? 604800 : -1;
+ $scope.changed = true;
+ });
+
+ $scope.$watch('changedSyncEnabled', function(newVal, oldVal) {
+ if (oldVal == newVal) {
+ return;
+ }
- $scope.changed = false;
+ $scope.instance.changedSyncPeriod = $scope.changedSyncEnabled ? 86400 : -1;
+ $scope.changed = true;
+ });
$scope.$watch('instance', function() {
if (!angular.equals($scope.instance, instance)) {
@@ -405,13 +430,8 @@ module.controller('GenericUserFederationCtrl', function($scope, $location, Notif
};
$scope.reset = function() {
+ initFederationSettings();
$scope.instance = angular.copy(instance);
- if ($scope.create) {
- $scope.instance.providerName = providerFactory.id;
- $scope.instance.config = {};
- $scope.instance.priority = 0;
- }
- $scope.changed = false;
};
$scope.cancel = function() {
@@ -430,7 +450,23 @@ module.controller('GenericUserFederationCtrl', function($scope, $location, Notif
});
};
+ $scope.triggerFullSync = function() {
+ console.log('GenericCtrl: triggerFullSync');
+ triggerSync('triggerFullSync');
+ }
+
+ $scope.triggerChangedUsersSync = function() {
+ console.log('GenericCtrl: triggerChangedUsersSync');
+ triggerSync('triggerChangedUsersSync');
+ }
+ function triggerSync(action) {
+ UserFederationSync.get({ action: action, realm: $scope.realm.realm, provider: $scope.instance.id }, function() {
+ Notifications.success("Sync of users finished successfully");
+ }, function() {
+ Notifications.error("Error during sync of users");
+ });
+ }
});
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html
index b046180..7dcae0f 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html
@@ -40,6 +40,34 @@
</fieldset>
+ <fieldset>
+ <legend><span class="text">Sync settings</span></legend>
+ <div class="form-group clearfix">
+ <label class="col-sm-2 control-label" for="fullSyncEnabled">Periodic full sync</label>
+ <div class="col-sm-4">
+ <input ng-model="fullSyncEnabled" name="fullSyncEnabled" id="fullSyncEnabled" onoffswitch />
+ </div>
+ </div>
+ <div class="form-group clearfix" data-ng-show="fullSyncEnabled">
+ <label class="col-sm-2 control-label" for="fullSyncPeriod">Full sync period</label>
+ <div class="col-sm-4">
+ <input class="form-control" type="number" ng-model="instance.fullSyncPeriod" id="fullSyncPeriod" />
+ </div>
+ </div>
+ <div class="form-group clearfix">
+ <label class="col-sm-2 control-label" for="changedSyncEnabled">Periodic changed users sync</label>
+ <div class="col-sm-4">
+ <input ng-model="changedSyncEnabled" name="changedSyncEnabled" id="changedSyncEnabled" onoffswitch />
+ </div>
+ </div>
+ <div class="form-group clearfix" data-ng-show="changedSyncEnabled">
+ <label class="col-sm-2 control-label" for="changedSyncPeriod">Changed users sync period</label>
+ <div class="col-sm-4">
+ <input class="form-control" type="number" ng-model="instance.changedSyncPeriod" id="changedSyncPeriod" />
+ </div>
+ </div>
+ </fieldset>
+
<div class="pull-right form-actions" data-ng-show="create && access.manageUsers">
<button kc-cancel data-ng-click="cancel()">Cancel</button>
<button kc-save data-ng-show="changed">Save</button>
@@ -49,6 +77,8 @@
<button kc-reset data-ng-show="changed">Clear changes</button>
<button kc-save data-ng-show="changed">Save</button>
<button kc-delete data-ng-click="remove()" data-ng-hide="changed">Delete</button>
+ <button kc-delete data-ng-click="triggerFullSync()" data-ng-hide="changed">Synchronize all users</button>
+ <button kc-delete data-ng-click="triggerChangedUsersSync()" data-ng-hide="changed">Synchronize changed users</button>
</div>
</form>
</div>
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-ldap.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-ldap.html
index 49fb638..da1e04c 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-ldap.html
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-ldap.html
@@ -176,8 +176,8 @@
<button kc-reset data-ng-show="changed">Clear changes</button>
<button kc-save data-ng-show="changed">Save</button>
<button kc-delete data-ng-click="remove()" data-ng-hide="changed">Delete</button>
- <button kc-delete data-ng-click="triggerFullSync()" data-ng-hide="changed">Trigger full sync</button>
- <button kc-delete data-ng-click="triggerChangedUsersSync()" data-ng-hide="changed">Trigger sync of changed users</button>
+ <button kc-delete data-ng-click="triggerFullSync()" data-ng-hide="changed">Synchronize all users</button>
+ <button kc-delete data-ng-click="triggerChangedUsersSync()" data-ng-hide="changed">Synchronize changed users</button>
</div>
</form>
</div>
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
index 1669123..554ed7d 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
@@ -211,7 +211,7 @@ public class UserFederationResource {
@GET
@Path("sync/{id}")
@NoCache
- public Response getUserFederationInstances(@PathParam("id") String providerId, @QueryParam("action") String action) {
+ public Response syncUsers(@PathParam("id") String providerId, @QueryParam("action") String action) {
logger.info("triggerSync");
auth.requireManage();