1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/*
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  Licensed to the Apache Software Foundation (ASF) under one or more
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  contributor license agreements.  See the NOTICE file distributed with
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  this work for additional information regarding copyright ownership.
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  The ASF licenses this file to You under the Apache License, Version 2.0
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  (the "License"); you may not use this file except in compliance with
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  the License.  You may obtain a copy of the License at
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  Unless required by applicable law or agreed to in writing, software
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  distributed under the License is distributed on an "AS IS" BASIS,
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  See the License for the specific language governing permissions and
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  limitations under the License.
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.apache.harmony.javax.security.auth.callback;
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.Serializable;
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Arrays;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Is used in conjunction with a {@link CallbackHandler} to retrieve a password
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * when needed.
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class PasswordCallback implements Callback, Serializable {
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static final long serialVersionUID = 2267422647454909926L;
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String prompt;
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    boolean echoOn;
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private char[] inputPassword;
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private void setPrompt(String prompt) throws IllegalArgumentException {
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (prompt == null || prompt.length() == 0) {
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            throw new IllegalArgumentException("auth.14"); //$NON-NLS-1$
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.prompt = prompt;
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Creates a new {@code PasswordCallback} instance.
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param prompt
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *            the message that should be displayed to the user
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param echoOn
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *            determines whether the user input should be echoed
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public PasswordCallback(String prompt, boolean echoOn) {
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        super();
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        setPrompt(prompt);
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.echoOn = echoOn;
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the prompt that was specified when creating this {@code
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * PasswordCallback}
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the prompt
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getPrompt() {
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return prompt;
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Queries whether this {@code PasswordCallback} expects user input to be
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * echoed, which is specified during the creation of the object.
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return {@code true} if (and only if) user input should be echoed
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isEchoOn() {
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return echoOn;
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the password. The {@link CallbackHandler} that performs the actual
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * provisioning or input of the password needs to call this method to hand
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * back the password to the security service that requested it.
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param password
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *            the password. A copy of this is stored, so subsequent changes
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *            to the input array do not affect the {@code PasswordCallback}.
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setPassword(char[] password) {
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (password == null) {
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.inputPassword = password;
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        } else {
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            inputPassword = new char[password.length];
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            System.arraycopy(password, 0, inputPassword, 0, inputPassword.length);
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the password. The security service that needs the password
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * usually calls this method once the {@link CallbackHandler} has finished
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * its work.
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the password. A copy of the internal password is created and
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *         returned, so subsequent changes to the internal password do not
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *         affect the result.
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public char[] getPassword() {
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (inputPassword != null) {
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            char[] tmp = new char[inputPassword.length];
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            System.arraycopy(inputPassword, 0, tmp, 0, tmp.length);
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return tmp;
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return null;
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Clears the password stored in this {@code PasswordCallback}.
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void clearPassword() {
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (inputPassword != null) {
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            Arrays.fill(inputPassword, '\u0000');
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
125