modules/core/dbutils/pom.xml
| 8
modules/core/domain/pom.xml
| 45 -
modules/enterprise/server/itests-2/pom.xml
| 19
modules/enterprise/server/jar/pom.xml
| 13
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SessionManager.java
| 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/AccessCheckingInitialContextFactoryBuilder.java
| 63 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/NamingHack.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/sync/ExportingInputStream.java
| 15
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/naming/DecoratingInvocationHandlerTest.java
| 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/ExportingInputStreamTest.java
| 260 +++++++++-
10 files changed, 325 insertions(+), 110 deletions(-)
New commits:
commit ed5920e6ae433e37a1c8fa2bec94280724f314dd
Merge: 441379d 165b4f5
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Thu Dec 13 13:19:24 2012 -0600
Merge branch 'master' into feature/cassandra-backend
commit 165b4f583ca08f6a7c20ebcdaad7fe7f43508b90
Author: Jay Shaughnessy <jshaughn(a)jshaughn.csb>
Date: Thu Dec 13 13:18:09 2012 -0500
Fix an issue where the domain and server itests needed one of
-Ppostgres or -Poracle to be defined. Now it will default to
postgres unless -Pitest.oracle is set.
Also, removed some ojdbc-driver profile declarations that were
redundant with what is already defined in the root pom and should
be inherited.
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index c110636..c8fef74 100644
--- a/modules/core/dbutils/pom.xml
+++ b/modules/core/dbutils/pom.xml
@@ -435,13 +435,7 @@
<profile>
<id>ojdbc-driver</id>
- <dependencies>
- <dependency>
- <groupId>com.oracle</groupId>
- <artifactId>ojdbc6</artifactId>
- <version>${ojdbc6.version}</version>
- </dependency>
- </dependencies>
+ <!-- TODO: defer to root pom version when we can agree on a version
-->
<build>
<plugins>
<plugin>
diff --git a/modules/core/domain/pom.xml b/modules/core/domain/pom.xml
index cb7699b..23d5fe0 100644
--- a/modules/core/domain/pom.xml
+++ b/modules/core/domain/pom.xml
@@ -18,6 +18,10 @@
<jboss.zip>${settings.localRepository}/org/jboss/as/jboss-as-dist/${jboss.version}/jboss-as-dist-${jboss.version}.zip</jboss.zip>
<jboss.unzip.location>${basedir}/target/jboss-as-${jboss.version}</jboss.unzip.location>
<rhq.internal>false</rhq.internal>
+ <!-- These properties guide which datasources are used for integration tests.
Only one should be true.
+ The default is Postgres, specify -Pitest.oracle to use Oracle -->
+ <skip.postgres>false</skip.postgres>
+ <skip.oracle>true</skip.oracle>
</properties>
@@ -542,18 +546,14 @@
</build>
- <profiles>
-
- <!-- if you want to test on oracle, this can pull down the oracle jdbc driver
that is needed -->
- <profile>
- <id>ojdbc-driver</id>
- <dependencies>
- <dependency>
- <groupId>com.oracle</groupId>
- <artifactId>ojdbc6</artifactId>
- <version>${ojdbc6.version}</version>
- </dependency>
- </dependencies>
+ <profiles>
+ <!-- If testing against oracle, override the default property settings
-->
+ <profile>
+ <id>itest.oracle</id>
+ <properties>
+ <skip.postgres>true</skip.postgres>
+ <skip.oracle>false</skip.oracle>
+ </properties>
</profile>
<profile>
@@ -669,26 +669,7 @@
</plugins>
</build>
</profile>
-
- <profile>
- <id>postgres</id>
- <activation>
- <activeByDefault>true</activeByDefault>
- </activation>
- <properties>
- <skip.postgres>false</skip.postgres>
- <skip.oracle>true</skip.oracle>
- </properties>
- </profile>
-
- <profile>
- <id>oracle</id>
- <properties>
- <skip.postgres>true</skip.postgres>
- <skip.oracle>false</skip.oracle>
- </properties>
- </profile>
-
+
<profile>
<id>itest.debug</id>
<activation>
diff --git a/modules/enterprise/server/itests-2/pom.xml
b/modules/enterprise/server/itests-2/pom.xml
index 01b377f..ba7dd7e 100644
--- a/modules/enterprise/server/itests-2/pom.xml
+++ b/modules/enterprise/server/itests-2/pom.xml
@@ -26,6 +26,10 @@
<jboss.vm.args>-Xmx700m -XX:MaxPermSize=200m -Djava.security.manager
-Djava.security.policy==${jboss.unzip.location}/security.policy</jboss.vm.args>
<jboss.vm.args.debug></jboss.vm.args.debug> <!-- -Ditest.debug can
override this, see below -->
+ <!-- These properties guide which datasources are used for integration tests.
Only one should be true.
+ The default is Postgres, specify -Pitest.oracle to use Oracle -->
+ <skip.postgres>false</skip.postgres>
+ <skip.oracle>true</skip.oracle>
</properties>
<dependencies>
@@ -672,19 +676,9 @@
</build>
<profiles>
+ <!-- If testing against oracle, override the default property settings -->
<profile>
- <id>postgres</id>
- <activation>
- <activeByDefault>true</activeByDefault>
- </activation>
- <properties>
- <skip.postgres>false</skip.postgres>
- <skip.oracle>true</skip.oracle>
- </properties>
- </profile>
-
- <profile>
- <id>oracle</id>
+ <id>itest.oracle</id>
<properties>
<skip.postgres>true</skip.postgres>
<skip.oracle>false</skip.oracle>
diff --git a/modules/enterprise/server/jar/pom.xml
b/modules/enterprise/server/jar/pom.xml
index 98a7895..2033a2c 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -694,19 +694,6 @@
</build>
</profile>
- <!-- if you want to test on oracle, this can pull down the oracle jdbc driver that
is needed -->
- <profile>
- <id>ojdbc-driver</id>
- <dependencies>
- <dependency>
- <groupId>com.oracle</groupId>
- <artifactId>ojdbc6</artifactId>
- <version>${ojdbc6.version}</version>
- </dependency>
- </dependencies>
- </profile>
-
-
<profile>
<id>dev</id>
commit e794a376e030ff34e237afcb9b4994768e489cd8
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Dec 13 17:27:45 2012 +0100
Fixed the ExportingInputStream to correctly define the XML namespaces
(and thus work under woodstox, which is the XML streaming provider in AS7).
Re-enabled the SynchronizationManagerBeanTest.
diff --git a/modules/enterprise/server/itests-2/pom.xml
b/modules/enterprise/server/itests-2/pom.xml
index f58396a..01b377f 100644
--- a/modules/enterprise/server/itests-2/pom.xml
+++ b/modules/enterprise/server/itests-2/pom.xml
@@ -656,7 +656,6 @@
<excludes>
<!-- NOTE: PERF GROUP AND SOME CLASSES EXCLUDED (SEE BZ 874696)
-->
<exclude>**/LdapGroupManagerBeanTest.java</exclude>
- <exclude>**/SynchronizationManagerBeanTest.java</exclude>
<exclude>org/rhq/**/performance/**/*.java</exclude>
<!-- exclude the db tests which are not expected to run in this suite
-->
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/sync/ExportingInputStream.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/sync/ExportingInputStream.java
index 19734f6..eae8d7d 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/sync/ExportingInputStream.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/sync/ExportingInputStream.java
@@ -34,7 +34,6 @@ import java.util.zip.GZIPOutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
-import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
@@ -238,19 +237,15 @@ public class ExportingInputStream extends InputStream {
*/
private void exportPrologue(XMLStreamWriter wrt) throws XMLStreamException {
wrt.setDefaultNamespace(SynchronizationConstants.EXPORT_NAMESPACE);
- wrt.setPrefix(SynchronizationConstants.EXPORT_NAMESPACE_PREFIX,
SynchronizationConstants.EXPORT_NAMESPACE);
- wrt.setPrefix(SynchronizationConstants.CONFIGURATION_INSTANCE_NAMESPACE_PREFIX,
SynchronizationConstants.CONFIGURATION_INSTANCE_NAMESPACE);
- wrt.setPrefix(SynchronizationConstants.CONFIGURATION_NAMESPACE_PREFIX,
SynchronizationConstants.CONFIGURATION_NAMESPACE);
-
- NamespaceContext nsContext =
SynchronizationConstants.createConfigurationExportNamespaceContext();
-
- wrt.setNamespaceContext(nsContext);
wrt.writeStartDocument();
wrt.writeStartElement(SynchronizationConstants.EXPORT_NAMESPACE,
SynchronizationConstants.CONFIGURATION_EXPORT_ELEMENT);
-
wrt.writeNamespace(SynchronizationConstants.CONFIGURATION_INSTANCE_NAMESPACE_PREFIX,
ConfigurationInstanceDescriptorUtil.NS_CONFIGURATION_INSTANCE);
- wrt.writeNamespace(SynchronizationConstants.CONFIGURATION_NAMESPACE_PREFIX,
SynchronizationConstants.CONFIGURATION_NAMESPACE);
+
wrt.writeNamespace(SynchronizationConstants.CONFIGURATION_INSTANCE_NAMESPACE_PREFIX,
+ ConfigurationInstanceDescriptorUtil.NS_CONFIGURATION_INSTANCE);
+ wrt.writeNamespace(SynchronizationConstants.CONFIGURATION_NAMESPACE_PREFIX,
+ SynchronizationConstants.CONFIGURATION_NAMESPACE);
+
writeValidators(wrt);
}
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/ExportingInputStreamTest.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/ExportingInputStreamTest.java
index 6d56969..db6393e 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/ExportingInputStreamTest.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/ExportingInputStreamTest.java
@@ -28,6 +28,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
@@ -36,9 +38,19 @@ import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -56,12 +68,14 @@ import org.rhq.core.domain.sync.ExporterMessages;
import org.rhq.enterprise.server.sync.ExportReader;
import org.rhq.enterprise.server.sync.ExportWriter;
import org.rhq.enterprise.server.sync.ExportingInputStream;
+import org.rhq.enterprise.server.sync.ImportException;
import org.rhq.enterprise.server.sync.NoSingleEntity;
import org.rhq.enterprise.server.sync.SynchronizationConstants;
import org.rhq.enterprise.server.sync.Synchronizer;
import org.rhq.enterprise.server.sync.exporters.AbstractDelegatingExportingIterator;
import org.rhq.enterprise.server.sync.exporters.Exporter;
import org.rhq.enterprise.server.sync.exporters.ExportingIterator;
+import org.rhq.enterprise.server.sync.exporters.JAXBExportingIterator;
import org.rhq.enterprise.server.sync.importers.ExportedEntityMatcher;
import org.rhq.enterprise.server.sync.importers.Importer;
import org.rhq.enterprise.server.sync.validators.ConsistencyValidator;
@@ -90,7 +104,9 @@ public class ExportingInputStreamTest extends JMockTest {
}
public void export(ExportWriter output) throws XMLStreamException {
- output.writeCData(getCurrent().toString());
+ output.writeStartElement("datum");
+ output.writeCharacters(getCurrent().toString());
+ output.writeEndElement();
}
public String getNotes() {
@@ -191,6 +207,140 @@ public class ExportingInputStreamTest extends JMockTest {
}
}
+ public static class Entity {
+ public int value;
+
+ public Entity(int value) {
+ this.value = value;
+ }
+ }
+
+ @XmlRootElement(name = "exported-entity")
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class ExportedEntity {
+
+ @XmlAttribute
+ public int property;
+ }
+
+ public static class JAXBExporter implements Exporter<Entity, ExportedEntity> {
+
+ private static class JAXBIterator extends
JAXBExportingIterator<ExportedEntity, Entity> {
+
+ public JAXBIterator(java.util.Iterator<Entity> sourceIterator) {
+ super(sourceIterator, ExportedEntity.class);
+ }
+
+ @Override
+ protected ExportedEntity convert(Entity object) {
+ ExportedEntity ret = new ExportedEntity();
+ ret.property = object.value;
+
+ return ret;
+ }
+
+ @Override
+ public String getNotes() {
+ return null;
+ }
+ }
+
+ @Override
+ public ExportingIterator<ExportedEntity> getExportingIterator() {
+ List<Entity> data = new ArrayList<Entity>();
+ for(int i = 0; i < 4; ++i) {
+ data.add(new Entity(i));
+ }
+
+ return new JAXBIterator(data.iterator());
+ }
+
+ @Override
+ public String getNotes() {
+ return null;
+ }
+
+ }
+
+ public static class JAXBImporter implements Importer<Entity, ExportedEntity> {
+
+ private Unmarshaller unmarshaller;
+ {
+ try {
+ JAXBContext context = JAXBContext.newInstance(ExportedEntity.class);
+ unmarshaller = context.createUnmarshaller();
+ } catch (JAXBException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ @Override
+ public ConfigurationDefinition getImportConfigurationDefinition() {
+ return null;
+ }
+
+ @Override
+ public void configure(Configuration importConfiguration) {
+ }
+
+ @Override
+ public ExportedEntityMatcher<Entity, ExportedEntity>
getExportedEntityMatcher() {
+ return new ExportedEntityMatcher<Entity, ExportedEntity>() {
+ @Override
+ public Entity findMatch(ExportedEntity object) {
+ return new Entity(object.property);
+ }
+ };
+ }
+
+ @Override
+ public Set<EntityValidator<ExportedEntity>> getEntityValidators() {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public void update(Entity entity, ExportedEntity exportedEntity) throws Exception
{
+ entity.value = exportedEntity.property;
+ }
+
+ @Override
+ public ExportedEntity unmarshallExportedEntity(ExportReader reader) throws
XMLStreamException {
+ try {
+ return (ExportedEntity) unmarshaller.unmarshal(reader);
+ } catch (JAXBException e) {
+ throw new XMLStreamException(e);
+ }
+ }
+
+ @Override
+ public String finishImport() throws Exception {
+ return null;
+ }
+
+ }
+
+ public static class JAXBSynchronizer implements Synchronizer<Entity,
ExportedEntity> {
+
+ @Override
+ public void initialize(Subject subject, EntityManager entityManager) {
+ }
+
+ @Override
+ public Exporter<Entity, ExportedEntity> getExporter() {
+ return new JAXBExporter();
+ }
+
+ @Override
+ public Importer<Entity, ExportedEntity> getImporter() {
+ return new JAXBImporter();
+ }
+
+ @Override
+ public Set<ConsistencyValidator> getRequiredValidators() {
+ return Collections.emptySet();
+ }
+
+ }
public void testSucessfulExport() throws Exception {
List<String> list1 = Arrays.asList("a", "b",
"c");
@@ -203,11 +353,11 @@ public class ExportingInputStreamTest extends JMockTest {
InputStream export = new ExportingInputStream(exporters, new HashMap<String,
ExporterMessages>(), 1024, false);
-// String exportContents = readAll(new InputStreamReader(export,
"UTF-8"));
-//
-// LOG.info("Export contents:\n" + exportContents);
-//
-// export = new ByteArrayInputStream(exportContents.getBytes("UTF-8"));
+ String exportContents = readAll(new InputStreamReader(export,
"UTF-8"));
+
+ LOG.info("Export contents:\n" + exportContents);
+
+ export = new ByteArrayInputStream(exportContents.getBytes("UTF-8"));
DocumentBuilder bld = DocumentBuilderFactory.newInstance().newDocumentBuilder();
@@ -264,16 +414,108 @@ public class ExportingInputStreamTest extends JMockTest {
Node data = getDirectChildByTagName(entityElement,
SynchronizationConstants.DATA_ELEMENT);
assertNotNull(data, "Could not find data element in the
entity.");
- String dataText = ((Element)data).getTextContent();
+ Node datum = getDirectChildByTagName(data, "datum");
+ assertNotNull(datum, "Could not find the exported datum element
containing the actual data.");
+
+ String datumText = ((Element) datum).getTextContent();
notesText = ((Element)note).getTextContent();
- assertEquals(notesText, ListToStringExporter.NOTE_PREFIX + dataText,
"Unexpected discrepancy between data and notes in the export.");
+ assertEquals(notesText, ListToStringExporter.NOTE_PREFIX + datumText,
+ "Unexpected discrepancy between data and notes in the
export.");
}
++elementIndex;
}
}
+ @Test
+ public void testJAXBHandled() throws Exception {
+ JAXBSynchronizer sync = new JAXBSynchronizer();
+
+ Set<Synchronizer<?, ?>>syncs = this.<Synchronizer<?, ?>>
asSet(sync);
+
+ InputStream export = new ExportingInputStream(syncs, new HashMap<String,
ExporterMessages>(), 1024, false);
+
+ String exportContents = readAll(new InputStreamReader(export,
"UTF-8"));
+
+ XMLStreamReader rdr = XMLInputFactory.newInstance().createXMLStreamReader(
+ new
ByteArrayInputStream(exportContents.getBytes(Charset.forName("UTF-8"))));
+
+ try {
+ while (rdr.hasNext()) {
+ switch (rdr.next()) {
+ case XMLStreamReader.START_ELEMENT:
+ String tagName = rdr.getName().getLocalPart();
+ if (SynchronizationConstants.ENTITIES_EXPORT_ELEMENT.equals(tagName))
{
+ try {
+ importSingle(rdr);
+ } catch (Exception e) {
+ //fail fast on the import errors... This runs in a single
transaction
+ //so all imports done so far will get rolled-back.
+ //(Even if we change our minds later and run a transaction
per importer
+ //we should fail fast to prevent further damage due to
possible
+ //constraint violations in the db, etc.)
+ throw new ImportException("Import failed.", e);
+ }
+ }
+ break;
+ }
+ }
+ } finally {
+ rdr.close();
+ }
+ }
+
+ private <E, X> void importSingle(XMLStreamReader rdr)
+ throws Exception {
+ String synchronizerClassName = rdr.getAttributeValue(null,
SynchronizationConstants.ID_ATTRIBUTE);
+
+ @SuppressWarnings("unchecked")
+ Synchronizer<E, X> synchronizer = instantiate(synchronizerClassName,
Synchronizer.class,
+ "The synchronizer denoted in the export file ('%s') does not
implement the importer interface. This should not happen.");
+
+ Importer<E, X> importer = synchronizer.getImporter();
+
+ ExportedEntityMatcher<E, X> matcher = importer.getExportedEntityMatcher();
+
+ //the passed in configuration has precedence over the default one inlined in
+ //the config file.
+ while (rdr.hasNext()) {
+ boolean bailout = false;
+ switch (rdr.next()) {
+ case XMLStreamConstants.START_ELEMENT:
+ if
(SynchronizationConstants.DATA_ELEMENT.equals(rdr.getName().getLocalPart())) {
+
+ rdr.nextTag();
+ X exportedEntity = importer.unmarshallExportedEntity(new
ExportReader(rdr));
+ E entity = matcher == null ? null :
matcher.findMatch(exportedEntity);
+ importer.update(entity, exportedEntity);
+ }
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ if
(SynchronizationConstants.ENTITIES_EXPORT_ELEMENT.equals(rdr.getName().getLocalPart())) {
+ bailout = true;
+ }
+ }
+
+ if (bailout) {
+ break;
+ }
+ }
+ }
+
+ private <T> T instantiate(String className, Class<T> desiredClass, String
notAssignableErrorMessage)
+ throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+ Class<?> cls = Class.forName(className);
+ if (!desiredClass.isAssignableFrom(cls)) {
+ throw new IllegalStateException(String.format(notAssignableErrorMessage,
className, desiredClass.getName()));
+ }
+
+ Object instance = cls.newInstance();
+
+ return desiredClass.cast(instance);
+ }
+
@Test(expectedExceptions = IOException.class)
public void testExceptionHandling_Exporter_getExportingIterator() throws Exception {
final Exporter<?, ?> failingExporter = context.mock(Exporter.class);
@@ -452,7 +694,7 @@ public class ExportingInputStreamTest extends JMockTest {
return n;
}
}
-
+
return null;
}
}
commit b62fb191a178d06fe48b47b2508fd4cb0aa039ca
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Dec 13 16:15:00 2012 +0100
Modified the access checking JNDI lookup wrappers to take into account
the slightly different behavior needed when there was originally no
initial context factory builder or if there originally was some.
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/AccessCheckingInitialContextFactoryBuilder.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/AccessCheckingInitialContextFactoryBuilder.java
index 9681014..52addaa 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/AccessCheckingInitialContextFactoryBuilder.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/AccessCheckingInitialContextFactoryBuilder.java
@@ -32,6 +32,7 @@ import java.util.EnumMap;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Hashtable;
+import java.util.List;
import java.util.Set;
import javax.naming.Context;
@@ -138,7 +139,7 @@ public class AccessCheckingInitialContextFactoryBuilder implements
InitialContex
}
private enum FactoryType {
- ACCESS_CHECKING {
+ ACCESS_CHECKING_URL_PREFERRING {
@Override
public InitialContextFactory wrap(InitialContextFactory factory) {
@@ -158,15 +159,34 @@ public class AccessCheckingInitialContextFactoryBuilder implements
InitialContex
return new DecoratingInitialContextFactory(factory, pickers);
}
+ },
+ ACCESS_CHECKING {
+
+ @Override
+ public InitialContextFactory wrap(InitialContextFactory factory) {
+ ArrayList<DecoratorPicker<Context, ContextDecorator>> pickers
= new ArrayList<DecoratorPicker<Context, ContextDecorator>>();
+ pickers.add(getAccessCheckingDecoratorPicker());
+
+ return new DecoratingInitialContextFactory(factory, pickers);
+ }
+ },
+ PASS_THROUGH {
+
+ @Override
+ public InitialContextFactory wrap(InitialContextFactory factory) {
+ List<DecoratorPicker<Context, ContextDecorator>> pickers =
Collections.emptyList();
+
+ return new DecoratingInitialContextFactory(factory, pickers);
+ }
};
public abstract InitialContextFactory wrap(InitialContextFactory factory);
- public static FactoryType detect(Hashtable<?, ?> environment) {
+ public static FactoryType detect(Hashtable<?, ?> environment, boolean
pretendNoFactoryBuilder) {
String providerUrl = (String) environment.get(Context.PROVIDER_URL);
if (providerUrl == null) {
- return ACCESS_CHECKING;
+ return pretendNoFactoryBuilder ? ACCESS_CHECKING_URL_PREFERRING :
ACCESS_CHECKING;
} else {
try {
URI uri = new URI(providerUrl);
@@ -175,9 +195,9 @@ public class AccessCheckingInitialContextFactoryBuilder implements
InitialContex
//check if we are accessing the RHQ server through some remoting
//interface.
if (uri.getPort() == JNP_PORT &&
SERVER_BIND_IPS.contains(providerHost)) {
- return ACCESS_CHECKING;
+ return pretendNoFactoryBuilder ? ACCESS_CHECKING_URL_PREFERRING :
ACCESS_CHECKING;
} else {
- return URL_PREFERRING;
+ return pretendNoFactoryBuilder ? URL_PREFERRING : PASS_THROUGH;
}
} catch (URISyntaxException e) {
if (LOG.isDebugEnabled()) {
@@ -185,7 +205,7 @@ public class AccessCheckingInitialContextFactoryBuilder implements
InitialContex
+ Context.PROVIDER_URL
+ " is not a valid URI. Falling back to using the access
checking wrapper.", e);
}
- return ACCESS_CHECKING;
+ return pretendNoFactoryBuilder ? ACCESS_CHECKING_URL_PREFERRING :
ACCESS_CHECKING;
} catch (UnknownHostException e) {
//let the factory deal with the unknown host...
//this most probably shouldn't be secured because localhost
addresses
@@ -195,7 +215,7 @@ public class AccessCheckingInitialContextFactoryBuilder implements
InitialContex
+ Context.PROVIDER_URL
+ " is not resolvable. Falling back to using the URL
preferring wrapper.", e);
}
- return URL_PREFERRING;
+ return pretendNoFactoryBuilder ? URL_PREFERRING : PASS_THROUGH;
}
}
}
@@ -219,15 +239,19 @@ public class AccessCheckingInitialContextFactoryBuilder implements
InitialContex
FactoryType.class);
private final String defaultFactoryClassName;
-
+ private final boolean pretendNoFactoryBuilder;
+
/**
* @param defaultFactory the default factory to use if none can be deduced from the
environment. If null, an attempt
* is made to obtain the default InitialContextFactory of JBoss AS (which may fail
depending on the classloading
* "situation").
+ * @param pretendNoFactoryBuilder true if the naming contexts should pretend as if
there was no initial context
+ * factory builder installed. This is to support environments as AS4, where there
really was no builder initially
+ * and the lookup relied on that fact.
*
* @throws NamingException
*/
- public AccessCheckingInitialContextFactoryBuilder(InitialContextFactory
defaultFactory) throws NamingException {
+ public AccessCheckingInitialContextFactoryBuilder(InitialContextFactory
defaultFactory, final boolean pretendNoFactoryBuilder) throws NamingException {
if (defaultFactory == null) {
defaultFactory = getJbossDefaultInitialContextFactory();
}
@@ -237,21 +261,22 @@ public class AccessCheckingInitialContextFactoryBuilder implements
InitialContex
for (FactoryType ft : FactoryType.values()) {
typeDefaults.put(ft, ft.wrap(defaultFactory));
}
+
+ this.pretendNoFactoryBuilder = pretendNoFactoryBuilder;
+
+ this.defaultFactory = new InitialContextFactory() {
+ public Context getInitialContext(Hashtable<?, ?> environment) throws
NamingException {
+ return typeDefaults.get(FactoryType.detect(environment,
pretendNoFactoryBuilder)).getInitialContext(
+ environment);
+ }
+ };
}
/**
* This is the default initial context factory that is returned when no other is
* configured using the environment variables.
- * <p>
- * It uses {@link NamingContextFactory} as the underlying mechanism - the same
- * as the default configuration in JBoss 4.
*/
- private final InitialContextFactory defaultFactory = new InitialContextFactory() {
- public Context getInitialContext(Hashtable<?, ?> environment) throws
NamingException {
- return typeDefaults.get(FactoryType.detect(environment)).getInitialContext(
- environment);
- }
- };
+ private final InitialContextFactory defaultFactory;
/**
* Create a InitialContext factory. If the environment does not override the factory
class it will use the
@@ -273,7 +298,7 @@ public class AccessCheckingInitialContextFactoryBuilder implements
InitialContex
try {
final Class<?> factoryClass = Class.forName(factoryClassName, true,
classLoader);
InitialContextFactory configuredFactory = (InitialContextFactory)
factoryClass.newInstance();
- return FactoryType.detect(environment).wrap(configuredFactory);
+ return FactoryType.detect(environment,
pretendNoFactoryBuilder).wrap(configuredFactory);
} catch (Exception e) {
NamingException ne = new NamingException("Failed instantiate
InitialContextFactory "
+ factoryClassName
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/NamingHack.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/NamingHack.java
index f21322f..a4173ca 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/NamingHack.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/naming/NamingHack.java
@@ -79,7 +79,7 @@ public class NamingHack {
}
NamingManager.setInitialContextFactoryBuilder(new
AccessCheckingInitialContextFactoryBuilder(
- defaultFactory));
+ defaultFactory, originalBuilder == null));
} catch (Exception e) {
LOG.error("Failed to install a custom initial context factory
builder. RHQ installation is unsecure!",
e);
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/naming/DecoratingInvocationHandlerTest.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/naming/DecoratingInvocationHandlerTest.java
index c92cc42..a5daa9f 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/naming/DecoratingInvocationHandlerTest.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/naming/DecoratingInvocationHandlerTest.java
@@ -106,7 +106,7 @@ public class DecoratingInvocationHandlerTest {
@BeforeClass
public void setBuilder() throws Exception {
NamingManager.setInitialContextFactoryBuilder(new
AccessCheckingInitialContextFactoryBuilder(
- new org.jboss.as.naming.InitialContextFactory()));
+ new org.jboss.as.naming.InitialContextFactory(), false));
}
public void testSimpleDispatch() throws Exception {
commit 3f1149427123c1bbafdb8596e87b776f84b59d54
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Dec 12 16:59:22 2012 +0100
Recovering from the merge of commit 2ce8b7aa063a56840090ed553f47b6e3a0ba7845.
The SessionManager should do the security checks, we've got JNDI security
working.
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SessionManager.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SessionManager.java
index ccffd37..c2b8270 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SessionManager.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SessionManager.java
@@ -45,8 +45,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
*/
public final class SessionManager {
- // TODO JNDI
- // private static final AllowRhqServerInternalsAccessPermission ACCESS_PERMISSION =
new AllowRhqServerInternalsAccessPermission();
+ private static final AllowRhqServerInternalsAccessPermission ACCESS_PERMISSION = new
AllowRhqServerInternalsAccessPermission();
/**
* Our source for random session IDs.
@@ -278,8 +277,7 @@ public final class SessionManager {
}
private static void checkPermission() {
- // TODO JNDI
- // SecurityManager sm = System.getSecurityManager();
- // if (sm != null) sm.checkPermission(ACCESS_PERMISSION);
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) sm.checkPermission(ACCESS_PERMISSION);
}
}
\ No newline at end of file