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