changeset 1596:5f306566ebe7

new annotation user login dialog that doesn't show the password in clear.
author robcast
date Fri, 10 Feb 2017 20:05:32 +0100
parents d1921b08fedb
children 4e22d3adf4c8 4326b99b471f
files webapp/src/main/webapp/jquery/jquery.digilib.annotator.js webapp/src/main/webapp/jquery/jquery.digilib.css webapp/src/main/webapp/jquery/jquery.digilib.dialogs.js
diffstat 3 files changed, 136 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.annotator.js	Fri Feb 10 14:24:52 2017 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.annotator.js	Fri Feb 10 20:05:32 2017 +0100
@@ -31,7 +31,7 @@
  */
 (function($) {
     // version of this plugin
-    var version = 'jquery.digilib.annotator.js 1.3.5';
+    var version = 'jquery.digilib.annotator.js 1.3.6';
 
     // affine geometry
     var geom = null;
@@ -107,21 +107,26 @@
         		console.error("setAnnotationUser: No Auth plugin!!");
         		return;
         	}
-        	// set new user in digilib and Annotator Auth plugin
-        	setAnnotationUser(data, auth, user, password);
-        	// get new token
-        	auth.token = null;
-        	auth._unsafeToken = null;
-        	// save new token in cookie
-        	auth.withToken(function (tkn) {
-        		data.dlOpts.annotationToken = auth.token;
- 		        fn.storeOptions(data);
-		        // clear annotations
-        		data.annotations = [];
-        		annotator.plugins.Store.annotations = [];
-	        	// reload annotations
-        		annotator.plugins.Store.pluginInit();
-        	});
+        	if (user == null) {
+				if (fn.showUserPasswordDialog != null) {
+					fn.showUserPasswordDialog(data, "Please enter user name and password for annotation server.", 
+							function (userInput, passInput) {
+								console.debug("got username and password for annotation auth.");
+								setAnnotationUser(data, auth, userInput, passInput);
+							});
+				} else {
+			        // fall back to JS-prompt
+			        user = window.prompt("Please authenticate (Cancel to log out): User name", data.settings.annotationUser);
+			        if (user != null && user != 'anonymous') {
+			            // password entered in JS-prompt
+			            password = window.prompt("Please authenticate: Password (Beware! Password is visible!)", '');
+			        }
+					setAnnotationUser(data, auth, user, password);
+				}
+        	} else {
+	        	// set new user in digilib and Annotator Auth plugin
+	        	setAnnotationUser(data, auth, user, password);
+        	}
         },
 
         /**
@@ -234,41 +239,51 @@
      * @param password password (optional)
      */
 	var setAnnotationUser = function (data, auth, user, password) {
-		if (user == null) {
-	        // user name entered in JS-prompt
-	        user = window.prompt("Please authenticate (Cancel to log out): User name", data.settings.annotationUser);
-	        if (user != null && user != 'anonymous') {
-	            // password entered in JS-prompt
-	            password = window.prompt("Please authenticate: Password", '');
-	            // set params for Auth plugin
-	         	auth.options.requestData.password = password;
-	    		// try to use the safe url for the password
-    			if (data.settings.annotationSafeTokenUrl != null) {
-    				auth.options.tokenUrl = data.settings.annotationSafeTokenUrl;
-    			} else {
-    				console.warn("Sending token password over standard-URL!");
-    			}
-	        } else {
-	        	// use anonymous user
-	        	user = 'anonymous';
-	         	delete auth.options.requestData.password; 
-    			if (data.settings.annotationSafeTokenUrl != null) {
-    				// reset url to unsafe
-    				auth.options.tokenUrl = data.settings.annotationTokenUrl;
-    			}
-	        }
+        if (user != null && user != '' && user != 'anonymous') {
+            // set params for Auth plugin
+         	auth.options.requestData.password = password;
+    		// try to use the safe url for the password
+			if (data.settings.annotationSafeTokenUrl != null) {
+				auth.options.tokenUrl = data.settings.annotationSafeTokenUrl;
+			} else {
+				console.warn("Sending token password over standard-URL!");
+			}
+        } else {
+        	// use anonymous user
+        	user = 'anonymous';
+         	delete auth.options.requestData.password; 
+			if (data.settings.annotationSafeTokenUrl != null) {
+				// reset url to unsafe
+				auth.options.tokenUrl = data.settings.annotationTokenUrl;
+			}
         }
+        console.debug("setting annotation user to "+user);
         // set user in digilib
         data.settings.annotationUser = user;
         data.dlOpts.annotationUser = user;
         fn.storeOptions(data);
+        var annotator = data.annotator;
         // set params for Auth plugin
         auth.options.requestData.user = user;
         // set params for Permissions plugin
-        var perms = data.annotator.plugins.Permissions;
+        var perms = annotator.plugins.GroupPermissions || annotator.plugins.Permissions;
         if (perms != null) {
         	perms.setUser(user);
         }
+    	// get new token
+    	auth.token = null;
+    	auth._unsafeToken = null;
+    	// save new token in cookie
+    	auth.withToken(function (tkn) {
+    		console.debug("setting new annotation token.", tkn, auth.token);
+    		data.dlOpts.annotationToken = auth.token;
+		    fn.storeOptions(data);
+	        // clear annotations
+    		data.annotations = [];
+    		data.annotator.plugins.Store.annotations = [];
+        	// reload annotations
+    		data.annotator.plugins.Store.pluginInit();
+    	});
    	};
 
 
@@ -559,7 +574,7 @@
     var getHandleUnauthorized = function (data) {
     	return function (auth) {
     		// prompt for user name and set user
-    		setAnnotationUser(data, auth);
+    		actions.setAnnotationUser(data);
             // then try again
             return true;
        	};
--- a/webapp/src/main/webapp/jquery/jquery.digilib.css	Fri Feb 10 14:24:52 2017 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.css	Fri Feb 10 20:05:32 2017 +0100
@@ -211,6 +211,20 @@
 	margin: 0px 10px;
 	}
 
+div.dl-digilib #dl-userpass {
+	background-color: silver;
+	width: 300px;
+	padding: 10px;
+	border: 1px solid black;
+	position: absolute;
+	display: none;
+	z-index: 100;
+	}
+
+div.dl-digilib #dl-userpass div {
+	padding-top: 10px;
+	}
+
 div.dl-digilib .dl-error {
 	color: red;
 	background-color: maroon;
--- a/webapp/src/main/webapp/jquery/jquery.digilib.dialogs.js	Fri Feb 10 14:24:52 2017 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.dialogs.js	Fri Feb 10 20:05:32 2017 +0100
@@ -60,6 +60,11 @@
         // shows ScaleModeSelector
         dialogScaleMode : function (data) {
             fn.showScaleModeDialog(data);
+        },
+
+        // shows user name and password dialog
+        dialogUserPassword : function (data) {
+            fn.showUserPasswordDialog(data);
         }
     };
 
