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