Skip to content

Commit da25835

Browse files
committed
feat(model-server): persist access control data into database
1 parent 93cd0be commit da25835

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.modelix.model.server
2+
3+
import kotlinx.serialization.encodeToString
4+
import kotlinx.serialization.json.Json
5+
import org.modelix.authorization.permissions.AccessControlData
6+
import org.modelix.authorization.permissions.IAccessControlPersistence
7+
import org.modelix.model.server.store.IGenericStoreClient
8+
import org.modelix.model.server.store.RequiresTransaction
9+
10+
class DBAccessControlPersistence<E>(val store: IGenericStoreClient<E>, val key: E) : IAccessControlPersistence {
11+
private val json = Json { ignoreUnknownKeys }
12+
override fun read(): AccessControlData {
13+
@OptIn(RequiresTransaction::class)
14+
return store.runReadTransaction {
15+
store.get(key)?.let { json.decodeFromString(it) } ?: AccessControlData()
16+
}
17+
}
18+
19+
override fun update(updater: (AccessControlData) -> AccessControlData) {
20+
@OptIn(RequiresTransaction::class)
21+
return store.runWriteTransaction {
22+
val oldData = read()
23+
val newData = updater(oldData)
24+
if (oldData == newData) return@runWriteTransaction
25+
store.put(key, json.encodeToString(newData))
26+
}
27+
}
28+
}

model-server/src/main/kotlin/org/modelix/model/server/Main.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import org.modelix.model.server.handlers.ui.RepositoryOverview
5858
import org.modelix.model.server.store.IgniteStoreClient
5959
import org.modelix.model.server.store.InMemoryStoreClient
6060
import org.modelix.model.server.store.IsolatingStore
61+
import org.modelix.model.server.store.ObjectInRepository
6162
import org.modelix.model.server.store.RequiresTransaction
6263
import org.modelix.model.server.store.forGlobalRepository
6364
import org.modelix.model.server.store.loadDump
@@ -181,6 +182,10 @@ object Main {
181182
install(ModelixAuthorization) {
182183
permissionSchema = ModelServerPermissionSchema.SCHEMA
183184
installStatusPages = false
185+
accessControlPersistence = DBAccessControlPersistence(
186+
storeClient,
187+
ObjectInRepository.global(RepositoriesManager.KEY_PREFIX + ":access-control-data"),
188+
)
184189
}
185190
install(ForwardedHeaders)
186191
install(CallLogging) {

0 commit comments

Comments
 (0)