From 8ac5cfdefb4fb0371ad1431c9316c9d422978b81 Mon Sep 17 00:00:00 2001 From: Mikhaylo Demianenko Date: Mon, 1 Aug 2016 01:28:57 +0200 Subject: [PATCH] Update auth procedures to use newly introduced transaction handles. --- .../kernel/api/KernelTransactionHandle.java | 19 ++++++++++++++ .../api/KernelTransactionImplementation.java | 2 +- ...KernelTransactionImplementationHandle.java | 26 +++++++++++++++++++ .../impl/api/TestKernelTransactionHandle.java | 20 ++++++++++++++ .../enterprise/auth/AuthProcedures.java | 10 +++---- 5 files changed, 71 insertions(+), 6 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransactionHandle.java b/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransactionHandle.java index 70d3d38b2c16c..45c897bb0de20 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransactionHandle.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransactionHandle.java @@ -19,6 +19,8 @@ */ package org.neo4j.kernel.api; +import java.util.Optional; + import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.api.security.AccessMode; import org.neo4j.kernel.impl.api.Kernel; @@ -64,4 +66,21 @@ public interface KernelTransactionHandle * @param reason the reason for termination. */ void markForTermination( Status reason ); + + /** + * Access mode of underlying transaction that transaction has when handle was created. + * + * @return underlying transaction access mode + */ + AccessMode mode(); + + /** + * Transaction termination reason that transaction had when handle was created. + * + * @return transaction termination reason. + */ + Optional terminationReason(); + + // TODO: remove + boolean isSameTransaction( KernelTransaction tx ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java index 12ca7ff7c488b..0df3c729d3b24 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java @@ -144,7 +144,7 @@ TransactionWriteState upgradeToSchemaWrites() throws InvalidTransactionTypeKerne private final KernelStatement currentStatement; private final StorageStatement storageStatement; private final List closeListeners = new ArrayList<>( 2 ); - private AccessMode accessMode; + private volatile AccessMode accessMode; private volatile Locks.Client locks; private boolean beforeHookInvoked; private volatile boolean closing, closed; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementationHandle.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementationHandle.java index 6233dbc3a28b3..26ef478885c2a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementationHandle.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementationHandle.java @@ -19,8 +19,12 @@ */ package org.neo4j.kernel.impl.api; +import java.util.Optional; + +import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.KernelTransactionHandle; import org.neo4j.kernel.api.exceptions.Status; +import org.neo4j.kernel.api.security.AccessMode; /** * A {@link KernelTransactionHandle} that wraps the given {@link KernelTransactionImplementation}. @@ -35,6 +39,8 @@ class KernelTransactionImplementationHandle implements KernelTransactionHandle private final long lastTransactionTimestampWhenStarted; private final long localStartTime; private final KernelTransactionImplementation tx; + private final AccessMode mode; + private final Status terminationReason; KernelTransactionImplementationHandle( KernelTransactionImplementation tx ) { @@ -42,6 +48,8 @@ class KernelTransactionImplementationHandle implements KernelTransactionHandle this.lastTransactionIdWhenStarted = tx.lastTransactionIdWhenStarted(); this.lastTransactionTimestampWhenStarted = tx.lastTransactionTimestampWhenStarted(); this.localStartTime = tx.localStartTime(); + this.mode = tx.mode(); + this.terminationReason = tx.getReasonIfTerminated(); this.tx = tx; } @@ -75,6 +83,24 @@ public void markForTermination( Status reason ) tx.markForTermination( txReuseCount, reason ); } + @Override + public AccessMode mode() + { + return mode; + } + + @Override + public Optional terminationReason() + { + return Optional.ofNullable( terminationReason ); + } + + @Override + public boolean isSameTransaction( KernelTransaction tx ) + { + return this.tx == tx; + } + @Override public boolean equals( Object o ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/TestKernelTransactionHandle.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/TestKernelTransactionHandle.java index 5947424b710d3..f47f8ebb97da4 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/TestKernelTransactionHandle.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/TestKernelTransactionHandle.java @@ -20,10 +20,12 @@ package org.neo4j.kernel.impl.api; import java.util.Objects; +import java.util.Optional; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.KernelTransactionHandle; import org.neo4j.kernel.api.exceptions.Status; +import org.neo4j.kernel.api.security.AccessMode; /** * A test implementation of {@link KernelTransactionHandle} that simply wraps a given {@link KernelTransaction}. @@ -67,6 +69,24 @@ public void markForTermination( Status reason ) tx.markForTermination( reason ); } + @Override + public AccessMode mode() + { + return tx.mode(); + } + + @Override + public Optional terminationReason() + { + return Optional.ofNullable( tx.getReasonIfTerminated() ); + } + + @Override + public boolean isSameTransaction( KernelTransaction tx ) + { + return false; + } + @Override public boolean equals( Object o ) { diff --git a/enterprise/security/src/main/java/org/neo4j/server/security/enterprise/auth/AuthProcedures.java b/enterprise/security/src/main/java/org/neo4j/server/security/enterprise/auth/AuthProcedures.java index 280e553bed6f7..5f50aeed8adf4 100644 --- a/enterprise/security/src/main/java/org/neo4j/server/security/enterprise/auth/AuthProcedures.java +++ b/enterprise/security/src/main/java/org/neo4j/server/security/enterprise/auth/AuthProcedures.java @@ -29,7 +29,7 @@ import org.neo4j.graphdb.security.AuthorizationViolationException; import org.neo4j.kernel.api.KernelTransaction; - +import org.neo4j.kernel.api.KernelTransactionHandle; import org.neo4j.kernel.api.bolt.HaltableUserSession; import org.neo4j.kernel.api.bolt.SessionTracker; import org.neo4j.kernel.api.exceptions.Status; @@ -206,7 +206,7 @@ public Stream listTransactions() return countTransactionByUsername( getActiveTransactions().stream() - .filter( tx -> tx.getReasonIfTerminated() == null ) + .filter( tx -> !tx.terminationReason().isPresent() ) .map( tx -> tx.mode().name() ) ); } @@ -253,9 +253,9 @@ public Stream terminateSessionsForUser( @Name( "username" ) Strin private Stream terminateTransactionsForValidUser( String username ) { Long killCount = 0L; - for ( KernelTransaction tx : getActiveTransactions() ) + for ( KernelTransactionHandle tx : getActiveTransactions() ) { - if ( tx.mode().name().equals( username ) && tx != this.tx ) + if ( tx.mode().name().equals( username ) && !tx.isSameTransaction( this.tx) ) { tx.markForTermination( Status.Transaction.Terminated ); killCount += 1; @@ -279,7 +279,7 @@ private Stream terminateSessionsForValidUser( String username ) return Stream.of( new SessionResult( username, killCount ) ); } - private Set getActiveTransactions() + private Set getActiveTransactions() { return graph.getDependencyResolver().resolveDependency( KernelTransactions.class ).activeTransactions(); }