mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 17:13:21 +00:00 
			
		
		
		
	Remove central guac-dev repo reference. Refactor net.sourceforge.guacamole to org.glyptodon.guacamole. Extensions are remaining with their classes in net.sourceforge.guacamole for compatibility's sake until we have a better system for extensions.
This commit is contained in:
		| @@ -0,0 +1,119 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Basic implementation of a Guacamole connection. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public abstract class AbstractConnection implements Connection { | ||||
|  | ||||
|     /** | ||||
|      * The name associated with this connection. | ||||
|      */ | ||||
|     private String name; | ||||
|  | ||||
|     /** | ||||
|      * The unique identifier associated with this connection. | ||||
|      */ | ||||
|     private String identifier; | ||||
|  | ||||
|     /** | ||||
|      * The GuacamoleConfiguration associated with this connection. | ||||
|      */ | ||||
|     private GuacamoleConfiguration configuration; | ||||
|  | ||||
|     @Override | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getIdentifier() { | ||||
|         return identifier; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setIdentifier(String identifier) { | ||||
|         this.identifier = identifier; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public GuacamoleConfiguration getConfiguration() { | ||||
|         return configuration; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setConfiguration(GuacamoleConfiguration configuration) { | ||||
|         this.configuration = configuration; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         if (identifier == null) return 0; | ||||
|         return identifier.hashCode(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean equals(Object obj) { | ||||
|  | ||||
|         // Not equal if null or not a Connection | ||||
|         if (obj == null) return false; | ||||
|         if (!(obj instanceof AbstractConnection)) return false; | ||||
|  | ||||
|         // Get identifier | ||||
|         String objIdentifier = ((AbstractConnection) obj).identifier; | ||||
|  | ||||
|         // If null, equal only if this identifier is null | ||||
|         if (objIdentifier == null) return identifier == null; | ||||
|  | ||||
|         // Otherwise, equal only if strings are identical | ||||
|         return objIdentifier.equals(identifier); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,117 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): James Muehlner | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Basic implementation of a Guacamole connection group. | ||||
|  * | ||||
|  * @author James Muehlner | ||||
|  */ | ||||
| public abstract class AbstractConnectionGroup implements ConnectionGroup { | ||||
|  | ||||
|     /** | ||||
|      * The name associated with this connection group. | ||||
|      */ | ||||
|     private String name; | ||||
|  | ||||
|     /** | ||||
|      * The unique identifier associated with this connection group. | ||||
|      */ | ||||
|     private String identifier; | ||||
|      | ||||
|     /** | ||||
|      * The type of this connection group. | ||||
|      */ | ||||
|     private ConnectionGroup.Type type; | ||||
|      | ||||
|     @Override | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getIdentifier() { | ||||
|         return identifier; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setIdentifier(String identifier) { | ||||
|         this.identifier = identifier; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public ConnectionGroup.Type getType() { | ||||
|         return type; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public void setType(ConnectionGroup.Type type) { | ||||
|         this.type = type; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         if (identifier == null) return 0; | ||||
|         return identifier.hashCode(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean equals(Object obj) { | ||||
|  | ||||
|         // Not equal if null or not a ConnectionGroup | ||||
|         if (obj == null) return false; | ||||
|         if (!(obj instanceof AbstractConnectionGroup)) return false; | ||||
|  | ||||
|         // Get identifier | ||||
|         String objIdentifier = ((AbstractConnectionGroup) obj).identifier; | ||||
|  | ||||
|         // If null, equal only if this identifier is null | ||||
|         if (objIdentifier == null) return identifier == null; | ||||
|  | ||||
|         // Otherwise, equal only if strings are identical | ||||
|         return objIdentifier.equals(identifier); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,105 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Basic implementation of a Guacamole user which uses the username to | ||||
|  * determine equality. Username comparison is case-sensitive. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public abstract class AbstractUser implements User { | ||||
|  | ||||
|     /** | ||||
|      * The name of this user. | ||||
|      */ | ||||
|     private String username; | ||||
|  | ||||
|     /** | ||||
|      * This user's password. Note that while this provides a means for the | ||||
|      * password to be set, the data stored in this String is not necessarily | ||||
|      * the user's actual password. It may be hashed, it may be arbitrary. | ||||
|      */ | ||||
|     private String password; | ||||
|  | ||||
|     @Override | ||||
|     public String getUsername() { | ||||
|         return username; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setUsername(String username) { | ||||
|         this.username = username; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getPassword() { | ||||
|         return password; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setPassword(String password) { | ||||
|         this.password = password; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         if (username == null) return 0; | ||||
|         return username.hashCode(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean equals(Object obj) { | ||||
|  | ||||
|         // Not equal if null or not a User | ||||
|         if (obj == null) return false; | ||||
|         if (!(obj instanceof AbstractUser)) return false; | ||||
|  | ||||
|         // Get username | ||||
|         String objUsername = ((AbstractUser) obj).username; | ||||
|  | ||||
|         // If null, equal only if this username is null | ||||
|         if (objUsername == null) return username == null; | ||||
|  | ||||
|         // Otherwise, equal only if strings are identical | ||||
|         return objUsername.equals(username); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,86 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Provides means of accessing and managing the available | ||||
|  * GuacamoleConfiguration objects and User objects. Access to each configuration | ||||
|  * and each user is limited by a given Credentials object. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface AuthenticationProvider { | ||||
|  | ||||
|     /** | ||||
|      * Returns the UserContext of the user authorized by the given credentials. | ||||
|      * | ||||
|      * @param credentials The credentials to use to retrieve the environment. | ||||
|      * @return The UserContext of the user authorized by the given credentials, | ||||
|      *         or null if the credentials are not authorized. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while creating the | ||||
|      *                            UserContext. | ||||
|      */ | ||||
|     UserContext getUserContext(Credentials credentials) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Returns a new or updated UserContext for the user authorized by the | ||||
|      * give credentials and having the given existing UserContext. Note that | ||||
|      * because this function will be called for all future requests after | ||||
|      * initial authentication, including tunnel requests, care must be taken | ||||
|      * to avoid using functions of HttpServletRequest which invalidate the | ||||
|      * entire request body, such as getParameter(). | ||||
|      *  | ||||
|      * @param context The existing UserContext belonging to the user in | ||||
|      *                question. | ||||
|      * @param credentials The credentials to use to retrieve or update the | ||||
|      *                    environment. | ||||
|      * @return The updated UserContext, which need not be the same as the | ||||
|      *         UserContext given, or null if the user is no longer authorized. | ||||
|      *          | ||||
|      * @throws GuacamoleException If an error occurs while updating the | ||||
|      *                            UserContext. | ||||
|      */ | ||||
|     UserContext updateUserContext(UserContext context, Credentials credentials) | ||||
|             throws GuacamoleException; | ||||
|      | ||||
| } | ||||
| @@ -0,0 +1,131 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.List; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.GuacamoleSocket; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Represents a pairing of a GuacamoleConfiguration with a unique, | ||||
|  * human-readable identifier, and abstracts the connection process. The | ||||
|  * backing GuacamoleConfiguration may be intentionally obfuscated or tokenized | ||||
|  * to protect sensitive configuration information. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface Connection { | ||||
|  | ||||
|     /** | ||||
|      * Returns the name assigned to this Connection. | ||||
|      * @return The name assigned to this Connection. | ||||
|      */ | ||||
|     public String getName(); | ||||
|  | ||||
|     /** | ||||
|      * Sets the name assigned to this Connection. | ||||
|      * | ||||
|      * @param identifier The name to assign. | ||||
|      */ | ||||
|     public void setName(String name); | ||||
|  | ||||
|     /** | ||||
|      * Returns the unique identifier assigned to this Connection. | ||||
|      * @return The unique identifier assigned to this Connection. | ||||
|      */ | ||||
|     public String getIdentifier(); | ||||
|  | ||||
|     /** | ||||
|      * Sets the identifier assigned to this Connection. | ||||
|      * | ||||
|      * @param identifier The identifier to assign. | ||||
|      */ | ||||
|     public void setIdentifier(String identifier); | ||||
|  | ||||
|     /** | ||||
|      * Returns the GuacamoleConfiguration associated with this Connection. Note | ||||
|      * that because configurations may contain sensitive information, some data | ||||
|      * in this configuration may be omitted or tokenized. | ||||
|      * | ||||
|      * @return The GuacamoleConfiguration associated with this Connection. | ||||
|      */ | ||||
|     public GuacamoleConfiguration getConfiguration(); | ||||
|  | ||||
|     /** | ||||
|      * Sets the GuacamoleConfiguration associated with this Connection. | ||||
|      * | ||||
|      * @param config The GuacamoleConfiguration to associate with this | ||||
|      *               Connection. | ||||
|      */ | ||||
|     public void setConfiguration(GuacamoleConfiguration config); | ||||
|  | ||||
|     /** | ||||
|      * Establishes a connection to guacd using the GuacamoleConfiguration | ||||
|      * associated with this Connection, and returns the resulting, connected | ||||
|      * GuacamoleSocket. The GuacamoleSocket will be pre-configured and will | ||||
|      * already have passed the handshake stage. | ||||
|      * | ||||
|      * @param info Information associated with the connecting client. | ||||
|      * @return A fully-established GuacamoleSocket. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while connecting to guacd, | ||||
|      *                            or if permission to connect is denied. | ||||
|      */ | ||||
|     public GuacamoleSocket connect(GuacamoleClientInformation info) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Returns a list of ConnectionRecords representing the usage history | ||||
|      * of this Connection, including any active users. ConnectionRecords | ||||
|      * in this list will be sorted in descending order of end time (active | ||||
|      * connections are first), and then in descending order of start time | ||||
|      * (newer connections are first). | ||||
|      * | ||||
|      * @return A list of ConnectionRecrods representing the usage history | ||||
|      *         of this Connection. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while reading the history | ||||
|      *                            of this connection, or if permission is | ||||
|      *                            denied. | ||||
|      */ | ||||
|     public List<? extends ConnectionRecord> getHistory() throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,138 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): James Muehlner | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.GuacamoleSocket; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Represents a connection group, which can contain both other connection groups | ||||
|  * as well as connections. | ||||
|  * | ||||
|  * @author James Muehlner | ||||
|  */ | ||||
| public interface ConnectionGroup { | ||||
|      | ||||
|     public enum Type { | ||||
|         ORGANIZATIONAL, BALANCING | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Returns the name assigned to this ConnectionGroup. | ||||
|      * @return The name assigned to this ConnectionGroup. | ||||
|      */ | ||||
|     public String getName(); | ||||
|  | ||||
|     /** | ||||
|      * Sets the name assigned to this ConnectionGroup. | ||||
|      * | ||||
|      * @param identifier The name to assign. | ||||
|      */ | ||||
|     public void setName(String name); | ||||
|  | ||||
|     /** | ||||
|      * Returns the unique identifier assigned to this ConnectionGroup. | ||||
|      * @return The unique identifier assigned to this ConnectionGroup. | ||||
|      */ | ||||
|     public String getIdentifier(); | ||||
|  | ||||
|     /** | ||||
|      * Sets the identifier assigned to this ConnectionGroup. | ||||
|      * | ||||
|      * @param identifier The identifier to assign. | ||||
|      */ | ||||
|     public void setIdentifier(String identifier); | ||||
|      | ||||
|     /** | ||||
|      * Set the type of this ConnectionGroup. | ||||
|      * | ||||
|      * @param type The type of this ConnectionGroup. | ||||
|      */ | ||||
|     public void setType(Type type); | ||||
|      | ||||
|     /** | ||||
|      * Returns the type of this connection. | ||||
|      * @return the type of this connection. | ||||
|      */ | ||||
|     public Type getType(); | ||||
|  | ||||
|     /** | ||||
|      * Retrieves a Directory which can be used to view and manipulate | ||||
|      * connections and their configurations, but only as allowed by the | ||||
|      * permissions given to the user. | ||||
|      * | ||||
|      * @return A Directory whose operations are bound by the permissions of  | ||||
|      *         the user. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while creating the | ||||
|      *                            Directory. | ||||
|      */ | ||||
|     Directory<String, Connection> getConnectionDirectory() | ||||
|             throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Retrieves a Directory which can be used to view and manipulate | ||||
|      * connection groups and their members, but only as allowed by the | ||||
|      * permissions given to the user. | ||||
|      * | ||||
|      * @return A Directory whose operations are bound by the permissions of | ||||
|      *         the user. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while creating the | ||||
|      *                            Directory. | ||||
|      */ | ||||
|     Directory<String, ConnectionGroup> getConnectionGroupDirectory() | ||||
|             throws GuacamoleException; | ||||
|      | ||||
|     /** | ||||
|      * Establishes a connection to guacd using a connection chosen from among | ||||
|      * the connections in this ConnectionGroup, and returns the resulting,  | ||||
|      * connected GuacamoleSocket. | ||||
|      * | ||||
|      * @param info Information associated with the connecting client. | ||||
|      * @return A fully-established GuacamoleSocket. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while connecting to guacd, | ||||
|      *                            or if permission to connect is denied. | ||||
|      */ | ||||
|     public GuacamoleSocket connect(GuacamoleClientInformation info) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,83 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-auth-mock. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.Date; | ||||
|  | ||||
| /** | ||||
|  * A logging record describing when a user started and ended usage of a | ||||
|  * particular connection. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface ConnectionRecord { | ||||
|  | ||||
|     /** | ||||
|      * Returns the date and time the connection began. | ||||
|      * | ||||
|      * @return The date and time the connection began. | ||||
|      */ | ||||
|     public Date getStartDate(); | ||||
|  | ||||
|     /** | ||||
|      * Returns the date and time the connection ended, if applicable. | ||||
|      * | ||||
|      * @return The date and time the connection ended, or null if the | ||||
|      *         connection is still running or if the end time is unknown. | ||||
|      */ | ||||
|     public Date getEndDate(); | ||||
|  | ||||
|     /** | ||||
|      * Returns the name of the user who used or is using the connection at the | ||||
|      * times given by this connection record. | ||||
|      * | ||||
|      * @return The name of the user who used or is using the associated | ||||
|      *         connection. | ||||
|      */ | ||||
|     public String getUsername(); | ||||
|  | ||||
|     /** | ||||
|      * Returns whether the connection associated with this record is still | ||||
|      * active. | ||||
|      * | ||||
|      * @return true if the connection associated with this record is still | ||||
|      *         active, false otherwise. | ||||
|      */ | ||||
|     public boolean isActive(); | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,152 @@ | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| import java.io.Serializable; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpSession; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| /** | ||||
|  * Simple arbitrary set of credentials, including a username/password pair, | ||||
|  * the HttpServletRequest associated with the request for authorization | ||||
|  * (if any) and the HttpSession associated with that request. | ||||
|  * | ||||
|  * This class is used along with AuthenticationProvider to provide arbitrary | ||||
|  * HTTP-based authentication for Guacamole. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class Credentials implements Serializable { | ||||
|  | ||||
|     /** | ||||
|      * Unique identifier associated with this specific version of Credentials. | ||||
|      */ | ||||
|     private static final long serialVersionUID = 1L; | ||||
|  | ||||
|     /** | ||||
|      * An arbitrary username. | ||||
|      */ | ||||
|     private String username; | ||||
|  | ||||
|     /** | ||||
|      * An arbitrary password. | ||||
|      */ | ||||
|     private String password; | ||||
|  | ||||
|     /** | ||||
|      * The HttpServletRequest carrying additional credentials, if any. | ||||
|      */ | ||||
|     private transient HttpServletRequest request; | ||||
|  | ||||
|     /** | ||||
|      * The HttpSession carrying additional credentials, if any. | ||||
|      */ | ||||
|     private transient HttpSession session; | ||||
|  | ||||
|     /** | ||||
|      * Returns the password associated with this set of credentials. | ||||
|      * @return The password associated with this username/password pair, or | ||||
|      *         null if no password has been set. | ||||
|      */ | ||||
|     public String getPassword() { | ||||
|         return password; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the password associated with this set of credentials. | ||||
|      * @param password The password to associate with this username/password | ||||
|      *                 pair. | ||||
|      */ | ||||
|     public void setPassword(String password) { | ||||
|         this.password = password; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the username associated with this set of credentials. | ||||
|      * @return The username associated with this username/password pair, or | ||||
|      *         null if no username has been set. | ||||
|      */ | ||||
|     public String getUsername() { | ||||
|         return username; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the username associated with this set of credentials. | ||||
|      * @param username The username to associate with this username/password | ||||
|      *                 pair. | ||||
|      */ | ||||
|     public void setUsername(String username) { | ||||
|         this.username = username; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the HttpServletRequest associated with this set of credentials. | ||||
|      * @return The HttpServletRequest associated with this set of credentials, | ||||
|      *         or null if no such request exists. | ||||
|      */ | ||||
|     public HttpServletRequest getRequest() { | ||||
|         return request; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the HttpServletRequest associated with this set of credentials. | ||||
|      * @param request  The HttpServletRequest to associated with this set of | ||||
|      *                 credentials. | ||||
|      */ | ||||
|     public void setRequest(HttpServletRequest request) { | ||||
|         this.request = request; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the HttpSession associated with this set of credentials. | ||||
|      * @return The HttpSession associated with this set of credentials, or null | ||||
|      *         if no such request exists. | ||||
|      */ | ||||
|     public HttpSession getSession() { | ||||
|         return session; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the HttpSession associated with this set of credentials. | ||||
|      * @param session The HttpSession to associated with this set of | ||||
|      *                credentials. | ||||
|      */ | ||||
|     public void setSession(HttpSession session) { | ||||
|         this.session = session; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,129 @@ | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.Set; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Provides access to a collection of all objects with associated identifiers, | ||||
|  * and allows user manipulation and removal. Objects stored within a | ||||
|  * Directory are not necessarily returned to the use as references to | ||||
|  * the stored objects, thus updating an object requires calling an update | ||||
|  * function. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  * @param <IdentifierType> The type of identifier used to identify objects | ||||
|  *                         stored within this Directory. | ||||
|  * @param <ObjectType> The type of objects stored within this Directory. | ||||
|  */ | ||||
| public interface Directory<IdentifierType, ObjectType> { | ||||
|  | ||||
|     /** | ||||
|      * Returns the object having the given identifier. Note that changes to | ||||
|      * the object returned will not necessarily affect the object stored within | ||||
|      * the Directory. To update an object stored within an | ||||
|      * Directory such that future calls to get() will return the updated | ||||
|      * object, you must call update() on the object after modification. | ||||
|      * | ||||
|      * @param identifier The identifier to use when locating the object to | ||||
|      *                   return. | ||||
|      * @return The object having the given identifier, or null if no such object | ||||
|      *         exists. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while retrieving the | ||||
|      *                            object, or if permission for retrieving the | ||||
|      *                            object is denied. | ||||
|      */ | ||||
|     ObjectType get(IdentifierType identifier) throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Returns a Set containing all identifiers for all objects within this | ||||
|      * Directory. | ||||
|      * | ||||
|      * @return A Set of all identifiers. | ||||
|      * @throws GuacamoleException If an error occurs while retrieving | ||||
|      *                            the identifiers. | ||||
|      */ | ||||
|     Set<IdentifierType> getIdentifiers() throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Adds the given object to the overall set. | ||||
|      * | ||||
|      * @param object The object to add. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while adding the object , or | ||||
|      *                            if adding the object is not allowed. | ||||
|      */ | ||||
|     void add(ObjectType object) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Updates the stored object with the data contained in the given object. | ||||
|      * | ||||
|      * @param object The object which will supply the data for the update. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while updating the object, | ||||
|      *                            or if updating the object is not allowed. | ||||
|      */ | ||||
|     void update(ObjectType object) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Removes the object with the given identifier from the overall set. | ||||
|      * | ||||
|      * @param identifier The identifier of the object to remove. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while removing the object, | ||||
|      *                            or if removing object is not allowed. | ||||
|      */ | ||||
|     void remove(IdentifierType identifier) throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Moves the object with the given identifier to the given directory. | ||||
|      * | ||||
|      * @param identifier The identifier of the object to remove. | ||||
|      * @param directory The directory to move the object to. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while moving the object, | ||||
|      *                            or if moving object is not allowed. | ||||
|      */ | ||||
|     void move(IdentifierType identifier, Directory<IdentifierType, ObjectType> directory)  | ||||
|             throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,129 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| import java.util.Set; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.auth.permission.Permission; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A user of the Guacamole web application. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface User { | ||||
|  | ||||
|     /** | ||||
|      * Returns the name of this user, which must be unique across all users. | ||||
|      * | ||||
|      * @return The name of this user. | ||||
|      */ | ||||
|     public String getUsername(); | ||||
|  | ||||
|     /** | ||||
|      * Sets the name of this user, which must be unique across all users. | ||||
|      * | ||||
|      * @param username  The name of this user. | ||||
|      */ | ||||
|     public void setUsername(String username); | ||||
|  | ||||
|     /** | ||||
|      * Returns this user's password. Note that the password returned may be | ||||
|      * hashed or completely arbitrary. | ||||
|      * | ||||
|      * @return A String which may (or may not) be the user's password. | ||||
|      */ | ||||
|     public String getPassword(); | ||||
|  | ||||
|     /** | ||||
|      * Sets this user's password. Note that while this function is guaranteed | ||||
|      * to change the password of this User object, there is no guarantee that | ||||
|      * getPassword() will return the value given to setPassword(). | ||||
|      * | ||||
|      * @param password The password to set. | ||||
|      */ | ||||
|     public void setPassword(String password); | ||||
|  | ||||
|     /** | ||||
|      * Lists all permissions given to this user. | ||||
|      * | ||||
|      * @return A Set of all permissions granted to this user. | ||||
|      * | ||||
|      * @throws GuacamoleException  If an error occurs while retrieving | ||||
|      *                             permissions, or if reading all permissions | ||||
|      *                             is not allowed. | ||||
|      */ | ||||
|     Set<Permission> getPermissions() throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Tests whether this user has the specified permission. | ||||
|      * | ||||
|      * @param permission The permission to check. | ||||
|      * @return true if the permission is granted to this user, false otherwise. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while checking permissions, | ||||
|      *                            or if permissions cannot be checked due to | ||||
|      *                            lack of permissions to do so. | ||||
|      */ | ||||
|     boolean hasPermission(Permission permission) throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Adds the specified permission to this user. | ||||
|      * | ||||
|      * @param permission The permission to add. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while adding the | ||||
|      *                            permission. or if permission to add | ||||
|      *                            permissions is denied. | ||||
|      */ | ||||
|     void addPermission(Permission permission) throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Removes the specified permission from this specified user. | ||||
|      * | ||||
|      * @param permission The permission to remove. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while removing the | ||||
|      *                            permission. or if permission to remove | ||||
|      *                            permissions is denied. | ||||
|      */ | ||||
|     void removePermission(Permission permission) throws GuacamoleException; | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,86 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): James Muehlner | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
|  | ||||
| /** | ||||
|  * The context of an active user. The functions of this class enforce all | ||||
|  * permissions and act only within the rights of the associated user. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface UserContext { | ||||
|  | ||||
|     /** | ||||
|      * Returns the User whose access rights control the operations of this | ||||
|      * UserContext. | ||||
|      * | ||||
|      * @return The User whose access rights control the operations of this | ||||
|      *         UserContext. | ||||
|      */ | ||||
|     User self(); | ||||
|  | ||||
|     /** | ||||
|      * Retrieves a Directory which can be used to view and manipulate other | ||||
|      * users, but only as allowed by the permissions given to the user of this | ||||
|      * UserContext. | ||||
|      * | ||||
|      * @return A Directory whose operations are bound by the restrictions | ||||
|      *         of this UserContext. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while creating the | ||||
|      *                            Directory. | ||||
|      */ | ||||
|     Directory<String, User> getUserDirectory() throws GuacamoleException; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Retrieves a connection group which can be used to view and manipulate | ||||
|      * connections, but only as allowed by the permissions given to the user of  | ||||
|      * this UserContext. | ||||
|      * | ||||
|      * @return A connection group whose operations are bound by the restrictions | ||||
|      *         of this UserContext. | ||||
|      * | ||||
|      * @throws GuacamoleException If an error occurs while creating the | ||||
|      *                            Directory. | ||||
|      */ | ||||
|     ConnectionGroup getRootConnectionGroup() throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,7 @@ | ||||
|  | ||||
| /** | ||||
|  * Provides classes which can be used to extend or replace the authentication | ||||
|  * functionality of the Guacamole web application. | ||||
|  */ | ||||
| package org.glyptodon.guacamole.net.auth; | ||||
|  | ||||
| @@ -0,0 +1,121 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.permission; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): James Muehlner | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A permission which controls operations that directly affect a specific | ||||
|  * ConnectionGroup. Note that this permission only refers to the | ||||
|  * ConnectionGroup by its identifier. The actual ConnectionGroup | ||||
|  * is not stored within. | ||||
|  * | ||||
|  * @author James Muehlner | ||||
|  */ | ||||
| public class ConnectionGroupPermission | ||||
|     implements ObjectPermission<String> { | ||||
|  | ||||
|     /** | ||||
|      * The identifier of the GuacamoleConfiguration associated with the | ||||
|      * operation affected by this permission. | ||||
|      */ | ||||
|     private String identifier; | ||||
|  | ||||
|     /** | ||||
|      * The type of operation affected by this permission. | ||||
|      */ | ||||
|     private ObjectPermission.Type type; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new ConnectionGroupPermission having the given type | ||||
|      * and identifier. The identifier must be the unique identifier assigned | ||||
|      * to the ConnectionGroup by the AuthenticationProvider in use. | ||||
|      * | ||||
|      * @param type The type of operation affected by this permission. | ||||
|      * @param identifier The identifier of the ConnectionGroup associated | ||||
|      *                   with the operation affected by this permission. | ||||
|      */ | ||||
|     public ConnectionGroupPermission(ObjectPermission.Type type, String identifier) { | ||||
|  | ||||
|         this.identifier = identifier; | ||||
|         this.type = type; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getObjectIdentifier() { | ||||
|         return identifier; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public ObjectPermission.Type getType() { | ||||
|         return type; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int hash = 5; | ||||
|         if (identifier != null) hash = 47 * hash + identifier.hashCode(); | ||||
|         if (type != null)       hash = 47 * hash + type.hashCode(); | ||||
|         return hash; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean equals(Object obj) { | ||||
|  | ||||
|         // Not equal if null or wrong type | ||||
|         if (obj == null) return false; | ||||
|         if (getClass() != obj.getClass()) return false; | ||||
|  | ||||
|         final ConnectionGroupPermission other = | ||||
|                 (ConnectionGroupPermission) obj; | ||||
|  | ||||
|         // Not equal if different type | ||||
|         if (this.type != other.type) | ||||
|             return false; | ||||
|  | ||||
|         // If null identifier, equality depends on whether other identifier | ||||
|         // is null | ||||
|         if (identifier == null) | ||||
|             return other.identifier == null; | ||||
|  | ||||
|         // Otherwise, equality depends entirely on identifier | ||||
|         return identifier.equals(other.identifier); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,121 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.permission; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A permission which controls operations that directly affect a specific | ||||
|  * GuacamoleConfiguration. Note that this permission only refers to the | ||||
|  * GuacamoleConfiguration by its identifier. The actual GuacamoleConfiguration | ||||
|  * is not stored within. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class ConnectionPermission | ||||
|     implements ObjectPermission<String> { | ||||
|  | ||||
|     /** | ||||
|      * The identifier of the GuacamoleConfiguration associated with the | ||||
|      * operation affected by this permission. | ||||
|      */ | ||||
|     private String identifier; | ||||
|  | ||||
|     /** | ||||
|      * The type of operation affected by this permission. | ||||
|      */ | ||||
|     private Type type; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new ConnectionPermission having the given type | ||||
|      * and identifier. The identifier must be the unique identifier assigned | ||||
|      * to the GuacamoleConfiguration by the AuthenticationProvider in use. | ||||
|      * | ||||
|      * @param type The type of operation affected by this permission. | ||||
|      * @param identifier The identifier of the GuacamoleConfiguration associated | ||||
|      *                   with the operation affected by this permission. | ||||
|      */ | ||||
|     public ConnectionPermission(Type type, String identifier) { | ||||
|  | ||||
|         this.identifier = identifier; | ||||
|         this.type = type; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getObjectIdentifier() { | ||||
|         return identifier; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Type getType() { | ||||
|         return type; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int hash = 5; | ||||
|         if (identifier != null) hash = 47 * hash + identifier.hashCode(); | ||||
|         if (type != null)       hash = 47 * hash + type.hashCode(); | ||||
|         return hash; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean equals(Object obj) { | ||||
|  | ||||
|         // Not equal if null or wrong type | ||||
|         if (obj == null) return false; | ||||
|         if (getClass() != obj.getClass()) return false; | ||||
|  | ||||
|         final ConnectionPermission other = | ||||
|                 (ConnectionPermission) obj; | ||||
|  | ||||
|         // Not equal if different type | ||||
|         if (this.type != other.type) | ||||
|             return false; | ||||
|  | ||||
|         // If null identifier, equality depends on whether other identifier | ||||
|         // is null | ||||
|         if (identifier == null) | ||||
|             return other.identifier == null; | ||||
|  | ||||
|         // Otherwise, equality depends entirely on identifier | ||||
|         return identifier.equals(other.identifier); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,87 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.permission; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A permission which affects a specific object, rather than the system as a | ||||
|  * whole. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  * @param <T> The type of identifier used by the object this permission affects. | ||||
|  */ | ||||
| public interface ObjectPermission<T> extends Permission<ObjectPermission.Type> { | ||||
|  | ||||
|     /** | ||||
|      * Specific types of object-level permissions. Each permission type is | ||||
|      * related to a specific class of object-level operation. | ||||
|      */ | ||||
|     public enum Type { | ||||
|  | ||||
|         /** | ||||
|          * Read data within an object. | ||||
|          */ | ||||
|         READ, | ||||
|  | ||||
|         /** | ||||
|          * Update data within an object. | ||||
|          */ | ||||
|         UPDATE, | ||||
|  | ||||
|         /** | ||||
|          * Delete an object. | ||||
|          */ | ||||
|         DELETE, | ||||
|  | ||||
|         /** | ||||
|          * Change who has access to an object. | ||||
|          */ | ||||
|         ADMINISTER | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the identifier of the specific object affected by this | ||||
|      * permission. | ||||
|      * | ||||
|      * @return The identifier of the specific object affected by this | ||||
|      *         permission. | ||||
|      */ | ||||
|     public T getObjectIdentifier(); | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,57 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.permission; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A permission which affects a specific type of operation, where all available | ||||
|  * operation types are defined by an enumeration. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  * @param <Type> The enumeration of all available operation types that this | ||||
|  *               permission can affect. | ||||
|  */ | ||||
| public interface Permission<Type extends Enum> { | ||||
|  | ||||
|     /** | ||||
|      * Returns the type of operation affected by this permission. | ||||
|      * @return The type of operation affected by this permission. | ||||
|      */ | ||||
|     public Type getType(); | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,120 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.permission; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| /** | ||||
|  * A permission which affects the system as a whole, rather than an individual | ||||
|  * object. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class SystemPermission implements Permission<SystemPermission.Type> { | ||||
|  | ||||
|     /** | ||||
|      * Specific types of system-level permissions. Each permission type is | ||||
|      * related to a specific class of system-level operation. | ||||
|      */ | ||||
|     public enum Type { | ||||
|  | ||||
|         /** | ||||
|          * Create users. | ||||
|          */ | ||||
|         CREATE_USER, | ||||
|  | ||||
|         /** | ||||
|          * Create connections. | ||||
|          */ | ||||
|         CREATE_CONNECTION, | ||||
|  | ||||
|         /** | ||||
|          * Create connection groups. | ||||
|          */ | ||||
|         CREATE_CONNECTION_GROUP, | ||||
|  | ||||
|         /** | ||||
|          * Administer the system in general, including adding permissions | ||||
|          * which affect the system (like user creation, connection creation, | ||||
|          * and system administration). | ||||
|          */ | ||||
|         ADMINISTER | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * The type of operation affected by this permission. | ||||
|      */ | ||||
|     private Type type; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new SystemPermission with the given | ||||
|      * type. | ||||
|      * | ||||
|      * @param type The type of operation controlled by this permission. | ||||
|      */ | ||||
|     public SystemPermission(Type type) { | ||||
|         this.type = type; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Type getType() { | ||||
|         return type; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         return type.hashCode(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean equals(Object obj) { | ||||
|  | ||||
|         // Not equal if null or wrong type | ||||
|         if (obj == null) return false; | ||||
|         if (getClass() != obj.getClass()) return false; | ||||
|  | ||||
|         final SystemPermission other = (SystemPermission) obj; | ||||
|  | ||||
|         // Compare types | ||||
|         if (type != other.type) | ||||
|             return false; | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,116 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.permission; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A permission which controls operations that directly affect a specific | ||||
|  * User. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class UserPermission implements ObjectPermission<String> { | ||||
|  | ||||
|     /** | ||||
|      * The username of the User associated with the operation affected by this | ||||
|      * permission. | ||||
|      */ | ||||
|     private String identifier; | ||||
|  | ||||
|     /** | ||||
|      * The type of operation affected by this permission. | ||||
|      */ | ||||
|     private Type type; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new UserPermission having the given type and identifier. The | ||||
|      * identifier must be the user's username. | ||||
|      * | ||||
|      * @param type The type of operation affected by this permission. | ||||
|      * @param identifier The username of the User associated with the operation | ||||
|      *                   affected by this permission. | ||||
|      */ | ||||
|     public UserPermission(Type type, String identifier) { | ||||
|  | ||||
|         this.identifier = identifier; | ||||
|         this.type = type; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getObjectIdentifier() { | ||||
|         return identifier; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Type getType() { | ||||
|         return type; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int hash = 5; | ||||
|         if (identifier != null) hash = 47 * hash + identifier.hashCode(); | ||||
|         if (type != null)       hash = 47 * hash + type.hashCode(); | ||||
|         return hash; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean equals(Object obj) { | ||||
|  | ||||
|         // Not equal if null or wrong type | ||||
|         if (obj == null) return false; | ||||
|         if (getClass() != obj.getClass()) return false; | ||||
|  | ||||
|         final UserPermission other = (UserPermission) obj; | ||||
|  | ||||
|         // Not equal if different type | ||||
|         if (this.type != other.type) | ||||
|             return false; | ||||
|  | ||||
|         // If null identifier, equality depends on whether other identifier | ||||
|         // is null | ||||
|         if (identifier == null) | ||||
|             return other.identifier == null; | ||||
|  | ||||
|         // Otherwise, equality depends entirely on identifier | ||||
|         return identifier.equals(other.identifier); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,7 @@ | ||||
|  | ||||
| /** | ||||
|  * Provides classes which describe the various permissions a Guacamole user | ||||
|  * can be granted. | ||||
|  */ | ||||
| package org.glyptodon.guacamole.net.auth.permission; | ||||
|  | ||||
| @@ -0,0 +1,105 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-auth. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.Map; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.auth.AuthenticationProvider; | ||||
| import org.glyptodon.guacamole.net.auth.Credentials; | ||||
| import org.glyptodon.guacamole.net.auth.UserContext; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Provides means of retrieving a set of named GuacamoleConfigurations for a | ||||
|  * given Credentials object. This is a simple AuthenticationProvider | ||||
|  * implementation intended to be easily extended. It is useful for simple | ||||
|  * authentication situations where access to web-based administration and | ||||
|  * complex users and permissions are not required. | ||||
|  * | ||||
|  * The interface provided by SimpleAuthenticationProvider is similar to that of | ||||
|  * the AuthenticationProvider interface of older Guacamole releases. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public abstract class SimpleAuthenticationProvider | ||||
|     implements AuthenticationProvider { | ||||
|  | ||||
|     /** | ||||
|      * Given an arbitrary credentials object, returns a Map containing all | ||||
|      * configurations authorized by those credentials. The keys of this Map | ||||
|      * are Strings which uniquely identify each configuration. | ||||
|      * | ||||
|      * @param credentials The credentials to use to retrieve authorized | ||||
|      *                    configurations. | ||||
|      * @return A Map of all configurations authorized by the given credentials, | ||||
|      *         or null if the credentials given are not authorized. | ||||
|      * @throws GuacamoleException If an error occurs while retrieving | ||||
|      *                            configurations. | ||||
|      */ | ||||
|     public abstract Map<String, GuacamoleConfiguration> | ||||
|             getAuthorizedConfigurations(Credentials credentials) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
|     @Override | ||||
|     public UserContext getUserContext(Credentials credentials) | ||||
|             throws GuacamoleException { | ||||
|  | ||||
|         // Get configurations | ||||
|         Map<String, GuacamoleConfiguration> configs = | ||||
|                 getAuthorizedConfigurations(credentials); | ||||
|  | ||||
|         // Return as unauthorized if not authorized to retrieve configs | ||||
|         if (configs == null) | ||||
|             return null; | ||||
|  | ||||
|         // Return user context restricted to authorized configs | ||||
|         return new SimpleUserContext(configs); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UserContext updateUserContext(UserContext context, | ||||
|         Credentials credentials) throws GuacamoleException { | ||||
|  | ||||
|         // Simply return the given context, updating nothing | ||||
|         return context; | ||||
|          | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,124 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-auth. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.GuacamoleSocket; | ||||
| import org.glyptodon.guacamole.net.InetGuacamoleSocket; | ||||
| import org.glyptodon.guacamole.net.SSLGuacamoleSocket; | ||||
| import org.glyptodon.guacamole.net.auth.AbstractConnection; | ||||
| import org.glyptodon.guacamole.net.auth.ConnectionRecord; | ||||
| import org.glyptodon.guacamole.properties.GuacamoleProperties; | ||||
| import org.glyptodon.guacamole.protocol.ConfiguredGuacamoleSocket; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * An extremely basic Connection implementation. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class SimpleConnection extends AbstractConnection { | ||||
|  | ||||
|     /** | ||||
|      * Backing configuration, containing all sensitive information. | ||||
|      */ | ||||
|     private GuacamoleConfiguration config; | ||||
|  | ||||
|     /** | ||||
|      * Creates a completely uninitialized SimpleConnection. | ||||
|      */ | ||||
|     public SimpleConnection() { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Creates a new SimpleConnection having the given identifier and | ||||
|      * GuacamoleConfiguration. | ||||
|      * | ||||
|      * @param name The name to associate with this connection. | ||||
|      * @param identifier The identifier to associate with this connection. | ||||
|      * @param config The configuration describing how to connect to this | ||||
|      *               connection. | ||||
|      */ | ||||
|     public SimpleConnection(String name, String identifier, | ||||
|             GuacamoleConfiguration config) { | ||||
|          | ||||
|         // Set name | ||||
|         setName(name); | ||||
|  | ||||
|         // Set identifier | ||||
|         setIdentifier(identifier); | ||||
|  | ||||
|         // Set config | ||||
|         setConfiguration(config); | ||||
|         this.config = config; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public GuacamoleSocket connect(GuacamoleClientInformation info) | ||||
|             throws GuacamoleException { | ||||
|  | ||||
|         // Get guacd connection parameters | ||||
|         String hostname = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_HOSTNAME); | ||||
|         int port = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_PORT); | ||||
|  | ||||
|         // If guacd requires SSL, use it | ||||
|         if (GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_SSL, false)) | ||||
|             return new ConfiguredGuacamoleSocket( | ||||
|                 new SSLGuacamoleSocket(hostname, port), | ||||
|                 config, info | ||||
|             ); | ||||
|  | ||||
|         // Return connected socket | ||||
|         return new ConfiguredGuacamoleSocket( | ||||
|             new InetGuacamoleSocket(hostname, port), | ||||
|             config, info | ||||
|         ); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<ConnectionRecord> getHistory() throws GuacamoleException { | ||||
|         return Collections.EMPTY_LIST; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,138 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-auth. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
| import java.util.Set; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.GuacamoleSecurityException; | ||||
| import org.glyptodon.guacamole.net.auth.Connection; | ||||
| import org.glyptodon.guacamole.net.auth.Directory; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * An extremely simple read-only implementation of a Directory of | ||||
|  * GuacamoleConfigurations which provides access to a pre-defined Map of | ||||
|  * GuacamoleConfigurations. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class SimpleConnectionDirectory | ||||
|     implements Directory<String, Connection> { | ||||
|  | ||||
|     /** | ||||
|      * The Map of Connections to provide access to. | ||||
|      */ | ||||
|     private Map<String, Connection> connections = | ||||
|             new HashMap<String, Connection>(); | ||||
|  | ||||
|     /** | ||||
|      * Creates a new SimpleConnectionDirectory which provides | ||||
|      * access to the configurations contained within the given Map. | ||||
|      * | ||||
|      * @param configs The Map of GuacamoleConfigurations to provide access to. | ||||
|      */ | ||||
|     public SimpleConnectionDirectory( | ||||
|             Map<String, GuacamoleConfiguration> configs) { | ||||
|  | ||||
|         // Create connections for each config | ||||
|         for (Entry<String, GuacamoleConfiguration> entry : configs.entrySet()) | ||||
|             connections.put(entry.getKey(), | ||||
|                     new SimpleConnection(entry.getKey(), entry.getKey(),  | ||||
|                 entry.getValue())); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Connection get(String identifier) | ||||
|             throws GuacamoleException { | ||||
|         return connections.get(identifier); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Set<String> getIdentifiers() throws GuacamoleException { | ||||
|         return connections.keySet(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void add(Connection connection) | ||||
|             throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void update(Connection connection) | ||||
|             throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void remove(String identifier) throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void move(String identifier, Directory<String, Connection> directory)  | ||||
|             throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * An internal method for modifying the Connections in this Directory. | ||||
|      * Returns the previous connection for the given identifier, if found. | ||||
|      *  | ||||
|      * @param connection The connection to add or update the Directory with. | ||||
|      * @return The previous connection for the connection identifier, if found. | ||||
|      */ | ||||
|     public Connection putConnection(Connection connection) { | ||||
|         return connections.put(connection.getIdentifier(), connection); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * An internal method for removing a Connection from this Directory. | ||||
|      * @param identifier The identifier of the Connection to remove. | ||||
|      * @return The previous connection for the given identifier, if found. | ||||
|      */ | ||||
|     public Connection removeConnection(String identifier) { | ||||
|         return connections.remove(identifier); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,119 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): James Muehlner | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.GuacamoleSecurityException; | ||||
| import org.glyptodon.guacamole.net.GuacamoleSocket; | ||||
| import org.glyptodon.guacamole.net.auth.AbstractConnectionGroup; | ||||
| import org.glyptodon.guacamole.net.auth.Connection; | ||||
| import org.glyptodon.guacamole.net.auth.ConnectionGroup; | ||||
| import org.glyptodon.guacamole.net.auth.Directory; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * An extremely simple read-only implementation of a ConnectionGroup which | ||||
|  * returns the connection and connection group directories it was constructed | ||||
|  * with. Load balancing across this connection group is not allowed. | ||||
|  *  | ||||
|  * @author James Muehlner | ||||
|  */ | ||||
| public class SimpleConnectionGroup extends AbstractConnectionGroup { | ||||
|  | ||||
|     /** | ||||
|      * Underlying connection directory, containing all connections within this | ||||
|      * group. | ||||
|      */ | ||||
|     private final Directory<String, Connection> connectionDirectory; | ||||
|  | ||||
|     /** | ||||
|      * Underlying connection group directory, containing all connections within | ||||
|      * this group. | ||||
|      */ | ||||
|     private final Directory<String, ConnectionGroup> connectionGroupDirectory; | ||||
|      | ||||
|     /** | ||||
|      * Creates a new SimpleConnectionGroup having the given name and identifier | ||||
|      * which will expose the given directories as its contents. | ||||
|      *  | ||||
|      * @param name The name to associate with this connection. | ||||
|      * @param identifier The identifier to associate with this connection. | ||||
|      * @param connectionDirectory The connection directory to expose when | ||||
|      *                            requested. | ||||
|      * @param connectionGroupDirectory The connection group directory to expose | ||||
|      *                                 when requested. | ||||
|      */ | ||||
|     public SimpleConnectionGroup(String name, String identifier, | ||||
|             Directory<String, Connection> connectionDirectory,  | ||||
|             Directory<String, ConnectionGroup> connectionGroupDirectory) { | ||||
|  | ||||
|         // Set name | ||||
|         setName(name); | ||||
|  | ||||
|         // Set identifier | ||||
|         setIdentifier(identifier); | ||||
|          | ||||
|         // Set group type | ||||
|         setType(ConnectionGroup.Type.ORGANIZATIONAL); | ||||
|  | ||||
|         // Assign directories | ||||
|         this.connectionDirectory = connectionDirectory; | ||||
|         this.connectionGroupDirectory = connectionGroupDirectory; | ||||
|  | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Directory<String, Connection> getConnectionDirectory()  | ||||
|             throws GuacamoleException { | ||||
|         return connectionDirectory; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Directory<String, ConnectionGroup> getConnectionGroupDirectory()  | ||||
|             throws GuacamoleException { | ||||
|         return connectionGroupDirectory; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public GuacamoleSocket connect(GuacamoleClientInformation info)  | ||||
|             throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,138 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-auth. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): James Muehlner | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.GuacamoleSecurityException; | ||||
| import org.glyptodon.guacamole.net.auth.ConnectionGroup; | ||||
| import org.glyptodon.guacamole.net.auth.Directory; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * An extremely simple read-only implementation of a Directory of | ||||
|  * ConnectionGroup which provides which provides access to a pre-defined | ||||
|  * Collection of ConnectionGroups. | ||||
|  * | ||||
|  * @author James Muehlner | ||||
|  */ | ||||
| public class SimpleConnectionGroupDirectory | ||||
|     implements Directory<String, ConnectionGroup> { | ||||
|  | ||||
|     /** | ||||
|      * The Map of ConnectionGroups to provide access to. | ||||
|      */ | ||||
|     private Map<String, ConnectionGroup> connectionGroups = | ||||
|             new HashMap<String, ConnectionGroup>(); | ||||
|  | ||||
|     /** | ||||
|      * Creates a new SimpleConnectionGroupDirectory which contains the given | ||||
|      * groups. | ||||
|      *  | ||||
|      * @param groups A Collection of all groups that should be present in this | ||||
|      *               connection group directory. | ||||
|      */ | ||||
|     public SimpleConnectionGroupDirectory(Collection<ConnectionGroup> groups) { | ||||
|  | ||||
|         // Add all given groups | ||||
|         for (ConnectionGroup group : groups) | ||||
|             connectionGroups.put(group.getIdentifier(), group); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public ConnectionGroup get(String identifier) | ||||
|             throws GuacamoleException { | ||||
|         return connectionGroups.get(identifier); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Set<String> getIdentifiers() throws GuacamoleException { | ||||
|         return connectionGroups.keySet(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void add(ConnectionGroup connectionGroup) | ||||
|             throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void update(ConnectionGroup connectionGroup) | ||||
|             throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void remove(String identifier) throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void move(String identifier, Directory<String, ConnectionGroup> directory)  | ||||
|             throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * An internal method for modifying the ConnectionGroups in this Directory. | ||||
|      * Returns the previous connection group for the given identifier, if found. | ||||
|      *  | ||||
|      * @param connectionGroup The connection group to add or update the | ||||
|      *                        Directory with. | ||||
|      * @return The previous connection group for the connection group | ||||
|      *         identifier, if found. | ||||
|      */ | ||||
|     public ConnectionGroup putConnectionGroup(ConnectionGroup connectionGroup) { | ||||
|         return connectionGroups.put(connectionGroup.getIdentifier(), connectionGroup); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * An internal method for removing a ConnectionGroup from this Directory. | ||||
|      *  | ||||
|      * @param identifier The identifier of the ConnectionGroup to remove. | ||||
|      * @return The previous connection group for the given identifier, if found. | ||||
|      */ | ||||
|     public ConnectionGroup removeConnectionGroup(String identifier) { | ||||
|         return connectionGroups.remove(identifier); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,137 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-auth. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.HashSet; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.GuacamoleSecurityException; | ||||
| import org.glyptodon.guacamole.net.auth.AbstractUser; | ||||
| import org.glyptodon.guacamole.net.auth.ConnectionGroup; | ||||
| import org.glyptodon.guacamole.net.auth.permission.ConnectionGroupPermission; | ||||
| import org.glyptodon.guacamole.net.auth.permission.ConnectionPermission; | ||||
| import org.glyptodon.guacamole.net.auth.permission.ObjectPermission; | ||||
| import org.glyptodon.guacamole.net.auth.permission.Permission; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * An extremely basic User implementation. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class SimpleUser extends AbstractUser { | ||||
|  | ||||
|     /** | ||||
|      * The set of all permissions available to this user. | ||||
|      */ | ||||
|     private Set<Permission> permissions = new HashSet<Permission>(); | ||||
|  | ||||
|     /** | ||||
|      * Creates a completely uninitialized SimpleUser. | ||||
|      */ | ||||
|     public SimpleUser() { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Creates a new SimpleUser having the given username. | ||||
|      * | ||||
|      * @param username The username to assign to this SimpleUser. | ||||
|      * @param configs All configurations this user has read access to. | ||||
|      * @param groups All groups this user has read access to. | ||||
|      */ | ||||
|     public SimpleUser(String username, | ||||
|             Map<String, GuacamoleConfiguration> configs, | ||||
|             Collection<ConnectionGroup> groups) { | ||||
|  | ||||
|         // Set username | ||||
|         setUsername(username); | ||||
|  | ||||
|         // Add connection permissions | ||||
|         for (String identifier : configs.keySet()) { | ||||
|  | ||||
|             // Create permission | ||||
|             Permission permission = new ConnectionPermission( | ||||
|                 ObjectPermission.Type.READ, | ||||
|                 identifier | ||||
|             ); | ||||
|  | ||||
|             // Add to set | ||||
|             permissions.add(permission); | ||||
|  | ||||
|         } | ||||
|  | ||||
|         // Add group permissions | ||||
|         for (ConnectionGroup group : groups) { | ||||
|  | ||||
|             // Create permission | ||||
|             Permission permission = new ConnectionGroupPermission( | ||||
|                 ObjectPermission.Type.READ, | ||||
|                 group.getIdentifier() | ||||
|             ); | ||||
|  | ||||
|             // Add to set | ||||
|             permissions.add(permission); | ||||
|  | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Set<Permission> getPermissions() throws GuacamoleException { | ||||
|         return permissions; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean hasPermission(Permission permission) throws GuacamoleException { | ||||
|         return permissions.contains(permission); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void addPermission(Permission permission) throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void removePermission(Permission permission) throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,115 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.Collections; | ||||
| import java.util.Map; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.auth.ConnectionGroup; | ||||
| import org.glyptodon.guacamole.net.auth.Directory; | ||||
| import org.glyptodon.guacamole.net.auth.User; | ||||
| import org.glyptodon.guacamole.net.auth.UserContext; | ||||
| import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||
|  | ||||
| /** | ||||
|  * An extremely simple UserContext implementation which provides access to | ||||
|  * a defined and restricted set of GuacamoleConfigurations. Access to | ||||
|  * querying or modifying either users or permissions is denied. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class SimpleUserContext implements UserContext { | ||||
|  | ||||
|     /** | ||||
|      * Reference to the user whose permissions dictate the configurations | ||||
|      * accessible within this UserContext. | ||||
|      */ | ||||
|     private final User self; | ||||
|  | ||||
|     /** | ||||
|      * The Directory with access only to the User associated with this | ||||
|      * UserContext. | ||||
|      */ | ||||
|     private final Directory<String, User> userDirectory; | ||||
|  | ||||
|     /** | ||||
|      * The ConnectionGroup with access only to those Connections that the User | ||||
|      * associated with this UserContext has access to. | ||||
|      */ | ||||
|     private final ConnectionGroup connectionGroup; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new SimpleUserContext which provides access to only those | ||||
|      * configurations within the given Map. | ||||
|      *  | ||||
|      * @param configs A Map of all configurations for which the user associated | ||||
|      *                with this UserContext has read access. | ||||
|      */ | ||||
|     public SimpleUserContext(Map<String, GuacamoleConfiguration> configs) { | ||||
|  | ||||
|         // Add root group that contains only configurations | ||||
|         this.connectionGroup = new SimpleConnectionGroup("ROOT", "ROOT", | ||||
|                 new SimpleConnectionDirectory(configs), | ||||
|                 new SimpleConnectionGroupDirectory(Collections.EMPTY_LIST)); | ||||
|  | ||||
|         // Build new user from credentials, giving the user an arbitrary name | ||||
|         this.self = new SimpleUser("user", | ||||
|                 configs, Collections.singleton(connectionGroup)); | ||||
|  | ||||
|         // Create user directory for new user | ||||
|         this.userDirectory = new SimpleUserDirectory(self); | ||||
|          | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public User self() { | ||||
|         return self; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Directory<String, User> getUserDirectory() | ||||
|             throws GuacamoleException { | ||||
|         return userDirectory; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public ConnectionGroup getRootConnectionGroup() throws GuacamoleException { | ||||
|         return connectionGroup; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,109 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-auth. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.util.Collections; | ||||
| import java.util.Set; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.GuacamoleSecurityException; | ||||
| import org.glyptodon.guacamole.net.auth.Directory; | ||||
| import org.glyptodon.guacamole.net.auth.User; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * An extremely simple read-only implementation of a Directory of Users which | ||||
|  * provides access to a single pre-defined User. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class SimpleUserDirectory implements Directory<String, User> { | ||||
|  | ||||
|     /** | ||||
|      * The only user to be contained within this directory. | ||||
|      */ | ||||
|     private User user; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new SimpleUserDirectory which provides access to the single | ||||
|      * user provided. | ||||
|      * | ||||
|      * @param user The user to provide access to. | ||||
|      */ | ||||
|     public SimpleUserDirectory(User user) { | ||||
|         this.user = user; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public User get(String username) throws GuacamoleException { | ||||
|  | ||||
|         // If username matches, return the user | ||||
|         if (user.getUsername().equals(username)) | ||||
|             return user; | ||||
|  | ||||
|         // Otherwise, not found | ||||
|         return null; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Set<String> getIdentifiers() throws GuacamoleException { | ||||
|         return Collections.singleton(user.getUsername()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void add(User user) throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void update(User user) throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void remove(String username) throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void move(String identifier, Directory<String, User> directory)  | ||||
|             throws GuacamoleException { | ||||
|         throw new GuacamoleSecurityException("Permission denied."); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,8 @@ | ||||
|  | ||||
| /** | ||||
|  * Provides a basic AuthenticationProvider base class that can be used to create | ||||
|  * simple AuthenticationProviders in the same way allowed by the old | ||||
|  * authentication API. | ||||
|  */ | ||||
| package org.glyptodon.guacamole.net.auth.simple; | ||||
|  | ||||
| @@ -0,0 +1,34 @@ | ||||
| package org.glyptodon.guacamole.net.event; | ||||
|  | ||||
| import org.glyptodon.guacamole.net.auth.Credentials; | ||||
|  | ||||
| /** | ||||
|  * An event which is triggered whenever a user's credentials fail to be | ||||
|  * authenticated. The credentials that failed to be authenticated are included | ||||
|  * within this event, and can be retrieved using getCredentials(). | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class AuthenticationFailureEvent implements CredentialEvent { | ||||
|  | ||||
|     /** | ||||
|      * The credentials which failed authentication. | ||||
|      */ | ||||
|     private Credentials credentials; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new AuthenticationFailureEvent which represents the failure | ||||
|      * to authenticate the given credentials. | ||||
|      * | ||||
|      * @param credentials The credentials which failed authentication. | ||||
|      */ | ||||
|     public AuthenticationFailureEvent(Credentials credentials) { | ||||
|         this.credentials = credentials; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Credentials getCredentials() { | ||||
|         return credentials; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,49 @@ | ||||
| package org.glyptodon.guacamole.net.event; | ||||
|  | ||||
| import org.glyptodon.guacamole.net.auth.Credentials; | ||||
| import org.glyptodon.guacamole.net.auth.UserContext; | ||||
|  | ||||
| /** | ||||
|  * An event which is triggered whenever a user's credentials pass | ||||
|  * authentication. The credentials that passed authentication are included | ||||
|  * within this event, and can be retrieved using getCredentials(). | ||||
|  *  | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class AuthenticationSuccessEvent implements UserEvent, CredentialEvent { | ||||
|  | ||||
|     /** | ||||
|      * The UserContext associated with the request that is connecting the | ||||
|      * tunnel, if any. | ||||
|      */ | ||||
|     private UserContext context; | ||||
|  | ||||
|     /** | ||||
|      * The credentials which passed authentication. | ||||
|      */ | ||||
|     private Credentials credentials; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new AuthenticationSuccessEvent which represents a successful | ||||
|      * authentication attempt with the given credentials. | ||||
|      * | ||||
|      * @param context The UserContext created as a result of successful | ||||
|      *                authentication. | ||||
|      * @param credentials The credentials which passed authentication. | ||||
|      */ | ||||
|     public AuthenticationSuccessEvent(UserContext context, Credentials credentials) { | ||||
|         this.context = context; | ||||
|         this.credentials = credentials; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UserContext getUserContext() { | ||||
|         return context; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Credentials getCredentials() { | ||||
|         return credentials; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,21 @@ | ||||
| package org.glyptodon.guacamole.net.event; | ||||
|  | ||||
| import org.glyptodon.guacamole.net.auth.Credentials; | ||||
|  | ||||
| /** | ||||
|  * Abstract basis for events which may have associated user credentials when | ||||
|  * triggered. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface CredentialEvent { | ||||
|  | ||||
|     /** | ||||
|      * Returns the current credentials of the user triggering the event, if any. | ||||
|      * | ||||
|      * @return The current credentials of the user triggering the event, if | ||||
|      *         any, or null if no credentials are associated with the event. | ||||
|      */ | ||||
|     Credentials getCredentials(); | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,66 @@ | ||||
| package org.glyptodon.guacamole.net.event; | ||||
|  | ||||
| import org.glyptodon.guacamole.net.GuacamoleTunnel; | ||||
| import org.glyptodon.guacamole.net.auth.Credentials; | ||||
| import org.glyptodon.guacamole.net.auth.UserContext; | ||||
|  | ||||
| /** | ||||
|  * An event which is triggered whenever a tunnel is being closed. The tunnel | ||||
|  * being closed can be accessed through getTunnel(), and the UserContext | ||||
|  * associated with the request which is closing the tunnel can be retrieved | ||||
|  * with getUserContext(). | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class TunnelCloseEvent implements UserEvent, CredentialEvent, TunnelEvent { | ||||
|  | ||||
|     /** | ||||
|      * The UserContext associated with the request that is closing the | ||||
|      * tunnel, if any. | ||||
|      */ | ||||
|     private UserContext context; | ||||
|  | ||||
|     /** | ||||
|      * The credentials associated with the request that connected the | ||||
|      * tunnel, if any. | ||||
|      */ | ||||
|     private Credentials credentials; | ||||
|  | ||||
|     /** | ||||
|      * The tunnel being closed. | ||||
|      */ | ||||
|     private GuacamoleTunnel tunnel; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new TunnelCloseEvent which represents the closing of the | ||||
|      * given tunnel via a request associated with the given credentials. | ||||
|      * | ||||
|      * @param context The UserContext associated with the request closing  | ||||
|      *                the tunnel. | ||||
|      * @param credentials The credentials associated with the request that  | ||||
|      *                    connected the tunnel. | ||||
|      * @param tunnel The tunnel being closed. | ||||
|      */ | ||||
|     public TunnelCloseEvent(UserContext context, Credentials credentials, | ||||
|             GuacamoleTunnel tunnel) { | ||||
|         this.context = context; | ||||
|         this.credentials = credentials; | ||||
|         this.tunnel = tunnel; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UserContext getUserContext() { | ||||
|         return context; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Credentials getCredentials() { | ||||
|         return credentials; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public GuacamoleTunnel getTunnel() { | ||||
|         return tunnel; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,67 @@ | ||||
| package org.glyptodon.guacamole.net.event; | ||||
|  | ||||
| import org.glyptodon.guacamole.net.GuacamoleTunnel; | ||||
| import org.glyptodon.guacamole.net.auth.Credentials; | ||||
| import org.glyptodon.guacamole.net.auth.UserContext; | ||||
|  | ||||
| /** | ||||
|  * An event which is triggered whenever a tunnel is being connected. The tunnel | ||||
|  * being connected can be accessed through getTunnel(), and the UserContext | ||||
|  * associated with the request which is connecting the tunnel can be retrieved | ||||
|  * with getUserContext(). | ||||
|  | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class TunnelConnectEvent implements UserEvent, CredentialEvent, TunnelEvent { | ||||
|  | ||||
|     /** | ||||
|      * The UserContext associated with the request that is connecting the | ||||
|      * tunnel, if any. | ||||
|      */ | ||||
|     private UserContext context; | ||||
|  | ||||
|     /** | ||||
|      * The credentials associated with the request that is connecting the | ||||
|      * tunnel, if any. | ||||
|      */ | ||||
|     private Credentials credentials; | ||||
|  | ||||
|     /** | ||||
|      * The tunnel being connected. | ||||
|      */ | ||||
|     private GuacamoleTunnel tunnel; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new TunnelConnectEvent which represents the connecting of the | ||||
|      * given tunnel via a request associated with the given credentials. | ||||
|      * | ||||
|      * @param context The UserContext associated with the request connecting | ||||
|      *                the tunnel. | ||||
|      * @param credentials The credentials associated with the request connecting | ||||
|      *                    the tunnel. | ||||
|      * @param tunnel The tunnel being connected. | ||||
|      */ | ||||
|     public TunnelConnectEvent(UserContext context, Credentials credentials, | ||||
|             GuacamoleTunnel tunnel) { | ||||
|         this.context = context; | ||||
|         this.credentials = credentials; | ||||
|         this.tunnel = tunnel; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UserContext getUserContext() { | ||||
|         return context; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Credentials getCredentials() { | ||||
|         return credentials; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public GuacamoleTunnel getTunnel() { | ||||
|         return tunnel; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,20 @@ | ||||
| package org.glyptodon.guacamole.net.event; | ||||
|  | ||||
| import org.glyptodon.guacamole.net.GuacamoleTunnel; | ||||
|  | ||||
| /** | ||||
|  * Abstract basis for events associated with tunnels. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface TunnelEvent { | ||||
|  | ||||
|     /** | ||||
|      * Returns the tunnel associated with this event, if any. | ||||
|      * | ||||
|      * @return The tunnel associated with this event, if any, or null if no | ||||
|      *         tunnel is associated with this event. | ||||
|      */ | ||||
|     GuacamoleTunnel getTunnel(); | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,21 @@ | ||||
| package org.glyptodon.guacamole.net.event; | ||||
|  | ||||
| import org.glyptodon.guacamole.net.auth.UserContext; | ||||
|  | ||||
| /** | ||||
|  * Abstract basis for events which may have an associated UserContext when | ||||
|  * triggered. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface UserEvent { | ||||
|  | ||||
|     /** | ||||
|      * Returns the current UserContext of the user triggering the event, if any. | ||||
|      * | ||||
|      * @return The current UserContext of the user triggering the event, if | ||||
|      *         any, or null if no UserContext is associated with the event. | ||||
|      */ | ||||
|     UserContext getUserContext(); | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,29 @@ | ||||
| package org.glyptodon.guacamole.net.event.listener; | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.event.AuthenticationFailureEvent; | ||||
|  | ||||
| /** | ||||
|  * A listener whose authenticationFailed() hook will fire immediately | ||||
|  * after a user's authentication attempt fails. Note that this hook cannot | ||||
|  * be used to cancel the authentication failure. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface AuthenticationFailureListener  { | ||||
|  | ||||
|     /** | ||||
|      * Event hook which fires immediately after a user's authentication attempt | ||||
|      * fails. | ||||
|      * | ||||
|      * @param e The AuthenticationFailureEvent describing the authentication | ||||
|      *          failure that just occurred. | ||||
|      * @throws GuacamoleException If an error occurs while handling the | ||||
|      *                            authentication failure event. Note that | ||||
|      *                            throwing an exception will NOT cause the | ||||
|      *                            authentication failure to be canceled. | ||||
|      */ | ||||
|     void authenticationFailed(AuthenticationFailureEvent e) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,34 @@ | ||||
| package org.glyptodon.guacamole.net.event.listener; | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.event.AuthenticationSuccessEvent; | ||||
|  | ||||
| /** | ||||
|  * A listener whose hooks will fire immediately before and after a user's | ||||
|  * authentication attempt succeeds. If a user successfully authenticates, | ||||
|  * the authenticationSucceeded() hook has the opportunity to cancel the | ||||
|  * authentication and force it to fail. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface AuthenticationSuccessListener { | ||||
|  | ||||
|     /** | ||||
|      * Event hook which fires immediately after a user's authentication attempt | ||||
|      * succeeds. The return value of this hook dictates whether the | ||||
|      * successful authentication attempt is canceled. | ||||
|      * | ||||
|      * @param e The AuthenticationFailureEvent describing the authentication | ||||
|      *          failure that just occurred. | ||||
|      * @return true if the successful authentication attempt should be | ||||
|      *         allowed, or false if the attempt should be denied, causing | ||||
|      *         the attempt to effectively fail. | ||||
|      * @throws GuacamoleException If an error occurs while handling the | ||||
|      *                            authentication success event. Throwing an | ||||
|      *                            exception will also cancel the authentication | ||||
|      *                            success. | ||||
|      */ | ||||
|     boolean authenticationSucceeded(AuthenticationSuccessEvent e) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,31 @@ | ||||
| package org.glyptodon.guacamole.net.event.listener; | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.event.TunnelCloseEvent; | ||||
|  | ||||
| /** | ||||
|  * A listener whose tunnelClosed() hook will fire immediately after an | ||||
|  * existing tunnel is closed. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface TunnelCloseListener { | ||||
|  | ||||
|     /** | ||||
|      * Event hook which fires immediately after an existing tunnel is closed. | ||||
|      * The return value of this hook dictates whether the tunnel is allowed to | ||||
|      * be closed. | ||||
|      * | ||||
|      * @param e The TunnelCloseEvent describing the tunnel being closed and | ||||
|      *          any associated credentials. | ||||
|      * @return true if the tunnel should be allowed to be closed, or false | ||||
|      *         if the attempt should be denied, causing the attempt to | ||||
|      *         effectively fail. | ||||
|      * @throws GuacamoleException If an error occurs while handling the | ||||
|      *                            tunnel close event. Throwing an exception | ||||
|      *                            will also stop the tunnel from being closed. | ||||
|      */ | ||||
|     boolean tunnelClosed(TunnelCloseEvent e) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,32 @@ | ||||
| package org.glyptodon.guacamole.net.event.listener; | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.net.event.TunnelConnectEvent; | ||||
|  | ||||
| /** | ||||
|  * A listener whose tunnelConnected() hook will fire immediately after a new | ||||
|  * tunnel is connected. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public interface TunnelConnectListener { | ||||
|  | ||||
|    /** | ||||
|      * Event hook which fires immediately after a new tunnel is connected. | ||||
|      * The return value of this hook dictates whether the tunnel is made visible | ||||
|      * to the session. | ||||
|      * | ||||
|      * @param e The TunnelConnectEvent describing the tunnel being connected and | ||||
|      *          any associated credentials. | ||||
|      * @return true if the tunnel should be allowed to be connected, or false | ||||
|      *         if the attempt should be denied, causing the attempt to | ||||
|      *         effectively fail. | ||||
|      * @throws GuacamoleException If an error occurs while handling the | ||||
|      *                            tunnel connect event. Throwing an exception | ||||
|      *                            will also stop the tunnel from being made | ||||
|      *                            visible to the session. | ||||
|      */ | ||||
|     boolean tunnelConnected(TunnelConnectEvent e) | ||||
|             throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,10 @@ | ||||
|  | ||||
| /** | ||||
|  * Provides classes for hooking into various events that take place as | ||||
|  * users log into and use the Guacamole web application. These event | ||||
|  * hooks can be used to take action upon occurrence of an event and, | ||||
|  * in some cases, prevent the web application from allowing the | ||||
|  * event to continue for the user that triggered it. | ||||
|  */ | ||||
| package org.glyptodon.guacamole.net.event.listener; | ||||
|  | ||||
| @@ -0,0 +1,11 @@ | ||||
|  | ||||
| /** | ||||
|  * Provides classes for storing information about events that are | ||||
|  * triggered when users log into and use the Guacamole web application. | ||||
|  * These event classes are most useful when used with hooks implemented | ||||
|  * using listener classes. | ||||
|  * | ||||
|  * @see org.glyptodon.guacamole.net.event.listener | ||||
|  */ | ||||
| package org.glyptodon.guacamole.net.event; | ||||
|  | ||||
| @@ -0,0 +1,72 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.properties; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.GuacamoleServerException; | ||||
|  | ||||
| /** | ||||
|  * A GuacamoleProperty whose value is an boolean. Legal true values are "true", | ||||
|  * or "false". Case does not matter. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public abstract class BooleanGuacamoleProperty implements GuacamoleProperty<Boolean> { | ||||
|  | ||||
|     @Override | ||||
|     public Boolean parseValue(String value) throws GuacamoleException { | ||||
|  | ||||
|         // If no property provided, return null. | ||||
|         if (value == null) | ||||
|             return null; | ||||
|  | ||||
|         // If "true", return true | ||||
|         if (value.equalsIgnoreCase("true")) | ||||
|             return true; | ||||
|  | ||||
|         // If "false", return false | ||||
|         if (value.equalsIgnoreCase("false")) | ||||
|             return false; | ||||
|  | ||||
|         // Otherwise, fail | ||||
|         throw new GuacamoleServerException("Property \"" + getName() | ||||
|                 + "\" must be either \"true\" or \"false\"."); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,61 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.properties; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.io.File; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
|  | ||||
| /** | ||||
|  * A GuacamoleProperty whose value is a filename. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public abstract class FileGuacamoleProperty implements GuacamoleProperty<File> { | ||||
|  | ||||
|     @Override | ||||
|     public File parseValue(String value) throws GuacamoleException { | ||||
|  | ||||
|         // If no property provided, return null. | ||||
|         if (value == null) | ||||
|             return null; | ||||
|  | ||||
|         return new File(value); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,87 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.properties; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.io.File; | ||||
|  | ||||
| /** | ||||
|  * Abstract representation of the Guacamole configuration directory. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class GuacamoleHome { | ||||
|  | ||||
|     /** | ||||
|      * GuacamoleHome is a utility class and cannot be instantiated. | ||||
|      */ | ||||
|     private GuacamoleHome() {} | ||||
|  | ||||
|     /** | ||||
|      * Returns the Guacamole home directory by checking, in order: | ||||
|      * the guacamole.home system property, the GUACAMOLE_HOME environment | ||||
|      * variable, and finally the .guacamole directory in the home directory of | ||||
|      * the user running the servlet container. | ||||
|      * | ||||
|      * @return The File representing the Guacamole home directory, which may | ||||
|      *         or may not exist, and may turn out to not be a directory. | ||||
|      */ | ||||
|     public static File getDirectory() { | ||||
|  | ||||
|         // Attempt to find Guacamole home | ||||
|         File guacHome; | ||||
|  | ||||
|         // Use system property by default | ||||
|         String desiredDir = System.getProperty("guacamole.home"); | ||||
|  | ||||
|         // Failing that, try the GUACAMOLE_HOME environment variable | ||||
|         if (desiredDir == null) desiredDir = System.getenv("GUACAMOLE_HOME"); | ||||
|  | ||||
|         // If successful, use explicitly specified directory | ||||
|         if (desiredDir != null) | ||||
|             guacHome = new File(desiredDir); | ||||
|  | ||||
|         // If not explicitly specified, use ~/.guacamole | ||||
|         else | ||||
|             guacHome = new File(System.getProperty("user.home"), ".guacamole"); | ||||
|  | ||||
|         // Return discovered directory | ||||
|         return guacHome; | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,220 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.properties; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.util.Properties; | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.GuacamoleServerException; | ||||
|  | ||||
| /** | ||||
|  * Simple utility class for reading properties from the guacamole.properties | ||||
|  * file. The guacamole.properties file is preferably located in the servlet | ||||
|  * container's user's home directory, in a subdirectory called .guacamole, or | ||||
|  * in the directory set by the system property: guacamole.home. | ||||
|  * | ||||
|  * If none of those locations are possible, guacamole.properties will also | ||||
|  * be read from the root of the classpath. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class GuacamoleProperties { | ||||
|  | ||||
|     /** | ||||
|      * GuacamoleProperties is a utility class and cannot be instantiated. | ||||
|      */ | ||||
|     private GuacamoleProperties() {} | ||||
|  | ||||
|     /** | ||||
|      * The hostname of the server where guacd (the Guacamole proxy server) is | ||||
|      * running. | ||||
|      */ | ||||
|     public static final StringGuacamoleProperty GUACD_HOSTNAME = new StringGuacamoleProperty() { | ||||
|  | ||||
|         @Override | ||||
|         public String getName() { return "guacd-hostname"; } | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * The port that guacd (the Guacamole proxy server) is listening on. | ||||
|      */ | ||||
|     public static final IntegerGuacamoleProperty GUACD_PORT = new IntegerGuacamoleProperty() { | ||||
|  | ||||
|         @Override | ||||
|         public String getName() { return "guacd-port"; } | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Whether guacd requires SSL/TLS on connections. | ||||
|      */ | ||||
|     public static final BooleanGuacamoleProperty GUACD_SSL = new BooleanGuacamoleProperty() { | ||||
|  | ||||
|         @Override | ||||
|         public String getName() { return "guacd-ssl"; } | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * All properties read from guacamole.properties when this class was first | ||||
|      * used. | ||||
|      */ | ||||
|     private static final Properties properties; | ||||
|  | ||||
|     /** | ||||
|      * Any error encountered when reading guacamole.properties was last | ||||
|      * attempted. | ||||
|      */ | ||||
|     private static GuacamoleException exception; | ||||
|  | ||||
|     static { | ||||
|  | ||||
|         properties = new Properties(); | ||||
|  | ||||
|         try { | ||||
|  | ||||
|             // Attempt to find Guacamole home | ||||
|             File guacHome = GuacamoleHome.getDirectory(); | ||||
|  | ||||
|             InputStream stream; | ||||
|  | ||||
|             // If not a directory, load from classpath | ||||
|             if (!guacHome.isDirectory()) { | ||||
|  | ||||
|                 // Read from classpath | ||||
|                 stream = GuacamoleProperties.class.getResourceAsStream("/guacamole.properties"); | ||||
|                 if (stream == null) | ||||
|                     throw new IOException( | ||||
|                         "guacamole.properties not loaded from " + guacHome | ||||
|                       + " (not a directory), and guacamole.properties could" | ||||
|                       + " not be found as a resource in the classpath."); | ||||
|  | ||||
|             } | ||||
|  | ||||
|             // Otherwise, try to load from file | ||||
|             else | ||||
|                 stream = new FileInputStream(new File(guacHome, "guacamole.properties")); | ||||
|  | ||||
|             // Load properties, always close stream | ||||
|             try { properties.load(stream); } | ||||
|             finally { stream.close(); } | ||||
|  | ||||
|         } | ||||
|         catch (IOException e) { | ||||
|             exception = new GuacamoleServerException("Error reading guacamole.properties", e); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Given a GuacamoleProperty, parses and returns the value set for that | ||||
|      * property in guacamole.properties, if any. | ||||
|      * | ||||
|      * @param <Type> The type that the given property is parsed into. | ||||
|      * @param property The property to read from guacamole.properties. | ||||
|      * @return The parsed value of the property as read from | ||||
|      *         guacamole.properties. | ||||
|      * @throws GuacamoleException If an error occurs while parsing the value | ||||
|      *                            for the given property in | ||||
|      *                            guacamole.properties. | ||||
|      */ | ||||
|     public static <Type> Type getProperty(GuacamoleProperty<Type> property) throws GuacamoleException { | ||||
|  | ||||
|         if (exception != null) | ||||
|             throw exception; | ||||
|  | ||||
|         return property.parseValue(properties.getProperty(property.getName())); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Given a GuacamoleProperty, parses and returns the value set for that | ||||
|      * property in guacamole.properties, if any. If no value is found, the | ||||
|      * provided default value is returned. | ||||
|      * | ||||
|      * @param <Type> The type that the given property is parsed into. | ||||
|      * @param property The property to read from guacamole.properties. | ||||
|      * @param defaultValue The value to return if no value was given in | ||||
|      *                     guacamole.properties. | ||||
|      * @return The parsed value of the property as read from | ||||
|      *         guacamole.properties, or the provided default value if no value | ||||
|      *         was found. | ||||
|      * @throws GuacamoleException If an error occurs while parsing the value | ||||
|      *                            for the given property in | ||||
|      *                            guacamole.properties. | ||||
|      */ | ||||
|     public static <Type> Type getProperty(GuacamoleProperty<Type> property, | ||||
|             Type defaultValue) throws GuacamoleException { | ||||
|  | ||||
|         Type value = getProperty(property); | ||||
|         if (value == null) | ||||
|             return defaultValue; | ||||
|  | ||||
|         return value; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Given a GuacamoleProperty, parses and returns the value set for that | ||||
|      * property in guacamole.properties. An exception is thrown if the value | ||||
|      * is not provided. | ||||
|      * | ||||
|      * @param <Type> The type that the given property is parsed into. | ||||
|      * @param property The property to read from guacamole.properties. | ||||
|      * @return The parsed value of the property as read from | ||||
|      *         guacamole.properties. | ||||
|      * @throws GuacamoleException If an error occurs while parsing the value | ||||
|      *                            for the given property in | ||||
|      *                            guacamole.properties, or if the property is | ||||
|      *                            not specified. | ||||
|      */ | ||||
|     public static <Type> Type getRequiredProperty(GuacamoleProperty<Type> property) | ||||
|             throws GuacamoleException { | ||||
|  | ||||
|         Type value = getProperty(property); | ||||
|         if (value == null) | ||||
|             throw new GuacamoleServerException("Property " + property.getName() + " is required."); | ||||
|  | ||||
|         return value; | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,71 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.properties; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
|  | ||||
| /** | ||||
|  * An abstract representation of a property in the guacamole.properties file, | ||||
|  * which parses into a specific type. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  * @param <Type> The type this GuacamoleProperty will parse into. | ||||
|  */ | ||||
| public interface GuacamoleProperty<Type> { | ||||
|  | ||||
|     /** | ||||
|      * Returns the name of the property in guacamole.properties that this | ||||
|      * GuacamoleProperty will parse. | ||||
|      * | ||||
|      * @return The name of the property in guacamole.properties that this | ||||
|      *         GuacamoleProperty will parse. | ||||
|      */ | ||||
|     public String getName(); | ||||
|  | ||||
|     /** | ||||
|      * Parses the given string value into the type associated with this | ||||
|      * GuacamoleProperty. | ||||
|      * | ||||
|      * @param value The string value to parse. | ||||
|      * @return The parsed value. | ||||
|      * @throws GuacamoleException If an error occurs while parsing the | ||||
|      *                            provided value. | ||||
|      */ | ||||
|     public Type parseValue(String value) throws GuacamoleException; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,67 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.properties; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
| import org.glyptodon.guacamole.GuacamoleServerException; | ||||
|  | ||||
| /** | ||||
|  * A GuacamoleProperty whose value is an integer. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public abstract class IntegerGuacamoleProperty implements GuacamoleProperty<Integer> { | ||||
|  | ||||
|     @Override | ||||
|     public Integer parseValue(String value) throws GuacamoleException { | ||||
|  | ||||
|         // If no property provided, return null. | ||||
|         if (value == null) | ||||
|             return null; | ||||
|  | ||||
|         try { | ||||
|             Integer integer = new Integer(value); | ||||
|             return integer; | ||||
|         } | ||||
|         catch (NumberFormatException e) { | ||||
|             throw new GuacamoleServerException("Property \"" + getName() + "\" must be an integer.", e); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,54 @@ | ||||
|  | ||||
| package org.glyptodon.guacamole.properties; | ||||
|  | ||||
| /* ***** BEGIN LICENSE BLOCK ***** | ||||
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||
|  * | ||||
|  * The contents of this file are subject to the Mozilla Public License Version | ||||
|  * 1.1 (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.mozilla.org/MPL/ | ||||
|  * | ||||
|  * Software distributed under the License is distributed on an "AS IS" basis, | ||||
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||
|  * for the specific language governing rights and limitations under the | ||||
|  * License. | ||||
|  * | ||||
|  * The Original Code is guacamole-ext. | ||||
|  * | ||||
|  * The Initial Developer of the Original Code is | ||||
|  * Michael Jumper. | ||||
|  * Portions created by the Initial Developer are Copyright (C) 2010 | ||||
|  * the Initial Developer. All Rights Reserved. | ||||
|  * | ||||
|  * Contributor(s): | ||||
|  * | ||||
|  * Alternatively, the contents of this file may be used under the terms of | ||||
|  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||
|  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||
|  * of those above. If you wish to allow use of your version of this file only | ||||
|  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||
|  * use your version of this file under the terms of the MPL, indicate your | ||||
|  * decision by deleting the provisions above and replace them with the notice | ||||
|  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||
|  * the provisions above, a recipient may use your version of this file under | ||||
|  * the terms of any one of the MPL, the GPL or the LGPL. | ||||
|  * | ||||
|  * ***** END LICENSE BLOCK ***** */ | ||||
|  | ||||
| import org.glyptodon.guacamole.GuacamoleException; | ||||
|  | ||||
| /** | ||||
|  * A GuacamoleProperty whose value is a simple string. | ||||
|  * | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public abstract class StringGuacamoleProperty implements GuacamoleProperty<String> { | ||||
|  | ||||
|     @Override | ||||
|     public String parseValue(String value) throws GuacamoleException { | ||||
|         return value; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,7 @@ | ||||
|  | ||||
| /** | ||||
|  * Provides classes for reading properties from the web-application-wide | ||||
|  * guacamole.properties file. | ||||
|  */ | ||||
| package org.glyptodon.guacamole.properties; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user