diff --git a/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java b/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java index 056a39d114f092d23e5ef66e909294bca9e5ff11..1e0e590421594558adf8b3e5099ea210e7100a54 100644 --- a/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java +++ b/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java @@ -143,6 +143,8 @@ public class GenericQuotaEditController extends BasicController { myContent.contextPut("repository",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO)); myContent.contextPut("coursefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE)); myContent.contextPut("nodefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES)); + myContent.contextPut("feeds",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS)); + } private void initQuotaForm(UserRequest ureq, Quota quota) { diff --git a/src/main/java/org/olat/admin/quota/QuotaConstants.java b/src/main/java/org/olat/admin/quota/QuotaConstants.java index 43a5211e8da4e1cf98bf5cc0e5623ff2bc4a7659..87de59cd101e05c4f30de4ca85b843e392e377f9 100644 --- a/src/main/java/org/olat/admin/quota/QuotaConstants.java +++ b/src/main/java/org/olat/admin/quota/QuotaConstants.java @@ -35,5 +35,6 @@ public class QuotaConstants { public static final String IDENTIFIER_DEFAULT_REPO = IDENTIFIER_DEFAULT + "REPOSITORY"; public static final String IDENTIFIER_DEFAULT_COURSE = IDENTIFIER_DEFAULT + "COURSEFOLDERS"; public static final String IDENTIFIER_DEFAULT_NODES = IDENTIFIER_DEFAULT + "NODEFOLDERS"; + public static final String IDENTIFIER_DEFAULT_FEEDS = IDENTIFIER_DEFAULT + "BLOGSPODCASTS"; } diff --git a/src/main/java/org/olat/admin/quota/QuotaImpl.java b/src/main/java/org/olat/admin/quota/QuotaImpl.java index 863aab63017e57a18ede306dc1deae6bc40a2a9a..ebab7b16798742219c879095cc1117f684a7739f 100644 --- a/src/main/java/org/olat/admin/quota/QuotaImpl.java +++ b/src/main/java/org/olat/admin/quota/QuotaImpl.java @@ -25,7 +25,9 @@ package org.olat.admin.quota; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.util.vfs.Quota; +import org.olat.core.util.vfs.VFSManager; /** @@ -65,5 +67,21 @@ public class QuotaImpl implements Quota { public Long getUlLimitKB() { return ulLimitKB; } - + + public Long getRemainingSpace() { + long quotaKB = getQuotaKB().longValue(); + long remainingQuotaKB; + if (quotaKB == Quota.UNLIMITED) { + remainingQuotaKB = quotaKB; + } else { + OlatRootFolderImpl container = new OlatRootFolderImpl(path, null); + long actualUsage = VFSManager.getUsageKB(container); + if (quotaKB - actualUsage < 0) { + remainingQuotaKB = 0l; + } else { + remainingQuotaKB = quotaKB - actualUsage; + } + } + return new Long(remainingQuotaKB); + } } diff --git a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java index ef4c77b738d185744972753357bc70927d2a4560..3cacaedc41a2d9819d97ffe76b335011a410d797 100644 --- a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java +++ b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java @@ -98,21 +98,29 @@ public class QuotaManagerImpl extends QuotaManager { private void initDefaultQuotas() { defaultQuotas = new HashMap<String,Quota>(); - Quota defaultQuotaUsers = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_USERS); + Quota defaultQuotaUsers = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_USERS, 1.0d); defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_USERS, defaultQuotaUsers); - Quota defaultQuotaPowerusers = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_POWER); + Quota defaultQuotaPowerusers = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_POWER, 1.0d); defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_POWER, defaultQuotaPowerusers); - Quota defaultQuotaGroups = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_GROUPS); + Quota defaultQuotaGroups = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_GROUPS, 1.0d); defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_GROUPS, defaultQuotaGroups); - Quota defaultQuotaRepository = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO); + Quota defaultQuotaRepository = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO, 1.0d); defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_REPO, defaultQuotaRepository); - Quota defaultQuotaCourseFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE); + Quota defaultQuotaCourseFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE, 1.0d); defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_COURSE, defaultQuotaCourseFolder); - Quota defaultQuotaNodeFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES); + Quota defaultQuotaNodeFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES, 1.0d); defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_NODES, defaultQuotaNodeFolder); + Quota defaultQuotaFeed = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS, 2.0d); + defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS, defaultQuotaFeed); } - private Quota initDefaultQuota(String quotaIdentifier) { + /** + * + * @param quotaIdentifier + * @param factor Multiplier for some long running resources as blogs + * @return + */ + private Quota initDefaultQuota(String quotaIdentifier, double factor) { Quota q = null; Property p = propertyManager.findProperty(null, null, quotaResource, QUOTA_CATEGORY, quotaIdentifier); if (p != null) q = parseQuota(p); diff --git a/src/main/java/org/olat/admin/quota/_content/edit.html b/src/main/java/org/olat/admin/quota/_content/edit.html index 7f3b1e233bb670272ba5397a052c636442485712..fef31f3ab0b41d29e58a558000bce3b31d8cc20c 100644 --- a/src/main/java/org/olat/admin/quota/_content/edit.html +++ b/src/main/java/org/olat/admin/quota/_content/edit.html @@ -31,6 +31,7 @@ <tr><td>$r.translate("qd.repository")</td><td>$repository.getQuotaKB()</td><td>$repository.getUlLimitKB()</td></tr> <tr><td>$r.translate("qd.coursefolder")</td><td>$coursefolder.getQuotaKB()</td><td>$coursefolder.getUlLimitKB()</td></tr> <tr><td>$r.translate("qd.nodefolder")</td><td>$nodefolder.getQuotaKB()</td><td>$nodefolder.getUlLimitKB()</td></tr> + <tr><td>$r.translate("qd.feeds")</td><td>$feeds.getQuotaKB()</td><td>$feeds.getUlLimitKB()</td></tr> </tbody> </table> </fieldset> \ No newline at end of file diff --git a/src/main/java/org/olat/admin/quota/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/quota/_i18n/LocalStrings_de.properties index 8e776f7de886e4a65179cf0c2e1469003e00ecaa..3cd0d744c7d3c1378acc495a49604a7af7baa674 100644 --- a/src/main/java/org/olat/admin/quota/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/quota/_i18n/LocalStrings_de.properties @@ -6,6 +6,7 @@ qd.powerusers=Poweruser (Autoren) qd.repository=Lernressourcen qd.title=Default Quotas qd.users=Normale Benutzer +qd.feeds=Blogs und Podcasts qf.del=Quota l\u00F6schen qf.deleted=Quota {0} wurde gel\u00F6scht. qf.cannot.del.default=Default Quotas k\u00F6nnen nicht gel\u00F6scht werden. diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java index 7225fcffb75423822f40a8398ae267262af5072f..d8c8aec8bb5e4ad8010738b0ce0c2a4f5c37ac3b 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java @@ -142,8 +142,15 @@ public class FileLinkChooserController extends BasicController { } } } - uploadCtr = new FileUploadController(wControl, fileUploadBase, ureq, - (int)FolderConfig.getLimitULKB(), Quota.UNLIMITED, mimeTypes, true); + + int remainingSpace = Quota.UNLIMITED; + long uploadLimit = FolderConfig.getLimitULKB(); + if( fileUploadBase.getLocalSecurityCallback() != null && fileUploadBase.getLocalSecurityCallback().getQuota() != null) { + remainingSpace = fileUploadBase.getLocalSecurityCallback().getQuota().getRemainingSpace().intValue(); + uploadLimit = fileUploadBase.getLocalSecurityCallback().getQuota().getUlLimitKB(); + } + uploadCtr = new FileUploadController(wControl, fileUploadBase, ureq, (int)uploadLimit, remainingSpace, mimeTypes, true); + listenTo(uploadCtr); // set specific upload path uploadCtr.setUploadRelPath(uploadRelPath); @@ -162,55 +169,6 @@ public class FileLinkChooserController extends BasicController { // no events to catch } - private String getPathRelativeToFilename(String selectedPath) { - // VFSLeaf chosen = (VFSLeaf) rootDir.resolve(selectedPath); - // compute rel path to base dir of the current file - // String relPath = VFSManager.calculateRelativePath(fileName, - // selectedPath); - // selpath = /a/irwas/subsub/nochsub/note.html 5 - // filenam = /a/irwas/index.html 3 - // --> subsub/nochsub/note.gif - - // or /a/irwas/bla/index.html - // to /a/other/b/gugus.gif - // --> ../../ other/b/gugus.gif - - // or /a/other/b/main.html - // to /a/irwas/bla/goto.html - // --> ../../ other/b/gugus.gif - - String target = selectedPath; - String base = fileName; // assume "/" is here - if (!(fileName.indexOf("/") == 0)) { - base = "/" + fileName; - } - - String[] baseA = base.split("/"); - String[] targetA = target.split("/"); - int sp = 1; - for (; sp < Math.min(baseA.length, targetA.length); sp++) { - if (!baseA[sp].equals(targetA[sp])) { - break; - } - } - // special case: self-reference - if (target.equals(base)) { - sp = 1; - } - StringBuilder buffer = new StringBuilder(); - for (int i = sp; i < baseA.length - 1; i++) { - buffer.append("../"); - } - for (int i = sp; i < targetA.length; i++) { - buffer.append(targetA[i] + "/"); - } - buffer.deleteCharAt(buffer.length() - 1); - String path = buffer.toString(); - - String trimmed = path; // selectedPath.substring(1); - return trimmed; - } - /** * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, * org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java index 05f6e4415d6f93af2092988e14a4b37c6b1f097d..eee6d477ae666e74798b3c5e4e84974d55859234 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java @@ -127,6 +127,10 @@ public class LinkChooserController extends BasicController { mainPanel.setContent(closeVC); } else if (event == Event.CANCELLED_EVENT) { + removeAsListenerAndDispose(fileLinkChooserController); + removeAsListenerAndDispose(courseLinkChooserController); + removeAsListenerAndDispose(customMediaChooserCtr); + // Close the window, no URL selected closeVC = createVelocityContainer("close"); closeVC.contextPut("imagepath", ""); diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java index b7037f5dbea499a94fd7acf870529a1b2cc2aa31..2eec89cc298102db079e803501d2bcd525ccf6d9 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java @@ -33,8 +33,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; @@ -59,7 +59,6 @@ import org.olat.core.util.CodeHelper; import org.olat.core.util.FileUtils; import org.olat.core.util.ValidationStatus; import org.olat.core.util.ValidationStatusHelper; -import org.olat.core.util.WebappHelper; import org.olat.core.util.component.FormComponentTraverser; import org.olat.core.util.component.FormComponentVisitor; diff --git a/src/main/java/org/olat/core/util/vfs/Quota.java b/src/main/java/org/olat/core/util/vfs/Quota.java index ecf52d86ac875aff92c23eca887af684831a0009..060496625f680801b08ba5456e327e95379be3a8 100644 --- a/src/main/java/org/olat/core/util/vfs/Quota.java +++ b/src/main/java/org/olat/core/util/vfs/Quota.java @@ -52,5 +52,11 @@ public interface Quota { * @return Upload Limit in KB. */ public abstract Long getUlLimitKB(); + + /** + * Every time calculated. I can be very costly. Use it wisely + * @return + */ + public abstract Long getRemainingSpace(); } \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/feed/FeedNodeEditController.java b/src/main/java/org/olat/course/nodes/feed/FeedNodeEditController.java index 44d730c2dff1ff78a6c33fa0e5a17f1f5a15bf24..96054ac3c812bcdfb7c009d7121b66b7ca6e4280 100644 --- a/src/main/java/org/olat/course/nodes/feed/FeedNodeEditController.java +++ b/src/main/java/org/olat/course/nodes/feed/FeedNodeEditController.java @@ -46,7 +46,6 @@ import org.olat.course.nodes.AbstractFeedCourseNode; import org.olat.course.nodes.CourseNodeFactory; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.tree.CourseEditorTreeModel; -import org.olat.group.ui.context.BGContextEvent; import org.olat.modules.ModuleConfiguration; import org.olat.modules.webFeed.FeedPreviewSecurityCallback; import org.olat.modules.webFeed.FeedSecurityCallback; diff --git a/src/main/java/org/olat/fileresource/FileResourceManager.java b/src/main/java/org/olat/fileresource/FileResourceManager.java index 04a51a7400f2766db3ae29d696e8f6b83467f7d5..b09182d0fa258c0bee4233b89afcc65bdb95410a 100644 --- a/src/main/java/org/olat/fileresource/FileResourceManager.java +++ b/src/main/java/org/olat/fileresource/FileResourceManager.java @@ -328,7 +328,23 @@ public class FileResourceManager extends BasicManager { */ public File unzipFileResource(final OLATResourceable res) { final File dir = getFileResourceRoot(res); - if (!dir.exists()) return null; + return unzipFileResource(res, dir); + } + + public OlatRootFolderImpl unzipContainerResource(final OLATResourceable res) { + OlatRootFolderImpl container = getFileResourceRootImpl(res); + File dir = container.getBasefile(); + File unzipDir = unzipFileResource(res, dir); + if(unzipDir == null) { + return null; + } + return (OlatRootFolderImpl)container.resolve(unzipDir.getName()); + } + + private final File unzipFileResource(final OLATResourceable res, final File dir) { + if (!dir.exists()) { + return null; + } File zipTargetDir = new File(dir, ZIPDIR); if (!zipTargetDir.exists()) { // if not unzipped yet, synchronize all unzipping processes diff --git a/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java b/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java index bbb423024624c32c62f3bf94e013cbd6a1c4c7e6..bb6606f93c9a47345c32e118568214a4678624f9 100644 --- a/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java +++ b/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java @@ -24,16 +24,13 @@ */ package org.olat.ims.cp.ui; -import java.util.ArrayList; import java.util.LinkedList; -import java.util.List; import java.util.Set; import org.olat.core.commons.modules.bc.FileUploadController; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; -import org.olat.core.gui.components.form.flexible.FormUIFactory; import org.olat.core.gui.components.form.flexible.elements.FileElement; import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; @@ -101,6 +98,10 @@ public class CPFileImportController extends FormBasicController { file.setErrorKey("NoFileChosen", null); return false; } + if (file.getUploadSize() / 1024 > file.getMaxUploadSizeKB()) { + return false; + } + return super.validateFormLogic(ureq); } @@ -116,6 +117,12 @@ public class CPFileImportController extends FormBasicController { file = uifactory.addFileElement("file", this.flc); file.setLabel("cpfileuploadcontroller.import.text", null); file.addActionListener(this, FormEvent.ONCHANGE); + + Long uploadLimitKb = getUploadLimitKb(); + if(uploadLimitKb != null) { + Long uploadLimitMb = new Long(uploadLimitKb / 1024); + file.setMaxUploadSizeKB(uploadLimitKb.intValue(), "cpfileuploadcontroller.tooBig", new String[]{ uploadLimitMb.toString() }); + } // checkboxes String[] keys = { "htm", "pdf", "doc", "xls", "ppt", ALL }; @@ -129,6 +136,14 @@ public class CPFileImportController extends FormBasicController { uifactory.addFormSubmitButton("submit", "cpfileuploadcontroller.import.button", buttonLayout); cancelButton = uifactory.addFormLink("cancel", buttonLayout, Link.BUTTON); } + + private Long getUploadLimitKb() { + if(cp.getRootDir() != null && cp.getRootDir().getLocalSecurityCallback() != null + && cp.getRootDir().getLocalSecurityCallback().getQuota() != null) { + return cp.getRootDir().getLocalSecurityCallback().getQuota().getUlLimitKB(); + } + return null; + } /** * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose() diff --git a/src/main/java/org/olat/ims/cp/ui/VFSRootCPContainer.java b/src/main/java/org/olat/ims/cp/ui/VFSRootCPContainer.java index 6c3b07abe1e14e5ba7f3430ed15cf84b9ad0941d..49f832326520263509466434e349d40fc6f0aa82 100644 --- a/src/main/java/org/olat/ims/cp/ui/VFSRootCPContainer.java +++ b/src/main/java/org/olat/ims/cp/ui/VFSRootCPContainer.java @@ -71,6 +71,8 @@ public class VFSRootCPContainer extends AbstractVirtualContainer implements VFSC VFSContainer rawContainer = new VFSMediaFilesContainer(rawTitle, cloneContainer(rootContainer)); rawContainer.setDefaultItemFilter(new VFSMediaFilter(false)); roots.add(rawContainer); + + secCallback = rootContainer.getLocalSecurityCallback(); } private VFSContainer cloneContainer(VFSContainer container) { diff --git a/src/main/java/org/olat/ims/cp/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/cp/ui/_i18n/LocalStrings_de.properties index 61f746a2c54fc4b7a350494d28914a693f7a2218..757b257fb5a962c9cb9b117c3b11477fe8eb0499 100644 --- a/src/main/java/org/olat/ims/cp/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/cp/ui/_i18n/LocalStrings_de.properties @@ -44,6 +44,7 @@ cpfileuploadcontroller.virtual.root=Dateien cpfileuploadcontroller.pages=Inhalt cpfileuploadcontroller.media=Media cpfileuploadcontroller.raw=Alle Dateien +cpfileuploadcontroller.tooBig=Datei ist zu gross. Es sind maximal {0} MB m\u00F6glich. pagecontroller.title=Seite editieren saveandclose=Speichern und schliessen diff --git a/src/main/java/org/olat/modules/webFeed/managers/FeedManager.java b/src/main/java/org/olat/modules/webFeed/managers/FeedManager.java index d5ad07a33296112f47c46d1c959bc74b604a58d1..cc0625fee2b178087c445c74f9674f12f9cedb37 100644 --- a/src/main/java/org/olat/modules/webFeed/managers/FeedManager.java +++ b/src/main/java/org/olat/modules/webFeed/managers/FeedManager.java @@ -22,6 +22,7 @@ package org.olat.modules.webFeed.managers; import java.io.File; import java.util.List; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.commons.services.commentAndRating.CommentAndRatingService; import org.olat.core.commons.services.commentAndRating.CommentAndRatingServiceFactory; import org.olat.core.gui.components.form.flexible.elements.FileElement; @@ -31,6 +32,7 @@ import org.olat.core.id.OLATResourceable; import org.olat.core.manager.BasicManager; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.LockResult; +import org.olat.core.util.vfs.Quota; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; @@ -159,6 +161,8 @@ public abstract class FeedManager extends BasicManager implements CommentAndRati * @return The newly read feed (without items) */ public abstract Feed getFeed(OLATResourceable feed); + + public abstract OlatRootFolderImpl getResourceContainer(OLATResourceable ores); /** * Returns the media file of the item @@ -251,6 +255,8 @@ public abstract class FeedManager extends BasicManager implements CommentAndRati * @return The feed container */ public abstract VFSContainer getFeedContainer(OLATResourceable feed); + + public abstract Quota getQuota(OLATResourceable feed); /** * Validates a feed url. diff --git a/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java b/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java index 9849a16fce63b88acc9ebd3b5762610c1f9601e2..95cd4edfc268dcee9cbafaa8388d4118a1d5b8f1 100644 --- a/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java +++ b/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java @@ -28,7 +28,9 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import org.olat.admin.quota.QuotaConstants; import org.olat.core.commons.modules.bc.FolderConfig; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.commons.persistence.PersistenceHelper; import org.olat.core.commons.services.commentAndRating.CommentAndRatingService; import org.olat.core.gui.components.form.flexible.elements.FileElement; @@ -52,6 +54,8 @@ import org.olat.core.util.coordinate.SyncerExecutor; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.LocalFileImpl; import org.olat.core.util.vfs.LocalFolderImpl; +import org.olat.core.util.vfs.Quota; +import org.olat.core.util.vfs.QuotaManager; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; @@ -784,7 +788,7 @@ public abstract class FeedManagerImpl extends FeedManager { * @param ores * @return The resource (root) container of the feed */ - private VFSContainer getResourceContainer(OLATResourceable ores) { + public OlatRootFolderImpl getResourceContainer(OLATResourceable ores) { return fileResourceManager.getFileResourceRootImpl(ores); } @@ -1219,6 +1223,19 @@ public abstract class FeedManagerImpl extends FeedManager { LockResult lockResult = coordinator.getLocker().acquireLock(itemResource, identity, key); return lockResult; } + + @Override + public Quota getQuota(OLATResourceable feed) { + OlatRootFolderImpl container = getResourceContainer(feed); + + Quota quota = QuotaManager.getInstance().getCustomQuota(container.getRelPath()); + if (quota == null) { + Quota defQuota = QuotaManager.getInstance().getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS); + quota = QuotaManager.getInstance().createQuota(container.getRelPath(), defQuota.getQuotaKB(), defQuota.getUlLimitKB()); + } + + return quota; + } /** * @see org.olat.modules.webFeed.managers.FeedManager#setImage(org.olat.core.gui.components.form.flexible.elements.FileElement, diff --git a/src/main/java/org/olat/modules/webFeed/models/Feed.java b/src/main/java/org/olat/modules/webFeed/models/Feed.java index 3063fab7e179eb56d3a73a725e1d010255e49c40..522f9a2316c59ddaa34afc5c0271e53d446d06fc 100644 --- a/src/main/java/org/olat/modules/webFeed/models/Feed.java +++ b/src/main/java/org/olat/modules/webFeed/models/Feed.java @@ -29,6 +29,7 @@ import org.olat.basesecurity.BaseSecurityManager; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; +import org.olat.core.util.resource.OresHelper; import org.olat.modules.webFeed.FeedSecurityCallback; /** @@ -85,6 +86,10 @@ public class Feed implements OLATResourceable, Serializable { // new model constructor, set to current version this.modelVersion = CURRENT_MODEL_VERSION; } + + public OLATResourceable getResource() { + return OresHelper.createOLATResourceableInstanceWithoutCheck(type, id); + } /** * Setter for title diff --git a/src/main/java/org/olat/modules/webFeed/ui/FeedFormController.java b/src/main/java/org/olat/modules/webFeed/ui/FeedFormController.java index 403fb898f27d2a770a0318b4f283486e9e3c4d8b..9311532a38bb8b36ebc28ce2b38f1cec9efd303d 100644 --- a/src/main/java/org/olat/modules/webFeed/ui/FeedFormController.java +++ b/src/main/java/org/olat/modules/webFeed/ui/FeedFormController.java @@ -42,8 +42,11 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.media.MediaResource; +import org.olat.core.util.Formatter; import org.olat.core.util.Util; +import org.olat.core.util.WebappHelper; import org.olat.core.util.vfs.LocalFileImpl; +import org.olat.core.util.vfs.Quota; import org.olat.core.util.vfs.VFSMediaResource; import org.olat.modules.webFeed.managers.FeedManager; import org.olat.modules.webFeed.managers.ValidatedURL; @@ -63,6 +66,8 @@ import org.olat.modules.webFeed.models.Feed; */ class FeedFormController extends FormBasicController { private Feed feed; + private Quota feedQuota; + private TextElement title; private FileElement file; private RichTextElement description; @@ -84,6 +89,7 @@ class FeedFormController extends FormBasicController { public FeedFormController(UserRequest ureq, WindowControl wControl, Feed feed, FeedUIFactory uiFactory) { super(ureq, wControl); this.feed = feed; + this.feedQuota = FeedManager.getInstance().getQuota(feed.getResource()); setTranslator(uiFactory.getTranslator()); initForm(ureq); } @@ -133,7 +139,7 @@ class FeedFormController extends FormBasicController { file.clearError(); MediaResource newResource = new VFSMediaResource(new LocalFileImpl(newFile)); setImage(newResource); - } + } } } else if (source == deleteImageLink && event.wasTriggerdBy(FormEvent.ONCLICK)) { unsetImage(); @@ -150,6 +156,18 @@ class FeedFormController extends FormBasicController { description.setErrorKey("input.toolong", new String[]{"4000"}); allOk = false; } + + if (file.isUploadSuccess()) { + File newFile = file.getUploadFile(); + Long remainingQuotaKb = feedQuota.getRemainingSpace(); + if (remainingQuotaKb != -1 && newFile.length() / 1024 > remainingQuotaKb) { + unsetImage(); + String supportAddr = WebappHelper.getMailConfig("mailSupport"); + Long uploadLimitKB = feedQuota.getUlLimitKB(); + getWindowControl().setError(translate("ULLimitExceeded", new String[] { Formatter.roundToString(uploadLimitKB.floatValue() / 1024f, 1), supportAddr })); + } + } + return allOk && validateExternalFeedUrl() && super.validateFormLogic(ureq); } @@ -273,6 +291,10 @@ class FeedFormController extends FormBasicController { mimeTypes.add("image/png"); mimeTypes.add("image/gif"); file.limitToMimeType(mimeTypes, "feed.form.file.type.error.images", null); + + int maxFileSizeKB = feedQuota.getUlLimitKB().intValue(); + String supportAddr = WebappHelper.getMailConfig("mailSupport"); + file.setMaxUploadSizeKB(maxFileSizeKB, "ULLimitExceeded", new String[]{ new Long(maxFileSizeKB / 1024).toString(), supportAddr }); // if external feed, display feed-url text-element: if(feed.isExternal()){ diff --git a/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java b/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java index b57a4f60165c6a089a6504240dc4bdcfdbe2a724..03b7a35ac5162962153e8bb3844dcd42171bc499 100644 --- a/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java +++ b/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java @@ -258,6 +258,9 @@ public class FeedMainController extends BasicController implements Activateable, } // release the lock feedManager.releaseLock(lock); + + removeAsListenerAndDispose(feedFormCtr); + feedFormCtr = null; } } else if (source == itemsCtr && event.equals(ItemsController.HANDLE_NEW_EXTERNAL_FEED_DIALOG_EVENT)) { oldFeedUrl = feed.getExternalFeedUrl(); diff --git a/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties index d0bac74d755fe0044f0dcd7c68bb86b8095a59f2..2af164dacdd3ee60efc472433586fb910d2eb451 100644 --- a/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties @@ -14,6 +14,7 @@ feed.form.feedurl.invalid.not_found = Die angegebene URL existiert nicht oder Do feed.form.feedurl.invalid.no_media = Die angegebene URL ist keine Podcast URL feed.form.file.type.error = Der gew\u00E4hlte Dateityp wird nicht unterst\u00FCtzt. Unterst\u00FCtzte Formate sind FLV, MP3, MP4, M4V, M4A und AAC. feed.form.file.type.error.images = Der gew\u00E4hlte Dateityp wird nicht unterst\u00FCtzt. Unterst\u00FCtzte Formate sind JPEG, PNG und GIF. +ULLimitExceeded=$org.olat.core.commons.modules.bc\:ULLimitExceeded feed.no.image = Kein Bild vorhanden feed.url.label = Feed-URL: feed.url.is.personal.warning = Diese URL ist pers\u00F6nlich und darf nicht an Dritte weitergegeben werden. diff --git a/src/main/java/org/olat/modules/webFeed/ui/blog/BlogPostFormController.java b/src/main/java/org/olat/modules/webFeed/ui/blog/BlogPostFormController.java index 2ed5ac28890096dbb37305ecbe6714827a925ddb..0d90a415a1430bda723e18b0402e1d9dec4d490b 100644 --- a/src/main/java/org/olat/modules/webFeed/ui/blog/BlogPostFormController.java +++ b/src/main/java/org/olat/modules/webFeed/ui/blog/BlogPostFormController.java @@ -41,7 +41,9 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.translator.Translator; +import org.olat.core.util.vfs.Quota; import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback; import org.olat.modules.webFeed.managers.FeedManager; import org.olat.modules.webFeed.models.Feed; import org.olat.modules.webFeed.models.Item; @@ -57,7 +59,8 @@ import org.olat.modules.webFeed.models.Item; public class BlogPostFormController extends FormBasicController { private Item post; - private Feed blog; + private VFSContainer baseDir; + private TextElement title; private RichTextElement description, content; private DateChooser publishDateChooser; @@ -75,7 +78,11 @@ public class BlogPostFormController extends FormBasicController { super(ureq, control); this.post = post; this.currentlyDraft = post.isDraft(); - this.blog = blog; + this.baseDir = FeedManager.getInstance().getItemContainer(post, blog); + if(baseDir.getLocalSecurityCallback() == null) { + Quota quota = FeedManager.getInstance().getQuota(blog.getResource()); + baseDir.setLocalSecurityCallback(new FullAccessWithQuotaCallback(quota)); + } setTranslator(translator); initForm(ureq); } @@ -174,7 +181,6 @@ public class BlogPostFormController extends FormBasicController { title.setMandatory(true); title.setNotEmptyCheck("feed.form.field.is_mandatory"); - VFSContainer baseDir = FeedManager.getInstance().getItemContainer(post, blog); // Description description = uifactory.addRichTextElementForStringData("description", "feed.form.description", post.getDescription(), 8, -1, false, false, baseDir, null, formLayout, ureq.getUserSession(), getWindowControl()); diff --git a/src/main/java/org/olat/modules/webFeed/ui/podcast/EpisodeFormController.java b/src/main/java/org/olat/modules/webFeed/ui/podcast/EpisodeFormController.java index 2d1ff1ad68ef0a6e4ad38ca20430148c64f109e0..a5c0d003980fe480d4b5e2edc5100d3102dc71bc 100644 --- a/src/main/java/org/olat/modules/webFeed/ui/podcast/EpisodeFormController.java +++ b/src/main/java/org/olat/modules/webFeed/ui/podcast/EpisodeFormController.java @@ -39,8 +39,12 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.translator.Translator; import org.olat.core.util.FileUtils; +import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; +import org.olat.core.util.WebappHelper; +import org.olat.core.util.vfs.Quota; import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback; import org.olat.modules.webFeed.managers.FeedManager; import org.olat.modules.webFeed.models.Feed; import org.olat.modules.webFeed.models.Item; @@ -80,6 +84,11 @@ public class EpisodeFormController extends FormBasicController { this.episode = episode; this.podcast = podcast; this.baseDir = FeedManager.getInstance().getItemContainer(episode, podcast); + if(baseDir.getLocalSecurityCallback() == null) { + Quota quota = FeedManager.getInstance().getQuota(podcast.getResource()); + baseDir.setLocalSecurityCallback(new FullAccessWithQuotaCallback(quota)); + } + setTranslator(translator); initForm(ureq); } @@ -139,6 +148,8 @@ public class EpisodeFormController extends FormBasicController { fireEvent(ureq, Event.CANCELLED_EVENT); } else if (source == file && event.wasTriggerdBy(FormEvent.ONCHANGE)) { // display the uploaded file + + file.clearError(); if (file.isUploadSuccess()) { String newFilename = file.getUploadFileName(); boolean isValidFileType = newFilename.toLowerCase().matches(MIME_TYPES_ALLOWED); @@ -149,8 +160,6 @@ public class EpisodeFormController extends FormBasicController { } else if (!isFilenameValid) { file.setErrorKey("podcastfile.name.notvalid", null); } - } else { - file.clearError(); } } } @@ -179,11 +188,20 @@ public class EpisodeFormController extends FormBasicController { allOk = false; } } else { - file.clearError(); flc.setDirty(true); } } + if(baseDir.getLocalSecurityCallback() == null || baseDir.getLocalSecurityCallback().getQuota() != null) { + Quota feedQuota = baseDir.getLocalSecurityCallback().getQuota(); + Long remainingQuotaKb = feedQuota.getRemainingSpace(); + if (remainingQuotaKb != -1 && file.getUploadFile().length() / 1024 > remainingQuotaKb) { + String supportAddr = WebappHelper.getMailConfig("mailSupport"); + Long uploadLimitKB = feedQuota.getUlLimitKB(); + getWindowControl().setError(translate("ULLimitExceeded", new String[] { Formatter.roundToString(uploadLimitKB.floatValue() / 1024f, 1), supportAddr })); + } + } + //fxdiff FXOLAT-118: size for video podcast String width = widthEl.getValue(); widthEl.clearError(); @@ -245,6 +263,11 @@ public class EpisodeFormController extends FormBasicController { File mediaFile = FeedManager.getInstance().getItemEnclosureFile(episode, podcast); file.setInitialFile(mediaFile); file.addActionListener(this, FormEvent.ONCHANGE); + if(baseDir.getLocalSecurityCallback() != null && baseDir.getLocalSecurityCallback().getQuota() != null) { + Long uploadLimitKB = baseDir.getLocalSecurityCallback().getQuota().getUlLimitKB(); + String supportAddr = WebappHelper.getMailConfig("mailSupport"); + file.setMaxUploadSizeKB(uploadLimitKB.intValue(), "ULLimitExceeded", new String[] { Formatter.roundToString((uploadLimitKB.floatValue()) / 1024f, 1), supportAddr }); + } String width = episode.getWidth() > 0 ? Integer.toString(episode.getWidth()) : ""; widthEl = uifactory.addTextElement("video-width", "podcast.episode.file.width", 12, width, flc); diff --git a/src/main/java/org/olat/modules/webFeed/ui/podcast/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/webFeed/ui/podcast/_i18n/LocalStrings_de.properties index ca6432773a87934432b2ffdf697df65df148ca06..560b123bb66c3daa972e1432174d73c28bc4711a 100644 --- a/src/main/java/org/olat/modules/webFeed/ui/podcast/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/webFeed/ui/podcast/_i18n/LocalStrings_de.properties @@ -11,7 +11,7 @@ podcast.episode.download = Episode herunterladen podcast.episodes = Episoden podcast.episode.mandatory = Eine Episode verlangt eine Audio- oder Videodatei, die mit Flash abgespielt werden kann. podcastfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid - +ULLimitExceeded=$org.olat.core.commons.modules.bc\:ULLimitExceeded feed.make.internal = Episoden selbst erstellen feed.make.external = Einen bestehenden externen Podcast einbinden feed.edit = Podcast bearbeiten diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties index 99d01574fb984905696031e7291cf28c23c401ae..94d337b14eaaf707e3106f2556b68318d1955072 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties @@ -375,6 +375,7 @@ tab.glossary=Glossar tab.layout=Layout tab.log=Logfiles tab.public=Allgemein +tab.quota.edit=Quota tab.glossary.flexions=Morphologischer Dienst tab.glossary.register=Alphabetisches Register tab.glossary.edit=Schreibberechtigung diff --git a/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java b/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java index cd9adadcd1fc7099fa9c2eeffbc46c7370bd9b0a..bb22fb9ed3075497c93392fc41eae1b5decbd42b 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java @@ -28,11 +28,10 @@ package org.olat.repository.controllers; import java.util.Iterator; import java.util.List; -import org.olat.basesecurity.BaseSecurityManager; -import org.olat.basesecurity.Constants; import org.olat.basesecurity.SecurityGroup; import org.olat.commons.calendar.CalendarManager; import org.olat.commons.calendar.ui.events.KalendarModifiedEvent; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; @@ -56,8 +55,7 @@ import org.olat.core.util.coordinate.LockResult; import org.olat.core.util.event.EventBus; import org.olat.core.util.event.MultiUserEvent; import org.olat.core.util.resource.OresHelper; -import org.olat.core.util.vfs.NamedContainerImpl; -import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.QuotaManager; import org.olat.course.CourseFactory; import org.olat.course.CourseModule; import org.olat.course.ICourse; @@ -71,7 +69,11 @@ import org.olat.course.config.ui.CourseEfficencyStatementController; import org.olat.course.config.ui.CourseSharedFolderController; import org.olat.course.config.ui.courselayout.CourseLayoutGeneratorController; import org.olat.course.run.RunMainController; +import org.olat.fileresource.FileResourceManager; +import org.olat.fileresource.types.BlogFileResource; import org.olat.fileresource.types.GlossaryResource; +import org.olat.fileresource.types.ImsCPFileResource; +import org.olat.fileresource.types.PodcastFileResource; import org.olat.instantMessaging.InstantMessagingModule; import org.olat.modules.glossary.GlossaryEditSettingsController; import org.olat.modules.glossary.GlossaryManager; @@ -92,7 +94,6 @@ import org.olat.util.logging.activity.LoggingResourceable; */ public class RepositoryEditPropertiesController extends BasicController { - private static final String ACTION_PUB = "pub"; private static final String ACTION_FORWARD ="forw"; private static final String ACTION_BACKWARD ="bckw"; @@ -113,9 +114,6 @@ public class RepositoryEditPropertiesController extends BasicController { private TabbedPane tabbedPane; private RepositoryEntry repositoryEntry; - private boolean isOwner; - private boolean isAuthor; - private LockResult courseLockEntry; private CourseConfig initialCourseConfig; //deep clone of the courseConfig @@ -149,14 +147,6 @@ public class RepositoryEditPropertiesController extends BasicController { //o_clusterREVIEW secGroup = (SecurityGroup) DBFactory.getInstance().loadObject(secGroup); - if (ureq.getUserSession().getRoles().isOLATAdmin()) { - isOwner = true; - isAuthor = true; - } else { - isOwner = BaseSecurityManager.getInstance().isIdentityPermittedOnResourceable(ureq.getIdentity(), Constants.PERMISSION_ACCESS, secGroup); - isAuthor = ureq.getUserSession().getRoles().isAuthor(); - } - bgVC = createVelocityContainer("bgrep"); bgVC.contextPut("title", entry.getDisplayname()); tabbedPane = new TabbedPane("descTB", ureq.getLocale()); @@ -233,6 +223,15 @@ public class RepositoryEditPropertiesController extends BasicController { GlossaryEditSettingsController glossEditCtr = new GlossaryEditSettingsController(ureq, getWindowControl(), repositoryEntry.getOlatResource()); tabbedPane.addTab(translate("tab.glossary.edit"), glossEditCtr.getInitialComponent()); + } else if (ImsCPFileResource.TYPE_NAME.equals(repositoryEntry.getOlatResource().getResourceableTypeName())) { + OlatRootFolderImpl cpRoot = FileResourceManager.getInstance().unzipContainerResource(repositoryEntry.getOlatResource()); + Controller quotaCtrl = QuotaManager.getInstance().getQuotaEditorInstance(ureq, wControl, cpRoot.getRelPath(), false); + tabbedPane.addTab(translate("tab.quota.edit"), quotaCtrl.getInitialComponent()); + } else if (BlogFileResource.TYPE_NAME.equals(repositoryEntry.getOlatResource().getResourceableTypeName()) + || PodcastFileResource.TYPE_NAME.equals(repositoryEntry.getOlatResource().getResourceableTypeName())) { + OlatRootFolderImpl feedRoot = FileResourceManager.getInstance().getFileResourceRootImpl(repositoryEntry.getOlatResource()); + Controller quotaCtrl = QuotaManager.getInstance().getQuotaEditorInstance(ureq, wControl, feedRoot.getRelPath(), false); + tabbedPane.addTab(translate("tab.quota.edit"), quotaCtrl.getInitialComponent()); } bgVC.put("descTB", tabbedPane); diff --git a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java index c5de1f9ef1eff2826ef6be0034b5a58ea9553963..5ca513d99a00e5f4a71fb53bb1ae0ee22403587a 100644 --- a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java +++ b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java @@ -29,6 +29,8 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import org.olat.admin.quota.QuotaConstants; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; @@ -41,6 +43,10 @@ import org.olat.core.logging.AssertException; import org.olat.core.logging.Tracing; import org.olat.core.util.coordinate.LockResult; import org.olat.core.util.vfs.LocalFolderImpl; +import org.olat.core.util.vfs.Quota; +import org.olat.core.util.vfs.QuotaManager; +import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback; +import org.olat.core.util.vfs.callbacks.VFSSecurityCallback; import org.olat.course.nodes.cp.CPRunController; import org.olat.fileresource.FileResourceManager; import org.olat.fileresource.types.ImsCPFileResource; @@ -157,10 +163,17 @@ public class ImsCPHandler extends FileHandler implements RepositoryHandler { */ public Controller createEditorController(OLATResourceable res, UserRequest ureq, WindowControl wControl) { // only unzips, if not already unzipped - File cpRoot = FileResourceManager.getInstance().unzipFileResource(res); - LocalFolderImpl vfsWrapper = new LocalFolderImpl(cpRoot); - return new CPEditMainController(ureq, wControl, vfsWrapper, res); + OlatRootFolderImpl cpRoot = FileResourceManager.getInstance().unzipContainerResource(res); + + Quota quota = QuotaManager.getInstance().getCustomQuota(cpRoot.getRelPath()); + if (quota == null) { + Quota defQuota = QuotaManager.getInstance().getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO); + quota = QuotaManager.getInstance().createQuota(cpRoot.getRelPath(), defQuota.getQuotaKB(), defQuota.getUlLimitKB()); + } + VFSSecurityCallback secCallback = new FullAccessWithQuotaCallback(quota); + cpRoot.setLocalSecurityCallback(secCallback); + return new CPEditMainController(ureq, wControl, cpRoot, res); } /**