From b028b123145072f6ba446ccef62edbad06c29206 Mon Sep 17 00:00:00 2001 From: Mats Rydberg Date: Mon, 29 Aug 2016 15:27:41 +0200 Subject: [PATCH] Add acceptance scenario for security logging --- .../AuthScenariosInteractionTestBase.java | 51 +++++++++++++++++++ .../BoltAuthProceduresInteractionTest.java | 7 ++- .../BoltAuthScenariosInteractionTest.java | 9 ++-- .../enterprise/auth/BoltInteraction.java | 25 ++++++++- .../EmbeddedAuthScenariosInteractionTest.java | 7 ++- .../auth/EmbeddedBuiltInProceduresTest.java | 8 ++- .../enterprise/auth/EmbeddedInteraction.java | 32 ++++++++++-- .../enterprise/auth/NeoInteractionLevel.java | 3 ++ .../auth/ProcedureInteractionTestBase.java | 24 +++++++-- .../RESTAuthProceduresInteractionTest.java | 7 ++- .../RESTAuthScenariosInteractionTest.java | 7 ++- .../server/rest/security/RESTInteraction.java | 29 ++++++++--- 12 files changed, 179 insertions(+), 30 deletions(-) diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/AuthScenariosInteractionTestBase.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/AuthScenariosInteractionTestBase.java index f4f675820e2bf..62be531d1e384 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/AuthScenariosInteractionTestBase.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/AuthScenariosInteractionTestBase.java @@ -19,6 +19,14 @@ */ package org.neo4j.server.security.enterprise.auth; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.google.common.base.Charsets; import org.junit.Rule; import org.junit.Test; @@ -29,9 +37,12 @@ import org.neo4j.test.rule.concurrent.ThreadingRule; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.lessThan; import static org.junit.Assert.fail; + import static org.neo4j.server.security.enterprise.auth.AuthProcedures.PERMISSION_DENIED; import static org.neo4j.server.security.enterprise.auth.PredefinedRolesBuilder.ADMIN; import static org.neo4j.server.security.enterprise.auth.PredefinedRolesBuilder.ARCHITECT; @@ -78,6 +89,46 @@ public void loginShouldFailWithIncorrectPassword() throws Exception neo.assertInitFailed( subject ); } + /* + * Logging scenario smoke test + */ + @Test + public void shouldLogSecurityEvents() throws Exception + { + S mats = neo.login( "mats", "neo4j" ); + // for REST, login doesn't happen until the subject does something + neo.executeQuery( mats, "UNWIND [] AS i RETURN 1", Collections.emptyMap(), r -> {} ); + assertEmpty( adminSubject, "CALL dbms.security.createUser('mats', 'neo4j', false)" ); +// assertEmpty( adminSubject, "CALL dbms.security.createRole('role1')" ); + assertEmpty( adminSubject, "CALL dbms.security.addRoleToUser('reader', 'mats')" ); + mats = neo.login( "mats", "neo4j" ); + assertEmpty( mats, "MATCH (n) WHERE id(n) < 0 RETURN 1" ); +// assertEmpty( adminSubject, "CALL dbms.security.deleteRole('role1')" ); + assertEmpty( adminSubject, "CALL dbms.security.deleteUser('mats')" ); + + // flush log + neo.getLocalGraph().shutdown(); + + // assert on log content + List allLines = readFullLog(); + + assertThat( allLines, hasItem( containsString( "Login fail for user `mats`" ) ) ); + assertThat( allLines, hasItem( containsString( "User created: `mats`" ) ) ); + assertThat( allLines, hasItem( containsString( "Role `reader` added to user `mats`" ) ) ); + assertThat( allLines, hasItem( containsString( "Login success for user `mats`" ) ) ); + assertThat( allLines, hasItem( containsString( "User deleted: `mats`" ) ) ); + } + + private List readFullLog() throws IOException + { + List lines = new ArrayList<>(); + BufferedReader bufferedReader = new BufferedReader( + neo.fileSystem().openAsReader( new File( securityLog.getAbsolutePath() ), Charsets.UTF_8 ) ); + lines.add( bufferedReader.readLine() ); + bufferedReader.lines().forEach( lines::add ); + return lines; + } + /* Admin creates user Henrik with password bar Henrik logs in with correct password (gets prompted to change - change to foo) diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltAuthProceduresInteractionTest.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltAuthProceduresInteractionTest.java index 423b8febad16c..27bba1ec98de5 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltAuthProceduresInteractionTest.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltAuthProceduresInteractionTest.java @@ -22,7 +22,10 @@ import org.junit.Rule; import org.junit.rules.RuleChain; +import java.util.Map; + import org.neo4j.bolt.v1.transport.integration.Neo4jWithSocket; +import org.neo4j.graphdb.config.Setting; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.test.TestEnterpriseGraphDatabaseFactory; import org.neo4j.test.TestGraphDatabaseFactory; @@ -49,8 +52,8 @@ private TestGraphDatabaseFactory getTestGraphDatabaseFactory() } @Override - public NeoInteractionLevel setUpNeoServer() throws Throwable + public NeoInteractionLevel setUpNeoServer( Map, String> config ) throws Throwable { - return new BoltInteraction( server ); + return new BoltInteraction( config ); } } diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltAuthScenariosInteractionTest.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltAuthScenariosInteractionTest.java index 8135e23928dd6..b637fe71a8f76 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltAuthScenariosInteractionTest.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltAuthScenariosInteractionTest.java @@ -22,7 +22,10 @@ import org.junit.Rule; import org.junit.rules.RuleChain; +import java.util.Map; + import org.neo4j.bolt.v1.transport.integration.Neo4jWithSocket; +import org.neo4j.graphdb.config.Setting; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.test.TestEnterpriseGraphDatabaseFactory; import org.neo4j.test.TestGraphDatabaseFactory; @@ -31,7 +34,7 @@ public class BoltAuthScenariosInteractionTest extends AuthScenariosInteractionTestBase { private Neo4jWithSocket server = new Neo4jWithSocket( getTestGraphDatabaseFactory(), - settings -> settings.put( GraphDatabaseSettings.auth_enabled, "true" ) ); + settings -> settings.put( GraphDatabaseSettings.auth_enabled, "true" ) ); @Rule public final RuleChain ruleChain = RuleChain.outerRule( SuppressOutput.suppressAll() ).around( server ); @@ -49,8 +52,8 @@ private TestGraphDatabaseFactory getTestGraphDatabaseFactory() } @Override - public NeoInteractionLevel setUpNeoServer() throws Throwable + public NeoInteractionLevel setUpNeoServer( Map, String> config ) throws Throwable { - return new BoltInteraction( server ); + return new BoltInteraction( config ); } } diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltInteraction.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltInteraction.java index 2f6e5d0414952..78c021ad3d810 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltInteraction.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/BoltInteraction.java @@ -42,13 +42,18 @@ import org.neo4j.bolt.v1.transport.socket.client.TransportConnection; import org.neo4j.function.Factory; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.graphdb.config.Setting; +import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.graphdb.mockfs.EphemeralFileSystemAbstraction; import org.neo4j.helpers.HostnamePort; +import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.api.security.AuthSubject; import org.neo4j.kernel.api.security.AuthenticationResult; import org.neo4j.kernel.impl.coreapi.InternalTransaction; import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; +import org.neo4j.test.TestEnterpriseGraphDatabaseFactory; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertFalse; @@ -69,12 +74,22 @@ public class BoltInteraction implements NeoInteractionLevel connectionFactory = SocketConnection::new; private final Neo4jWithSocket server; private Map subjects = new HashMap<>(); + private FileSystemAbstraction _fileSystem; EnterpriseAuthManager authManager; - public BoltInteraction( Neo4jWithSocket server ) throws IOException + BoltInteraction( Map, String> config ) throws IOException { - this.server = server; + TestEnterpriseGraphDatabaseFactory factory = new TestEnterpriseGraphDatabaseFactory(); + factory.setFileSystem( new EphemeralFileSystemAbstraction() ); + this.server = new Neo4jWithSocket( + factory, + settings -> { + settings.put( GraphDatabaseSettings.auth_enabled, "true" ); + settings.putAll( config ); + } ); + server.restartDatabase( r -> {} ); + this._fileSystem = factory.getFileSystem(); GraphDatabaseFacade db = (GraphDatabaseFacade) server.graphDatabaseService(); authManager = db.getDependencyResolver().resolveDependency( EnterpriseAuthManager.class ); } @@ -91,6 +106,12 @@ public GraphDatabaseFacade getLocalGraph() return (GraphDatabaseFacade) server.graphDatabaseService(); } + @Override + public FileSystemAbstraction fileSystem() + { + return _fileSystem; + } + @Override public InternalTransaction beginLocalTransactionAsUser( BoltSubject subject, KernelTransaction.Type txType ) throws Throwable diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedAuthScenariosInteractionTest.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedAuthScenariosInteractionTest.java index 0dde2d02dfaf5..3f94d924d95cd 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedAuthScenariosInteractionTest.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedAuthScenariosInteractionTest.java @@ -19,13 +19,16 @@ */ package org.neo4j.server.security.enterprise.auth; +import java.util.Map; + +import org.neo4j.graphdb.config.Setting; import org.neo4j.kernel.enterprise.api.security.EnterpriseAuthSubject; public class EmbeddedAuthScenariosInteractionTest extends AuthScenariosInteractionTestBase { @Override - protected NeoInteractionLevel setUpNeoServer() throws Throwable + protected NeoInteractionLevel setUpNeoServer( Map, String> config ) throws Throwable { - return new EmbeddedInteraction(); + return new EmbeddedInteraction( config ); } } diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedBuiltInProceduresTest.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedBuiltInProceduresTest.java index aecb88b36e125..02a42ad113961 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedBuiltInProceduresTest.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedBuiltInProceduresTest.java @@ -21,11 +21,15 @@ import org.neo4j.kernel.enterprise.api.security.EnterpriseAuthSubject; +import java.util.Map; + +import org.neo4j.graphdb.config.Setting; + public class EmbeddedBuiltInProceduresTest extends BuiltInProceduresInteractionTestBase { @Override - protected NeoInteractionLevel setUpNeoServer() throws Throwable + protected NeoInteractionLevel setUpNeoServer( Map, String> config ) throws Throwable { - return new EmbeddedInteraction(); + return new EmbeddedInteraction( config ); } } diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedInteraction.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedInteraction.java index fbe534835a417..c749728a2998b 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedInteraction.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/EmbeddedInteraction.java @@ -26,8 +26,11 @@ import org.neo4j.bolt.BoltKernelExtension; import org.neo4j.graphdb.ResourceIterator; import org.neo4j.graphdb.Result; +import org.neo4j.graphdb.config.Setting; import org.neo4j.graphdb.factory.GraphDatabaseBuilder; import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.graphdb.mockfs.EphemeralFileSystemAbstraction; +import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.security.AuthenticationResult; import org.neo4j.kernel.enterprise.api.security.EnterpriseAuthSubject; @@ -46,21 +49,36 @@ public class EmbeddedInteraction implements NeoInteractionLevel, String> config ) throws Throwable { - this(new TestEnterpriseGraphDatabaseFactory().newImpermanentDatabaseBuilder()); + TestEnterpriseGraphDatabaseFactory factory = new TestEnterpriseGraphDatabaseFactory(); + factory.setFileSystem( new EphemeralFileSystemAbstraction() ); + GraphDatabaseBuilder builder = factory.newImpermanentDatabaseBuilder(); + for ( Map.Entry,String> entry : config.entrySet() ) + { + builder.setConfig( entry.getKey(), entry.getValue() ); + } + this._fileSystem = factory.getFileSystem(); + + init( builder ); } public EmbeddedInteraction( GraphDatabaseBuilder builder ) throws Throwable + { + init( builder ); + } + + private void init( GraphDatabaseBuilder builder ) throws Throwable { builder.setConfig( boltConnector( "0" ).enabled, "true" ); builder.setConfig( boltConnector( "0" ).encryption_level, OPTIONAL.name() ); builder.setConfig( BoltKernelExtension.Settings.tls_key_file, NeoInteractionLevel.tempPath( "key", ".key" ) ); - builder.setConfig( BoltKernelExtension.Settings.tls_certificate_file, NeoInteractionLevel.tempPath( "cert", ".cert" ) ); + builder.setConfig( BoltKernelExtension.Settings.tls_certificate_file, + NeoInteractionLevel.tempPath( "cert", ".cert" ) ); builder.setConfig( GraphDatabaseSettings.auth_enabled, "true" ); builder.setConfig( GraphDatabaseSettings.auth_manager, "enterprise-auth-manager" ); - db = (GraphDatabaseFacade) builder.newGraphDatabase(); manager = db.getDependencyResolver().resolveDependency( MultiRealmAuthManager.class ); manager.init(); @@ -77,6 +95,12 @@ public EnterpriseUserManager getLocalUserManager() @Override public GraphDatabaseFacade getLocalGraph() { return db; } + @Override + public FileSystemAbstraction fileSystem() + { + return _fileSystem; + } + @Override public InternalTransaction beginLocalTransactionAsUser( EnterpriseAuthSubject subject, KernelTransaction.Type txType ) throws Throwable diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/NeoInteractionLevel.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/NeoInteractionLevel.java index 9fcba6be72213..c157646b025c5 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/NeoInteractionLevel.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/NeoInteractionLevel.java @@ -27,6 +27,7 @@ import org.neo4j.graphdb.ResourceIterator; import org.neo4j.kernel.api.KernelTransaction; +import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.kernel.impl.coreapi.InternalTransaction; import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; @@ -36,6 +37,8 @@ public interface NeoInteractionLevel GraphDatabaseFacade getLocalGraph(); + FileSystemAbstraction fileSystem(); + default InternalTransaction beginLocalTransactionAsUser( S subject ) throws Throwable { return beginLocalTransactionAsUser( subject, KernelTransaction.Type.explicit ); diff --git a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/ProcedureInteractionTestBase.java b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/ProcedureInteractionTestBase.java index 0be3996d1c507..b9b874d083850 100644 --- a/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/ProcedureInteractionTestBase.java +++ b/enterprise/security/src/test/java/org/neo4j/server/security/enterprise/auth/ProcedureInteractionTestBase.java @@ -23,7 +23,12 @@ import org.junit.Assert; import org.junit.Before; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @@ -31,12 +36,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.neo4j.bolt.v1.transport.integration.Neo4jWithSocket; import org.neo4j.bolt.v1.transport.integration.TransportTestUtil; import org.neo4j.bolt.v1.transport.socket.client.SocketConnection; import org.neo4j.bolt.v1.transport.socket.client.TransportConnection; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.graphdb.config.Setting; +import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.helpers.HostnamePort; import org.neo4j.kernel.api.security.exception.InvalidArgumentsException; import org.neo4j.kernel.impl.proc.Procedures; @@ -62,7 +68,6 @@ import static org.neo4j.bolt.v1.messaging.util.MessageMatchers.msgSuccess; import static org.neo4j.bolt.v1.transport.integration.TransportTestUtil.eventuallyReceives; import static org.neo4j.helpers.collection.MapUtil.map; -import static org.junit.Assert.assertTrue; import static org.neo4j.procedure.Mode.READ; import static org.neo4j.procedure.Mode.WRITE; import static org.neo4j.server.security.enterprise.auth.PredefinedRolesBuilder.ADMIN; @@ -106,11 +111,22 @@ String pwdReqErrMsg( String errMsg ) EnterpriseUserManager userManager; protected NeoInteractionLevel neo; + File securityLog; + + private Map,String> configure() throws IOException + { + Path homeDir = Files.createTempDirectory( "logs" ); + securityLog = new File( homeDir.toFile(), "security.log" ); + Map,String> config = new HashMap<>( 1 ); + config.put( GraphDatabaseSettings.logs_directory, homeDir.toAbsolutePath().toString() ); + return config; + } @Before public void setUp() throws Throwable { - neo = setUpNeoServer(); + neo = setUpNeoServer( configure() ); + neo.getLocalGraph().getDependencyResolver().resolveDependency( Procedures.class ) .registerProcedure( ClassWithProcedures.class ); userManager = neo.getLocalUserManager(); @@ -135,7 +151,7 @@ public void setUp() throws Throwable executeQuery( writeSubject, "UNWIND range(0,2) AS number CREATE (:Node {number:number, name:'node'+number})" ); } - protected abstract NeoInteractionLevel setUpNeoServer() throws Throwable; + protected abstract NeoInteractionLevel setUpNeoServer( Map, String> config ) throws Throwable; @After public void tearDown() throws Throwable diff --git a/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTAuthProceduresInteractionTest.java b/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTAuthProceduresInteractionTest.java index c4d49fe5739b3..37e67a793c307 100644 --- a/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTAuthProceduresInteractionTest.java +++ b/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTAuthProceduresInteractionTest.java @@ -19,9 +19,12 @@ */ package org.neo4j.server.rest.security; +import java.util.Map; + import org.junit.Rule; import org.neo4j.server.security.enterprise.auth.AuthProceduresInteractionTestBase; +import org.neo4j.graphdb.config.Setting; import org.neo4j.server.security.enterprise.auth.NeoInteractionLevel; import org.neo4j.test.rule.SuppressOutput; @@ -41,8 +44,8 @@ public RESTAuthProceduresInteractionTest() } @Override - public NeoInteractionLevel setUpNeoServer() throws Throwable + public NeoInteractionLevel setUpNeoServer( Map,String> config ) throws Throwable { - return new RESTInteraction(); + return new RESTInteraction( config ); } } diff --git a/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTAuthScenariosInteractionTest.java b/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTAuthScenariosInteractionTest.java index c2c6d32fb7d4a..db53bc4641bc7 100644 --- a/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTAuthScenariosInteractionTest.java +++ b/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTAuthScenariosInteractionTest.java @@ -19,9 +19,12 @@ */ package org.neo4j.server.rest.security; +import java.util.Map; + import org.junit.Rule; import org.neo4j.server.security.enterprise.auth.AuthScenariosInteractionTestBase; +import org.neo4j.graphdb.config.Setting; import org.neo4j.server.security.enterprise.auth.NeoInteractionLevel; import org.neo4j.test.rule.SuppressOutput; @@ -41,8 +44,8 @@ public RESTAuthScenariosInteractionTest() } @Override - protected NeoInteractionLevel setUpNeoServer() throws Throwable + protected NeoInteractionLevel setUpNeoServer( Map,String> config ) throws Throwable { - return new RESTInteraction(); + return new RESTInteraction( config ); } } diff --git a/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTInteraction.java b/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTInteraction.java index 94f81e0c56992..a5351597e9594 100644 --- a/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTInteraction.java +++ b/enterprise/server-enterprise/src/test/java/org/neo4j/server/rest/security/RESTInteraction.java @@ -36,12 +36,16 @@ import org.neo4j.bolt.BoltKernelExtension; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.graphdb.config.Setting; import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.io.fs.DefaultFileSystemAbstraction; +import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.security.AuthSubject; import org.neo4j.kernel.impl.coreapi.InternalTransaction; import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; import org.neo4j.server.enterprise.helpers.EnterpriseServerBuilder; +import org.neo4j.server.helpers.CommunityServerBuilder; import org.neo4j.server.rest.domain.JsonHelper; import org.neo4j.server.rest.domain.JsonParseException; import org.neo4j.server.security.enterprise.auth.EnterpriseAuthManager; @@ -54,6 +58,7 @@ import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; + import static org.neo4j.graphdb.factory.GraphDatabaseSettings.BoltConnector.EncryptionLevel.OPTIONAL; import static org.neo4j.graphdb.factory.GraphDatabaseSettings.boltConnector; import static org.neo4j.kernel.api.security.AuthToken.newBasicAuthToken; @@ -65,10 +70,14 @@ class RESTInteraction extends CommunityServerTestBase implements NeoInteractionL EnterpriseAuthManager authManager; - RESTInteraction() throws IOException + RESTInteraction( Map,String> config ) throws IOException { - server = EnterpriseServerBuilder.server() - .withProperty( boltConnector( "0" ).enabled.name(), "true" ) + CommunityServerBuilder builder = EnterpriseServerBuilder.server(); + for ( Map.Entry,String> entry : config.entrySet() ) + { + builder = builder.withProperty( entry.getKey().name(), entry.getValue() ); + } + this.server = builder.withProperty( boltConnector( "0" ).enabled.name(), "true" ) .withProperty( boltConnector( "0" ).encryption_level.name(), OPTIONAL.name() ) .withProperty( BoltKernelExtension.Settings.tls_key_file.name(), NeoInteractionLevel.tempPath( "key", ".key" ) ) @@ -77,8 +86,8 @@ class RESTInteraction extends CommunityServerTestBase implements NeoInteractionL .withProperty( GraphDatabaseSettings.auth_enabled.name(), Boolean.toString( true ) ) .withProperty( GraphDatabaseSettings.auth_manager.name(), "enterprise-auth-manager" ) .build(); - server.start(); - authManager = server.getDependencyResolver().resolveDependency( EnterpriseAuthManager.class ); + this.server.start(); + authManager = this.server.getDependencyResolver().resolveDependency( EnterpriseAuthManager.class ); } @Override @@ -94,8 +103,14 @@ public GraphDatabaseFacade getLocalGraph() } @Override - public InternalTransaction beginLocalTransactionAsUser( RESTSubject subject, KernelTransaction.Type txType ) throws - Throwable + public FileSystemAbstraction fileSystem() + { + return new DefaultFileSystemAbstraction(); + } + + @Override + public InternalTransaction beginLocalTransactionAsUser( RESTSubject subject, KernelTransaction.Type txType ) + throws Throwable { AuthSubject authSubject = authManager.login( newBasicAuthToken( subject.username, subject.password ) ); return getLocalGraph().beginTransaction( txType, authSubject );