From 7f17ce4e88a3c91e03f8313a855850e6e930def4 Mon Sep 17 00:00:00 2001
From: Michael Jumper
Date: Sun, 10 Feb 2013 13:22:58 -0800
Subject: [PATCH] #268: Implement user management.
---
guacamole/src/main/webapp/admin.xhtml | 245 ++++++++++++++++++++----
guacamole/src/main/webapp/styles/ui.css | 2 +-
2 files changed, 204 insertions(+), 43 deletions(-)
diff --git a/guacamole/src/main/webapp/admin.xhtml b/guacamole/src/main/webapp/admin.xhtml
index 857f0ff90..17ff734b4 100644
--- a/guacamole/src/main/webapp/admin.xhtml
+++ b/guacamole/src/main/webapp/admin.xhtml
@@ -42,16 +42,13 @@
passwords can be changed.
-
-
+
+
+
Connections
@@ -68,6 +65,9 @@
+
+
+
@@ -88,51 +88,212 @@
return false;
}
- var connections = document.getElementById("connections");
- var users = document.getElementById("users");
+ // Elements
+ var connection_list = document.getElementById("connection-list");
+ var user_list = document.getElementById("user-list");
+ var add_connection = document.getElementById("add-connection");
+ var connection_id = document.getElementById("connection-id");
+ var protocol = document.getElementById("protocol");
+ var add_user = document.getElementById("add-user");
+ var username = document.getElementById("username");
- // Show admin elements if admin permissions available
- var permissions = GuacamoleService.Permissions.list();
+ function reset_admin_ui() {
- if (permissions.create_connection
- || hasEntry(permissions.update_connection)
- || hasEntry(permissions.remove_connection)
- || hasEntry(permissions.administer_connection))
- GuacUI.addClass(document.body, "manage-connections");
+ /*
+ * Show admin elements if admin permissions available
+ */
- if (permissions.create_user
- || hasEntry(permissions.update_user)
- || hasEntry(permissions.remove_user)
- || hasEntry(permissions.administer_user))
- GuacUI.addClass(document.body, "manage-users");
+ // Get permissions
+ var permissions = GuacamoleService.Permissions.list();
- // Connection creation
- if (permissions.create_connection) {
- GuacUI.addClass(document.body, "add-connections");
+ // Connection management
+ if (permissions.create_connection
+ || hasEntry(permissions.update_connection)
+ || hasEntry(permissions.remove_connection)
+ || hasEntry(permissions.administer_connection))
+ GuacUI.addClass(document.body, "manage-connections");
+ else
+ GuacUI.removeClass(document.body, "manage-connections");
- var add_connection = document.getElementById("add-connection");
- var connection_id = document.getElementById("connection-id");
- var protocol = document.getElementById("protocol");
+ // User management
+ if (permissions.create_user
+ || hasEntry(permissions.update_user)
+ || hasEntry(permissions.remove_user)
+ || hasEntry(permissions.administer_user))
+ GuacUI.addClass(document.body, "manage-users");
+ else
+ GuacUI.removeClass(document.body, "manage-users");
- add_connection.onclick = function() {
- var connection = new GuacamoleService.Connection(
- protocol.value, connection_id.value);
- GuacamoleService.Connections.create(connection);
- };
+ // Connection creation
+ if (permissions.create_connection) {
+ GuacUI.addClass(document.body, "add-connections");
+
+ add_connection.onclick = function() {
+
+ // Try to create connection
+ try {
+ var connection = new GuacamoleService.Connection(
+ protocol.value, connection_id.value);
+ GuacamoleService.Connections.create(connection);
+ connection_id.value = "";
+ reset_admin_ui();
+ }
+
+ // Alert on failure
+ catch (e) {
+ alert(e.message);
+ }
+
+ };
+
+ }
+
+ // User creation
+ if (permissions.create_user) {
+ GuacUI.addClass(document.body, "add-users");
+
+ add_user.onclick = function() {
+
+ // Attempt to create user
+ try {
+ GuacamoleService.Users.create(username.value);
+ username.value = "";
+ reset_admin_ui();
+ }
+
+ // Alert on failure
+ catch (e) {
+ alert(e.message);
+ }
+
+ };
+
+ }
+
+ /*
+ * Add readable users.
+ */
+
+ var name;
+ var selected_user = null;
+
+ // Add users to list
+ user_list.innerHTML = "";
+ for (name in permissions.read_user) {(function(name){
+
+ var item = new GuacAdmin.ListItem("user", name);
+ var item_element = item.getElement();
+ user_list.appendChild(item_element);
+
+ item_element.onclick = function() {
+
+ // Ignore clicks if any item is selected
+ if (selected_user) return;
+ else selected_user = name;
+
+ // Get user permissions
+ var user_perms = GuacamoleService.Permissions.list(name);
+
+ // Load buttons
+ var buttons = [new GuacAdmin.Button("Save"),
+ new GuacAdmin.Button("Cancel")];
+
+ if (name in permissions.remove_user)
+ buttons.push(new GuacAdmin.Button("Delete"));
+
+ // User property form.
+ var user_properties = new GuacAdmin.Form(
+
+ /* Fields */
+ [new GuacAdmin.Field.PASSWORD("Password:", [],
+ ["f12a1930-7195-11e2-bcfd-0800200c9a66"]),
+
+ new GuacAdmin.Field.PASSWORD("Re-enter Password:", [],
+ ["f12a1930-7195-11e2-bcfd-0800200c9a66"]),
+
+ new GuacAdmin.Field.LIST("Connections:",
+ Object.keys(permissions.read_connection),
+ Object.keys(user_perms.read_connection))],
+
+ /* Buttons */
+ buttons
+
+ );
+
+ // Select
+ GuacUI.addClass(user_list, "disabled");
+ GuacUI.addClass(item_element, "selected");
+
+ // Handle buttons
+ user_properties.onaction = function(title, fields) {
+
+ try {
+
+ if (title == "Save") {
+
+ // Get passwords
+ var password = fields[0][0];
+ var reentered_password = fields[1][0];
+
+ // Check that passwords match
+ if (password != reentered_password)
+ throw new Error("Passwords do not match.");
+
+ // Set user permissions
+ user_perms.read_connection = {};
+ var connections = fields[2];
+ for (var i=0; i
diff --git a/guacamole/src/main/webapp/styles/ui.css b/guacamole/src/main/webapp/styles/ui.css
index eaf453913..59edfbbbc 100644
--- a/guacamole/src/main/webapp/styles/ui.css
+++ b/guacamole/src/main/webapp/styles/ui.css
@@ -202,7 +202,7 @@ div.section {
border: 1px solid rgba(0, 0, 0, 0.25);
}
-.list-item.selected.icon {
+.list-item.selected .icon {
opacity: 1.0;
}