From 44990a14a843b1eac4c0dfca228559c9e86c256b Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 17 Mar 2018 12:13:11 +0100 Subject: [PATCH] Make user admin retrieval more robust --- .../argeo/cms/auth/UserAdminLoginModule.java | 4 +-- .../argeo/cms/internal/kernel/Activator.java | 31 +++++++++++++++++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java index 683d13b21..de2d8bf75 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java @@ -75,7 +75,7 @@ public class UserAdminLoginModule implements LoginModule { @Override public boolean login() throws LoginException { - UserAdmin userAdmin = bc.getService(bc.getServiceReference(UserAdmin.class)); + UserAdmin userAdmin = Activator.getUserAdmin(); final String username; final char[] password; X509Certificate[] certificateChain = null; @@ -170,7 +170,7 @@ public class UserAdminLoginModule implements LoginModule { if (singleUser) { OsUserUtils.loginAsSystemUser(subject); } - UserAdmin userAdmin = bc.getService(bc.getServiceReference(UserAdmin.class)); + UserAdmin userAdmin = Activator.getUserAdmin(); Authorization authorization; if (callbackHandler == null) {// anonymous authorization = userAdmin.getAuthorization(null); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java index 5ba7c01e8..01e842caa 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java @@ -26,6 +26,7 @@ import org.osgi.framework.Constants; import org.osgi.framework.ServiceReference; import org.osgi.service.log.LogReaderService; import org.osgi.service.useradmin.UserAdmin; +import org.osgi.util.tracker.ServiceTracker; /** * Activates the kernel. Gives access to kernel information for the rest of the @@ -37,6 +38,7 @@ public class Activator implements BundleActivator { private static Activator instance; private BundleContext bc; + private LogReaderService logReaderService; private NodeLogger logger; @@ -44,6 +46,8 @@ public class Activator implements BundleActivator { private CmsDeployment nodeDeployment; private CmsInstance nodeInstance; + private ServiceTracker userAdminSt; + @Override public void start(BundleContext bundleContext) throws Exception { Runtime.getRuntime().addShutdownHook(new CmsShutdown()); @@ -55,6 +59,9 @@ public class Activator implements BundleActivator { initSecurity(); initArgeoLogger(); initNode(); + + userAdminSt = new ServiceTracker<>(instance.bc, UserAdmin.class, null); + userAdminSt.open(); log.debug("Kernel bundle started"); } catch (Throwable e) { log.error("## FATAL: CMS activator failed", e); @@ -127,6 +134,9 @@ public class Activator implements BundleActivator { if (nodeState != null) nodeState.shutdown(); + if (userAdminSt != null) + userAdminSt.close(); + instance = null; this.bc = null; this.logReaderService = null; @@ -155,10 +165,25 @@ public class Activator implements BundleActivator { return getNodeUserAdmin().isSingleUser(); } + public static UserAdmin getUserAdmin() { + return (UserAdmin) getNodeUserAdmin(); + } + private static NodeUserAdmin getNodeUserAdmin() { - ServiceReference sr = instance.bc.getServiceReference(UserAdmin.class); - NodeUserAdmin userAdmin = (NodeUserAdmin) instance.bc.getService(sr); - return userAdmin; + NodeUserAdmin res; + try { + res = instance.userAdminSt.waitForService(60000); + } catch (InterruptedException e) { + throw new CmsException("Cannot retrieve Node user admin", e); + } + if (res == null) + throw new CmsException("No Node user admin found"); + + return res; + // ServiceReference sr = + // instance.bc.getServiceReference(UserAdmin.class); + // NodeUserAdmin userAdmin = (NodeUserAdmin) instance.bc.getService(sr); + // return userAdmin; } -- 2.30.2