Adding project branch for "java" components of CASA-auth-token. This was
made necessary by autobuild limitations that forced us to build native components separate from the java components.
This commit is contained in:
		
							
								
								
									
										2
									
								
								CASA-auth-token/java/AUTHORS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								CASA-auth-token/java/AUTHORS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| Juan Carlos Luciani - jluciani@novell.com | ||||
|  | ||||
							
								
								
									
										459
									
								
								CASA-auth-token/java/COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										459
									
								
								CASA-auth-token/java/COPYING
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,459 @@ | ||||
|                     GNU LESSER GENERAL PUBLIC LICENSE | ||||
|                        Version 2.1, February 1999 | ||||
|  | ||||
|  Copyright (C) 1991, 1999 Free Software Foundation, Inc. | ||||
|      51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
| [This is the first released version of the Lesser GPL.  It also counts | ||||
|  as the successor of the GNU Library Public License, version 2, hence | ||||
|  the version number 2.1.] | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The licenses for most software are designed to take away your | ||||
| freedom to share and change it.  By contrast, the GNU General Public | ||||
| Licenses are intended to guarantee your freedom to share and change | ||||
| free software--to make sure the software is free for all its users. | ||||
|  | ||||
|   This license, the Lesser General Public License, applies to some | ||||
| specially designated software packages--typically libraries--of the | ||||
| Free Software Foundation and other authors who decide to use it.  You | ||||
| can use it too, but we suggest you first think carefully about whether | ||||
| this license or the ordinary General Public License is the better | ||||
| strategy to use in any particular case, based on the explanations below. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom of use, | ||||
| not price.  Our General Public Licenses are designed to make sure that | ||||
| you have the freedom to distribute copies of free software (and charge | ||||
| for this service if you wish); that you receive source code or can get | ||||
| it if you want it; that you can change the software and use pieces of | ||||
| it in new free programs; and that you are informed that you can do | ||||
| these things. | ||||
|  | ||||
|   To protect your rights, we need to make restrictions that forbid | ||||
| distributors to deny you these rights or to ask you to surrender these | ||||
| rights.  These restrictions translate to certain responsibilities for | ||||
| you if you distribute copies of the library or if you modify it. | ||||
|  | ||||
|   For example, if you distribute copies of the library, whether gratis | ||||
| or for a fee, you must give the recipients all the rights that we gave | ||||
| you.  You must make sure that they, too, receive or can get the source | ||||
| code.  If you link other code with the library, you must provide | ||||
| complete object files to the recipients, so that they can relink them | ||||
| with the library after making changes to the library and recompiling | ||||
| it.  And you must show them these terms so they know their rights. | ||||
|  | ||||
|   We protect your rights with a two-step method: (1) we copyright the | ||||
| library, and (2) we offer you this license, which gives you legal | ||||
| permission to copy, distribute and/or modify the library. | ||||
|  | ||||
|   To protect each distributor, we want to make it very clear that | ||||
| there is no warranty for the free library.  Also, if the library is | ||||
| modified by someone else and passed on, the recipients should know | ||||
| that what they have is not the original version, so that the original | ||||
| author's reputation will not be affected by problems that might be | ||||
| introduced by others. | ||||
|  | ||||
|   Finally, software patents pose a constant threat to the existence of | ||||
| any free program.  We wish to make sure that a company cannot | ||||
| effectively restrict the users of a free program by obtaining a | ||||
| restrictive license from a patent holder.  Therefore, we insist that | ||||
| any patent license obtained for a version of the library must be | ||||
| consistent with the full freedom of use specified in this license. | ||||
|  | ||||
|   Most GNU software, including some libraries, is covered by the | ||||
| ordinary GNU General Public License.  This license, the GNU Lesser | ||||
| General Public License, applies to certain designated libraries, and | ||||
| is quite different from the ordinary General Public License.  We use | ||||
| this license for certain libraries in order to permit linking those | ||||
| libraries into non-free programs. | ||||
|  | ||||
|   When a program is linked with a library, whether statically or using | ||||
| a shared library, the combination of the two is legally speaking a | ||||
| combined work, a derivative of the original library.  The ordinary | ||||
| General Public License therefore permits such linking only if the | ||||
| entire combination fits its criteria of freedom.  The Lesser General | ||||
| Public License permits more lax criteria for linking other code with | ||||
| the library. | ||||
|  | ||||
|   We call this license the "Lesser" General Public License because it | ||||
| does Less to protect the user's freedom than the ordinary General | ||||
| Public License.  It also provides other free software developers Less | ||||
| of an advantage over competing non-free programs.  These disadvantages | ||||
| are the reason we use the ordinary General Public License for many | ||||
| libraries.  However, the Lesser license provides advantages in certain | ||||
| special circumstances. | ||||
|  | ||||
|   For example, on rare occasions, there may be a special need to | ||||
| encourage the widest possible use of a certain library, so that it becomes | ||||
| a de-facto standard.  To achieve this, non-free programs must be | ||||
| allowed to use the library.  A more frequent case is that a free | ||||
| library does the same job as widely used non-free libraries.  In this | ||||
| case, there is little to gain by limiting the free library to free | ||||
| software only, so we use the Lesser General Public License. | ||||
|  | ||||
|   In other cases, permission to use a particular library in non-free | ||||
| programs enables a greater number of people to use a large body of | ||||
| free software.  For example, permission to use the GNU C Library in | ||||
| non-free programs enables many more people to use the whole GNU | ||||
| operating system, as well as its variant, the GNU/Linux operating | ||||
| system. | ||||
|  | ||||
|   Although the Lesser General Public License is Less protective of the | ||||
| users' freedom, it does ensure that the user of a program that is | ||||
| linked with the Library has the freedom and the wherewithal to run | ||||
| that program using a modified version of the Library. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow.  Pay close attention to the difference between a | ||||
| "work based on the library" and a "work that uses the library".  The | ||||
| former contains code derived from the library, whereas the latter must | ||||
| be combined with the library in order to run. | ||||
|  | ||||
|                   GNU LESSER GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
|  | ||||
|   0. This License Agreement applies to any software library or other | ||||
| program which contains a notice placed by the copyright holder or | ||||
| other authorized party saying it may be distributed under the terms of | ||||
| this Lesser General Public License (also called "this License"). | ||||
| Each licensee is addressed as "you". | ||||
|  | ||||
|   A "library" means a collection of software functions and/or data | ||||
| prepared so as to be conveniently linked with application programs | ||||
| (which use some of those functions and data) to form executables. | ||||
|  | ||||
|   The "Library", below, refers to any such software library or work | ||||
| which has been distributed under these terms.  A "work based on the | ||||
| Library" means either the Library or any derivative work under | ||||
| copyright law: that is to say, a work containing the Library or a | ||||
| portion of it, either verbatim or with modifications and/or translated | ||||
| straightforwardly into another language.  (Hereinafter, translation is | ||||
| included without limitation in the term "modification".) | ||||
|  | ||||
|   "Source code" for a work means the preferred form of the work for | ||||
| making modifications to it.  For a library, complete source code means | ||||
| all the source code for all modules it contains, plus any associated | ||||
| interface definition files, plus the scripts used to control compilation | ||||
| and installation of the library. | ||||
|  | ||||
|   Activities other than copying, distribution and modification are not | ||||
| covered by this License; they are outside its scope.  The act of | ||||
| running a program using the Library is not restricted, and output from | ||||
| such a program is covered only if its contents constitute a work based | ||||
| on the Library (independent of the use of the Library in a tool for | ||||
| writing it).  Whether that is true depends on what the Library does | ||||
| and what the program that uses the Library does. | ||||
|    | ||||
|   1. You may copy and distribute verbatim copies of the Library's | ||||
| complete source code as you receive it, in any medium, provided that | ||||
| you conspicuously and appropriately publish on each copy an | ||||
| appropriate copyright notice and disclaimer of warranty; keep intact | ||||
| all the notices that refer to this License and to the absence of any | ||||
| warranty; and distribute a copy of this License along with the | ||||
| Library. | ||||
|  | ||||
|   You may charge a fee for the physical act of transferring a copy, | ||||
| and you may at your option offer warranty protection in exchange for a | ||||
| fee. | ||||
|  | ||||
|   2. You may modify your copy or copies of the Library or any portion | ||||
| of it, thus forming a work based on the Library, and copy and | ||||
| distribute such modifications or work under the terms of Section 1 | ||||
| above, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The modified work must itself be a software library. | ||||
|  | ||||
|     b) You must cause the files modified to carry prominent notices | ||||
|     stating that you changed the files and the date of any change. | ||||
|  | ||||
|     c) You must cause the whole of the work to be licensed at no | ||||
|     charge to all third parties under the terms of this License. | ||||
|  | ||||
|     d) If a facility in the modified Library refers to a function or a | ||||
|     table of data to be supplied by an application program that uses | ||||
|     the facility, other than as an argument passed when the facility | ||||
|     is invoked, then you must make a good faith effort to ensure that, | ||||
|     in the event an application does not supply such function or | ||||
|     table, the facility still operates, and performs whatever part of | ||||
|     its purpose remains meaningful. | ||||
|  | ||||
|     (For example, a function in a library to compute square roots has | ||||
|     a purpose that is entirely well-defined independent of the | ||||
|     application.  Therefore, Subsection 2d requires that any | ||||
|     application-supplied function or table used by this function must | ||||
|     be optional: if the application does not supply it, the square | ||||
|     root function must still compute square roots.) | ||||
|  | ||||
| These requirements apply to the modified work as a whole.  If | ||||
| identifiable sections of that work are not derived from the Library, | ||||
| and can be reasonably considered independent and separate works in | ||||
| themselves, then this License, and its terms, do not apply to those | ||||
| sections when you distribute them as separate works.  But when you | ||||
| distribute the same sections as part of a whole which is a work based | ||||
| on the Library, the distribution of the whole must be on the terms of | ||||
| this License, whose permissions for other licensees extend to the | ||||
| entire whole, and thus to each and every part regardless of who wrote | ||||
| it. | ||||
|  | ||||
| Thus, it is not the intent of this section to claim rights or contest | ||||
| your rights to work written entirely by you; rather, the intent is to | ||||
| exercise the right to control the distribution of derivative or | ||||
| collective works based on the Library. | ||||
|  | ||||
| In addition, mere aggregation of another work not based on the Library | ||||
| with the Library (or with a work based on the Library) on a volume of | ||||
| a storage or distribution medium does not bring the other work under | ||||
| the scope of this License. | ||||
|  | ||||
|   3. You may opt to apply the terms of the ordinary GNU General Public | ||||
| License instead of this License to a given copy of the Library.  To do | ||||
| this, you must alter all the notices that refer to this License, so | ||||
| that they refer to the ordinary GNU General Public License, version 2, | ||||
| instead of to this License.  (If a newer version than version 2 of the | ||||
| ordinary GNU General Public License has appeared, then you can specify | ||||
| that version instead if you wish.)  Do not make any other change in | ||||
| these notices. | ||||
|  | ||||
|   Once this change is made in a given copy, it is irreversible for | ||||
| that copy, so the ordinary GNU General Public License applies to all | ||||
| subsequent copies and derivative works made from that copy. | ||||
|  | ||||
|   This option is useful when you wish to copy part of the code of | ||||
| the Library into a program that is not a library. | ||||
|  | ||||
|   4. You may copy and distribute the Library (or a portion or | ||||
| derivative of it, under Section 2) in object code or executable form | ||||
| under the terms of Sections 1 and 2 above provided that you accompany | ||||
| it with the complete corresponding machine-readable source code, which | ||||
| must be distributed under the terms of Sections 1 and 2 above on a | ||||
| medium customarily used for software interchange. | ||||
|  | ||||
|   If distribution of object code is made by offering access to copy | ||||
| from a designated place, then offering equivalent access to copy the | ||||
| source code from the same place satisfies the requirement to | ||||
| distribute the source code, even though third parties are not | ||||
| compelled to copy the source along with the object code. | ||||
|  | ||||
|   5. A program that contains no derivative of any portion of the | ||||
| Library, but is designed to work with the Library by being compiled or | ||||
| linked with it, is called a "work that uses the Library".  Such a | ||||
| work, in isolation, is not a derivative work of the Library, and | ||||
| therefore falls outside the scope of this License. | ||||
|  | ||||
|   However, linking a "work that uses the Library" with the Library | ||||
| creates an executable that is a derivative of the Library (because it | ||||
| contains portions of the Library), rather than a "work that uses the | ||||
| library".  The executable is therefore covered by this License. | ||||
| Section 6 states terms for distribution of such executables. | ||||
|  | ||||
|   When a "work that uses the Library" uses material from a header file | ||||
| that is part of the Library, the object code for the work may be a | ||||
| derivative work of the Library even though the source code is not. | ||||
| Whether this is true is especially significant if the work can be | ||||
| linked without the Library, or if the work is itself a library.  The | ||||
| threshold for this to be true is not precisely defined by law. | ||||
|  | ||||
|   If such an object file uses only numerical parameters, data | ||||
| structure layouts and accessors, and small macros and small inline | ||||
| functions (ten lines or less in length), then the use of the object | ||||
| file is unrestricted, regardless of whether it is legally a derivative | ||||
| work.  (Executables containing this object code plus portions of the | ||||
| Library will still fall under Section 6.) | ||||
|  | ||||
|   Otherwise, if the work is a derivative of the Library, you may | ||||
| distribute the object code for the work under the terms of Section 6. | ||||
| Any executables containing that work also fall under Section 6, | ||||
| whether or not they are linked directly with the Library itself. | ||||
|  | ||||
|   6. As an exception to the Sections above, you may also combine or | ||||
| link a "work that uses the Library" with the Library to produce a | ||||
| work containing portions of the Library, and distribute that work | ||||
| under terms of your choice, provided that the terms permit | ||||
| modification of the work for the customer's own use and reverse | ||||
| engineering for debugging such modifications. | ||||
|  | ||||
|   You must give prominent notice with each copy of the work that the | ||||
| Library is used in it and that the Library and its use are covered by | ||||
| this License.  You must supply a copy of this License.  If the work | ||||
| during execution displays copyright notices, you must include the | ||||
| copyright notice for the Library among them, as well as a reference | ||||
| directing the user to the copy of this License.  Also, you must do one | ||||
| of these things: | ||||
|  | ||||
|     a) Accompany the work with the complete corresponding | ||||
|     machine-readable source code for the Library including whatever | ||||
|     changes were used in the work (which must be distributed under | ||||
|     Sections 1 and 2 above); and, if the work is an executable linked | ||||
|     with the Library, with the complete machine-readable "work that | ||||
|     uses the Library", as object code and/or source code, so that the | ||||
|     user can modify the Library and then relink to produce a modified | ||||
|     executable containing the modified Library.  (It is understood | ||||
|     that the user who changes the contents of definitions files in the | ||||
|     Library will not necessarily be able to recompile the application | ||||
|     to use the modified definitions.) | ||||
|  | ||||
|     b) Use a suitable shared library mechanism for linking with the | ||||
|     Library.  A suitable mechanism is one that (1) uses at run time a | ||||
|     copy of the library already present on the user's computer system, | ||||
|     rather than copying library functions into the executable, and (2) | ||||
|     will operate properly with a modified version of the library, if | ||||
|     the user installs one, as long as the modified version is | ||||
|     interface-compatible with the version that the work was made with. | ||||
|  | ||||
|     c) Accompany the work with a written offer, valid for at | ||||
|     least three years, to give the same user the materials | ||||
|     specified in Subsection 6a, above, for a charge no more | ||||
|     than the cost of performing this distribution. | ||||
|  | ||||
|     d) If distribution of the work is made by offering access to copy | ||||
|     from a designated place, offer equivalent access to copy the above | ||||
|     specified materials from the same place. | ||||
|  | ||||
|     e) Verify that the user has already received a copy of these | ||||
|     materials or that you have already sent this user a copy. | ||||
|  | ||||
|   For an executable, the required form of the "work that uses the | ||||
| Library" must include any data and utility programs needed for | ||||
| reproducing the executable from it.  However, as a special exception, | ||||
| the materials to be distributed need not include anything that is | ||||
| normally distributed (in either source or binary form) with the major | ||||
| components (compiler, kernel, and so on) of the operating system on | ||||
| which the executable runs, unless that component itself accompanies | ||||
| the executable. | ||||
|  | ||||
|   It may happen that this requirement contradicts the license | ||||
| restrictions of other proprietary libraries that do not normally | ||||
| accompany the operating system.  Such a contradiction means you cannot | ||||
| use both them and the Library together in an executable that you | ||||
| distribute. | ||||
|  | ||||
|   7. You may place library facilities that are a work based on the | ||||
| Library side-by-side in a single library together with other library | ||||
| facilities not covered by this License, and distribute such a combined | ||||
| library, provided that the separate distribution of the work based on | ||||
| the Library and of the other library facilities is otherwise | ||||
| permitted, and provided that you do these two things: | ||||
|  | ||||
|     a) Accompany the combined library with a copy of the same work | ||||
|     based on the Library, uncombined with any other library | ||||
|     facilities.  This must be distributed under the terms of the | ||||
|     Sections above. | ||||
|  | ||||
|     b) Give prominent notice with the combined library of the fact | ||||
|     that part of it is a work based on the Library, and explaining | ||||
|     where to find the accompanying uncombined form of the same work. | ||||
|  | ||||
|   8. You may not copy, modify, sublicense, link with, or distribute | ||||
| the Library except as expressly provided under this License.  Any | ||||
| attempt otherwise to copy, modify, sublicense, link with, or | ||||
| distribute the Library is void, and will automatically terminate your | ||||
| rights under this License.  However, parties who have received copies, | ||||
| or rights, from you under this License will not have their licenses | ||||
| terminated so long as such parties remain in full compliance. | ||||
|  | ||||
|   9. You are not required to accept this License, since you have not | ||||
| signed it.  However, nothing else grants you permission to modify or | ||||
| distribute the Library or its derivative works.  These actions are | ||||
| prohibited by law if you do not accept this License.  Therefore, by | ||||
| modifying or distributing the Library (or any work based on the | ||||
| Library), you indicate your acceptance of this License to do so, and | ||||
| all its terms and conditions for copying, distributing or modifying | ||||
| the Library or works based on it. | ||||
|  | ||||
|   10. Each time you redistribute the Library (or any work based on the | ||||
| Library), the recipient automatically receives a license from the | ||||
| original licensor to copy, distribute, link with or modify the Library | ||||
| subject to these terms and conditions.  You may not impose any further | ||||
| restrictions on the recipients' exercise of the rights granted herein. | ||||
| You are not responsible for enforcing compliance by third parties with | ||||
| this License. | ||||
|  | ||||
|   11. If, as a consequence of a court judgment or allegation of patent | ||||
| infringement or for any other reason (not limited to patent issues), | ||||
| conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot | ||||
| distribute so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you | ||||
| may not distribute the Library at all.  For example, if a patent | ||||
| license would not permit royalty-free redistribution of the Library by | ||||
| all those who receive copies directly or indirectly through you, then | ||||
| the only way you could satisfy both it and this License would be to | ||||
| refrain entirely from distribution of the Library. | ||||
|  | ||||
| If any portion of this section is held invalid or unenforceable under any | ||||
| particular circumstance, the balance of the section is intended to apply, | ||||
| and the section as a whole is intended to apply in other circumstances. | ||||
|  | ||||
| It is not the purpose of this section to induce you to infringe any | ||||
| patents or other property right claims or to contest validity of any | ||||
| such claims; this section has the sole purpose of protecting the | ||||
| integrity of the free software distribution system which is | ||||
| implemented by public license practices.  Many people have made | ||||
| generous contributions to the wide range of software distributed | ||||
| through that system in reliance on consistent application of that | ||||
| system; it is up to the author/donor to decide if he or she is willing | ||||
| to distribute software through any other system and a licensee cannot | ||||
| impose that choice. | ||||
|  | ||||
| This section is intended to make thoroughly clear what is believed to | ||||
| be a consequence of the rest of this License. | ||||
|  | ||||
|   12. If the distribution and/or use of the Library is restricted in | ||||
| certain countries either by patents or by copyrighted interfaces, the | ||||
| original copyright holder who places the Library under this License may add | ||||
| an explicit geographical distribution limitation excluding those countries, | ||||
| so that distribution is permitted only in or among countries not thus | ||||
| excluded.  In such case, this License incorporates the limitation as if | ||||
| written in the body of this License. | ||||
|  | ||||
|   13. The Free Software Foundation may publish revised and/or new | ||||
| versions of the Lesser General Public License from time to time. | ||||
| Such new versions will be similar in spirit to the present version, | ||||
| but may differ in detail to address new problems or concerns. | ||||
|  | ||||
| Each version is given a distinguishing version number.  If the Library | ||||
| specifies a version number of this License which applies to it and | ||||
| "any later version", you have the option of following the terms and | ||||
| conditions either of that version or of any later version published by | ||||
| the Free Software Foundation.  If the Library does not specify a | ||||
| license version number, you may choose any version ever published by | ||||
| the Free Software Foundation. | ||||
|  | ||||
|   14. If you wish to incorporate parts of the Library into other free | ||||
| programs whose distribution conditions are incompatible with these, | ||||
| write to the author to ask for permission.  For software which is | ||||
| copyrighted by the Free Software Foundation, write to the Free | ||||
| Software Foundation; we sometimes make exceptions for this.  Our | ||||
| decision will be guided by the two goals of preserving the free status | ||||
| of all derivatives of our free software and of promoting the sharing | ||||
| and reuse of software generally. | ||||
|  | ||||
|                             NO WARRANTY | ||||
|  | ||||
|   15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO | ||||
| WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. | ||||
| EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR | ||||
| OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY | ||||
| KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE | ||||
| LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME | ||||
| THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN | ||||
| WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY | ||||
| AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU | ||||
| FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR | ||||
| CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE | ||||
| LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING | ||||
| RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A | ||||
| FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF | ||||
| SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | ||||
| DAMAGES. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
							
								
								
									
										0
									
								
								CASA-auth-token/java/ChangeLog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								CASA-auth-token/java/ChangeLog
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										38
									
								
								CASA-auth-token/java/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								CASA-auth-token/java/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = server package | ||||
|  | ||||
| DIST_SUBDIRS = include server package | ||||
|  | ||||
| EXTRA_DIST = autogen.sh | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C package $@ | ||||
|  | ||||
| clean-local: | ||||
| 	if [ -d lib ]; then  rm -rf lib; fi | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
							
								
								
									
										0
									
								
								CASA-auth-token/java/NEWS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								CASA-auth-token/java/NEWS
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										90
									
								
								CASA-auth-token/java/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								CASA-auth-token/java/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  README for auth_token | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| INTRODUCTION | ||||
|  | ||||
| CASA-auth-token is an authentication token infrastructure with support for multiple | ||||
| authentication mechanisms with an emphasis on providing a scalable single | ||||
| sign-on solution. | ||||
|   | ||||
| A key feature of auth_token is that its authentication tokens contain identity | ||||
| information about the entity being authenticated. This information is made available | ||||
| to the consuming services. The amount of information contained in the tokens is | ||||
| configured on a per-service basis. Because of this feature, we say that CASA-auth-token | ||||
| projects an "Authenticated Identity". | ||||
|  | ||||
| ARCHITECTURE COMPONENTS | ||||
|  | ||||
| The infrastructure provided by auth_token consists of client and server components. | ||||
|  | ||||
| The client components of auth_token consists of a Client Engine, Get Authentication | ||||
| Token API, Authentication Token Cache, and Authentication Mechanism plug-ins. | ||||
|  | ||||
| The server components of auth_token consists of an Authentication Token Service, a | ||||
| Verify Authentication Token API, a JAAS module, a PAM module, and an Apache Authentication | ||||
| Provider module. The Authentication Token Service makes use of Authentication Mechanism | ||||
| plug-ins, an Identity Data Store Abstraction Layer, and of Identity Token Providers. | ||||
|  | ||||
| SECURITY FEATURES AND DATA FLOW | ||||
|  | ||||
| Communications between the Client Engine and the Authentication Token Service (ATS) | ||||
| occur over HTTPS. When a client desires to obtain an Authentication Token to access | ||||
| a particular service it contacts an ATS which then proceeds to inform the client about | ||||
| the Authentication Policy configured for the service. The policy contains information | ||||
| about authentication mechanisms supported as well as information about the types of | ||||
| credentials that the client can utilize to authenticate to the ATS. Once the client | ||||
| receives the Authentication Policy, it then decides what authentication mechanism to | ||||
| utilize to authenticate to the ATS based on the available authentication mechanisms | ||||
| plug-ins as well as the available credentials. During the authentication process, the | ||||
| ATS associates an identity with the entity being authenticated. The result of this | ||||
| resolution is saved in a Session Token which is then sent to the client where it is | ||||
| cached. Once the client is authenticated to the ATS, it then requests Authentication | ||||
| Tokens from it using the obtained Session Token. When an ATS receives a request for | ||||
| an Authentication Token, it then verifies the validity of the received Session Token | ||||
| and then it creates the appropriate Identity Token for the target service which it then | ||||
| embeds within the Authentication Token. The indentity information contained in the | ||||
| Identity Token as well as the type of Identity Token utilized depends on what is | ||||
| configured for the tatget service. | ||||
|  | ||||
| Session Tokens and Authentication Tokens are signed by the issuing ATS using Signing | ||||
| Certificates. Session Tokens and Authentication Tokens have a Lifetime Value associated | ||||
| with them. Token verification involves verifying the token signatures, verifying that | ||||
| the tokens where signed by a trusted entity, and verifying that the token lifetime has | ||||
| not been exceeeded. | ||||
|  | ||||
| The auth_token client/service protocol allows for the authentication of the client entity. | ||||
| auth_token relies in the server authentication mechanisms of SSL to verify the identity | ||||
| of the ATS. | ||||
|  | ||||
| IMPLEMENTATION STRATEGY AND CURRENT STATUS | ||||
|  | ||||
| auth_token is currently under development and is not ready to be used in production. | ||||
| The implementation strategy has been to first complete the framework with all of its | ||||
| modules, APIs, and packaging to allow application writters to start developing to it. | ||||
| Once this is done, then the implementation focus will switch to completing the plumbing. | ||||
|  | ||||
| As of this time, a lot of the framework has been completed and there are sample | ||||
| applications that can be utilized to exercise it. For a more complete picture of where | ||||
| we are, look at the various TODO lists present in the child folders. | ||||
|  | ||||
| The schedule for completing auth_token is agressive. | ||||
|  | ||||
| SECURITY CONSIDERATIONS | ||||
|  | ||||
| CASA Authentication Tokens when compromised can be used to either impersonate | ||||
| a user or to obtain identity information about the user. Because of this it is | ||||
| important that the tokens be secured by applications making use of them. It is | ||||
| recommended that the tokens be transmitted using SSL. | ||||
|   | ||||
|  | ||||
|  | ||||
|  | ||||
|                  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										17
									
								
								CASA-auth-token/java/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								CASA-auth-token/java/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  TODO for auth_token | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| INTRODUCTION | ||||
|  | ||||
| This file contains a list of the items still outstanding for auth_token. | ||||
|  | ||||
| Note: There are TODO lists under each auth_token component. This file just | ||||
| details outstanding items at the project level. | ||||
|  | ||||
| OUTSTANDING ITEMS | ||||
|  | ||||
| - Plug-in auth_token into the CASA make system. | ||||
|  | ||||
							
								
								
									
										130
									
								
								CASA-auth-token/java/autogen.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										130
									
								
								CASA-auth-token/java/autogen.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,130 @@ | ||||
