From 407d2603f98743ec9010c6cf16e1a367afbc1a5a Mon Sep 17 00:00:00 2001 From: astroshim Date: Tue, 2 Aug 2016 14:21:11 +0900 Subject: [PATCH 01/14] fit UX --- .../app/interpreter/interpreter.controller.js | 167 ++++++++++++++++++ .../src/app/interpreter/interpreter.css | 8 + .../src/app/interpreter/interpreter.html | 43 +++++ .../interpreter/InterpreterOption.java | 17 +- .../apache/zeppelin/notebook/Paragraph.java | 29 +++ 5 files changed, 263 insertions(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index d1e8889a25b..87659fc80e5 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -22,6 +22,169 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', $scope.showRepositoryInfo = false; $scope._ = _; + // auto complete related + $scope.suggestions = []; + $scope.selectIndex = -1; + var selectedUser = ''; + var selectedUserIndex = 0; + var previousSelectedList = []; + var previousSelectedListUsers = []; + var previousSelectedListInterpreters = []; + var searchText = []; + + + function updatePreviousList() { + for (var i = 0; i < searchText.length; i++) { + previousSelectedList[i] = searchText[i]; + } + } + + function convertToString(setting) { + setting.option.users = searchText.join(); + } + + var checkIfSelected = function() { + if (($scope.suggestions.length === 0) && + ($scope.selectIndex < 0 || $scope.selectIndex >= $scope.suggestions.length) || + ($scope.suggestions.length !== 0 && ($scope.selectIndex < 0 || $scope.selectIndex >= $scope.suggestions.length)) + ) { + searchText[selectedUserIndex] = selectedUser; + $scope.suggestions = []; + return true; + } else { + return false; + } + }; + + $scope.checkKeyDown = function(event, setting) { + if (event.keyCode === 40) { + event.preventDefault(); + if ($scope.selectIndex + 1 !== $scope.suggestions.length) { + $scope.selectIndex++; + } + } else if (event.keyCode === 38) { + event.preventDefault(); + + if ($scope.selectIndex - 1 !== -1) { + $scope.selectIndex--; + + } + } else if (event.keyCode === 13) { + event.preventDefault(); + if (!checkIfSelected()) { + selectedUser = $scope.suggestions[$scope.selectIndex]; + searchText[selectedUserIndex] = $scope.suggestions[$scope.selectIndex]; + updatePreviousList(); + convertToString(setting); + $scope.suggestions = []; + } + } + + }; + + $scope.checkKeyUp = function(event, setting) { + if (event.keyCode !== 8 || event.keyCode !== 46) { + if (searchText[selectedUserIndex] === '') { + $scope.suggestions = []; + } + } + if (event.keyCode < 37 || event.keyCode > 40) { // arrow buttons. + $scope.search(setting.option.users, setting); + } + }; + + $scope.assignValueAndHide = function(index, setting) { + searchText[selectedUserIndex] = $scope.suggestions[index]; + updatePreviousList(); + convertToString(setting); + $scope.suggestions = []; + }; + + angular.element(document).click(function() { + angular.element('.userlist').hide(); + angular.element('.ace_autocomplete').hide(); + }); + + + function getSuggestions(searchQuery) { + $scope.suggestions = []; + $http.get(baseUrlSrv.getRestApiBase() + '/security/userlist/' + searchQuery).then(function + (response) { + var userlist = angular.fromJson(response.data).body; + + for (var k in userlist) { + $scope.suggestions.push(userlist[k]); + } + }); + } + + function updatePreviousList() { + for (var i = 0; i < searchText.length; i++) { + previousSelectedList[i] = searchText[i]; + } + } + + var getChangedIndex = function() { + if (previousSelectedList.length === 0) { + selectedUserIndex = searchText.length - 1; + } else { + for (var i = 0; i < searchText.length; i++) { + if (previousSelectedList[i] !== searchText[i]) { + selectedUserIndex = i; + previousSelectedList = []; + break; + } + } + } + updatePreviousList(); + }; + + function convertToArray(setting) { + if (!setting.option.users) { + return; + } else if (typeof setting.option.users === 'string') { + searchText = setting.option.users.split(','); + } + + for (var i = 0; i < searchText.length; i++) { + searchText[i] = searchText[i].trim(); + } + } + + $scope.openPermissions = function() { + $scope.showInterpreterAuth = true; + }; + + $scope.closePermissions = function() { + $scope.showInterpreterAuth = false; + }; + + $scope.togglePermissions = function() { + if ($scope.showInterpreterAuth) { + $scope.closePermissions(); + } else { + $scope.openPermissions(); + } + }; + + // function to find suggestion list on change + $scope.search = function(searchQuery, setting) { + angular.element('.userlist').show(); + convertToArray(setting); + + getChangedIndex(); + $scope.selectIndex = -1; + $scope.suggestions = []; + selectedUser = searchText[selectedUserIndex]; + + if (selectedUser !== '') { + getSuggestions(selectedUser); + } else { + $scope.suggestions = []; + } + }; + + var getInterpreterSettings = function() { $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/setting').success(function(data, status, headers, config) { $scope.interpreterSettings = data.body; @@ -148,6 +311,9 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', if (setting.option.isExistingProcess === undefined) { setting.option.isExistingProcess = false; } + if (setting.option.setPermission === undefined) { + setting.option.setPermission = false; + } if (setting.option.remote === undefined) { // remote always true for now setting.option.remote = true; @@ -311,6 +477,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', option: { remote: true, isExistingProcess: false, + setPermission: false, perNoteSession: false, perNoteProcess: false diff --git a/zeppelin-web/src/app/interpreter/interpreter.css b/zeppelin-web/src/app/interpreter/interpreter.css index 9843636ae76..ee4f81db614 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.css +++ b/zeppelin-web/src/app/interpreter/interpreter.css @@ -74,6 +74,14 @@ overflow-y: auto; } +.permissionsForm { + list-style-type: none; + background: #EFEFEF; + padding: 10px 10px 10px 10px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15); + border: 1px solid #E5E5E5; +} + .interpreterSettingAdd { margin : 5px 5px 5px 5px; padding : 10px 10px 10px 10px; diff --git a/zeppelin-web/src/app/interpreter/interpreter.html b/zeppelin-web/src/app/interpreter/interpreter.html index 3c25246067a..34215ff987d 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.html +++ b/zeppelin-web/src/app/interpreter/interpreter.html @@ -192,6 +192,49 @@
Option
+
+
+ + + +
+
+ +
+ +
+
+

+ Enter comma separated interpreters in the fields.
+ Empty field (*) implies anyone can run the interpreters. +

+
+
+
+ + +
+
+
    +
  • + {{suggestion}} +
  • +
+
+
+
+
+
+
Currently there are no properties and dependencies set for this interpreter diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java index 7aac7816c5e..034200c6cf0 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java @@ -28,7 +28,8 @@ public class InterpreterOption { boolean perNoteProcess; boolean isExistingProcess; - + boolean setPermission; + String users; public boolean isExistingProcess() { return isExistingProcess; @@ -46,6 +47,20 @@ public void setHost(String host) { this.host = host; } + public boolean isSetPermission() { + return setPermission; + } + + public void setUserPermission(boolean setPermission) { + this.setPermission = setPermission; + } + + public void setUsers(String users) { + this.users = users; + } + public String getUsers() { + return users; + } public InterpreterOption() { remote = false; diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 308cbb05047..83302cf9ddd 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -275,6 +275,20 @@ public Map info() { return null; } + private boolean hasPermission(String user, String intpUsers) { + if (intpUsers.trim().equals("")) { + return true; + } + + String[] userList = intpUsers.split(","); + for (String u: userList) { + if (user.trim().equals(u.trim())) { + return true; + } + } + return false; + } + @Override protected Object jobRun() throws Throwable { String replName = getRequiredReplName(); @@ -285,6 +299,21 @@ protected Object jobRun() throws Throwable { throw new RuntimeException("Can not find interpreter for " + getRequiredReplName()); } + if (this.user != null && + !factory.getInterpreterSettings(note.getId()).isEmpty()) { + + InterpreterSetting intpGroup = factory.getInterpreterSettings(note.getId()).get(0); + if (!hasPermission(authenticationInfo.getUser(), intpGroup.getOption().getUsers())) { + logger.error("{} has no permission for {} ", authenticationInfo.getUser(), repl); + return new InterpreterResult(Code.ERROR, authenticationInfo.getUser() + + " has no permission for " + getRequiredReplName()); +/* + throw new RuntimeException(authenticationInfo.getUser() + + " has no permission for " + getRequiredReplName()); +*/ + } + } + String script = getScriptBody(); // inject form if (repl.getFormType() == FormType.NATIVE) { From 29d8f43a9b550eb14a216955b96d010d4dbf37df Mon Sep 17 00:00:00 2001 From: astroshim Date: Wed, 3 Aug 2016 17:26:01 +0900 Subject: [PATCH 02/14] fix js --- .../src/app/interpreter/interpreter.controller.js | 9 ++------- zeppelin-web/src/app/interpreter/interpreter.html | 1 - 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index 87659fc80e5..53cc087dfd3 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -28,11 +28,8 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', var selectedUser = ''; var selectedUserIndex = 0; var previousSelectedList = []; - var previousSelectedListUsers = []; - var previousSelectedListInterpreters = []; var searchText = []; - function updatePreviousList() { for (var i = 0; i < searchText.length; i++) { previousSelectedList[i] = searchText[i]; @@ -40,7 +37,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', } function convertToString(setting) { - setting.option.users = searchText.join(); + setting.option.users = searchText.join(); } var checkIfSelected = function() { @@ -105,7 +102,6 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', angular.element('.ace_autocomplete').hide(); }); - function getSuggestions(searchQuery) { $scope.suggestions = []; $http.get(baseUrlSrv.getRestApiBase() + '/security/userlist/' + searchQuery).then(function @@ -156,7 +152,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', }; $scope.closePermissions = function() { - $scope.showInterpreterAuth = false; + $scope.showInterpreterAuth = false; }; $scope.togglePermissions = function() { @@ -184,7 +180,6 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', } }; - var getInterpreterSettings = function() { $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/setting').success(function(data, status, headers, config) { $scope.interpreterSettings = data.body; diff --git a/zeppelin-web/src/app/interpreter/interpreter.html b/zeppelin-web/src/app/interpreter/interpreter.html index 34215ff987d..362161b8307 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.html +++ b/zeppelin-web/src/app/interpreter/interpreter.html @@ -216,7 +216,6 @@
Option
From b34fdf704507b74335dbfb7b8ff84d9e0cfa1199 Mon Sep 17 00:00:00 2001 From: astroshim Date: Wed, 3 Aug 2016 17:53:15 +0900 Subject: [PATCH 03/14] fix for checking intpname --- .../org/apache/zeppelin/notebook/Paragraph.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 83302cf9ddd..4a802ecc45c 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -301,16 +301,18 @@ protected Object jobRun() throws Throwable { if (this.user != null && !factory.getInterpreterSettings(note.getId()).isEmpty()) { - - InterpreterSetting intpGroup = factory.getInterpreterSettings(note.getId()).get(0); - if (!hasPermission(authenticationInfo.getUser(), intpGroup.getOption().getUsers())) { - logger.error("{} has no permission for {} ", authenticationInfo.getUser(), repl); - return new InterpreterResult(Code.ERROR, authenticationInfo.getUser() + - " has no permission for " + getRequiredReplName()); + for (InterpreterSetting intp: factory.getInterpreterSettings(note.getId())){ + if (replName.startsWith(intp.getName()) && + intp.getOption().isSetPermission() && + !hasPermission(authenticationInfo.getUser(), intp.getOption().getUsers())) { + logger.error("{} has no permission for {} ", authenticationInfo.getUser(), repl); + return new InterpreterResult(Code.ERROR, authenticationInfo.getUser() + + " has no permission for " + getRequiredReplName()); /* throw new RuntimeException(authenticationInfo.getUser() + " has no permission for " + getRequiredReplName()); */ + } } } From 1ae1c6ae2f61107807f9d57c40fd58788851ffee Mon Sep 17 00:00:00 2001 From: astroshim Date: Thu, 4 Aug 2016 14:49:12 +0900 Subject: [PATCH 04/14] fix for @AhyoungRyu pointed. --- .../src/app/interpreter/interpreter.controller.js | 11 +++++++++-- zeppelin-web/src/app/interpreter/interpreter.html | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index 53cc087dfd3..8dc21c63762 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -85,7 +85,10 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', $scope.suggestions = []; } } - if (event.keyCode < 37 || event.keyCode > 40) { // arrow buttons. + if (event.keyCode === 13) { + closeAutoComplete(); + } + else if (event.keyCode < 37 || event.keyCode > 40) { // arrow buttons. $scope.search(setting.option.users, setting); } }; @@ -98,9 +101,13 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', }; angular.element(document).click(function() { + closeAutoComplete(); + }); + + function closeAutoComplete() { angular.element('.userlist').hide(); angular.element('.ace_autocomplete').hide(); - }); + }; function getSuggestions(searchQuery) { $scope.suggestions = []; diff --git a/zeppelin-web/src/app/interpreter/interpreter.html b/zeppelin-web/src/app/interpreter/interpreter.html index 362161b8307..82ebb9cbfda 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.html +++ b/zeppelin-web/src/app/interpreter/interpreter.html @@ -206,8 +206,8 @@
Option

- Enter comma separated interpreters in the fields.
- Empty field (*) implies anyone can run the interpreters. + Enter comma separated users in the fields.
+ Empty field (*) implies anyone can run this interpreter.

From e56e5b1075c8feab7c8ea50e4d648a1f7a44541f Mon Sep 17 00:00:00 2001 From: astroshim Date: Fri, 5 Aug 2016 14:14:35 +0900 Subject: [PATCH 05/14] wip --- .../app/interpreter/interpreter.controller.js | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index 8dc21c63762..5cfa7da0606 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -34,35 +34,35 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', for (var i = 0; i < searchText.length; i++) { previousSelectedList[i] = searchText[i]; } - } + }; - function convertToString(setting) { + function assignToUsers(setting) { setting.option.users = searchText.join(); - } + }; var checkIfSelected = function() { if (($scope.suggestions.length === 0) && - ($scope.selectIndex < 0 || $scope.selectIndex >= $scope.suggestions.length) || - ($scope.suggestions.length !== 0 && ($scope.selectIndex < 0 || $scope.selectIndex >= $scope.suggestions.length)) + ($scope.selectIndex < 0 || $scope.selectIndex >= $scope.suggestions.length) || + ($scope.suggestions.length !== 0 && + ($scope.selectIndex < 0 || $scope.selectIndex >= $scope.suggestions.length)) ) { searchText[selectedUserIndex] = selectedUser; $scope.suggestions = []; return true; - } else { - return false; } + return false; }; $scope.checkKeyDown = function(event, setting) { if (event.keyCode === 40) { event.preventDefault(); - if ($scope.selectIndex + 1 !== $scope.suggestions.length) { + if ($scope.selectIndex < $scope.suggestions.length) { $scope.selectIndex++; } } else if (event.keyCode === 38) { event.preventDefault(); - if ($scope.selectIndex - 1 !== -1) { + if ($scope.selectIndex > 0) { $scope.selectIndex--; } @@ -72,7 +72,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', selectedUser = $scope.suggestions[$scope.selectIndex]; searchText[selectedUserIndex] = $scope.suggestions[$scope.selectIndex]; updatePreviousList(); - convertToString(setting); + assignToUsers(setting); $scope.suggestions = []; } } @@ -87,8 +87,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', } if (event.keyCode === 13) { closeAutoComplete(); - } - else if (event.keyCode < 37 || event.keyCode > 40) { // arrow buttons. + } else if (event.keyCode < 37 || event.keyCode > 40) { // arrow buttons. $scope.search(setting.option.users, setting); } }; @@ -96,7 +95,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', $scope.assignValueAndHide = function(index, setting) { searchText[selectedUserIndex] = $scope.suggestions[index]; updatePreviousList(); - convertToString(setting); + assignToUsers(setting); $scope.suggestions = []; }; @@ -119,13 +118,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', $scope.suggestions.push(userlist[k]); } }); - } - - function updatePreviousList() { - for (var i = 0; i < searchText.length; i++) { - previousSelectedList[i] = searchText[i]; - } - } + }; var getChangedIndex = function() { if (previousSelectedList.length === 0) { @@ -152,7 +145,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', for (var i = 0; i < searchText.length; i++) { searchText[i] = searchText[i].trim(); } - } + }; $scope.openPermissions = function() { $scope.showInterpreterAuth = true; From e1679b37a914a190d1255c7ca363f60838dca2c2 Mon Sep 17 00:00:00 2001 From: astroshim Date: Sat, 6 Aug 2016 11:33:12 +0900 Subject: [PATCH 06/14] wip --- .../app/interpreter/interpreter.controller.js | 212 ++++++------------ .../src/app/interpreter/interpreter.html | 31 +-- .../src/app/notebook/notebook.controller.js | 1 - .../interpreter/InterpreterOption.java | 9 +- .../apache/zeppelin/notebook/Paragraph.java | 12 +- 5 files changed, 89 insertions(+), 176 deletions(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index 5cfa7da0606..32d7bd6ac73 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -13,7 +13,24 @@ */ 'use strict'; -angular.module('zeppelinWebApp').controller('InterpreterCtrl', +angular.module('zeppelinWebApp') +.directive('interpreterDirective', function ($timeout) { + return { + restrict: 'A', + link: function (scope, element, attr) { + if (scope.$last === true) { + $timeout(function () { + var id = attr['onFinishRender'] || 'ngRenderFinished'; + scope.$emit(id); + }); + }/* else if (scope.updatedSetting.updated === true) { + scope.$emit('intepreterUpdated', scope.updatedSetting); + } +*/ + } + } +}) +.controller('InterpreterCtrl', function($scope, $http, baseUrlSrv, ngToast, $timeout, $route) { var interpreterSettingsTmp = []; $scope.interpreterSettings = []; @@ -22,130 +39,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', $scope.showRepositoryInfo = false; $scope._ = _; - // auto complete related - $scope.suggestions = []; - $scope.selectIndex = -1; - var selectedUser = ''; - var selectedUserIndex = 0; - var previousSelectedList = []; - var searchText = []; - - function updatePreviousList() { - for (var i = 0; i < searchText.length; i++) { - previousSelectedList[i] = searchText[i]; - } - }; - - function assignToUsers(setting) { - setting.option.users = searchText.join(); - }; - - var checkIfSelected = function() { - if (($scope.suggestions.length === 0) && - ($scope.selectIndex < 0 || $scope.selectIndex >= $scope.suggestions.length) || - ($scope.suggestions.length !== 0 && - ($scope.selectIndex < 0 || $scope.selectIndex >= $scope.suggestions.length)) - ) { - searchText[selectedUserIndex] = selectedUser; - $scope.suggestions = []; - return true; - } - return false; - }; - - $scope.checkKeyDown = function(event, setting) { - if (event.keyCode === 40) { - event.preventDefault(); - if ($scope.selectIndex < $scope.suggestions.length) { - $scope.selectIndex++; - } - } else if (event.keyCode === 38) { - event.preventDefault(); - - if ($scope.selectIndex > 0) { - $scope.selectIndex--; - - } - } else if (event.keyCode === 13) { - event.preventDefault(); - if (!checkIfSelected()) { - selectedUser = $scope.suggestions[$scope.selectIndex]; - searchText[selectedUserIndex] = $scope.suggestions[$scope.selectIndex]; - updatePreviousList(); - assignToUsers(setting); - $scope.suggestions = []; - } - } - - }; - - $scope.checkKeyUp = function(event, setting) { - if (event.keyCode !== 8 || event.keyCode !== 46) { - if (searchText[selectedUserIndex] === '') { - $scope.suggestions = []; - } - } - if (event.keyCode === 13) { - closeAutoComplete(); - } else if (event.keyCode < 37 || event.keyCode > 40) { // arrow buttons. - $scope.search(setting.option.users, setting); - } - }; - - $scope.assignValueAndHide = function(index, setting) { - searchText[selectedUserIndex] = $scope.suggestions[index]; - updatePreviousList(); - assignToUsers(setting); - $scope.suggestions = []; - }; - - angular.element(document).click(function() { - closeAutoComplete(); - }); - - function closeAutoComplete() { - angular.element('.userlist').hide(); - angular.element('.ace_autocomplete').hide(); - }; - - function getSuggestions(searchQuery) { - $scope.suggestions = []; - $http.get(baseUrlSrv.getRestApiBase() + '/security/userlist/' + searchQuery).then(function - (response) { - var userlist = angular.fromJson(response.data).body; - - for (var k in userlist) { - $scope.suggestions.push(userlist[k]); - } - }); - }; - - var getChangedIndex = function() { - if (previousSelectedList.length === 0) { - selectedUserIndex = searchText.length - 1; - } else { - for (var i = 0; i < searchText.length; i++) { - if (previousSelectedList[i] !== searchText[i]) { - selectedUserIndex = i; - previousSelectedList = []; - break; - } - } - } - updatePreviousList(); - }; - - function convertToArray(setting) { - if (!setting.option.users) { - return; - } else if (typeof setting.option.users === 'string') { - searchText = setting.option.users.split(','); - } - - for (var i = 0; i < searchText.length; i++) { - searchText[i] = searchText[i].trim(); - } - }; + $scope.updatedSetting = {"updated" : false, "index" : 0}; $scope.openPermissions = function() { $scope.showInterpreterAuth = true; @@ -155,7 +49,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', $scope.showInterpreterAuth = false; }; - $scope.togglePermissions = function() { + $scope.togglePermissions = function(intpName) { if ($scope.showInterpreterAuth) { $scope.closePermissions(); } else { @@ -163,25 +57,52 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', } }; - // function to find suggestion list on change - $scope.search = function(searchQuery, setting) { - angular.element('.userlist').show(); - convertToArray(setting); - - getChangedIndex(); - $scope.selectIndex = -1; - $scope.suggestions = []; - selectedUser = searchText[selectedUserIndex]; + $scope.$on('intepreterUpdated', function(event, data) { + console.log('interpreter updated! -->', $scope.interpreterSettings[data.index].name); + //angular.element('#' + $scope.interpreterSettings[data.index].name + '_users').select2({}); + }); - if (selectedUser !== '') { - getSuggestions(selectedUser); - } else { - $scope.suggestions = []; + $scope.$on('ngRenderFinished', function(event, data) { + for (var setting = 0; setting < $scope.interpreterSettings.length; setting++) { + angular.element('#' + $scope.interpreterSettings[setting].name + '_users').select2({ + tags: false, + multiple: true, + tokenSeparators: [',', ' '], + minimumInputLength: 2, + ajax: { + url: function(params) { + if (!params.term) { + return false; + } + return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term; + }, + delay: 250, + processResults: function(data, params) { + var users = []; + if (data.body.users.length !== 0) { + for (var i = 0; i < data.body.users.length; i++) { + users.push({ + 'id': data.body.users[i], + 'text': data.body.users[i] + }); + } + } + return { + results: users, + pagination: { + more: false + } + }; + }, + cache: false + } + }); } - }; + }); var getInterpreterSettings = function() { - $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/setting').success(function(data, status, headers, config) { + $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/setting') + .success(function(data, status, headers, config) { $scope.interpreterSettings = data.body; checkDownloadingDependencies(); }).error(function(data, status, headers, config) { @@ -313,6 +234,11 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', // remote always true for now setting.option.remote = true; } + + if (setting.option.setPermission === true) { + setting.option.users = angular.element('#' + setting.name + '_users').val(); + } + var request = { option: angular.copy(setting.option), properties: angular.copy(setting.properties), @@ -329,6 +255,9 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', removeTMPSettings(index); thisConfirm.close(); checkDownloadingDependencies(); + + $scope.updatedSetting.updated = true; + $scope.updatedSetting.index = index; }) .error(function(data, status, headers, config) { console.log('Error %o %o', status, data.message); @@ -649,6 +578,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', var init = function() { $scope.resetNewInterpreterSetting(); $scope.resetNewRepositorySetting(); + getInterpreterSettings(); getAvailableInterpreters(); getRepositories(); diff --git a/zeppelin-web/src/app/interpreter/interpreter.html b/zeppelin-web/src/app/interpreter/interpreter.html index 82ebb9cbfda..2028b6d0e07 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.html +++ b/zeppelin-web/src/app/interpreter/interpreter.html @@ -84,9 +84,10 @@

Repositories

+ ng-repeat="setting in interpreterSettings | orderBy: 'name' | filter: searchInterpreter" interpreter-directive>
+

{{setting.name}} @@ -191,11 +192,10 @@
Option
pu-elastic-input-minwidth="180px" ng-model="setting.option.port" ng-disabled="!valueform.$visible" />

-
-
@@ -210,26 +210,11 @@
Option
Empty field (*) implies anyone can run this interpreter.

- -
- - -
-
-
    -
  • - {{suggestion}} -
  • -
-
- + + Owners +
diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index bf92fb71f3f..1d5e826275e 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -18,7 +18,6 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro baseUrlSrv, $timeout, saveAsService) { $scope.note = null; $scope.moment = moment; - $scope.showEditor = false; $scope.editorToggled = false; $scope.tableToggled = false; $scope.viewOnly = false; diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java index 034200c6cf0..ee5f34127e9 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java @@ -17,6 +17,8 @@ package org.apache.zeppelin.interpreter; +import java.util.List; + /** * */ @@ -29,7 +31,7 @@ public class InterpreterOption { boolean isExistingProcess; boolean setPermission; - String users; + List users; public boolean isExistingProcess() { return isExistingProcess; @@ -55,10 +57,7 @@ public void setUserPermission(boolean setPermission) { this.setPermission = setPermission; } - public void setUsers(String users) { - this.users = users; - } - public String getUsers() { + public List getUsers() { return users; } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 4a802ecc45c..24c1175cf0a 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -275,13 +275,12 @@ public Map info() { return null; } - private boolean hasPermission(String user, String intpUsers) { - if (intpUsers.trim().equals("")) { + private boolean hasPermission(String user, List intpUsers) { + if (1 > intpUsers.size()) { return true; } - String[] userList = intpUsers.split(","); - for (String u: userList) { + for (String u: intpUsers) { if (user.trim().equals(u.trim())) { return true; } @@ -302,6 +301,7 @@ protected Object jobRun() throws Throwable { if (this.user != null && !factory.getInterpreterSettings(note.getId()).isEmpty()) { for (InterpreterSetting intp: factory.getInterpreterSettings(note.getId())){ + if (replName.startsWith(intp.getName()) && intp.getOption().isSetPermission() && !hasPermission(authenticationInfo.getUser(), intp.getOption().getUsers())) { @@ -309,8 +309,8 @@ protected Object jobRun() throws Throwable { return new InterpreterResult(Code.ERROR, authenticationInfo.getUser() + " has no permission for " + getRequiredReplName()); /* - throw new RuntimeException(authenticationInfo.getUser() + - " has no permission for " + getRequiredReplName()); + throw new RuntimeException(authenticationInfo.getUser() + + " has no permission for " + getRequiredReplName()); */ } } From e1e7a353eb88240ff4db056e9791765158ab6fca Mon Sep 17 00:00:00 2001 From: astroshim Date: Sat, 6 Aug 2016 21:55:52 +0900 Subject: [PATCH 07/14] add interpreter create. --- .../interpreter-create.html | 29 +++++ .../app/interpreter/interpreter.controller.js | 107 +++++++++--------- .../src/app/interpreter/interpreter.html | 2 +- 3 files changed, 84 insertions(+), 54 deletions(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter-create/interpreter-create.html b/zeppelin-web/src/app/interpreter/interpreter-create/interpreter-create.html index 599248b2e56..ab8983faf94 100644 --- a/zeppelin-web/src/app/interpreter/interpreter-create/interpreter-create.html +++ b/zeppelin-web/src/app/interpreter/interpreter-create/interpreter-create.html @@ -88,6 +88,35 @@

Create new interpreter

pu-elastic-input-minwidth="180px" ng-model="newInterpreterSetting.option.port" />
+
+
+ + + +
+
+ +
+ +
+
+

+ Enter comma separated users in the fields.
+ Empty field (*) implies anyone can run this interpreter. +

+
+ + Owners + +
+
+
+
+ + Properties diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index 32d7bd6ac73..5d6521e45da 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -14,21 +14,18 @@ 'use strict'; angular.module('zeppelinWebApp') -.directive('interpreterDirective', function ($timeout) { +.directive('interpreterDirective', function($timeout) { return { restrict: 'A', - link: function (scope, element, attr) { + link: function(scope, element, attr) { if (scope.$last === true) { - $timeout(function () { - var id = attr['onFinishRender'] || 'ngRenderFinished'; + $timeout(function() { + var id = 'ngRenderFinished'; scope.$emit(id); }); - }/* else if (scope.updatedSetting.updated === true) { - scope.$emit('intepreterUpdated', scope.updatedSetting); } -*/ } - } + }; }) .controller('InterpreterCtrl', function($scope, $http, baseUrlSrv, ngToast, $timeout, $route) { @@ -39,8 +36,6 @@ angular.module('zeppelinWebApp') $scope.showRepositoryInfo = false; $scope._ = _; - $scope.updatedSetting = {"updated" : false, "index" : 0}; - $scope.openPermissions = function() { $scope.showInterpreterAuth = true; }; @@ -49,7 +44,45 @@ angular.module('zeppelinWebApp') $scope.showInterpreterAuth = false; }; + var getSelectJson = function() { + var selectJson = { + tags: false, + multiple: true, + tokenSeparators: [',', ' '], + minimumInputLength: 2, + ajax: { + url: function(params) { + if (!params.term) { + return false; + } + return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term; + }, + delay: 250, + processResults: function(data, params) { + var users = []; + if (data.body.users.length !== 0) { + for (var i = 0; i < data.body.users.length; i++) { + users.push({ + 'id': data.body.users[i], + 'text': data.body.users[i] + }); + } + } + return { + results: users, + pagination: { + more: false + } + }; + }, + cache: false + } + } + return selectJson; + }; + $scope.togglePermissions = function(intpName) { + angular.element('#' + intpName + 'Users').select2(getSelectJson()); if ($scope.showInterpreterAuth) { $scope.closePermissions(); } else { @@ -57,46 +90,9 @@ angular.module('zeppelinWebApp') } }; - $scope.$on('intepreterUpdated', function(event, data) { - console.log('interpreter updated! -->', $scope.interpreterSettings[data.index].name); - //angular.element('#' + $scope.interpreterSettings[data.index].name + '_users').select2({}); - }); - $scope.$on('ngRenderFinished', function(event, data) { for (var setting = 0; setting < $scope.interpreterSettings.length; setting++) { - angular.element('#' + $scope.interpreterSettings[setting].name + '_users').select2({ - tags: false, - multiple: true, - tokenSeparators: [',', ' '], - minimumInputLength: 2, - ajax: { - url: function(params) { - if (!params.term) { - return false; - } - return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term; - }, - delay: 250, - processResults: function(data, params) { - var users = []; - if (data.body.users.length !== 0) { - for (var i = 0; i < data.body.users.length; i++) { - users.push({ - 'id': data.body.users[i], - 'text': data.body.users[i] - }); - } - } - return { - results: users, - pagination: { - more: false - } - }; - }, - cache: false - } - }); + angular.element('#' + $scope.interpreterSettings[setting].name + 'Users').select2(getSelectJson()); } }); @@ -193,7 +189,6 @@ angular.module('zeppelinWebApp') var setting = $scope.interpreterSettings[index]; option = setting.option; } - if (option.perNoteSession) { return 'scoped'; } else if (option.perNoteProcess) { @@ -236,7 +231,7 @@ angular.module('zeppelinWebApp') } if (setting.option.setPermission === true) { - setting.option.users = angular.element('#' + setting.name + '_users').val(); + setting.option.users = angular.element('#' + setting.name + 'Users').val(); } var request = { @@ -255,9 +250,7 @@ angular.module('zeppelinWebApp') removeTMPSettings(index); thisConfirm.close(); checkDownloadingDependencies(); - - $scope.updatedSetting.updated = true; - $scope.updatedSetting.index = index; + $route.reload(); }) .error(function(data, status, headers, config) { console.log('Error %o %o', status, data.message); @@ -366,6 +359,14 @@ angular.module('zeppelinWebApp') $scope.addNewInterpreterDependency(); } + if (newSetting.option.setPermission === undefined) { + newSetting.option.setPermission = false; + } + + if (newSetting.option.setPermission === true) { + newSetting.option.users = angular.element('#newInterpreterUsers').val(); + } + var request = angular.copy($scope.newInterpreterSetting); // Change properties to proper request format diff --git a/zeppelin-web/src/app/interpreter/interpreter.html b/zeppelin-web/src/app/interpreter/interpreter.html index 2028b6d0e07..b3d3333a0d8 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.html +++ b/zeppelin-web/src/app/interpreter/interpreter.html @@ -212,7 +212,7 @@
Option
Owners -
From e42cb9e73c89d02373e16768c66fd5f6ab3a7ef1 Mon Sep 17 00:00:00 2001 From: astroshim Date: Sat, 6 Aug 2016 22:01:45 +0900 Subject: [PATCH 08/14] fix initialize user value --- .../src/app/interpreter/interpreter.controller.js | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index 5d6521e45da..aac89254b8d 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -229,10 +229,7 @@ angular.module('zeppelinWebApp') // remote always true for now setting.option.remote = true; } - - if (setting.option.setPermission === true) { - setting.option.users = angular.element('#' + setting.name + 'Users').val(); - } + setting.option.users = angular.element('#' + setting.name + 'Users').val(); var request = { option: angular.copy(setting.option), @@ -358,14 +355,10 @@ angular.module('zeppelinWebApp') if (newSetting.depArtifact !== '' || newSetting.depArtifact) { $scope.addNewInterpreterDependency(); } - if (newSetting.option.setPermission === undefined) { newSetting.option.setPermission = false; } - - if (newSetting.option.setPermission === true) { - newSetting.option.users = angular.element('#newInterpreterUsers').val(); - } + newSetting.option.users = angular.element('#newInterpreterUsers').val(); var request = angular.copy($scope.newInterpreterSetting); From febce0c4296babab94e3601b74d5675f6b8a8083 Mon Sep 17 00:00:00 2001 From: astroshim Date: Sat, 6 Aug 2016 22:06:30 +0900 Subject: [PATCH 09/14] fix js --- zeppelin-web/src/app/interpreter/interpreter.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index aac89254b8d..e69490eae4b 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -77,7 +77,7 @@ angular.module('zeppelinWebApp') }, cache: false } - } + }; return selectJson; }; From f07542ad04ae6415e3e2f1eaa52ed90920e3b370 Mon Sep 17 00:00:00 2001 From: astroshim Date: Tue, 9 Aug 2016 13:15:30 +0900 Subject: [PATCH 10/14] remove comment --- .../src/main/java/org/apache/zeppelin/notebook/Paragraph.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 24c1175cf0a..221992bd0c2 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -308,10 +308,6 @@ protected Object jobRun() throws Throwable { logger.error("{} has no permission for {} ", authenticationInfo.getUser(), repl); return new InterpreterResult(Code.ERROR, authenticationInfo.getUser() + " has no permission for " + getRequiredReplName()); -/* - throw new RuntimeException(authenticationInfo.getUser() + - " has no permission for " + getRequiredReplName()); -*/ } } } From 3e25159464c30ed1638e22b8310ae3f3b57bd65b Mon Sep 17 00:00:00 2001 From: astroshim Date: Tue, 9 Aug 2016 13:28:44 +0900 Subject: [PATCH 11/14] move directive to componets --- .../app/interpreter/interpreter.controller.js | 16 +--------- .../interpreter/interpreter.directive.js | 29 +++++++++++++++++++ zeppelin-web/src/index.html | 1 + 3 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 zeppelin-web/src/components/interpreter/interpreter.directive.js diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index e69490eae4b..276657d1276 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -13,21 +13,7 @@ */ 'use strict'; -angular.module('zeppelinWebApp') -.directive('interpreterDirective', function($timeout) { - return { - restrict: 'A', - link: function(scope, element, attr) { - if (scope.$last === true) { - $timeout(function() { - var id = 'ngRenderFinished'; - scope.$emit(id); - }); - } - } - }; -}) -.controller('InterpreterCtrl', +angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope, $http, baseUrlSrv, ngToast, $timeout, $route) { var interpreterSettingsTmp = []; $scope.interpreterSettings = []; diff --git a/zeppelin-web/src/components/interpreter/interpreter.directive.js b/zeppelin-web/src/components/interpreter/interpreter.directive.js new file mode 100644 index 00000000000..8c3a457fa72 --- /dev/null +++ b/zeppelin-web/src/components/interpreter/interpreter.directive.js @@ -0,0 +1,29 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp') +.directive('interpreterDirective', function($timeout) { + return { + restrict: 'A', + link: function(scope, element, attr) { + if (scope.$last === true) { + $timeout(function() { + var id = 'ngRenderFinished'; + scope.$emit(id); + }); + } + } + }; +}) diff --git a/zeppelin-web/src/index.html b/zeppelin-web/src/index.html index b23db7a7530..0697dcaa104 100644 --- a/zeppelin-web/src/index.html +++ b/zeppelin-web/src/index.html @@ -164,6 +164,7 @@ + From 7ed8ad6e14f820a1e2e161f084bb5bcd33427bea Mon Sep 17 00:00:00 2001 From: astroshim Date: Tue, 9 Aug 2016 13:34:30 +0900 Subject: [PATCH 12/14] fix js code style --- .../src/components/interpreter/interpreter.directive.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/zeppelin-web/src/components/interpreter/interpreter.directive.js b/zeppelin-web/src/components/interpreter/interpreter.directive.js index 8c3a457fa72..1cf1ab2d178 100644 --- a/zeppelin-web/src/components/interpreter/interpreter.directive.js +++ b/zeppelin-web/src/components/interpreter/interpreter.directive.js @@ -13,8 +13,7 @@ */ 'use strict'; -angular.module('zeppelinWebApp') -.directive('interpreterDirective', function($timeout) { +angular.module('zeppelinWebApp').directive('interpreterDirective', function($timeout) { return { restrict: 'A', link: function(scope, element, attr) { @@ -26,4 +25,4 @@ angular.module('zeppelinWebApp') } } }; -}) +}); From 2c48dedb1c8d1e74fcc471d40c53635b8f92f27c Mon Sep 17 00:00:00 2001 From: astroshim Date: Tue, 16 Aug 2016 00:50:22 +0900 Subject: [PATCH 13/14] code refactor. --- .../apache/zeppelin/notebook/Paragraph.java | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 221992bd0c2..46f96224a83 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -298,17 +298,14 @@ protected Object jobRun() throws Throwable { throw new RuntimeException("Can not find interpreter for " + getRequiredReplName()); } - if (this.user != null && - !factory.getInterpreterSettings(note.getId()).isEmpty()) { - for (InterpreterSetting intp: factory.getInterpreterSettings(note.getId())){ - - if (replName.startsWith(intp.getName()) && - intp.getOption().isSetPermission() && - !hasPermission(authenticationInfo.getUser(), intp.getOption().getUsers())) { - logger.error("{} has no permission for {} ", authenticationInfo.getUser(), repl); - return new InterpreterResult(Code.ERROR, authenticationInfo.getUser() + - " has no permission for " + getRequiredReplName()); - } + if (this.noteHasUser() && this.noteHasInterpreters()) { + InterpreterSetting intp = getInterpreterSettingById(repl.getInterpreterGroup().getId()); + if (intp != null && + interpreterHasUser(intp) && + isUserAuthorizedToAccessInterpreter(intp.getOption()) == false) { + logger.error("{} has no permission for {} ", authenticationInfo.getUser(), repl); + return new InterpreterResult(Code.ERROR, authenticationInfo.getUser() + + " has no permission for " + getRequiredReplName()); } } @@ -366,6 +363,34 @@ protected Object jobRun() throws Throwable { } } + private boolean noteHasUser() { + return this.user != null; + } + + private boolean noteHasInterpreters() { + return !factory.getInterpreterSettings(note.getId()).isEmpty(); + } + + private boolean interpreterHasUser(InterpreterSetting intp) { + return intp.getOption().isSetPermission() && intp.getOption().getUsers() != null; + } + + private boolean isUserAuthorizedToAccessInterpreter(InterpreterOption intpOpt){ + return intpOpt.isSetPermission() && + hasPermission(authenticationInfo.getUser(), intpOpt.getUsers()); + } + + private InterpreterSetting getInterpreterSettingById(String id) { + InterpreterSetting setting = null; + for (InterpreterSetting i: factory.getInterpreterSettings(note.getId())) { + if (id.startsWith(i.getId())) { + setting = i; + break; + } + } + return setting; + } + @Override protected boolean jobAbort() { Interpreter repl = getRepl(getRequiredReplName()); From 83097ab4a636ad5d10c8d428c952e12329b3f751 Mon Sep 17 00:00:00 2001 From: astroshim Date: Tue, 16 Aug 2016 14:39:51 +0900 Subject: [PATCH 14/14] fix naming. --- .../org/apache/zeppelin/interpreter/InterpreterOption.java | 2 +- .../src/main/java/org/apache/zeppelin/notebook/Paragraph.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java index ee5f34127e9..2bcc4c69ac0 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java @@ -49,7 +49,7 @@ public void setHost(String host) { this.host = host; } - public boolean isSetPermission() { + public boolean permissionIsSet() { return setPermission; } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 46f96224a83..079216c76b9 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -372,11 +372,11 @@ private boolean noteHasInterpreters() { } private boolean interpreterHasUser(InterpreterSetting intp) { - return intp.getOption().isSetPermission() && intp.getOption().getUsers() != null; + return intp.getOption().permissionIsSet() && intp.getOption().getUsers() != null; } private boolean isUserAuthorizedToAccessInterpreter(InterpreterOption intpOpt){ - return intpOpt.isSetPermission() && + return intpOpt.permissionIsSet() && hasPermission(authenticationInfo.getUser(), intpOpt.getUsers()); }