Skip to content

Commit 3345062

Browse files
authored
Update Permission and Frozen filters to support Indices (#1912)
* WIP for efficient row permission filtering * WIP for efficient row permission filtering * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Work In Progress * #1756 Final part * #1756 Polish
1 parent 43efd88 commit 3345062

35 files changed

+1663
-642
lines changed

benchmark/src/main/java/org/finos/vuu/benchmark/BenchmarkHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.finos.vuu.api.Index;
99
import org.finos.vuu.api.Indices;
1010
import org.finos.vuu.api.TableDef;
11+
import org.finos.vuu.core.filter.type.AllowAllPermissionFilter$;
1112
import org.finos.vuu.core.table.Column;
1213
import org.finos.vuu.core.table.Columns;
1314
import org.finos.vuu.core.table.InMemDataTable;
@@ -85,6 +86,7 @@ public TreeBuilder createTreeBuilder(InMemDataTable table) {
8586
Option.empty(),
8687
Option.empty(),
8788
BuildEntireTree.apply(groupByTable, Option.empty()),
89+
AllowAllPermissionFilter$.MODULE$,
8890
Option.empty(),
8991
clock);
9092
}

example/permission/src/main/scala/org/finos/vuu/core/module/auths/OrderPermissionChecker.scala

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,22 @@ package org.finos.vuu.core.module.auths
33
import org.finos.toolbox.lifecycle.{DefaultLifecycleEnabled, LifecycleContainer}
44
import org.finos.toolbox.thread.LifeCycleRunner
55
import org.finos.toolbox.time.Clock
6-
import org.finos.vuu.core.auths.RowPermissionChecker
6+
import org.finos.vuu.core.filter.`type`.PermissionFilter
77
import org.finos.vuu.core.module.auths.PermissionModule.ColumnNames.Bitmask
8-
import org.finos.vuu.core.table.{RowData, RowWithData, TableContainer}
9-
import org.finos.vuu.viewport.ViewPort
8+
import org.finos.vuu.core.table.{RowData, RowWithData, TableContainer, TablePrimaryKeys}
9+
import org.finos.vuu.viewport.{RowSource, ViewPort}
1010