| #!/bin/sh | ||||
| # Run this to generate all the initial makefiles, etc. | ||||
|  | ||||
| srcdir=`dirname $0` | ||||
| test -z "$srcdir" && srcdir=. | ||||
|  | ||||
| ORIGDIR=`pwd` | ||||
| cd $srcdir | ||||
| PROJECT=CASA | ||||
| TEST_TYPE=-f | ||||
| FILE=server/AuthTokenSvc/authtoken.settings | ||||
|  | ||||
| DIE=0 | ||||
|  | ||||
| (autoconf --version) < /dev/null > /dev/null 2>&1 || { | ||||
| 	echo | ||||
| 	echo "You must have autoconf installed to compile $PROJECT." | ||||
| 	echo "Download the appropriate package for your distribution," | ||||
| 	echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" | ||||
| 	DIE=1 | ||||
| } | ||||
|  | ||||
| AUTOMAKE=automake-1.9 | ||||
| ACLOCAL=aclocal-1.9 | ||||
|  | ||||
| ($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || { | ||||
|         AUTOMAKE=automake | ||||
|         ACLOCAL=aclocal | ||||
| } | ||||
|  | ||||
| ($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || { | ||||
| 	echo | ||||
| 	echo "You must have automake installed to compile $PROJECT." | ||||
| 	echo "Download the appropriate package for your distribution," | ||||
| 	echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" | ||||
| 	DIE=1 | ||||
| } | ||||
|  | ||||
| if test "$DIE" -eq 1; then | ||||
| 	exit 1 | ||||
| fi | ||||
|  | ||||
| test $TEST_TYPE $FILE || { | ||||
| 	echo "You must run this script in the top-level $PROJECT directory" | ||||
| 	exit 1 | ||||
| } | ||||
|  | ||||
| if test -z "$*"; then | ||||
| 	echo "I am going to run ./configure with no arguments - if you wish " | ||||
|         echo "to pass any to it, please specify them on the $0 command line." | ||||
| fi | ||||
|  | ||||
| case $CC in | ||||
| *xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;; | ||||
| esac | ||||
|  | ||||
| for coin in `find $srcdir -name configure.in -print` | ||||
| do | ||||
|   dr=`dirname $coin` | ||||
|   if test -f $dr/NO-AUTO-GEN; then | ||||
|     echo skipping $dr -- flagged as no auto-gen | ||||
|   else | ||||
|     echo processing $dr | ||||
|     macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` | ||||
|     ( cd $dr | ||||
|       aclocalinclude="$ACLOCAL_FLAGS" | ||||
|       for k in $macrodirs; do | ||||
|   	if test -d $k; then | ||||
|           aclocalinclude="$aclocalinclude -I $k" | ||||
|   	##else | ||||
| 	##  echo "**Warning**: No such directory \`$k'.  Ignored." | ||||
|         fi | ||||
|       done | ||||
|       if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then | ||||
| 	if grep "sed.*POTFILES" configure.in >/dev/null; then | ||||
| 	  : do nothing -- we still have an old unmodified configure.in | ||||
| 	else | ||||
| 	  echo "Creating $dr/aclocal.m4 ..." | ||||
| 	  test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 | ||||
| 	  echo "Running gettextize...  Ignore non-fatal messages." | ||||
| 	  echo "no" | gettextize --force --copy | ||||
| 	  echo "Making $dr/aclocal.m4 writable ..." | ||||
| 	  test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 | ||||
|         fi | ||||
|       fi | ||||
|       if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then | ||||
| 	echo "Creating $dr/aclocal.m4 ..." | ||||
| 	test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 | ||||
| 	echo "Running gettextize...  Ignore non-fatal messages." | ||||
| 	echo "no" | gettextize --force --copy | ||||
| 	echo "Making $dr/aclocal.m4 writable ..." | ||||
| 	test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 | ||||
|       fi | ||||
|       if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then | ||||
| 	echo "Creating $dr/aclocal.m4 ..." | ||||
| 	test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 | ||||
| 	echo "Running gettextize...  Ignore non-fatal messages." | ||||
| 	echo "no" | glib-gettextize --force --copy | ||||
| 	echo "Making $dr/aclocal.m4 writable ..." | ||||
| 	test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 | ||||
|       fi | ||||
|       if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then | ||||
| 	echo "Running libtoolize..." | ||||
| 	libtoolize --force --copy | ||||
|       fi | ||||
|       echo "Running $ACLOCAL $aclocalinclude ..." | ||||
|       $ACLOCAL $aclocalinclude | ||||
|       if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then | ||||
| 	echo "Running autoheader..." | ||||
| 	autoheader | ||||
|       fi | ||||
|       echo "Running $AUTOMAKE --gnu $am_opt ..." | ||||
|       $AUTOMAKE --add-missing --gnu $am_opt | ||||
|       echo "Running autoconf ..." | ||||
|       autoconf | ||||
|     ) | ||||
|   fi | ||||
| done | ||||
|  | ||||
| conf_flags="--config-cache --enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c | ||||
|  | ||||
| cd "$ORIGDIR" | ||||
|  | ||||
| if test x$NOCONFIGURE = x; then | ||||
|   echo Running $srcdir/configure $conf_flags "$@" ... | ||||
|   $srcdir/configure $conf_flags "$@" \ | ||||
|   && echo Now type \`make\' to compile $PROJECT  || exit 1 | ||||
| else | ||||
|   echo Skipping configure process. | ||||
| fi | ||||
							
								
								
									
										291
									
								
								CASA-auth-token/java/configure.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										291
									
								
								CASA-auth-token/java/configure.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,291 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| AC_INIT(autogen.sh) | ||||
| AC_CANONICAL_SYSTEM | ||||
| AM_INIT_AUTOMAKE(CASA_auth_token, 0.1.1) | ||||
| RELEASE=`date +%Y%m%d_%H%M` | ||||
| AC_SUBST(RELEASE) | ||||
| AM_MAINTAINER_MODE | ||||
|  | ||||
| # | ||||
| # Check for a valid C# compiler | ||||
| # | ||||
| #AC_CHECK_PROG(CSC, csc, csc) | ||||
| #test -z "$CSC" && AC_CHECK_PROG(CSC, mcs, mcs) | ||||
| #test -z "$CSC" && AC_MSG_ERROR([no acceptable C Sharp compiler found in \$PATH]) | ||||
|  | ||||
| # | ||||
| # Check for valid C# compiler in linux | ||||
| # | ||||
| case $host_os in | ||||
|     cygwin*) | ||||
|     ;; | ||||
|     *) | ||||
|         AC_CHECK_PROG(CSC, csc, csc) | ||||
| 	test -z "$CSC" && AC_CHECK_PROG(CSC, mcs, mcs) | ||||
| 	test -z "$CSC" && AC_MSG_ERROR([no acceptable C Sharp compiler found in \$PATH]) | ||||
|  | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| case $CSC in | ||||
|     # | ||||
|     # Mono-specific configuration | ||||
|     # | ||||
|     mcs) | ||||
|         CSC_EXEFLAG=/target:exe | ||||
|         CSC_LIBFLAG=/target:library | ||||
|         CSC_EXEFLAG=/target:exe | ||||
|         CSC_WINEXEFLAG=/target:winexe | ||||
|         CSCFLAGS='/d:MONO /warn:4 /d:TRACE -d:LINUX' | ||||
|         CSCFLAGS_DEBUG="/debug+ /d:DEBUG" | ||||
|         CSCFLAGS_OPTIMIZE="/optimize+" | ||||
|         MONO=mono | ||||
|         MONO_DEBUG='mono --debug' | ||||
|         MONO_PATH= | ||||
|         SYSTEM_XML='System.Xml.dll' | ||||
|     ;; | ||||
|     # | ||||
|     # .NET-specific configuration | ||||
|     # | ||||
|     csc) | ||||
|         CSC_EXEFLAG=/target:exe | ||||
|         CSC_LIBFLAG=/target:library | ||||
|         CSC_EXEFLAG=/target:exe | ||||
|         CSC_WINEXEFLAG=/target:winexe | ||||
|         CSCFLAGS='/d:DOTNET /warn:4 /d:TRACE /nologo' | ||||
|         CSCFLAGS_DEBUG="/debug+ /d:DEBUG" | ||||
|         CSCFLAGS_OPTIMIZE="/optimize+" | ||||
|         MONO= | ||||
|         MONO_DEBUG= | ||||
|         MONO_PATH= | ||||
|         SYSTEM_XML='System.XML.dll' | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| AC_SUBST(CSC) | ||||
| AC_SUBST(CSC_EXEFLAG) | ||||
| AC_SUBST(CSC_LIBFLAG) | ||||
| AC_SUBST(CSC_WINEXEFLAG) | ||||
| AC_SUBST(CSCFLAGS) | ||||
| AC_SUBST(CSCFLAGS_DEBUG) | ||||
| AC_SUBST(MONO) | ||||
| AC_SUBST(MONO_PATH) | ||||
| AC_SUBST(SYSTEM_XML) | ||||
|  | ||||
| SRCDIR='$(top_srcdir)' | ||||
| DOCDIR="$SRCDIR/doc" | ||||
| TOOLDIR='$(top_srcdir)/tools' | ||||
| AC_SUBST(SRCDIR) | ||||
| AC_SUBST(DOCDIR) | ||||
| AC_SUBST(TOOLDIR) | ||||
| EMPTY= | ||||
| SPACE='$(EMPTY) $(EMPTY)' | ||||
|  | ||||
| AC_SUBST(EMPTY) | ||||
| AC_SUBST(SPACE) | ||||
|  | ||||
| # | ||||
| # Check for operating system and set TARGET_OS  | ||||
| # | ||||
| case $host_os in | ||||
|     cygwin*) | ||||
|         TARGET_OS='windows' | ||||
|     ;; | ||||
|     *) | ||||
| 	TARGET_OS='linux' | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| AC_SUBST(TARGET_OS) | ||||
| AM_CONDITIONAL(LINUX, test "$TARGET_OS" = "linux") | ||||
| AM_CONDITIONAL(WINDOWS, test "$TARGET_OS" = "windows") | ||||
|  | ||||
| # | ||||
| # Check for architecture and set TARGET_ARCH | ||||
| # ia64 needs to be treated as non64. | ||||
|  | ||||
| case $target_cpu in | ||||
|     x86_64|p*pc64|s390x) | ||||
|         LIB=lib64 | ||||
|     ;; | ||||
|     *ia64|*) | ||||
|         LIB=lib | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| AC_SUBST(LIB) | ||||
| AM_CONDITIONAL(LIB64, test "$LIB" = lib64) | ||||
|  | ||||
| # | ||||
| # | ||||
| # Set platform-specific variables | ||||
| # | ||||
| case $TARGET_OS in | ||||
|     # | ||||
|     # Linux-specific configuration | ||||
|     # | ||||
|     linux) | ||||
|         # | ||||
|         # Set variables | ||||
|         # | ||||
|         COMMON_CLEAN_FILES='' | ||||
|         ICON_EXT='.ico' | ||||
|         ICON_FLAG='/resource:' | ||||
|         PLATFORM_SUBDIRS=$LINUX_SUBDIRS | ||||
|         SEP='/' | ||||
| 	LINK=gcc | ||||
|     ;; | ||||
|     # | ||||
|     # Windows-specific configuration | ||||
|     # | ||||
|     windows) | ||||
|         COMMON_CLEAN_FILES='*.suo */*.suo *.csproj.user */*.csproj.user bin obj */bin */obj *.xml */*.xml *.pdb */*.pdb' | ||||
|         ICON_EXT='.ico' | ||||
|         ICON_FLAG='/win32icon:' | ||||
|         PLATFORM_SUBDIRS=$WINDOWS_SUBDIRS | ||||
|         SEP='$(EMPTY)\\$(EMPTY)' | ||||
| 	LINK=link.exe | ||||
|     ;; | ||||
| esac | ||||
| AC_SUBST(COMMON_CLEAN_FILES) | ||||
| AC_SUBST(ICON_EXT) | ||||
| AC_SUBST(ICON_FLAG) | ||||
| AC_SUBST(PLATFORM_SUBDIRS) | ||||
| AC_SUBST(SEP) | ||||
| AC_SUBST(LINK) | ||||
|  | ||||
| # | ||||
| # Run standard macros | ||||
| # | ||||
| AM_PROG_CC_STDC | ||||
| AC_PROG_INSTALL | ||||
| AC_HEADER_STDC | ||||
|  | ||||
| ####### | ||||
| # | ||||
| # set CFLAGS | ||||
| # | ||||
| case $host_os in | ||||
|    linux*) | ||||
|     CFLAGS="$CFLAGS" | ||||
|    ;; | ||||
|    cygwin*) | ||||
|    CC=cl.exe | ||||
|    CFLAGS="-D WIN32 -D SSCS_WIN32_PLAT_F -D N_PLAT_CLIENT -MT -Ox" | ||||
|    ;; | ||||
| esac | ||||
|  | ||||
| # | ||||
| # Handle --enable-debug | ||||
| # | ||||
| AC_ARG_ENABLE(debug, [ | ||||
|   --enable-debug          configure the Makefiles to build in DEBUG mode], | ||||
|     [case "${enableval}" in | ||||
|         yes) enable_debug=true ;; | ||||
|         no)  enable_debug=false ;; | ||||
|         *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; | ||||
|     esac],[enable_debug=false]) | ||||
| AM_CONDITIONAL(DEBUG, test x$enable_debug = xtrue) | ||||
| if test "$enable_debug" = "true" | ||||
| then | ||||
|   # Build debug version. | ||||
|  # CFLAGS="$CFLAGS_DEBUG $CFLAGS -DDBG -DDEBUG" | ||||
|   CFLAGS="$CFLAGS_DEBUG $CFLAGS -g -DDBG -DDEBUG \ | ||||
| -fPIC -DPIC -DSSCS_LINUX_PLAT_F -O2 -fmessage-length=0 -Wall \ | ||||
| -D_REENTRANT -DALIGNMENT -DN_PLAT_UNIX \ | ||||
| -DUNIX -DLINUX -DIAPX38" | ||||
|   CSCFLAGS="$CSCFLAGS_DEBUG $CSCFLAGS" | ||||
|   CXXFLAGS="$CXXFLAGS_DEBUG $CXXFLAGS" | ||||
|   DEVENV_CONFIGURATION=Debug | ||||
|   MONO=$MONO_DEBUG | ||||
| else | ||||
|   # Build optimized version. | ||||
|   CFLAGS="$CFLAGS_OPTIMIZE $CFLAGS -g -fPIC -DPIC \ | ||||
| -DSSCS_LINUX_PLAT_F -O2 -fmessage-length=0 -Wall \ | ||||
| -D_REENTRANT -DALIGNMENT -DN_PLAT_UNIX \ | ||||
| -DUNIX -DLINUX -DIAPX38" | ||||
|   CSCFLAGS="$CSCFLAGS_OPTIMIZE $CSCFLAGS" | ||||
|   CXXFLAGS="$CXXFLAGS_OPTIMIZE $CXXFLAGS" | ||||
|   DEVENV_CONFIGURATION=Release | ||||
| fi | ||||
| AC_SUBST(CSCFLAGS) | ||||
| AC_SUBST(DEVENV_CONFIGURATION) | ||||
|  | ||||
| ##comment out due to build failure | ||||
| # Check for GCC version to add fstack-protector flag | ||||
| # | ||||
| #GCC_VER="`gcc -dumpversion`" | ||||
| #case "$GCC_VER" in | ||||
| #        3*) | ||||
| #	;; | ||||
| #        4*) | ||||
| #        CFLAGS="$CFLAGS -fstack-protector" | ||||
| #	;; | ||||
| #        *) | ||||
| #        ;; | ||||
| #esac | ||||
|                                                                                                                | ||||
| AC_SUBST(GCC_VER) | ||||
|  | ||||
| # | ||||
| # Configure PKG_CONFIG | ||||
| # | ||||
| AC_PATH_PROG(PKG_CONFIG, pkg-config, no) | ||||
| if test "x$PKG_CONFIG" = "xno"; then | ||||
| 	AC_MSG_ERROR([You need to install pkg-config]) | ||||
| fi | ||||
|  | ||||
| # | ||||
| # Configure files | ||||
| # | ||||
| AC_OUTPUT([ | ||||
| Makefile | ||||
| package/Makefile | ||||
| package/linux/Makefile | ||||
| package/linux/CASA-auth-token-service.spec | ||||
| include/Makefile | ||||
| server/Makefile | ||||
| server/AuthTokenValidate/Makefile | ||||
| server/AuthTokenValidate/linux/Makefile | ||||
| server/AuthTokenValidate/idenTokenProviders/Makefile | ||||
| server/AuthTokenValidate/idenTokenProviders/casa/Makefile | ||||
| server/AuthTokenValidate/idenTokenProviders/casa/linux/Makefile | ||||
| server/PamSupport/Makefile | ||||
| server/PamSupport/linux/Makefile | ||||
| server/ApacheSupport/Makefile | ||||
| server/ApacheSupport/2.2/Makefile | ||||
| server/ApacheSupport/2.2/linux/Makefile | ||||
| server/AuthTokenSvc/Makefile | ||||
| server/AuthTokenSvc/src/Makefile | ||||
| server/AuthTokenSvc/src/com/Makefile | ||||
| server/AuthTokenSvc/src/com/novell/Makefile | ||||
| server/AuthTokenSvc/src/com/novell/casa/Makefile | ||||
| server/AuthTokenSvc/src/com/novell/casa/authtoksvc/Makefile | ||||
| server/JaasSupport/Makefile | ||||
| server/JaasSupport/src/Makefile | ||||
| server/JaasSupport/src/com/Makefile | ||||
| server/JaasSupport/src/com/novell/Makefile | ||||
| server/JaasSupport/src/com/novell/casa/Makefile | ||||
| server/JaasSupport/src/com/novell/casa/jaas/Makefile | ||||
| ]) | ||||
|  | ||||
							
								
								
									
										38
									
								
								CASA-auth-token/java/package/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								CASA-auth-token/java/package/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = linux | ||||
|  | ||||
| DIST_SUBDIRS = linux | ||||
|  | ||||
| EXTRA_DIST = | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| clean-local: | ||||
| 	if [ -d lib ]; then  rm -rf lib; fi | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,312 @@ | ||||
| # | ||||
| # spec file for the CASA-auth-token packages. | ||||
| # | ||||
| # Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany. | ||||
| # This file and all modifications and additions to the pristine | ||||
| # package are under the same license as the package itself. | ||||
| # | ||||
| # Please submit bugfixes or comments via http://bugs.opensuse.org | ||||
| # | ||||
|  | ||||
| # norootforbuild | ||||
|  | ||||
| # For debug build, please replace Release to Debug and set debug_opt to --enable-debug | ||||
| %define cfg Release | ||||
| %define debug_opt "" | ||||
|                                                                                                                             | ||||
|  | ||||
| Name:          @PACKAGE@  | ||||
| URL:           http://www.novell.com/products | ||||
| BuildRequires: libstdc++ libgcc gcc-c++ glib2-devel krb5-devel libgssapi libstdc++-devel pam-devel pkgconfig java-1_5_0-ibm-devel apache2-devel update-alternatives mono-devel CASA-devel servletapi5 identity-abstraction | ||||
| %define prefix /usr | ||||
| %define jprefix /usr/share/java | ||||
| License:       LGPL | ||||
| Group:         Applications/System | ||||
| Autoreqprov:   on | ||||
| %define	       bldno	1.0.0 | ||||
| Version:       @VERSION@  | ||||
| Release:       0 | ||||
| Summary:       Novell Common Authentication Services Adapter Authentication Token Infrastructure (CASA-auth-token) | ||||
| Source:        %{name}-%{version}.tar.bz2 | ||||
| BuildRoot:     %{_tmppath}/%{name}-%{version}-build | ||||
| Requires:      java-1_5_0-ibm servletapi5 tomcat5 | ||||
| PreReq:        %fillup_prereq %insserv_prereq | ||||
|  | ||||
| %description | ||||
| CASA-auth-token is an authentication token infrastructure with support for multiple | ||||
| authentication mechanisms with an emphasis on providing a scalable single | ||||
| sign-on solution. | ||||
|   | ||||
| A key feature of CASA-auth-token is that its authentication tokens contain identity | ||||
| information about the entity being authenticated. This information is made available | ||||
| to the consuming services. The amount of information contained in the tokens is | ||||
| configured on a per-service basis. Because of this feature, we say that CASA-auth-token | ||||
| projects an "Authenticated Identity". | ||||
|  | ||||
| The CASA-auth-token-service is the infrastructure component responsible for authenticating | ||||
| entities using the native authentication mechanism and for issuing tokens that can later | ||||
| be used by applications to authenticate the entity o services that are CASA authentication | ||||
| enabled. | ||||
|  | ||||
| %package -n CASA-auth-token-server-support | ||||
| Summary:      Libraries needed for "C" applications development. | ||||
| Group:        Applications/System | ||||
| Requires:     CASA-devel | ||||
|  | ||||
| %description -n CASA-auth-token-server-support | ||||
| This package contains the CASA (Common Authentication Services Adapter) | ||||
| authentication token infrastructure lower level libraries for token | ||||
| verification from native code ("C"). It is recomended that this library | ||||
| not be invoked directly by applications, instead it is recomended that | ||||
| appplication invoke its services through the support modules provided to | ||||
| integrate with PAM or the Apache Web Server. | ||||
|   | ||||
| %package -n CASA-auth-token-pam-support | ||||
| Summary:      Libraries needed for PAM applications development. | ||||
| Group:        Applications/System | ||||
| Requires:     CASA-auth-token-server-support pam | ||||
|  | ||||
| %description -n CASA-auth-token-pam-support | ||||
| This package contains the CASA (Common Authentication Services Adapter) | ||||
| authentication token infrastructure PAM module for token verification. | ||||
|   | ||||
| %package -n CASA-auth-token-apache2_2-support | ||||
| Summary:      Libraries needed for Apache 2.2 applications development. | ||||
| Group:        Applications/System | ||||
| Requires:     apache2 CASA-auth-token-server-support | ||||
|  | ||||
| %description -n CASA-auth-token-apache2_2-support | ||||
| This package contains the CASA (Common Authentication Services Adapter) | ||||
| authentication token infrastructure Apache v2.2 authentication provider | ||||
| module for token verification. The module expects that users authenticate | ||||
| utilizing the HTTP Basic authentication scheme and that the password utilized consist | ||||
| of a CASA authentication token. Information about the authenticated identity is | ||||
| made available to other Apache modules via the Apache request environment variable. | ||||
|  | ||||
| %package -n CASA-auth-token-jaas-support | ||||
| Summary:      Libraries needed for JAAS applications development. | ||||
| Group:        Applications/System | ||||
| Requires:     java-1_5_0-ibm | ||||
|  | ||||
| %description -n CASA-auth-token-jaas-support | ||||
| This package contains the CASA (Common Authentication Services Adapter) | ||||
| authentication token infrastructure JAAS module and supporting libraries | ||||
| for token verification. | ||||
|  | ||||
| %package -n CASA-auth-token-devel | ||||
| Summary:      Include files needed for applications development. | ||||
| Group:        Applications/System | ||||
| Requires:     CASA-devel CASA-auth-token-server-support CASA-auth-token-jaas-support CASA-auth-token-pam-support CASA-auth-token-apache2_2-support CASA-auth-token-service | ||||
|  | ||||
| %description -n CASA-auth-token-devel | ||||
| This package contains the files necessary for the development of client and | ||||
| server applications that utilize the CASA (Common Authentication Service Adapter) | ||||
| authentication token infrastructure for authentication. | ||||
|  | ||||
|   | ||||
| %prep | ||||
| %setup -q | ||||
| #%patch | ||||
| %if %{_lib} == "lib64" | ||||
| %define binsource bin64 | ||||
| %else | ||||
| %define binsource bin | ||||
| %endif | ||||
|  | ||||
| %build | ||||
| export PATH=.:$PATH:/usr/%_lib/qt3/bin | ||||
| %if %suse_version > 1000 | ||||
| export CFLAGS="$CFLAGS $RPM_OPT_FLAGS -fstack-protector" | ||||
| %endif  | ||||
|  | ||||
| ./autogen.sh  | ||||
| make | ||||
|  | ||||
|  | ||||
| %install | ||||
|  | ||||
| ## Prime the file system ## | ||||
| install -d %{buildroot}%{prefix} | ||||
| install -d %{buildroot}%{prefix}/%{_lib} | ||||
| install -d %{buildroot}%{prefix}/%{_lib}/security | ||||
| install -d %{buildroot}%{prefix}/include | ||||
| install -d %{buildroot}%{prefix}/share | ||||
| install -d %{buildroot}%{prefix}/share/java | ||||
|  | ||||
| ## CASA-auth-token-service ## | ||||
| # Libs | ||||
| install -m 755 %{_lib}/java/CasaAuthTokenSvc.war %{buildroot}%{prefix}/share/java/CasaAuthTokenSvc.war.%{bldno} | ||||
|  | ||||
| # Lib Symbolic Links | ||||
| ln -sf CasaAuthTokenSvc.war.%{bldno} %{buildroot}%{prefix}/share/java/CasaAuthTokenSvc.war | ||||
| ln -sf CasaAuthTokenSvc.war.%{bldno} %{buildroot}%{prefix}/share/java/CasaAuthTokenSvc.war.1 | ||||
|  | ||||
| ## CASA-auth-token-server-support ## | ||||
| # Libs | ||||
| install -m 755 %{_lib}/%{cfg}/libcasa_s_authtoken.so %{buildroot}%{prefix}/%{_lib}/libcasa_s_authtoken.so.%{bldno} | ||||
|  | ||||
| # Lib Symbolic Links | ||||
| ln -sf libcasa_s_authtoken.so.%{bldno} %{buildroot}%{prefix}/%{_lib}/libcasa_s_authtoken.so | ||||
| ln -sf libcasa_s_authtoken.so.%{bldno} %{buildroot}%{prefix}/%{_lib}/libcasa_s_authtoken.so.1 | ||||
|  | ||||
| ## CASA-auth-token-pam-support ## | ||||
| # Libs | ||||
| install -m 755 %{_lib}/%{cfg}/pam_casaauthtok.so %{buildroot}%{prefix}/%{_lib}/security/pam_casaauthtok.so.%{bldno} | ||||
| #install -m 755 %{_lib}/%{cfg}/pam_casaauthtok.so %{buildroot}%{prefix}/%{_lib}/security/pam_casaauthtok.so | ||||
|  | ||||
| # Lib Symbolic Links | ||||
| ln -sf pam_casaauthtok.so.%{bldno} %{buildroot}%{prefix}/%{_lib}/security/pam_casaauthtok.so | ||||
| ln -sf pam_casaauthtok.so.%{bldno} %{buildroot}%{prefix}/%{_lib}/security/pam_casaauthtok.so.1 | ||||
|  | ||||
| ## CASA-auth-token-apache2_2-support ## | ||||
| # Libs | ||||
| install -m 755 %{_lib}/%{cfg}/mod_authn_casa.so %{buildroot}%{prefix}/%{_lib}/mod_authn_casa.so.%{bldno} | ||||
|  | ||||
| # Lib Symbolic Links | ||||
| ln -sf mod_authn_casa.so.%{bldno} %{buildroot}%{prefix}/%{_lib}/mod_authn_casa.so | ||||
| ln -sf mod_authn_casa.so.%{bldno} %{buildroot}%{prefix}/%{_lib}/mod_authn_casa.so.1 | ||||
|  | ||||
| ## CASA-auth-token-jaas-support ## | ||||
| # Libs | ||||
| install -m 755 %{_lib}/java/CasaJaasSupport.jar %{buildroot}%{prefix}/share/java/CasaJaasSupport.jar.%{bldno} | ||||
| install -m 755 %{_lib}/java/CasaAuthToken.jar %{buildroot}%{prefix}/share/java/CasaAuthToken.jar.%{bldno} | ||||
|  | ||||
| # Lib Symbolic Links | ||||
| ln -sf CasaJaasSupport.jar.%{bldno} %{buildroot}%{prefix}/share/java/CasaJaasSupport.jar | ||||
| ln -sf CasaJaasSupport.jar.%{bldno} %{buildroot}%{prefix}/share/java/CasaJaasSupport.jar.1 | ||||
| ln -sf CasaAuthToken.jar.%{bldno} %{buildroot}%{prefix}/share/java/CasaAuthToken.jar | ||||
| ln -sf CasaAuthToken.jar.%{bldno} %{buildroot}%{prefix}/share/java/CasaAuthToken.jar.1 | ||||
|  | ||||
| ## CASA-auth-token-devel ## | ||||
| # Header Files | ||||
| install -m 644 include/casa_c_authtoken.h %{buildroot}%{prefix}/include | ||||
| install -m 644 include/casa_s_authtoken.h %{buildroot}%{prefix}/include | ||||
|  | ||||
|  | ||||
| %clean | ||||
| rm -rf $RPM_BUILD_ROOT | ||||
|  | ||||
|  | ||||
| ## CASA-auth-token-service ## | ||||
| %pre | ||||
| # Nothing to do in this pre script | ||||
|  | ||||
| %post | ||||
| /sbin/ldconfig | ||||
|  | ||||
| %preun | ||||
| # Nothing to do in this preun script | ||||
|  | ||||
| %postun | ||||
| # Nothing to do in this postun script | ||||
|  | ||||
| %files | ||||
| %defattr(-,root,root) | ||||
| %{prefix}/share/java/CasaAuthTokenSvc.war.%{bldno} | ||||
| %{prefix}/share/java/CasaAuthTokenSvc.war | ||||
| %{prefix}/share/java/CasaAuthTokenSvc.war.1 | ||||
|  | ||||
|  | ||||
| ## CASA-auth-token-server-support ## | ||||
| %pre -n CASA-auth-token-server-support | ||||
| # Nothing to do in this pre script | ||||
|  | ||||
| %post -n CASA-auth-token-server-support | ||||
| /sbin/ldconfig | ||||
|  | ||||
| %preun -n CASA-auth-token-server-support | ||||
| # Nothing to do in this preun script | ||||
|  | ||||
| %postun -n CASA-auth-token-server-support | ||||
| # Nothing to do in this postun script | ||||
|  | ||||
| %files -n CASA-auth-token-server-support | ||||
| %defattr(-,root,root) | ||||
| %{prefix}/%{_lib}/libcasa_s_authtoken.so.%{bldno} | ||||
| %{prefix}/%{_lib}/libcasa_s_authtoken.so | ||||
| %{prefix}/%{_lib}/libcasa_s_authtoken.so.1 | ||||
|  | ||||
|  | ||||
| ## CASA-auth-token-pam-support ## | ||||
| %pre -n CASA-auth-token-pam-support | ||||
| # Nothing to do in this pre script | ||||
|  | ||||
| %post -n CASA-auth-token-pam-support | ||||
| /sbin/ldconfig | ||||
|  | ||||
| %preun -n CASA-auth-token-pam-support | ||||
| # Nothing to do in this preun script | ||||
|  | ||||
| %postun -n CASA-auth-token-pam-support | ||||
| # Nothing to do in this postun script | ||||
|  | ||||
| %files -n CASA-auth-token-pam-support | ||||
| %defattr(-,root,root) | ||||
| %dir %{prefix}/%{_lib}/security | ||||
| %{prefix}/%{_lib}/security/pam_casaauthtok.so.%{bldno} | ||||
| %{prefix}/%{_lib}/security/pam_casaauthtok.so | ||||
| %{prefix}/%{_lib}/security/pam_casaauthtok.so.1 | ||||
|  | ||||
|  | ||||
| ## CASA-auth-token-apache2_2-support ## | ||||
| %pre -n CASA-auth-token-apache2_2-support | ||||
| # Nothing to do in this pre script | ||||
|  | ||||
| %post -n CASA-auth-token-apache2_2-support | ||||
| /sbin/ldconfig | ||||
|  | ||||
| %preun -n CASA-auth-token-apache2_2-support | ||||
| # Nothing to do in this preun script | ||||
|  | ||||
| %postun -n CASA-auth-token-apache2_2-support | ||||
| # Nothing to do in this postun script | ||||
|  | ||||
| %files -n CASA-auth-token-apache2_2-support | ||||
| %defattr(-,root,root) | ||||
| %{prefix}/%{_lib}/mod_authn_casa.so.%{bldno} | ||||
| %{prefix}/%{_lib}/mod_authn_casa.so | ||||
| %{prefix}/%{_lib}/mod_authn_casa.so.1 | ||||
|  | ||||
|  | ||||
| ## CASA-auth-token-jaas-support ## | ||||
| %pre -n CASA-auth-token-jaas-support | ||||
| # Nothing to do in this pre script | ||||
|  | ||||
| %post -n CASA-auth-token-jaas-support | ||||
| /sbin/ldconfig | ||||
|  | ||||
| %preun -n CASA-auth-token-jaas-support | ||||
| # Nothing to do in this preun script | ||||
|  | ||||
| %postun -n CASA-auth-token-jaas-support | ||||
| # Nothing to do in this postun script | ||||
|  | ||||
| %files -n CASA-auth-token-jaas-support | ||||
| %defattr(-,root,root) | ||||
| %{prefix}/share/java/CasaJaasSupport.jar.%{bldno} | ||||
| %{prefix}/share/java/CasaJaasSupport.jar | ||||
| %{prefix}/share/java/CasaJaasSupport.jar.1 | ||||
| %{prefix}/share/java/CasaAuthToken.jar.%{bldno} | ||||
| %{prefix}/share/java/CasaAuthToken.jar | ||||
| %{prefix}/share/java/CasaAuthToken.jar.1 | ||||
|  | ||||
|  | ||||
| ## CASA-auth-token-devel ## | ||||
| %pre -n CASA-auth-token-devel | ||||
| # Nothing to do in this pre script | ||||
|  | ||||
| %post -n CASA-auth-token-devel | ||||
| # Nothing to do in this post script | ||||
|  | ||||
| %preun -n CASA-auth-token-devel | ||||
| # Nothing to do in this preun script | ||||
|  | ||||
| %postun -n CASA-auth-token-devel | ||||
| # Nothing to do in this postun script | ||||
|  | ||||
| %files -n CASA-auth-token-devel | ||||
| %defattr(-,root,root) | ||||
| %{prefix}/include/casa_c_authtoken.h | ||||
| %{prefix}/include/casa_s_authtoken.h | ||||
|  | ||||
| %changelog -n CASA-auth-token | ||||
							
								
								
									
										67
									
								
								CASA-auth-token/java/package/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								CASA-auth-token/java/package/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| # | ||||
| ####################################################################### | ||||
| #how do you get the version?? | ||||
| RPM_FILE = $(PACKAGE)-$(VERSION)-$(RELEASE).$(target_cpu).rpm | ||||
| #SRPM_FILE = $(PACKAGE)-$(VERSION)-$(RELEASE).src.rpm | ||||
| SRPM_FILE = $(PACKAGE)-$(VERSION)*.src.rpm | ||||
|  | ||||
| SPEC_FILE = CASA-auth-token-service.spec | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall casa | ||||
|  | ||||
| #all: $(RPM_FILE) | ||||
|  | ||||
| package: $(RPM_FILE) | ||||
|  | ||||
| all clean: | ||||
|  | ||||
| $(RPM_FILE): | ||||
| 	cd $(top_srcdir); make dist-bzip2 | ||||
| 	rm -rf RPM | ||||
| 	mkdir RPM | ||||
| 	echo %_topdir `pwd`/RPM > $(HOME)/.rpmmacros | ||||
| 	mkdir -p RPM/BUILD | ||||
| 	mkdir -p RPM/RPMS | ||||
| 	mkdir -p RPM/SOURCES | ||||
| 	mkdir -p RPM/SPECS | ||||
| 	mkdir -p RPM/SRPMS | ||||
| 	cp $(SPEC_FILE) RPM/SPECS | ||||
| 	cp $(top_srcdir)/$(PACKAGE)-*.tar.bz2 RPM/SOURCES | ||||
| 	mv $(top_srcdir)/$(PACKAGE)-$(VERSION).tar.bz2 $(PACKAGE)-$(VERSION).tar.bz2  | ||||
| 	rpmbuild -ba -v -vv --target=$(target_triplet) RPM/SPECS/$(SPEC_FILE) | ||||
| 	cp RPM/RPMS/*/*.rpm . | ||||
| 	cp RPM/SRPMS/$(SRPM_FILE) . | ||||
|  | ||||
| package-install: package | ||||
| 	su -c "rpm -Uvh $(RPM_FILE)" | ||||
| 	 | ||||
| package-uninstall: | ||||
| 	su -c "rpm -e $(PACKAGE)" | ||||
|  | ||||
| package-clean clean-local: | ||||
| 	rm -rf *.rpm RPM *.bz2 | ||||
|  | ||||
| distclean-local: package-clean | ||||
| 	rm -f Makefile $(SPEC_FILE) | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
							
								
								
									
										42
									
								
								CASA-auth-token/java/server/AuthTokenSvc/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								CASA-auth-token/java/server/AuthTokenSvc/.project
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>CasaAuthServer</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.wst.common.project.facet.core.builder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.wst.validation.validationbuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletbuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.wst.common.project.facet.core.nature</nature> | ||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||
| 		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature> | ||||
| 		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature> | ||||
| 	</natures> | ||||
| 	<linkedResources> | ||||
| 		<link> | ||||
| 			<name>identity-abstraction.jar</name> | ||||
| 			<type>1</type> | ||||
| 			<location>/home/jluciani/dev-local/bandit/trunk/IdentityAbstraction/build/identity-abstraction.jar</location> | ||||
| 		</link> | ||||
| 	</linkedResources> | ||||
| </projectDescription> | ||||
							
								
								
									
										141
									
								
								CASA-auth-token/java/server/AuthTokenSvc/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								CASA-auth-token/java/server/AuthTokenSvc/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = src | ||||
| DIST_SUBDIRS = src | ||||
|  | ||||
| EXTRA_DIST = authtoken.settings \ | ||||
| 		identoken.settings \ | ||||
| 		README \ | ||||
| 		svc.settings \ | ||||
| 		TODO \ | ||||
| 		web.xml | ||||
|  | ||||
| ROOT = ../.. | ||||
|  | ||||
| LIBDIR = $(ROOT)/$(LIB) | ||||
|  | ||||
| IDENT_ABSTRACTION_DIR = /usr/share/java/identity-abstraction | ||||
| IDENT_ABSTRACTION_DEPENDANCIES_DIR = /usr/share/java/identity-abstraction/dependancies | ||||
|  | ||||
| JAVAROOT = . | ||||
| JAVAC= javac | ||||
|  | ||||
| WEBAPP_NAME = CasaAuthTokenSvc | ||||
| WEBAPP_EXT = war | ||||
| MODULE_NAME = CasaAuthToken | ||||
| MODULE_EXT = jar | ||||
|  | ||||
| JAVAFILES = src/com/novell/casa/authtoksvc/ProtoDefs.java \ | ||||
| 	src/com/novell/casa/authtoksvc/AuthMechConfig.java \ | ||||
| 	src/com/novell/casa/authtoksvc/SvcConfig.java \ | ||||
| 	src/com/novell/casa/authtoksvc/IdenTokenConfig.java \ | ||||
| 	src/com/novell/casa/authtoksvc/AuthTokenConfig.java \ | ||||
| 	src/com/novell/casa/authtoksvc/EnabledSvcsConfig.java \ | ||||
| 	src/com/novell/casa/authtoksvc/AuthMechanism.java \ | ||||
| 	src/com/novell/casa/authtoksvc/Authenticate.java \ | ||||
| 	src/com/novell/casa/authtoksvc/RpcMethod.java \ | ||||
| 	src/com/novell/casa/authtoksvc/Rpc.java \ | ||||
| 	src/com/novell/casa/authtoksvc/GetAuthPolicy.java \ | ||||
| 	src/com/novell/casa/authtoksvc/Base64Coder.java \ | ||||
| 	src/com/novell/casa/authtoksvc/AuthReqMsg.java \ | ||||
| 	src/com/novell/casa/authtoksvc/AuthRespMsg.java \ | ||||
| 	src/com/novell/casa/authtoksvc/IdentityToken.java \ | ||||
| 	src/com/novell/casa/authtoksvc/CasaIdentityToken.java \ | ||||
| 	src/com/novell/casa/authtoksvc/AuthToken.java \ | ||||
| 	src/com/novell/casa/authtoksvc/GetAuthPolicyReqMsg.java \ | ||||
| 	src/com/novell/casa/authtoksvc/GetAuthPolicyRespMsg.java \ | ||||
| 	src/com/novell/casa/authtoksvc/GetAuthToken.java \ | ||||
| 	src/com/novell/casa/authtoksvc/GetAuthTokReqMsg.java \ | ||||
| 	src/com/novell/casa/authtoksvc/GetAuthTokRespMsg.java \ | ||||
| 	src/com/novell/casa/authtoksvc/Krb5Authenticate.java \ | ||||
| 	src/com/novell/casa/authtoksvc/PwdAuthenticate.java \ | ||||
| 	src/com/novell/casa/authtoksvc/SessionToken.java | ||||
|  | ||||
| BUILDDIR = build | ||||
|  | ||||
| WEBAPP = $(WEBAPP_NAME).$(WEBAPP_EXT) | ||||
|  | ||||
| AUTHTOKEN_FILES = -C $(BUILDDIR)/webapp/WEB-INF/classes com | ||||
|  | ||||
| CLASSES = $(addprefix $(BUILDDIR)/, $(JAVAFILES:%.java=%.class)) | ||||
|  | ||||
| LIBS = /usr/share/java/servletapi5.jar | ||||
| CLASSPATH = $(IDENT_ABSTRACTION_DIR)/identity-abstraction.jar:$(LIBS) | ||||
|  | ||||
| CUR_DIR := $(shell pwd) | ||||
|  | ||||
| all: $(BUILDDIR)/$(WEBAPP) $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||
|  | ||||
| $(BUILDDIR)/%.class: %.java | ||||
| 	@echo [======== Compiling $@ ========] | ||||
| 	$(JAVAC) -sourcepath src -classpath $(CLASSPATH) -d $(BUILDDIR)/webapp/WEB-INF/classes $< | ||||
|  | ||||
| $(BUILDDIR)/$(WEBAPP): $(BUILDDIR) $(CLASSES) | ||||
| 	@echo [======== Creating Webapp $@ ========] | ||||
| 	cp web.xml $(BUILDDIR)/webapp/WEB-INF/web.xml | ||||
| 	cp svc.settings $(BUILDDIR)/webapp/WEB-INF/conf/svc.settings | ||||
| 	cp authtoken.settings $(BUILDDIR)/webapp/WEB-INF/conf/authtoken.settings | ||||
| 	cp identoken.settings $(BUILDDIR)/webapp/WEB-INF/conf/identoken.settings | ||||
| 	cp src/com/novell/casa/authtoksvc/Krb5_mechanism.settings $(BUILDDIR)/webapp/WEB-INF/conf/installed_auth_mechanisms/Krb5Authenticate/mechanism.settings | ||||
| 	cp src/com/novell/casa/authtoksvc/Pwd_mechanism.settings $(BUILDDIR)/webapp/WEB-INF/conf/installed_auth_mechanisms/PwdAuthenticate/mechanism.settings | ||||
| 	cp $(IDENT_ABSTRACTION_DIR)/*.jar $(BUILDDIR)/webapp/WEB-INF/lib/ | ||||
| 	cp $(IDENT_ABSTRACTION_DEPENDANCIES_DIR)/*.jar $(BUILDDIR)/webapp/WEB-INF/lib/ | ||||
| 	jar cvf $(BUILDDIR)/$(WEBAPP) -C $(BUILDDIR)/webapp . | ||||
| 	cp $(BUILDDIR)/$(WEBAPP) $(LIBDIR)/java/ | ||||
|  | ||||
| $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT): $(BUILDDIR) $(CLASSES) | ||||
| 	@echo [======== Jarring $@ ========] | ||||
| 	jar cvf $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) $(AUTHTOKEN_FILES) | ||||
| 	cp $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) $(LIBDIR)/java/ | ||||
|  | ||||
| $(BUILDDIR): | ||||
| 	[ -d $(BUILDDIR) ] || mkdir -p $(BUILDDIR) | ||||
| 	[ -d $(BUILDDIR)/webapp ] || mkdir -p $(BUILDDIR)/webapp | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF/classes ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF/classes | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF/lib ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF/lib | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF/conf ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF/conf | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF/conf/enabled_services ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF/conf/enabled_services | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF/conf/auth_mechanisms ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF/conf/auth_mechanisms | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF/conf/installed_auth_mechanisms ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF/conf/installed_auth_mechanisms | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF/conf/installed_auth_mechanisms/Krb5Authenticate ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF/conf/installed_auth_mechanisms/Krb5Authenticate | ||||
| 	[ -d $(BUILDDIR)/webapp/WEB-INF/conf/installed_auth_mechanisms/PwdAuthenticate ] || mkdir -p $(BUILDDIR)/webapp/WEB-INF/conf/installed_auth_mechanisms/PwdAuthenticate | ||||
| 	[ -d $(LIBDIR) ] || mkdir -p $(LIBDIR) | ||||
| 	[ -d $(LIBDIR)/java ] || mkdir -p $(LIBDIR)/java | ||||
|  | ||||
| install-exec-local: | ||||
|  | ||||
| uninstall-local: | ||||
|  | ||||
| #installcheck-local: install | ||||
|  | ||||
| clean-local: | ||||
| 	if [ -d $(BUILDDIR) ]; then  rm -rf $(BUILDDIR); fi | ||||
| 	if [ -f $(LIBDIR)/java/$(MODULE_NAME).$(MODULE_EXT) ]; then  rm -f $(LIBDIR)/java/$(MODULE_NAME).$(MODULE_EXT); fi | ||||
| 	if [ -f $(LIBDIR)/java/$(WEBAPP) ]; then  rm -f $(LIBDIR)/java/$(WEBAPP); fi | ||||
|  | ||||
| distclean-local: | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
| 	rm -f Makefile | ||||
|  | ||||
							
								
								
									
										292
									
								
								CASA-auth-token/java/server/AuthTokenSvc/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										292
									
								
								CASA-auth-token/java/server/AuthTokenSvc/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,292 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  README for AuthTokenSvc | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| INTRODUCTION | ||||
|  | ||||
| AuthTokenSvc is the CASA Authentication Token Service (ATS). It is implemented | ||||
| as a Java servlet and supporting classes that execute in the Tomcat environment. | ||||
|  | ||||
| The ATS is responsible for providing clients with the necessary authentication | ||||
| policy information, for authenticating client entities, and for providing | ||||
| clients with Authentication Tokens that they can then use for authenticating | ||||
| to CASA Authentication enabled services. | ||||
|  | ||||
| The ATS utilizes mechanism plug-ins for authenticating client entities as well | ||||
| Identity Token Providers for the generation of Identity Tokens. | ||||
|  | ||||
| ENVIRONMENT SETTINGS | ||||
|  | ||||
| The following options must be set in the JAVA_OPTS setting before starting Tomcat | ||||
| to allow the Kerberos authentication mechanism to work properly: | ||||
|  | ||||
| -Djavax.security.auth.useSubjectCredsOnly=false | ||||
| -Djava.security.auth.login.config={replace with the path for JAAS configuration | ||||
|                                    file for the service} | ||||
|                                     | ||||
| After setting the above values in the JAVA_OPTS variable you must export it for | ||||
| Tomcat to be able to make use of it. | ||||
|  | ||||
| The following entry should be included in the JAAS configuration file specified | ||||
| in the java.security.auth.login.config option above to enable the Krb5 authentication | ||||
| mechanism to work correctly: | ||||
|  | ||||
| other { | ||||
| com.sun.security.auth.module.Krb5LoginModule required | ||||
|       useTicketCache=true | ||||
|       ticketCache="/var/cache/tomcat5/base/temp/ticket.cache" | ||||
|       useKeyTab=true | ||||
|       principal="host/server.company.com" | ||||
|       doNotPrompt=true | ||||
|       storeKey=true | ||||
|       keyTab="/etc/krb5.keytab"; | ||||
| } | ||||
|  | ||||
| Please adjust the ticketCache and principal setting to match your installation.  | ||||
|  | ||||
| CONFIGURATION | ||||
|  | ||||
| AuthTokenSvc configuration consists of multiple entities. Most of the AuthTokenSvc | ||||
| configuration is contained within the "conf" folder under the WEB-INF folder of the | ||||
| application. For an example configuration setup for the AuthTokenSvc see the | ||||
| sampleConf folder. | ||||
|  | ||||
| The location of the AuthTokenSvc configuration folder can be over-ridden by specifying | ||||
| a different path via the com.novell.casa.authtoksvc.config system property. | ||||
|  | ||||
| CONFIGURING THE BASE SERVICE | ||||
|  | ||||
| The ATS base settings are configured in the svc.settings file under the conf folder. | ||||
|  | ||||
| Thhe following is an example svc.settings file: | ||||
|  | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<SessionTokenLifetime>43200</SessionTokenLifetime> | ||||
| 	<LifetimeShorter>10</LifetimeShorter> | ||||
| 	<IAConfigFile>/home/jluciani/jakarta-tomcat-5.0.28/webapps/CasaAuthTokenSvc/WEB-INF/conf/iaRealms.xml</IAConfigFile> | ||||
| 	<ReconfigureInterval>60</ReconfigureInterval> | ||||
| 	<startSearchContext>o=novell</startSearchContext> | ||||
| </settings> | ||||
|  | ||||
| Note the following about the sample svc.settings file: | ||||
|  | ||||
| - The settngs that you can specify in the svc.settings file are: SessionLifetime, | ||||
|   LifetimeShorter, IAConfigFile, and startSearchContext. | ||||
|    | ||||
| - The SessionTokenLifetime setting specifies the number of seconds for which a | ||||
|   session token is good for after being issued. The default value for this setting | ||||
|   is 43200 seconds. Note that a larger value reduces overhead. | ||||
|    | ||||
| - The LifetimeShorter setting specifies the number of seconds that should be substracted | ||||
|   from the SessionTokenLifetime when calculating the number of seconds that clients are | ||||
|   told that the session tokens are good for.  The default value for this setting is 5 | ||||
|   seconds. | ||||
|    | ||||
| - The IAConfigFile settings specifies the path to the identity abstraction | ||||
|   configuration file. The identity abstraction configuration file configures | ||||
|   the different realms (contexts) that the ATS can utilize to authenticate | ||||
|   entities and resolve identities. In the future the configuration of this | ||||
|   settng will be optional. | ||||
|  | ||||
| - The ReconfigureInterval setting specifies how often the ATS should refresh its | ||||
|   configuration. The default value for this setting is 60 seconds. A ReconfigureInterval | ||||
|   value of 0 means that the ATS will not refresh its configuration once it has been | ||||
|   initialized, thus requiring that the servlet be re-initialized to make configuration | ||||
|   changes take effect. | ||||
|    | ||||
| - The startSearchContext setting specifies the begin location for initiating | ||||
|   context searches. The absence of this setting will result in searches ocurring | ||||
|   from the root of the tree. This setting or an equivalent setting will be moved | ||||
|   to the identity abstraction configuration file where it belongs. Once this is done, | ||||
|   the setting will no longer be recognized within the svc.settings file.  | ||||
|   | ||||
| CONFIGURING SERVICES TO CONSUME CASA AUTHENTICATION TOKENS | ||||
|  | ||||
| Services are configured to consume CASA authentication tokens by creating folders | ||||
| under the conf/enabled_services folders. Since CASA distinguishes between services | ||||
| of the same name existing in different hosts, the first folder that must be created | ||||
| is one for the host where the service resides. The host folder name must match the | ||||
| DNS name of the host where the service resides. Services are configured by creating | ||||
| a folder under the appropriate host folder with a name matching the service name. | ||||
|  | ||||
| Note when configuring services that the service name and the host names must match | ||||
| the service and host names specified by the client applications when requesting | ||||
| tokens to authenticate to them. | ||||
|  | ||||
| The services folder must contain an auth.policy file, an authtoken.settings file, | ||||
| and an identoken.settings file. In the absence of any one of those files, the ATS | ||||
| will default to utilizing the files present under its conf folder. | ||||
|  | ||||
| The auth.policy file specifies the authentication realms (or contexts) to which | ||||
| entities can authenticate to gain access to the service. The auth.policy file also | ||||
| specifies the authentication mechanisms that can be utilized to authenticate to the | ||||
| realms. | ||||
|  | ||||
| The following is an example auth.policy file:  | ||||
|  | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <auth_policy> | ||||
| 	<auth_source> | ||||
| 		<realm>CorpTree</realm> | ||||
| 		<mechanism>Krb5Authenticate</mechanism> | ||||
| 		<mechanism_info>host@tokenserver.company.novell.com</mechanism_info> | ||||
| 	</auth_source> | ||||
| 	<auth_source> | ||||
| 		<realm>CorpTree</realm> | ||||
| 		<mechanism>PwdAuthenticate</mechanism> | ||||
| 		<mechanism_info></mechanism_info> | ||||
| 	</auth_source> | ||||
| </auth_policy> | ||||
|  | ||||
| Note the following about the sample auth.policy file: | ||||
|  | ||||
| - An authentication realm is specified in the auth.policy file by creating an | ||||
|   auth_policy entry for it. An auth_policy entry must contain the realm name along | ||||
|   with the entries for the authentication mechanisms. | ||||
|    | ||||
| - When a realm supports more than one authentication mechanism, you must create | ||||
|   an auth_source entry for each supported mechanism. | ||||
|    | ||||
| - The realm names correspond to the realmIDs configured in the Identity Abstraction | ||||
|   configuration file for the desired context entry. | ||||
|    | ||||
| - The authentication mechanism entries are: mechanism and mechanism_info. The mechanism | ||||
|   entry specifies the name of the authentication mechanism. The mechanism_info specifies | ||||
|   some mechanism specific information. Both authentication mechanism entries must be | ||||
|   specified for an auth_source entry. | ||||
|    | ||||
| - The name of the Krb5 Authentication mechanism is "Krb5Authenticate". This mechanism | ||||
|   requires that you specify the service's kerberos principal name under the mechanism_info | ||||
|   key. | ||||
|    | ||||
| - The name of the username/password authentication mechanism is "PwdAuthenticate" and | ||||
|   it does not require any information to be included under the mechanism_info key. | ||||
|    | ||||
| The authtoken.settings file contains settings that should be applied to authentication | ||||
| tokens issued to authenticate to the service. | ||||
|  | ||||
| The following is an example authtoken.settings file: | ||||
|  | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<TokenLifetime>3600</TokenLifetime> | ||||
| 	<LifetimeShorter>10</LifetimeShorter> | ||||
| 	<IdentityTokenType>CasaIdentityToken</IdentityTokenType> | ||||
| </settings> | ||||
|  | ||||
| Note the following about the sample authtoken.settings file:  | ||||
|  | ||||
| - The settings that you can specify in the authtoken.settings file are: TokenLifetime, | ||||
|   LifetimeShorter, and IdentityTokenType. If one of this tokens is not specified then | ||||
|   its default value is utilized. | ||||
|    | ||||
| - The TokenLifetime setting specifies the number of seconds for which a token is good | ||||
|   for after being issued. The default value for this setting is 3600 seconds. Note that | ||||
|   a larger value reduces overhead, but it also gives more time for an intruder to | ||||
|   utilize the token if it becomes compromized. | ||||
|    | ||||
| - The LifetimeShorter setting specifies the number of seconds that should be substracted | ||||
|   from the TokenLifetime when calculating the number of seconds that clients are told | ||||
|   that the tokens are good for.  The default value for this setting is 5 seconds. | ||||
|    | ||||
| - The IdentityTokenType specifies the type of identity tokens that must be embedded in | ||||
|   the authentication tokens with identity information. The default value for this | ||||
|   setting is CasaIdentityToken. | ||||
|    | ||||
| The identoken.settings file contains settings that should be applied to identity tokens | ||||
| embedded in authentication tokens. | ||||
|  | ||||
| The following is an example identoken.settings file: | ||||
|  | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<Attributes>sn,groupMembership,guid</Attributes> | ||||
| 	<EncryptAttributes>false</EncryptAttributes> | ||||
| 	<Certificate>Base64 encoded certificate</Certificate> | ||||
| </settings> | ||||
|  | ||||
| Note the following about the sample identoken.settings file: | ||||
|  | ||||
| - The settings that you can specify in the identoken.settings file are: Attributes. | ||||
|   EncryptAttributes, and Certificate. | ||||
|    | ||||
| - The Attributes setting specifies the identity attributes that must be included | ||||
|   as part of the identity token, The attributes are specified in the form of a coma | ||||
|   delimited list. The default velue for this setting is "sn". | ||||
|    | ||||
| - The EncryptAtributes setting specifies whether or not the identity information | ||||
|   contained in the identity token should be emcrypted with the services's Public | ||||
|   Certificate. The default value for this setting is "false". Please note that | ||||
|   to enable identity attribute encryption you must not allow the ATS to default to | ||||
|   the file present in its conf folder (Attribute encryption is not yet supported | ||||
|   by the Casa identity token provider). | ||||
|    | ||||
| - The Certificate setting specifies the certificate that must be utilized to encrypt | ||||
|   identity attribute data. The certificate contains the public key of the targeted | ||||
|   service. The certificate data is Base64 encoded. | ||||
|    | ||||
| - The identoken.settings file can also contain additional identity token provider | ||||
|   specific settings. | ||||
|    | ||||
| CONFIGURING AUTHENTICATION MECHANISMS | ||||
|  | ||||
| Authentication mechanisms available to the AuthTokenSvc are configured by creating | ||||
| a sub-folder named after the authentication mechanism type under the | ||||
| conf/auth_mechanisms folder. The authentication mechanism folders must contain a | ||||
| settings file named mechanism.settings. The mechanism.settings file must contain the | ||||
| name of the class implementing the mechanism along with path information which | ||||
| can be utilized by the ATS to load the class. The mechanism.settings file can | ||||
| also contain mechanism specific settings. | ||||
|  | ||||
| The following setting is mandatory: | ||||
|  | ||||
| ClassName - This is the name of the class implementing the authentication mechanism. | ||||
|  | ||||
| One of the following settings must be included: | ||||
|  | ||||
| RelativeClassPath - This is a relative path from the web application's root folder | ||||
| to the folder containing the class implementing the mechanism. | ||||
|  | ||||
| ClassPath - This is an absolute path to the folder containing the path to the class | ||||
| implementing the mechanism. | ||||
|  | ||||
| The following is an example mechanism.settings file for the Krb5Authentication | ||||
| mechanism: | ||||
|  | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<ClassName>com.novell.casa.authtoksvc.Krb5Authenticate</ClassName> | ||||
| 	<RelativeClassPath>WEB-INF/classes</RelativeClassPath> | ||||
| 	<ServicePrincipalName>host@authtokenserver.company.com</ServicePrincipalName> | ||||
| </settings> | ||||
|  | ||||
| The base AuthTokenSvc package contains two authentication mechanisms, these are | ||||
| Krb5Authenticate and PwdAuthenticate. The configuration under sampleConf is set up | ||||
| to allow an AuthTokenSvc to leverage both mechanisms. | ||||
|  | ||||
| The Krb5Authenticate mechanism requires that the following setting also be included | ||||
| in its mechanism.settings file: | ||||
|  | ||||
| ServicePrincipalName - This is the name of the Kerberos Service Principal that the | ||||
| Authentication Token Service runs as when authenticating other entities. | ||||
|  | ||||
| CONFIGURING ADDITIONAL IDENTITY TOKEN PROVIDERS | ||||
|  | ||||
| - TBD - | ||||
|  | ||||
| SECURITY CONSIDERATIONS | ||||
|  | ||||
| - TBD - | ||||
|   | ||||
|  | ||||
|  | ||||
|  | ||||
|                  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										21
									
								
								CASA-auth-token/java/server/AuthTokenSvc/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								CASA-auth-token/java/server/AuthTokenSvc/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  TODO for AuthTokenSvc | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| INTRODUCTION | ||||
|  | ||||
| This file contains a list of the items still outstanding for AuthTokenSvc. | ||||
|  | ||||
| OUTSTANDING ITEMS | ||||
|  | ||||
| - Switch to a Web Services model where the Client/Server protocol uses SOAP. | ||||
| - Switch to use WS-Security, WS-Policy, and WS-Conversation for Authentication Tokens and Session Tokens. | ||||
| - Add code to verify that client/server communications occur over HTTPS. | ||||
| - Add logging. | ||||
| - Create plug-in API for Identity Token Providers. | ||||
| - Integrate into CASA build environment. | ||||
| - Review Code. | ||||
| - Change printfs used for debugging into a suitable mechanism. | ||||
|   | ||||
| @@ -0,0 +1,4 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<TokenLifetime>3600</TokenLifetime> | ||||
| </settings> | ||||
| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<EncryptAttributes>false</EncryptAttributes> | ||||
| 	<Attributes>sn</Attributes> | ||||
| </settings> | ||||
|  | ||||
| @@ -0,0 +1,13 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <auth_policy> | ||||
| 	<auth_source> | ||||
| 		<realm>CorpTree</realm> | ||||
| 		<mechanism>Krb5Authenticate</mechanism> | ||||
| 		<mechanism_info>host@authtokenserver.company.com</mechanism_info> | ||||
| 	</auth_source> | ||||
| 	<auth_source> | ||||
| 		<realm>CorpTree</realm> | ||||
| 		<mechanism>PwdAuthenticate</mechanism> | ||||
| 		<mechanism_info></mechanism_info> | ||||
| 	</auth_source> | ||||
| </auth_policy> | ||||
| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<ClassName>com.novell.casa.authtoksvc.Krb5Authenticate</ClassName> | ||||
| 	<RelativeClassPath>WEB-INF/classes</RelativeClassPath> | ||||
| 	<ServicePrincipalName>host@tokenserver.company.novell.com</ServicePrincipalName> | ||||
| </settings> | ||||
| @@ -0,0 +1,5 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<ClassName>com.novell.casa.authtoksvc.PwdAuthenticate</ClassName> | ||||
| 	<RelativeClassPath>WEB-INF/classes</RelativeClassPath> | ||||
| </settings> | ||||
| @@ -0,0 +1,4 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<TokenLifetime>3600</TokenLifetime> | ||||
| </settings> | ||||
| @@ -0,0 +1,13 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <auth_policy> | ||||
| 	<auth_source> | ||||
| 		<realm>CorpTree</realm> | ||||
| 		<mechanism>Krb5Authenticate</mechanism> | ||||
| 		<mechanism_info>host@tokenserver.company.novell.com</mechanism_info> | ||||
| 	</auth_source> | ||||
| 	<auth_source> | ||||
| 		<realm>CorpTree</realm> | ||||
| 		<mechanism>PwdAuthenticate</mechanism> | ||||
| 		<mechanism_info></mechanism_info> | ||||
| 	</auth_source> | ||||
| </auth_policy> | ||||
| @@ -0,0 +1,4 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<TokenLifetime>3600</TokenLifetime> | ||||
| </settings> | ||||
| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<EncryptAttributes>false</EncryptAttributes> | ||||
| 	<Attributes>sn,groupMembership</Attributes> | ||||
| </settings> | ||||
|  | ||||
| @@ -0,0 +1,25 @@ | ||||
| <bci:realms | ||||
| 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xmlns:bci="http://www.bandit-project.org/commonidentity" | ||||
| 	xmlns:xacml="urn:oasis:names:tc:xacml:2.0:policy:schema:os" | ||||
| 	xsi:schemaLocation="urn:oasis:names:tc:xacml:2.0:policy:schema:os:access_control-xacml-2.0-policy-schema-os.xsd"> | ||||
| 	<bci:realm | ||||
| 		desc="My Corporate Directory" | ||||
| 		connectorType="org.bandit.ia.connectors.LDAPConnectorInitialCtxFactory" | ||||
| 		id="jctree"> | ||||
| 		<bci:connection xsi:type="bci:LDAPConnector"> | ||||
| 			<bci:address>ldap://dirserver.companyname.com:389</bci:address> | ||||
| 			<bci:security> | ||||
| 				<bci:authentication>simple</bci:authentication> | ||||
| 				<bci:principal>cn=admin,o=companyname</bci:principal> | ||||
| 				<bci:credentials>password</bci:credentials> | ||||
| 			</bci:security> | ||||
| 		</bci:connection> | ||||
| 	</bci:realm> | ||||
| 	<bci:realm desc="Realm Join Definition" id="E263CCC1-8F9D-4551-B786-068AA84E8564"> | ||||
| 		<bci:connection xsi:type="bci:JoinConnector"> | ||||
| 			<bci:realmID>CorpTree</bci:realmID> | ||||
| 		</bci:connection> | ||||
| 	</bci:realm> | ||||
| </bci:realms> | ||||
|  | ||||
| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<EncryptAttributes>false</EncryptAttributes> | ||||
| 	<Attributes>sn</Attributes> | ||||
| </settings> | ||||
|  | ||||
| @@ -0,0 +1,5 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<IAConfigFile>/home/jluciani/jakarta-tomcat-5.0.28/webapps/CasaAuthTokenSvc/WEB-INF/conf/iaRealms.xml</IAConfigFile> | ||||
| 	<SessionTokenLifetime>43200</SessionTokenLifetime> | ||||
| </settings> | ||||
							
								
								
									
										37
									
								
								CASA-auth-token/java/server/AuthTokenSvc/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								CASA-auth-token/java/server/AuthTokenSvc/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = com | ||||
|  | ||||
| DIST_SUBDIRS = com | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
							
								
								
									
										37
									
								
								CASA-auth-token/java/server/AuthTokenSvc/src/com/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								CASA-auth-token/java/server/AuthTokenSvc/src/com/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = novell | ||||
|  | ||||
| DIST_SUBDIRS = novell | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,37 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = casa | ||||
|  | ||||
| DIST_SUBDIRS = casa | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,37 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = authtoksvc | ||||
|  | ||||
| DIST_SUBDIRS = authtoksvc | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,258 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.util.*; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
| /** | ||||
|  * AuthMechConfig Class. | ||||
|  *  | ||||
|  * This class obtains and maintains authentication token configuration. | ||||
|  *  | ||||
|  */ | ||||
| public class AuthMechConfig | ||||
| { | ||||
|    // Well known authentication token configuration settings | ||||
|    public final static String ClassName = "ClassName"; | ||||
|    public final static String RelativeClassPath = "RelativeClassPath"; | ||||
|    public final static String ClassPath = "ClassPath"; | ||||
|  | ||||
|    private Map m_mechSettingsMap; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_START = 1; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_DATA = 2; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_END = 3; | ||||
|       private final static int DONE_PARSING = 4; | ||||
|  | ||||
|       private final static String m_rootElementName = "settings"; | ||||
|  | ||||
|       private Map    m_keyMap; | ||||
|       private int    m_state; | ||||
|       private String m_currentKey; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler(Map keyMap) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_keyMap = keyMap; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we are not in an invalid state | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("AuthMechConfig SAXHandler.endDocument()- Invalid state" + m_state);  | ||||
|             throw new SAXException("Invalid state at endDocument"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (m_rootElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SETTING_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthMechConfig SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SETTING_ELEMENT_START: | ||||
|                // Keep track of the key name | ||||
|                m_currentKey = qName; | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SETTING_ELEMENT_DATA; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("AuthMechConfig SAXHandler.startElement()- Invalid state " + m_state);  | ||||
|                throw new SAXException("Invalid state at startElement"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_SETTING_ELEMENT_DATA: | ||||
|             case AWAITING_SETTING_ELEMENT_END: | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SETTING_ELEMENT_START; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SETTING_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (m_rootElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthMechConfig SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("AuthMechConfig SAXHandler.endElement()- Invalid state " + m_state);  | ||||
|                throw new SAXException("Invalid state at endElement"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Consume the data if in the right state | ||||
|          if (m_state == AWAITING_SETTING_ELEMENT_DATA) | ||||
|          { | ||||
|             // Consume the data and add the key to map | ||||
|             m_keyMap.put(m_currentKey, new String(ch, start, length)); | ||||
|  | ||||
|             // Advance to the next state | ||||
|             m_state = AWAITING_SETTING_ELEMENT_END; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor which sets default configuration values. | ||||
|     */ | ||||
|    public AuthMechConfig() throws Exception | ||||
|    { | ||||
|       System.err.println("AuthMechConfig()- Default"); | ||||
|  | ||||
|       // Create a map to keep track of the token settings | ||||
|       m_mechSettingsMap = new HashMap(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public AuthMechConfig(String mechSettingsFileName) throws Exception | ||||
|    { | ||||
|       System.err.println("AuthMechConfig()-"); | ||||
|  | ||||
|       // Create a map to keep track of the token settings | ||||
|       m_mechSettingsMap = new HashMap(); | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          // Get an input stream to read from the token settings file | ||||
|          File f = new File(mechSettingsFileName); | ||||
|          FileInputStream inStream = new FileInputStream(f); | ||||
|  | ||||
|          // Parse the file | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(m_mechSettingsMap); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|           | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|  | ||||
|          inStream.close(); | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|         System.err.println("AuthMechConfig()- " + mechSettingsFileName + " format error, exception: " + e.toString());  | ||||
|         throw new Exception("AuthMechConfig()- authtoken.settings format error"); | ||||
|       } | ||||
|       catch (SecurityException e) | ||||
|       { | ||||
|          System.err.println("AuthMechConfig()- SecurityException accessing " + mechSettingsFileName + " Exception=" + e.toString()); | ||||
|          throw new Exception("AuthMechConfig()- Not able to access file"); | ||||
|       } | ||||
|       catch (FileNotFoundException e) | ||||
|       { | ||||
|          System.err.println("AuthMechConfig()- File " + mechSettingsFileName + " not found"); | ||||
|          throw new Exception("AuthMechConfig()- File not found"); | ||||
|       } | ||||
|       catch (IOException e) | ||||
|       { | ||||
|          System.err.println("AuthMechConfig()- IOException accessing " + mechSettingsFileName + " Exception=" + e.toString()); | ||||
|          throw new Exception("AuthMechConfig()- Read error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the value associated with the specified setting. | ||||
|     */ | ||||
|    public String getSetting(String settingName) throws Exception | ||||
|    { | ||||
|       // Try to find the setting in our map | ||||
|       String value = (String) m_mechSettingsMap.get(settingName); | ||||
|       if (value == null) | ||||
|       { | ||||
|          System.err.println("AuthMechConfig.getSetting()- Did not find setting " + settingName); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          System.err.println("AuthMechConfig.getSetting()- Found setting " + settingName); | ||||
|          System.err.println("AuthMechConfig.getSetting()- Setting value = " + value); | ||||
|       } | ||||
|  | ||||
|       return value; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,53 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| /* | ||||
|  * AuthMechanism Interface. | ||||
|  *  | ||||
|  * This is the interface implemented by Authentication Mechanisms. | ||||
|  * | ||||
|  * Please note that Authentication Machanisms must also implement the | ||||
|  * Serializable interface. | ||||
|  * | ||||
|  */ | ||||
| public interface AuthMechanism | ||||
| { | ||||
|    /* | ||||
|     * Initialize the authentication mechanism. | ||||
|     */ | ||||
|    void init(SvcConfig svcConfig, AuthMechConfig mechConfig) throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Process authenticate request. If successful, return the Id of the | ||||
|     * authenticated identity. | ||||
|     */ | ||||
|    String invoke(AuthReqMsg authReqMsg) throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Return the mechanism id. | ||||
|     */ | ||||
|    String getId(); | ||||
| } | ||||
| @@ -0,0 +1,328 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.InputStream; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * AuthReqMsg Class. | ||||
|  *  | ||||
|  * This class deals with the message sent by Casa Client when requesting | ||||
|  * that an entity be authenticated. The format of the message is as | ||||
|  * follows: | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <auth_req> | ||||
|  * <realm>realm value</realm> | ||||
|  * <mechanism>mechanism id</mechanism> | ||||
|  * <auth_mech_token>mechanism token data</auth_mech_token> | ||||
|  * </auth_req> | ||||
|  *  | ||||
|  */ | ||||
| public class AuthReqMsg | ||||
| { | ||||
|  | ||||
|    protected String  m_realm = null; | ||||
|    protected String  m_authMechToken = null; | ||||
|    protected String  m_authMechanism = null; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling Authentication Request parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_ROOT_ELEMENT_END = 1; | ||||
|       private final static int AWAITING_REALM_ELEMENT_START = 2; | ||||
|       private final static int AWAITING_REALM_ELEMENT_END = 3; | ||||
|       private final static int AWAITING_REALM_DATA = 4; | ||||
|       private final static int AWAITING_MECH_ELEMENT_START = 5; | ||||
|       private final static int AWAITING_MECH_ELEMENT_END = 6; | ||||
|       private final static int AWAITING_MECH_DATA = 7; | ||||
|       private final static int AWAITING_AUTH_MECH_TOKEN_ELEMENT_START = 8; | ||||
|       private final static int AWAITING_AUTH_MECH_TOKEN_ELEMENT_END = 9; | ||||
|       private final static int AWAITING_AUTH_MECH_TOKEN_DATA = 10; | ||||
|       private final static int DONE_PARSING = 11; | ||||
|  | ||||
|       private AuthReqMsg   m_authReqMsg; | ||||
|       private int          m_state; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler (AuthReqMsg authReqMsg) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_authReqMsg = authReqMsg; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we obtained all of the required elements | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("AuthReqMsg SAXHandler.endDocument()- Missing element");  | ||||
|             throw new SAXException("Missing element"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.authRequestElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_REALM_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_REALM_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.realmElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_REALM_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_MECH_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.mechanismElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_MECH_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_AUTH_MECH_TOKEN_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.authMechTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_AUTH_MECH_TOKEN_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("AuthReqMsg SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_ROOT_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.authRequestElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_REALM_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.realmElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_MECH_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_MECH_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.mechanismElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_AUTH_MECH_TOKEN_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_AUTH_MECH_TOKEN_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.authMechTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ROOT_ELEMENT_END; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("AuthReqMsg SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_REALM_DATA: | ||||
|                // Consume the data | ||||
|                m_authReqMsg.m_realm = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_REALM_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_MECH_DATA: | ||||
|                // Consume the data | ||||
|                m_authReqMsg.m_authMechanism = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_MECH_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_AUTH_MECH_TOKEN_DATA: | ||||
|                // Consume the data | ||||
|                m_authReqMsg.m_authMechToken = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_AUTH_MECH_TOKEN_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                // Do nothing | ||||
|                break; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor | ||||
|     */ | ||||
|    public AuthReqMsg (InputStream inStream) throws Exception | ||||
|    { | ||||
|       try | ||||
|       { | ||||
|          // Parse the AuthReqMsg | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(this); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|  | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|          System.err.println("AuthReqMsg()- Parse exception: " + e.toString());  | ||||
|          throw new Exception("Protocol error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the authentication realm.  | ||||
|     */ | ||||
|    public String getRealm() throws Exception | ||||
|    { | ||||
|       return m_realm; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the authentication mechanism token.  | ||||
|     */ | ||||
|    public String getAuthMechToken() throws Exception | ||||
|    { | ||||
|       return m_authMechToken; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the authentication mechanism id.  | ||||
|     */ | ||||
|    public String getMechanismId() throws Exception | ||||
|    { | ||||
|       return m_authMechanism; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,113 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| /** | ||||
|  * AuthRespMsg Class. | ||||
|  *  | ||||
|  * This class deals with the message sent to the CASA Client as a | ||||
|  * response to an authentication request. The format of the message is | ||||
|  * as follows when the response includes a session token: | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <auth_resp> | ||||
|  * <status><description>OK</description>200</status> | ||||
|  * <session_token><lifetime>lifetime value</lifetime>session token data</session_token> | ||||
|  * </auth_resp> | ||||
|  *  | ||||
|  * The format of the message is as follows when the response does not | ||||
|  * include a session token. | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <auth_resp> | ||||
|  * <status><description>status description</description>status code</status> | ||||
|  * </auth_resp> | ||||
|  *  | ||||
|  * Plase note that the protocol utilizes the status codes defined | ||||
|  * in the HTTP 1.1 Specification. | ||||
|  * | ||||
|  */ | ||||
| public class AuthRespMsg | ||||
| { | ||||
|  | ||||
|    String   m_msg; | ||||
|  | ||||
|    /* | ||||
|     * Constructor for a msg that does not include the session token. | ||||
|     */ | ||||
|    public AuthRespMsg ( | ||||
|                       String statusDescription, | ||||
|                       String statusCode) throws Exception | ||||
|    { | ||||
|       // Get a StringBuffer to help us with the construction of the message | ||||
|       StringBuffer sb = new StringBuffer(); | ||||
|  | ||||
|       // Start building the message | ||||
|       sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.authResponseElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.statusElementName + ">" | ||||
|                 + "<" + ProtoDefs.descriptionElementName + ">" + statusDescription + "</" + ProtoDefs.descriptionElementName + ">" | ||||
|                 + statusCode + "</" + ProtoDefs.statusElementName + ">" + "\r\n"); | ||||
|       sb.append("</" + ProtoDefs.authResponseElementName + ">" + "\r\n"); | ||||
|  | ||||
|       // The message has now been built, save it. | ||||
|       m_msg = sb.toString(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor for a msg that includes the session token. | ||||
|     */ | ||||
|    public AuthRespMsg ( | ||||
|                       String statusDescription, | ||||
|                       String statusCode, | ||||
|                       String sessionToken, | ||||
|                       String sessionTokenLifetime) throws Exception | ||||
|    { | ||||
|       // Get a StringBuffer to help us with the construction of the message | ||||
|       StringBuffer sb = new StringBuffer(); | ||||
|  | ||||
|       // Start building the message | ||||
|       sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.authResponseElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.statusElementName + ">" | ||||
|                 + "<" + ProtoDefs.descriptionElementName + ">" + ProtoDefs.httpOkStatusMsg + "</" + ProtoDefs.descriptionElementName + ">" | ||||
|                 + ProtoDefs.httpOkStatusCode + "</" + ProtoDefs.statusElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.sessionTokenElementName + ">" | ||||
|                 + "<" + ProtoDefs.lifetimeElementName + ">" + sessionTokenLifetime + "</" + ProtoDefs.lifetimeElementName + ">" | ||||
|                 + sessionToken + "</" + ProtoDefs.sessionTokenElementName + ">" + "\r\n"); | ||||
|       sb.append("</" + ProtoDefs.authResponseElementName + ">" + "\r\n"); | ||||
|  | ||||
|       // The message has now been built, save it. | ||||
|       m_msg = sb.toString(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the AuthRespMsg. | ||||
|     */ | ||||
|    public String toString() | ||||
|    { | ||||
|       return m_msg; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,466 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.ByteArrayInputStream; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * AuthToken Class. | ||||
|  *  | ||||
|  * This class constructs authentication tokens that clients can present | ||||
|  * to services for authentication. The format of the authentication token | ||||
|  * is as follows: | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <auth_token> | ||||
|  * <signature>signature value</signature> | ||||
|  * <lifetime>lifetime value</lifetime> | ||||
|  * <ident_token><type>Identity Token type</type>identity token data</ident_token> | ||||
|  * </auth_token> | ||||
|  * | ||||
|  */ | ||||
| public class AuthToken | ||||
| { | ||||
|  | ||||
|    private String       m_token; | ||||
|    private String       m_lifetime; | ||||
|    private String       m_lifetimeShorter; | ||||
|    private String       m_identityTokenType; | ||||
|    private StringBuffer m_identityToken; | ||||
|    private String       m_signature; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_ROOT_ELEMENT_END = 1; | ||||
|       private final static int AWAITING_SIGNATURE_ELEMENT_START = 2; | ||||
|       private final static int AWAITING_SIGNATURE_ELEMENT_END = 3; | ||||
|       private final static int AWAITING_SIGNATURE_DATA = 4; | ||||
|       private final static int AWAITING_LIFETIME_ELEMENT_START = 5; | ||||
|       private final static int AWAITING_LIFETIME_ELEMENT_END = 6; | ||||
|       private final static int AWAITING_LIFETIME_DATA = 7; | ||||
|       private final static int AWAITING_IDENT_TOKEN_ELEMENT_START = 8; | ||||
|       private final static int AWAITING_IDENT_TOKEN_ELEMENT_END = 9; | ||||
|       private final static int AWAITING_IDENT_TOKEN_DATA = 10; | ||||
|       private final static int AWAITING_TYPE_ELEMENT_START = 11; | ||||
|       private final static int AWAITING_TYPE_ELEMENT_END = 12; | ||||
|       private final static int AWAITING_TYPE_DATA = 13; | ||||
|       private final static int DONE_PARSING = 14; | ||||
|  | ||||
|       private AuthToken m_AuthToken; | ||||
|       private int    m_state; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler (AuthToken AuthToken) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_AuthToken = AuthToken; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we obtained all of the required elements | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("AuthToken SAXHandler.endDocument()- Missing element");  | ||||
|             throw new SAXException("Missing element"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.authTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SIGNATURE_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SIGNATURE_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.signatureElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SIGNATURE_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_LIFETIME_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.lifetimeElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_LIFETIME_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|  | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_IDENT_TOKEN_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.identTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_TYPE_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TYPE_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.typeElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_TYPE_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("AuthToken SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.authTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SIGNATURE_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.signatureElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_LIFETIME_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_LIFETIME_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.lifetimeElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_IDENT_TOKEN_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TYPE_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.typeElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_IDENT_TOKEN_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_IDENT_TOKEN_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.identTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ROOT_ELEMENT_END; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("AuthToken SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_SIGNATURE_DATA: | ||||
|                // Consume the data | ||||
|                m_AuthToken.m_signature = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SIGNATURE_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_LIFETIME_DATA: | ||||
|                // Consume the data | ||||
|                m_AuthToken.m_lifetime = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_LIFETIME_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TYPE_DATA: | ||||
|                // Consume the data | ||||
|                m_AuthToken.m_identityTokenType = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_TYPE_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_IDENT_TOKEN_DATA: | ||||
|             case AWAITING_IDENT_TOKEN_ELEMENT_END: | ||||
|                // Consume the data | ||||
|                m_AuthToken.m_identityToken.append(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_IDENT_TOKEN_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                // Do nothing | ||||
|                break; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public AuthToken(String identityId, | ||||
|                     String realm, | ||||
|                     String targetService, | ||||
|                     String targetHost, | ||||
|                     SvcConfig svcConfig, | ||||
|                     EnabledSvcsConfig enabledSvcsConfig) throws Exception | ||||
|    { | ||||
|       // Get access to the authentication token configuration for this service | ||||
|       AuthTokenConfig authTokenConfig = enabledSvcsConfig.getAuthTokenConfig(targetHost, targetService); | ||||
|       if (authTokenConfig != null) | ||||
|       { | ||||
|          try | ||||
|          { | ||||
|             // For now lets use the services of the only IdentityToken provider | ||||
|             // that we have. | ||||
|             // | ||||
|             // tbd - Add code to allow for the consumption of tokens | ||||
|             // from different providers. | ||||
|             CasaIdentityToken identityToken = new CasaIdentityToken(enabledSvcsConfig.getIdenTokenConfig(targetHost, targetService)); | ||||
|             identityToken.initialize(identityId, | ||||
|                                      realm, | ||||
|                                      targetService, | ||||
|                                      targetHost, | ||||
|                                      svcConfig); | ||||
|  | ||||
|             m_identityToken = new StringBuffer(); | ||||
|             m_identityToken.append(identityToken.getEncodedToken()); | ||||
|             m_identityTokenType = identityToken.getProviderType(); | ||||
|  | ||||
|             m_lifetime = authTokenConfig.getSetting(AuthTokenConfig.TokenLifetime); | ||||
|             m_lifetimeShorter = authTokenConfig.getSetting(AuthTokenConfig.LifetimeShorter); | ||||
|  | ||||
|             // Generate a signature | ||||
|             // tbd - Over identToken, identToken type, and lifetime data. | ||||
|             m_signature = "tbd"; | ||||
|  | ||||
|             // Get a StringBuffer to help us with the construction of the token | ||||
|             StringBuffer sb = new StringBuffer(); | ||||
|  | ||||
|             // Start building the message | ||||
|             sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|             sb.append("<" + ProtoDefs.authTokenElementName + ">" + "\r\n"); | ||||
|             sb.append("<" + ProtoDefs.signatureElementName + ">" + m_signature + "</" + ProtoDefs.signatureElementName + ">" + "\r\n"); | ||||
|             sb.append("<" + ProtoDefs.lifetimeElementName + ">" + m_lifetime + "</" + ProtoDefs.lifetimeElementName + ">" + "\r\n"); | ||||
|             sb.append("<" + ProtoDefs.identTokenElementName + ">" | ||||
|                       + "<" + ProtoDefs.typeElementName + ">" + m_identityTokenType + "</" + ProtoDefs.typeElementName + ">" | ||||
|                       + m_identityToken + "</" + ProtoDefs.identTokenElementName + ">" + "\r\n"); | ||||
|             sb.append("</" + ProtoDefs.authTokenElementName + ">" + "\r\n"); | ||||
|  | ||||
|             // Save the token | ||||
|             m_token = sb.toString(); | ||||
|          } | ||||
|          catch (Exception e) | ||||
|          { | ||||
|             // tbd | ||||
|             System.err.println("AuthToken()- Exception: " + e.toString());  | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          throw new Exception("Error: Missing authentication token config for " + targetService); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor given an authentication token string. The constructor | ||||
|     * validates the token as part of its processing. | ||||
|     */ | ||||
|    public AuthToken(String token) throws Exception | ||||
|    { | ||||
|       // Decode the token string | ||||
|       m_token = Base64Coder.decode(token); | ||||
|  | ||||
|       // Instantiate string buffer for the identity token | ||||
|       m_identityToken = new StringBuffer(); | ||||
|  | ||||
|       // Now parse the token into its elements | ||||
|       try | ||||
|       { | ||||
|          // Parse the AuthToken | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(this); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|  | ||||
|          ByteArrayInputStream inStream = new ByteArrayInputStream(m_token.getBytes()); | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|  | ||||
|          // Verify the signature | ||||
|          // tbd | ||||
|  | ||||
|          // Verify that the token has not expired | ||||
|          // tbd | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|          System.err.println("AuthToken()- Parse exception: " + e.toString());  | ||||
|          throw new Exception("Protocol error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the Base64 encode token. | ||||
|     */ | ||||
|    public String toString() | ||||
|    { | ||||
|       return Base64Coder.encode(m_token); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the lifetime of the token. | ||||
|     */ | ||||
|    public String getLifetime() | ||||
|    { | ||||
|       // tbd - Convert to tokenLifetime and lifetimeShorter to ints, substractand then convert result to string | ||||
|       return "60"; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the identity token. | ||||
|     */ | ||||
|    public String getIdentityToken() | ||||
|    { | ||||
|       return m_identityToken.toString(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the identity token type. | ||||
|     */ | ||||
|    public String getIdentityTokenType() | ||||
|    { | ||||
|       return m_identityTokenType; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,298 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.util.*; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
| /** | ||||
|  * AuthTokenConfig Class. | ||||
|  *  | ||||
|  * This class obtains and maintains authentication token configuration. | ||||
|  *  | ||||
|  */ | ||||
| public class AuthTokenConfig | ||||
| { | ||||
|    // Well known authentication token configuration settings | ||||
|    public final static String TokenLifetime = "TokenLifetime"; | ||||
|    public final static String LifetimeShorter = "LifetimeShorter"; | ||||
|    public final static String IdentityTokenType = "IdentityTokenType"; | ||||
|  | ||||
|    // Default configuration values | ||||
|    private String m_defaultTokenLifetimeValue = "3600";  // Seconds | ||||
|    private String m_defaultLifetimeShorterValue = "5";   // Seconds | ||||
|    private String m_defaultIdentityTokenTypeValue = "CasaIdentityToken"; | ||||
|  | ||||
|    private Map m_tokenSettingsMap; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_START = 1; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_DATA = 2; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_END = 3; | ||||
|       private final static int DONE_PARSING = 4; | ||||
|  | ||||
|       private final static String m_rootElementName = "settings"; | ||||
|  | ||||
|       private Map    m_keyMap; | ||||
|       private int    m_state; | ||||
|       private String m_currentKey; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler(Map keyMap) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_keyMap = keyMap; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we are not in an invalid state | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("AuthTokenConfig SAXHandler.endDocument()- Invalid state" + m_state);  | ||||
|             throw new SAXException("Invalid state at endDocument"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (m_rootElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SETTING_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthTokenConfig SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SETTING_ELEMENT_START: | ||||
|                // Keep track of the key name | ||||
|                m_currentKey = qName; | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SETTING_ELEMENT_DATA; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("AuthTokenConfig SAXHandler.startElement()- Invalid state " + m_state);  | ||||
|                throw new SAXException("Invalid state at startElement"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_SETTING_ELEMENT_DATA: | ||||
|             case AWAITING_SETTING_ELEMENT_END: | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SETTING_ELEMENT_START; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SETTING_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (m_rootElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("AuthTokenConfig SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("AuthTokenConfig SAXHandler.endElement()- Invalid state " + m_state);  | ||||
|                throw new SAXException("Invalid state at endElement"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Consume the data if in the right state | ||||
|          if (m_state == AWAITING_SETTING_ELEMENT_DATA) | ||||
|          { | ||||
|             // Consume the data and add the key to map | ||||
|             m_keyMap.put(m_currentKey, new String(ch, start, length)); | ||||
|  | ||||
|             // Advance to the next state | ||||
|             m_state = AWAITING_SETTING_ELEMENT_END; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor which sets default configuration values. | ||||
|     */ | ||||
|    public AuthTokenConfig() throws Exception | ||||
|    { | ||||
|       System.err.println("AuthTokenConfig()- Default"); | ||||
|  | ||||
|       // Create a map to keep track of the token settings | ||||
|       m_tokenSettingsMap = new HashMap(); | ||||
|  | ||||
|       // Set the default settings in our map | ||||
|       m_tokenSettingsMap.put(TokenLifetime, m_defaultTokenLifetimeValue); | ||||
|       m_tokenSettingsMap.put(LifetimeShorter, m_defaultLifetimeShorterValue); | ||||
|       m_tokenSettingsMap.put(IdentityTokenType, m_defaultIdentityTokenTypeValue); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public AuthTokenConfig(String authTokenSettingsFileName) throws Exception | ||||
|    { | ||||
|       System.err.println("AuthTokenConfig()-"); | ||||
|  | ||||
|       // Create a map to keep track of the token settings | ||||
|       m_tokenSettingsMap = new HashMap(); | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          // Get an input stream to read from the token settings file | ||||
|          File f = new File(authTokenSettingsFileName); | ||||
|          FileInputStream inStream = new FileInputStream(f); | ||||
|  | ||||
|          // Parse the file | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(m_tokenSettingsMap); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|           | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|  | ||||
|          inStream.close(); | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|         System.err.println("AuthTokenConfig()- " + authTokenSettingsFileName + " format error, exception: " + e.toString());  | ||||
|         throw new Exception("AuthTokenConfig()- authtoken.settings format error"); | ||||
|       } | ||||
|       catch (SecurityException e) | ||||
|       { | ||||
|          System.err.println("AuthTokenConfig()- SecurityException accessing " + authTokenSettingsFileName + " Exception=" + e.toString()); | ||||
|          throw new Exception("AuthTokenConfig()- Not able to access file"); | ||||
|       } | ||||
|       catch (FileNotFoundException e) | ||||
|       { | ||||
|          System.err.println("AuthTokenConfig()- File " + authTokenSettingsFileName + " not found"); | ||||
|          throw new Exception("AuthTokenConfig()- File not found"); | ||||
|       } | ||||
|       catch (IOException e) | ||||
|       { | ||||
|          System.err.println("AuthTokenConfig()- IOException accessing " + authTokenSettingsFileName + " Exception=" + e.toString()); | ||||
|          throw new Exception("AuthTokenConfig()- Read error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the value associated with the specified setting. | ||||
|     */ | ||||
|    public String getSetting(String settingName) throws Exception | ||||
|    { | ||||
|       // Try to find the setting in our map | ||||
|       String value = (String) m_tokenSettingsMap.get(settingName); | ||||
|       if (value == null) | ||||
|       { | ||||
|          System.err.println("AuthTokenConfig.getSetting()- Did not find setting " + settingName); | ||||
|  | ||||
|          // The setting is not in our map, check if it is one to | ||||
|          // which we have defaults. | ||||
|          if (settingName.equals(TokenLifetime) == true) | ||||
|          { | ||||
|             value = m_defaultTokenLifetimeValue; | ||||
|             System.err.println("AuthTokenConfig.getSetting()- Assigning default value " + value); | ||||
|  | ||||
|             // Add the key to the map so that it can be found quicker next time | ||||
|             m_tokenSettingsMap.put(TokenLifetime, m_defaultTokenLifetimeValue); | ||||
|          } | ||||
|          else if (settingName.equals(LifetimeShorter) == true) | ||||
|          { | ||||
|             value = m_defaultLifetimeShorterValue; | ||||
|             System.err.println("AuthTokenConfig.getSetting()- Assigning default value " + value); | ||||
|  | ||||
|             // Add the key to the map so that it can be found quicker next time | ||||
|             m_tokenSettingsMap.put(LifetimeShorter, m_defaultLifetimeShorterValue); | ||||
|          } | ||||
|          else if (settingName.equals(IdentityTokenType) == true) | ||||
|          { | ||||
|             value = m_defaultLifetimeShorterValue; | ||||
|             System.err.println("AuthTokenConfig.getSetting()- Assigning default value " + value); | ||||
|  | ||||
|             // Add the key to the map so that it can be found quicker next time | ||||
|             m_tokenSettingsMap.put(IdentityTokenType, m_defaultIdentityTokenTypeValue); | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          System.err.println("AuthTokenConfig.getSetting()- Found setting " + settingName); | ||||
|          System.err.println("AuthTokenConfig.getSetting()- Setting value = " + value); | ||||
|  | ||||
|          // Do some sanity checking | ||||
|          // tbd - Make sure that the token lifetime values are greater than the LifetimeShorter | ||||
|       } | ||||
|  | ||||
|       return value; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,341 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.util.*; | ||||
| import java.io.*; | ||||
|  | ||||
| import java.io.ObjectOutputStream; | ||||
| import java.io.ObjectInputStream; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.PrintWriter; | ||||
|  | ||||
| import java.net.URL; | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URLClassLoader; | ||||
|  | ||||
| /** | ||||
|  * Authenticate Class. | ||||
|  *  | ||||
|  * This class processes authentication requests. | ||||
|  *  | ||||
|  */ | ||||
| public class Authenticate implements RpcMethod | ||||
| { | ||||
|    private static final String   m_mechanismSettingsFileName = "mechanism.settings"; | ||||
|  | ||||
|    private Map m_authMechanismMap; | ||||
|  | ||||
|    private SvcConfig          m_svcConfig; | ||||
|    private EnabledSvcsConfig  m_enabledSvcsConfig; | ||||
|  | ||||
|    /* | ||||
|     * Constructor | ||||
|     */ | ||||
|    public Authenticate() throws Exception | ||||
|    { | ||||
|       // Create a map to keep track of the authentication mechanisms | ||||
|       m_authMechanismMap = new HashMap(); | ||||
|    }      | ||||
|  | ||||
|    /* | ||||
|     * Initialize the Rpc method. | ||||
|     */ | ||||
|    public void init(SvcConfig svcConfig, EnabledSvcsConfig enabledSvcsConfig) throws Exception | ||||
|    { | ||||
|       m_svcConfig = svcConfig; | ||||
|       m_enabledSvcsConfig = enabledSvcsConfig; | ||||
|  | ||||
|       // Now go through the configured authentication mechanisms, as we do so, instantiate | ||||
|       // the mechanisms and place them in our map. Note that the mechanisms config folder | ||||
|       // contains folders for each installed authentication mechanism. The name of these | ||||
|       // folders usually match the name of the Authentication mechanisms. | ||||
|       String svcConfigPath = svcConfig.getSetting(SvcConfig.ConfigFolderPath); | ||||
|       File mechanismsConfigFolder = new File(svcConfigPath, "auth_mechanisms"); | ||||
|       try | ||||
|       { | ||||
|          String[] mechanismsConfigFolderObjs = mechanismsConfigFolder.list(); | ||||
|          if (mechanismsConfigFolderObjs != null) | ||||
|          { | ||||
|             for (int i = 0; i < mechanismsConfigFolderObjs.length; i++) | ||||
|             { | ||||
|                // Check if we are dealing with a file or a folder | ||||
|                File mechanismFolder = new File(mechanismsConfigFolder, mechanismsConfigFolderObjs[i]); | ||||
|                try | ||||
|                { | ||||
|                   if (mechanismFolder.isDirectory() == true) | ||||
|                   { | ||||
|                      System.err.println("Authenticate.init()- Mechanism folder " + mechanismFolder + " is directory"); | ||||
|  | ||||
|                      // Try to obtain the mechanism settings | ||||
|                      try | ||||
|                      { | ||||
|                         AuthMechConfig mechConfig = new AuthMechConfig(mechanismFolder + File.separator + m_mechanismSettingsFileName); | ||||
|  | ||||
|                         // Mechanism settings obtained, now instantiate it and place it in our map. | ||||
|                         // | ||||
|                         String mechClassName = mechConfig.getSetting(AuthMechConfig.ClassName); | ||||
|                         if (mechClassName != null) | ||||
|                         { | ||||
|                            // We now know the name of the class implementing the mechanism, now lets | ||||
|                            // get the relative path to the class file. Note that the path is relative | ||||
|                            // to the root folder of our application. | ||||
|                            String relativePath = mechConfig.getSetting(AuthMechConfig.RelativeClassPath); | ||||
|                            if (relativePath != null) | ||||
|                            { | ||||
|                               // Create a file object to the folder containing the class file. Note that we need to | ||||
|                               // ultimately instantiate objects from a class loaded by the same class loader that | ||||
|                               // loads the AuthMechanism class to avoid ClassCastExceptions. | ||||
|                               File mechClassPathFile = new File(svcConfig.getSetting(SvcConfig.AppRootPath) + relativePath); | ||||
|                               System.err.println("Authenticate.init()- Mechanism path = " + mechClassPathFile); | ||||
|                               try | ||||
|                               { | ||||
|                                  URL methClassPathUrl = mechClassPathFile.toURL(); | ||||
|                                  URL[] urls = new URL[]{methClassPathUrl}; | ||||
|  | ||||
|                                  // Create a class loader for the folder | ||||
|                                  ClassLoader customClassLoader = new URLClassLoader(urls); | ||||
|  | ||||
|                                  // Load the mech class using our custom loader | ||||
|                                  Class mechClass = customClassLoader.loadClass(mechClassName); | ||||
|                                  FileOutputStream fos = new FileOutputStream(svcConfig.getSetting(SvcConfig.AppRootPath) + "tmp"); | ||||
|                                  ObjectOutputStream oos = new ObjectOutputStream(fos); | ||||
|                                  oos.writeObject(mechClass); | ||||
|                                  oos.close(); | ||||
|                                  fos.close(); | ||||
|                                  FileInputStream fis = new FileInputStream(svcConfig.getSetting(SvcConfig.AppRootPath) + "tmp"); | ||||
|                                  ObjectInputStream ois = new ObjectInputStream(fis); | ||||
|                                  mechClass = (Class) ois.readObject(); | ||||
|                                  ois.close(); | ||||
|                                  fis.close(); | ||||
|                                   | ||||
|                                  // Now reload the class using the class loader for our AuthMechanism class | ||||
|                                  AuthMechanism mechanism = (AuthMechanism) mechClass.newInstance(); | ||||
|                                  mechanism.init(svcConfig, mechConfig); | ||||
|                                  m_authMechanismMap.put(mechanism.getId(), mechanism); | ||||
|                               } | ||||
|                               catch (MalformedURLException e) | ||||
|                               { | ||||
|                                  System.err.println("Authenticate.init()- MalformedURLException for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                               } | ||||
|                               catch (ClassNotFoundException e) | ||||
|                               { | ||||
|                                  System.err.println("Authenticate.init()- ClassNotFoundException for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                               } | ||||
|                               catch (InstantiationException e) | ||||
|                               { | ||||
|                                  System.err.println("Authenticate.init()- InstantiationException for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                               } | ||||
|                               catch (IllegalAccessException e) | ||||
|                               { | ||||
|                                  System.err.println("Authenticate.init()- IllegalAccessException for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                               } | ||||
|                            } | ||||
|                            else | ||||
|                            { | ||||
|                               // A relative path was not configured, check if instead a full path was configured. | ||||
|                               String classPath = mechConfig.getSetting(AuthMechConfig.ClassPath); | ||||
|                               if (classPath != null) | ||||
|                               { | ||||
|                                  // Create a file object to the folder containing the class file. Note that we need to | ||||
|                                  // ultimately instantiate objects from a class loaded by the same class loader that | ||||
|                                  // loads the AuthMechanism class to avoid ClassCastExceptions. | ||||
|                                  File mechClassPathFile = new File(classPath); | ||||
|                                  System.err.println("Authenticate.init()- Mechanism path = " + mechClassPathFile); | ||||
|                                  try | ||||
|                                  { | ||||
|                                     URL methClassPathUrl = mechClassPathFile.toURL(); | ||||
|                                     URL[] urls = new URL[]{methClassPathUrl}; | ||||
|  | ||||
|                                     // Create a class loader for the folder | ||||
|                                     ClassLoader customClassLoader = new URLClassLoader(urls); | ||||
|  | ||||
|                                     // Load the mech class using our custom loader | ||||
|                                     Class mechClass = customClassLoader.loadClass(mechClassName); | ||||
|                                     FileOutputStream fos = new FileOutputStream(svcConfig.getSetting(SvcConfig.AppRootPath) + "tmp"); | ||||
|                                     ObjectOutputStream oos = new ObjectOutputStream(fos); | ||||
|                                     oos.writeObject(mechClass); | ||||
|                                     oos.close(); | ||||
|                                     fos.close(); | ||||
|                                     FileInputStream fis = new FileInputStream(svcConfig.getSetting(SvcConfig.AppRootPath) + "tmp"); | ||||
|                                     ObjectInputStream ois = new ObjectInputStream(fis); | ||||
|                                     mechClass = (Class) ois.readObject(); | ||||
|                                     ois.close(); | ||||
|                                     fis.close(); | ||||
|  | ||||
|                                     // Now reload the class using the class loader for our AuthMechanism class | ||||
|                                     AuthMechanism mechanism = (AuthMechanism) mechClass.newInstance(); | ||||
|                                     mechanism.init(svcConfig, mechConfig); | ||||
|                                     m_authMechanismMap.put(mechanism.getId(), mechanism); | ||||
|                                  } | ||||
|                                  catch (MalformedURLException e) | ||||
|                                  { | ||||
|                                     System.err.println("Authenticate.init()- MalformedURLException for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                                  } | ||||
|                                  catch (ClassNotFoundException e) | ||||
|                                  { | ||||
|                                     System.err.println("Authenticate.init()- ClassNotFoundException for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                                  } | ||||
|                                  catch (InstantiationException e) | ||||
|                                  { | ||||
|                                     System.err.println("Authenticate.init()- InstantiationException for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                                  } | ||||
|                                  catch (IllegalAccessException e) | ||||
|                                  { | ||||
|                                     System.err.println("Authenticate.init()- IllegalAccessException for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                                  } | ||||
|                               } | ||||
|                               else | ||||
|                               { | ||||
|                                  System.err.println("Authenticate.init()- No configuration to find class path to load "  + mechanismFolder + File.separator + m_mechanismSettingsFileName); | ||||
|                               } | ||||
|                            } | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                            System.err.println("Authenticate.init()- No configured mechanism class name for "  + mechanismFolder + File.separator + m_mechanismSettingsFileName); | ||||
|                         } | ||||
|                      } | ||||
|                      catch (SecurityException e) | ||||
|                      { | ||||
|                         System.err.println("Authenticate.init()- SecurityException accessing " + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                      } | ||||
|                      catch (FileNotFoundException e) | ||||
|                      { | ||||
|                         System.err.println("Authenticate.init()- No authentication policy file for " + mechanismFolder); | ||||
|                      } | ||||
|                      catch (IOException e) | ||||
|                      { | ||||
|                         System.err.println("Authenticate.init()- IOException reading " + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                      } | ||||
|                      catch (Exception e) | ||||
|                      { | ||||
|                         System.err.println("Authenticate.init()- Exception instantiating mechConfig or mechanism " + mechanismFolder + File.separator + m_mechanismSettingsFileName + " Exception=" + e.toString()); | ||||
|                      } | ||||
|                   } | ||||
|                } | ||||
|                catch (SecurityException e) | ||||
|                { | ||||
|                   System.err.println("Authenticate.init()- SecurityException accessing " + mechanismFolder + " Exception=" + e.toString()); | ||||
|                } | ||||
|             } | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             System.err.println("Authenticate.init()- Unable to obtain mechanisms folder " + mechanismsConfigFolder + " objects"); | ||||
|          } | ||||
|       } | ||||
|       catch (SecurityException e) | ||||
|       { | ||||
|          System.err.println("Authenticate.init()- SecurityException accessing " + mechanismsConfigFolder + " Exception=" + e.toString()); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Process Rpc. | ||||
|     */ | ||||
|    public void invoke(InputStream inStream, PrintWriter out) throws IOException | ||||
|    { | ||||
|       try | ||||
|       { | ||||
|          System.err.println("Authenticate.invoke()"); | ||||
|  | ||||
|          // Parse the AuthReqMsg sent from the client | ||||
|          AuthReqMsg authReqMsg = new AuthReqMsg(inStream); | ||||
|  | ||||
|          // Get the necessary authentication mechanism | ||||
|          AuthMechanism authMechanism = (AuthMechanism) m_authMechanismMap.get(authReqMsg.getMechanismId()); | ||||
|          if (authMechanism != null) | ||||
|          { | ||||
|             // Invoke the mechanism to authenticate the entity | ||||
|             String identId = authMechanism.invoke(authReqMsg); | ||||
|  | ||||
|             // Create response based on the identity resolution results | ||||
|             if (identId != null && identId.length() != 0) | ||||
|             { | ||||
|                System.err.println("Authenticate.invoke()- identId resolved, " + identId); | ||||
|  | ||||
|                // An identity was resolved, get a SessionToken for it. | ||||
|                SessionToken sessionToken = new SessionToken(identId, | ||||
|                                                             authReqMsg.getRealm(), | ||||
|                                                             m_svcConfig.getSetting(SvcConfig.SessionTokenLifetime)); | ||||
|  | ||||
|                // Write out the response | ||||
|                AuthRespMsg authRespMsg = new AuthRespMsg(ProtoDefs.httpOkStatusMsg, | ||||
|                                                          ProtoDefs.httpOkStatusCode, | ||||
|                                                          sessionToken.toString(), | ||||
|                                                          m_svcConfig.getSetting(SvcConfig.SessionTokenLifetime)); | ||||
|                // tbd - Convert to ints, perform calculation, and then convert result to string | ||||
|                //m_svcConfig.getSetting(SvcConfig.SessionTokenLifetime) | ||||
|                //- m_svcConfig.getSetting(SvcConfig.LifetimeShorter)); | ||||
|                out.println(authRespMsg.toString()); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                System.err.println("Authenticate.invoke()- identId not resolved"); | ||||
|  | ||||
|                // Write out the response | ||||
|                AuthRespMsg authRespMsg = new AuthRespMsg(ProtoDefs.httpUnauthorizedStatusMsg, | ||||
|                                                          ProtoDefs.httpUnauthorizedStatusCode); | ||||
|                out.println(authRespMsg.toString()); | ||||
|             } | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             System.err.println("Authenticate.invoke()- Unsupported mechanism " + authReqMsg.getMechanismId()); | ||||
|  | ||||
|             // Write out the response | ||||
|             AuthRespMsg authRespMsg = new AuthRespMsg(ProtoDefs.httpNotFoundStatusMsg, | ||||
|                                                       ProtoDefs.httpNotFoundStatusCode); | ||||
|             out.println(authRespMsg.toString()); | ||||
|          } | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          System.err.println("Authenticate.invoke()- Exception: " + e.toString());  | ||||
|  | ||||
|          // Write out the response | ||||
|          try | ||||
|          { | ||||
|             AuthRespMsg authRespMsg = new AuthRespMsg(ProtoDefs.httpServerErrorStatusMsg, | ||||
|                                                       ProtoDefs.httpServerErrorStatusCode); | ||||
|             out.println(authRespMsg.toString()); | ||||
|          } | ||||
|          catch (Exception e2) | ||||
|          { | ||||
|             System.err.println("Authenticate.invoke()- Exception trying to construct response msg: " + e2.toString());  | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Return the method id. | ||||
|     */ | ||||
|    public String getId() | ||||
|    { | ||||
|       return "Authenticate"; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,121 @@ | ||||
| /************************************************************************** | ||||
| * | ||||
| * A Base64 Encoder/Decoder. | ||||
| * | ||||
| * This class is used to encode and decode data in Base64 format | ||||
| * as described in RFC 1521. | ||||
| * | ||||
| * <p> | ||||
| * Copyright 2003: Christian d'Heureuse, Inventec Informatik AG, Switzerland.<br> | ||||
| * License: This is "Open Source" software and released under the <a href="http://www.gnu.org/licenses/lgpl.html" target="_top">GNU/LGPL</a> license. | ||||
| * It is provided "as is" without warranty of any kind. Please contact the author for other licensing arrangements.<br> | ||||
| * Home page: <a href="http://www.source-code.biz" target="_top">www.source-code.biz</a><br> | ||||
| * | ||||
| * <p> | ||||
| * Version history:<br> | ||||
| * 2003-07-22 Christian d'Heureuse (chdh): Module created.<br> | ||||
| * 2005-08-11 chdh: Lincense changed from GPL to LGPL. | ||||
| * | ||||
| **************************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| public class Base64Coder { | ||||
|  | ||||
| // Mapping table from 6-bit nibbles to Base64 characters. | ||||
| private static char[]    map1 = new char[64]; | ||||
|    static { | ||||
|       int i=0; | ||||
|       for (char c='A'; c<='Z'; c++) map1[i++] = c; | ||||
|       for (char c='a'; c<='z'; c++) map1[i++] = c; | ||||
|       for (char c='0'; c<='9'; c++) map1[i++] = c; | ||||
|       map1[i++] = '+'; map1[i++] = '/'; } | ||||
|  | ||||
| // Mapping table from Base64 characters to 6-bit nibbles. | ||||
| private static byte[]    map2 = new byte[128]; | ||||
|    static { | ||||
|       for (int i=0; i<map2.length; i++) map2[i] = -1; | ||||
|       for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; } | ||||
|  | ||||
| /** | ||||
| * Encodes a string into Base64 format. | ||||
| * No blanks or line breaks are inserted. | ||||
| * @param s  a String to be encoded. | ||||
| * @return   A String with the Base64 encoded data. | ||||
| */ | ||||
| public static String encode (String s) { | ||||
|    return new String(encode(s.getBytes())); } | ||||
|  | ||||
| /** | ||||
| * Encodes a byte array into Base64 format. | ||||
| * No blanks or line breaks are inserted. | ||||
| * @param in  an array containing the data bytes to be encoded. | ||||
| * @return    A character array with the Base64 encoded data. | ||||
| */ | ||||
| public static char[] encode (byte[] in) { | ||||
|    int iLen = in.length; | ||||
|    int oDataLen = (iLen*4+2)/3;       // output length without padding | ||||
|    int oLen = ((iLen+2)/3)*4;         // output length including padding | ||||
|    char[] out = new char[oLen]; | ||||
|    int ip = 0; | ||||
|    int op = 0; | ||||
|    while (ip < iLen) { | ||||
|       int i0 = in[ip++] & 0xff; | ||||
|       int i1 = ip < iLen ? in[ip++] & 0xff : 0; | ||||
|       int i2 = ip < iLen ? in[ip++] & 0xff : 0; | ||||
|       int o0 = i0 >>> 2; | ||||
|       int o1 = ((i0 &   3) << 4) | (i1 >>> 4); | ||||
|       int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6); | ||||
|       int o3 = i2 & 0x3F; | ||||
|       out[op++] = map1[o0]; | ||||
|       out[op++] = map1[o1]; | ||||
|       out[op] = op < oDataLen ? map1[o2] : '='; op++; | ||||
|       out[op] = op < oDataLen ? map1[o3] : '='; op++; } | ||||
|    return out; } | ||||
|  | ||||
| /** | ||||
| * Decodes a Base64 string. | ||||
| * @param s  a Base64 String to be decoded. | ||||
| * @return   A String containing the decoded data. | ||||
| * @throws   IllegalArgumentException if the input is not valid Base64 encoded data. | ||||
| */ | ||||
| public static String decode (String s) { | ||||
|    return new String(decode(s.toCharArray())); } | ||||
|  | ||||
| /** | ||||
| * Decodes Base64 data. | ||||
| * No blanks or line breaks are allowed within the Base64 encoded data. | ||||
| * @param in  a character array containing the Base64 encoded data. | ||||
| * @return    An array containing the decoded data bytes. | ||||
| * @throws    IllegalArgumentException if the input is not valid Base64 encoded data. | ||||
| */ | ||||
| public static byte[] decode (char[] in) { | ||||
|    int iLen = in.length; | ||||
|    if (iLen%4 != 0) throw new IllegalArgumentException ("Length of Base64 encoded input string is not a multiple of 4."); | ||||
|    while (iLen > 0 && in[iLen-1] == '=') iLen--; | ||||
|    int oLen = (iLen*3) / 4; | ||||
|    byte[] out = new byte[oLen]; | ||||
|    int ip = 0; | ||||
|    int op = 0; | ||||
|    while (ip < iLen) { | ||||
|       int i0 = in[ip++]; | ||||
|       int i1 = in[ip++]; | ||||
|       int i2 = ip < iLen ? in[ip++] : 'A'; | ||||
|       int i3 = ip < iLen ? in[ip++] : 'A'; | ||||
|       if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127) | ||||
|          throw new IllegalArgumentException ("Illegal character in Base64 encoded data."); | ||||
|       int b0 = map2[i0]; | ||||
|       int b1 = map2[i1]; | ||||
|       int b2 = map2[i2]; | ||||
|       int b3 = map2[i3]; | ||||
|       if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0) | ||||
|          throw new IllegalArgumentException ("Illegal character in Base64 encoded data."); | ||||
|       int o0 = ( b0       <<2) | (b1>>>4); | ||||
|       int o1 = ((b1 & 0xf)<<4) | (b2>>>2); | ||||
|       int o2 = ((b2 &   3)<<6) |  b3; | ||||
|       out[op++] = (byte)o0; | ||||
|       if (op<oLen) out[op++] = (byte)o1; | ||||
|       if (op<oLen) out[op++] = (byte)o2; } | ||||
|    return out; } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,774 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.ByteArrayInputStream; | ||||
| import java.util.HashSet; | ||||
| import java.util.Hashtable; | ||||
| import java.util.Set; | ||||
|  | ||||
| import javax.naming.Context; | ||||
| import javax.naming.NamingEnumeration; | ||||
| import javax.naming.NamingException; | ||||
| import javax.naming.directory.Attributes; | ||||
| import javax.naming.directory.DirContext; | ||||
| import javax.naming.directory.InitialDirContext; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
| import org.bandit.ia.IAContext; | ||||
|  | ||||
| /* | ||||
|  * CasaIdentityToken Class. | ||||
|  *  | ||||
|  * This class constructs Casa Identity tokens. | ||||
|  *  | ||||
|  * A Casa Identity Token is a simple XML Document | ||||
|  * with information about an identity in the form | ||||
|  * of: | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <casa_ident_tok> | ||||
|  * <id>identity id</id> | ||||
|  * <source_name>identity data source name</source_name> | ||||
|  * <source_url>identity data source url</source_url> | ||||
|  * <target_service>target service name</target_service> | ||||
|  * <target_host>target host name</target_host> | ||||
|  * <attributes> | ||||
|  * <attribute name>attribute value</attribute name> | ||||
|  * <attribute2 name>attribute2 value</attribute name> | ||||
|  * ...  | ||||
|  * </attributes> | ||||
|  * </casa_ident_tok> | ||||
|  *   | ||||
|  *   | ||||
|  *  attribute/values pairs. The attribute names | ||||
|  * being the XML elements of the documents. | ||||
|  *  | ||||
|  */ | ||||
| public class CasaIdentityToken implements IdentityToken | ||||
| { | ||||
|    /* | ||||
|     * XML Element Name Constants for the documents exchanged between the | ||||
|     * Casa Client and the Casa Server. | ||||
|     */ | ||||
|    private final static String casaIdentTokElementName = "casa_ident_tok"; | ||||
|    private final static String idElementName = "id"; | ||||
|    private final static String sourceNameElementName = "source_name"; | ||||
|    private final static String sourceUrlElementName = "source_url"; | ||||
|    private final static String targetServiceElementName = "target_service"; | ||||
|    private final static String targetHostElementName = "target_host"; | ||||
|    private final static String attributesElementName = "attributes"; | ||||
|  | ||||
|    private IdenTokenConfig m_idenTokenConfig; | ||||
|  | ||||
|    private String m_identityId = null; | ||||
|    private String m_sourceName = null; | ||||
|    private String m_sourceUrl = null; | ||||
|    private String m_service = null; | ||||
|    private String m_host = null; | ||||
|    private String m_token = null; | ||||
|    private javax.naming.directory.Attributes m_attributes = null; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling Authentication Request parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_ROOT_ELEMENT_END = 1; | ||||
|       private final static int AWAITING_ID_ELEMENT_START = 2; | ||||
|       private final static int AWAITING_ID_ELEMENT_END = 3; | ||||
|       private final static int AWAITING_ID_DATA = 4; | ||||
|       private final static int AWAITING_SOURCE_NAME_ELEMENT_START = 5; | ||||
|       private final static int AWAITING_SOURCE_NAME_ELEMENT_END = 6; | ||||
|       private final static int AWAITING_SOURCE_NAME_DATA = 7; | ||||
|       private final static int AWAITING_SOURCE_URL_ELEMENT_START = 8; | ||||
|       private final static int AWAITING_SOURCE_URL_ELEMENT_END = 9; | ||||
|       private final static int AWAITING_SOURCE_URL_DATA = 10; | ||||
|       private final static int AWAITING_TARGET_SERVICE_ELEMENT_START = 11; | ||||
|       private final static int AWAITING_TARGET_SERVICE_ELEMENT_END = 12; | ||||
|       private final static int AWAITING_TARGET_SERVICE_DATA = 13; | ||||
|       private final static int AWAITING_TARGET_HOST_ELEMENT_START = 14; | ||||
|       private final static int AWAITING_TARGET_HOST_ELEMENT_END = 15; | ||||
|       private final static int AWAITING_TARGET_HOST_DATA = 16; | ||||
|       private final static int AWAITING_ATTRIBUTES_ELEMENT_START = 17; | ||||
|       private final static int AWAITING_ATTRIBUTE_START = 18; | ||||
|       private final static int AWAITING_ATTRIBUTE_END = 19; | ||||
|       private final static int AWAITING_ATTRIBUTE_DATA = 20; | ||||
|       private final static int AWAITING_BINARY_ATTRIBUTE_DATA = 21; | ||||
|       private final static int DONE_PARSING = 22; | ||||
|  | ||||
|       private CasaIdentityToken  m_casaIdentToken; | ||||
|       private int          m_state; | ||||
|       private String          m_currAttribute; | ||||
|       private boolean         m_encryptedAttrs; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler (CasaIdentityToken casaIdentityToken) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_casaIdentToken = casaIdentityToken; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we obtained all of the required elements | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("CasaIdentityToken SAXHandler.endDocument()- Missing element");  | ||||
|             throw new SAXException("Missing element"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        *  | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (casaIdentTokElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ID_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_ID_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (idElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ID_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SOURCE_NAME_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (sourceNameElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SOURCE_NAME_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|  | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SOURCE_URL_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (sourceUrlElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SOURCE_URL_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TARGET_SERVICE_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (targetServiceElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_TARGET_SERVICE_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TARGET_HOST_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (targetHostElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_TARGET_HOST_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_ATTRIBUTES_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (attributesElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ATTRIBUTE_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_ATTRIBUTE_START: | ||||
|                // Save the element name as the current attribute | ||||
|                m_currAttribute = qName; | ||||
|  | ||||
|                // Advance to the next state based on the attribute type | ||||
|                String attrType = atts.getValue("type"); | ||||
|                if (attrType != null && attrType.equals("binary")) | ||||
|                { | ||||
|                   // We are dealing with a binary attribute. We are going to | ||||
|                   // assume that binary attributes are always base64 encoded. | ||||
|                   m_state = AWAITING_BINARY_ATTRIBUTE_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   // Assume we are dealing with an attribute of type string | ||||
|                   m_state = AWAITING_ATTRIBUTE_DATA; | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("CasaIdentityToken SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (casaIdentTokElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_ID_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (idElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SOURCE_NAME_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SOURCE_NAME_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (sourceNameElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SOURCE_URL_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SOURCE_URL_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (sourceUrlElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_TARGET_SERVICE_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TARGET_SERVICE_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (targetServiceElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_TARGET_HOST_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TARGET_HOST_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (targetHostElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ATTRIBUTES_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_ATTRIBUTE_END: | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_ATTRIBUTE_START; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_ATTRIBUTE_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (attributesElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ROOT_ELEMENT_END; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("CasaIdentityToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("CasaIdentityToken SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ID_DATA: | ||||
|                // Consume the data | ||||
|                m_casaIdentToken.m_identityId = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_ID_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SOURCE_NAME_DATA: | ||||
|                // Consume the data | ||||
|                m_casaIdentToken.m_sourceName = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SOURCE_NAME_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SOURCE_URL_DATA: | ||||
|                // Consume the data | ||||
|                m_casaIdentToken.m_sourceUrl = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SOURCE_URL_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TARGET_SERVICE_DATA: | ||||
|                // Consume the data | ||||
|                m_casaIdentToken.m_service = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_TARGET_SERVICE_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_TARGET_HOST_DATA: | ||||
|                // Consume the data | ||||
|                m_casaIdentToken.m_host = new String(ch, start, length); | ||||
|  | ||||
|                // At this point we now have the target service and host names, | ||||
|                // check if our configuration says that the attributes have been | ||||
|                // encrypted. | ||||
|                // tbd - Need to come up with a solution for obtaining configuration | ||||
|                // information when instanstiated using a stream. May be the token should | ||||
|                // carry an indication that the attributes are encrypted. | ||||
|                m_encryptedAttrs = false; | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_TARGET_HOST_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_ATTRIBUTE_DATA: | ||||
|                // Consume the data | ||||
|                // | ||||
|                // Decrypt the attribute data if necessary | ||||
|                if (m_encryptedAttrs) | ||||
|                { | ||||
|                   // tbd - Decrypt the attribute key and value with the private key of the service | ||||
|                   // using the configured mechanism. | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   m_casaIdentToken.m_attributes.put(m_currAttribute, new String(ch, start, length)); | ||||
|                } | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_ATTRIBUTE_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_BINARY_ATTRIBUTE_DATA: | ||||
|                // Consume the data | ||||
|                // | ||||
|                // Decrypt the attribute data if necessary | ||||
|                if (m_encryptedAttrs) | ||||
|                { | ||||
|                   // tbd - Decrypt the attribute key and value with the private key of the service | ||||
|                   // using the configured mechanism. | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   // The data is base64 encoded | ||||
|                   char[] encodedChars = new char[length]; | ||||
|                   System.arraycopy(ch, start, encodedChars, 0, length); | ||||
|                   m_casaIdentToken.m_attributes.put(m_currAttribute, Base64Coder.decode(encodedChars)); | ||||
|                } | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_ATTRIBUTE_END; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                // Do nothing | ||||
|                break; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public CasaIdentityToken (IdenTokenConfig idenTokenConfig) | ||||
|    { | ||||
|       // Initialize our members | ||||
|       m_token = null; | ||||
|       m_attributes = new javax.naming.directory.BasicAttributes(); | ||||
|       m_idenTokenConfig = idenTokenConfig; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public CasaIdentityToken () | ||||
|    { | ||||
|       // Initialize our members | ||||
|       m_token = null; | ||||
|       m_attributes = new javax.naming.directory.BasicAttributes(); | ||||
|       m_idenTokenConfig = null; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Initialize with parameters. | ||||
|     */ | ||||
|    public void initialize (String identityId, | ||||
|                            String sourceName, | ||||
|                            String targetService, | ||||
|                            String targetHost, | ||||
|                            SvcConfig svcConfig) throws Exception | ||||
|    { | ||||
|       // Save input parameters | ||||
|       m_identityId = identityId; | ||||
|       m_sourceName = sourceName; | ||||
|       m_sourceUrl = "ldap://myldaphost.novell.com:389"; // tbd - Obtain from Identity Abstraction layer | ||||
|       m_service = targetService; | ||||
|       m_host = targetHost; | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          // Open a directory context and use it to read the identity attributes. | ||||
|          Hashtable env = new Hashtable(); | ||||
|          env.put(Context.INITIAL_CONTEXT_FACTORY, "org.bandit.ia.IAInitialCtxFactory"); | ||||
|          env.put(IAContext.IA_REALM_CONFIG_LOCATION, svcConfig.getSetting(SvcConfig.IdentityAbstractionConfigFile)); | ||||
|          env.put(IAContext.IA_REALM_SELECTOR, sourceName); | ||||
|  | ||||
|          DirContext ctx = new InitialDirContext(env); | ||||
|  | ||||
|          // Setup a string buffer for building the IdentityToken, notice for now | ||||
|          // we are not going to wrap the identity token. | ||||
|          StringBuffer sb = new StringBuffer(); | ||||
|          sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|          sb.append("<" + casaIdentTokElementName + ">" + "\r\n"); | ||||
|          sb.append("<" + idElementName + ">" + identityId + "</" + idElementName + ">\r\n"); | ||||
|          sb.append("<" + sourceNameElementName + ">" + sourceName + "</" + sourceNameElementName + ">\r\n"); | ||||
|          sb.append("<" + sourceUrlElementName + ">" + m_sourceUrl + "</" + sourceUrlElementName + ">\r\n"); | ||||
|          sb.append("<" + targetServiceElementName + ">" + m_service + "</" + targetServiceElementName + ">\r\n"); | ||||
|          sb.append("<" + targetHostElementName + ">" + m_host + "</" + targetHostElementName + ">\r\n"); | ||||
|          sb.append("<" + attributesElementName + ">" + "\r\n"); | ||||
|  | ||||
|          // Get the necessary attributes of the specified services in the identity token | ||||
|          String[] attributesNeeded  = m_idenTokenConfig.getAttributes(); | ||||
|          boolean encryptAttributes = "true".equals(m_idenTokenConfig.getSetting(IdenTokenConfig.EncryptAttributes)); | ||||
|          Attributes attrs = ctx.getAttributes(identityId, attributesNeeded); | ||||
|  | ||||
|          // Now append the attributes to the token | ||||
|          for (NamingEnumeration ae = attrs.getAll(); ae.hasMore();) | ||||
|          { | ||||
|             javax.naming.directory.Attribute attr = (javax.naming.directory.Attribute) ae.next(); | ||||
|  | ||||
|             NamingEnumeration enumeration = attr.getAll(); | ||||
|             while (enumeration.hasMore()) | ||||
|             { | ||||
|                Object attrValue = enumeration.next(); | ||||
|                m_attributes.put(attr.getID(), attrValue); | ||||
|                System.err.println("CasaIdentityToken.initialize()- Including attribute " + attr.getID()); | ||||
|  | ||||
|                // Encrypt the attribute if necessary | ||||
|                if (encryptAttributes == true) | ||||
|                { | ||||
|                   // tbd - Encrypt the attributes using the services public key, let the mechanism | ||||
|                   // be configurable. The service's certificate should be Base64 encoded as a setting | ||||
|                   // of the identoken.settings file. | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   // Proceed based on the attribute value type | ||||
|                   if (attrValue instanceof byte[]) | ||||
|                   { | ||||
|                      // The attribute value is of type byte[], we need to encode it. | ||||
|                      sb.append("<" + attr.getID() + " type=\"binary\" encoding=\"base64\">" + new String(Base64Coder.encode((byte[]) attrValue)) + "</" + attr.getID() + ">" + "\r\n"); | ||||
|                      System.err.println("Attribute " + attr.getID() + "included as " + new String(Base64Coder.encode((byte[]) attrValue))); | ||||
|                   } | ||||
|                   else | ||||
|                   { | ||||
|                      // Assume the attribute value is of type String | ||||
|                      sb.append("<" + attr.getID() + ">" + (String) attrValue + "</" + attr.getID() + ">" + "\r\n"); | ||||
|                   } | ||||
|                } | ||||
|             } | ||||
|          } | ||||
|          sb.append("</" + attributesElementName + ">" + "\r\n"); | ||||
|          sb.append("</" + casaIdentTokElementName + ">" + "\r\n"); | ||||
|  | ||||
|          m_token = sb.toString(); | ||||
|       } | ||||
|       catch (NamingException e) | ||||
|       { | ||||
|          // tbd - Log the event??? | ||||
|          System.err.println("CasaIdentityToken.initialize()- Exception: " + e.getExplanation()); | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          // tbd | ||||
|          System.err.println("CasaIdentityToken.initialize()- Exception: " + e.toString());  | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Initialize the token object with an ecoded token string. | ||||
|     */ | ||||
|    public void initialize (String encodedToken) throws Exception | ||||
|    { | ||||
|       // Save copy of the token | ||||
|       m_token = Base64Coder.decode(encodedToken); | ||||
|  | ||||
|       // Now parse the token into its elements | ||||
|       try | ||||
|       { | ||||
|          // Parse the AuthReqMsg | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(this); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|  | ||||
|  | ||||
|          ByteArrayInputStream inStream = new ByteArrayInputStream(m_token.getBytes()); | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|          // tbd - Log this. | ||||
|          System.err.println("CasaIdentityToken()- Parse exception: " + e.toString()); | ||||
|          throw new Exception("Token error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns encoded token string. | ||||
|     *  | ||||
|     * IMPORTANT: The token string can not contain the substring "]]>" | ||||
|     * within it. | ||||
|     */ | ||||
|    public String getEncodedToken () throws Exception | ||||
|    { | ||||
|       if (m_token != null) | ||||
|       { | ||||
|          return Base64Coder.encode(m_token); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          System.err.println("CasaIdentityToken.toString()- Not initialized"); | ||||
|          throw new Exception("Not initialized"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing our type of identity token provider. | ||||
|     */ | ||||
|    public String getProviderType () throws Exception | ||||
|    { | ||||
|       // tbd - Change to a GUID | ||||
|       return "CasaIdentityToken"; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the identity id. | ||||
|     */ | ||||
|    public String getIdentityId () throws Exception | ||||
|    { | ||||
|       if (m_identityId != null) | ||||
|          return m_identityId; | ||||
|       else | ||||
|       { | ||||
|          System.err.println("CasaIdentityToken.getIdentityId()- Not initialized"); | ||||
|          throw new Exception("Not initialized"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the name associated with the | ||||
|     * identity source. | ||||
|     */ | ||||
|    public String getSourceName () throws Exception | ||||
|    { | ||||
|       if (m_sourceName != null) | ||||
|          return m_sourceName; | ||||
|       else | ||||
|       { | ||||
|          System.err.println("CasaIdentityToken.getSourceName()- Not initialized"); | ||||
|          throw new Exception("Not initialized"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the url associated with the | ||||
|     * identity source. | ||||
|     */ | ||||
|    public String getSourceUrl () throws Exception | ||||
|    { | ||||
|       if (m_sourceUrl != null) | ||||
|          return m_sourceUrl; | ||||
|       else | ||||
|       { | ||||
|          System.err.println("CasaIdentityToken.getSourceUrl()- Not initialized"); | ||||
|          throw new Exception("Not initialized"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the name of the targeted service. | ||||
|     */ | ||||
|    public String getTargetService () throws Exception | ||||
|    { | ||||
|       if (m_service != null) | ||||
|          return m_service; | ||||
|       else | ||||
|       { | ||||
|          System.err.println("CasaIdentityToken.getTargetService()- Not initialized"); | ||||
|          throw new Exception("Not initialized"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containig the name of the host where the | ||||
|     * targeted service resides. | ||||
|     */ | ||||
|    public String getTargetHost () throws Exception | ||||
|    { | ||||
|       if (m_host != null) | ||||
|          return m_host; | ||||
|       else | ||||
|       { | ||||
|          System.err.println("CasaIdentityToken.getTargetHost()- Not initialized"); | ||||
|          throw new Exception("Not initialized"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the attributes of the identity. | ||||
|     */ | ||||
|    public javax.naming.directory.Attributes getAttributes () throws Exception | ||||
|    { | ||||
|       if (m_attributes != null) | ||||
|          return m_attributes; | ||||
|       else | ||||
|       { | ||||
|          System.err.println("CasaIdentityToken.getIdentityAttributes()- Not initialized"); | ||||
|          throw new Exception("Not initialized"); | ||||
|       } | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,388 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.util.*; | ||||
|  | ||||
| /** | ||||
|  * EnabledSvcsConfig Class. | ||||
|  *  | ||||
|  * This class obtains and maintains configuration and policy information about | ||||
|  * the services enabled to use Authentication Tokens. | ||||
|  *  | ||||
|  */ | ||||
| public class EnabledSvcsConfig | ||||
| { | ||||
|    private static final String m_authPolicyFileName = "auth.policy"; | ||||
|    private static final String m_authTokenSettingsFileName = "authtoken.settings"; | ||||
|    private static final String m_idenTokenSettingsFileName = "identoken.settings"; | ||||
|  | ||||
|    private Map m_hostsMap; | ||||
|  | ||||
|    /** | ||||
|     * SvcConfigEntry Class. | ||||
|     *  | ||||
|     * This class is used to maintain the configuration and policy associated with an | ||||
|     * enabled service. | ||||
|     *  | ||||
|     */ | ||||
|    private class SvcConfigEntry | ||||
|    { | ||||
|       protected byte[]           m_authPolicyFileData; | ||||
|       protected AuthTokenConfig  m_authTokenConfig; | ||||
|       protected IdenTokenConfig  m_idenTokenConfig; | ||||
|  | ||||
|       /* | ||||
|        * Constructor. | ||||
|        */ | ||||
|       public SvcConfigEntry(byte[] authPolicyFileData, | ||||
|                             AuthTokenConfig authTokenConfig, | ||||
|                             IdenTokenConfig idenTokenConfig) | ||||
|       { | ||||
|          m_authPolicyFileData = authPolicyFileData; | ||||
|          m_authTokenConfig = authTokenConfig; | ||||
|          m_idenTokenConfig = idenTokenConfig; | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public EnabledSvcsConfig(String svcConfigPath) throws Exception | ||||
|    { | ||||
|       System.err.println("EnabledSvcsConfig()-"); | ||||
|       System.err.println("EnabledSvcsConfig()- SvcConfigPath = " + svcConfigPath); | ||||
|  | ||||
|       // Initialize the default auth policy, authtoken, and identtoken configs. | ||||
|       byte[] defaultAuthPolicyData = null; | ||||
|       AuthTokenConfig defaultAuthTokenConfig = null; | ||||
|       IdenTokenConfig defaultIdenTokenConfig = null; | ||||
|  | ||||
|       // Create a map to keep track of the enabled services and their configuration | ||||
|       // for each configured host. | ||||
|       m_hostsMap = new HashMap(); | ||||
|  | ||||
|       // Get access to the configuration folder for the service | ||||
|       File configFolder = new File(svcConfigPath); | ||||
|       try | ||||
|       { | ||||
|          // Try to obtain the default authentication policy | ||||
|          try | ||||
|          { | ||||
|             File f = new File(configFolder, m_authPolicyFileName); | ||||
|             defaultAuthPolicyData = new byte[(int) f.length()]; | ||||
|             FileInputStream inStream = new FileInputStream(f); | ||||
|             int bytesRead = inStream.read(defaultAuthPolicyData); | ||||
|             inStream.close(); | ||||
|             if (bytesRead != defaultAuthPolicyData.length) | ||||
|             { | ||||
|                System.err.println("EnabledSvcsConfig()- Error reading default policy file"); | ||||
|             } | ||||
|          } | ||||
|          catch (SecurityException e) | ||||
|          { | ||||
|             System.err.println("EnabledSvcsConfig()- SecurityException accessing " + configFolder + File.separator + m_authPolicyFileName + " Exception=" + e.toString()); | ||||
|          } | ||||
|          catch (FileNotFoundException e) | ||||
|          { | ||||
|             System.err.println("EnabledSvcsConfig()- File " + configFolder + File.separator + m_authPolicyFileName + " not found"); | ||||
|          } | ||||
|          catch (IOException e) | ||||
|          { | ||||
|             System.err.println("EnabledSvcsConfig()- IOException reading " + configFolder + File.separator + m_authPolicyFileName + " Exception=" + e.toString()); | ||||
|          } | ||||
|  | ||||
|          // Try to obtain the default authentication token settings | ||||
|          try | ||||
|          { | ||||
|             defaultAuthTokenConfig = new AuthTokenConfig(configFolder + File.separator + m_authTokenSettingsFileName); | ||||
|          } | ||||
|          catch (Exception e) | ||||
|          { | ||||
|             // Not able to create authentication token configuration using the default | ||||
|             // file. Create one using default parameters. | ||||
|             defaultAuthTokenConfig = new AuthTokenConfig(); | ||||
|          } | ||||
|  | ||||
|          // Try to obtain the default identity token settings | ||||
|          try | ||||
|          { | ||||
|             defaultIdenTokenConfig = new IdenTokenConfig(configFolder + File.separator + m_idenTokenSettingsFileName); | ||||
|          } | ||||
|          catch (Exception e) | ||||
|          { | ||||
|             // Not able to create identity token configuration using the default | ||||
|             // file. Create one using default parameters. | ||||
|             defaultIdenTokenConfig = new IdenTokenConfig(); | ||||
|          } | ||||
|  | ||||
|          // Now go through the configured hosts. Note that the services config folder | ||||
|          // contains folders for each host for which there are enabled services. The folders | ||||
|          // in the services config folder must match the DNS name of the hosts where | ||||
|          // the enabled services reside. | ||||
|          File servicesConfigFolder = new File(svcConfigPath, "enabled_services"); | ||||
|          try | ||||
|          { | ||||
|             String[] servicesConfigFolderObjs = servicesConfigFolder.list(); | ||||
|             if (servicesConfigFolderObjs != null) | ||||
|             { | ||||
|                for (int i = 0; i < servicesConfigFolderObjs.length; i++) | ||||
|                { | ||||
|                   // Check if we are dealing with a file or a folder | ||||
|                   File hostFolder = new File(servicesConfigFolder, servicesConfigFolderObjs[i]); | ||||
|                   try | ||||
|                   { | ||||
|                      if (hostFolder.isDirectory() == true) | ||||
|                      { | ||||
|                         System.err.println("EnabledSvcsConfig()- Host folder " + hostFolder + " is directory"); | ||||
|  | ||||
|                         // Now go through the services configured for this host | ||||
|                         String[] hostFolderObjs = hostFolder.list(); | ||||
|                         if (hostFolderObjs != null) | ||||
|                         { | ||||
|                            // Create a Map object to hold the service configurations for this host | ||||
|                            Map enabledSvcsConfigMap = new HashMap(); | ||||
|  | ||||
|                            for (int ii = 0; ii < hostFolderObjs.length; ii++) | ||||
|                            { | ||||
|                               // Check if we are dealing with a file or a folder | ||||
|                               File serviceFolder = new File(hostFolder, hostFolderObjs[ii]); | ||||
|                               System.err.println("EnabledSvcsConfig()- Service folder " + serviceFolder); | ||||
|                               try | ||||
|                               { | ||||
|                                  if (serviceFolder.isDirectory() == true) | ||||
|                                  { | ||||
|                                     System.err.println("EnabledSvcsConfig()- Service folder " + serviceFolder + " is directory"); | ||||
|  | ||||
|                                     // We are dealing with a folder, remember that the folder name matches the name | ||||
|                                     // of the enabled service. Check and see if there are authentication policy and | ||||
|                                     // authtoken and identoken setting files configured for it. | ||||
|                                     byte[] authPolicyData = null; | ||||
|                                     AuthTokenConfig authTokenConfig = null; | ||||
|                                     IdenTokenConfig idenTokenConfig = null; | ||||
|  | ||||
|                                     try | ||||
|                                     { | ||||
|                                        File policyFile = new File(serviceFolder, m_authPolicyFileName); | ||||
|                                        authPolicyData = new byte[(int) policyFile.length()]; | ||||
|                                        FileInputStream inStream = new FileInputStream(policyFile); | ||||
|                                        int bytesRead = inStream.read(authPolicyData); | ||||
|                                        inStream.close(); | ||||
|                                        if (bytesRead != authPolicyData.length) | ||||
|                                        { | ||||
|                                           System.err.println("EnabledSvcsConfig()- Error reading policy file for " + servicesConfigFolderObjs[i] + " " + hostFolderObjs[ii]); | ||||
|                                        } | ||||
|                                     } | ||||
|                                     catch (SecurityException e) | ||||
|                                     { | ||||
|                                        System.err.println("EnabledSvcsConfig()- SecurityException accessing " + serviceFolder + File.separator + m_authPolicyFileName + " Exception=" + e.toString()); | ||||
|                                     } | ||||
|                                     catch (FileNotFoundException e) | ||||
|                                     { | ||||
|                                        System.err.println("EnabledSvcsConfig()- No authentication policy file for " + serviceFolder); | ||||
|                                     } | ||||
|                                     catch (IOException e) | ||||
|                                     { | ||||
|                                        System.err.println("EnabledSvcsConfig()- IOException reading " + serviceFolder + File.separator + m_authPolicyFileName + " Exception=" + e.toString()); | ||||
|                                     } | ||||
|  | ||||
|                                     try | ||||
|                                     { | ||||
|                                        authTokenConfig = new AuthTokenConfig(serviceFolder + File.separator + m_authTokenSettingsFileName); | ||||
|                                     } | ||||
|                                     catch (Exception e) | ||||
|                                     { | ||||
|                                        System.err.println("EnabledSvcsConfig()- Exception accessing " + serviceFolder + File.separator + m_authTokenSettingsFileName + " Exception=" + e.toString()); | ||||
|                                     } | ||||
|  | ||||
|                                     try | ||||
|                                     { | ||||
|                                        idenTokenConfig = new IdenTokenConfig(serviceFolder + File.separator + m_idenTokenSettingsFileName); | ||||
|                                     } | ||||
|                                     catch (Exception e) | ||||
|                                     { | ||||
|                                        System.err.println("EnabledSvcsConfig()- Exception accessing " + serviceFolder + File.separator + m_idenTokenSettingsFileName + " Exception=" + e.toString()); | ||||
|                                     } | ||||
|  | ||||
|                                     // Make sure that we have a policy file | ||||
|                                     if ((authPolicyData != null && authPolicyData.length != 0) | ||||
|                                         || (defaultAuthPolicyData != null && defaultAuthPolicyData.length != 0)) | ||||
|                                     { | ||||
|                                        // Instantiate SvcConfigEntry for this service and place it in our map | ||||
|                                        SvcConfigEntry svcConfigEntry = new SvcConfigEntry((authPolicyData != null && authPolicyData.length != 0) ? authPolicyData : defaultAuthPolicyData, | ||||
|                                                                                           (authTokenConfig != null) ? authTokenConfig : defaultAuthTokenConfig, | ||||
|                                                                                           (idenTokenConfig != null) ? idenTokenConfig : defaultIdenTokenConfig); | ||||
|  | ||||
|                                        // Add this entry to our map | ||||
|                                        System.err.println("EnabledSvcsConfig()- Adding entry in map for " + servicesConfigFolderObjs[i] + " " + hostFolderObjs[ii]); | ||||
|                                        enabledSvcsConfigMap.put(hostFolderObjs[ii], svcConfigEntry); | ||||
|                                     } | ||||
|                                     else | ||||
|                                     { | ||||
|                                        System.err.println("EnabledSvcsConfig()- Unable to enable " + servicesConfigFolderObjs[i] + " " + hostFolderObjs[ii] + " due to no configured authentication policy"); | ||||
|                                     } | ||||
|                                  } | ||||
|                               } | ||||
|                               catch (SecurityException e) | ||||
|                               { | ||||
|                                  System.err.println("EnabledSvcsConfig()- SecurityException accessing " + serviceFolder + " Exception=" + e.toString()); | ||||
|                               } | ||||
|  | ||||
|                               // Add this hosts enabled services configuration map to the hosts map | ||||
|                               m_hostsMap.put(servicesConfigFolderObjs[i], enabledSvcsConfigMap); | ||||
|                            } | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                            System.err.println("EnabledSvcsConfig()- No services configured for " + hostFolder); | ||||
|                         } | ||||
|                      } | ||||
|                   } | ||||
|                   catch (SecurityException e) | ||||
|                   { | ||||
|                      System.err.println("EnabledSvcsConfig()- SecurityException accessing " + hostFolder + " Exception=" + e.toString()); | ||||
|                   } | ||||
|                } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                System.err.println("EnabledSvcsConfig()- Unable to obtain services folder " + servicesConfigFolder + " objects"); | ||||
|             } | ||||
|          } | ||||
|          catch (SecurityException e) | ||||
|          { | ||||
|             System.err.println("EnabledSvcsConfig()- SecurityException accessing " + servicesConfigFolder + " Exception=" + e.toString()); | ||||
|          } | ||||
|       } | ||||
|       catch (SecurityException e) | ||||
|       { | ||||
|          System.err.println("EnabledSvcsConfig()- SecurityException accessing " + configFolder + " Exception=" + e.toString()); | ||||
|       } | ||||
|    }      | ||||
|  | ||||
|    /* | ||||
|     * Returns true if the specified service has been enabled to use authentication | ||||
|     * tokens. | ||||
|     */ | ||||
|    public boolean svcEnabled(String hostName, String serviceName) | ||||
|    { | ||||
|       // First try to obtain the Map of enabled services for the host | ||||
|       // tbd - Should we make this case insensitive? | ||||
|       Map enabledSvcsConfigMap = (Map) m_hostsMap.get(hostName); | ||||
|       if (enabledSvcsConfigMap != null) | ||||
|       { | ||||
|          return enabledSvcsConfigMap.containsKey(serviceName); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          return false; | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the data associated with the authentication policy file | ||||
|     * associated with the specified service. | ||||
|     */ | ||||
|    public byte[] getAuthPolicyFileDataForSvc(String hostName, String serviceName) | ||||
|    { | ||||
|       // First try to obtain the Map of enabled services for the host | ||||
|       // tbd - Should we make this case insensitive? | ||||
|       Map enabledSvcsConfigMap = (Map) m_hostsMap.get(hostName); | ||||
|       if (enabledSvcsConfigMap != null) | ||||
|       { | ||||
|          // Retrieve SvcConfigEntry for the service from the map for the host | ||||
|          SvcConfigEntry svcConfigEntry = (SvcConfigEntry) enabledSvcsConfigMap.get(serviceName); | ||||
|          if (svcConfigEntry != null) | ||||
|          { | ||||
|             return svcConfigEntry.m_authPolicyFileData; | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             return null; | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          return null; | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the authentication token configuration associated with the | ||||
|     * specified service. | ||||
|     */ | ||||
|    public AuthTokenConfig getAuthTokenConfig(String hostName, String serviceName) | ||||
|    { | ||||
|       // First try to obtain the Map of enabled services for the host | ||||
|       // tbd - Should we make this case insensitive? | ||||
|       Map enabledSvcsConfigMap = (Map) m_hostsMap.get(hostName); | ||||
|       if (enabledSvcsConfigMap != null) | ||||
|       { | ||||
|          // Retrieve SvcConfigEntry for the service from the map for the host | ||||
|          SvcConfigEntry svcConfigEntry = (SvcConfigEntry) enabledSvcsConfigMap.get(serviceName); | ||||
|          if (svcConfigEntry != null) | ||||
|          { | ||||
|             return svcConfigEntry.m_authTokenConfig; | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             return null; | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          return null; | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the identity token configuration associated with the | ||||
|     * specified service. | ||||
|     */ | ||||
|    public IdenTokenConfig getIdenTokenConfig(String hostName, String serviceName) | ||||
|    { | ||||
|       // First try to obtain the Map of enabled services for the host | ||||
|       // tbd - Should we make this case insensitive? | ||||
|       Map enabledSvcsConfigMap = (Map) m_hostsMap.get(hostName); | ||||
|       if (enabledSvcsConfigMap != null) | ||||
|       { | ||||
|          // Retrieve SvcConfigEntry for the service from the map for the host | ||||
|          SvcConfigEntry svcConfigEntry = (SvcConfigEntry) enabledSvcsConfigMap.get(serviceName); | ||||
|          if (svcConfigEntry != null) | ||||
|          { | ||||
|             return svcConfigEntry.m_idenTokenConfig; | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             return null; | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          return null; | ||||
|       } | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,127 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.io.PrintWriter; | ||||
| import java.util.*; | ||||
|  | ||||
| /** | ||||
|  * GetAuthPolicy Class. | ||||
|  *  | ||||
|  * This class processes get authentication policy requests for a particular | ||||
|  * service. | ||||
|  *  | ||||
|  */ | ||||
| public class GetAuthPolicy implements RpcMethod | ||||
| { | ||||
|    private SvcConfig          m_svcConfig; | ||||
|    private EnabledSvcsConfig  m_enabledSvcsConfig; | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public GetAuthPolicy() throws Exception | ||||
|    { | ||||
|       // Nothing to do at this time | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Initialize the Rpc method. | ||||
|     */ | ||||
|    public void init(SvcConfig svcConfig, EnabledSvcsConfig enabledSvcsConfig) throws Exception | ||||
|    { | ||||
|       m_svcConfig = svcConfig; | ||||
|       m_enabledSvcsConfig = enabledSvcsConfig; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Process Rpc. | ||||
|     */ | ||||
|    public void invoke(InputStream inStream, PrintWriter out) throws IOException | ||||
|    { | ||||
|       try | ||||
|       { | ||||
|          System.err.println("GetAuthPolicy.invoke()"); | ||||
|  | ||||
|          // Read and parse the GetAuthPolicyReqMsg sent from the client | ||||
|          GetAuthPolicyReqMsg getAuthPolicyReqMsg = new GetAuthPolicyReqMsg(inStream); | ||||
|  | ||||
|          // Verify that the service is enabled | ||||
|          if (m_enabledSvcsConfig.svcEnabled(getAuthPolicyReqMsg.getHostName(), getAuthPolicyReqMsg.getServiceName())) | ||||
|          { | ||||
|             // Get the auth policy for the service | ||||
|             byte[] authPolicy = m_enabledSvcsConfig.getAuthPolicyFileDataForSvc(getAuthPolicyReqMsg.getHostName(), | ||||
|                                                                                 getAuthPolicyReqMsg.getServiceName()); | ||||
|             if (authPolicy != null) | ||||
|             { | ||||
|                // Write out the response | ||||
|                GetAuthPolicyRespMsg getAuthPolicyRespMsg = new GetAuthPolicyRespMsg(ProtoDefs.httpOkStatusMsg, | ||||
|                                                                                     ProtoDefs.httpOkStatusCode, | ||||
|                                                                                     new String(Base64Coder.encode(authPolicy))); | ||||
|                out.println(getAuthPolicyRespMsg.toString()); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                System.err.println("GetAuthPolicy.invoke()- authPolicy is null for enabled service: " + getAuthPolicyReqMsg.getServiceName());  | ||||
|                GetAuthPolicyRespMsg getAuthPolicyRespMsg = new GetAuthPolicyRespMsg(ProtoDefs.httpServerErrorStatusMsg, | ||||
|                                                                                     ProtoDefs.httpServerErrorStatusCode); | ||||
|                out.println(getAuthPolicyRespMsg.toString()); | ||||
|             } | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             // The service has not been enabled to utilize our authentication tokens | ||||
|             GetAuthPolicyRespMsg getAuthPolicyRespMsg = new GetAuthPolicyRespMsg(ProtoDefs.httpNotFoundStatusMsg, | ||||
|                                                                                  ProtoDefs.httpNotFoundStatusCode); | ||||
|             out.println(getAuthPolicyRespMsg.toString()); | ||||
|          } | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          System.err.println("GetAuthPolicy.invoke()- Exception: " + e.toString());  | ||||
|  | ||||
|          // Write out the response | ||||
|          try | ||||
|          { | ||||
|             GetAuthPolicyRespMsg getAuthPolicyRespMsg = new GetAuthPolicyRespMsg(ProtoDefs.httpServerErrorStatusMsg, | ||||
|                                                                                  ProtoDefs.httpServerErrorStatusCode); | ||||
|             out.println(getAuthPolicyRespMsg.toString()); | ||||
|          } | ||||
|          catch (Exception e2) | ||||
|          { | ||||
|             System.err.println("GetAuthPolicy.invoke()- Exception trying to construct response msg: " + e2.toString());  | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Return the method id. | ||||
|     */ | ||||
|    public String getId() | ||||
|    { | ||||
|       return "GetAuthPolicy"; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,282 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.InputStream; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
| /** | ||||
|  * GetAuthPolicyReqMsg Class. | ||||
|  *  | ||||
|  * This class deals with the message sent by Casa Client when requesting | ||||
|  * authenication policy to authenticate an entity to a particular service. | ||||
|  * The format of the the message is as follows: | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <get_auth_policy_req> | ||||
|  * <service>service name</service> | ||||
|  * <host>host name</host> | ||||
|  * </get_auth_policy_req> | ||||
|  *  | ||||
|  */ | ||||
| public class GetAuthPolicyReqMsg | ||||
| { | ||||
|  | ||||
|    protected String  m_serviceName = null; | ||||
|    protected String  m_hostName = null; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling GetAuthPolicyReq msg parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_ROOT_ELEMENT_END = 1; | ||||
|       private final static int AWAITING_SERVICE_ELEMENT_START = 2; | ||||
|       private final static int AWAITING_SERVICE_ELEMENT_END = 3; | ||||
|       private final static int AWAITING_SERVICE_DATA = 4; | ||||
|       private final static int AWAITING_HOST_ELEMENT_START = 5; | ||||
|       private final static int AWAITING_HOST_ELEMENT_END = 6; | ||||
|       private final static int AWAITING_HOST_DATA = 7; | ||||
|       private final static int DONE_PARSING = 8; | ||||
|  | ||||
|       private GetAuthPolicyReqMsg   m_GetAuthPolicyReqMsg; | ||||
|       private int             m_state; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler (GetAuthPolicyReqMsg GetAuthPolicyReqMsg) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_GetAuthPolicyReqMsg = GetAuthPolicyReqMsg; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we obtained all of the required elements | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("GetAuthPolicyReqMsg SAXHandler.endDocument()- Missing element");  | ||||
|             throw new SAXException("Missing element"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.getAuthPolicyRequestElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SERVICE_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthPolicyReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SERVICE_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.serviceElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SERVICE_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthPolicyReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_HOST_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.hostElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_HOST_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthPolicyReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|  | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("GetAuthPolicyReqMsg SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.getAuthPolicyRequestElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthPolicyReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SERVICE_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.serviceElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_HOST_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthPolicyReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_HOST_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.hostElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ROOT_ELEMENT_END; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthPolicyReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("GetAuthPolicyReqMsg SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_SERVICE_DATA: | ||||
|                // Consume the data | ||||
|                m_GetAuthPolicyReqMsg.m_serviceName = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SERVICE_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_HOST_DATA: | ||||
|                // Consume the data | ||||
|                m_GetAuthPolicyReqMsg.m_hostName = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_HOST_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                // Do nothing | ||||
|                break; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor | ||||
|     */ | ||||
|    public GetAuthPolicyReqMsg (InputStream inStream) throws Exception | ||||
|    { | ||||
|       try | ||||
|       { | ||||
|          // Parse the GetAuthPolicyReqMsg | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(this); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|  | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|          System.err.println("GetAuthPolicyReqMsg()- Parse exception: " + e.toString());  | ||||
|          throw new Exception("Protocol error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the service name.  | ||||
|     */ | ||||
|    public String getServiceName() throws Exception | ||||
|    { | ||||
|       return m_serviceName; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the host name.  | ||||
|     */ | ||||
|    public String getHostName() throws Exception | ||||
|    { | ||||
|       return m_hostName; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,111 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| /** | ||||
|  * GetAuthPolicyRespMsg Class. | ||||
|  *  | ||||
|  * This class deals with the message sent to the Casa Client as a | ||||
|  * response to a get authentication token request. The format of | ||||
|  * the message is as follows when the response includes an | ||||
|  * authentication token: | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <get_auth_policy_resp> | ||||
|  * <status><description>OK</description>200</status> | ||||
|  * <auth_policy>authentication policy data</auth_policy> | ||||
|  * </get_auth_policy_resp> | ||||
|  *  | ||||
|  * The format of the message is as follows when the response does not | ||||
|  * include an authentication token. | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <get_auth_policy_resp> | ||||
|  * <status><description>status description</description>status code</status> | ||||
|  * </get_auth_policy_resp> | ||||
|  *  | ||||
|  * Plase note that the protocol utilizes the status codes defined | ||||
|  * in the HTTP 1.1 Specification. | ||||
|  * | ||||
|  */ | ||||
| public class GetAuthPolicyRespMsg | ||||
| { | ||||
|  | ||||
|    String   m_msg; | ||||
|  | ||||
|    /* | ||||
|     * Constructor for a msg that does not include the authentication policy. | ||||
|     */ | ||||
|    public GetAuthPolicyRespMsg ( | ||||
|                                String statusDescription, | ||||
|                                String statusCode) throws Exception | ||||
|    { | ||||
|       // Get a StringBuffer to help us with the construction of the message | ||||
|       StringBuffer sb = new StringBuffer(); | ||||
|  | ||||
|       // Start building the message | ||||
|       sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.getAuthPolicyResponseElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.statusElementName + ">" | ||||
|                 + "<" + ProtoDefs.descriptionElementName + ">" + statusDescription + "</" + ProtoDefs.descriptionElementName + ">" | ||||
|                 + statusCode + "</" + ProtoDefs.statusElementName + ">" + "\r\n"); | ||||
|       sb.append("</" + ProtoDefs.getAuthPolicyResponseElementName + ">" + "\r\n"); | ||||
|  | ||||
|       // The message has now been built, save it. | ||||
|       m_msg = sb.toString(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor for a msg that includes the authentication policy. | ||||
|     */ | ||||
|    public GetAuthPolicyRespMsg ( | ||||
|                                String statusDescription, | ||||
|                                String statusCode, | ||||
|                                String authPolicy) throws Exception | ||||
|    { | ||||
|       // Get a StringBuffer to help us with the construction of the message | ||||
|       StringBuffer sb = new StringBuffer(); | ||||
|  | ||||
|       // Start building the message | ||||
|       sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.getAuthPolicyResponseElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.statusElementName + ">" | ||||
|                 + "<" + ProtoDefs.descriptionElementName + ">" + ProtoDefs.httpOkStatusMsg + "</" + ProtoDefs.descriptionElementName + ">" | ||||
|                 + ProtoDefs.httpOkStatusCode + "</" + ProtoDefs.statusElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.authPolicyElementName + ">" + authPolicy + "</" + ProtoDefs.authPolicyElementName + ">" + "\r\n"); | ||||
|       sb.append("</" + ProtoDefs.getAuthPolicyResponseElementName + ">" + "\r\n"); | ||||
|  | ||||
|       // The message has now been built, save it. | ||||
|       m_msg = sb.toString(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the GetAuthPolicyRespMsg. | ||||
|     */ | ||||
|    public String toString() | ||||
|    { | ||||
|       return m_msg; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,331 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.InputStream; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
| /** | ||||
|  * GetAuthTokReqMsg Class. | ||||
|  *  | ||||
|  * This class deals with the message sent by Casa Client when requesting | ||||
|  * a token to authenticate an entity to a particular service. The format of | ||||
|  * the message is as follows: | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <get_auth_token_req> | ||||
|  * <service>service name</service> | ||||
|  * <host>host name</host> | ||||
|  * <session_token>session token data</session_token> | ||||
|  * </get_auth_token_req> | ||||
|  *  | ||||
|  */ | ||||
| public class GetAuthTokReqMsg | ||||
| { | ||||
|  | ||||
|    protected String  m_serviceName = null; | ||||
|    protected String  m_hostName = null; | ||||
|    protected String  m_sessionToken = null; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling GetAuthTokReq msg parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_ROOT_ELEMENT_END = 1; | ||||
|       private final static int AWAITING_SERVICE_ELEMENT_START = 2; | ||||
|       private final static int AWAITING_SERVICE_ELEMENT_END = 3; | ||||
|       private final static int AWAITING_SERVICE_DATA = 4; | ||||
|       private final static int AWAITING_HOST_ELEMENT_START = 5; | ||||
|       private final static int AWAITING_HOST_ELEMENT_END = 6; | ||||
|       private final static int AWAITING_HOST_DATA = 7; | ||||
|       private final static int AWAITING_SESSION_TOKEN_ELEMENT_START = 8; | ||||
|       private final static int AWAITING_SESSION_TOKEN_ELEMENT_END = 9; | ||||
|       private final static int AWAITING_SESSION_TOKEN_DATA = 10; | ||||
|       private final static int DONE_PARSING = 11; | ||||
|  | ||||
|       private GetAuthTokReqMsg   m_GetAuthTokReqMsg; | ||||
|       private int          m_state; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler (GetAuthTokReqMsg GetAuthTokReqMsg) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_GetAuthTokReqMsg = GetAuthTokReqMsg; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we obtained all of the required elements | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("GetAuthTokReqMsg SAXHandler.endDocument()- Missing element");  | ||||
|             throw new SAXException("Missing element"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.getAuthTokRequestElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SERVICE_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthTokReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SERVICE_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.serviceElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SERVICE_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthTokReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_HOST_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.hostElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_HOST_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthTokReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|  | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SESSION_TOKEN_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.sessionTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SESSION_TOKEN_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthTokReqMsg SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("GetAuthTokReqMsg SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.getAuthTokRequestElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthTokReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SERVICE_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.serviceElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_HOST_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthTokReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_HOST_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.hostElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SESSION_TOKEN_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthTokReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SESSION_TOKEN_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.sessionTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ROOT_ELEMENT_END; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("GetAuthTokReqMsg SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("GetAuthTokReqMsg SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_SERVICE_DATA: | ||||
|                // Consume the data | ||||
|                m_GetAuthTokReqMsg.m_serviceName = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SERVICE_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_HOST_DATA: | ||||
|                // Consume the data | ||||
|                m_GetAuthTokReqMsg.m_hostName = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_HOST_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SESSION_TOKEN_DATA: | ||||
|                // Consume the data | ||||
|                m_GetAuthTokReqMsg.m_sessionToken = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SESSION_TOKEN_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                // Do nothing | ||||
|                break; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor | ||||
|     */ | ||||
|    public GetAuthTokReqMsg (InputStream inStream) throws Exception | ||||
|    { | ||||
|       try | ||||
|       { | ||||
|          // Parse the GetAuthTokReqMsg | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(this); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|  | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|          System.err.println("GetAuthTokReqMsg()- Parse exception: " + e.toString());  | ||||
|          throw new Exception("Protocol error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the service name.  | ||||
|     */ | ||||
|    public String getServiceName() throws Exception | ||||
|    { | ||||
|       return m_serviceName; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the host name.  | ||||
|     */ | ||||
|    public String getHostName() throws Exception | ||||
|    { | ||||
|       return m_hostName; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the session token.  | ||||
|     */ | ||||
|    public String getSessionToken() throws Exception | ||||
|    { | ||||
|       return m_sessionToken; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,115 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| /** | ||||
|  * GetAuthTokRespMsg Class. | ||||
|  *  | ||||
|  * This class deals with the message sent to the Casa Client as a | ||||
|  * response to a get authentication token request. The format of | ||||
|  * the message is as follows when the response includes an | ||||
|  * authentication token: | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <get_auth_tok_resp> | ||||
|  * <status><description>OK</description>200</status> | ||||
|  * <auth_token><lifetime>lifetime value</lifetime>authentication token data</auth_token> | ||||
|  * </get_auth_tok_resp> | ||||
|  *  | ||||
|  * The format of the message is as follows when the response does not | ||||
|  * include an authentication token. | ||||
|  *  | ||||
|  * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
|  * <get_auth_tok_resp> | ||||
|  * <status><description>status description</description>status code</status> | ||||
|  * </get_auth_tok_resp> | ||||
|  *  | ||||
|  * Plase note that the protocol utilizes the status codes defined | ||||
|  * in the HTTP 1.1 Specification. | ||||
|  * | ||||
|  */ | ||||
| public class GetAuthTokRespMsg | ||||
| { | ||||
|  | ||||
|    String   m_msg; | ||||
|  | ||||
|    /* | ||||
|     * Constructor for a msg that does not include the authentication token. | ||||
|     */ | ||||
|    public GetAuthTokRespMsg ( | ||||
|                             String statusDescription, | ||||
|                             String statusCode) throws Exception | ||||
|    { | ||||
|       // Get a StringBuffer to help us with the construction of the message | ||||
|       StringBuffer sb = new StringBuffer(); | ||||
|  | ||||
|       // Start building the message | ||||
|       sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.getAuthTokResponseElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.statusElementName + ">" | ||||
|                 + "<" + ProtoDefs.descriptionElementName + ">" + statusDescription + "</" + ProtoDefs.descriptionElementName + ">" | ||||
|                 + statusCode + "</" + ProtoDefs.statusElementName + ">" + "\r\n"); | ||||
|       sb.append("</" + ProtoDefs.getAuthTokResponseElementName + ">" + "\r\n"); | ||||
|  | ||||
|       // The message has now been built, save it. | ||||
|       m_msg = sb.toString(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor for a msg that includes the authentication token. | ||||
|     */ | ||||
|    public GetAuthTokRespMsg ( | ||||
|                             String statusDescription, | ||||
|                             String statusCode, | ||||
|                             String authToken, | ||||
|                             String authTokenLifetime) throws Exception | ||||
|    { | ||||
|       // Get a StringBuffer to help us with the construction of the message | ||||
|       StringBuffer sb = new StringBuffer(); | ||||
|  | ||||
|       // Start building the message | ||||
|       sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.getAuthTokResponseElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.statusElementName + ">" | ||||
|                 + "<" + ProtoDefs.descriptionElementName + ">" + ProtoDefs.httpOkStatusMsg + "</" + ProtoDefs.descriptionElementName + ">" | ||||
|                 + ProtoDefs.httpOkStatusCode + "</" + ProtoDefs.statusElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.authTokenElementName + ">" | ||||
|                 + "<" + ProtoDefs.lifetimeElementName + ">" + authTokenLifetime + "</" + ProtoDefs.lifetimeElementName + ">" | ||||
|                 + authToken + "</" + ProtoDefs.authTokenElementName + ">" + "\r\n"); | ||||
|       sb.append("</" + ProtoDefs.getAuthTokResponseElementName + ">" + "\r\n"); | ||||
|  | ||||
|       // The message has now been built, save it. | ||||
|       m_msg = sb.toString(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the GetAuthTokRespMsg. | ||||
|     */ | ||||
|    public String toString() | ||||
|    { | ||||
|       return m_msg; | ||||
|    } | ||||
| } | ||||
|  | ||||
| @@ -0,0 +1,146 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.PrintWriter; | ||||
|  | ||||
| /** | ||||
|  * GetAuthToken Class. | ||||
|  *  | ||||
|  * This class processes requests for tokens to authenticate an entity | ||||
|  * to a particular service. | ||||
|  *  | ||||
|  */ | ||||
| public class GetAuthToken implements RpcMethod | ||||
| { | ||||
|    private SvcConfig          m_svcConfig; | ||||
|    private EnabledSvcsConfig  m_enabledSvcsConfig; | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public GetAuthToken() throws Exception | ||||
|    { | ||||
|       // Nothing to do at this time | ||||
|    }      | ||||
|  | ||||
|    /* | ||||
|     * Initialize the Rpc method. | ||||
|     */ | ||||
|    public void init(SvcConfig svcConfig, EnabledSvcsConfig enabledSvcsConfig) throws Exception | ||||
|    { | ||||
|       m_svcConfig = svcConfig; | ||||
|       m_enabledSvcsConfig = enabledSvcsConfig; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Process Rpc. | ||||
|     */ | ||||
|    public void invoke(InputStream inStream, PrintWriter out) throws IOException | ||||
|    { | ||||
|       try | ||||
|       { | ||||
|          System.err.println("GetAuthToken.invoke()"); | ||||
|  | ||||
|          // Parse the GetAuthTokReqMsg sent from the client | ||||
|          GetAuthTokReqMsg getAuthTokReqMsg = new GetAuthTokReqMsg(inStream); | ||||
|  | ||||
|          // Verify that the service is enabled | ||||
|          if (m_enabledSvcsConfig.svcEnabled(getAuthTokReqMsg.getHostName(), | ||||
|                                             getAuthTokReqMsg.getServiceName())) | ||||
|          { | ||||
|             // Now create a session token (This validates the session token provided). | ||||
|             SessionToken sessionToken = new SessionToken(getAuthTokReqMsg.getSessionToken()); | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                // Create the Authentication Token | ||||
|                AuthToken authToken = new AuthToken(sessionToken.getIdentId(), | ||||
|                                                    sessionToken.getRealm(), | ||||
|                                                    getAuthTokReqMsg.getServiceName(), | ||||
|                                                    getAuthTokReqMsg.getHostName(), | ||||
|                                                    m_svcConfig, | ||||
|                                                    m_enabledSvcsConfig); | ||||
|  | ||||
|                // Write out the response | ||||
|                GetAuthTokRespMsg getAuthTokRespMsg = new GetAuthTokRespMsg(ProtoDefs.httpOkStatusMsg, | ||||
|                                                                            ProtoDefs.httpOkStatusCode, | ||||
|                                                                            authToken.toString(), | ||||
|                                                                            authToken.getLifetime()); | ||||
|                out.println(getAuthTokRespMsg.toString()); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                System.err.println("GetAuthToken.invoke()- Exception: " + e.toString());  | ||||
|  | ||||
|                // Write out the response | ||||
|                try | ||||
|                { | ||||
|                   GetAuthTokRespMsg getAuthTokRespMsg = new GetAuthTokRespMsg(ProtoDefs.httpUnauthorizedStatusMsg, | ||||
|                                                                               ProtoDefs.httpUnauthorizedStatusCode); | ||||
|                   out.println(getAuthTokRespMsg.toString()); | ||||
|                } | ||||
|                catch (Exception e2) | ||||
|                { | ||||
|                   System.err.println("GetAuthToken.invoke()- Exception trying to construct response msg: " + e2.toString());  | ||||
|                } | ||||
|             } | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             // The service has not been enabled to utilize our authentication tokens | ||||
|             GetAuthTokRespMsg getAuthTokRespMsg = new GetAuthTokRespMsg(ProtoDefs.httpNotFoundStatusMsg, | ||||
|                                                                         ProtoDefs.httpNotFoundStatusCode); | ||||
|             out.println(getAuthTokRespMsg.toString()); | ||||
|          } | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          System.err.println("GetAuthToken.invoke()- Exception: " + e.toString());  | ||||
|  | ||||
|          // Write out the response | ||||
|          try | ||||
|          { | ||||
|             GetAuthTokRespMsg getAuthTokRespMsg = new GetAuthTokRespMsg(ProtoDefs.httpServerErrorStatusMsg, | ||||
|                                                                         ProtoDefs.httpServerErrorStatusCode); | ||||
|             out.println(getAuthTokRespMsg.toString()); | ||||
|          } | ||||
|          catch (Exception e2) | ||||
|          { | ||||
|             System.err.println("GetAuthToken.invoke()- Exception trying to construct response msg: " + e2.toString());  | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Return the method id. | ||||
|     */ | ||||
|    public String getId() | ||||
|    { | ||||
|       return "GetAuthToken"; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,294 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.util.*; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
| /** | ||||
|  * IdenTokenConfig Class. | ||||
|  *  | ||||
|  * This class obtains and maintains identity token configuration. | ||||
|  *  | ||||
|  */ | ||||
| public class IdenTokenConfig | ||||
| { | ||||
|    // Well known identity token configuration settings | ||||
|    public final static String EncryptAttributes = "EncryptAttributes"; | ||||
|    public final static String Attributes = "Attributes"; | ||||
|  | ||||
|    // Default configuration values | ||||
|    private String m_defaultEncryptAttributesValue = "false"; | ||||
|    private String m_defaultAttributesValue = "sn"; | ||||
|  | ||||
|    private Map       m_tokenSettingsMap; | ||||
|    private String[]  m_identityAttributes; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_START = 1; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_DATA = 2; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_END = 3; | ||||
|       private final static int DONE_PARSING = 4; | ||||
|  | ||||
|       private final static String m_rootElementName = "settings"; | ||||
|  | ||||
|       private Map    m_keyMap; | ||||
|       private int    m_state; | ||||
|       private String m_currentKey; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler(Map keyMap) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_keyMap = keyMap; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we are not in an invalid state | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("IdenTokenConfig SAXHandler.endDocument()- Invalid state" + m_state);  | ||||
|             throw new SAXException("Invalid state at endDocument"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (m_rootElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SETTING_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("IdenTokenConfig SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SETTING_ELEMENT_START: | ||||
|                // Keep track of the key name | ||||
|                m_currentKey = qName; | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SETTING_ELEMENT_DATA; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("IdenTokenConfig SAXHandler.startElement()- Invalid state " + m_state);  | ||||
|                throw new SAXException("Invalid state at startElement"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_SETTING_ELEMENT_DATA: | ||||
|             case AWAITING_SETTING_ELEMENT_END: | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SETTING_ELEMENT_START; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SETTING_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (m_rootElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("IdenTokenConfig SAXHandler.endElement()- Un-expected element"); | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("IdenTokenConfig SAXHandler.endElement()- Invalid state " + m_state);  | ||||
|                throw new SAXException("Invalid state at endElement"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Consume the data if in the right state | ||||
|          if (m_state == AWAITING_SETTING_ELEMENT_DATA) | ||||
|          { | ||||
|             // Consume the data and add the key to map | ||||
|             // tbd - Add code to aggregate attributes specified as multiple elements | ||||
|             m_keyMap.put(m_currentKey, new String(ch, start, length)); | ||||
|  | ||||
|             // Advance to the next state | ||||
|             m_state = AWAITING_SETTING_ELEMENT_END; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor which sets default configuration values. | ||||
|     */ | ||||
|    public IdenTokenConfig() throws Exception | ||||
|    { | ||||
|       System.err.println("IdenTokenConfig()- Default"); | ||||
|  | ||||
|       // Create a map to keep track of the token settings | ||||
|       m_tokenSettingsMap = new HashMap(); | ||||
|  | ||||
|       // Set the default settings in our map | ||||
|       m_tokenSettingsMap.put(Attributes, m_defaultAttributesValue); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public IdenTokenConfig(String idenTokenSettingsFileName) throws Exception | ||||
|    { | ||||
|       System.err.println("IdenTokenConfig()-"); | ||||
|  | ||||
|       // Create a map to keep track of the token settings | ||||
|       m_tokenSettingsMap = new HashMap(); | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          // Get an input stream to read from the token settings file | ||||
|          File f = new File(idenTokenSettingsFileName); | ||||
|          FileInputStream inStream = new FileInputStream(f); | ||||
|  | ||||
|          // Parse the file | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(m_tokenSettingsMap); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|           | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|  | ||||
|          inStream.close(); | ||||
|  | ||||
|          // Process the specified attributes | ||||
|          if (m_tokenSettingsMap.containsKey(Attributes) == false) | ||||
|          { | ||||
|             System.err.println("IdenTokenConfig()- Attributes not configured, defaulting them."); | ||||
|             m_tokenSettingsMap.put(Attributes, m_defaultAttributesValue); | ||||
|          } | ||||
|          String attributes = (String) m_tokenSettingsMap.get(Attributes); | ||||
|          m_identityAttributes = attributes.split(","); | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|         System.err.println("IdenTokenConfig()- " + idenTokenSettingsFileName + " format error, exception: " + e.toString());  | ||||
|         throw new Exception("IdenTokenConfig()- authtoken.settings format error"); | ||||
|       } | ||||
|       catch (SecurityException e) | ||||
|       { | ||||
|          System.err.println("IdenTokenConfig()- SecurityException accessing " + idenTokenSettingsFileName + " Exception=" + e.toString()); | ||||
|          throw new Exception("IdenTokenConfig()- Not able to access file"); | ||||
|       } | ||||
|       catch (FileNotFoundException e) | ||||
|       { | ||||
|          System.err.println("IdenTokenConfig()- File " + idenTokenSettingsFileName + " not found"); | ||||
|          throw new Exception("IdenTokenConfig()- File not found"); | ||||
|       } | ||||
|       catch (IOException e) | ||||
|       { | ||||
|          System.err.println("IdenTokenConfig()- IOException accessing " + idenTokenSettingsFileName + " Exception=" + e.toString()); | ||||
|          throw new Exception("IdenTokenConfig()- Read error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the value associated with the specified setting. | ||||
|     */ | ||||
|    public String getSetting(String settingName) throws Exception | ||||
|    { | ||||
|       // Try to find the setting in our map | ||||
|       String value = (String) m_tokenSettingsMap.get(settingName); | ||||
|       if (value == null) | ||||
|       { | ||||
|          System.err.println("IdenTokenConfig.getSetting()- Did not find setting " + settingName); | ||||
|  | ||||
|          // The setting is not in our map, check if it is one to | ||||
|          // which we have defaults. | ||||
|          if (settingName.equals(EncryptAttributes) == true) | ||||
|          { | ||||
|             value = m_defaultEncryptAttributesValue; | ||||
|             System.err.println("AuthTokenConfig.getSetting()- Assigning default value " + value); | ||||
|  | ||||
|             // Add the key to the map so that it can be found quicker next time | ||||
|             m_tokenSettingsMap.put(EncryptAttributes, m_defaultEncryptAttributesValue); | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          System.err.println("IdenTokenConfig.getSetting()- Found setting " + settingName); | ||||
|          System.err.println("IdenTokenConfig.getSetting()- Setting value = " + value); | ||||
|       } | ||||
|  | ||||
|       return value; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the identity attributes that must be included in the token. | ||||
|     */ | ||||
|    public String[] getAttributes() throws Exception | ||||
|    { | ||||
|       return m_identityAttributes; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,93 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| /* | ||||
|  * IdentityToken Interface. | ||||
|  *  | ||||
|  * This is the interface implemented by Identity Token Providers. | ||||
|  */ | ||||
| public interface IdentityToken | ||||
| { | ||||
|    /* | ||||
|     * Initialize the token with parameters. | ||||
|     */ | ||||
|    void initialize(String identityId, | ||||
|                    String sourceName, | ||||
|                    String targetService, | ||||
|                    String targetHost, | ||||
|                    SvcConfig svcConfig) throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Initialize the token object with encoded token string. | ||||
|     */ | ||||
|    void initialize(String encodedToken) throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Returns encoded token string. | ||||
|     *  | ||||
|     * IMPORTANT: The token string can not contain the substring "]]>" | ||||
|     * within it. | ||||
|     */ | ||||
|    String getEncodedToken() throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the identity token provider type. | ||||
|     */ | ||||
|    String getProviderType() throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the identity id. | ||||
|     */ | ||||
|    String getIdentityId() throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the name associated with the | ||||
|     * identity source. | ||||
|     */ | ||||
|    String getSourceName() throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the url associated with the | ||||
|     * identity source. | ||||
|     */ | ||||
|    String getSourceUrl() throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the name of the targeted service. | ||||
|     */ | ||||
|    String getTargetService() throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containig the name of the host where the | ||||
|     * targeted service resides. | ||||
|     */ | ||||
|    String getTargetHost() throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Returns the attributes of the identity. | ||||
|     */ | ||||
|    javax.naming.directory.Attributes getAttributes() throws Exception; | ||||
| } | ||||
| @@ -0,0 +1,257 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.Serializable; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.PrintWriter; | ||||
| import java.util.Hashtable; | ||||
|  | ||||
| import javax.naming.Context; | ||||
| import javax.naming.NamingEnumeration; | ||||
| import javax.naming.NamingException; | ||||
| import javax.naming.directory.Attributes; | ||||
| import javax.naming.directory.BasicAttribute; | ||||
| import javax.naming.directory.BasicAttributes; | ||||
| import javax.naming.directory.DirContext; | ||||
| import javax.naming.directory.InitialDirContext; | ||||
| import javax.naming.directory.SearchResult; | ||||
| import javax.naming.directory.SearchControls; | ||||
|  | ||||
| import org.ietf.jgss.GSSContext; | ||||
| import org.ietf.jgss.GSSCredential; | ||||
| import org.ietf.jgss.GSSException; | ||||
| import org.ietf.jgss.GSSManager; | ||||
| import org.ietf.jgss.GSSName; | ||||
| import org.ietf.jgss.Oid; | ||||
|  | ||||
| import org.bandit.ia.IAContext; | ||||
|  | ||||
| /** | ||||
|  * Krb5Authenticate Class. | ||||
|  *  | ||||
|  * This class implementes an authentication mechanism for | ||||
|  * the processing of authentication requests utilizing a | ||||
|  * Kerberos5 token. | ||||
|  *  | ||||
|  */ | ||||
| public class Krb5Authenticate implements AuthMechanism, Serializable | ||||
| { | ||||
|    private static final String ServicePrincipalNameSetting = "ServicePrincipalName"; | ||||
|  | ||||
|    private SvcConfig       m_svcConfig; | ||||
|    private AuthMechConfig  m_mechConfig; | ||||
|  | ||||
|    /* | ||||
|     * GSS Long Lived variables | ||||
|     */ | ||||
|    protected GSSManager       m_manager; | ||||
|    protected Oid              m_krb5; | ||||
|    protected GSSName          m_svcName; | ||||
|    protected GSSCredential    m_credential;  | ||||
|  | ||||
|    /* | ||||
|     * Krb5 Token Class. | ||||
|     */ | ||||
|    private class Krb5Token | ||||
|    { | ||||
|       private String m_principalName = ""; | ||||
|  | ||||
|       /* | ||||
|        * The format of the Krb5 token is as follows: | ||||
|        *  | ||||
|        * Base64.encode(GSS-API Token data)); | ||||
|        */ | ||||
|       public Krb5Token(String encodedToken, Krb5Authenticate parent) throws Exception | ||||
|       { | ||||
|          // Decode the token | ||||
|          char[] tokenChars = new char[encodedToken.length()]; | ||||
|          encodedToken.getChars(0, tokenChars.length, tokenChars, 0); | ||||
|          byte[] tokenBytes = Base64Coder.decode(tokenChars); | ||||
|  | ||||
|          try | ||||
|          { | ||||
|             // Create a context and validate the token | ||||
|             GSSContext context = parent.m_manager.createContext(parent.m_credential); | ||||
|             System.err.println("tokenLength = " + tokenBytes.length); | ||||
|             context.acceptSecContext(tokenBytes, 0, tokenBytes.length); | ||||
|  | ||||
|             // Save the principal name of the authenticated entity | ||||
|             GSSName principalName = context.getSrcName(); | ||||
|             m_principalName = principalName.toString(); | ||||
|  | ||||
|             // Clean up | ||||
|             context.dispose(); | ||||
|          } | ||||
|          catch (GSSException e) | ||||
|          { | ||||
|             System.err.println("Krb5Authenticate Krb5Token()- GSS Exception caught: " + e.getLocalizedMessage()); | ||||
|             throw new Exception("Authentication Failure"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * Returns the name of the authenticated principal | ||||
|        */ | ||||
|       public String getPrincipalName() | ||||
|       { | ||||
|          return m_principalName; | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor | ||||
|     */ | ||||
|    public Krb5Authenticate() throws Exception | ||||
|    { | ||||
|       // Nothing to do at this time | ||||
|    }      | ||||
|  | ||||
|    /* | ||||
|     * Initialize the mechanism. | ||||
|     */ | ||||
|    public void init(SvcConfig svcConfig, AuthMechConfig mechConfig) throws Exception | ||||
|    { | ||||
|       m_svcConfig = svcConfig; | ||||
|       m_mechConfig = mechConfig; | ||||
|  | ||||
|       String servicePrincipal = mechConfig.getSetting(ServicePrincipalNameSetting); | ||||
|       if (servicePrincipal != null) | ||||
|       { | ||||
|          try | ||||
|          { | ||||
|             // Initalize our GSS variables | ||||
|             // | ||||
|             // Get an instance of the default GSSManager | ||||
|             m_manager = GSSManager.getInstance(); | ||||
|  | ||||
|             // Create an OID specifying the Krb5 mechanism | ||||
|             m_krb5 = new Oid("1.2.840.113554.1.2.2"); | ||||
|  | ||||
|             // Create our host based service name | ||||
|             m_svcName = m_manager.createName(servicePrincipal, | ||||
|                                              GSSName.NT_HOSTBASED_SERVICE,  | ||||
|                                              m_krb5); | ||||
|  | ||||
|             // Now acquire our credentials | ||||
|             m_credential = m_manager.createCredential(m_svcName,  | ||||
|                                                       GSSCredential.INDEFINITE_LIFETIME,  | ||||
|                                                       m_krb5,  | ||||
|                                                       GSSCredential.ACCEPT_ONLY); | ||||
|          } | ||||
|          catch (GSSException e) | ||||
|          { | ||||
|             System.err.println("Krb5Authenticate()- GSS Exception caught: " + e.getLocalizedMessage()); | ||||
|             throw new Exception("Failed to instantiate needed GSS objects"); | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          System.err.println("Krb5Authenticate()- Service Principal Name not configured"); | ||||
|          throw new Exception("Service Principal Name not configured"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * invoke() implementation. | ||||
|     */ | ||||
|    public String invoke(AuthReqMsg authReqMsg) throws Exception | ||||
|    { | ||||
|       String identId = null; | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          System.err.println("Krb5Authenticate.invoke()"); | ||||
|  | ||||
|          // Now parse the Kerberos Token | ||||
|          Krb5Token krb5Token = new Krb5Token(authReqMsg.getAuthMechToken(), this); | ||||
|  | ||||
|          // Open a directory context and use it to identify the users | ||||
|          // associated with the specified surname. | ||||
|          Hashtable env = new Hashtable(); | ||||
|          env.put(Context.INITIAL_CONTEXT_FACTORY, "org.bandit.ia.IAInitialCtxFactory"); | ||||
|          env.put(IAContext.IA_REALM_CONFIG_LOCATION, m_svcConfig.getSetting(SvcConfig.IdentityAbstractionConfigFile)); | ||||
|          env.put(IAContext.IA_REALM_SELECTOR, authReqMsg.getRealm()); | ||||
|  | ||||
|          DirContext ctx = new InitialDirContext(env); | ||||
|  | ||||
|          // Now search for a user with a matching  kerberos principal name. | ||||
|          // | ||||
|          // Set up a search control so that the search is scoped to the sub-tree | ||||
|          SearchControls controls = new SearchControls(); | ||||
|          controls.setSearchScope(SearchControls.SUBTREE_SCOPE); | ||||
|  | ||||
|          // Obtain the start search context - tbd - this will be removed once the functionality flows into Bandit | ||||
|          String searchContext = m_svcConfig.getSetting(SvcConfig.StartSearchContext); | ||||
|          if (searchContext == null) | ||||
|          { | ||||
|             // A start search context was not configured, start from the root. | ||||
|             searchContext = ""; | ||||
|          } | ||||
|  | ||||
|          // Perform the search | ||||
|          NamingEnumeration answer = ctx.search(searchContext, | ||||
|                                                "(krbPrincipalName={0})", | ||||
|                                                new String[] {krb5Token.getPrincipalName()}, | ||||
|                                                controls); | ||||
|  | ||||
|          // Proceed based on the result of the search | ||||
|          if (answer.hasMore()) | ||||
|          { | ||||
|             // The search succeeded, set the identity id. | ||||
|             SearchResult sr = (SearchResult)answer.next(); | ||||
|             if (searchContext.equals("")) | ||||
|             { | ||||
|                identId = sr.getNameInNamespace(); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                identId = sr.getName() + "," + searchContext; | ||||
|             } | ||||
|          } | ||||
|       } | ||||
|       catch (NamingException e) | ||||
|       { | ||||
|          // Log the error | ||||
|          System.err.println("Krb5Authenticate.invoke()- NamingException: " + e.getExplanation()); | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          System.err.println("Krb5Authenticate.invoke()- Exception: " + e.toString());  | ||||
|       } | ||||
|  | ||||
|       // Return the authentication result | ||||
|       return identId; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Return the mechanism id. | ||||
|     */ | ||||
|    public String getId() | ||||
|    { | ||||
|       return "Krb5Authenticate"; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,7 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<description>This is the authentication mechanism for the Krb5Authenticate scheme. The Krb5Authenticate scheme authenticates entities using Kerberos-V tokens.</description> | ||||
| 	<ClassName>com.novell.casa.authtoksvc.Krb5Authenticate</ClassName> | ||||
| 	<RelativeClassPath>WEB-INF/classes</RelativeClassPath> | ||||
| 	<ServicePrincipalName>Specify the service's kerberos principal name</ServicePrincipalName> | ||||
| </settings> | ||||
| @@ -0,0 +1,63 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS =  | ||||
|  | ||||
| DIST_SUBDIRS = | ||||
|  | ||||
| JAVAFILES = ProtoDefs.java \ | ||||
| 	AuthMechConfig.java \ | ||||
| 	SvcConfig.java \ | ||||
| 	IdenTokenConfig.java \ | ||||
| 	AuthTokenConfig.java \ | ||||
| 	EnabledSvcsConfig.java \ | ||||
| 	AuthMechanism.java \ | ||||
| 	Authenticate.java \ | ||||
| 	RpcMethod.java \ | ||||
| 	Rpc.java \ | ||||
| 	GetAuthPolicy.java \ | ||||
| 	Base64Coder.java \ | ||||
| 	AuthReqMsg.java \ | ||||
| 	AuthRespMsg.java \ | ||||
| 	IdentityToken.java \ | ||||
| 	CasaIdentityToken.java \ | ||||
| 	AuthToken.java \ | ||||
| 	GetAuthPolicyReqMsg.java \ | ||||
| 	GetAuthPolicyRespMsg.java \ | ||||
| 	GetAuthToken.java \ | ||||
| 	GetAuthTokReqMsg.java \ | ||||
| 	GetAuthTokRespMsg.java \ | ||||
| 	Krb5Authenticate.java \ | ||||
| 	PwdAuthenticate.java \ | ||||
| 	SessionToken.java | ||||
|  | ||||
| EXTRA_DIST = $(JAVAFILES) \ | ||||
| 		Krb5_mechanism.settings \ | ||||
| 		Pwd_mechanism.settings | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,86 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| /* | ||||
|  * ProDefs Class. | ||||
|  *  | ||||
|  * This class contains constants utilized in the Casa Client/Server | ||||
|  * protocol. | ||||
|  *  | ||||
|  */ | ||||
| public class ProtoDefs | ||||
| { | ||||
|  | ||||
|    /* | ||||
|     * XML Declaration used in the Casa Client/Server protocol | ||||
|     */ | ||||
|    public final static String xmlDeclaration = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"; | ||||
|  | ||||
|    /* | ||||
|     * XML Element Name Constants for the documents exchanged between the | ||||
|     * Casa Client and the Casa Server. | ||||
|     */ | ||||
|    public final static String authRequestElementName = "auth_req"; | ||||
|    public final static String authResponseElementName = "auth_resp"; | ||||
|    public final static String getAuthPolicyRequestElementName = "get_auth_policy_req"; | ||||
|    public final static String getAuthPolicyResponseElementName = "get_auth_policy_resp"; | ||||
|    public final static String getAuthTokRequestElementName = "get_auth_tok_req"; | ||||
|    public final static String getAuthTokResponseElementName = "get_auth_tok_resp"; | ||||
|    public final static String authMechTokenElementName = "auth_mech_token"; | ||||
|    public final static String statusElementName = "status"; | ||||
|    public final static String sessionTokenElementName = "session_token"; | ||||
|    public final static String authTokenElementName = "auth_token"; | ||||
|    public final static String authPolicyElementName = "auth_policy"; | ||||
|    public final static String identTokenElementName = "ident_token"; | ||||
|    public final static String lifetimeElementName = "lifetime"; | ||||
|    public final static String signatureElementName = "signature"; | ||||
|    public final static String typeElementName = "type"; | ||||
|    public final static String descriptionElementName = "description"; | ||||
|    public final static String serviceElementName = "service"; | ||||
|    public final static String hostElementName = "host"; | ||||
|    public final static String identIdElementName = "ident_id"; | ||||
|    public final static String realmElementName = "realm"; | ||||
|    public final static String authSourceElementName = "auth_source"; | ||||
|    public final static String mechanismElementName = "mechanism"; | ||||
|    public final static String mechanismInfoElementName = "mechanism_info"; | ||||
|  | ||||
|    /* | ||||
|     * Configurable operating parameters | ||||
|     */ | ||||
|    public String sessionTokenLifetime = "360"; | ||||
|  | ||||
|    /* | ||||
|     * HTTP Status Codes and Messages | ||||
|     */ | ||||
|    public final static String httpOkStatusCode = "200"; | ||||
|    public final static String httpOkStatusMsg = "OK"; | ||||
|    public final static String httpUnauthorizedStatusCode = "401"; | ||||
|    public final static String httpUnauthorizedStatusMsg = "Unauthorized"; | ||||
|    public final static String httpNotFoundStatusCode = "404"; | ||||
|    public final static String httpNotFoundStatusMsg = "Not Found"; | ||||
|    public final static String httpServerErrorStatusCode = "500"; | ||||
|    public final static String httpServerErrorStatusMsg = "Internal Server Error"; | ||||
| } | ||||
| @@ -0,0 +1,223 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.Serializable; | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.PrintWriter; | ||||
| import java.io.StringReader; | ||||
| import java.util.Hashtable; | ||||
|  | ||||
| import javax.naming.Context; | ||||
| import javax.naming.NamingEnumeration; | ||||
| import javax.naming.directory.BasicAttribute; | ||||
| import javax.naming.directory.BasicAttributes; | ||||
| import javax.naming.directory.InitialDirContext; | ||||
| import javax.naming.directory.DirContext; | ||||
| import javax.naming.directory.Attributes; | ||||
| import javax.naming.directory.SearchResult; | ||||
| import javax.naming.directory.SearchControls; | ||||
| import javax.naming.NamingException; | ||||
|  | ||||
| import org.bandit.ia.IAContext; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * PwdAuthenticate Class. | ||||
|  *  | ||||
|  * This class implementes an authentication mechanism for | ||||
|  * the processing of authentication requests utilizing a | ||||
|  * username/password token. | ||||
|  *  | ||||
|  */ | ||||
| public class PwdAuthenticate implements AuthMechanism, Serializable | ||||
| { | ||||
|    private SvcConfig       m_svcConfig; | ||||
|    private AuthMechConfig  m_mechConfig; | ||||
|  | ||||
|    /* | ||||
|     * Password Token Class. | ||||
|     */ | ||||
|    private class PwToken | ||||
|    { | ||||
|       private String m_username = ""; | ||||
|       private String m_password = ""; | ||||
|  | ||||
|       /* | ||||
|        * The format of the Pw token is as follows: | ||||
|        *  | ||||
|        * Base64.encode(new String("username\r\n" + "password\r\n")); | ||||
|        */ | ||||
|       public PwToken(String encodedToken) throws IOException | ||||
|       { | ||||
|          // Decode the token | ||||
|          String token = Base64Coder.decode(encodedToken); | ||||
|  | ||||
|          BufferedReader tokenReader = new BufferedReader(new StringReader(token)); | ||||
|  | ||||
|          // The second line contains the "username" | ||||
|          m_username = tokenReader.readLine(); | ||||
|  | ||||
|          // The third line contains the "password" | ||||
|          m_password = tokenReader.readLine(); | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * Returns the username | ||||
|        */ | ||||
|       public String getUsername() | ||||
|       { | ||||
|          return m_username; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * Returns the password | ||||
|        */ | ||||
|       public String getPassword() | ||||
|       { | ||||
|          return m_password; | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor | ||||
|     */ | ||||
|    public PwdAuthenticate() throws Exception | ||||
|    { | ||||
|       // Nothing to do at this time | ||||
|    }      | ||||
|  | ||||
|    /* | ||||
|     * Initialize the mechanism. | ||||
|     */ | ||||
|    public void init(SvcConfig svcConfig, AuthMechConfig mechConfig) throws Exception | ||||
|    { | ||||
|       m_svcConfig = svcConfig; | ||||
|       m_mechConfig = mechConfig; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * invoke() implementation. | ||||
|     */ | ||||
|    public String invoke(AuthReqMsg authReqMsg) throws Exception | ||||
|    { | ||||
|       String identId = null; | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          System.err.println("PwdAuthenticate.invoke()"); | ||||
|  | ||||
|          // Now parse the PW Token | ||||
|          PwToken pwToken = new PwToken(authReqMsg.getAuthMechToken()); | ||||
|  | ||||
|          // Open a directory context and use it to identify the users | ||||
|          // associated with the specified surname. | ||||
|          Hashtable env = new Hashtable(); | ||||
|          env.put(Context.INITIAL_CONTEXT_FACTORY, "org.bandit.ia.IAInitialCtxFactory"); | ||||
|          env.put(IAContext.IA_REALM_CONFIG_LOCATION, m_svcConfig.getSetting(SvcConfig.IdentityAbstractionConfigFile)); | ||||
|          env.put(IAContext.IA_REALM_SELECTOR, authReqMsg.getRealm()); | ||||
|  | ||||
|          DirContext ctx = new InitialDirContext(env); | ||||
|  | ||||
|          // Now search for a user with a matching surname. | ||||
|          // | ||||
|          // Set up a search control so that the search is scoped to the sub-tree | ||||
|          SearchControls controls = new SearchControls(); | ||||
|          controls.setSearchScope(SearchControls.SUBTREE_SCOPE); | ||||
|  | ||||
|          // Obtain the start search context - tbd - this will be removed once the functionality flows into Bandit | ||||
|          String searchContext = m_svcConfig.getSetting(SvcConfig.StartSearchContext); | ||||
|          if (searchContext == null) | ||||
|          { | ||||
|             // A start search context was not configured, start from the root. | ||||
|             searchContext = ""; | ||||
|          } | ||||
|  | ||||
|          // Perform the search | ||||
|          NamingEnumeration answer = ctx.search(searchContext, | ||||
|                                                "(cn={0})", | ||||
|                                                new String[] {pwToken.getUsername()}, | ||||
|                                                controls); | ||||
|  | ||||
|          // Enumerate through the users returned checking the password | ||||
|          while (answer.hasMore()) | ||||
|          { | ||||
|             SearchResult sr = (SearchResult)answer.next(); | ||||
|  | ||||
|             // Open a directory context for the user as a way of verifying its password | ||||
|             try | ||||
|             { | ||||
|                Hashtable env2 = new Hashtable(); | ||||
|                env2.put(Context.INITIAL_CONTEXT_FACTORY, "org.bandit.ia.IAInitialCtxFactory"); | ||||
|                env2.put(IAContext.IA_REALM_CONFIG_LOCATION, m_svcConfig.getSetting(SvcConfig.IdentityAbstractionConfigFile)); | ||||
|                env2.put(IAContext.IA_REALM_SELECTOR, authReqMsg.getRealm());               | ||||
|                env2.put(Context.SECURITY_AUTHENTICATION, "simple"); | ||||
|                env2.put(Context.SECURITY_PRINCIPAL, sr.getNameInNamespace()); | ||||
|                env2.put(Context.SECURITY_CREDENTIALS, pwToken.getPassword()); | ||||
|  | ||||
|                if ((new InitialDirContext(env2)) != null) | ||||
|                { | ||||
|                   // The password must be valid, set the identity Id. | ||||
|                   if (searchContext.equals("")) | ||||
|                   { | ||||
|                      identId = sr.getName(); | ||||
|                   } | ||||
|                   else | ||||
|                   { | ||||
|                      identId = sr.getName() + "," + searchContext; | ||||
|                   } | ||||
|                   break; | ||||
|                } | ||||
|             } | ||||
|             catch (NamingException e) | ||||
|             { | ||||
|                System.err.println("PwdAuthenticate.invoke()- NamingException: " + e.getExplanation());  | ||||
|             } | ||||
|          } | ||||
|       } | ||||
|       catch (NamingException e) | ||||
|       { | ||||
|          // Log the error | ||||
|          System.err.println("PwdAuthenticate.invoke()- NamingException on Proxy User: " + e.getExplanation()); | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          System.err.println("PwdAuthenticate.invoke()- Exception: " + e.toString());  | ||||
|       } | ||||
|  | ||||
|       // Return the authentication result | ||||
|       return identId; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Return the mechanism id. | ||||
|     */ | ||||
|    public String getId() | ||||
|    { | ||||
|       return "PwdAuthenticate"; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<description>This is the authentication mechanism for the PwdAuthenticate scheme. The PwdAuthenticate scheme authenticates entities using username/password tokens.</description> | ||||
| 	<ClassName>com.novell.casa.authtoksvc.PwdAuthenticate</ClassName> | ||||
| 	<RelativeClassPath>WEB-INF/classes</RelativeClassPath> | ||||
| </settings> | ||||
| @@ -0,0 +1,285 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.util.*; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.io.PrintWriter; | ||||
|  | ||||
| import javax.servlet.*; | ||||
| import javax.servlet.ServletException; | ||||
| import javax.servlet.http.*; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Rpc Servlet Class. | ||||
|  *  | ||||
|  * This class processes Rpcs to the Authentication Token Service. | ||||
|  *  | ||||
|  */ | ||||
| public class Rpc extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet | ||||
| { | ||||
|    private static final long serialVersionUID = -8264027868130334613L; | ||||
|  | ||||
|    private     String               m_appFolderPath = null; | ||||
|    private     String               m_configFolderPath = null; | ||||
|  | ||||
|    protected   ReconfigureThread    m_reconfigureThread = null; | ||||
|    protected   int                  m_reconfigureInterval; // seconds | ||||
|  | ||||
|    private Map                      m_methodsMap; | ||||
|  | ||||
|    /* | ||||
|     * Reconfigure Thread Class. | ||||
|     * | ||||
|     * This class implements a runnable thread that reconfigures an Rpc Servlet instance. | ||||
|     * | ||||
|     */ | ||||
|    private class ReconfigureThread implements Runnable | ||||
|    { | ||||
|       private Rpc       m_rpc; | ||||
|       private Thread    m_thread; | ||||
|  | ||||
|       /* | ||||
|        * Constructor. | ||||
|        */ | ||||
|       public ReconfigureThread (Rpc rpc) | ||||
|       { | ||||
|          m_rpc = rpc; | ||||
|          m_thread = new Thread(this); | ||||
|          m_thread.start(); | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * run() implementation. | ||||
|        */ | ||||
|       public void run () | ||||
|       { | ||||
|          System.err.println("ReconfigureThread.run()- Running"); | ||||
|  | ||||
|          while (true) | ||||
|          { | ||||
|             // Sleep an ammount equal the reconfigure interval for the Rpc | ||||
|             try | ||||
|             { | ||||
|                m_thread.sleep(m_rpc.m_reconfigureInterval * 1000); | ||||
|             } | ||||
|             catch (InterruptedException e) { /* nothing to do */ } | ||||
|  | ||||
|             // Re-configure the Rpc servlet. | ||||
|             try | ||||
|             { | ||||
|                m_rpc.configureServlet(); | ||||
|  | ||||
|                // Check if it is no longer necessary to re-configure the servlet | ||||
|                if (m_rpc.m_reconfigureInterval == 0) | ||||
|                { | ||||
|                   System.err.println("ReconfigureTask.run()- Configuration changed to no longer perform timed re-configuration"); | ||||
|                   break; | ||||
|                } | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                System.err.println("ReconfigureTask.run()- Exception caught during re-configure process, " + e.toString()); | ||||
|             } | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * stop() implementation. | ||||
|        */ | ||||
|       public void stop () | ||||
|       { | ||||
|          m_thread.stop(); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public Rpc () | ||||
|    { | ||||
|       super(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * configureServlet() implementation. | ||||
|     */ | ||||
|    protected void configureServlet () throws Exception | ||||
|    { | ||||
|       // Read service configuration | ||||
|       SvcConfig svcConfig = new SvcConfig(m_appFolderPath, m_configFolderPath); | ||||
|  | ||||
|       // Get the reconfigure interval | ||||
|       try | ||||
|       { | ||||
|          m_reconfigureInterval = Integer.parseInt(svcConfig.getSetting(SvcConfig.ReconfigureInterval)); | ||||
|       } | ||||
|       catch (NumberFormatException e) | ||||
|       { | ||||
|          System.err.println("Rpc.configureServlet()- Invalid reconfigure interval value format");  | ||||
|          m_reconfigureInterval = Integer.parseInt(SvcConfig.DefaultReconfigureIntervalValue); | ||||
|       } | ||||
|  | ||||
|       // Read enabled services configuration | ||||
|       EnabledSvcsConfig enabledSvcsConfig = new EnabledSvcsConfig(m_configFolderPath); | ||||
|  | ||||
|       // Create a map to keep track of the Rpc methods | ||||
|       Map methodsMap = new HashMap(); | ||||
|  | ||||
|       // Instantiate the Rpc Methods | ||||
|       RpcMethod getAuthPolicy = new GetAuthPolicy(); | ||||
|       getAuthPolicy.init(svcConfig, enabledSvcsConfig); | ||||
|       methodsMap.put(getAuthPolicy.getId(), getAuthPolicy); | ||||
|  | ||||
|       RpcMethod authenticate = new Authenticate(); | ||||
|       authenticate.init(svcConfig, enabledSvcsConfig); | ||||
|       methodsMap.put(authenticate.getId(), authenticate); | ||||
|  | ||||
|       RpcMethod getAuthToken = new GetAuthToken(); | ||||
|       getAuthToken.init(svcConfig, enabledSvcsConfig); | ||||
|       methodsMap.put(getAuthToken.getId(), getAuthToken); | ||||
|  | ||||
|       // Set the map as the methods map used by the servlet | ||||
|       m_methodsMap = methodsMap; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * init() implementation. | ||||
|     */ | ||||
|    public void init (ServletConfig config) throws ServletException | ||||
|    { | ||||
|       super.init(config); | ||||
|  | ||||
|       System.err.println("Rpc.init()"); | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          // Get the path to our configuration folder | ||||
|          // | ||||
|          // First check if it has been specified via a system property | ||||
|          ServletContext context = config.getServletContext(); | ||||
|          m_appFolderPath = context.getRealPath(File.separator); | ||||
|          m_configFolderPath = System.getProperty("com.novell.casa.authtoksvc.config"); | ||||
|          if (m_configFolderPath == null) | ||||
|          { | ||||
|             // The path to the svc config folder was not specified via a system | ||||
|             // property, assume that it's location is off the WEB-INF folder for | ||||
|             // our web application. | ||||
|             m_configFolderPath = m_appFolderPath + "WEB-INF/conf"; | ||||
|          } | ||||
|  | ||||
|          // Configure ourselves | ||||
|          configureServlet(); | ||||
|  | ||||
|          // Check if we must start a thread to periodically reconfigure ourselves | ||||
|          if (m_reconfigureInterval != 0) | ||||
|          { | ||||
|             m_reconfigureThread = new ReconfigureThread(this); | ||||
|          } | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          System.err.println("Rpc.init()- Exception caught: " + e.toString());  | ||||
|          throw new ServletException("Exception caught while instantiating Rpc methods"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * destroy() implementation. | ||||
|     */ | ||||
|    public void destroy () | ||||
|    { | ||||
|       super.destroy(); | ||||
|  | ||||
|       System.err.println("Rpc.destroy()");  | ||||
|  | ||||
|       // Stop our re-configure thread | ||||
|       if (m_reconfigureThread != null) | ||||
|       { | ||||
|          m_reconfigureThread.stop(); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * doGet() implementation. | ||||
|     */ | ||||
|    protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException | ||||
|    { | ||||
|       doPost(request, response); | ||||
|    }      | ||||
|  | ||||
|    /* | ||||
|     * doPost() implementation. | ||||
|     */ | ||||
|    protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException | ||||
|    { | ||||
|       // Get ready to send back a reply | ||||
|       response.setContentType("text/html"); | ||||
|       PrintWriter out = response.getWriter(); | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          // Obtain the input stream and execute the requested method | ||||
|          InputStream inStream = request.getInputStream(); | ||||
|  | ||||
|          String requestedMethod = request.getParameter("method"); | ||||
|          if (requestedMethod != null) | ||||
|          { | ||||
|             // Get the necessary method | ||||
|             RpcMethod method = (RpcMethod) m_methodsMap.get(requestedMethod); | ||||
|             if (method != null) | ||||
|             { | ||||
|                // Invoke the method to process the Rpc | ||||
|                method.invoke(inStream, out); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                // Unsupported method | ||||
|                System.err.println("Rpc.doPost()- Unsupported method");  | ||||
|                response.sendError(response.SC_BAD_REQUEST); | ||||
|             } | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             // Missing method parameter | ||||
|             System.err.println("Rpc.doPost()- Missing method parameter");  | ||||
|             response.sendError(response.SC_BAD_REQUEST); | ||||
|          } | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          // tbd | ||||
|          System.err.println("Rpc.doPost()- Exception caught: " + e.toString());  | ||||
|          response.sendError(response.SC_INTERNAL_SERVER_ERROR); | ||||
|       } | ||||
|  | ||||
|       // Done sending out the reply | ||||
|       out.close(); | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,53 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.io.PrintWriter; | ||||
| import java.util.*; | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * RpcMethod Interface. | ||||
|  *  | ||||
|  * This is the interface implemented by Rpc Methods. | ||||
|  */ | ||||
| public interface RpcMethod | ||||
| { | ||||
|    /* | ||||
|     * Initialize the Rpc method. | ||||
|     */ | ||||
|    void init(SvcConfig svcConfig, EnabledSvcsConfig enabledSvcsConfig) throws Exception; | ||||
|  | ||||
|    /* | ||||
|     * Process Rpc. | ||||
|     */ | ||||
|    void invoke(InputStream inStream, PrintWriter out) throws IOException; | ||||
|  | ||||
|    /* | ||||
|     * Return the method id. | ||||
|     */ | ||||
|    String getId(); | ||||
| } | ||||
| @@ -0,0 +1,416 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.ByteArrayInputStream; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
|  | ||||
| /* | ||||
| * SessionToken class. | ||||
| *  | ||||
| * This class constructs session tokens that Casa clients can present to | ||||
| * the Casa server to prove that an entity has been authenticated to | ||||
| * a particular realm. The format of the session token is as follows: | ||||
| *  | ||||
| * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| * <session_token> | ||||
| * <signature>signature value</signature> | ||||
| * <lifetime>lifetime value</lifetime> | ||||
| * <realm>realm value</realm> | ||||
| * <ident_id>identity id value</ident_id> | ||||
| * </session_token> | ||||
| * | ||||
| */ | ||||
| public class SessionToken | ||||
| { | ||||
|  | ||||
|    private String m_id; | ||||
|    private String m_realm; | ||||
|    private String m_lifetime; | ||||
|    private String m_signature; | ||||
|    private String m_token; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_ROOT_ELEMENT_END = 1; | ||||
|       private final static int AWAITING_SIGNATURE_ELEMENT_START = 2; | ||||
|       private final static int AWAITING_SIGNATURE_ELEMENT_END = 3; | ||||
|       private final static int AWAITING_SIGNATURE_DATA = 4; | ||||
|       private final static int AWAITING_LIFETIME_ELEMENT_START = 5; | ||||
|       private final static int AWAITING_LIFETIME_ELEMENT_END = 6; | ||||
|       private final static int AWAITING_LIFETIME_DATA = 7; | ||||
|       private final static int AWAITING_REALM_ELEMENT_START = 8; | ||||
|       private final static int AWAITING_REALM_ELEMENT_END = 9; | ||||
|       private final static int AWAITING_REALM_DATA = 10; | ||||
|       private final static int AWAITING_IDENT_ID_ELEMENT_START = 11; | ||||
|       private final static int AWAITING_IDENT_ID_ELEMENT_END = 12; | ||||
|       private final static int AWAITING_IDENT_ID_DATA = 13; | ||||
|       private final static int DONE_PARSING = 14; | ||||
|  | ||||
|       private SessionToken m_SessionToken; | ||||
|       private int       m_state; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler (SessionToken SessionToken) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_SessionToken = SessionToken; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we obtained all of the required elements | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("SessionToken SAXHandler.endDocument()- Missing element");  | ||||
|             throw new SAXException("Missing element"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.sessionTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SIGNATURE_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SIGNATURE_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.signatureElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SIGNATURE_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_LIFETIME_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.lifetimeElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_LIFETIME_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|  | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_REALM_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.realmElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_REALM_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_IDENT_ID_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.identIdElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_IDENT_ID_DATA; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("SessionToken SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_ROOT_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.sessionTokenElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SIGNATURE_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.signatureElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_LIFETIME_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_LIFETIME_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.lifetimeElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_REALM_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_REALM_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.realmElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_IDENT_ID_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_IDENT_ID_ELEMENT_END: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (ProtoDefs.identIdElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_ROOT_ELEMENT_END; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SessionToken SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("SessionToken SAXHandler.startElement()- State error");  | ||||
|                throw new SAXException("State error"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|              | ||||
|             case AWAITING_SIGNATURE_DATA: | ||||
|                // Consume the data | ||||
|                m_SessionToken.m_signature = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SIGNATURE_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_LIFETIME_DATA: | ||||
|                // Consume the data | ||||
|                m_SessionToken.m_lifetime = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_LIFETIME_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_REALM_DATA: | ||||
|                // Consume the data | ||||
|                m_SessionToken.m_realm = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_REALM_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_IDENT_ID_DATA: | ||||
|                // Consume the data | ||||
|                m_SessionToken.m_id = new String(ch, start, length); | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_IDENT_ID_ELEMENT_END; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                // Do nothing | ||||
|                break; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor | ||||
|     */ | ||||
|    public SessionToken(String id, String realm, String lifetime) throws Exception | ||||
|    { | ||||
|       // Save copies of the input parameters | ||||
|       m_id = id; | ||||
|       m_realm = realm; | ||||
|       m_lifetime = lifetime; | ||||
|  | ||||
|       // Generate a signature | ||||
|       // tbd - Over id, realm, and lifetime data. | ||||
|       m_signature = "tbd"; | ||||
|  | ||||
|       // Get a StringBuffer to help us with the construction of the token | ||||
|       StringBuffer sb = new StringBuffer(); | ||||
|  | ||||
|       // Start building the message | ||||
|       sb.append(ProtoDefs.xmlDeclaration + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.sessionTokenElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.signatureElementName + ">" + m_signature + "</" + ProtoDefs.signatureElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.lifetimeElementName + ">" + m_lifetime + "</" + ProtoDefs.lifetimeElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.realmElementName + ">" + m_realm + "</" + ProtoDefs.realmElementName + ">" + "\r\n"); | ||||
|       sb.append("<" + ProtoDefs.identIdElementName + ">" + m_id + "</" + ProtoDefs.identIdElementName + ">" + "\r\n"); | ||||
|       sb.append("</" + ProtoDefs.sessionTokenElementName + ">" + "\r\n"); | ||||
|  | ||||
|       // Save the token | ||||
|       m_token = sb.toString(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor given a session token string. The constructor | ||||
|     * validates the token as part of its processing. | ||||
|     */ | ||||
|    public SessionToken(String token) throws Exception | ||||
|    { | ||||
|       // Decode the token string | ||||
|       m_token = Base64Coder.decode(token); | ||||
|  | ||||
|       // Now parse the token into its elements | ||||
|       try | ||||
|       { | ||||
|          // Parse the SessionToken | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(this); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|  | ||||
|          ByteArrayInputStream inStream = new ByteArrayInputStream(m_token.getBytes()); | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|  | ||||
|          // Verify the signature | ||||
|          // tbd | ||||
|  | ||||
|          // Verify that the token has not expired | ||||
|          // tbd | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|          System.err.println("SessionToken()- Parse exception: " + e.toString());  | ||||
|          throw new Exception("Protocol error"); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns a string containing the session token. | ||||
|     */ | ||||
|    public String toString() | ||||
|    { | ||||
|       return Base64Coder.encode(m_token); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the Identity Id  | ||||
|     */ | ||||
|    public String getIdentId() throws Exception | ||||
|    { | ||||
|       return m_id; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Method to get the Identity Repository Reference (Realm).  | ||||
|     */ | ||||
|    public String getRealm() throws Exception | ||||
|    { | ||||
|       return m_realm; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,299 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.authtoksvc; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.util.*; | ||||
|  | ||||
| import org.xml.sax.InputSource; | ||||
| import org.xml.sax.SAXException; | ||||
| import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.helpers.XMLReaderFactory; | ||||
|  | ||||
| /** | ||||
|  * SvcConfig Class. | ||||
|  *  | ||||
|  * This class obtains and maintains the service configuration. | ||||
|  *  | ||||
|  */ | ||||
| public class SvcConfig | ||||
| { | ||||
|    // Well known service configuration settings | ||||
|    // | ||||
|    // The LifetimeShorter value is the value by which token lifetime | ||||
|    // values are shorten when specified to clients to make sure that | ||||
|    // the clients detect token expirations before issuing the tokens | ||||
|    // to a service for authentication purposes. | ||||
|    public final static String SessionTokenLifetime = "SessionTokenLifetime"; | ||||
|    public final static String LifetimeShorter = "LifetimeShorter"; | ||||
|    public final static String IdentityAbstractionConfigFile = "IAConfigFile"; | ||||
|    public final static String StartSearchContext = "startSearchContext"; | ||||
|    public final static String ConfigFolderPath = "ConfigFolderPath"; | ||||
|    public final static String AppRootPath = "AppRootPath"; | ||||
|    public final static String ReconfigureInterval = "ReconfigureInterval"; | ||||
|  | ||||
|    // Default configuration values | ||||
|    public final static  String DefaultSessionTokenLifetimeValue = "43200";    // Seconds | ||||
|    public final static  String DefaultLifetimeShorterValue = "5";             // Seconds | ||||
|    public final static  String DefaultReconfigureIntervalValue = "60";        // Seconds | ||||
|  | ||||
|    private static final String m_svcSettingsFileName = "svc.settings"; | ||||
|    private Map m_svcSettingsMap; | ||||
|  | ||||
|    /* | ||||
|     * Class for handling Authentication Request parsing events. | ||||
|     */ | ||||
|    private class SAXHandler extends org.xml.sax.helpers.DefaultHandler | ||||
|    { | ||||
|       private final static int AWAITING_ROOT_ELEMENT_START = 0; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_START = 1; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_DATA = 2; | ||||
|       private final static int AWAITING_SETTING_ELEMENT_END = 3; | ||||
|       private final static int DONE_PARSING = 4; | ||||
|  | ||||
|       private final static String m_rootElementName = "settings"; | ||||
|  | ||||
|       private Map    m_keyMap; | ||||
|       private int    m_state; | ||||
|       private String m_currentKey; | ||||
|  | ||||
|       /* | ||||
|        * Constructor | ||||
|        */ | ||||
|       public SAXHandler(Map keyMap) | ||||
|       { | ||||
|          super(); | ||||
|  | ||||
|          // Initialize our members | ||||
|          m_keyMap = keyMap; | ||||
|          m_state = AWAITING_ROOT_ELEMENT_START; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endDocument() implementation. | ||||
|        */ | ||||
|       public void endDocument () throws SAXException | ||||
|       { | ||||
|          // Verify that we are not in an invalid state | ||||
|          if (m_state != DONE_PARSING) | ||||
|          { | ||||
|             System.err.println("SvcConfig SAXHandler.endDocument()- Invalid state" + m_state);  | ||||
|             throw new SAXException("Invalid state at endDocument"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * startElement() implementation. | ||||
|        */ | ||||
|       public void startElement (String uri, String name, String qName, org.xml.sax.Attributes atts) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_ROOT_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (m_rootElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = AWAITING_SETTING_ELEMENT_START; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SvcConfig SAXHandler.startElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SETTING_ELEMENT_START: | ||||
|                // Keep track of the key name | ||||
|                m_currentKey = qName; | ||||
|  | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SETTING_ELEMENT_DATA; | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("SvcConfig SAXHandler.startElement()- Invalid state " + m_state);  | ||||
|                throw new SAXException("Invalid state at startElement"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * endElement() immplementation. | ||||
|        */ | ||||
|       public void endElement (String uri, String name, String qName) throws SAXException | ||||
|       { | ||||
|          // Proceed based on our state | ||||
|          switch (m_state) | ||||
|          { | ||||
|             case AWAITING_SETTING_ELEMENT_DATA: | ||||
|             case AWAITING_SETTING_ELEMENT_END: | ||||
|                // Advance to the next state | ||||
|                m_state = AWAITING_SETTING_ELEMENT_START; | ||||
|                break; | ||||
|  | ||||
|             case AWAITING_SETTING_ELEMENT_START: | ||||
|                // Verify that we are processing the expected tag | ||||
|                if (m_rootElementName.equals(qName)) | ||||
|                { | ||||
|                   // Advance to the next state | ||||
|                   m_state = DONE_PARSING; | ||||
|                } | ||||
|                else | ||||
|                { | ||||
|                   System.err.println("SvcConfig SAXHandler.endElement()- Un-expected element");  | ||||
|                   throw new SAXException("Un-expected element"); | ||||
|                } | ||||
|                break; | ||||
|  | ||||
|             default: | ||||
|                System.err.println("SvcConfig SAXHandler.endElement()- Invalid state " + m_state);  | ||||
|                throw new SAXException("Invalid state at endElement"); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|        * character() implementation. | ||||
|        */ | ||||
|       public void characters (char ch[], int start, int length) throws SAXException | ||||
|       { | ||||
|          // Consume the data if in the right state | ||||
|          if (m_state == AWAITING_SETTING_ELEMENT_DATA) | ||||
|          { | ||||
|             // Consume the data and add the key to map | ||||
|             m_keyMap.put(m_currentKey, new String(ch, start, length)); | ||||
|  | ||||
|             // Advance to the next state | ||||
|             m_state = AWAITING_SETTING_ELEMENT_END; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Constructor. | ||||
|     */ | ||||
|    public SvcConfig(String appRootPath, String svcConfigPath) throws Exception | ||||
|    { | ||||
|       System.err.println("SvcConfig()-"); | ||||
|  | ||||
|       System.err.println("SvcConfig()- SvcConfigPath = " + svcConfigPath); | ||||
|  | ||||
|       // Create a map to keep track of the service settings | ||||
|       m_svcSettingsMap = new HashMap(); | ||||
|  | ||||
|       try | ||||
|       { | ||||
|          // Get an input stream to services settings file | ||||
|          File settingsFile = new File(svcConfigPath, m_svcSettingsFileName); | ||||
|          FileInputStream inStream = new FileInputStream(settingsFile); | ||||
|        | ||||
|          // Parse the file | ||||
|          XMLReader xr = XMLReaderFactory.createXMLReader(); | ||||
|          SAXHandler handler = new SAXHandler(m_svcSettingsMap); | ||||
|          xr.setContentHandler(handler); | ||||
|          xr.setErrorHandler(handler); | ||||
|           | ||||
|          InputSource source = new InputSource(inStream); | ||||
|          xr.parse(source); | ||||
|          inStream.close(); | ||||
|  | ||||
|          // Add the application and config folder path settings to our map | ||||
|          m_svcSettingsMap.put(AppRootPath, appRootPath); | ||||
|          m_svcSettingsMap.put(ConfigFolderPath, svcConfigPath); | ||||
|       } | ||||
|       catch (SAXException e) | ||||
|       { | ||||
|         System.err.println("SvcConfig()- Parse exception: " + e.toString());  | ||||
|         throw new Exception("SvcConfig()- svc.settings format error"); | ||||
|       } | ||||
|       catch (SecurityException e) | ||||
|       { | ||||
|          System.err.println("SvcConfig()- SecurityException caught while accessing " + svcConfigPath +  File.separator + m_svcSettingsFileName + " Exception=" + e.toString()); | ||||
|       } | ||||
|       catch (FileNotFoundException e) | ||||
|       { | ||||
|          System.err.println("SvcConfig()- File " + svcConfigPath +  File.separator + m_svcSettingsFileName + " not found"); | ||||
|       } | ||||
|       catch (IOException e) | ||||
|       { | ||||
|          System.err.println("SvcConfig()- IOException caught while trying to read " + svcConfigPath +  File.separator + m_svcSettingsFileName + " Exception=" + e.toString()); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the value associated with the specified setting. | ||||
|     */ | ||||
|    public String getSetting(String settingName) throws Exception | ||||
|    { | ||||
|       // Try to find the setting in our map | ||||
|       String value = (String) m_svcSettingsMap.get(settingName); | ||||
|       if (value == null) | ||||
|       { | ||||
|          System.err.println("SvcConfig.getSetting()- Did not find setting " + settingName); | ||||
|  | ||||
|          // The setting is not in our map, check if it is one to | ||||
|          // which we have defaults. | ||||
|          if (settingName.equals(SessionTokenLifetime) == true) | ||||
|          { | ||||
|             value = DefaultSessionTokenLifetimeValue; | ||||
|             System.err.println("SvcConfig.getSetting()- Assigning default value " + value); | ||||
|  | ||||
|             // Add the key to the map so that it can be found quicker next time | ||||
|             m_svcSettingsMap.put(SessionTokenLifetime, DefaultSessionTokenLifetimeValue); | ||||
|          } | ||||
|          else if (settingName.equals(LifetimeShorter) == true) | ||||
|          { | ||||
|             value = DefaultLifetimeShorterValue; | ||||
|             System.err.println("SvcConfig.getSetting()- Assigning default value " + value); | ||||
|  | ||||
|             // Add the key to the map so that it can be found quicker next time | ||||
|             m_svcSettingsMap.put(LifetimeShorter, DefaultLifetimeShorterValue); | ||||
|          } | ||||
|          else if (settingName.equals(ReconfigureInterval) == true) | ||||
|          { | ||||
|             value = DefaultReconfigureIntervalValue; | ||||
|             System.err.println("SvcConfig.getSetting()- Assigning default value " + value); | ||||
|  | ||||
|             // Add the key to the map so that it can be found quicker next time | ||||
|             m_svcSettingsMap.put(ReconfigureInterval, DefaultReconfigureIntervalValue); | ||||
|          } | ||||
|          else if (settingName.equals(IdentityAbstractionConfigFile) == true) | ||||
|          { | ||||
|             System.err.println("SvcConfig.getSetting()- Mandatory setting " + IdentityAbstractionConfigFile + " not set"); | ||||
|             throw new Exception("Missing mandatory configuration setting"); | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          System.err.println("SvcConfig.getSetting()- Found setting " + settingName); | ||||
|          System.err.println("SvcConfig.getSetting()- Setting value = " + value); | ||||
|  | ||||
|          // Do some sanity checking | ||||
|          // tbd - Make sure that the token lifetime values are greater than the LifetimeShorter | ||||
|       } | ||||
|  | ||||
|       return value; | ||||
|    } | ||||
| } | ||||
							
								
								
									
										5
									
								
								CASA-auth-token/java/server/AuthTokenSvc/svc.settings
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								CASA-auth-token/java/server/AuthTokenSvc/svc.settings
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <settings> | ||||
| 	<IAConfigFile>Replace with path to the Identity Abstraction Realms Configuration File.</IAConfigFile> | ||||
| 	<SessionTokenLifetime>43200</SessionTokenLifetime> | ||||
| </settings> | ||||
							
								
								
									
										27
									
								
								CASA-auth-token/java/server/AuthTokenSvc/web.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								CASA-auth-token/java/server/AuthTokenSvc/web.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> | ||||
| 	<display-name> | ||||
| 	CasaAuthTokenSvc</display-name> | ||||
|     <servlet> | ||||
|         <description> | ||||
|             The CasaAuthTokenSvc provides authentication tokens. | ||||
|         </description> | ||||
|         <display-name> | ||||
|         Rpc</display-name> | ||||
|         <servlet-name>Rpc</servlet-name> | ||||
|         <servlet-class> | ||||
|         com.novell.casa.authtoksvc.Rpc</servlet-class> | ||||
|     </servlet> | ||||
|     <servlet-mapping> | ||||
|         <servlet-name>Rpc</servlet-name> | ||||
|         <url-pattern>/Rpc</url-pattern> | ||||
|     </servlet-mapping> | ||||
| 	<welcome-file-list> | ||||
| 		<welcome-file>index.html</welcome-file> | ||||
| 		<welcome-file>index.htm</welcome-file> | ||||
| 		<welcome-file>index.jsp</welcome-file> | ||||
| 		<welcome-file>default.html</welcome-file> | ||||
| 		<welcome-file>default.htm</welcome-file> | ||||
| 		<welcome-file>default.jsp</welcome-file> | ||||
| 	</welcome-file-list> | ||||
| </web-app> | ||||
							
								
								
									
										8
									
								
								CASA-auth-token/java/server/JaasSupport/.classpath
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								CASA-auth-token/java/server/JaasSupport/.classpath
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <classpath> | ||||
| 	<classpathentry kind="src" path="src"/> | ||||
| 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> | ||||
| 	<classpathentry combineaccessrules="false" kind="src" path="/CasaAuthServer"/> | ||||
| 	<classpathentry kind="lib" path="/usr/share/java/xerces-j2.jar"/> | ||||
| 	<classpathentry kind="output" path="build/classes"/> | ||||
| </classpath> | ||||
							
								
								
									
										17
									
								
								CASA-auth-token/java/server/JaasSupport/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								CASA-auth-token/java/server/JaasSupport/.project
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>CasaJaasSupport</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
							
								
								
									
										81
									
								
								CASA-auth-token/java/server/JaasSupport/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								CASA-auth-token/java/server/JaasSupport/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = src | ||||
| DIST_SUBDIRS = src | ||||
|  | ||||
| EXTRA_DIST = $(JAVAFILES) | ||||
|  | ||||
| ROOT = ../.. | ||||
|  | ||||
| LIBDIR = $(ROOT)/$(LIB) | ||||
|  | ||||
| JAVAROOT = . | ||||
| JAVAC= javac | ||||
|  | ||||
| MODULE_NAME = CasaJaasSupport | ||||
| MODULE_EXT = jar | ||||
|  | ||||
| JAVAFILES = src/com/novell/casa/jaas/CasaLoginModule.java \ | ||||
| 	src/com/novell/casa/jaas/CasaPrincipal.java | ||||
|  | ||||
| BUILDDIR = build | ||||
|  | ||||
| CLASSES = $(addprefix $(BUILDDIR)/, $(JAVAFILES:%.java=%.class)) | ||||
|  | ||||
| LIBS = | ||||
| CLASSPATH = $(LIBDIR)/java/CasaAuthToken.jar:$(LIBS) | ||||
|  | ||||
| CUR_DIR := $(shell pwd) | ||||
|  | ||||
| all: $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||
|  | ||||
| $(BUILDDIR)/%.class: %.java | ||||
| 	@echo [======== Compiling $@ ========] | ||||
| 	$(JAVAC) -sourcepath src -classpath $(CLASSPATH) -d $(BUILDDIR)/classes $< | ||||
|  | ||||
| $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT): $(BUILDDIR) $(CLASSES) | ||||
| 	@echo [======== Jarring $@ ========] | ||||
| 	jar cvf $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) -C $(BUILDDIR)/classes . | ||||
| 	cp $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) $(LIBDIR)/java/ | ||||
|  | ||||
| $(BUILDDIR): | ||||
| 	[ -d $(BUILDDIR) ] || mkdir -p $(BUILDDIR) | ||||
| 	[ -d $(BUILDDIR)/classes ] || mkdir -p $(BUILDDIR)/classes | ||||
| 	[ -d $(LIBDIR) ] || mkdir -p $(LIBDIR) | ||||
| 	[ -d $(LIBDIR)/java ] || mkdir -p $(LIBDIR)/java | ||||
|  | ||||
| install-exec-local: | ||||
|  | ||||
| uninstall-local: | ||||
|  | ||||
| #installcheck-local: install | ||||
|  | ||||
| clean-local: | ||||
| 	if [ -d $(BUILDDIR) ]; then  rm -rf $(BUILDDIR); fi | ||||
| 	if [ -f $(LIBDIR)/java/$(MODULE_NAME).$(MODULE_EXT) ]; then  rm -f $(LIBDIR)/java/$(MODULE_NAME).$(MODULE_EXT); fi | ||||
|  | ||||
| distclean-local: | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
| 	rm -f Makefile | ||||
|  | ||||
							
								
								
									
										82
									
								
								CASA-auth-token/java/server/JaasSupport/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								CASA-auth-token/java/server/JaasSupport/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  README for JaasSupport | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| INTRODUCTION | ||||
|  | ||||
| CasaLoginModule is a JAAS login module which can be configured | ||||
| to validate credentials consisting of CASA Authentication Tokens. | ||||
|  | ||||
| CONFIGURATION | ||||
|  | ||||
| To use CasaLoginModule for your service, set the java.security.auth.login.config | ||||
| property to point to the JAAS configuration file for your application. You must | ||||
| also set the org.xml.sax.driver property to point to an appropriate SAX Parser. | ||||
| The Xerces SAX Parser is a good option (org.apache.xerces.parsers.SAXParser). | ||||
|  | ||||
| The JAAS configuration file should include the following line: | ||||
|  | ||||
| com.novell.casa.jaas.CasaLoginModule Required; | ||||
|  | ||||
| The CasaLoginModule supports the following parameters: | ||||
|  | ||||
| PerformUsernameCheck - This parameter when set to true tells the CasaLoginModule | ||||
| that it must verify that the username is set to "CasaPrincipal". If the parameter | ||||
| is not specified the username is not checked. | ||||
|  | ||||
| CLIENT PROGRAMMING NOTES | ||||
|  | ||||
| Clients must specify the same service name when requesting Authentication | ||||
| Tokens from the CASA Client as the service name specified by the server | ||||
| when opening a JAAS Context. | ||||
|  | ||||
| SERVER PROGRAMMING NOTES | ||||
|  | ||||
| Server applications validating credentials containing CASA Authentication | ||||
| tokens can obtain information about the authenticated identity by getting | ||||
| access to the CasaPrincipal that gets associated with the Subject object | ||||
| returned from a successful JAAS login. The CasaPrincipal provides the | ||||
| following information: username, name of the identity data source (realm), | ||||
| and an URL to the identity data source. The CasaPrincipal also contains | ||||
| the attributes of the authenticated identity configured as required by the | ||||
| service in the Authentication Token Service. | ||||
|  | ||||
| EXAMPLE SERVER APPLICATION | ||||
|  | ||||
| See src/com/novell/casa/jaas/sample/SampleApp.java for an example application | ||||
| using JAAS to authenticate credentials consisting of CASA Authentication Tokens. | ||||
|  | ||||
| Note that to get the application to run you must set the path to the JAAS configuration | ||||
| file as the JAVA property java.security.auth.login.config. You must also make sure that | ||||
| the JAVA property org.xml.sax.driver.org is set to a valid SAX parser. The following shows | ||||
| the JAVA options that you would set to run the test application: -Djava.security.auth.login. | ||||
| config=/home/user/SampleApp/SampleApp.conf -Dorg.xml.sax.driver=org.apache.xerces.parsers. | ||||
| SAXParser | ||||
|  | ||||
| The SampleApp.conf file should have the following contents: | ||||
|  | ||||
| SampleApp { | ||||
| 	com.novell.casa.jaas.CasaLoginModule Required debug=true; | ||||
| }; | ||||
|  | ||||
| You must also include the CasaJaasSupport.jar and CasaAuthToken.jar files in the | ||||
| CLASSPATH of the application. | ||||
|  | ||||
| SECURITY CONSIDERATIONS | ||||
|  | ||||
| CASA Authenticatication Tokens when compromised can be used to either impersonate | ||||
| a user or to obtain identity information about the user. Because of this it is | ||||
| important that the tokens be secured by applications making use of them. It is | ||||
| recommended that the tokens be transmitted using SSL. | ||||
|   | ||||
|  | ||||
|  | ||||
|  | ||||
|                  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										13
									
								
								CASA-auth-token/java/server/JaasSupport/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								CASA-auth-token/java/server/JaasSupport/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  TODO for JaasSupport | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| INTRODUCTION | ||||
|  | ||||
| This file contains a list of the items still outstanding for JaasSupport. | ||||
|  | ||||
| OUTSTANDING ITEMS | ||||
|  | ||||
| - Change printfs used for debugging into a suitable mechanism. | ||||
							
								
								
									
										17
									
								
								CASA-auth-token/java/server/JaasSupport/make_and_run_test.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										17
									
								
								CASA-auth-token/java/server/JaasSupport/make_and_run_test.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| #!/bin/bash | ||||
| if [ ! -d build-test ]; then | ||||
|     mkdir build-test | ||||
|     mkdir build-test/classes | ||||
| else | ||||
|     if [ ! -d build-test/classes ]; then | ||||
|         mkdir build-test/classes | ||||
|     fi | ||||
| fi | ||||
| echo "*** Compiling the test application ***" | ||||
| javac -sourcepath src -classpath ../../../lib/java/CasaJaasSupport.jar:../../../lib/java/CasaAuthToken.jar -d build-test/classes src/com/novell/casa/jaas/sample/SampleApp.java src/com/novell/casa/jaas/sample/SampleAppCallbackHandler.java | ||||
| echo "*** Done compiling ***" | ||||
| echo "" | ||||
| echo "*** Starting the test application ***" | ||||
| java -classpath build-test/classes:../../../lib/java/CasaJaasSupport.jar:../../../lib/java/CasaAuthToken.jar:/usr/share/java/xerces-j2.jar -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser -Djava.security.auth.login.config=src/com/novell/casa/jaas/sample/SampleApp.conf com.novell.casa.jaas.sample.SampleApp | ||||
| #jdb -sourcepath src:../AuthTokenSvc/src -classpath build-test/classes:../../../lib/java/CasaJaasSupport.jar:../../../lib/java/CasaAuthToken.jar:/usr/share/java/xerces-j2.jar -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser -Djava.security.auth.login.config=src/com/novell/casa/jaas/sample/SampleApp.conf com.novell.casa.jaas.sample.SampleApp | ||||
|  | ||||
							
								
								
									
										37
									
								
								CASA-auth-token/java/server/JaasSupport/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								CASA-auth-token/java/server/JaasSupport/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = com | ||||
|  | ||||
| DIST_SUBDIRS = com | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
							
								
								
									
										37
									
								
								CASA-auth-token/java/server/JaasSupport/src/com/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								CASA-auth-token/java/server/JaasSupport/src/com/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = novell | ||||
|  | ||||
| DIST_SUBDIRS = novell | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,37 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = casa | ||||
|  | ||||
| DIST_SUBDIRS = casa | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,37 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = jaas | ||||
|  | ||||
| DIST_SUBDIRS = jaas | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,257 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.jaas; | ||||
|  | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
|  | ||||
| import javax.security.auth.Subject; | ||||
| import javax.security.auth.callback.Callback; | ||||
| import javax.security.auth.callback.CallbackHandler; | ||||
| import javax.security.auth.callback.NameCallback; | ||||
| import javax.security.auth.callback.PasswordCallback; | ||||
| import javax.security.auth.login.FailedLoginException; | ||||
| import javax.security.auth.login.LoginException; | ||||
| import javax.security.auth.spi.LoginModule; | ||||
|  | ||||
| import com.novell.casa.authtoksvc.AuthToken; | ||||
| import com.novell.casa.authtoksvc.CasaIdentityToken; | ||||
|  | ||||
| /* | ||||
|  * CasaLoginModule Class. | ||||
|  *  | ||||
|  * This class implements a LoginModule which performs | ||||
|  * authentication via the Casa Authentication Token | ||||
|  * infrastructure. | ||||
|  *  | ||||
|  */ | ||||
| public class CasaLoginModule implements LoginModule | ||||
| { | ||||
|    private final static String casaUsername = "CasaIdentityUser"; | ||||
|     | ||||
|    private Subject            m_subject = null; | ||||
|    private CasaPrincipal      m_principal = null; | ||||
|    private CallbackHandler    m_callbackHandler = null; | ||||
|    private Map                m_sharedState = null; | ||||
|    private Map                m_options = null; | ||||
|     | ||||
|    /* | ||||
|     *  (non-Javadoc) | ||||
|     * @see javax.security.auth.spi.LoginModule#abort() | ||||
|     */ | ||||
|    public boolean abort() throws LoginException | ||||
|    { | ||||
|       // Clear out all of our state | ||||
|       m_subject = null; | ||||
|       m_principal = null; | ||||
|       m_callbackHandler = null; | ||||
|       m_sharedState = null; | ||||
|       m_options = null; | ||||
|        | ||||
|       return true; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     *  (non-Javadoc) | ||||
|     * @see javax.security.auth.spi.LoginModule#commit() | ||||
|     */ | ||||
|    public boolean commit() throws LoginException | ||||
|    { | ||||
|       // Check if we instantiated a principal to associate | ||||
|       // with the subject. | ||||
|       if (m_principal != null) | ||||
|       { | ||||
|          try | ||||
|          { | ||||
|             // Add our principal to the set associated with | ||||
|             // the subject. | ||||
|             m_subject.getPrincipals().add(m_principal); | ||||
|             return true; | ||||
|          } | ||||
|          catch (Exception e) | ||||
|          { | ||||
|             System.err.println("CasaLoginModule.commit()- Exception caught associating principal, msg: " + e.getMessage()); | ||||
|             throw new LoginException("Error encountered"); | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // Allways return since authentication failed or was not | ||||
|          // performed by us. | ||||
|          return false; | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     *  (non-Javadoc) | ||||
|     * @see javax.security.auth.spi.LoginModule#login() | ||||
|     */ | ||||
|    public boolean login() throws LoginException | ||||
|    { | ||||
|       // Verify that a CallbackHandler was specified | ||||
|       if (m_callbackHandler == null) | ||||
|       { | ||||
|          System.err.println("CasaLoginModule.login()- Null CallbackHandler"); | ||||
|          throw new LoginException("Null CallbackHandler"); | ||||
|       } | ||||
|        | ||||
|       // Do not perform the username check unless configured to do it. | ||||
|       boolean performUsernameCheck = false; | ||||
|       if (m_options != null | ||||
|           && m_options.containsKey((String) "PerformUsernameCheck") == true) | ||||
|       { | ||||
|          String keyVal = (String) m_options.get("PerformUsernameCheck"); | ||||
|          if (keyVal != null && keyVal.equals("true")) | ||||
|             performUsernameCheck = true; | ||||
|       } | ||||
|        | ||||
|       if (performUsernameCheck) | ||||
|       { | ||||
|          // Verify that the username is CasaIdentityUser, for this | ||||
|          // we first need to obtain it. | ||||
|          // | ||||
|          // Try to obtain the user name from the shared state | ||||
|          String username = (String) m_sharedState.get("javax.security.auth.login.name"); | ||||
|          if (username == null) | ||||
|          { | ||||
|             // The usename was not stored in the shared state, request it. | ||||
|             try | ||||
|             { | ||||
|                NameCallback nameCallback = new NameCallback("Enter username:"); | ||||
|                Callback[] callbacks = new Callback[1]; | ||||
|                callbacks[0] = nameCallback; | ||||
|                m_callbackHandler.handle(callbacks); | ||||
|                username = nameCallback.getName(); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                System.err.println("CasaLoginModule.login()- Exception caught during nameCallback, msg: " + e.getMessage()); | ||||
|             } | ||||
|              | ||||
|             // Check the username | ||||
|             if (username == null) | ||||
|                return false; | ||||
|             else | ||||
|             { | ||||
|                // Save the retrieved username in the shared state and then check it. | ||||
|                m_sharedState.put("javax.security.auth.login.name", username); | ||||
|                if (username.equals(casaUsername) == false) | ||||
|                   return false; | ||||
|             } | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             // Check the username | ||||
|             if (username.equals(casaUsername) == false) | ||||
|                return false; | ||||
|          } | ||||
|       } | ||||
|           | ||||
|       // Obtain the CasaAuthenticationToken | ||||
|       char[] authTokenChars = null; | ||||
|       try | ||||
|       { | ||||
|          PasswordCallback passwordCallback = new PasswordCallback("Enter CasaAuthenticationToken:", false); | ||||
|          Callback[] callbacks = new Callback[1]; | ||||
|          callbacks[0] = passwordCallback; | ||||
|          m_callbackHandler.handle(callbacks); | ||||
|          authTokenChars = passwordCallback.getPassword(); | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          System.err.println("CasaLoginModule.login()- Exception caught during passwordCallback, msg: " + e.getMessage()); | ||||
|       } | ||||
|        | ||||
|       // Check the CasaAuthenticationToken | ||||
|       if (authTokenChars != null) | ||||
|       { | ||||
|          // Instantiate the AuthToken, this validates the token itself. | ||||
|          try | ||||
|          { | ||||
|             AuthToken authToken = new AuthToken(new String(authTokenChars)); | ||||
|              | ||||
|             // Instantiate the appropriate IdentityToken based on the IdentityTokenProvider type | ||||
|             // tbd - For now use the CasaIdentityToken | ||||
|             CasaIdentityToken identityToken = new CasaIdentityToken(); | ||||
|             identityToken.initialize(authToken.getIdentityToken()); | ||||
|              | ||||
|             // Now instantiate the CasaPrincipal | ||||
|             m_principal = new CasaPrincipal(identityToken); | ||||
|          } | ||||
|          catch (Exception e) | ||||
|          { | ||||
|             // The validation of one of the tokens failed | ||||
|             // tbd - Log | ||||
|             System.err.println("CasaLoginModule.login()- Exception caught during token processing, msg: " + e.getMessage()); | ||||
|             throw new FailedLoginException("Token validation failed"); | ||||
|          } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // Token not provided | ||||
|          // tbd - Log | ||||
|          System.err.println("CasaLoginModule.login()- Token not provided"); | ||||
|          throw new FailedLoginException("CasaAuthenticationToken not obtained"); | ||||
|       } | ||||
|  | ||||
|       // User validated | ||||
|       // tbd - Log | ||||
|       return true; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     *  (non-Javadoc) | ||||
|     * @see javax.security.auth.spi.LoginModule#logout() | ||||
|     */ | ||||
|    public boolean logout() throws LoginException | ||||
|    { | ||||
|       // Check if we must try to remove our principal | ||||
|       // from the associated subject. | ||||
|       if (m_principal != null | ||||
|          && m_subject.isReadOnly() == false) | ||||
|       { | ||||
|          Set principalSet = m_subject.getPrincipals(); | ||||
|          principalSet.remove(m_principal); | ||||
|       } | ||||
|       return true; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     *  (non-Javadoc) | ||||
|     * @see javax.security.auth.spi.LoginModule#initialize(javax.security.auth.Subject, javax.security.auth.callback.CallbackHandler, java.util.Map, java.util.Map) | ||||
|     */ | ||||
|    public void initialize( | ||||
|          Subject subject, | ||||
|          CallbackHandler callbackHandler, | ||||
|          Map sharedState, | ||||
|          Map options) | ||||
|    { | ||||
|       // Save the input parameters for later use | ||||
|       m_subject = subject; | ||||
|       m_callbackHandler = callbackHandler; | ||||
|       m_sharedState = sharedState; | ||||
|       m_options = options; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,87 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.jaas; | ||||
|  | ||||
| import java.security.Principal; | ||||
|  | ||||
| import com.novell.casa.authtoksvc.IdentityToken; | ||||
|  | ||||
| /* | ||||
|  * CasaPrincipal class. | ||||
|  *  | ||||
|  * This class implements the principal class for | ||||
|  * identities authenticated by Casa. | ||||
|  *  | ||||
|  */ | ||||
| public class CasaPrincipal implements Principal | ||||
| { | ||||
|    private String m_name; | ||||
|    private String m_realm; | ||||
|    private String m_identStoreUrl; | ||||
|    private javax.naming.directory.Attributes m_attributes; | ||||
|     | ||||
|    /* | ||||
|     * Constructor | ||||
|     */ | ||||
|    public CasaPrincipal(IdentityToken identityToken) throws Exception | ||||
|    { | ||||
|       // Get the necessary information from the identity token | ||||
|       m_name = identityToken.getIdentityId(); | ||||
|       m_realm = identityToken.getSourceName(); | ||||
|       m_identStoreUrl = identityToken.getSourceUrl(); | ||||
|       m_attributes = identityToken.getAttributes(); | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     *  (non-Javadoc) | ||||
|     * @see java.security.Principal#getName() | ||||
|     */ | ||||
|    public String getName() | ||||
|    { | ||||
|       return m_name; | ||||
|    } | ||||
|     | ||||
|    /* | ||||
|     * Returns the name associated with the source of the identity data. | ||||
|     */ | ||||
|    public String getRealm() | ||||
|    { | ||||
|       return m_realm; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the url associated with the source of the identity data. | ||||
|     */ | ||||
|    public String getIdentStoreUrl() | ||||
|    { | ||||
|       return m_identStoreUrl; | ||||
|    } | ||||
|  | ||||
|    /* | ||||
|     * Returns the identity attributes. | ||||
|     */ | ||||
|    public javax.naming.directory.Attributes getAttributes() | ||||
|    { | ||||
|       return m_attributes; | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,39 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| SUBDIRS = | ||||
|  | ||||
| DIST_SUBDIRS = | ||||
|  | ||||
| JAVAFILES = CasaLoginModule.java \ | ||||
|             CasaPrincipal.java | ||||
|              | ||||
|  | ||||
| EXTRA_DIST = $(JAVAFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
| @@ -0,0 +1,3 @@ | ||||
| testService { | ||||
| 	com.novell.casa.jaas.CasaLoginModule Required debug=true; | ||||
| }; | ||||
| @@ -0,0 +1,193 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.jaas.sample; | ||||
|  | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStreamReader; | ||||
| import java.net.ServerSocket; | ||||
| import java.net.Socket; | ||||
| import java.util.Iterator; | ||||
| import java.util.Set; | ||||
|  | ||||
| import javax.naming.NamingEnumeration; | ||||
| import javax.security.auth.Subject; | ||||
| import javax.security.auth.login.LoginContext; | ||||
| import javax.security.auth.login.LoginException; | ||||
|  | ||||
| import com.novell.casa.jaas.CasaPrincipal; | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * This is a sample application which demonstrates the use of | ||||
|  * JAAS and Casa to authenticate a connection. | ||||
|  */ | ||||
| public class SampleApp | ||||
| { | ||||
|    /** | ||||
|     * @param args | ||||
|     */ | ||||
|    public static void main(String[] args) | ||||
|    { | ||||
|       Socket sock = null; | ||||
|       ServerSocket listenSock = null; | ||||
|        | ||||
|       try | ||||
|       { | ||||
|          // Create a socket to listen for connections | ||||
|          int port = 4444; | ||||
|          int queueLen = 6; | ||||
|          System.out.println("Listen port = " + port); | ||||
|          listenSock = new ServerSocket(port, queueLen); | ||||
|  | ||||
|          // Service connections | ||||
|          while (true) | ||||
|          { | ||||
|             BufferedReader in = null; | ||||
|             try | ||||
|             { | ||||
|                // Wait for the next connection | ||||
|                System.out.println("Waiting for connection"); | ||||
|                sock = listenSock.accept(); | ||||
|                System.out.println(); | ||||
|                System.out.println("********Connection received*********"); | ||||
|                 | ||||
|                // Get socket I/O streams | ||||
|                in = new BufferedReader(new InputStreamReader(sock.getInputStream())); | ||||
|                //PrintStream out = new PrintStream(sock.getOutputStream()); | ||||
|                 | ||||
|                // Get the authentication token from the client | ||||
|                String authToken = in.readLine(); | ||||
|                //System.out.println("Token received from client, length = " + authToken.length()); | ||||
|                 | ||||
|                // Authenticate the token and print out the information available to our service | ||||
|                // about the authenticated identity. | ||||
|                LoginContext lc = new LoginContext("testService", new SampleAppCallbackHandler(authToken)); | ||||
|                try | ||||
|                { | ||||
|                   System.out.println("Authenticating the user"); | ||||
|                   lc.login(); | ||||
|                    | ||||
|                   System.out.println("   Authentication succeeded"); | ||||
|                    | ||||
|                   // Now get the subject associated with the context | ||||
|                   Subject subject = lc.getSubject(); | ||||
|                    | ||||
|                   // Now get the CasaPrincipals that represent the authenticated | ||||
|                   // identity or identities. | ||||
|                   Set principalSet = subject.getPrincipals(CasaPrincipal.class); | ||||
|                   //System.out.println("The number of CasaPrincipals is: " + principalSet.size()); | ||||
|                   Iterator principalIter = principalSet.iterator(); | ||||
|                   System.out.println(); | ||||
|                   System.out.println("Authenticated Identity Information"); | ||||
|                   System.out.println(); | ||||
|                   while (principalIter.hasNext() == true) | ||||
|                   { | ||||
|                      CasaPrincipal principal = (CasaPrincipal) principalIter.next(); | ||||
|                       | ||||
|                      // Print out information about the principal | ||||
|                      System.out.println("   Source of the identity information: " + principal.getIdentStoreUrl()); | ||||
|                      System.out.println("   Realm name associated with identity source: " + principal.getRealm()); | ||||
|                      System.out.println("   Principal name (unique within identity source realm): " + principal.getName()); | ||||
|                      System.out.println(); | ||||
|                      System.out.println("Authenticated Identity Attributes"); | ||||
|                      System.out.println(); | ||||
|                      javax.naming.directory.Attributes attrs = principal.getAttributes(); | ||||
|                      for (NamingEnumeration ae = attrs.getAll(); ae.hasMore();) | ||||
|                      { | ||||
|                         javax.naming.directory.Attribute attr = (javax.naming.directory.Attribute) ae.next(); | ||||
|                          | ||||
|                         NamingEnumeration enumeration = attr.getAll(); | ||||
|                         while (enumeration.hasMore()) | ||||
|                         { | ||||
|                            System.out.print("  Attribute Name: " + attr.getID()); | ||||
|                            Object attrValue = enumeration.next(); | ||||
|                            if (attrValue instanceof byte[]) | ||||
|                            { | ||||
|                               // The attribute value is binary data | ||||
|                               StringBuffer buf = new StringBuffer(); | ||||
|                               char[] hex = "0123456789ABCDEF".toCharArray(); | ||||
|                               for (int i = 0; i < ((byte[]) attrValue).length; i++) | ||||
|                               { | ||||
|                                  buf.append(hex[(((byte[]) attrValue)[i] >> 4) & 0xF]); | ||||
|                                  buf.append(hex[((byte[]) attrValue)[i] & 0xF]); | ||||
|                               } | ||||
|                               System.out.println(" :: Attribute Value: " + buf.toString()); | ||||
|                            } | ||||
|                            else | ||||
|                            { | ||||
|                               // The attribute value is contained in a string | ||||
|                               System.out.println(" :: Attribute Value: " + (String) attrValue); | ||||
|                            } | ||||
|                         } | ||||
|                      } | ||||
|                   } | ||||
|                   System.out.println(); | ||||
|                } | ||||
|                catch (LoginException e) | ||||
|                { | ||||
|                   System.out.println("   Authentication failed, LoginException: " + e.getMessage()); | ||||
|                } | ||||
|             } | ||||
|             finally | ||||
|             { | ||||
|                if (sock != null) | ||||
|                { | ||||
|                   sock.close(); | ||||
|                   sock = null; | ||||
|                } | ||||
|                if (in != null) | ||||
|                   in.close(); | ||||
|             } | ||||
|          } | ||||
|       } | ||||
|       catch (IOException e) | ||||
|       { | ||||
|          System.out.println("IOException: " + e.getMessage()); | ||||
|       } | ||||
|       catch (Exception e) | ||||
|       { | ||||
|          System.out.println("Exception: " + e.getMessage()); | ||||
|       } | ||||
|       finally | ||||
|       { | ||||
|          try | ||||
|          { | ||||
|             if (sock != null) | ||||
|             { | ||||
|                sock.close(); | ||||
|             } | ||||
|             if (listenSock != null) | ||||
|             { | ||||
|                listenSock.close(); | ||||
|             } | ||||
|          } | ||||
|          catch (Exception e) | ||||
|          { | ||||
|             System.out.println("Exception: " + e.getMessage()); | ||||
|          } | ||||
|       } | ||||
|    } | ||||
| } | ||||
| @@ -0,0 +1,71 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  Copyright (C) 2006 Novell, Inc. All Rights Reserved. | ||||
|  * | ||||
|  *  This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Lesser General Public | ||||
|  *  License as published by the Free Software Foundation; version 2.1 | ||||
|  *  of the License. | ||||
|  * | ||||
|  *  This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library Lesser General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU Lesser General Public | ||||
|  *  License along with this library; if not, Novell, Inc. | ||||
|  *  | ||||
|  *  To contact Novell about this file by physical or electronic mail,  | ||||
|  *  you may find current contact information at www.novell.com. | ||||
|  *  | ||||
|  *  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
|  *   | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| package com.novell.casa.jaas.sample; | ||||
|  | ||||
| import java.io.IOException; | ||||
|  | ||||
| import javax.security.auth.callback.Callback; | ||||
| import javax.security.auth.callback.CallbackHandler; | ||||
| import javax.security.auth.callback.NameCallback; | ||||
| import javax.security.auth.callback.PasswordCallback; | ||||
| import javax.security.auth.callback.UnsupportedCallbackException; | ||||
|  | ||||
|  | ||||
| public class SampleAppCallbackHandler implements CallbackHandler | ||||
| { | ||||
| 	private String m_authToken; | ||||
| 	 | ||||
| 	/* | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 */ | ||||
| 	public SampleAppCallbackHandler(String authToken) | ||||
| 	{ | ||||
| 		m_authToken = authToken; | ||||
| 	} | ||||
| 	 | ||||
| 	public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException | ||||
| 	{ | ||||
| 		for (int i = 0; i < callbacks.length; i++) | ||||
| 		{ | ||||
| 			if (callbacks[i] instanceof NameCallback) { | ||||
| 				NameCallback nc = (NameCallback) callbacks[i]; | ||||
| 				nc.setName("CasaIdentityUser"); | ||||
| 			} else if (callbacks[i] instanceof PasswordCallback) { | ||||
| 				PasswordCallback pc = (PasswordCallback) callbacks[i]; | ||||
| 				//System.out.println("SampleAppCallbackHandler.handle()- Token length = " + m_authToken.length()); | ||||
| 				char[] allChars = m_authToken.toCharArray(); | ||||
| 				 | ||||
| 				// Remove the null terminator | ||||
| 				char[] tokenChars = new char[allChars.length - 1]; | ||||
| 				for (int ii = 0; ii < tokenChars.length; ii++) | ||||
| 					tokenChars[ii] = allChars[ii]; | ||||
| 				pc.setPassword(tokenChars); | ||||
| 			} else { | ||||
| 				throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback"); | ||||
| 			} | ||||
| 		}			 | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										38
									
								
								CASA-auth-token/java/server/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								CASA-auth-token/java/server/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program is distributed in the hope that it will be useful, | ||||
| #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| #SUBDIRS = AuthTokenValidate ApacheSupport PamSupport | ||||
| SUBDIRS = AuthTokenValidate ApacheSupport PamSupport AuthTokenSvc JaasSupport | ||||
|  | ||||
| DIST_SUBDIRS = AuthTokenValidate ApacheSupport PamSupport AuthTokenSvc JaasSupport | ||||
|  | ||||
| CFILES = | ||||
|  | ||||
| EXTRA_DIST = $(CFILES) | ||||
|  | ||||
| .PHONY: package package-clean package-install package-uninstall | ||||
| package package-clean package-install package-uninstall: | ||||
| 	$(MAKE) -C $(TARGET_OS) $@ | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
|  | ||||
		Reference in New Issue
	
	Block a user