X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FKernelUtils.java;h=f267933cf5910de37b95213d30bab126c34cf8bd;hb=b71546ddc74d6ca49d252806aafd491c75dfe1fb;hp=1d15e2a3ae041911c95f963e69042c6833877416;hpb=ff5b1923caaa5882690e842d6ce96a27ea0f30e8;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java index 1d15e2a3a..f267933cf 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java @@ -2,27 +2,39 @@ package org.argeo.cms.internal.kernel; import java.io.File; import java.io.IOException; +import java.io.PrintStream; import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.URIParameter; import java.util.Dictionary; -import java.util.Enumeration; import java.util.Hashtable; import java.util.Properties; +import java.util.TreeMap; +import java.util.TreeSet; -import javax.security.auth.Subject; -import javax.security.auth.login.LoginContext; -import javax.security.auth.login.LoginException; -import javax.servlet.http.HttpServletRequest; - -import org.apache.commons.logging.Log; -import org.argeo.cms.CmsException; -import org.argeo.cms.auth.AuthConstants; +import org.argeo.api.cms.CmsLog; +import org.argeo.cms.osgi.DataModelNamespace; import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; +import org.osgi.util.tracker.ServiceTracker; /** Package utilities */ class KernelUtils implements KernelConstants { - private final static String OSGI_INSTANCE_AREA = "osgi.instance.area"; - private final static String OSGI_CONFIGURATION_AREA = "osgi.configuration.area"; + final static String OSGI_INSTANCE_AREA = "osgi.instance.area"; + final static String OSGI_CONFIGURATION_AREA = "osgi.configuration.area"; + + static void setJaasConfiguration(URL jaasConfigurationUrl) { + try { + URIParameter uriParameter = new URIParameter(jaasConfigurationUrl.toURI()); + javax.security.auth.login.Configuration jaasConfiguration = javax.security.auth.login.Configuration + .getInstance("JavaLoginConfig", uriParameter); + javax.security.auth.login.Configuration.setConfiguration(jaasConfiguration); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot set configuration " + jaasConfigurationUrl, e); + } + } static Dictionary asDictionary(Properties props) { Hashtable hashtable = new Hashtable(); @@ -37,8 +49,7 @@ class KernelUtils implements KernelConstants { try { props.load(cl.getResourceAsStream(resource)); } catch (IOException e) { - throw new CmsException("Cannot load " + resource - + " from classpath", e); + throw new IllegalArgumentException("Cannot load " + resource + " from classpath", e); } return asDictionary(props); } @@ -50,42 +61,43 @@ class KernelUtils implements KernelConstants { try { return new File(executionDir, relativePath).getCanonicalFile(); } catch (IOException e) { - throw new CmsException("Cannot get canonical file", e); + throw new IllegalArgumentException("Cannot get canonical file", e); } } static File getOsgiInstanceDir() { - return new File(Activator.getBundleContext() - .getProperty(OSGI_INSTANCE_AREA).substring("file:".length())) + return new File(getBundleContext().getProperty(OSGI_INSTANCE_AREA).substring("file:".length())) .getAbsoluteFile(); } - static String getOsgiInstancePath(String relativePath) { - try { - if (relativePath == null) - return getOsgiInstanceDir().getCanonicalPath(); - else - return new File(getOsgiInstanceDir(), relativePath) - .getCanonicalPath(); - } catch (IOException e) { - throw new CmsException("Cannot get instance path for " - + relativePath, e); - } + static Path getOsgiInstancePath(String relativePath) { + return Paths.get(getOsgiInstanceUri(relativePath)); + } + + static URI getOsgiInstanceUri(String relativePath) { + String osgiInstanceBaseUri = getFrameworkProp(OSGI_INSTANCE_AREA); + if (osgiInstanceBaseUri != null) + return safeUri(osgiInstanceBaseUri + (relativePath != null ? relativePath : "")); + else + return Paths.get(System.getProperty("user.dir")).toUri(); } static File getOsgiConfigurationFile(String relativePath) { try { - return new File(new URI(Activator.getBundleContext().getProperty( - OSGI_CONFIGURATION_AREA) - + relativePath)).getCanonicalFile(); + return new File(new URI(getBundleContext().getProperty(OSGI_CONFIGURATION_AREA) + relativePath)) + .getCanonicalFile(); } catch (Exception e) { - throw new CmsException("Cannot get configuration file for " - + relativePath, e); + throw new IllegalArgumentException("Cannot get configuration file for " + relativePath, e); } } static String getFrameworkProp(String key, String def) { - String value = Activator.getBundleContext().getProperty(key); + BundleContext bundleContext = Activator.getBundleContext(); + String value; + if (bundleContext != null) + value = bundleContext.getProperty(key); + else + value = System.getProperty(key); if (value == null) return def; return value; @@ -96,62 +108,142 @@ class KernelUtils implements KernelConstants { } // Security - static Subject anonymousLogin() { - Subject subject = new Subject(); - LoginContext lc; - try { - lc = new LoginContext(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, - subject); - lc.login(); - return subject; - } catch (LoginException e) { - throw new CmsException("Cannot login as anonymous", e); - } - } - - // @Deprecated - // static void anonymousLogin(AuthenticationManager authenticationManager) { + // static Subject anonymousLogin() { + // Subject subject = new Subject(); + // LoginContext lc; // try { - // List anonAuthorities = Collections - // .singletonList(new GrantedAuthorityPrincipal( - // KernelHeader.ROLE_ANONYMOUS)); - // UserDetails anonUser = new User(KernelHeader.USERNAME_ANONYMOUS, - // "", true, true, true, true, anonAuthorities); - // AnonymousAuthenticationToken anonToken = new - // AnonymousAuthenticationToken( - // DEFAULT_SECURITY_KEY, anonUser, anonAuthorities); - // Authentication authentication = authenticationManager - // .authenticate(anonToken); - // SecurityContextHolder.getContext() - // .setAuthentication(authentication); - // } catch (Exception e) { - // throw new CmsException("Cannot authenticate", e); + // lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject); + // lc.login(); + // return subject; + // } catch (LoginException e) { + // throw new CmsException("Cannot login as anonymous", e); // } // } - // HTTP - static void logRequestHeaders(Log log, HttpServletRequest request) { - if (!log.isDebugEnabled()) - return; - for (Enumeration headerNames = request.getHeaderNames(); headerNames - .hasMoreElements();) { - String headerName = headerNames.nextElement(); - Object headerValue = request.getHeader(headerName); - log.debug(headerName + ": " + headerValue); + static void logFrameworkProperties(CmsLog log) { + BundleContext bc = getBundleContext(); + for (Object sysProp : new TreeSet(System.getProperties().keySet())) { + log.debug(sysProp + "=" + bc.getProperty(sysProp.toString())); } + // String[] keys = { Constants.FRAMEWORK_STORAGE, + // Constants.FRAMEWORK_OS_NAME, Constants.FRAMEWORK_OS_VERSION, + // Constants.FRAMEWORK_PROCESSOR, Constants.FRAMEWORK_SECURITY, + // Constants.FRAMEWORK_TRUST_REPOSITORIES, + // Constants.FRAMEWORK_WINDOWSYSTEM, Constants.FRAMEWORK_VENDOR, + // Constants.FRAMEWORK_VERSION, Constants.FRAMEWORK_STORAGE_CLEAN, + // Constants.FRAMEWORK_LANGUAGE, Constants.FRAMEWORK_UUID }; + // for (String key : keys) + // log.debug(key + "=" + bc.getProperty(key)); + } + + static void printSystemProperties(PrintStream out) { + TreeMap display = new TreeMap<>(); + for (Object key : System.getProperties().keySet()) + display.put(key.toString(), System.getProperty(key.toString())); + for (String key : display.keySet()) + out.println(key + "=" + display.get(key)); + } + +// static Session openAdminSession(Repository repository) { +// return openAdminSession(repository, null); +// } +// +// static Session openAdminSession(final Repository repository, final String workspaceName) { +// LoginContext loginContext = loginAsDataAdmin(); +// return Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { +// +// @Override +// public Session run() { +// try { +// return repository.login(workspaceName); +// } catch (RepositoryException e) { +// throw new IllegalStateException("Cannot open admin session", e); +// } finally { +// try { +// loginContext.logout(); +// } catch (LoginException e) { +// throw new IllegalStateException(e); +// } +// } +// } +// +// }); +// } +// +// static LoginContext loginAsDataAdmin() { +// ClassLoader currentCl = Thread.currentThread().getContextClassLoader(); +// Thread.currentThread().setContextClassLoader(KernelUtils.class.getClassLoader()); +// LoginContext loginContext; +// try { +// loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN); +// loginContext.login(); +// } catch (LoginException e1) { +// throw new IllegalStateException("Could not login as data admin", e1); +// } finally { +// Thread.currentThread().setContextClassLoader(currentCl); +// } +// return loginContext; +// } + +// static void doAsDataAdmin(Runnable action) { +// LoginContext loginContext = loginAsDataAdmin(); +// Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { +// +// @Override +// public Void run() { +// try { +// action.run(); +// return null; +// } finally { +// try { +// loginContext.logout(); +// } catch (LoginException e) { +// throw new IllegalStateException(e); +// } +// } +// } +// +// }); +// } + + static void asyncOpen(ServiceTracker st) { + Runnable run = new Runnable() { + + @Override + public void run() { + st.open(); + } + }; + Activator.getInternalExecutorService().execute(run); +// new Thread(run, "Open service tracker " + st).start(); + } + + static BundleContext getBundleContext() { + return Activator.getBundleContext(); } - static void logFrameworkProperties(Log log) { - BundleContext bc = Activator.getBundleContext(); - String[] keys = { Constants.FRAMEWORK_STORAGE, - Constants.FRAMEWORK_OS_NAME, Constants.FRAMEWORK_OS_VERSION, - Constants.FRAMEWORK_PROCESSOR, Constants.FRAMEWORK_SECURITY, - Constants.FRAMEWORK_TRUST_REPOSITORIES, - Constants.FRAMEWORK_WINDOWSYSTEM, Constants.FRAMEWORK_VENDOR, - Constants.FRAMEWORK_VERSION, Constants.FRAMEWORK_STORAGE_CLEAN, - Constants.FRAMEWORK_LANGUAGE, Constants.FRAMEWORK_UUID }; - for (String key : keys) - log.debug(key + "=" + bc.getProperty(key)); + static boolean asBoolean(String value) { + if (value == null) + return false; + switch (value) { + case "true": + return true; + case "false": + return false; + default: + throw new IllegalArgumentException( + "Unsupported value for attribute " + DataModelNamespace.ABSTRACT + ": " + value); + } + } + + private static URI safeUri(String uri) { + if (uri == null) + throw new IllegalArgumentException("URI cannot be null"); + try { + return new URI(uri); + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Badly formatted URI " + uri, e); + } } private KernelUtils() {