diff --git a/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js b/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js
index 800d450d50d..f40c47f3079 100644
--- a/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js
+++ b/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js
@@ -30,7 +30,8 @@ angular.module('zeppelinWebApp').factory('websocketEvents', function($rootScope,
websocketCalls.sendNewEvent = function(data) {
data.principal = $rootScope.ticket.principal;
data.ticket = $rootScope.ticket.ticket;
- console.log('Send >> %o, %o, %o, %o', data.op, data.principal, data.ticket, data);
+ data.roles = $rootScope.ticket.roles;
+ console.log('Send >> %o, %o, %o, %o, %o', data.op, data.principal, data.ticket, data.roles, data);
websocketCalls.ws.send(JSON.stringify(data));
};
@@ -52,12 +53,14 @@ angular.module('zeppelinWebApp').factory('websocketEvents', function($rootScope,
$location.path('notebook/' + data.note.id);
} else if (op === 'NOTES_INFO') {
$rootScope.$broadcast('setNoteMenu', data.notes);
+ } else if (op === 'AUTH_INFO') {
+ alert(data.info.toString());
} else if (op === 'PARAGRAPH') {
$rootScope.$broadcast('updateParagraph', data);
} else if (op === 'PARAGRAPH_APPEND_OUTPUT') {
$rootScope.$broadcast('appendParagraphOutput', data);
} else if (op === 'PARAGRAPH_UPDATE_OUTPUT') {
- $rootScope.$broadcast('updateParagraphOutput', data);
+ $rootScope.$broadcast('updateParagraphOutput', data);
} else if (op === 'PROGRESS') {
$rootScope.$broadcast('updateProgress', data);
} else if (op === 'COMPLETION_LIST') {
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
index b0470c82d5d..3765b3266e0 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
@@ -59,6 +59,9 @@ public class Note implements Serializable, JobListener {
private String name = "";
private String id;
+ private HashSet owners = new HashSet();
+ private HashSet readers = new HashSet();
+ private HashSet writers = new HashSet();
@SuppressWarnings("rawtypes")
Map> angularObjects = new HashMap<>();
@@ -115,6 +118,51 @@ public void setName(String name) {
this.name = name;
}
+ public HashSet getOwners() {
+ return (new HashSet(owners));
+ }
+
+ public void setOwners(HashSet owners) {
+ this.owners = new HashSet(owners);
+ }
+
+ public HashSet getReaders() {
+ return (new HashSet(readers));
+ }
+
+ public void setReaders(HashSet readers) {
+ this.readers = new HashSet(readers);
+ }
+
+ public HashSet getWriters() {
+ return (new HashSet(writers));
+ }
+
+ public void setWriters(HashSet writers) {
+ this.writers = new HashSet(writers);
+ }
+
+ public boolean isOwner(HashSet entities) {
+ return isMember(entities, this.owners);
+ }
+
+ public boolean isWriter(HashSet entities) {
+ return isMember(entities, this.writers) || isMember(entities, this.owners);
+ }
+
+ public boolean isReader(HashSet entities) {
+ return isMember(entities, this.readers) ||
+ isMember(entities, this.owners) ||
+ isMember(entities, this.writers);
+ }
+
+ // return true if b is empty or if (a intersection b) is non-empty
+ private boolean isMember(HashSet a, HashSet b) {
+ Set intersection = new HashSet(b);
+ intersection.retainAll(a);
+ return (b.isEmpty() || (intersection.size() > 0));
+ }
+
public NoteInterpreterLoader getNoteReplLoader() {
return replLoader;
}
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 d96f7a90a0e..0b5af2ca3fb 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
@@ -27,10 +27,12 @@
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.HashSet;
import org.apache.commons.io.FileUtils;
import org.apache.zeppelin.conf.ZeppelinConfiguration;
@@ -425,6 +427,31 @@ public void testAngularObjectRemovalOnInterpreterRestart() throws InterruptedExc
notebook.removeNote(note.id());
}
+ @Test
+ public void testPermissions() throws IOException {
+ // create a note and a paragraph
+ Note note = notebook.createNote();
+ // empty owners, readers and writers means note is public
+ assertEquals(note.isOwner(new HashSet(Arrays.asList("user2"))), true);
+ assertEquals(note.isReader(new HashSet(Arrays.asList("user2"))), true);
+ assertEquals(note.isWriter(new HashSet(Arrays.asList("user2"))), true);
+
+ note.setOwners(new HashSet(Arrays.asList("user1")));
+ note.setReaders(new HashSet(Arrays.asList("user1", "user2")));
+ note.setWriters(new HashSet(Arrays.asList("user1")));
+
+ assertEquals(note.isOwner(new HashSet(Arrays.asList("user2"))), false);
+ assertEquals(note.isOwner(new HashSet(Arrays.asList("user1"))), true);
+
+ assertEquals(note.isReader(new HashSet(Arrays.asList("user3"))), false);
+ assertEquals(note.isReader(new HashSet(Arrays.asList("user2"))), true);
+
+ assertEquals(note.isWriter(new HashSet(Arrays.asList("user2"))), false);
+ assertEquals(note.isWriter(new HashSet(Arrays.asList("user1"))), true);
+
+ notebook.removeNote(note.id());
+ }
+
@Test
public void testAbortParagraphStatusOnInterpreterRestart() throws InterruptedException,
IOException {