/* * Copyright (C) 2009, Google Inc. * Copyright (C) 2008, Shawn O. Pearce and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at * https://www.eclipse.org/org/documents/edl-v10.php. * * SPDX-License-Identifier: BSD-3-Clause */ package org.eclipse.jgit.util; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.util.Collection; import java.util.concurrent.CopyOnWriteArrayList; /** * Abstract authenticator which remembers prior authentications. */ public abstract class CachedAuthenticator extends Authenticator { private static final Collection cached = new CopyOnWriteArrayList<>(); /** * Add a cached authentication for future use. * * @param ca * the information we should remember. */ public static void add(CachedAuthentication ca) { cached.add(ca); } @Override protected final PasswordAuthentication getPasswordAuthentication() { final String host = getRequestingHost(); final int port = getRequestingPort(); for (CachedAuthentication ca : cached) { if (ca.host.equals(host) && ca.port == port) return ca.toPasswordAuthentication(); } PasswordAuthentication pa = promptPasswordAuthentication(); if (pa != null) { CachedAuthentication ca = new CachedAuthentication(host, port, pa .getUserName(), new String(pa.getPassword())); add(ca); return ca.toPasswordAuthentication(); } return null; } /** * Prompt for and request authentication from the end-user. * * @return the authentication data; null if the user canceled the request * and does not want to continue. */ protected abstract PasswordAuthentication promptPasswordAuthentication(); /** Authentication data to remember and reuse. */ public static class CachedAuthentication { final String host; final int port; final String user; final String pass; /** * Create a new cached authentication. * * @param aHost * system this is for. * @param aPort * port number of the service. * @param aUser * username at the service. * @param aPass * password at the service. */ public CachedAuthentication(final String aHost, final int aPort, final String aUser, final String aPass) { host = aHost; port = aPort; user = aUser; pass = aPass; } PasswordAuthentication toPasswordAuthentication() { return new PasswordAuthentication(user, pass.toCharArray()); } } }