package org.exist.storage; import org.exist.EXistException; import org.exist.security.Subject; import org.exist.test.ExistEmbeddedServer; import org.exist.xmldb.LocalCollection; import org.exist.xmldb.XmldbURI; import org.junit.Rule; import org.junit.Test; import org.xmldb.api.base.XMLDBException; import java.util.Optional; import static org.junit.Assert.assertEquals; /** * @author Adam Retter <adam.retter@googlemail.com> */ public class BrokerPoolTest { @Rule public final ExistEmbeddedServer existEmbeddedServer = new ExistEmbeddedServer(true, false); @Test public void noPrivilegeEscalationThroughBrokerRelease() throws EXistException { //take a broker with the guest user final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final Subject guestUser = pool.getSecurityManager().getGuestSubject(); try(final DBBroker broker1 = pool.get(Optional.of(guestUser))) { assertEquals("Expected `guest` user, but was: " + broker1.getCurrentSubject().getName(), guestUser.getId(), broker1.getCurrentSubject().getId()); //take a broker with the system user final Subject sysUser = pool.getSecurityManager().getSystemSubject(); try (final DBBroker broker2 = pool.get(Optional.of(sysUser))) { assertEquals("Expected `SYSTEM` user, but was: " + broker2.getCurrentSubject().getName(), sysUser.getId(), broker2.getCurrentSubject().getId()); } //ensure that after releasing the broker, the user has been returned to the guest user assertEquals("Expected `guest` user, but was: " + broker1.getCurrentSubject().getName(), guestUser.getId(), broker1.getCurrentSubject().getId()); } } @Test public void privilegeStableWhenSubjectNull() throws EXistException { //take a broker with the SYSTEM user final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final Subject sysUser = pool.getSecurityManager().getSystemSubject(); try(final DBBroker broker1 = pool.get(Optional.of(sysUser))) { assertEquals("Expected `SYSTEM` user, but was: " + broker1.getCurrentSubject().getName(), sysUser.getId(), broker1.getCurrentSubject().getId()); //take a broker without changing the user try (final DBBroker broker2 = pool.getBroker()) { assertEquals("Expected `SYSTEM` user, but was: " + broker2.getCurrentSubject().getName(), sysUser.getId(), broker2.getCurrentSubject().getId()); } //ensure that after releasing the broker, the user is still the SYSTEM user assertEquals("Expected `guest` user, but was: " + broker1.getCurrentSubject().getName(), sysUser.getId(), broker1.getCurrentSubject().getId()); } } @Test public void guestDefaultPriviledge() throws EXistException { //take a broker with default perms final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker1 = pool.getBroker()) { final Subject guestUser = pool.getSecurityManager().getGuestSubject(); assertEquals("Expected `guest` user, but was: " + broker1.getCurrentSubject().getName(), guestUser.getId(), broker1.getCurrentSubject().getId()); //take a broker without changing the user try (final DBBroker broker2 = pool.getBroker()) { assertEquals("Expected `guest` user, but was: " + broker2.getCurrentSubject().getName(), guestUser.getId(), broker2.getCurrentSubject().getId()); } //ensure that after releasing the broker, the user is still the SYSTEM user assertEquals("Expected `guest` user, but was: " + broker1.getCurrentSubject().getName(), guestUser.getId(), broker1.getCurrentSubject().getId()); } } @Test public void noPrivilegeEscalationThroughBrokerRelease_xmldb() throws EXistException, XMLDBException { //take a broker with the guest user final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final Subject guestUser = pool.getSecurityManager().getGuestSubject(); try(final DBBroker broker1 = pool.get(Optional.of(guestUser))) { assertEquals("Expected `guest` user, but was: " + broker1.getCurrentSubject().getName(), guestUser.getId(), broker1.getCurrentSubject().getId()); //perform an XML:DB operation as the SYSTEM user final Subject sysUser = pool.getSecurityManager().getSystemSubject(); new LocalCollection(sysUser, pool, XmldbURI.ROOT_COLLECTION_URI); //ensure that after releasing the broker, the user has been returned to the guest user assertEquals("Expected `guest` user, but was: " + broker1.getCurrentSubject().getName(), guestUser.getId(), broker1.getCurrentSubject().getId()); } } }