From a4dbbc0f15882cbfa54078277658466ef2d17864 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Mon, 6 Aug 2012 17:10:31 +0200 Subject: [PATCH] OO-298: the REST method to import repository entry can set the access flag (BARG) --- .../repository/RepositoryEntriesResource.java | 41 ++++++++----------- .../resources/serviceconfig/olat.properties | 8 ++++ .../olat/restapi/RepositoryEntriesTest.java | 7 +--- .../profile/mysql/olat.eclipse.properties | 1 + 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/olat/restapi/repository/RepositoryEntriesResource.java b/src/main/java/org/olat/restapi/repository/RepositoryEntriesResource.java index d401ae52c2d..7bab31e4834 100644 --- a/src/main/java/org/olat/restapi/repository/RepositoryEntriesResource.java +++ b/src/main/java/org/olat/restapi/repository/RepositoryEntriesResource.java @@ -30,7 +30,6 @@ import static org.olat.restapi.security.RestSecurityHelper.getRoles; import static org.olat.restapi.security.RestSecurityHelper.isAuthor; import java.io.File; -import java.io.InputStream; import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -38,7 +37,6 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; -import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; @@ -62,10 +60,7 @@ import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; -import org.olat.core.util.CodeHelper; -import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; -import org.olat.core.util.WebappHelper; import org.olat.fileresource.FileResourceManager; import org.olat.fileresource.types.FileResource; import org.olat.repository.RepositoryEntry; @@ -75,6 +70,7 @@ import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; import org.olat.restapi.security.RestSecurityHelper; import org.olat.restapi.support.MediaTypeVariants; +import org.olat.restapi.support.MultipartReader; import org.olat.restapi.support.ObjectFactory; import org.olat.restapi.support.vo.RepositoryEntryVO; import org.olat.restapi.support.vo.RepositoryEntryVOes; @@ -280,9 +276,7 @@ public class RepositoryEntriesResource { @PUT @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Consumes({MediaType.MULTIPART_FORM_DATA}) - public Response putResource(@FormParam("filename") String filename, @FormParam("file") InputStream file, - @FormParam("resourcename") String resourcename, @FormParam("displayname") String displayname, - @FormParam("softkey") String softkey, @Context HttpServletRequest request) { + public Response putResource(@Context HttpServletRequest request) { if(!isAuthor(request)) { return Response.serverError().status(Status.UNAUTHORIZED).build(); } @@ -291,13 +285,17 @@ public class RepositoryEntriesResource { long length = 0; try { Identity identity = RestSecurityHelper.getUserRequest(request).getIdentity(); - tmpFile = getTmpFile(filename); - FileUtils.save(file, tmpFile); - FileUtils.closeSafely(file); + MultipartReader partsReader = new MultipartReader(request); + tmpFile = partsReader.getFile(); length = tmpFile.length(); if(length > 0) { - RepositoryEntry re = importFileResource(identity, tmpFile, resourcename, displayname, softkey); + Long accessRaw = partsReader.getLongValue("access"); + int access = accessRaw != null ? accessRaw.intValue() : RepositoryEntry.ACC_OWNERS; + String softkey = partsReader.getValue("softkey"); + String resourcename = partsReader.getValue("resourcename"); + String displayname = partsReader.getValue("displayname"); + RepositoryEntry re = importFileResource(identity, tmpFile, resourcename, displayname, softkey, access); RepositoryEntryVO vo = ObjectFactory.get(re); return Response.ok(vo).build(); } @@ -313,11 +311,11 @@ public class RepositoryEntriesResource { } private RepositoryEntry importFileResource(Identity identity, File fResource, String resourcename, String displayname, - String softkey) { + String softkey, int access) { try { FileResourceManager frm = FileResourceManager.getInstance(); FileResource newResource = frm.addFileResource(fResource, fResource.getName()); - return importResource(identity, newResource, resourcename, displayname, softkey); + return importResource(identity, newResource, resourcename, displayname, softkey, access); } catch(Exception e) { log.error("Fail to import a resource", e); throw new WebApplicationException(e); @@ -325,7 +323,7 @@ public class RepositoryEntriesResource { } public static RepositoryEntry importResource(Identity identity, OLATResourceable newResource, String resourcename, String displayname, - String softkey) { + String softkey, int access) { RepositoryEntry addedEntry = RepositoryManager.getInstance().createRepositoryEntryInstance(identity.getName()); addedEntry.setCanDownload(false); @@ -379,18 +377,15 @@ public class RepositoryEntriesResource { // Do set access for owner at the end, because unfinished course should be // invisible - addedEntry.setAccess(RepositoryEntry.ACC_OWNERS); + if(access < RepositoryEntry.ACC_OWNERS || access > RepositoryEntry.ACC_USERS_GUESTS) { + addedEntry.setAccess(RepositoryEntry.ACC_OWNERS); + } else { + addedEntry.setAccess(access); + } rm.saveRepositoryEntry(addedEntry); return addedEntry; } - private File getTmpFile(String suffix) { - suffix = (suffix == null ? "" : suffix); - File tmpFile = new File(WebappHelper.getUserDataRoot() + "/tmp/", CodeHelper.getGlobalForeverUniqueID() + "_" + suffix); - FileUtils.createEmptyFile(tmpFile); - return tmpFile; - } - @Path("{repoEntryKey}") public RepositoryEntryResource getRepositoryEntryResource() { return new RepositoryEntryResource(); diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index c2c94367091..07612770651 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -492,6 +492,14 @@ search.indexing.cronjob=disabled # Example '0 0 18 * * ?' start indexer at 18:00 ever day search.indexing.cronjob.expression=0 0 18 * * ? +######################################################################## +# REST API +######################################################################## + +#enable/disable the rest api +restapi.enable=false +restapi.enable.values=true,values + ######################################################################## # Security ######################################################################## diff --git a/src/test/java/org/olat/restapi/RepositoryEntriesTest.java b/src/test/java/org/olat/restapi/RepositoryEntriesTest.java index 98ee5a2333f..30b5733dfa1 100644 --- a/src/test/java/org/olat/restapi/RepositoryEntriesTest.java +++ b/src/test/java/org/olat/restapi/RepositoryEntriesTest.java @@ -144,12 +144,12 @@ public class RepositoryEntriesTest extends OlatJerseyTestCase { URI request = UriBuilder.fromUri(getContextURI()).path("repo/entries").build(); HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true); - method.addHeader("Content-Type", MediaType.MULTIPART_FORM_DATA); MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); entity.addPart("file", new FileBody(cp)); entity.addPart("filename", new StringBody("cp-demo.zip")); entity.addPart("resourcename", new StringBody("CP demo")); entity.addPart("displayname", new StringBody("CP demo")); + entity.addPart("access", new StringBody("3")); method.setEntity(entity); HttpResponse response = conn.execute(method); @@ -163,6 +163,7 @@ public class RepositoryEntriesTest extends OlatJerseyTestCase { assertNotNull(re.getOwnerGroup()); assertNotNull(re.getOlatResource()); assertEquals("CP demo", re.getDisplayname()); + assertEquals(RepositoryEntry.ACC_USERS, re.getAccess()); } @Test @@ -176,7 +177,6 @@ public class RepositoryEntriesTest extends OlatJerseyTestCase { URI request = UriBuilder.fromUri(getContextURI()).path("repo/entries").build(); HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true); - method.addHeader("Content-Type", MediaType.MULTIPART_FORM_DATA); MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); entity.addPart("file", new FileBody(cp)); entity.addPart("filename", new StringBody("qti-demo.zip")); @@ -209,7 +209,6 @@ public class RepositoryEntriesTest extends OlatJerseyTestCase { URI request = UriBuilder.fromUri(getContextURI()).path("repo/entries").build(); HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true); - method.addHeader("Content-Type", MediaType.MULTIPART_FORM_DATA); MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); entity.addPart("file", new FileBody(cp)); entity.addPart("filename", new StringBody("questionnaire-demo.zip")); @@ -241,7 +240,6 @@ public class RepositoryEntriesTest extends OlatJerseyTestCase { assertTrue(conn.login("administrator", "openolat")); URI request = UriBuilder.fromUri(getContextURI()).path("repo/entries").build(); HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true); - method.addHeader("Content-Type", MediaType.MULTIPART_FORM_DATA); MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); entity.addPart("file", new FileBody(cp)); entity.addPart("filename", new StringBody("wiki-demo.zip")); @@ -274,7 +272,6 @@ public class RepositoryEntriesTest extends OlatJerseyTestCase { URI request = UriBuilder.fromUri(getContextURI()).path("repo/entries").build(); HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true); - method.addHeader("Content-Type", MediaType.MULTIPART_FORM_DATA); MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); entity.addPart("file", new FileBody(cp)); entity.addPart("filename", new StringBody("blog-demo.zip")); diff --git a/src/test/profile/mysql/olat.eclipse.properties b/src/test/profile/mysql/olat.eclipse.properties index 088eadeffe8..a9675bbdec4 100644 --- a/src/test/profile/mysql/olat.eclipse.properties +++ b/src/test/profile/mysql/olat.eclipse.properties @@ -12,6 +12,7 @@ db.show_sql=true archive.dir= log.dir= folder.root= +restapi.enable=true instance.id=2 -- GitLab