Details

    • Type: Improvement Improvement
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 5.6.0
    • Component/s: None
    • Labels:
      None
    • Patch Info:
      Patch Available

      Description

      Patch kindly added by ngcutura - discussion thread...

      http://www.nabble.com/LDAP-Authorization-tf1851705.html#a5344494

      1. ApacheDSEmbedded.zip
        4.70 MB
        Nikola Goran Cutura
      2. LdapAuth.zip
        5 kB
        james strachan

        Activity

        Hide
        james strachan added a comment -

        Applied patch with thanks.

        I made a few minor changes to make things easily configurable via the XBean XML stuff.

        I've added the test case but disabled it so far - I've not figured out the magic combination of jars and versions and spring.xml configuration files to boot up ApacheDS in Spring for the test case - it seems the online documentation nor the spring.xml that comes with the 1.0-RC3 download actually work.

        I'm going to leave this issue open until someone figures out how to boot up ApacheDS with a suitable schema in a test case so we can actually test the LDAP authorization support

        Show
        james strachan added a comment - Applied patch with thanks. I made a few minor changes to make things easily configurable via the XBean XML stuff. I've added the test case but disabled it so far - I've not figured out the magic combination of jars and versions and spring.xml configuration files to boot up ApacheDS in Spring for the test case - it seems the online documentation nor the spring.xml that comes with the 1.0-RC3 download actually work. I'm going to leave this issue open until someone figures out how to boot up ApacheDS with a suitable schema in a test case so we can actually test the LDAP authorization support
        Hide
        Nikola Goran Cutura added a comment -

        Thanks James!

        How can I see the files? I saw test resources on SVN (properties, ldif, xml) but no Java files.

        What is the next step in actually using this module? How do I build AMQ with this?

        I'll try to solve ApacheDS issue you reported. I'll be using it on my project so I'll work with it anyway.

        Show
        Nikola Goran Cutura added a comment - Thanks James! How can I see the files? I saw test resources on SVN (properties, ldif, xml) but no Java files. What is the next step in actually using this module? How do I build AMQ with this? I'll try to solve ApacheDS issue you reported. I'll be using it on my project so I'll work with it anyway.
        Hide
        james strachan added a comment -

        The best thing is to grab the code from subversion...

        http://incubator.apache.org/activemq/source.html

        e.g. type

        svn co http://svn.apache.org/repos/asf/incubator/activemq/trunk activemq

        then build it via the following (after installing maven)

        cd activemq
        mvn install -Dmaven.test.skip=true

        e.g.

        http://incubator.apache.org/activemq/building.html

        the test case is here...

        https://svn.apache.org/repos/asf/incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/security/LDAPAuthorizationMapTest.java

        you can run the test case via

        cd activemq-core
        mvn test -Dtest=LDAPAuthorizationMapTest

        Show
        james strachan added a comment - The best thing is to grab the code from subversion... http://incubator.apache.org/activemq/source.html e.g. type svn co http://svn.apache.org/repos/asf/incubator/activemq/trunk activemq then build it via the following (after installing maven) cd activemq mvn install -Dmaven.test.skip=true e.g. http://incubator.apache.org/activemq/building.html the test case is here... https://svn.apache.org/repos/asf/incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/security/LDAPAuthorizationMapTest.java you can run the test case via cd activemq-core mvn test -Dtest=LDAPAuthorizationMapTest
        Hide
        james strachan added a comment -

        Nikola - any progress on getting a test case to work?

        Show
        james strachan added a comment - Nikola - any progress on getting a test case to work?
        Hide
        Nikola Goran Cutura added a comment -

        I've been working on ApacheDS integration and found some issues there. Those are planned to be fixed in RC4 which is coming in a week (1.9.2006.).

        Show
        Nikola Goran Cutura added a comment - I've been working on ApacheDS integration and found some issues there. Those are planned to be fixed in RC4 which is coming in a week (1.9.2006.).
        Hide
        james strachan added a comment -

        Great - thanks for the heads up. Good luck

        Show
        james strachan added a comment - Great - thanks for the heads up. Good luck
        Hide
        james strachan added a comment -

        Any progress on this yet?

        Show
        james strachan added a comment - Any progress on this yet?
        Hide
        Nikola Goran Cutura added a comment -

        Hi,

        I've been busy with another module. Based on Sepand's contribution, I made LDAPCertificateLoginModule that takes certificate from SSL connection and verifies it against LDAP. I'll commit it together with unit test.

        Now, about testing with Apache direstory:

        What (I understood) you asked for (and I volounteered) is the ability of unit tests to start (an embedded instance of) directory server loladed with testing data and perform unit tests against it. Right now, I start manually ApacheDS and perform unit tests but we want that automated, right?

        If that is the case, I believe I can make that easily (I already started ApacheDS as embedded). But, if I understood you correctly, you would like to utilize existing libraries from AMQ project and submit only the difference, is this correct?

        I'll try to find the differences, too, but my knowledgde of Maven is extremly poor so I won't be able to produce some kond of '.pom' or whatever appropriate. I'll just submit the jars and the code, would that be acceptable?

        Show
        Nikola Goran Cutura added a comment - Hi, I've been busy with another module. Based on Sepand's contribution, I made LDAPCertificateLoginModule that takes certificate from SSL connection and verifies it against LDAP. I'll commit it together with unit test. Now, about testing with Apache direstory: What (I understood) you asked for (and I volounteered) is the ability of unit tests to start (an embedded instance of) directory server loladed with testing data and perform unit tests against it. Right now, I start manually ApacheDS and perform unit tests but we want that automated, right? If that is the case, I believe I can make that easily (I already started ApacheDS as embedded). But, if I understood you correctly, you would like to utilize existing libraries from AMQ project and submit only the difference, is this correct? I'll try to find the differences, too, but my knowledgde of Maven is extremly poor so I won't be able to produce some kond of '.pom' or whatever appropriate. I'll just submit the jars and the code, would that be acceptable?
        Hide
        Nikola Goran Cutura added a comment -

        This patch needs improvement. It does not handle composite destinations and broker won't start if LDAPAuthorizationMap is configured as there is (at least) one composite destination during startup (topic://ActiveMQ.Advisory.TempTopic,topic://ActiveMQ.Advisory.TempTopic). I am on this now.

        Show
        Nikola Goran Cutura added a comment - This patch needs improvement. It does not handle composite destinations and broker won't start if LDAPAuthorizationMap is configured as there is (at least) one composite destination during startup (topic://ActiveMQ.Advisory.TempTopic,topic://ActiveMQ.Advisory.TempTopic). I am on this now.
        Hide
        james strachan added a comment -

        Hi Nikola

        Don't worry about the maven stuff, I can try help with that - its mostly to get a unit test running that boots up an embedded ApacheDS, loads it with the necessary test data, then runs the test case.

        Show
        james strachan added a comment - Hi Nikola Don't worry about the maven stuff, I can try help with that - its mostly to get a unit test running that boots up an embedded ApacheDS, loads it with the necessary test data, then runs the test case.
        Hide
        Nikola Goran Cutura added a comment -

        I finished improvement together with unit test (running on external ADS). There are two assumptions I want to confirm:

        1. Composite destinations
        ACL set of a composite destination is a union of ACL sets of each particular destination. I deduced this from code (DefaultAuthorizationMap) and implemented the same although it does not seem logical to me. Intersection of sets would be more appropriate, I believe. Should I implement the intersection or leave the union?

        2. Wildcard destinations
        Wildcards are given in authorization policy source (xml map or ldap or...) to allow creation (primarily) of a destination in a certain namespace. Wildcard is ">" which means any destination. This meaning is unlimited in depth i.e. "ActiveMQ.Advisory.>" will suffice both for "ActiveMQ.Advisory.Connection" (> = Connection, same level) and for "ActiveMQ.Advisory.Queue.ABC123" (> = Queue.ABC123, one level more). Is this correct? Should I leave it as it is or restrict ">" to the same level only?

        Show
        Nikola Goran Cutura added a comment - I finished improvement together with unit test (running on external ADS). There are two assumptions I want to confirm: 1. Composite destinations ACL set of a composite destination is a union of ACL sets of each particular destination. I deduced this from code (DefaultAuthorizationMap) and implemented the same although it does not seem logical to me. Intersection of sets would be more appropriate, I believe. Should I implement the intersection or leave the union? 2. Wildcard destinations Wildcards are given in authorization policy source (xml map or ldap or...) to allow creation (primarily) of a destination in a certain namespace. Wildcard is ">" which means any destination. This meaning is unlimited in depth i.e. "ActiveMQ.Advisory.>" will suffice both for "ActiveMQ.Advisory.Connection" (> = Connection, same level) and for "ActiveMQ.Advisory.Queue.ABC123" (> = Queue.ABC123, one level more). Is this correct? Should I leave it as it is or restrict ">" to the same level only?
        Hide
        james strachan added a comment -

        1. union is probably more appropriate. If the user tries to send to 5 destinations and one of them is not available, it should generate an error and fail rather than silently just sending to the ones it can etc

        2. Yes. > acts as a recursive match to any depth.

        http://incubator.apache.org/activemq/wildcards.html

        Show
        james strachan added a comment - 1. union is probably more appropriate. If the user tries to send to 5 destinations and one of them is not available, it should generate an error and fail rather than silently just sending to the ones it can etc 2. Yes. > acts as a recursive match to any depth. http://incubator.apache.org/activemq/wildcards.html
        Hide
        Nikola Goran Cutura added a comment -

        Thanks for wildcard link. I did not implement '*', I'll finish it as well. Is it possible to have kind of regular expression like STOCKS.PRICE.NYSE.*BM ?

        Regarding composite destinations, I would like your attention:

        Union of ACLs means that if a user has privilege on at least one destination, all destinations will allow operation.
        Intersection of ACLs means that if a user lacks privilege on at least one destination, no destination will allow operation.

        I'll produce a test to verify this but my point is that current implementation of union is a security leak (if my understanding is correct). Suppose that a guest user wants to read from a destination not authorized for guests, say destination USERS.SECRET. A guest may create a destination in GUEST space with all necessary privileges, say GUEST.ALLOW. Now, the user creates a composite destination (GUEST.ALLOW, USERS.SECRET) and attempts an operation:

        Case UNION: as operation is permitted on GUEST.ALLOW it is sufficient for composite destination; operation is performed on both destinations in spite of the fact that user is not authorized for the other.

        Case INTERSECTION: as operation is NOT permitted on USERS.SECRET no operation is attempted on composite destination.

        Now, maybe I got it wrong but the method 'getXXXXXACLs()' in DefaultAuthorizationMap is pretty clear - it adds all ACLs from all entries...

        Show
        Nikola Goran Cutura added a comment - Thanks for wildcard link. I did not implement '*', I'll finish it as well. Is it possible to have kind of regular expression like STOCKS.PRICE.NYSE.*BM ? Regarding composite destinations, I would like your attention: Union of ACLs means that if a user has privilege on at least one destination, all destinations will allow operation. Intersection of ACLs means that if a user lacks privilege on at least one destination, no destination will allow operation. I'll produce a test to verify this but my point is that current implementation of union is a security leak (if my understanding is correct). Suppose that a guest user wants to read from a destination not authorized for guests, say destination USERS.SECRET. A guest may create a destination in GUEST space with all necessary privileges, say GUEST.ALLOW. Now, the user creates a composite destination (GUEST.ALLOW, USERS.SECRET) and attempts an operation: Case UNION: as operation is permitted on GUEST.ALLOW it is sufficient for composite destination; operation is performed on both destinations in spite of the fact that user is not authorized for the other. Case INTERSECTION: as operation is NOT permitted on USERS.SECRET no operation is attempted on composite destination. Now, maybe I got it wrong but the method 'getXXXXXACLs()' in DefaultAuthorizationMap is pretty clear - it adds all ACLs from all entries...
        Hide
        james strachan added a comment -

        Note that * is only allowed on a complete path, not regex. So STOCKS.PRICE.NYSE.* or STOCKS.PRICE.*.IBM but not STOCKS.PRICE.NYSE.*BM

        Thanks for the clarification on union v intersection. So yes, intersection sounds about right, sorry for my previous confusion

        Show
        james strachan added a comment - Note that * is only allowed on a complete path, not regex. So STOCKS.PRICE.NYSE.* or STOCKS.PRICE.*.IBM but not STOCKS.PRICE.NYSE.*BM Thanks for the clarification on union v intersection. So yes, intersection sounds about right, sorry for my previous confusion
        Hide
        Nikola Goran Cutura added a comment -

        Attached is eclipse project that starts embedded ADS with supplied LDIF file, perfoms some query and closes the server. Intention is to use the template in unit tests.

        I was able to run this as it is but I wasn't able to run it in activemq-core and activemq-jaas eclipse projects. I tried to add libraries but I always ended up with exception, both in core and jaas modules:

        Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configuration' defined in file [C:\ActiveMQ\activemq\activemq-jaas\server.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.directory.server.configuration.MutableServerStartupConfiguration]: Constructor threw exception; nested exception is java.lang.IncompatibleClassChangeError
        Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.directory.server.configuration.MutableServerStartupConfiguration]: Constructor threw exception; nested exception is java.lang.IncompatibleClassChangeError
        Caused by: java.lang.IncompatibleClassChangeError
        at org.apache.directory.server.core.authn.AuthenticationService.<clinit>(AuthenticationService.java:66)
        at org.apache.directory.server.core.configuration.StartupConfiguration.setDefaultInterceptorConfigurations(StartupConfiguration.java:161)
        at org.apache.directory.server.core.configuration.StartupConfiguration.<init>(StartupConfiguration.java:88)
        at org.apache.directory.server.configuration.ServerStartupConfiguration.<init>(ServerStartupConfiguration.java:65)
        at org.apache.directory.server.configuration.MutableServerStartupConfiguration.<init>(MutableServerStartupConfiguration.java:43)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:82)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:59)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:52)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:639)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:625)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:290)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:89)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:74)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:65)
        at org.apache.activemq.jaas.ldap.SimpleFileConfiguredServer.main(SimpleFileConfiguredServer.java:27)

        Show
        Nikola Goran Cutura added a comment - Attached is eclipse project that starts embedded ADS with supplied LDIF file, perfoms some query and closes the server. Intention is to use the template in unit tests. I was able to run this as it is but I wasn't able to run it in activemq-core and activemq-jaas eclipse projects. I tried to add libraries but I always ended up with exception, both in core and jaas modules: Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configuration' defined in file [C:\ActiveMQ\activemq\activemq-jaas\server.xml] : Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.directory.server.configuration.MutableServerStartupConfiguration] : Constructor threw exception; nested exception is java.lang.IncompatibleClassChangeError Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.directory.server.configuration.MutableServerStartupConfiguration] : Constructor threw exception; nested exception is java.lang.IncompatibleClassChangeError Caused by: java.lang.IncompatibleClassChangeError at org.apache.directory.server.core.authn.AuthenticationService.<clinit>(AuthenticationService.java:66) at org.apache.directory.server.core.configuration.StartupConfiguration.setDefaultInterceptorConfigurations(StartupConfiguration.java:161) at org.apache.directory.server.core.configuration.StartupConfiguration.<init>(StartupConfiguration.java:88) at org.apache.directory.server.configuration.ServerStartupConfiguration.<init>(ServerStartupConfiguration.java:65) at org.apache.directory.server.configuration.MutableServerStartupConfiguration.<init>(MutableServerStartupConfiguration.java:43) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:82) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:59) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:52) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:639) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:625) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:290) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348) at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:89) at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:74) at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:65) at org.apache.activemq.jaas.ldap.SimpleFileConfiguredServer.main(SimpleFileConfiguredServer.java:27)
        Hide
        Robin Bramley added a comment -

        The LDAPAuthorizationMap in 5.0.0 does not cope with composite destinations as used by the advisory topics and was preventing producers sending messages.

        ERROR LDAPAuthorizationMap - javax.naming.NameNotFoundException: [LDAP
        : error code 32 - failed on search operation: uid=topic:]; remaining name 'uid=
        topic://ActiveMQ.Advisory.TempQueue,topic://ActiveMQ.Advisory.TempTopic,ou=topics
        ,ou=destinations,o=ActiveMQ,ou=system'

        Note that I'd changed the LogFactory call to use LDAPAuthorizationMap instead of LDAPLoginModule...

        Added the following code to the start of the getACLs method to make it usable:
        //TODO: handle composite destinations properly
        if(destination.isComposite())

        { ActiveMQDestination[] destinations = destination.getCompositeDestinations(); // for now just check the first one destination = destinations[0]; }
        Show
        Robin Bramley added a comment - The LDAPAuthorizationMap in 5.0.0 does not cope with composite destinations as used by the advisory topics and was preventing producers sending messages. ERROR LDAPAuthorizationMap - javax.naming.NameNotFoundException: [LDAP : error code 32 - failed on search operation: uid=topic:]; remaining name 'uid= topic://ActiveMQ.Advisory.TempQueue,topic://ActiveMQ.Advisory.TempTopic,ou=topics ,ou=destinations,o=ActiveMQ,ou=system' Note that I'd changed the LogFactory call to use LDAPAuthorizationMap instead of LDAPLoginModule... Added the following code to the start of the getACLs method to make it usable: //TODO: handle composite destinations properly if(destination.isComposite()) { ActiveMQDestination[] destinations = destination.getCompositeDestinations(); // for now just check the first one destination = destinations[0]; }
        Hide
        Dejan Bosanac added a comment -

        I put some more work in this area. Now it supports composite destinations, separate dn for all advisories (configurable as I think most people will got for that) and a dn for temp destinations.

        Show
        Dejan Bosanac added a comment - I put some more work in this area. Now it supports composite destinations, separate dn for all advisories (configurable as I think most people will got for that) and a dn for temp destinations.
        Hide
        Dejan Bosanac added a comment -

        You can also take a look at new LDAPSecurityTest for some examples for he configuration.

        Unfortunately LDAP tests (LDAPAuthorizationMap and LDAPSecurityTest) are still excluded from surefire plugins as Apache DS 1.5.7 doesn't work well with forkmode=pertest which we use. I'll see to handle that as well in coming days.

        Show
        Dejan Bosanac added a comment - You can also take a look at new LDAPSecurityTest for some examples for he configuration. Unfortunately LDAP tests (LDAPAuthorizationMap and LDAPSecurityTest) are still excluded from surefire plugins as Apache DS 1.5.7 doesn't work well with forkmode=pertest which we use. I'll see to handle that as well in coming days.
        Hide
        Ferdy Nagy added a comment -

        Maven can be a real pain sometimes, and some plugin documentation leaves a lot to be desired. ADS 1.5.7 loads the base schemas by looking at all the jars in the classpath (sys property) and extracting found ldifs. The surefire plugin by default uses a manifest jar to specify the classes/jars when forking, you can change this behaviour to fork and use a classpath by setting useManifestOnlyJar to false, and ADS should now be able to scan the cp. (http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#useManifestOnlyJar). It would be nice if ADS used a different scan mechanism to find the schemas that wasn't dependent on the class path property...

        Show
        Ferdy Nagy added a comment - Maven can be a real pain sometimes, and some plugin documentation leaves a lot to be desired. ADS 1.5.7 loads the base schemas by looking at all the jars in the classpath (sys property) and extracting found ldifs. The surefire plugin by default uses a manifest jar to specify the classes/jars when forking, you can change this behaviour to fork and use a classpath by setting useManifestOnlyJar to false, and ADS should now be able to scan the cp. ( http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#useManifestOnlyJar ). It would be nice if ADS used a different scan mechanism to find the schemas that wasn't dependent on the class path property...
        Hide
        Dejan Bosanac added a comment -

        Thanks for the tip! I just added <useManifestOnlyJar>false</useManifestOnlyJar> to the activemq-core/pom.xml so we can run apacheds based tests using CI.

        Show
        Dejan Bosanac added a comment - Thanks for the tip! I just added <useManifestOnlyJar>false</useManifestOnlyJar> to the activemq-core/pom.xml so we can run apacheds based tests using CI.

          People

          • Assignee:
            Dejan Bosanac
            Reporter:
            james strachan
          • Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development