package jnpf.dmsController.permission; import cn.dev33.satoken.same.SaSameUtil; import jnpf.dmsController.DmsControllerTestSupport; import jnpf.dmsEntity.permission.form.DocumentCreateForm; import jnpf.dmsEntity.download.form.DmsWorkflowDownloadAuthorizeForm; import jnpf.dmsEntity.download.vo.DmsWorkflowDownloadAuthorizationVO; import jnpf.dmsEntity.print.form.DmsWorkflowPrintAuthorizeForm; import jnpf.dmsEntity.print.form.DmsWorkflowPrintFilesGrantForm; import jnpf.dmsEntity.print.vo.DmsWorkflowPrintAuthorizationVO; import jnpf.dmsEntity.print.vo.DmsWorkflowPrintFilesGrantResultVO; import jnpf.dmsEntity.permission.form.FileVersionCreateForm; import jnpf.dmsEntity.permission.form.FolderCreateForm; import jnpf.dmsEntity.permission.form.DmsPersonalFolderBorrowForm; import jnpf.dmsEntity.permission.form.DmsPersonalFolderDownloadForm; import jnpf.dmsEntity.permission.vo.DmsPersonalFolderAddResultVO; import jnpf.dmsEntity.permission.vo.DmsPermissionResourceVO; import jnpf.dmsEntity.storage.form.DmsFileLifecycleUpdateForm; import jnpf.dmsEntity.storage.form.DmsFileRevisionRegisterForm; import jnpf.dmsEntity.storage.form.DmsFileUploadRegisterForm; import jnpf.dmsEntity.storage.form.DmsWorkflowFilePrepareForm; import jnpf.dmsEntity.storage.form.DmsWorkflowFileActivateForm; import jnpf.dmsEntity.storage.form.DmsApprovedRegistrationCallback; import jnpf.dmsEntity.storage.form.DmsWorkflowRevisionRegisterForm; import jnpf.dmsEntity.storage.vo.DmsFileLifecycleUpdateVO; import jnpf.dmsEntity.storage.vo.DmsFileUploadVO; import jnpf.dmsEntity.storage.approval.DmsApprovedBatch; import jnpf.dmsEntity.storage.vo.DmsWorkflowFilePrepareVO; import jnpf.dmsPermission.DmsTrustedServiceGuard; import jnpf.dmsPermission.DmsCurrentIdentity; import jnpf.base.UserInfo; import jnpf.dmsService.DmsFileLifecycleService; import jnpf.dmsService.DmsFileRevisionService; import jnpf.dmsService.DmsFileUploadService; import jnpf.dmsService.DmsPersonalFolderService; import jnpf.dmsService.DmsResourceService; import jnpf.dmsService.DmsWorkflowFilePrepareService; import jnpf.dmsService.DmsApprovedFlowService; import jnpf.dmsService.DmsWorkflowFileRegistrationService; import jnpf.dmsService.DmsWorkflowFileActivationService; import jnpf.dmsService.DmsWorkflowDownloadAuthorizationService; import jnpf.dmsService.DmsWorkflowPrintAuthorizationService; import org.junit.jupiter.api.Test; import org.mockito.InOrder; import org.mockito.MockedStatic; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; class DmsInternalResourceControllerTest extends DmsControllerTestSupport { private final DmsTrustedServiceGuard trustedServiceGuard = mock(DmsTrustedServiceGuard.class); private final DmsResourceService resourceService = mock(DmsResourceService.class); private final DmsFileUploadService uploadService = mock(DmsFileUploadService.class); private final DmsFileRevisionService revisionService = mock(DmsFileRevisionService.class); private final DmsFileLifecycleService lifecycleService = mock(DmsFileLifecycleService.class); private final DmsWorkflowFilePrepareService workflowFilePrepareService = mock(DmsWorkflowFilePrepareService.class); private final DmsWorkflowFileRegistrationService workflowRegistrationService = mock(DmsWorkflowFileRegistrationService.class); private final DmsWorkflowFileActivationService workflowActivationService = mock(DmsWorkflowFileActivationService.class); private final DmsWorkflowDownloadAuthorizationService workflowDownloadAuthorizationService = mock(DmsWorkflowDownloadAuthorizationService.class); private final DmsWorkflowPrintAuthorizationService workflowPrintAuthorizationService = mock(DmsWorkflowPrintAuthorizationService.class); private final DmsApprovedFlowService approvedFlowService = mock(DmsApprovedFlowService.class); private final DmsPersonalFolderService personalFolderService = mock(DmsPersonalFolderService.class); private final DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class); private final DmsInternalResourceController controller = new DmsInternalResourceController( trustedServiceGuard, resourceService, uploadService, revisionService, lifecycleService, workflowFilePrepareService, approvedFlowService, workflowRegistrationService, workflowActivationService, workflowDownloadAuthorizationService, workflowPrintAuthorizationService, personalFolderService, currentIdentity); @Test void protectsAndDelegatesEveryInternalRegistrationApi() { String requestedServiceId = "jnpf-file"; String trustedServiceId = "trusted-jnpf-file"; FolderCreateForm folderForm = mock(FolderCreateForm.class); DocumentCreateForm documentForm = mock(DocumentCreateForm.class); FileVersionCreateForm versionForm = mock(FileVersionCreateForm.class); DmsFileLifecycleUpdateForm lifecycleForm = mock(DmsFileLifecycleUpdateForm.class); DmsFileUploadRegisterForm uploadForm = mock(DmsFileUploadRegisterForm.class); DmsFileRevisionRegisterForm revisionForm = mock(DmsFileRevisionRegisterForm.class); DmsWorkflowFilePrepareForm prepareForm = mock(DmsWorkflowFilePrepareForm.class); DmsApprovedRegistrationCallback workflowUpload = mock(DmsApprovedRegistrationCallback.class); DmsWorkflowRevisionRegisterForm workflowRevision = mock(DmsWorkflowRevisionRegisterForm.class); DmsWorkflowFileActivateForm activationForm = new DmsWorkflowFileActivateForm(); activationForm.setSourceId("flow-1"); activationForm.setTaskId("task-1"); activationForm.setFileType(jnpf.dmsEntity.storage.enums.DmsWorkflowFileType.CREATE); DmsWorkflowDownloadAuthorizeForm downloadForm = new DmsWorkflowDownloadAuthorizeForm(); downloadForm.setSourceId("flow-1"); downloadForm.setTaskId("task-1"); DmsWorkflowPrintAuthorizeForm printForm = new DmsWorkflowPrintAuthorizeForm(); printForm.setSourceId("flow-1"); printForm.setTaskId("task-1"); DmsWorkflowPrintFilesGrantForm printFilesForm = mock(DmsWorkflowPrintFilesGrantForm.class); DmsWorkflowPrintFilesGrantResultVO printFilesResult = new DmsWorkflowPrintFilesGrantResultVO(1, 1); DmsPersonalFolderBorrowForm borrowForm = mock(DmsPersonalFolderBorrowForm.class); DmsPersonalFolderDownloadForm personalDownloadForm = mock(DmsPersonalFolderDownloadForm.class); DmsPersonalFolderAddResultVO borrowResult = new DmsPersonalFolderAddResultVO(1, 1); DmsPersonalFolderAddResultVO personalDownloadResult = new DmsPersonalFolderAddResultVO(1, 1); DmsPermissionResourceVO folder = mock(DmsPermissionResourceVO.class); DmsPermissionResourceVO document = mock(DmsPermissionResourceVO.class); DmsPermissionResourceVO version = mock(DmsPermissionResourceVO.class); DmsFileLifecycleUpdateVO lifecycle = mock(DmsFileLifecycleUpdateVO.class); DmsFileUploadVO upload = mock(DmsFileUploadVO.class); DmsFileUploadVO revision = mock(DmsFileUploadVO.class); DmsFileUploadVO activated = mock(DmsFileUploadVO.class); DmsWorkflowFilePrepareVO prepared = mock(DmsWorkflowFilePrepareVO.class); DmsApprovedBatch registered = mock(DmsApprovedBatch.class); DmsWorkflowDownloadAuthorizationVO authorized = mock(DmsWorkflowDownloadAuthorizationVO.class); DmsWorkflowPrintAuthorizationVO printAuthorized = mock(DmsWorkflowPrintAuthorizationVO.class); AtomicBoolean sameTokenChecked = new AtomicBoolean(); when(trustedServiceGuard.requireAllowed(requestedServiceId)).thenAnswer(invocation -> { assertTrue(sameTokenChecked.getAndSet(false), "SAME-TOKEN must be checked before service ID"); return trustedServiceId; }); when(resourceService.createFolder(folderForm, trustedServiceId)).thenReturn(folder); when(resourceService.createDocument(documentForm, trustedServiceId)).thenReturn(document); when(resourceService.createFileVersion(versionForm, trustedServiceId)).thenReturn(version); when(lifecycleService.updateExpired(lifecycleForm, trustedServiceId)).thenReturn(lifecycle); when(uploadService.register(uploadForm, trustedServiceId)).thenReturn(upload); when(revisionService.register(revisionForm, trustedServiceId)).thenReturn(revision); when(workflowFilePrepareService.prepare(prepareForm, trustedServiceId)).thenReturn(prepared); when(approvedFlowService.completeRegistration(workflowUpload, trustedServiceId)).thenReturn(registered); when(workflowRegistrationService.revise(workflowRevision, trustedServiceId)).thenReturn(revision); UserInfo user = new UserInfo(); user.setUserId("user-1"); when(currentIdentity.requireUser()).thenReturn(user); when(currentIdentity.tenantId(user)).thenReturn("tenant-1"); when(workflowActivationService.activate("tenant-1", "flow-1", "task-1", activationForm.getFileType(), "user-1")).thenReturn(activated); when(workflowDownloadAuthorizationService.authorize( "tenant-1", downloadForm, trustedServiceId)).thenReturn(authorized); when(workflowPrintAuthorizationService.authorize( "tenant-1", printForm, trustedServiceId)).thenReturn(printAuthorized); when(personalFolderService.addBorrowSnapshots(borrowForm, trustedServiceId)) .thenReturn(borrowResult); when(personalFolderService.addDownloadSnapshots(personalDownloadForm, trustedServiceId)) .thenReturn(personalDownloadResult); when(personalFolderService.grantPrintPermissions(printFilesForm, trustedServiceId)) .thenReturn(printFilesResult); try (MockedStatic sameToken = mockStatic(SaSameUtil.class)) { sameToken.when(SaSameUtil::checkCurrentRequestToken).thenAnswer(invocation -> { sameTokenChecked.set(true); return null; }); assertSame(folder, controller.createFolder(requestedServiceId, folderForm).getData()); assertSame(borrowResult, controller.addBorrowedFilesToPersonalFolder( requestedServiceId, borrowForm).getData()); assertSame(personalDownloadResult, controller.addDownloadedFilesToPersonalFolder( requestedServiceId, personalDownloadForm).getData()); assertSame(document, controller.createDocument(requestedServiceId, documentForm).getData()); assertSame(version, controller.createFileVersion(requestedServiceId, versionForm).getData()); assertSame(lifecycle, controller.updateFileLifecycle( requestedServiceId, lifecycleForm).getData()); assertSame(upload, controller.registerUpload( requestedServiceId, "audit-sign-1", uploadForm).getData()); assertSame(revision, controller.registerRevision( requestedServiceId, "audit-sign-1", revisionForm).getData()); assertSame(prepared, controller.prepareWorkflowFile( requestedServiceId, prepareForm).getData()); assertSame(registered, controller.registerWorkflowUpload( requestedServiceId, "audit-sign-1", workflowUpload).getData()); assertSame(revision, controller.registerWorkflowRevision( requestedServiceId, "audit-sign-1", workflowRevision).getData()); assertSame(activated, controller.activateWorkflowFile( requestedServiceId, activationForm).getData()); assertSame(authorized, controller.authorizeWorkflowDownload( requestedServiceId, "audit-sign-1", downloadForm).getData()); assertEquals("audit-sign-1", downloadForm.getBizSign()); assertSame(printAuthorized, controller.authorizeWorkflowPrint( requestedServiceId, "print-sign-1", printForm).getData()); assertEquals("print-sign-1", printForm.getBizSign()); assertSame(printFilesResult, controller.grantWorkflowPrintFiles( requestedServiceId, printFilesForm).getData()); sameToken.verify(SaSameUtil::checkCurrentRequestToken, times(15)); } InOrder order = inOrder(trustedServiceGuard, resourceService, uploadService, revisionService, lifecycleService, workflowFilePrepareService, approvedFlowService, workflowRegistrationService, workflowActivationService, workflowDownloadAuthorizationService, workflowPrintAuthorizationService, personalFolderService); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(resourceService).createFolder(folderForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(personalFolderService).addBorrowSnapshots(borrowForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(personalFolderService).addDownloadSnapshots(personalDownloadForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(resourceService).createDocument(documentForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(resourceService).createFileVersion(versionForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(lifecycleService).updateExpired(lifecycleForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(uploadService).register(uploadForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(revisionService).register(revisionForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(workflowFilePrepareService).prepare(prepareForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(approvedFlowService).completeRegistration(workflowUpload, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(workflowRegistrationService).revise(workflowRevision, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(workflowActivationService).activate("tenant-1", "flow-1", "task-1", activationForm.getFileType(), "user-1"); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(workflowDownloadAuthorizationService).authorize( "tenant-1", downloadForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(workflowPrintAuthorizationService).authorize( "tenant-1", printForm, trustedServiceId); order.verify(trustedServiceGuard).requireAllowed(requestedServiceId); order.verify(personalFolderService).grantPrintPermissions(printFilesForm, trustedServiceId); } }