11-
class OrderPermissionChecker(val vp: ViewPort, tableContainer: TableContainer)(implicit lifecycle: LifecycleContainer, clock: Clock) extends DefaultLifecycleEnabled with RowPermissionChecker {
11+
class OrderPermissionChecker(val vp: ViewPort, tableContainer: TableContainer)(using lifecycle: LifecycleContainer, clock: Clock)
12+
extends DefaultLifecycleEnabled with PermissionFilter {
1213

13-
val reloadPermissionsThread = new LifeCycleRunner("reloadPermissions", runOnce, minCycleTime = 5_000)
14+
private val reloadPermissionsThread = new LifeCycleRunner("reloadPermissions", runOnce, minCycleTime = 5_000)
15+
private val permissionTable = tableContainer.getTable("permission")
16+
private val filter = PermissionFilter(f => canSeeRow(f))
17+
@volatile private var permissionUserMask = PermissionSet.NoPermissions
1418

1519
lifecycle(this).dependsOn(reloadPermissionsThread)
16-
1720
reloadPermissionsThread.doStart()
1821

19-
private val permissionTable = tableContainer.getTable("permission")
20-
@volatile private var permissionUserMask = PermissionSet.NoPermissions
21-
2222
def runOnce(): Unit = {
2323
val user = vp.user.name
2424
permissionUserMask = permissionTable.asTable.pullRow(user) match {
@@ -38,12 +38,17 @@ class OrderPermissionChecker(val vp: ViewPort, tableContainer: TableContainer)(i
3838
reloadPermissionsThread.doStop()
3939
}
4040

41-
override def canSeeRow(row: RowData): Boolean = {
41+
override def hashCode(): Int = {
42+
37 * vp.id.hashCode + permissionUserMask
43+
}
44+
45+
override def doFilter(source: RowSource, primaryKeys: TablePrimaryKeys, firstInChain: Boolean): TablePrimaryKeys = {
46+
filter.doFilter(source, primaryKeys, firstInChain)
47+
}
48+
49+
private def canSeeRow(row: RowData): Boolean = {
4250
val mask = row.get("mask").asInstanceOf[Int]
4351
PermissionSet.hasRole(permissionUserMask, mask)
4452
}
4553

46-
override def hashCode(): Int = {
47-
37 * vp.id.hashCode + permissionUserMask
48-
}
4954
}

example/permission/src/test/scala/org/finos/vuu/core/module/auths/TestFriendlyPermissionChecker.scala

Lines changed: 0 additions & 29 deletions
This file was deleted.

vuu/src/main/scala/org/finos/vuu/api/TableDef.scala

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.finos.vuu.api
22

3-
import org.finos.vuu.core.auths.RowPermissionChecker
3+
import org.finos.vuu.core.filter.`type`.{AllowAllPermissionFilter, PermissionFilter}
44
import org.finos.vuu.core.module.ViewServerModule
55
import org.finos.vuu.core.table.DefaultColumnNames.{CreatedTimeColumnName, LastUpdatedTimeColumnName}
6-
import org.finos.vuu.core.table._
6+
import org.finos.vuu.core.table.*
77
import org.finos.vuu.feature.inmem.VuuInMemPluginLocator
88
import org.finos.vuu.viewport.ViewPort
99

@@ -151,23 +151,19 @@ class TableDef(val name: String,
151151
private val updatedTimeColumn: SimpleColumn = SimpleColumn(LastUpdatedTimeColumnName, customColumns.length + 1, DataType.fromString("long"))
152152
val columns: Array[Column] = customColumns ++ Array(createdTimeColumn, updatedTimeColumn)
153153

154-
private var module: ViewServerModule = null;
155-
private var permissionFunc: (ViewPort, TableContainer) => RowPermissionChecker = null
156-
157-
def withPermissions(func: (ViewPort, TableContainer) => RowPermissionChecker): TableDef = {
154+
private var module: ViewServerModule = null
155+
156+
private var permissionFunc: (ViewPort, TableContainer) => PermissionFilter = (_, _) => AllowAllPermissionFilter
157+
158+
def withPermissions(func: (ViewPort, TableContainer) => PermissionFilter): TableDef = {
158159
permissionFunc = func
159160
this
160161
}
161162

162-
def permissionChecker(viewPort: ViewPort, tableContainer: TableContainer): Option[RowPermissionChecker] = {
163-
if (permissionFunc != null) {
164-
Some(permissionFunc(viewPort, tableContainer))
165-
} else {
166-
None
167-
}
163+
def permissionFilter(viewPort: ViewPort, tableContainer: TableContainer): PermissionFilter = {
164+
permissionFunc.apply(viewPort, tableContainer)
168165
}
169166

170-
171167
def deleteColumnName() = s"$name._isDeleted"
172168

173169
def columnForName(name: String): Column = {
@@ -219,7 +215,7 @@ case class JoinTableDef(
219215

220216
override def toString: String = s"JoinTableDef(name=$name)"
221217

222-
override def withPermissions(func: (ViewPort, TableContainer) => RowPermissionChecker): JoinTableDef = {
218+
override def withPermissions(func: (ViewPort, TableContainer) => PermissionFilter): JoinTableDef = {
223219
super.withPermissions(func)
224220
this
225221
}

vuu/src/main/scala/org/finos/vuu/core/auths/RowPermissionChecker.scala

Lines changed: 0 additions & 7 deletions
This file was deleted.

vuu/src/main/scala/org/finos/vuu/core/auths/VuuUser.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ object VuuUser {
3131
}
3232

3333
case class VuuUserImpl(name: String,
34-
expiry: Instant,
35-
authorizations: Set[String]) extends VuuUser {
34+
expiry: Instant,
35+
authorizations: Set[String]) extends VuuUser {
3636

3737
override def withAuthorizations(authorizations: Set[String]): VuuUser = this.copy(authorizations = authorizations)
3838

0 commit comments

Comments
 (0)