diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java index 2796500ac86..005a14b0a78 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java @@ -644,14 +644,29 @@ public Response getCronJob(@PathParam("notebookId") String notebookId) throws } /** - * Search for a Notes + * Search for a Notes with permissions */ @GET @Path("search") public Response search(@QueryParam("q") String queryTerm) { LOG.info("Searching notebooks for: {}", queryTerm); + String principal = SecurityUtils.getPrincipal(); + HashSet roles = SecurityUtils.getRoles(); + HashSet userAndRoles = new HashSet(); + userAndRoles.add(principal); + userAndRoles.addAll(roles); List> notebooksFound = notebookIndex.query(queryTerm); - LOG.info("{} notbooks found", notebooksFound.size()); + for (int i = 0; i < notebooksFound.size(); i++) { + String[] Id = notebooksFound.get(i).get("id").split("/", 2); + String noteId = Id[0]; + if (!notebookAuthorization.isOwner(noteId, userAndRoles) && + !notebookAuthorization.isReader(noteId, userAndRoles) && + !notebookAuthorization.isWriter(noteId, userAndRoles)) { + notebooksFound.remove(i); + i--; + } + } + LOG.info("{} notebooks found", notebooksFound.size()); return new JsonResponse<>(Status.OK, notebooksFound).build(); } diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java index 3c7c7d0e67e..2f2a36bc5b7 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java @@ -18,6 +18,7 @@ package org.apache.zeppelin.rest; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -690,5 +691,70 @@ public void testDeleteParagraph() throws IOException { ZeppelinServer.notebook.removeNote(note.getId()); } + + @Test + public void testSearch() throws IOException { + Map body; + + GetMethod getSecurityTicket = httpGet("/security/ticket"); + getSecurityTicket.addRequestHeader("Origin", "http://localhost"); + Map respSecurityTicket = gson.fromJson(getSecurityTicket.getResponseBodyAsString(), + new TypeToken>() { + }.getType()); + body = (Map) respSecurityTicket.get("body"); + String username = body.get("principal"); + getSecurityTicket.releaseConnection(); + + Note note1 = ZeppelinServer.notebook.createNote(); + String jsonRequest = "{\"title\": \"title1\", \"text\": \"ThisIsToTestSearchMethodWithPermissions 1\"}"; + PostMethod postNotebookText = httpPost("/notebook/" + note1.getId() + "/paragraph", jsonRequest); + postNotebookText.releaseConnection(); + + Note note2 = ZeppelinServer.notebook.createNote(); + jsonRequest = "{\"title\": \"title1\", \"text\": \"ThisIsToTestSearchMethodWithPermissions 2\"}"; + postNotebookText = httpPost("/notebook/" + note2.getId() + "/paragraph", jsonRequest); + postNotebookText.releaseConnection(); + + String jsonPermissions = "{\"owners\":[\"" + username + "\"],\"readers\":[\"" + username + "\"],\"writers\":[\"" + username + "\"]}"; + PutMethod putPermission = httpPut("/notebook/" + note1.getId() + "/permissions", jsonPermissions); + putPermission.releaseConnection(); + + jsonPermissions = "{\"owners\":[\"admin\"],\"readers\":[\"admin\"],\"writers\":[\"admin\"]}"; + putPermission = httpPut("/notebook/" + note2.getId() + "/permissions", jsonPermissions); + putPermission.releaseConnection(); + + GetMethod searchNotebook = httpGet("/notebook/search?q='ThisIsToTestSearchMethodWithPermissions'"); + searchNotebook.addRequestHeader("Origin", "http://localhost"); + Map respSearchResult = gson.fromJson(searchNotebook.getResponseBodyAsString(), + new TypeToken>() { + }.getType()); + ArrayList searchBody = (ArrayList) respSearchResult.get("body"); + + assertEquals("At-least one search results is there", true, searchBody.size() >= 1); + + for (int i = 0; i < searchBody.size(); i++) { + Map searchResult = (Map) searchBody.get(i); + String userId = searchResult.get("id").split("/", 2)[0]; + GetMethod getPermission = httpGet("/notebook/" + userId + "/permissions"); + getPermission.addRequestHeader("Origin", "http://localhost"); + Map resp = gson.fromJson(getPermission.getResponseBodyAsString(), + new TypeToken>() { + }.getType()); + Map permissions = (Map) resp.get("body"); + ArrayList owners = permissions.get("owners"); + ArrayList readers = permissions.get("readers"); + ArrayList writers = permissions.get("writers"); + + if (owners.size() != 0 && readers.size() != 0 && writers.size() != 0) { + assertEquals("User has permissions ", true, (owners.contains(username) || readers.contains(username) || + writers.contains(username))); + } + getPermission.releaseConnection(); + } + searchNotebook.releaseConnection(); + ZeppelinServer.notebook.removeNote(note1.getId()); + ZeppelinServer.notebook.removeNote(note2.getId()); + } + }