KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > ristretto > auth > mechanism > SaslWrapper


1 /* ***** BEGIN LICENSE BLOCK *****
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Mozilla Public License Version
5  * 1.1 (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * Software distributed under the License is distributed on an "AS IS" basis,
10  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11  * for the specific language governing rights and limitations under the
12  * License.
13  *
14  * The Original Code is Ristretto Mail API.
15  *
16  * The Initial Developers of the Original Code are
17  * Timo Stich and Frederik Dietz.
18  * Portions created by the Initial Developers are Copyright (C) 2004
19  * All Rights Reserved.
20  *
21  * Contributor(s):
22  *
23  * Alternatively, the contents of this file may be used under the terms of
24  * either the GNU General Public License Version 2 or later (the "GPL"), or
25  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26  * in which case the provisions of the GPL or the LGPL are applicable instead
27  * of those above. If you wish to allow use of your version of this file only
28  * under the terms of either the GPL or the LGPL, and not to allow others to
29  * use your version of this file under the terms of the MPL, indicate your
30  * decision by deleting the provisions above and replace them with the notice
31  * and other provisions required by the GPL or the LGPL. If you do not delete
32  * the provisions above, a recipient may use your version of this file under
33  * the terms of any one of the MPL, the GPL or the LGPL.
34  *
35  * ***** END LICENSE BLOCK ***** */

36
37 package org.columba.ristretto.auth.mechanism;
38
39 import java.lang.reflect.InvocationTargetException JavaDoc;
40 import java.lang.reflect.Method JavaDoc;
41 import java.util.Map JavaDoc;
42
43 import javax.security.auth.callback.Callback JavaDoc;
44 import javax.security.auth.callback.CallbackHandler JavaDoc;
45
46 /**
47  * Wraps the Sasl classes. This is necessary to compensate for the package change
48  * between Java 1.4 and 1.5 .
49  *
50  * @author timo
51  *
52  */

53 public class SaslWrapper {
54
55     private static final boolean JAVA_14 = System.getProperty("java.version").matches("1\\.4.*");
56     
57     private static final String JavaDoc PACKAGE_14 = "com.sun.security.sasl.preview.";
58     private static final String JavaDoc PACKAGE_15 = "javax.security.sasl.";
59     
60     String JavaDoc packageString;
61     Class JavaDoc saslClient;
62     Class JavaDoc sasl;
63     
64     Object JavaDoc saslClientInstance;
65     
66     public SaslWrapper() throws Exception JavaDoc {
67         
68         if( JAVA_14 ) {
69             packageString = PACKAGE_14;
70         } else {
71             packageString = PACKAGE_15;
72         }
73
74         saslClient = Class.forName(packageString + "SaslClient");
75         sasl = Class.forName(packageString + "Sasl");
76         
77     }
78     
79     public static boolean available() {
80         if( JAVA_14 ) {
81             try {
82                 Class.forName(PACKAGE_14 + "Sasl");
83             } catch (ClassNotFoundException JavaDoc e) {
84                 return false;
85             }
86         }
87         
88         return true;
89     }
90     
91     public void createClient(String JavaDoc[] type, String JavaDoc user, String JavaDoc service, String JavaDoc hostname, Map JavaDoc map, CallbackHandler JavaDoc handler) throws IllegalArgumentException JavaDoc, IllegalAccessException JavaDoc, InvocationTargetException JavaDoc, SecurityException JavaDoc, NoSuchMethodException JavaDoc {
92         Method JavaDoc createSaslClient = sasl.getMethod("createSaslClient",new Class JavaDoc[] {String JavaDoc[].class
93                 , String JavaDoc.class, String JavaDoc.class, String JavaDoc.class, Map JavaDoc.class, CallbackHandler JavaDoc.class
94         });
95
96         saslClientInstance = createSaslClient.invoke(null, new Object JavaDoc[] {type, user, service, hostname, map, handler});
97     }
98     
99     public byte[] evaluateChallenge(byte[] challenge ) throws SecurityException JavaDoc, NoSuchMethodException JavaDoc, IllegalArgumentException JavaDoc, IllegalAccessException JavaDoc, InvocationTargetException JavaDoc {
100         Method JavaDoc evaluateChallenge = saslClient.getMethod("evaluateChallenge", new Class JavaDoc[] {byte[].class});
101         
102         Object JavaDoc result = evaluateChallenge.invoke(saslClientInstance, new Object JavaDoc[] {challenge});
103         
104         return (byte[]) result;
105     }
106     
107     public boolean isComplete() throws SecurityException JavaDoc, NoSuchMethodException JavaDoc, IllegalArgumentException JavaDoc, IllegalAccessException JavaDoc, InvocationTargetException JavaDoc {
108         Method JavaDoc evaluateChallenge = saslClient.getMethod("isComplete", new Class JavaDoc[] {});
109         
110         Boolean JavaDoc result = (Boolean JavaDoc) evaluateChallenge.invoke(saslClientInstance, new Object JavaDoc[0]);
111         
112         return result.booleanValue();
113     }
114
115     public boolean handle(Callback JavaDoc callback) {
116         try {
117             Class JavaDoc realmCallback = Class.forName(packageString + "RealmCallback");
118             
119             if( realmCallback.equals(callback.getClass())) {
120                 Method JavaDoc setText = realmCallback.getMethod("setText", new Class JavaDoc[] {String JavaDoc.class});
121                 Method JavaDoc getDefaultText = realmCallback.getMethod("getDefaultText", new Class JavaDoc[0]);
122                 
123                 setText.invoke(callback, new Object JavaDoc[] {getDefaultText.invoke(callback, new Object JavaDoc[0])});
124                 return true;
125             }
126             
127             Class JavaDoc realmChoiceCallback = Class.forName(packageString + "RealmChoiceCallback");
128             
129             if( realmChoiceCallback.equals(callback.getClass())) {
130                 Method JavaDoc setSelectedIndex = realmChoiceCallback.getMethod("setSelectedIndex", new Class JavaDoc[] {int.class});
131                 Method JavaDoc getDefaultChoice = realmChoiceCallback.getMethod("getDefaultChoice", new Class JavaDoc[0]);
132                 
133                 setSelectedIndex.invoke(callback, new Object JavaDoc[] {getDefaultChoice.invoke(callback, new Object JavaDoc[0])});
134                 return true;
135             }
136         } catch (Exception JavaDoc e) {
137             return false;
138         }
139         
140         return false;
141     }
142     
143 }
144
Popular Tags