///* // * Copyright (C) 2016 The Android Open Source Project // * // * Licensed under the Apache License, Version 2.0 (the "License"); // * you may not use this file except in compliance with the License. // * You may obtain a copy of the License at // * // * http://www.apache.org/licenses/LICENSE-2.0 // * // * Unless required by applicable law or agreed to in writing, software // * distributed under the License is distributed on an "AS IS" BASIS, // * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // * See the License for the specific language governing permissions and // * limitations under the License. // */ // //package com.android.apksigner; // //import java.io.BufferedReader; //import java.io.Console; //import java.io.File; //import java.io.IOException; //import java.io.InputStreamReader; //import java.nio.charset.Charset; //import java.nio.file.Files; //import java.util.HashMap; //import java.util.Map; // ///** // * Retriever of passwords based on password specs supported by {@code apksigner} tool. // * // * <p>apksigner supports retrieving multiple passwords from the same source (e.g., file, standard // * input) which adds the need to keep some sources open across password retrievals. This class // * addresses the need. // * // * <p>To use this retriever, construct a new instance, use the instance to retrieve passwords, and // * then invoke {@link #clone()} on the instance when done, enabling the instance to close any // * held resources. // */ //class PasswordRetriever implements AutoCloseable { // public static final String SPEC_STDIN = "stdin"; // // private final Map<File, BufferedReader> mFileReaders = new HashMap<>(); // private BufferedReader mStdIn; // // private boolean mClosed; // // /** // * Gets the password described by the provided spec. // * // * <p>Supported specs: // * <ul> // * <li><em>stdin</em> -- read password as a line from console, if available, or standard // * input if console is not available</li> // * <li><em>pass:password</em> -- password specified inside the spec, starting after // * {@code pass:}</li> // * <li><em>file:path</em> -- read password as a line from the specified file</li> // * <li><em>env:name</em> -- password is in the specified environment variable</li> // * </ul> // * // * <p>When the same file (including standard input) is used for providing multiple passwords, // * the passwords are read from the file one line at a time. // */ // public String getPassword(String spec, String description) throws IOException { // assertNotClosed(); // if (spec.startsWith("pass:")) { // return spec.substring("pass:".length()); // } else if (SPEC_STDIN.equals(spec)) { // Console console = System.console(); // if (console != null) { // char[] password = console.readPassword(description + ": "); // if (password == null) { // throw new IOException("Failed to read " + description + ": console closed"); // } // return new String(password); // } // // if (mStdIn == null) { // mStdIn = // new BufferedReader( // new InputStreamReader(System.in, Charset.defaultCharset())); // } // System.out.println(description + ":"); // String line = mStdIn.readLine(); // if (line == null) { // throw new IOException( // "Failed to read " + description + ": standard input closed"); // } // return line; // } else if (spec.startsWith("file:")) { // String name = spec.substring("file:".length()); // File file = new File(name).getCanonicalFile(); // BufferedReader in = mFileReaders.get(file); // if (in == null) { // in = Files.newBufferedReader(file.toPath(), Charset.defaultCharset()); // mFileReaders.put(file, in); // } // String line = in.readLine(); // if (line == null) { // throw new IOException( // "Failed to read " + description + " : end of file reached in " + file); // } // return line; // } else if (spec.startsWith("env:")) { // String name = spec.substring("env:".length()); // String value = System.getenv(name); // if (value == null) { // throw new IOException( // "Failed to read " + description + ": environment variable " + value // + " not specified"); // } // return value; // } else { // throw new IOException("Unsupported password spec for " + description + ": " + spec); // } // } // // // private void assertNotClosed() { // if (mClosed) { // throw new IllegalStateException("Closed"); // } // } // // @Override // public void close() { // if (mStdIn != null) { // try { // mStdIn.close(); // } catch (IOException ignored) { // } finally { // mStdIn = null; // } // } // for (BufferedReader in : mFileReaders.values()) { // try { // in.close(); // } catch (IOException ignored) {} // } // mFileReaders.clear(); // mClosed = true; // } //}