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