@@ -83,7 +88,7 @@
                     <div id="'+cssPrefix+'calibrationError" class="'+cssPrefix+'calibration-error">Please enter a numeric value like this: 12.3</div>\
                 </div>\
             </div>';
-        $calDiv = $(html);
+        var $calDiv = $(html);
         $calDiv.appendTo($elem);
         var $input = $calDiv.find('#'+cssPrefix+'calibrationInput');
         var $ok = $calDiv.find('#'+cssPrefix+'calibrationOk');
@@ -134,7 +139,7 @@
             <div id="'+cssPrefix+'scalemode" style="display:none; z-index:1000; position:absolute">\
                 <select class="'+cssPrefix+'scalemode" />\
             </div>';
-        $scaleDiv = $(html);
+        var $scaleDiv = $(html);
         $scaleDiv.appendTo($elem);
         var mode = fn.getScaleMode(data);
         var $select = $scaleDiv.find('select');
@@ -169,6 +174,64 @@
         }
     };
 
+    
+    /** 
+     * creates and displays HTML structure for user name and password dialog.
+     */
+    var showUserPasswordDialog = function (data, msg, callback) {
+        var $elem = data.$elem;
+        var settings = data.settings;
+        var cssPrefix = settings.cssPrefix;
+        var userpassId = cssPrefix+'userpass';
+        if (fn.isOnScreen(data, '#'+userpassId)) return; // already onscreen
+        var html = '\
+            <div id="'+userpassId+'" class="'+cssPrefix+'userpass">\
+	            <div>'+msg+'</div>\
+	            <div>User name: <input type="text" id="'+cssPrefix+'userInput" size="19"/></div>\
+	            <div>Password: <input type="password" id="'+cssPrefix+'passInput" size="20"/></div>\
+	            <div style="text-align:center">\
+	              <button class="'+cssPrefix+'button" id="'+cssPrefix+'userpassOk">OK</button>\
+	              <button class="'+cssPrefix+'button" id="'+cssPrefix+'userpassCancel">Cancel</button>\
+	            </div>\
+            </div>';
+        var $calDiv = $(html);
+        $calDiv.appendTo($elem);
+        var $userInput = $calDiv.find('#'+cssPrefix+'userInput');
+        var $passInput = $calDiv.find('#'+cssPrefix+'passInput');
+        var $ok = $calDiv.find('#'+cssPrefix+'userpassOk');
+        var $cancel = $calDiv.find('#'+cssPrefix+'userpassCancel');
+        var handler = function(event) {
+            // var _data = data;
+            if (event.keyCode == 27 || event.target.id == cssPrefix+'userpassCancel') {
+                fn.withdraw($calDiv);
+                return false;
+            }
+            if (event.keyCode == 13 || event.target.id == cssPrefix+'userpassOk') {
+                var user = $userInput.val();
+                var pass = $passInput.val();
+                fn.withdraw($calDiv);
+                if (callback != null) {
+                	callback(user, pass);
+                }
+                return false;
+            }
+        };
+        $ok.on("click.dialog", handler);
+        $cancel.on("click.dialog", handler);
+        $userInput.on("keypress.dialog", handler);
+        $passInput.on("keypress.dialog", handler);
+        $userInput.on("focus.dialog", handler);
+        $passInput.on("focus.dialog", handler);
+        $calDiv.fadeIn();
+        fn.centerOnScreen(data, $calDiv);
+        $userInput.focus();
+        return $calDiv;
+    };
+    
+
+    /**
+     * Hook dialogs into buttons.
+     */
     var setButtonActions = function () {
         if (fn.setButtonAction == null) {
             console.debug('dialogs: could not assign button actions. Maybe jquery.digilib.buttons.js was not loaded?');
@@ -194,6 +257,7 @@
         // export functions
         fn.showCalibrationDialog = showCalibrationDialog;
         fn.showScaleModeDialog = showScaleModeDialog;
+        fn.showUserPasswordDialog = showUserPasswordDialog;
     };
 
     // plugin initialization