mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-08 14:11:21 +00:00
Ticket #263: Modified CRUD servlets for ConnectionGroup compatibility.
This commit is contained in:
@@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package net.sourceforge.guacamole.net.basic.crud.connectiongroups;
|
||||||
|
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.ConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class that provides helper methods for the ConnectionGroup CRUD servlets.
|
||||||
|
*
|
||||||
|
* @author James Muehlner
|
||||||
|
*/
|
||||||
|
class ConnectionGroupUtility {
|
||||||
|
|
||||||
|
// This class should not be instantiated
|
||||||
|
private ConnectionGroupUtility() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the ConnectionGroupDirectory with the parent connection group
|
||||||
|
* specified by parentID.
|
||||||
|
*
|
||||||
|
* @param context The UserContext to search for the connectionGroup directory.
|
||||||
|
* @param parentID The ID of the parent connection group to search for.
|
||||||
|
*
|
||||||
|
* @return The ConnectionGroupDirectory with the parent connection group,
|
||||||
|
* if found.
|
||||||
|
* @throws GuacamoleException If an error is encountered while getting the
|
||||||
|
* connection group directory.
|
||||||
|
*/
|
||||||
|
static Directory<String, ConnectionGroup> findConnectionGroupDirectory(
|
||||||
|
UserContext context, String parentID) throws GuacamoleException {
|
||||||
|
|
||||||
|
// Find the correct connection group directory
|
||||||
|
ConnectionGroup rootGroup = context.getRootConnectionGroup();
|
||||||
|
Directory<String, ConnectionGroup> directory;
|
||||||
|
|
||||||
|
Directory<String, ConnectionGroup> connectionGroupDirectory =
|
||||||
|
rootGroup.getConnectionGroupDirectory();
|
||||||
|
|
||||||
|
ConnectionGroup parentGroup = connectionGroupDirectory.get(parentID);
|
||||||
|
|
||||||
|
if(parentGroup == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
directory = parentGroup.getConnectionGroupDirectory();
|
||||||
|
|
||||||
|
return directory;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,71 @@
|
|||||||
|
package net.sourceforge.guacamole.net.basic.crud.connectiongroups;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.ConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.basic.AuthenticatingHttpServlet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple HttpServlet which handles connection group creation.
|
||||||
|
*
|
||||||
|
* @author James Muehlner
|
||||||
|
*/
|
||||||
|
public class Create extends AuthenticatingHttpServlet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix given to a parameter name when that parameter is a protocol-
|
||||||
|
* specific parameter meant for the configuration.
|
||||||
|
*/
|
||||||
|
public static final String PARAMETER_PREFIX = "_";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void authenticatedService(
|
||||||
|
UserContext context,
|
||||||
|
HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Get name
|
||||||
|
String name = request.getParameter("name");
|
||||||
|
|
||||||
|
// Get the ID of the parent connection group
|
||||||
|
String parentID = request.getParameter("parentID");
|
||||||
|
|
||||||
|
// Find the correct connection group directory
|
||||||
|
Directory<String, ConnectionGroup> directory =
|
||||||
|
ConnectionGroupUtility.findConnectionGroupDirectory(context, parentID);
|
||||||
|
|
||||||
|
if(directory == null)
|
||||||
|
throw new GuacamoleException("Connection group directory not found.");
|
||||||
|
|
||||||
|
// Create connection skeleton
|
||||||
|
ConnectionGroup connectionGroup = new DummyConnectionGroup();
|
||||||
|
connectionGroup.setName(name);
|
||||||
|
|
||||||
|
// Add connection
|
||||||
|
directory.add(connectionGroup);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@@ -0,0 +1,56 @@
|
|||||||
|
package net.sourceforge.guacamole.net.basic.crud.connectiongroups;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.ConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.basic.AuthenticatingHttpServlet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple HttpServlet which handles connection group deletion.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class Delete extends AuthenticatingHttpServlet {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void authenticatedService(
|
||||||
|
UserContext context,
|
||||||
|
HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Get ID
|
||||||
|
String identifier = request.getParameter("id");
|
||||||
|
|
||||||
|
// Attempt to get connection group directory
|
||||||
|
Directory<String, ConnectionGroup> directory =
|
||||||
|
context.getRootConnectionGroup().getConnectionGroupDirectory();
|
||||||
|
|
||||||
|
// Remove connection
|
||||||
|
directory.remove(identifier);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
package net.sourceforge.guacamole.net.basic.crud.connectiongroups;
|
||||||
|
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.net.GuacamoleSocket;
|
||||||
|
import net.sourceforge.guacamole.net.auth.AbstractConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Connection;
|
||||||
|
import net.sourceforge.guacamole.net.auth.ConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.protocol.GuacamoleClientInformation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basic ConnectionGroup skeleton, providing a means of storing Connection data
|
||||||
|
* prior to CRUD operations. This ConnectionGroup has no functionality for actually
|
||||||
|
* performing a connection operation, and does not promote any of the
|
||||||
|
* semantics that would otherwise be present because of the authentication
|
||||||
|
* provider. It is up to the authentication provider to create a new
|
||||||
|
* ConnectionGroup based on the information contained herein.
|
||||||
|
*
|
||||||
|
* @author James Muehlner
|
||||||
|
*/
|
||||||
|
public class DummyConnectionGroup extends AbstractConnectionGroup {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GuacamoleSocket connect(GuacamoleClientInformation info) throws GuacamoleException {
|
||||||
|
throw new UnsupportedOperationException("Connection unsupported in DummyConnectionGroup.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Directory<String, Connection> getConnectionDirectory() throws GuacamoleException {
|
||||||
|
throw new UnsupportedOperationException("Connection directory unsupported in DummyConnectionGroup.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Directory<String, ConnectionGroup> getConnectionGroupDirectory() throws GuacamoleException {
|
||||||
|
throw new UnsupportedOperationException("Connection group directory unsuppprted in DummyConnectionGroup.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,214 @@
|
|||||||
|
package net.sourceforge.guacamole.net.basic.crud.connectiongroups;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Set;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.xml.stream.XMLOutputFactory;
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
import javax.xml.stream.XMLStreamWriter;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleSecurityException;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleServerException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.ConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.User;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.ConnectionPermission;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.ObjectPermission;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.Permission;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.SystemPermission;
|
||||||
|
import net.sourceforge.guacamole.net.basic.AuthenticatingHttpServlet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple HttpServlet which outputs XML containing a list of all authorized
|
||||||
|
* connection groups for the current user.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class List extends AuthenticatingHttpServlet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* System administration permission.
|
||||||
|
*/
|
||||||
|
private static final Permission SYSTEM_PERMISSION =
|
||||||
|
new SystemPermission(SystemPermission.Type.ADMINISTER);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given user has permission to perform the given
|
||||||
|
* object operation. Security exceptions are handled appropriately - only
|
||||||
|
* non-security exceptions pass through.
|
||||||
|
*
|
||||||
|
* @param user The user whose permissions should be verified.
|
||||||
|
* @param type The type of operation to check for permission for.
|
||||||
|
* @param identifier The identifier of the connection the operation
|
||||||
|
* would be performed upon.
|
||||||
|
* @return true if permission is granted, false otherwise.
|
||||||
|
*
|
||||||
|
* @throws GuacamoleException If an error occurs while checking permissions.
|
||||||
|
*/
|
||||||
|
private boolean hasConfigPermission(User user, ObjectPermission.Type type,
|
||||||
|
String identifier)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Build permission
|
||||||
|
Permission permission = new ConnectionPermission(
|
||||||
|
type,
|
||||||
|
identifier
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Return result of permission check, if possible
|
||||||
|
return user.hasPermission(permission);
|
||||||
|
}
|
||||||
|
catch (GuacamoleSecurityException e) {
|
||||||
|
// If cannot check due to security restrictions, no permission
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the XML for the given connection group.
|
||||||
|
*
|
||||||
|
* @param self The user whose permissions dictate the availability of the
|
||||||
|
* data written.
|
||||||
|
* @param xml The XMLStremWriter to use when writing the data.
|
||||||
|
* @param group The connection group whose XML representation will be
|
||||||
|
* written.
|
||||||
|
* @throws GuacamoleException If an error occurs while reading the
|
||||||
|
* requested data.
|
||||||
|
* @throws XMLStreamException If an error occurs while writing the XML.
|
||||||
|
*/
|
||||||
|
private void writeConnectionGroup(User self, XMLStreamWriter xml,
|
||||||
|
ConnectionGroup group) throws GuacamoleException, XMLStreamException {
|
||||||
|
|
||||||
|
// Write group
|
||||||
|
xml.writeStartElement("group");
|
||||||
|
xml.writeAttribute("id", group.getIdentifier());
|
||||||
|
xml.writeAttribute("name", group.getName());
|
||||||
|
|
||||||
|
// Write group type
|
||||||
|
switch (group.getType()) {
|
||||||
|
|
||||||
|
case ORGANIZATIONAL:
|
||||||
|
xml.writeAttribute("type", "organizational");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BALANCING:
|
||||||
|
xml.writeAttribute("type", "balancing");
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write contained connection groups
|
||||||
|
writeConnectionGroups(self, xml, group.getConnectionGroupDirectory());
|
||||||
|
|
||||||
|
// End of group
|
||||||
|
xml.writeEndElement();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the XML for the given directory of connection groups.
|
||||||
|
*
|
||||||
|
* @param self The user whose permissions dictate the availability of the
|
||||||
|
* data written.
|
||||||
|
* @param xml The XMLStremWriter to use when writing the data.
|
||||||
|
* @param directory The directory whose XML representation will be
|
||||||
|
* written.
|
||||||
|
* @throws GuacamoleException If an error occurs while reading the
|
||||||
|
* requested data.
|
||||||
|
* @throws XMLStreamException If an error occurs while writing the XML.
|
||||||
|
*/
|
||||||
|
private void writeConnectionGroups(User self, XMLStreamWriter xml,
|
||||||
|
Directory<String, ConnectionGroup> directory)
|
||||||
|
throws GuacamoleException, XMLStreamException {
|
||||||
|
|
||||||
|
// If no connections, write nothing
|
||||||
|
Set<String> identifiers = directory.getIdentifiers();
|
||||||
|
if (identifiers.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Begin connections
|
||||||
|
xml.writeStartElement("groups");
|
||||||
|
|
||||||
|
// For each entry, write corresponding connection element
|
||||||
|
for (String identifier : identifiers) {
|
||||||
|
|
||||||
|
// Write each group
|
||||||
|
ConnectionGroup group = directory.get(identifier);
|
||||||
|
writeConnectionGroup(self, xml, group);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// End connections
|
||||||
|
xml.writeEndElement();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void authenticatedService(
|
||||||
|
UserContext context,
|
||||||
|
HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Do not cache
|
||||||
|
response.setHeader("Cache-Control", "no-cache");
|
||||||
|
|
||||||
|
// Write XML content type
|
||||||
|
response.setHeader("Content-Type", "text/xml");
|
||||||
|
|
||||||
|
// Set encoding
|
||||||
|
response.setCharacterEncoding("UTF-8");
|
||||||
|
|
||||||
|
// Get root group
|
||||||
|
ConnectionGroup root = context.getRootConnectionGroup();
|
||||||
|
|
||||||
|
// Write actual XML
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Get self
|
||||||
|
User self = context.self();
|
||||||
|
|
||||||
|
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
|
||||||
|
XMLStreamWriter xml = outputFactory.createXMLStreamWriter(response.getWriter());
|
||||||
|
|
||||||
|
// Write content of root group
|
||||||
|
xml.writeStartDocument();
|
||||||
|
writeConnectionGroup(self, xml, root);
|
||||||
|
xml.writeEndDocument();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (XMLStreamException e) {
|
||||||
|
throw new GuacamoleServerException(
|
||||||
|
"Unable to write connection group list XML.", e);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new GuacamoleServerException(
|
||||||
|
"I/O error writing connection group list XML.", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@@ -0,0 +1,68 @@
|
|||||||
|
package net.sourceforge.guacamole.net.basic.crud.connectiongroups;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.ConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.basic.AuthenticatingHttpServlet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple HttpServlet which handles moving connection groups.
|
||||||
|
*
|
||||||
|
* @author James Muehlner
|
||||||
|
*/
|
||||||
|
public class Move extends AuthenticatingHttpServlet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix given to a parameter name when that parameter is a protocol-
|
||||||
|
* specific parameter meant for the configuration.
|
||||||
|
*/
|
||||||
|
public static final String PARAMETER_PREFIX = "_";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void authenticatedService(
|
||||||
|
UserContext context,
|
||||||
|
HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Get ID
|
||||||
|
String identifier = request.getParameter("id");
|
||||||
|
|
||||||
|
// Get the identifier of the new parent connection group
|
||||||
|
String parentID = request.getParameter("parentID");
|
||||||
|
|
||||||
|
// Attempt to get the new parent connection group directory
|
||||||
|
Directory<String, ConnectionGroup> newParentDirectory =
|
||||||
|
ConnectionGroupUtility.findConnectionGroupDirectory(context, parentID);
|
||||||
|
|
||||||
|
// Attempt to get root connection group directory
|
||||||
|
Directory<String, ConnectionGroup> directory =
|
||||||
|
context.getRootConnectionGroup().getConnectionGroupDirectory();
|
||||||
|
|
||||||
|
// Move connection group
|
||||||
|
directory.move(identifier, newParentDirectory);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@@ -0,0 +1,66 @@
|
|||||||
|
package net.sourceforge.guacamole.net.basic.crud.connectiongroups;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.ConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.basic.AuthenticatingHttpServlet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple HttpServlet which handles connection group update.
|
||||||
|
*
|
||||||
|
* @author James Muehlner
|
||||||
|
*/
|
||||||
|
public class Update extends AuthenticatingHttpServlet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix given to a parameter name when that parameter is a protocol-
|
||||||
|
* specific parameter meant for the configuration.
|
||||||
|
*/
|
||||||
|
public static final String PARAMETER_PREFIX = "_";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void authenticatedService(
|
||||||
|
UserContext context,
|
||||||
|
HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Get ID, name, and protocol
|
||||||
|
String identifier = request.getParameter("id");
|
||||||
|
String name = request.getParameter("name");
|
||||||
|
|
||||||
|
// Attempt to get connection group directory
|
||||||
|
Directory<String, ConnectionGroup> directory =
|
||||||
|
context.getRootConnectionGroup().getConnectionGroupDirectory();
|
||||||
|
|
||||||
|
// Create connection group skeleton
|
||||||
|
ConnectionGroup connectionGroup = directory.get(identifier);
|
||||||
|
connectionGroup.setName(name);
|
||||||
|
|
||||||
|
// Update connection group
|
||||||
|
directory.update(connectionGroup);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Servlets dedicated to CRUD operations related to ConnectionGroups.
|
||||||
|
*/
|
||||||
|
package net.sourceforge.guacamole.net.basic.crud.connectiongroups;
|
||||||
|
|
@@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package net.sourceforge.guacamole.net.basic.crud.connections;
|
||||||
|
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Connection;
|
||||||
|
import net.sourceforge.guacamole.net.auth.ConnectionGroup;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class that provides helper methods for the Connection CRUD servlets.
|
||||||
|
*
|
||||||
|
* @author James Muehlner
|
||||||
|
*/
|
||||||
|
class ConnectionUtility {
|
||||||
|
|
||||||
|
// This class should not be instantiated
|
||||||
|
private ConnectionUtility() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the ConnectionDirectory with the parent connection group specified by
|
||||||
|
* parentID.
|
||||||
|
*
|
||||||
|
* @param context The UserContext to search for the connection directory.
|
||||||
|
* @param parentID The ID of the parent connection group to search for.
|
||||||
|
*
|
||||||
|
* @return The ConnectionDirectory with the parent connection group,
|
||||||
|
* if found.
|
||||||
|
* @throws GuacamoleException If an error is encountered while getting the
|
||||||
|
* connection directory.
|
||||||
|
*/
|
||||||
|
static Directory<String, Connection> findConnectionDirectory(
|
||||||
|
UserContext context, String parentID) throws GuacamoleException {
|
||||||
|
|
||||||
|
// Find the correct connection directory
|
||||||
|
ConnectionGroup rootGroup = context.getRootConnectionGroup();
|
||||||
|
Directory<String, Connection> directory;
|
||||||
|
|
||||||
|
Directory<String, ConnectionGroup> connectionGroupDirectory =
|
||||||
|
rootGroup.getConnectionGroupDirectory();
|
||||||
|
|
||||||
|
ConnectionGroup parentGroup = connectionGroupDirectory.get(parentID);
|
||||||
|
|
||||||
|
if(parentGroup == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
directory = parentGroup.getConnectionDirectory();
|
||||||
|
|
||||||
|
return directory;
|
||||||
|
}
|
||||||
|
}
|
@@ -51,9 +51,15 @@ public class Create extends AuthenticatingHttpServlet {
|
|||||||
String name = request.getParameter("name");
|
String name = request.getParameter("name");
|
||||||
String protocol = request.getParameter("protocol");
|
String protocol = request.getParameter("protocol");
|
||||||
|
|
||||||
// Attempt to get connection directory
|
// Get the ID of the parent connection group
|
||||||
|
String parentID = request.getParameter("parentID");
|
||||||
|
|
||||||
|
// Find the correct connection directory
|
||||||
Directory<String, Connection> directory =
|
Directory<String, Connection> directory =
|
||||||
context.getRootConnectionGroup().getConnectionDirectory();
|
ConnectionUtility.findConnectionDirectory(context, parentID);
|
||||||
|
|
||||||
|
if(directory == null)
|
||||||
|
throw new GuacamoleException("Connection directory not found.");
|
||||||
|
|
||||||
// Create config
|
// Create config
|
||||||
GuacamoleConfiguration config = new GuacamoleConfiguration();
|
GuacamoleConfiguration config = new GuacamoleConfiguration();
|
||||||
|
@@ -22,12 +22,12 @@ public class DummyConnection extends AbstractConnection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GuacamoleSocket connect(GuacamoleClientInformation info) throws GuacamoleException {
|
public GuacamoleSocket connect(GuacamoleClientInformation info) throws GuacamoleException {
|
||||||
throw new UnsupportedOperationException("Connection unsuppported in DummyConnection.");
|
throw new UnsupportedOperationException("Connection unsupported in DummyConnection.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ConnectionRecord> getHistory() throws GuacamoleException {
|
public List<ConnectionRecord> getHistory() throws GuacamoleException {
|
||||||
throw new UnsupportedOperationException("History unsuppported in DummyConnection.");
|
throw new UnsupportedOperationException("History unsupported in DummyConnection.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,68 @@
|
|||||||
|
package net.sourceforge.guacamole.net.basic.crud.connections;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Connection;
|
||||||
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.basic.AuthenticatingHttpServlet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple HttpServlet which handles moving connections.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class Move extends AuthenticatingHttpServlet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix given to a parameter name when that parameter is a protocol-
|
||||||
|
* specific parameter meant for the configuration.
|
||||||
|
*/
|
||||||
|
public static final String PARAMETER_PREFIX = "_";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void authenticatedService(
|
||||||
|
UserContext context,
|
||||||
|
HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Get ID
|
||||||
|
String identifier = request.getParameter("id");
|
||||||
|
|
||||||
|
// Get the identifier of the new parent connection group
|
||||||
|
String parentID = request.getParameter("parentID");
|
||||||
|
|
||||||
|
// Attempt to get the new parent connection directory
|
||||||
|
Directory<String, Connection> newParentDirectory =
|
||||||
|
ConnectionUtility.findConnectionDirectory(context, parentID);
|
||||||
|
|
||||||
|
// Attempt to get root connection directory
|
||||||
|
Directory<String, Connection> directory =
|
||||||
|
context.getRootConnectionGroup().getConnectionDirectory();
|
||||||
|
|
||||||
|
// Move connection
|
||||||
|
directory.move(identifier, newParentDirectory);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@@ -31,6 +31,7 @@ import net.sourceforge.guacamole.GuacamoleServerException;
|
|||||||
import net.sourceforge.guacamole.net.auth.Directory;
|
import net.sourceforge.guacamole.net.auth.Directory;
|
||||||
import net.sourceforge.guacamole.net.auth.User;
|
import net.sourceforge.guacamole.net.auth.User;
|
||||||
import net.sourceforge.guacamole.net.auth.UserContext;
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.ConnectionGroupPermission;
|
||||||
import net.sourceforge.guacamole.net.auth.permission.ConnectionPermission;
|
import net.sourceforge.guacamole.net.auth.permission.ConnectionPermission;
|
||||||
import net.sourceforge.guacamole.net.auth.permission.ObjectPermission;
|
import net.sourceforge.guacamole.net.auth.permission.ObjectPermission;
|
||||||
import net.sourceforge.guacamole.net.auth.permission.Permission;
|
import net.sourceforge.guacamole.net.auth.permission.Permission;
|
||||||
@@ -62,6 +63,7 @@ public class List extends AuthenticatingHttpServlet {
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case CREATE_USER: return "create-user";
|
case CREATE_USER: return "create-user";
|
||||||
case CREATE_CONNECTION: return "create-connection";
|
case CREATE_CONNECTION: return "create-connection";
|
||||||
|
case CREATE_CONNECTION_GROUP: return "create-connection-group";
|
||||||
case ADMINISTER: return "admin";
|
case ADMINISTER: return "admin";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,6 +168,20 @@ public class List extends AuthenticatingHttpServlet {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Connection group permission
|
||||||
|
else if (permission instanceof ConnectionGroupPermission) {
|
||||||
|
|
||||||
|
// Get permission
|
||||||
|
ConnectionGroupPermission cgp =
|
||||||
|
(ConnectionGroupPermission) permission;
|
||||||
|
|
||||||
|
// Write permission
|
||||||
|
xml.writeEmptyElement("connection-group");
|
||||||
|
xml.writeAttribute("type", toString(cgp.getType()));
|
||||||
|
xml.writeAttribute("name", cgp.getObjectIdentifier());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// User permission
|
// User permission
|
||||||
else if (permission instanceof UserPermission) {
|
else if (permission instanceof UserPermission) {
|
||||||
|
|
||||||
|
@@ -88,6 +88,17 @@
|
|||||||
<url-pattern>/connections/update</url-pattern>
|
<url-pattern>/connections/update</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- Connection Move Servlet -->
|
||||||
|
<servlet>
|
||||||
|
<description>Connection move servlet.</description>
|
||||||
|
<servlet-name>ConnectionMove</servlet-name>
|
||||||
|
<servlet-class>net.sourceforge.guacamole.net.basic.crud.connections.Move</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>ConnectionMove</servlet-name>
|
||||||
|
<url-pattern>/connections/move</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<!-- Connection Deletion Servlet -->
|
<!-- Connection Deletion Servlet -->
|
||||||
<servlet>
|
<servlet>
|
||||||
<description>Connection deletion servlet.</description>
|
<description>Connection deletion servlet.</description>
|
||||||
@@ -99,6 +110,61 @@
|
|||||||
<url-pattern>/connections/delete</url-pattern>
|
<url-pattern>/connections/delete</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- Connection Group Creation Servlet -->
|
||||||
|
<servlet>
|
||||||
|
<description>ConnectionGroup creation servlet.</description>
|
||||||
|
<servlet-name>ConnectionGroupCreate</servlet-name>
|
||||||
|
<servlet-class>net.sourceforge.guacamole.net.basic.crud.connectiongroups.Create</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>ConnectionGroupCreate</servlet-name>
|
||||||
|
<url-pattern>/connectiongroups/create</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- Connection Group List Servlet -->
|
||||||
|
<servlet>
|
||||||
|
<description>ConnectionGroup list servlet.</description>
|
||||||
|
<servlet-name>ConnectionGroups</servlet-name>
|
||||||
|
<servlet-class>net.sourceforge.guacamole.net.basic.crud.connectiongroups.List</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>ConnectionGroups</servlet-name>
|
||||||
|
<url-pattern>/connectiongroups</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- Connection Group Update Servlet -->
|
||||||
|
<servlet>
|
||||||
|
<description>ConnectionGroup update servlet.</description>
|
||||||
|
<servlet-name>ConnectionGroupUpdate</servlet-name>
|
||||||
|
<servlet-class>net.sourceforge.guacamole.net.basic.crud.connectiongroups.Update</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>ConnectionGroupUpdate</servlet-name>
|
||||||
|
<url-pattern>/connectiongroups/update</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- Connection Group Move Servlet -->
|
||||||
|
<servlet>
|
||||||
|
<description>ConnectionGroup move servlet.</description>
|
||||||
|
<servlet-name>ConnectionGroupMove</servlet-name>
|
||||||
|
<servlet-class>net.sourceforge.guacamole.net.basic.crud.connectiongroups.Move</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>ConnectionGroupMove</servlet-name>
|
||||||
|
<url-pattern>/connectiongroups/move</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- Connection Group Deletion Servlet -->
|
||||||
|
<servlet>
|
||||||
|
<description>ConnectionGroup deletion servlet.</description>
|
||||||
|
<servlet-name>ConnectionGroupDelete</servlet-name>
|
||||||
|
<servlet-class>net.sourceforge.guacamole.net.basic.crud.connectiongroups.Delete</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>ConnectionGroupDelete</servlet-name>
|
||||||
|
<url-pattern>/connectiongroups/delete</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<!-- User Creation Servlet -->
|
<!-- User Creation Servlet -->
|
||||||
<servlet>
|
<servlet>
|
||||||
<description>User creation servlet.</description>
|
<description>User creation servlet.</description>
|
||||||
|
Reference in New Issue
Block a user