diff --git a/guacamole-ext/.gitignore b/guacamole-ext/.gitignore new file mode 100644 index 000000000..42f4a1a64 --- /dev/null +++ b/guacamole-ext/.gitignore @@ -0,0 +1,2 @@ +target/ +*~ diff --git a/guacamole-ext/ChangeLog b/guacamole-ext/ChangeLog new file mode 100644 index 000000000..53960bae3 --- /dev/null +++ b/guacamole-ext/ChangeLog @@ -0,0 +1,18 @@ +2012-10-15 Michael Jumper + + * Updated to latest guacamole-common + +2012-08-11 Michael Jumper + + * Improved documentation + +2012-05-04 Michael Jumper + + * Renamed to guacamole-ext + * Generic HTTP-based Credentials object + * Added support for listeners and hooks + +2011-12-11 Michael Jumper + + * Initial release + diff --git a/guacamole-ext/LICENSE b/guacamole-ext/LICENSE new file mode 100644 index 000000000..7714141d1 --- /dev/null +++ b/guacamole-ext/LICENSE @@ -0,0 +1,470 @@ + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``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 ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + diff --git a/guacamole-ext/README b/guacamole-ext/README new file mode 100644 index 000000000..3bb3cefaa --- /dev/null +++ b/guacamole-ext/README @@ -0,0 +1,79 @@ + +------------------------------------------------------------ + About this README +------------------------------------------------------------ + +This README is intended to provide quick and to-the-point documentation for +technical users intending to compile parts of Guacamole themselves. + +Distribution-specific packages are available from the files section of the main +project page: + + http://sourceforge.net/projects/guacamole/files/ + +Distribution-specific documentation is provided on the Guacamole wiki: + + http://guac-dev.org/ + + +------------------------------------------------------------ + What is guacamole-common-auth? +------------------------------------------------------------ + +guacamole-common-auth is a Java library used by the Guacamole web +application to allow its built-in authentication to be extended or +modified and reused. + +guacamole-common-auth provides an interface for retrieving a set of +authorized connection configurations for a given set of arbitrary +credentials. Classes implementing this interface can be referenced in +guacamole.properties to allow different authentication mechanisms +(such as LDAP) to be used. + + +------------------------------------------------------------ + Compiling and installing guacamole-common-auth +------------------------------------------------------------ + +guacamole-common-auth is built using Maven. Building guacamole-common-auth +compiles all classes and packages them into a redistributable .jar file. This +.jar file can be easily included in other Maven-based projects (like Guacamole). + +Note that prebuilt versions of guacamole-common-auth are available from the +main guac-dev.org Maven repository which is referenced in all Maven +projects in Guacamole. Unless you want to make changes to guacamole-common-auth +or you want to use a newer, unreleased version (such as the unstable branch), +you do not need to build this manually. You can let Maven download it for +you when you build Guacamole. + +1) Run mvn package + + $ mvn package + + Maven will download any needed dependencies for building the .jar file. + Once all dependencies have been downloaded, the .jar file will be + created in the target/ subdirectory of the current directory. + +2) Run mvn install + + $ mvn install + + DO NOT RUN THIS AS ROOT! + + Maven will install guacamole-common-auth to your user's local Maven + repository where it can be used in future builds. It will not install + into a system-wide repository and does not require root privileges. + + Once installed, building other Maven projects that depend on + guacamole-common-auth (such as Guacamole) will be possible. + + +------------------------------------------------------------ + Reporting problems +------------------------------------------------------------ + +Please report any bugs encountered by opening a new ticket at the Trac system +hosted at: + + http://guac-dev.org/trac/ + diff --git a/guacamole-ext/pom.xml b/guacamole-ext/pom.xml new file mode 100644 index 000000000..b301f9b15 --- /dev/null +++ b/guacamole-ext/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + net.sourceforge.guacamole + guacamole-ext + jar + 0.8.0 + guacamole-ext + http://guac-dev.org/ + + + UTF-8 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + + + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + net.sourceforge.guacamole + guacamole-common + 0.8.0 + compile + + + + + + + + + guac-dev + http://guac-dev.org/repo + + + + + diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AbstractConnection.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AbstractConnection.java new file mode 100644 index 000000000..df159183c --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AbstractConnection.java @@ -0,0 +1,104 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.protocol.GuacamoleConfiguration; + + +/** + * Basic implementation of a Guacamole connection. + * + * @author Michael Jumper + */ +public abstract class AbstractConnection implements Connection { + + /** + * The unique identifier associated with this connection. + */ + private String identifier; + + /** + * The GuacamoleConfiguration associated with this connection. + */ + private GuacamoleConfiguration configuration; + + @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 User + 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); + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AbstractUser.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AbstractUser.java new file mode 100644 index 000000000..3cebd0f25 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AbstractUser.java @@ -0,0 +1,105 @@ + +package net.sourceforge.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); + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AuthenticationProvider.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AuthenticationProvider.java new file mode 100644 index 000000000..7fd72829c --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/AuthenticationProvider.java @@ -0,0 +1,65 @@ + +package net.sourceforge.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 net.sourceforge.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; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Connection.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Connection.java new file mode 100644 index 000000000..fdfea4577 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Connection.java @@ -0,0 +1,118 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.net.GuacamoleSocket; +import net.sourceforge.guacamole.protocol.GuacamoleClientInformation; +import net.sourceforge.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 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 getHistory() throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/ConnectionRecord.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/ConnectionRecord.java new file mode 100644 index 000000000..b9f28ed40 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/ConnectionRecord.java @@ -0,0 +1,83 @@ + +package net.sourceforge.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(); + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Credentials.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Credentials.java new file mode 100644 index 000000000..36a2e0afa --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Credentials.java @@ -0,0 +1,152 @@ +package net.sourceforge.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; + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Directory.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Directory.java new file mode 100644 index 000000000..0847ede83 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/Directory.java @@ -0,0 +1,117 @@ +package net.sourceforge.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 net.sourceforge.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 The type of identifier used to identify objects + * stored within this Directory. + * @param The type of objects stored within this Directory. + */ +public interface Directory { + + /** + * 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 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; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/User.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/User.java new file mode 100644 index 000000000..cb2d9572c --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/User.java @@ -0,0 +1,129 @@ + +package net.sourceforge.guacamole.net.auth; + +import java.util.Set; +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.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 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; + + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/UserContext.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/UserContext.java new file mode 100644 index 000000000..26ef62398 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/UserContext.java @@ -0,0 +1,86 @@ + +package net.sourceforge.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 net.sourceforge.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 getUserDirectory() throws GuacamoleException; + + /** + * 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 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 getConnectionDirectory() + throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/package-info.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/package-info.java new file mode 100644 index 000000000..5c42c725a --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/package-info.java @@ -0,0 +1,7 @@ + +/** + * Provides classes which can be used to extend or replace the authentication + * functionality of the Guacamole web application. + */ +package net.sourceforge.guacamole.net.auth; + diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/ConnectionPermission.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/ConnectionPermission.java new file mode 100644 index 000000000..b171fa605 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/ConnectionPermission.java @@ -0,0 +1,121 @@ + +package net.sourceforge.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 { + + /** + * 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); + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/ObjectPermission.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/ObjectPermission.java new file mode 100644 index 000000000..0325ca0d3 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/ObjectPermission.java @@ -0,0 +1,87 @@ + +package net.sourceforge.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 The type of identifier used by the object this permission affects. + */ +public interface ObjectPermission extends Permission { + + /** + * 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(); + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/Permission.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/Permission.java new file mode 100644 index 000000000..af855df9d --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/Permission.java @@ -0,0 +1,57 @@ + +package net.sourceforge.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 The enumeration of all available operation types that this + * permission can affect. + */ +public interface Permission { + + /** + * Returns the type of operation affected by this permission. + * @return The type of operation affected by this permission. + */ + public Type getType(); + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/SystemPermission.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/SystemPermission.java new file mode 100644 index 000000000..6d0ce27ed --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/SystemPermission.java @@ -0,0 +1,115 @@ + +package net.sourceforge.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 { + + /** + * 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, + + /** + * 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; + } + + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/UserPermission.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/UserPermission.java new file mode 100644 index 000000000..7d18c2b63 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/UserPermission.java @@ -0,0 +1,116 @@ + +package net.sourceforge.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 { + + /** + * 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); + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/package-info.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/package-info.java new file mode 100644 index 000000000..242edc24c --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/permission/package-info.java @@ -0,0 +1,7 @@ + +/** + * Provides classes which describe the various permissions a Guacamole user + * can be granted. + */ +package net.sourceforge.guacamole.net.auth.permission; + diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleAuthenticationProvider.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleAuthenticationProvider.java new file mode 100644 index 000000000..ebd9ed331 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleAuthenticationProvider.java @@ -0,0 +1,100 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.net.auth.AuthenticationProvider; +import net.sourceforge.guacamole.net.auth.Credentials; +import net.sourceforge.guacamole.net.auth.User; +import net.sourceforge.guacamole.net.auth.UserContext; +import net.sourceforge.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 + getAuthorizedConfigurations(Credentials credentials) + throws GuacamoleException; + + @Override + public UserContext getUserContext(Credentials credentials) + throws GuacamoleException { + + // Get configurations + Map configs = + getAuthorizedConfigurations(credentials); + + // Return as unauthorized if not authorized to retrieve configs + if (configs == null) + return null; + + // Build new user from credentials + User user = new SimpleUser(credentials.getUsername(), configs); + + // Return user context restricted to authorized configs + return new SimpleUserContext(user, configs); + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleConnection.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleConnection.java new file mode 100644 index 000000000..c033dec41 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleConnection.java @@ -0,0 +1,112 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.net.GuacamoleSocket; +import net.sourceforge.guacamole.net.InetGuacamoleSocket; +import net.sourceforge.guacamole.net.auth.AbstractConnection; +import net.sourceforge.guacamole.net.auth.ConnectionRecord; +import net.sourceforge.guacamole.properties.GuacamoleProperties; +import net.sourceforge.guacamole.protocol.ConfiguredGuacamoleSocket; +import net.sourceforge.guacamole.protocol.GuacamoleClientInformation; +import net.sourceforge.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 identifier The identifier to associated with this connection. + * @param config The configuration describing how to connect to this + * connection. + */ + public SimpleConnection(String identifier, + GuacamoleConfiguration config) { + + // 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); + + // Return connected socket + return new ConfiguredGuacamoleSocket( + new InetGuacamoleSocket(hostname, port), + config, info + ); + + } + + @Override + public List getHistory() throws GuacamoleException { + return Collections.EMPTY_LIST; + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleConnectionDirectory.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleConnectionDirectory.java new file mode 100644 index 000000000..7787ef09c --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleConnectionDirectory.java @@ -0,0 +1,111 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleSecurityException; +import net.sourceforge.guacamole.net.auth.Connection; +import net.sourceforge.guacamole.net.auth.Directory; +import net.sourceforge.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 { + + /** + * The Map of Connections to provide access to. + */ + private Map connections = + new HashMap(); + + /** + * 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 configs) { + + // Create connections for each config + for (Entry entry : configs.entrySet()) + connections.put(entry.getKey(), + new SimpleConnection(entry.getKey(), entry.getValue())); + + } + + @Override + public Connection get(String identifier) + throws GuacamoleException { + return connections.get(identifier); + } + + @Override + public Set 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."); + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUser.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUser.java new file mode 100644 index 000000000..dc6713bad --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUser.java @@ -0,0 +1,118 @@ + +package net.sourceforge.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.HashSet; +import java.util.Map; +import java.util.Set; +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleSecurityException; +import net.sourceforge.guacamole.net.auth.AbstractUser; +import net.sourceforge.guacamole.net.auth.permission.ConnectionPermission; +import net.sourceforge.guacamole.net.auth.permission.ObjectPermission; +import net.sourceforge.guacamole.net.auth.permission.Permission; +import net.sourceforge.guacamole.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 permissions = new HashSet(); + + /** + * 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. + */ + public SimpleUser(String username, + Map configs) { + + // Set username + setUsername(username); + + // Add permissions + for (String identifier : configs.keySet()) { + + // Create permission + Permission permission = new ConnectionPermission( + ObjectPermission.Type.READ, + identifier + ); + + // Add to set + permissions.add(permission); + + } + + } + + @Override + public Set 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."); + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUserContext.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUserContext.java new file mode 100644 index 000000000..65be77a89 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUserContext.java @@ -0,0 +1,114 @@ + +package net.sourceforge.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.Map; +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.net.auth.Connection; +import net.sourceforge.guacamole.net.auth.Directory; +import net.sourceforge.guacamole.net.auth.User; +import net.sourceforge.guacamole.net.auth.UserContext; +import net.sourceforge.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 those Connections that the User + * associated with this UserContext has access to. + */ + private final Directory connectionDirectory; + + /** + * The Directory with access only to the User associated with this + * UserContext. + */ + private final Directory userDirectory; + + /** + * Creates a new SimpleUserContext which provides access to only those + * configurations within the given Map. The User given must be the user + * that owns this UserContext, and the Map given must contain only + * GuacamoleConfigurations that the given User has read access to. + * + * @param self The owner of this UserContext. + * @param configs A Map of all configurations for which the user associated + * with this UserContext has read access. + */ + public SimpleUserContext(User self, + Map configs) { + + this.self = self; + + this.connectionDirectory = + new SimpleConnectionDirectory(configs); + + this.userDirectory = new SimpleUserDirectory(self); + + } + + @Override + public User self() { + return self; + } + + @Override + public Directory getConnectionDirectory() + throws GuacamoleException { + return connectionDirectory; + } + + @Override + public Directory getUserDirectory() + throws GuacamoleException { + return userDirectory; + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUserDirectory.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUserDirectory.java new file mode 100644 index 000000000..49af4605b --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/SimpleUserDirectory.java @@ -0,0 +1,103 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleSecurityException; +import net.sourceforge.guacamole.net.auth.Directory; +import net.sourceforge.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 { + + /** + * 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 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."); + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/package-info.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/package-info.java new file mode 100644 index 000000000..7066da16d --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/auth/simple/package-info.java @@ -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 net.sourceforge.guacamole.net.auth.simple; + diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/AuthenticationFailureEvent.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/AuthenticationFailureEvent.java new file mode 100644 index 000000000..6ce8b5c3a --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/AuthenticationFailureEvent.java @@ -0,0 +1,34 @@ +package net.sourceforge.guacamole.net.event; + +import net.sourceforge.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; + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/AuthenticationSuccessEvent.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/AuthenticationSuccessEvent.java new file mode 100644 index 000000000..80986fd6c --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/AuthenticationSuccessEvent.java @@ -0,0 +1,34 @@ +package net.sourceforge.guacamole.net.event; + +import net.sourceforge.guacamole.net.auth.Credentials; + +/** + * 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 CredentialEvent { + + /** + * The credentials which passed authentication. + */ + private Credentials credentials; + + /** + * Creates a new AuthenticationSuccessEvent which represents a successful + * authentication attempt with the given credentials. + * + * @param credentials The credentials which passed authentication. + */ + public AuthenticationSuccessEvent(Credentials credentials) { + this.credentials = credentials; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/CredentialEvent.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/CredentialEvent.java new file mode 100644 index 000000000..e106ab448 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/CredentialEvent.java @@ -0,0 +1,21 @@ +package net.sourceforge.guacamole.net.event; + +import net.sourceforge.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(); + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelCloseEvent.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelCloseEvent.java new file mode 100644 index 000000000..d89715514 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelCloseEvent.java @@ -0,0 +1,50 @@ +package net.sourceforge.guacamole.net.event; + +import net.sourceforge.guacamole.net.GuacamoleTunnel; +import net.sourceforge.guacamole.net.auth.Credentials; + +/** + * An event which is triggered whenever a tunnel is being closed. The tunnel + * being closed can be accessed through getTunnel(), and the set of all + * credentials available from the request which is closing the tunnel can be + * retrieved using getCredentials(). + * + * @author Michael Jumper + */ +public class TunnelCloseEvent implements CredentialEvent, TunnelEvent { + + /** + * The credentials associated with the request that is closing 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 credentials The credentials associated with the request + * closing the tunnel. + * @param tunnel The tunnel being closed. + */ + public TunnelCloseEvent(Credentials credentials, GuacamoleTunnel tunnel) { + this.credentials = credentials; + this.tunnel = tunnel; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + @Override + public GuacamoleTunnel getTunnel() { + return tunnel; + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelConnectEvent.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelConnectEvent.java new file mode 100644 index 000000000..b1608111e --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelConnectEvent.java @@ -0,0 +1,50 @@ +package net.sourceforge.guacamole.net.event; + +import net.sourceforge.guacamole.net.GuacamoleTunnel; +import net.sourceforge.guacamole.net.auth.Credentials; + +/** + * An event which is triggered whenever a tunnel is being connected. The tunnel + * being connected can be accessed through getTunnel(), and the set of all + * credentials available from the request which is connecting the tunnel can be + * retrieved using getCredentials(). + * + * @author Michael Jumper + */ +public class TunnelConnectEvent implements CredentialEvent, TunnelEvent { + + /** + * 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 credentials The credentials associated with the request + * connecting the tunnel. + * @param tunnel The tunnel being connected. + */ + public TunnelConnectEvent(Credentials credentials, GuacamoleTunnel tunnel) { + this.credentials = credentials; + this.tunnel = tunnel; + } + + @Override + public Credentials getCredentials() { + return credentials; + } + + @Override + public GuacamoleTunnel getTunnel() { + return tunnel; + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelEvent.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelEvent.java new file mode 100644 index 000000000..e2bc96b1f --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/TunnelEvent.java @@ -0,0 +1,20 @@ +package net.sourceforge.guacamole.net.event; + +import net.sourceforge.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(); + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/AuthenticationFailureListener.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/AuthenticationFailureListener.java new file mode 100644 index 000000000..cc00cbfdf --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/AuthenticationFailureListener.java @@ -0,0 +1,29 @@ +package net.sourceforge.guacamole.net.event.listener; + +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.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; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/AuthenticationSuccessListener.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/AuthenticationSuccessListener.java new file mode 100644 index 000000000..342200635 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/AuthenticationSuccessListener.java @@ -0,0 +1,34 @@ +package net.sourceforge.guacamole.net.event.listener; + +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.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; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/TunnelCloseListener.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/TunnelCloseListener.java new file mode 100644 index 000000000..c80e98473 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/TunnelCloseListener.java @@ -0,0 +1,31 @@ +package net.sourceforge.guacamole.net.event.listener; + +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.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; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/TunnelConnectListener.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/TunnelConnectListener.java new file mode 100644 index 000000000..3eaa0eebc --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/TunnelConnectListener.java @@ -0,0 +1,32 @@ +package net.sourceforge.guacamole.net.event.listener; + +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.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; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/package-info.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/package-info.java new file mode 100644 index 000000000..83545510c --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/listener/package-info.java @@ -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 net.sourceforge.guacamole.net.event.listener; + diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/package-info.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/package-info.java new file mode 100644 index 000000000..c5bd8683e --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/net/event/package-info.java @@ -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 net.sourceforge.guacamole.net.event.listener + */ +package net.sourceforge.guacamole.net.event; + diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/BooleanGuacamoleProperty.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/BooleanGuacamoleProperty.java new file mode 100644 index 000000000..add1d7e45 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/BooleanGuacamoleProperty.java @@ -0,0 +1,72 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.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 { + + @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\"."); + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/FileGuacamoleProperty.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/FileGuacamoleProperty.java new file mode 100644 index 000000000..9b2a4ceb4 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/FileGuacamoleProperty.java @@ -0,0 +1,61 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; + +/** + * A GuacamoleProperty whose value is a filename. + * + * @author Michael Jumper + */ +public abstract class FileGuacamoleProperty implements GuacamoleProperty { + + @Override + public File parseValue(String value) throws GuacamoleException { + + // If no property provided, return null. + if (value == null) + return null; + + return new File(value); + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleHome.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleHome.java new file mode 100644 index 000000000..e7583c349 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleHome.java @@ -0,0 +1,87 @@ + +package net.sourceforge.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; + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleProperties.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleProperties.java new file mode 100644 index 000000000..f152a461d --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleProperties.java @@ -0,0 +1,210 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.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"; } + + }; + + /** + * 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 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 getProperty(GuacamoleProperty 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 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 getProperty(GuacamoleProperty 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 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 getRequiredProperty(GuacamoleProperty property) + throws GuacamoleException { + + Type value = getProperty(property); + if (value == null) + throw new GuacamoleServerException("Property " + property.getName() + " is required."); + + return value; + + } +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleProperty.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleProperty.java new file mode 100644 index 000000000..aae793623 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/GuacamoleProperty.java @@ -0,0 +1,71 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; + +/** + * An abstract representation of a property in the guacamole.properties file, + * which parses into a specific type. + * + * @author Michael Jumper + * @param The type this GuacamoleProperty will parse into. + */ +public interface GuacamoleProperty { + + /** + * 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; + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/IntegerGuacamoleProperty.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/IntegerGuacamoleProperty.java new file mode 100644 index 000000000..479d2bd5b --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/IntegerGuacamoleProperty.java @@ -0,0 +1,67 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleServerException; + +/** + * A GuacamoleProperty whose value is an integer. + * + * @author Michael Jumper + */ +public abstract class IntegerGuacamoleProperty implements GuacamoleProperty { + + @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); + } + + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/StringGuacamoleProperty.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/StringGuacamoleProperty.java new file mode 100644 index 000000000..74fc97e6d --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/StringGuacamoleProperty.java @@ -0,0 +1,54 @@ + +package net.sourceforge.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 net.sourceforge.guacamole.GuacamoleException; + +/** + * A GuacamoleProperty whose value is a simple string. + * + * @author Michael Jumper + */ +public abstract class StringGuacamoleProperty implements GuacamoleProperty { + + @Override + public String parseValue(String value) throws GuacamoleException { + return value; + } + +} diff --git a/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/package-info.java b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/package-info.java new file mode 100644 index 000000000..1c01c62c4 --- /dev/null +++ b/guacamole-ext/src/main/java/net/sourceforge/guacamole/properties/package-info.java @@ -0,0 +1,7 @@ + +/** + * Provides classes for reading properties from the web-application-wide + * guacamole.properties file. + */ +package net.sourceforge.guacamole.properties; +