diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationFixItemPermissionsController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationFixItemPermissionsController.java index 8363561f9..3a5728d29 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationFixItemPermissionsController.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationFixItemPermissionsController.java @@ -18,18 +18,11 @@ */ package org.librecms.ui.contentsections; -import org.libreccm.categorization.Categorization; import org.libreccm.security.AuthorizationRequired; -import org.libreccm.security.PermissionManager; -import org.librecms.contentsection.Asset; -import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentSection; -import org.librecms.contentsection.ContentSectionManager; -import org.librecms.contentsection.Folder; +import org.librecms.ui.contentsections.fixpermissions.FixItemPermissionsTaskManager; -import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissions.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissions.java deleted file mode 100644 index f03f9c62e..000000000 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissions.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (C) 2023 LibreCCM Foundation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ -package org.librecms.ui.contentsections; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.libreccm.categorization.Categorization; -import org.libreccm.core.CcmObject; -import org.libreccm.security.PermissionManager; -import org.librecms.contentsection.Asset; -import org.librecms.contentsection.AssetManager; -import org.librecms.contentsection.ContentItem; -import org.librecms.contentsection.ContentItemManager; -import org.librecms.contentsection.ContentSection; -import org.librecms.contentsection.ContentSectionRepository; -import org.librecms.contentsection.Folder; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.transaction.Transactional; - -/** - * - * @author Jens Pelzetter - */ -@ApplicationScoped -public class FixItemPermissions { - - private static final Logger LOGGER = LogManager.getLogger( - FixItemPermissions.class - ); - - @Inject - private AssetManager assetManager; - - @Inject - private ContentItemManager itemManager; - - @Inject - private ContentSectionRepository sectionRepo; - - @Inject - private PermissionManager permissionManager; - - @Transactional(Transactional.TxType.REQUIRED) - public void fixItemPermissions(final ContentSection contentSection) { - final String sectionUuid = Optional - .ofNullable(contentSection) - .map(ContentSection::getUuid) - .orElseThrow( - () -> new IllegalArgumentException( - "Can't fix ItemPermissions for content section null" - ) - ); - - final ContentSection section = sectionRepo - .findByUuid(sectionUuid) - .orElseThrow( - () -> new IllegalArgumentException( - String.format( - "No ContentSection with UUID %s in the database.", - sectionUuid - ) - ) - ); - - fixContentItemPermissions(section.getRootDocumentsFolder()); - fixAssetPermissions(section.getRootAssetsFolder()); - } - - private void fixContentItemPermissions(final Folder folder) { - final List items = new ArrayList<>(); - for (final Categorization categorization : folder.getObjects()) { - final CcmObject categorized = categorization.getCategorizedObject(); - if (categorized instanceof ContentItem) { - items.add((ContentItem) categorized); - } - } - -// final List items = folder -// .getObjects() -// .stream() -// .map(Categorization::getCategorizedObject) -// .filter(obj -> obj instanceof ContentItem) -// .map(obj -> (ContentItem) obj) -// .collect(Collectors.toList()); - for (final ContentItem item : items) { - LOGGER.info( - "Fixing permissions for item {} {}", - item.getUuid(), - itemManager.getItemPath(item) - ); - permissionManager.copyPermissions(folder, item, true); - - if (itemManager.isLive(item)) { - permissionManager.copyPermissions( - folder, - itemManager.getLiveVersion(item, ContentItem.class).get(), - true - ); - } - } - - for (final Folder subFolder : folder.getSubFolders()) { - fixContentItemPermissions(subFolder); - } - } - - private void fixAssetPermissions(final Folder folder) { - final List assets = folder - .getObjects() - .stream() - .map(Categorization::getCategorizedObject) - .filter(obj -> obj instanceof Asset) - .map(obj -> (Asset) obj) - .collect(Collectors.toList()); - - for (final Asset asset : assets) { - LOGGER.info( - "Fixing permissions for asset {} {}...", - asset.getUuid(), - assetManager.getAssetPath(asset) - ); - permissionManager.copyPermissions(folder, asset, true); - } - - for (final Folder subFolder : folder.getSubFolders()) { - fixAssetPermissions(subFolder); - } - } - -} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTasks.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTasks.java deleted file mode 100644 index 0c1fae9ca..000000000 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTasks.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2023 LibreCCM Foundation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ -package org.librecms.ui.contentsections; - -import org.apache.shiro.util.ThreadContext; -import org.libreccm.security.Shiro; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; -import javax.transaction.Transactional; - -/** - * - * @author Jens Pelzetter - */ -@ApplicationScoped -public class FixItemPermissionsTasks { - - @Inject - private FixItemPermissions fixItemPermissions; - - @Inject - private Shiro shiro; - - @Transactional(Transactional.TxType.REQUIRED) - public void fixItemPermissions( - @ObservesAsync final FixItemPermissionsTask task - ) { - ThreadContext.bind(task.getSecurityManager()); - shiro.getSystemUser().execute(() -> executeFixItemPermissions(task)); - } - - - private void executeFixItemPermissions(final FixItemPermissionsTask task) { - fixItemPermissions.fixItemPermissions(task.getContentSection()); - } - -} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTask.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTask.java similarity index 73% rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTask.java rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTask.java index be2a8f905..a4445b380 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTask.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTask.java @@ -16,12 +16,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ -package org.librecms.ui.contentsections; +package org.librecms.ui.contentsections.fixpermissions; import org.apache.shiro.mgt.SecurityManager; import org.librecms.contentsection.ContentSection; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Objects; +import java.util.Optional; /** * @@ -65,4 +68,23 @@ public class FixItemPermissionsTask { return securityManager; } + @Override + public String toString() { + return String.format( + "%s{" + + "contentSection = %s, " + + "started = %s, " + + "status = %s" + + "}", + super.toString(), + Objects.toString(contentSection), + Optional + .ofNullable(started) + .map( + value -> DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value) + ).orElse("null"), + Objects.toString(status) + ); + } + } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskManager.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskManager.java similarity index 90% rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskManager.java rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskManager.java index 52362478d..7e85c467c 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskManager.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskManager.java @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ -package org.librecms.ui.contentsections; +package org.librecms.ui.contentsections.fixpermissions; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -76,7 +76,7 @@ public class FixItemPermissionsTaskManager { .anyMatch( task -> task.getContentSection().equals(name) && task.getStatus() - == FixItemPermissionsStatus.RUNNING + == FixPermissionsTaskStatus.RUNNING ); } @@ -86,7 +86,7 @@ public class FixItemPermissionsTaskManager { .anyMatch( task -> task.getContentSection().equals(name) && task.getStatus() - == FixItemPermissionsStatus.ERROR + == FixPermissionsTaskStatus.ERROR ); } @@ -115,9 +115,9 @@ public class FixItemPermissionsTaskManager { .stream() .filter( task -> task.getStatus() - == FixItemPermissionsStatus.ERROR + == FixPermissionsTaskStatus.ERROR || task.getStatus() - == FixItemPermissionsStatus.FINISHED + == FixPermissionsTaskStatus.FINISHED ) .collect(Collectors.toSet()) ); @@ -135,7 +135,7 @@ public class FixItemPermissionsTaskManager { ) ).handle((task, ex) -> handleTaskResult(task, ex, taskStatus)); - taskStatus.setStatus(FixItemPermissionsStatus.RUNNING); + taskStatus.setStatus(FixPermissionsTaskStatus.RUNNING); tasks.add(taskStatus); } @@ -145,9 +145,9 @@ public class FixItemPermissionsTaskManager { final FixItemPermissionsTaskStatus status ) { if (ex == null) { - status.setStatus(FixItemPermissionsStatus.FINISHED); + status.setStatus(FixPermissionsTaskStatus.FINISHED); } else { - status.setStatus(FixItemPermissionsStatus.ERROR); + status.setStatus(FixPermissionsTaskStatus.ERROR); status.setException(ex); LOGGER.error( "Fix Item Permissions for Content Section {} failed ", diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatus.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatus.java similarity index 94% rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatus.java rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatus.java index b12541635..00030d951 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatus.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatus.java @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ -package org.librecms.ui.contentsections; +package org.librecms.ui.contentsections.fixpermissions; import java.time.LocalDateTime; import java.time.ZoneId; @@ -44,7 +44,7 @@ public class FixItemPermissionsTaskStatus /** * The status of the task. */ - private FixItemPermissionsStatus status; + private FixPermissionsTaskStatus status; /** * If the proces throw an exception, it is stored here. @@ -67,11 +67,11 @@ public class FixItemPermissionsTaskStatus this.started = started; } - public FixItemPermissionsStatus getStatus() { + public FixPermissionsTaskStatus getStatus() { return status; } - protected void setStatus(final FixItemPermissionsStatus status) { + protected void setStatus(final FixPermissionsTaskStatus status) { this.status = status; } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatusModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatusModel.java similarity index 93% rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatusModel.java rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatusModel.java index c0efd7eac..d9fda27b2 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatusModel.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatusModel.java @@ -16,7 +16,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ -package org.librecms.ui.contentsections; +package org.librecms.ui.contentsections.fixpermissions; + +import org.librecms.ui.contentsections.ContentSectionModel; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTasks.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTasks.java new file mode 100644 index 000000000..87a95b7f7 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTasks.java @@ -0,0 +1,404 @@ +/* + * Copyright (C) 2023 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.fixpermissions; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.shiro.util.ThreadContext; +import org.libreccm.categorization.Categorization; +import org.libreccm.core.CcmObject; +import org.libreccm.security.PermissionManager; +import org.libreccm.security.Shiro; +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.AssetManager; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentItemManager; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionRepository; +import org.librecms.contentsection.Folder; +import javax.enterprise.event.Event; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Queue; +import java.util.stream.Collectors; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.ObservesAsync; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@ApplicationScoped +public class FixItemPermissionsTasks { + + private static final Logger LOGGER = LogManager.getLogger( + FixItemPermissionsTasks.class + ); + + private final Queue openItemTasks; + + private final Queue openAssetTasks; + + @Inject + private AssetManager assetManager; + + @Inject + private ContentItemManager itemManager; + + @Inject + private ContentSectionRepository sectionRepo; + + @Inject + private PermissionManager permissionManager; + + @Inject + private Event readyForItemTaskSender; + + @Inject + private Event readyForAssetTaskSender; + + private long timestamp = 0; + + @Inject + private Shiro shiro; + + public FixItemPermissionsTasks() { + openItemTasks = new LinkedList<>(); + openAssetTasks = new LinkedList<>(); + } + + public boolean isTaskOpenForContentSection(final ContentSection section) { + final String sectionUuid = section.getUuid(); + + return openItemTasks + .stream() + .anyMatch(task -> task.getSectionUuid().equals(sectionUuid)) + || openAssetTasks + .stream() + .anyMatch(task -> task.getSectionUuid().equals(sectionUuid)); + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) + public void fixItemPermissions( + @ObservesAsync final FixItemPermissionsTask task + ) { + ThreadContext.bind(task.getSecurityManager()); + shiro.getSystemUser().execute(() -> executeFixItemPermissions(task)); + + readyForItemTaskSender.fireAsync(new ReadyForNextItemTaskEvent()); + readyForAssetTaskSender.fireAsync(new ReadyForNextAssetTaskEvent()); + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) + public void startNextItemTask( + @ObservesAsync final ReadyForNextItemTaskEvent event + ) { + LOGGER.info("Starting next fix permissions for item task..."); + + final FixPermissionsForItemTask task = openItemTasks.poll(); + if (task == null) { + LOGGER.info("No more fix permissions for item tasks available."); + return; + } + + ThreadContext.bind(task.getSecurityManager()); + shiro.getSystemUser().execute(() -> executeFixPermissionsForItem(task)); + + readyForItemTaskSender.fireAsync(new ReadyForNextItemTaskEvent()); + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) + public void startNextAssetTask( + @ObservesAsync final ReadyForNextItemTaskEvent event + ) { + LOGGER.info("Starting next fix permissions for asset task..."); + + final FixPermissionsForAssetTask task = openAssetTasks.poll(); + if (task == null) { + LOGGER.info("No more fix permissions for asset tasks available."); + return; + } + + ThreadContext.bind(task.getSecurityManager()); + shiro.getSystemUser().execute(() -> executeFixPermissionsForAsset(task)); + + readyForAssetTaskSender.fireAsync(new ReadyForNextAssetTaskEvent()); + } + + private void executeFixItemPermissions(final FixItemPermissionsTask task) { + Optional + .ofNullable(task) + .map(FixItemPermissionsTask::getContentSection) + .map(ContentSection::getUuid) + .map(uuid -> sectionRepo.findByUuid(uuid).orElse(null)) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "Can't get ContentSection from " + + "FixItemPermissionsTask %s", + Objects.toString(task) + ) + ) + ); + + fixItemPermissions( + sectionRepo.findByUuid( + task.getContentSection().getUuid() + ).orElseThrow( + () -> new IllegalArgumentException() + ), + task.getSecurityManager() + ); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void fixItemPermissions( + final ContentSection contentSection, + final org.apache.shiro.mgt.SecurityManager securityManager + ) { + LOGGER.info( + "Fixing item permissions for content section {}...", + contentSection.getLabel() + ); + timestamp = System.currentTimeMillis(); + final String sectionUuid = Optional + .ofNullable(contentSection) + .map(ContentSection::getUuid) + .orElseThrow( + () -> new IllegalArgumentException( + "Can't fix ItemPermissions for content section null" + ) + ); + + final ContentSection section = sectionRepo + .findByUuid(sectionUuid) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No ContentSection with UUID %s in the database.", + sectionUuid + ) + ) + ); + LOGGER.info( + "Retrieve content section in {} ms.", + System.currentTimeMillis() - timestamp + ); + timestamp = System.currentTimeMillis(); + + fixContentItemPermissions( + section, + section.getRootDocumentsFolder(), + securityManager + ); + fixAssetPermissions( + section, + section.getRootAssetsFolder(), + securityManager + ); + } + + private void fixContentItemPermissions( + final ContentSection section, + final Folder folder, + final org.apache.shiro.mgt.SecurityManager securityManager + ) { + LOGGER.info( + "Fixing permissions for items in folder {}", + folder.getName() + ); + final List items = new ArrayList<>(); + for (final Categorization categorization : folder.getObjects()) { + final CcmObject categorized = categorization.getCategorizedObject(); + if (categorized instanceof ContentItem) { + items.add((ContentItem) categorized); + } + } + +// final List items = folder +// .getObjects() +// .stream() +// .map(Categorization::getCategorizedObject) +// .filter(obj -> obj instanceof ContentItem) +// .map(obj -> (ContentItem) obj) +// .collect(Collectors.toList()); + for (final ContentItem item : items) { + final FixPermissionsForItemTask task + = createFixItemPermissionsForItemTask( + section, + folder, + item, + securityManager + ); + openItemTasks.add(task); + + if (itemManager.isLive(item)) { + final FixPermissionsForItemTask liveTask + = createFixItemPermissionsForItemTask( + section, + folder, + itemManager.getLiveVersion(item, ContentItem.class) + .get(), + securityManager + ); + openItemTasks.add(liveTask); + } +// final long fixForItemStart = System.currentTimeMillis(); +// LOGGER.info( +// "Fixing permissions for item {} {}", +// item.getUuid(), +// itemManager.getItemPath(item) +// ); +// permissionManager.copyPermissions(folder, item, true); +// LOGGER.info( +// "in {} ms", +// System.currentTimeMillis() - fixForItemStart +// ); +// +// final long fixForLiveStart = System.currentTimeMillis(); +// if (itemManager.isLive(item)) { +// permissionManager.copyPermissions( +// folder, +// itemManager.getLiveVersion(item, ContentItem.class).get(), +// true +// ); +// } +// LOGGER.info( +// "Fixed permissions for live item in {} ms", +// System.currentTimeMillis() - fixForLiveStart +// ); +// LOGGER.info( +// "Fixed permissions for item in {} ms", +// System.currentTimeMillis() - fixForItemStart +// ); + } + LOGGER.info( + "Fixed permissions for items in folder {} in {} ms", + folder.getName(), + System.currentTimeMillis() - timestamp + ); + timestamp = System.currentTimeMillis(); + + for (final Folder subFolder : folder.getSubFolders()) { + fixContentItemPermissions(section, subFolder, securityManager); + } + } + + private void fixAssetPermissions( + final ContentSection section, + final Folder folder, + final org.apache.shiro.mgt.SecurityManager securityManager + ) { + LOGGER.info( + "Fixing permissions for assets in folder {}", + folder.getName() + ); + final List assets = folder + .getObjects() + .stream() + .map(Categorization::getCategorizedObject) + .filter(obj -> obj instanceof Asset) + .map(obj -> (Asset) obj) + .collect(Collectors.toList()); + + for (final Asset asset : assets) { + final FixPermissionsForAssetTask task + = createFixItemPermissionsForAssetTask( + section, + folder, + asset, + securityManager + ); + openAssetTasks.add(task); +// LOGGER.info( +// "Fixing permissions for asset {} {}...", +// asset.getUuid(), +// assetManager.getAssetPath(asset) +// ); +// permissionManager.copyPermissions(folder, asset, true); + } + + for (final Folder subFolder : folder.getSubFolders()) { + fixAssetPermissions(section, subFolder, securityManager); + } + } + + private FixPermissionsForItemTask createFixItemPermissionsForItemTask( + final ContentSection section, + final Folder folder, + final ContentItem item, + final org.apache.shiro.mgt.SecurityManager securityManager + ) { + final FixPermissionsForItemTask task + = new FixPermissionsForItemTask( + section.getUuid(), + folder, + item, + securityManager + ); + + return task; + } + + private FixPermissionsForAssetTask createFixItemPermissionsForAssetTask( + final ContentSection section, + final Folder folder, + final Asset asset, + final org.apache.shiro.mgt.SecurityManager securityManager + ) { + final FixPermissionsForAssetTask task + = new FixPermissionsForAssetTask( + section.getUuid(), + folder, + asset, + securityManager + ); + + return task; + } + + + private void executeFixPermissionsForItem( + final FixPermissionsForItemTask task + ) { + permissionManager.copyPermissions( + task.getFolder(), + task.getItem(), + true + ); + } + + private void executeFixPermissionsForAsset( + final FixPermissionsForAssetTask task + ) { + permissionManager.copyPermissions( + task.getFolder(), + task.getAsset(), + true + ); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForAssetTask.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForAssetTask.java new file mode 100644 index 000000000..abdce4d05 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForAssetTask.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2023 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.fixpermissions; + +import org.apache.shiro.mgt.SecurityManager; +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.Folder; + +/** + * + * @author Jens Pelzetter + */ +public class FixPermissionsForAssetTask { + + /** + * UUID of the {@link ContentSection} to which the item belongs. + */ + private final String sectionUuid; + + /** + * The {@link Folder} in which the item is stored. Source for the + * permissions to be copied to the item. + */ + private final Folder folder; + + /** + * The {@link Asset} which permssions will be fixed. + */ + private final Asset asset; + + private final org.apache.shiro.mgt.SecurityManager securityManager; + + public FixPermissionsForAssetTask( + final String sectionUuid, + final Folder folder, + final Asset asset, + final SecurityManager securityManager + ) { + this.sectionUuid = sectionUuid; + this.folder = folder; + this.asset = asset; + this.securityManager = securityManager; + } + + public String getSectionUuid() { + return sectionUuid; + } + + public Folder getFolder() { + return folder; + } + + public Asset getAsset() { + return asset; + } + + public org.apache.shiro.mgt.SecurityManager getSecurityManager() { + return securityManager; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForItemTask.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForItemTask.java new file mode 100644 index 000000000..21d7d2628 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForItemTask.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2023 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.fixpermissions; + +import org.apache.shiro.mgt.SecurityManager; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.Folder; + +/** + * + * @author Jens Pelzetter + */ +public class FixPermissionsForItemTask { + + /** + * UUID of the {@link ContentSection} to which the item belongs. + */ + private final String sectionUuid; + + /** + * The {@link Folder} in which the item is stored. Source for the + * permissions to be copied to the item. + */ + private final Folder folder; + + /** + * The {@link ContentItem} which permssions will be fixed. + */ + private final ContentItem item; + + private final org.apache.shiro.mgt.SecurityManager securityManager; + + public FixPermissionsForItemTask( + final String sectionUuid, + final Folder folder, + final ContentItem item, + final SecurityManager securityManager + ) { + this.sectionUuid = sectionUuid; + this.folder = folder; + this.item = item; + this.securityManager = securityManager; + } + + public String getSectionUuid() { + return sectionUuid; + } + + public Folder getFolder() { + return folder; + } + + public ContentItem getItem() { + return item; + } + + public SecurityManager getSecurityManager() { + return securityManager; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsStatus.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsTaskStatus.java similarity index 92% rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsStatus.java rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsTaskStatus.java index c493502d3..41389e6f5 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsStatus.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsTaskStatus.java @@ -16,13 +16,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ -package org.librecms.ui.contentsections; +package org.librecms.ui.contentsections.fixpermissions; /** * * @author Jens Pelzetter */ -public enum FixItemPermissionsStatus { +public enum FixPermissionsTaskStatus { /** * An error occured during the process. diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextAssetTaskEvent.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextAssetTaskEvent.java new file mode 100644 index 000000000..de0770332 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextAssetTaskEvent.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.fixpermissions; + +/** + * + * @author Jens Pelzetter + */ +public class ReadyForNextAssetTaskEvent { + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextItemTaskEvent.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextItemTaskEvent.java new file mode 100644 index 000000000..d666725d6 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextItemTaskEvent.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.fixpermissions; + +/** + * + * @author Jens Pelzetter + */ +public class ReadyForNextItemTaskEvent { + +}