From 5dfffe66e7fe1be521215dd241a2f1b6abe7fb61 Mon Sep 17 00:00:00 2001 From: uhensler <urs.hensler@frentix.com> Date: Thu, 8 Aug 2019 11:01:57 +0200 Subject: [PATCH] OO-4172: Use different, parallel existing access tokens for read and edit A user needs to open a file in in both mode simultaneously. --- .../services/doceditor/wopi/manager/AccessDAO.java | 4 +++- .../services/doceditor/wopi/manager/WopiServiceImpl.java | 3 +-- .../services/doceditor/wopi/manager/AccessDAOTest.java | 8 +++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/AccessDAO.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/AccessDAO.java index 3dc9e7ba586..b733dbb07bc 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/AccessDAO.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/AccessDAO.java @@ -96,7 +96,7 @@ class AccessDAO { return accesses.isEmpty() ? null : accesses.get(0); } - Access loadAccess(VFSMetadata metadata, Identity identity, String app) { + Access loadAccess(VFSMetadata metadata, Identity identity, String app, boolean canEdit) { if (metadata == null || identity == null) return null; QueryBuilder sb = new QueryBuilder(); @@ -107,12 +107,14 @@ class AccessDAO { sb.and().append("access.metadata.key = :metadataKey"); sb.and().append("access.identity.key = :identityKey"); sb.and().append("access.app = :app"); + sb.and().append("access.canEdit = :canEdit"); List<Access> accesses = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Access.class) .setParameter("metadataKey", metadata.getKey()) .setParameter("identityKey", identity.getKey()) .setParameter("app", app) + .setParameter("canEdit", canEdit) .getResultList(); return accesses.isEmpty() ? null : accesses.get(0); } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImpl.java index 7f67adbe47e..1083fcecef8 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImpl.java @@ -121,7 +121,7 @@ public class WopiServiceImpl implements WopiService { @Override public Access getOrCreateAccess(VFSMetadata vfsMetadata, Identity identity, DocEditorSecurityCallback secCallback, String app, Date expiresAt) { - Access access = accessDao.loadAccess(vfsMetadata, identity, app); + Access access = accessDao.loadAccess(vfsMetadata, identity, app, getCanEdit(secCallback)); if (access != null) { if (accessUnchanged(access, secCallback) && !expired(access)) { access = accessDao.updateExpiresAt(access, expiresAt); @@ -135,7 +135,6 @@ public class WopiServiceImpl implements WopiService { } private boolean accessUnchanged(Access access, DocEditorSecurityCallback secCallback) { - if (access.isCanEdit() != getCanEdit(secCallback)) return false; if (access.isCanClose() != secCallback.canClose()) return false; if (access.isVersionControlled() != secCallback.isVersionControlled()) return false; return true; diff --git a/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/AccessDAOTest.java b/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/AccessDAOTest.java index be60bd20a13..dce53cbeecb 100644 --- a/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/AccessDAOTest.java +++ b/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/AccessDAOTest.java @@ -126,11 +126,13 @@ public class AccessDAOTest extends OlatTestCase { Identity identity2 = JunitTestHelper.createAndPersistIdentityAsRndUser("wopi2"); VFSMetadata vfsMetadata = vfsMetadataDAO.createMetadata(random(), "relPath", "file.name", new Date(), 1000l, false, "", "file", null); String app = random(); - Access access = sut.createAccess(vfsMetadata, identity, app, random(), true, true, true, null); - sut.createAccess(vfsMetadata, identity2, app, random(), true, true, true, null); + boolean canEdit = true; + Access access = sut.createAccess(vfsMetadata, identity, app, random(), canEdit, true, true, null); + sut.createAccess(vfsMetadata, identity2, app, random(), canEdit, true, true, null); + sut.createAccess(vfsMetadata, identity, app, random(), !canEdit, true, true, null); dbInstance.commitAndCloseSession(); - Access reloadedAccess = sut.loadAccess(vfsMetadata, identity, app); + Access reloadedAccess = sut.loadAccess(vfsMetadata, identity, app, canEdit); assertThat(reloadedAccess).isEqualTo(access); } -- GitLab