1 /*
2 * Copyright (c) 2007, Fraunhofer-Gesellschaft
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 * (1) Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the disclaimer at the end.
11 * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * (2) Neither the name of Fraunhofer nor the names of its
17 * contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * DISCLAIMER
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 */
35 package org.ogf.graap.wsag.security.core.keystore;
36
37 import java.io.IOException;
38
39 import javax.security.auth.callback.Callback;
40 import javax.security.auth.callback.CallbackHandler;
41 import javax.security.auth.callback.ConfirmationCallback;
42 import javax.security.auth.callback.NameCallback;
43 import javax.security.auth.callback.PasswordCallback;
44 import javax.security.auth.callback.TextOutputCallback;
45 import javax.security.auth.callback.UnsupportedCallbackException;
46
47 import org.ogf.graap.wsag.security.core.KeystoreProperties;
48
49 /**
50 * KeystoreCallbackHandler
51 *
52 * @author Oliver Waeldrich
53 *
54 */
55 public class KeystoreCallbackHandler implements CallbackHandler
56 {
57
58 private KeystoreProperties properties;
59
60 /**
61 * The callback handler uses the specified keystore properties to handle JAAS callbacks on the specified
62 * keystore.
63 *
64 * @param properties
65 * the keystore properties to use
66 */
67 public KeystoreCallbackHandler( KeystoreProperties properties )
68 {
69 this.properties = properties;
70 }
71
72 /**
73 * {@inheritDoc}
74 */
75 public void handle( Callback[] callbacks ) throws IOException, UnsupportedCallbackException
76 {
77 int passwordInvocations = 0;
78
79 for ( int i = 0; i < callbacks.length; i++ )
80 {
81 Callback callback = callbacks[i];
82
83 if ( callback instanceof KeystoreCallback )
84 {
85 KeystoreCallback ksCallback = (KeystoreCallback) callback;
86
87 ksCallback.setPrivateKeyPassword( properties.getPrivateKeyPassword() );
88 ksCallback.setKeystorePassword( properties.getKeystorePassword() );
89 ksCallback.setTruststorePassword( properties.getTruststorePassword() );
90
91 continue;
92 }
93 else if ( callback instanceof TextOutputCallback )
94 {
95 continue;
96 }
97 else if ( callback instanceof NameCallback )
98 {
99 NameCallback nameCallback = (NameCallback) callback;
100 nameCallback.setName( properties.getKeyStoreAlias() );
101 continue;
102 }
103 else if ( callback instanceof PasswordCallback )
104 {
105 PasswordCallback passwordCallback = (PasswordCallback) callback;
106
107 if ( passwordInvocations == 0 )
108 {
109 passwordCallback.setPassword( properties.getKeystorePassword().toCharArray() );
110 }
111 else if ( passwordInvocations == 1 )
112 {
113 passwordCallback.setPassword( properties.getPrivateKeyPassword().toCharArray() );
114 }
115 else
116 {
117 throw new UnsupportedCallbackException( callback, "Only 2 invocations allowed." );
118 }
119 continue;
120 }
121 else if ( callback instanceof ConfirmationCallback )
122 {
123 ConfirmationCallback confirmationCallback = (ConfirmationCallback) callback;
124 confirmationCallback.setSelectedIndex( ConfirmationCallback.OK );
125 continue;
126 }
127
128 throw new UnsupportedCallbackException( callback );
129 }
130 }
131 }