diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index 19bfba10b54..4a90b929624 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -719,7 +719,10 @@ protected Note importNote(NotebookSocket conn, HashSet userAndRoles, if (fromMessage != null) { String noteName = (String) ((Map) fromMessage.get("notebook")).get("name"); String noteJson = gson.toJson(fromMessage.get("notebook")); - AuthenticationInfo subject = new AuthenticationInfo(fromMessage.principal); + AuthenticationInfo subject = null; + if (fromMessage.principal != null) { + subject = new AuthenticationInfo(fromMessage.principal); + } note = notebook.importNote(noteJson, noteName, subject); note.persist(subject); broadcastNote(note); diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java index 9acb156a3a3..9c54f4c1c21 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java @@ -24,10 +24,12 @@ import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; import com.google.gson.Gson; @@ -158,6 +160,11 @@ public Note createNote(List interpreterIds, AuthenticationInfo subject) note.putDefaultReplName(); } + if (subject != null && !"anonymous".equals(subject.getUser())) { + Set owners = new HashSet(); + owners.add(subject.getUser()); + notebookAuthorization.setOwners(note.getId(), owners); + } notebookIndex.addIndexDoc(note); note.persist(subject); fireNoteCreateEvent(note); diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index 648062eda2e..7718ec4535e 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -42,6 +42,7 @@ import org.apache.zeppelin.scheduler.Job.Status; import org.apache.zeppelin.scheduler.SchedulerFactory; import org.apache.zeppelin.search.SearchService; +import org.apache.zeppelin.user.AuthenticationInfo; import org.apache.zeppelin.user.Credentials; import org.junit.After; import org.junit.Before; @@ -209,6 +210,18 @@ public void testPersist() throws IOException, SchedulerException, RepositoryExce assertEquals(1, notebook2.getAllNotes().size()); } + @Test + public void testCreateNoteWithSubject() throws IOException, SchedulerException, RepositoryException { + AuthenticationInfo subject = new AuthenticationInfo("user1"); + Note note = notebook.createNote(subject); + + assertNotNull(notebook.getNotebookAuthorization().getOwners(note.getId())); + assertEquals(1, notebook.getNotebookAuthorization().getOwners(note.getId()).size()); + Set owners = new HashSet<>(); + owners.add("user1"); + assertEquals(owners, notebook.getNotebookAuthorization().getOwners(note.getId())); + } + @Test public void testClearParagraphOutput() throws IOException, SchedulerException{ Note note = notebook.createNote(null); @@ -351,7 +364,7 @@ public void testAutoRestartInterpreterAfterSchedule() throws InterruptedExceptio @Test public void testExportAndImportNote() throws IOException, CloneNotSupportedException, - InterruptedException { + InterruptedException, InterpreterException, SchedulerException, RepositoryException { Note note = notebook.createNote(null); factory.setInterpreters(note.getId(), factory.getDefaultInterpreterSettingList()); @@ -374,11 +387,20 @@ public void testExportAndImportNote() throws IOException, CloneNotSupportedExcep assertEquals(p.getId(), p2.getId()); assertEquals(p.text, p2.text); assertEquals(p.getResult().message(), p2.getResult().message()); + + // Verify import note with subject + AuthenticationInfo subject = new AuthenticationInfo("user1"); + Note importedNote2 = notebook.importNote(exportedNoteJson, "Title2", subject); + assertNotNull(notebook.getNotebookAuthorization().getOwners(importedNote2.getId())); + assertEquals(1, notebook.getNotebookAuthorization().getOwners(importedNote2.getId()).size()); + Set owners = new HashSet<>(); + owners.add("user1"); + assertEquals(owners, notebook.getNotebookAuthorization().getOwners(importedNote2.getId())); } @Test public void testCloneNote() throws IOException, CloneNotSupportedException, - InterruptedException { + InterruptedException, InterpreterException, SchedulerException, RepositoryException { Note note = notebook.createNote(null); factory.setInterpreters(note.getId(), factory.getDefaultInterpreterSettingList()); @@ -396,6 +418,15 @@ public void testCloneNote() throws IOException, CloneNotSupportedException, assertEquals(cp.getId(), p.getId()); assertEquals(cp.text, p.text); assertEquals(cp.getResult().message(), p.getResult().message()); + + // Verify clone note with subject + AuthenticationInfo subject = new AuthenticationInfo("user1"); + Note cloneNote2 = notebook.cloneNote(note.getId(), "clone note2", subject); + assertNotNull(notebook.getNotebookAuthorization().getOwners(cloneNote2.getId())); + assertEquals(1, notebook.getNotebookAuthorization().getOwners(cloneNote2.getId()).size()); + Set owners = new HashSet<>(); + owners.add("user1"); + assertEquals(owners, notebook.getNotebookAuthorization().getOwners(cloneNote2.getId())); } @Test