1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/*
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Licensed to the Apache Software Foundation (ASF) under one
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * or more contributor license agreements.  See the NOTICE file
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed with this work for additional information
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * regarding copyright ownership.  The ASF licenses this file
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * to you under the Apache License, Version 2.0 (the
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * "License"); you may not use this file except in compliance
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * with the License.  You may obtain a copy of the License at
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *   http://www.apache.org/licenses/LICENSE-2.0
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing,
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * software distributed under the License is distributed on an
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * KIND, either express or implied.  See the License for the
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * specific language governing permissions and limitations
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * under the License.
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.apache.qpid.management.common.sasl;
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.apache.harmony.javax.security.auth.callback.Callback;
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.apache.harmony.javax.security.auth.callback.CallbackHandler;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.apache.harmony.javax.security.auth.callback.NameCallback;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.apache.harmony.javax.security.auth.callback.PasswordCallback;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.apache.harmony.javax.security.auth.callback.UnsupportedCallbackException;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.IOException;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class UserPasswordCallbackHandler implements CallbackHandler
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String user;
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private char[] pwchars;
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public UserPasswordCallbackHandler(String user, String password)
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    {
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.user = user;
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.pwchars = password.toCharArray();
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    {
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        for (int i = 0; i < callbacks.length; i++)
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        {
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (callbacks[i] instanceof NameCallback)
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            {
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                NameCallback ncb = (NameCallback) callbacks[i];
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                ncb.setName(user);
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else if (callbacks[i] instanceof PasswordCallback)
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            {
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                PasswordCallback pcb = (PasswordCallback) callbacks[i];
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                pcb.setPassword(pwchars);
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            {
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                throw new UnsupportedCallbackException(callbacks[i]);
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private void clearPassword()
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    {
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (pwchars != null)
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        {
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (int i = 0 ; i < pwchars.length ; i++)
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            {
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                pwchars[i] = 0;
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            pwchars = null;
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    protected void finalize()
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    {
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        clearPassword();
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
78