import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Dictionary;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import org.argeo.cms.internal.runtime.InitUtils;
import org.argeo.cms.internal.runtime.KernelConstants;
import org.argeo.cms.internal.runtime.KernelUtils;
-import org.argeo.osgi.useradmin.UserAdminConf;
-import org.argeo.util.naming.AttributesDictionary;
-import org.argeo.util.naming.LdifParser;
-import org.argeo.util.naming.LdifWriter;
+import org.argeo.util.directory.DirectoryConf;
+import org.argeo.util.directory.ldap.AttributesDictionary;
+import org.argeo.util.directory.ldap.LdifParser;
+import org.argeo.util.directory.ldap.LdifWriter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ConfigurationEvent;
-import org.osgi.service.cm.ConfigurationListener;
/** Manages the LDIF-based deployment configuration. */
-public class DeployConfig implements ConfigurationListener {
+@Deprecated
+public class DeployConfig {
+
private final CmsLog log = CmsLog.getLog(getClass());
// private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
private ConfigurationAdmin configurationAdmin;
- public DeployConfig() {
-// this.dataModels = dataModels;
- // ConfigurationAdmin configurationAdmin =
-// // bc.getService(bc.getServiceReference(ConfigurationAdmin.class));
-// try {
-// if (!isInitialized()) { // first init
-// isFirstInit = true;
-// firstInit();
-// }
-// this.configurationAdmin = configurationAdmin;
-//// init(configurationAdmin, isClean, isFirstInit);
-// } catch (IOException e) {
-// throw new RuntimeException("Could not init deploy configs", e);
-// }
- // FIXME check race conditions during initialization
- // bc.registerService(ConfigurationListener.class, this, null);
- }
-
private void firstInit() throws IOException {
log.info("## FIRST INIT ##");
Files.createDirectories(deployConfigPath.getParent());
private void setFromFrameworkProperties(boolean isFirstInit) {
// user admin
- List<Dictionary<String, Object>> userDirectoryConfigs = InitUtils.getUserDirectoryConfigs();
- if (userDirectoryConfigs.size() != 0) {
- List<String> activeCns = new ArrayList<>();
- for (int i = 0; i < userDirectoryConfigs.size(); i++) {
- Dictionary<String, Object> userDirectoryConfig = userDirectoryConfigs.get(i);
- String baseDn = (String) userDirectoryConfig.get(UserAdminConf.baseDn.name());
- String cn;
- if (CmsConstants.ROLES_BASEDN.equals(baseDn))
- cn = ROLES;
- else
- cn = UserAdminConf.baseDnHash(userDirectoryConfig);
- activeCns.add(cn);
- userDirectoryConfig.put(CmsConstants.CN, cn);
- putFactoryDeployConfig(CmsConstants.NODE_USER_ADMIN_PID, userDirectoryConfig);
- }
- // disable others
- LdapName userAdminFactoryName = serviceFactoryDn(CmsConstants.NODE_USER_ADMIN_PID);
- for (LdapName name : deployConfigs.keySet()) {
- if (name.startsWith(userAdminFactoryName) && !name.equals(userAdminFactoryName)) {
-// try {
- Attributes attrs = deployConfigs.get(name);
- String cn = name.getRdn(name.size() - 1).getValue().toString();
- if (!activeCns.contains(cn)) {
- attrs.put(UserAdminConf.disabled.name(), "true");
- }
-// } catch (Exception e) {
-// throw new CmsException("Cannot disable user directory " + name, e);
+// List<Dictionary<String, Object>> userDirectoryConfigs = InitUtils.getUserDirectoryConfigs();
+// if (userDirectoryConfigs.size() != 0) {
+// List<String> activeCns = new ArrayList<>();
+// for (int i = 0; i < userDirectoryConfigs.size(); i++) {
+// Dictionary<String, Object> userDirectoryConfig = userDirectoryConfigs.get(i);
+// String baseDn = (String) userDirectoryConfig.get(DirectoryConf.baseDn.name());
+// String cn;
+// if (CmsConstants.ROLES_BASEDN.equals(baseDn))
+// cn = ROLES;
+// else
+// cn = DirectoryConf.baseDnHash(userDirectoryConfig);
+// activeCns.add(cn);
+// userDirectoryConfig.put(CmsConstants.CN, cn);
+// putFactoryDeployConfig(CmsConstants.NODE_USER_ADMIN_PID, userDirectoryConfig);
+// }
+// // disable others
+// LdapName userAdminFactoryName = serviceFactoryDn(CmsConstants.NODE_USER_ADMIN_PID);
+// for (LdapName name : deployConfigs.keySet()) {
+// if (name.startsWith(userAdminFactoryName) && !name.equals(userAdminFactoryName)) {
+//// try {
+// Attributes attrs = deployConfigs.get(name);
+// String cn = name.getRdn(name.size() - 1).getValue().toString();
+// if (!activeCns.contains(cn)) {
+// attrs.put(DirectoryConf.disabled.name(), "true");
// }
- }
- }
- }
+//// } catch (Exception e) {
+//// throw new CmsException("Cannot disable user directory " + name, e);
+//// }
+// }
+// }
+// }
// http server
- Dictionary<String, Object> webServerConfig = InitUtils
- .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT));
- if (!webServerConfig.isEmpty()) {
- // TODO check for other customizers
-// webServerConfig.put("customizer.class", "org.argeo.equinox.jetty.CmsJettyCustomizer");
- putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig);
- }
-// LdapName defaultHttpServiceDn = serviceDn(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT);
-// if (deployConfigs.containsKey(defaultHttpServiceDn)) {
-// // remove old default configs since we have now to start Jetty servlet bridge
-// // indirectly
-// deployConfigs.remove(defaultHttpServiceDn);
+// Dictionary<String, Object> webServerConfig = InitUtils
+// .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT));
+// if (!webServerConfig.isEmpty()) {
+// // TODO check for other customizers
+// putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig);
// }
// SAVE
save();
//
-// Dictionary<String, Object> webServerConfig = InitUtils
-// .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, CmsConstants.DEFAULT));
}
- public void start() throws IOException {
- if (!isInitialized()) { // first init
- isFirstInit = true;
- firstInit();
- }
-
- boolean isClean;
+ public void start() {
try {
- Configuration[] confs = configurationAdmin
- .listConfigurations("(service.factoryPid=" + CmsConstants.NODE_USER_ADMIN_PID + ")");
- isClean = confs == null || confs.length == 0;
- } catch (Exception e) {
- throw new IllegalStateException("Cannot analyse clean state", e);
- }
+ if (!isInitialized()) { // first init
+ isFirstInit = true;
+ firstInit();
+ }
- try (InputStream in = Files.newInputStream(deployConfigPath)) {
- deployConfigs = new LdifParser().read(in);
- }
- if (isClean) {
- if (log.isDebugEnabled())
- log.debug("Clean state, loading from framework properties...");
- setFromFrameworkProperties(isFirstInit);
- loadConfigs();
+ boolean isClean = true;
+ if (configurationAdmin != null)
+ try {
+ Configuration[] confs = configurationAdmin
+ .listConfigurations("(service.factoryPid=" + CmsConstants.NODE_USER_ADMIN_PID + ")");
+ isClean = confs == null || confs.length == 0;
+ } catch (Exception e) {
+ throw new IllegalStateException("Cannot analyse clean state", e);
+ }
+
+ try (InputStream in = Files.newInputStream(deployConfigPath)) {
+ deployConfigs = new LdifParser().read(in);
+ }
+ if (isClean) {
+ if (log.isDebugEnabled())
+ log.debug("Clean state, loading from framework properties...");
+ setFromFrameworkProperties(isFirstInit);
+ if (configurationAdmin != null)
+ loadConfigs();
+ }
+ // TODO check consistency if not clean
+ } catch (IOException e) {
+ throw new RuntimeException("Cannot load deploy configuration", e);
}
- // TODO check consistency if not clean
}
public void stop() {
}
+ protected void logAllConfigurations() {
+ if (!log.isDebugEnabled())
+ return;
+ try {
+ Configuration[] configurations = configurationAdmin.listConfigurations(null);
+ if (configurations == null) {
+ log.debug("No configuration available");
+ return;
+ }
+ Arrays.sort(configurations, (o1, o2) -> o1.getPid().compareTo(o2.getPid()));
+ for (Configuration configuration : configurations) {
+ log.debug(configuration.getFactoryPid() + " - " + configuration.getPid() + " - "
+ + configuration.getProperties());
+ }
+ } catch (IOException | InvalidSyntaxException e) {
+ throw new IllegalStateException("Cannot log configurations", e);
+ }
+ }
+
public void loadConfigs() throws IOException {
// FIXME make it more robust
Configuration systemRolesConf = null;
throw new IllegalArgumentException(e);
}
deployConfigs: for (LdapName dn : deployConfigs.keySet()) {
+ Attributes deployConfig = deployConfigs.get(dn);
Rdn lastRdn = dn.getRdn(dn.size() - 1);
LdapName prefix = (LdapName) dn.getPrefix(dn.size() - 1);
if (prefix.toString().equals(CmsConstants.DEPLOY_BASEDN)) {
// service
String pid = lastRdn.getValue().toString();
Configuration conf = configurationAdmin.getConfiguration(pid);
- AttributesDictionary dico = new AttributesDictionary(deployConfigs.get(dn));
+ AttributesDictionary dico = new AttributesDictionary(deployConfig);
conf.update(dico);
} else {
// service factory definition
}
} else {
- Attributes config = deployConfigs.get(dn);
- Attribute disabled = config.get(UserAdminConf.disabled.name());
+ Attribute disabled = deployConfig.get(DirectoryConf.disabled.name());
if (disabled != null)
continue deployConfigs;
// service factory service
+ if (!lastRdn.getType().equals(CmsConstants.CN))
+ throw new IllegalStateException("Only " + CmsConstants.CN + "= is supported: " + dn);
Rdn beforeLastRdn = dn.getRdn(dn.size() - 2);
assert beforeLastRdn.getType().equals(CmsConstants.OU);
String factoryPid = beforeLastRdn.getValue().toString();
- Configuration conf = configurationAdmin.createFactoryConfiguration(factoryPid.toString(), null);
- if (systemRolesDn.equals(dn)) {
- systemRolesConf = configurationAdmin.createFactoryConfiguration(factoryPid.toString(), null);
+
+ String cn = lastRdn.getValue().toString();
+ Configuration conf = getSingleServiceConfiguration(factoryPid, cn);
+ if (conf != null) {
+ if (systemRolesDn.equals(dn))
+ systemRolesConf = conf;
+ // TODO deal with modifications
+// boolean modified = false;
+// Dictionary<String, Object> currentProperties = conf.getProperties();
+//
+// attrs: for (NamingEnumeration<? extends Attribute> it = deployConfig.getAll(); it
+// .hasMoreElements();) {
+// Attribute attr = (Attribute) it.next();
+// String key = attr.getID();
+// Object currentValue = currentProperties.get(key);
+// if (currentValue == null) {
+// modified = true;
+// break attrs;
+// }
+// }
+
+// AttributesDictionary dico = new AttributesDictionary(deployConfig);
+// conf.update(dico);
} else {
- AttributesDictionary dico = new AttributesDictionary(config);
- conf.update(dico);
+
+ conf = configurationAdmin.createFactoryConfiguration(factoryPid.toString(), null);
+ if (systemRolesDn.equals(dn)) {
+ systemRolesConf = configurationAdmin.createFactoryConfiguration(factoryPid.toString(), null);
+ } else {
+ AttributesDictionary dico = new AttributesDictionary(deployConfig);
+ conf.update(dico);
+ }
}
}
}
throw new IllegalStateException("System roles are not configured.");
systemRolesConf.update(new AttributesDictionary(deployConfigs.get(systemRolesDn)));
+// logAllConfigurations();
+ }
+
+ public Set<Dictionary<String, Object>> getUserDirectoryConfigs() {
+ // not static because class is not supported by Android
+ final LdapName USER_ADMIN_BASE_DN;
+ try {
+ USER_ADMIN_BASE_DN = new LdapName(
+ CmsConstants.OU + "=" + CmsConstants.NODE_USER_ADMIN_PID + "," + CmsConstants.DEPLOY_BASEDN);
+ } catch (InvalidNameException e) {
+ throw new IllegalArgumentException(e);
+ }
+ Set<Dictionary<String, Object>> res = new HashSet<>();
+ for (LdapName dn : deployConfigs.keySet()) {
+ if (dn.endsWith(USER_ADMIN_BASE_DN)) {
+ Attributes attributes = deployConfigs.get(dn);
+ res.add(new AttributesDictionary(attributes));
+ }
+ }
+ return res;
}
- @Override
+// @Override
public void configurationEvent(ConfigurationEvent event) {
try {
if (ConfigurationEvent.CM_UPDATED == event.getType()) {
}
public boolean hasDomain() {
- Configuration[] configs;
- try {
- configs = configurationAdmin
- .listConfigurations("(service.factoryPid=" + CmsConstants.NODE_USER_ADMIN_PID + ")");
- } catch (IOException | InvalidSyntaxException e) {
- throw new IllegalStateException("Cannot list user directories", e);
- }
+ // FIXME lookup deploy configs directly
+ if (configurationAdmin == null)
+ return false;
+
+ Configuration[] configs = listConfigurationsByFactory(CmsConstants.NODE_USER_ADMIN_PID);
boolean hasDomain = false;
for (Configuration config : configs) {
- Object realm = config.getProperties().get(UserAdminConf.realm.name());
+ Object realm = config.getProperties().get(DirectoryConf.realm.name());
if (realm != null) {
log.debug("Found realm: " + realm);
hasDomain = true;
return hasDomain;
}
+ private Configuration[] listConfigurationsByFactory(String factoryPid) {
+ try {
+ Configuration[] configs = configurationAdmin.listConfigurations("(service.factoryPid=" + factoryPid + ")");
+ if (configs == null)
+ configs = new Configuration[0];
+ return configs;
+ } catch (IOException | InvalidSyntaxException e) {
+ throw new IllegalStateException("Cannot list configurations with factoryPid " + factoryPid, e);
+ }
+
+ }
+
+ private Configuration getSingleServiceConfiguration(String factoryPid, String cn) {
+ Configuration[] configs = listConfigurationsByFactory(factoryPid);
+ List<Configuration> res = new ArrayList<>();
+ for (Configuration config : configs) {
+ Object currentCn = config.getProperties().get(CmsConstants.CN);
+ if (currentCn != null && cn.equals(currentCn.toString()))
+ res.add(config);
+ }
+ if (res.size() == 0)
+ return null;
+ if (res.size() > 1)
+ throw new IllegalStateException(
+ "More than one " + factoryPid + " configuration returned for " + CmsConstants.CN + "=" + cn);
+ return res.get(0);
+ }
+
/*
* UTILITIES
*/