package com.seafile.seadroid2.ssl; import java.security.cert.X509Certificate; import java.util.List; import java.util.Map; import android.util.Log; import com.google.common.collect.Maps; import com.seafile.seadroid2.util.ConcurrentAsyncTask; import com.seafile.seadroid2.account.Account; /** * Save the ssl certificates the user has confirmed to trust */ public final class CertsManager { private static final String DEBUG_TAG = "CertsManager"; private final CertsDBHelper db = CertsDBHelper.getDatabaseHelper(); private final Map<Account, X509Certificate> cachedCerts = Maps.newConcurrentMap(); private static CertsManager instance; public static synchronized CertsManager instance() { if (instance == null) { instance = new CertsManager(); } return instance; } public void saveCertForAccount(final Account account, boolean rememberChoice) { List<X509Certificate> certs = SSLTrustManager.instance().getCertsChainForAccount(account); if (certs == null || certs.size() == 0) { return; } final X509Certificate cert = certs.get(0); cachedCerts.put(account, cert); if (rememberChoice) { ConcurrentAsyncTask.submit(new Runnable() { @Override public void run() { db.saveCertificate(account.server, cert); } }); } Log.d(DEBUG_TAG, "saved cert for account " + account); } public X509Certificate getCertificate(Account account) { X509Certificate cert = cachedCerts.get(account); if (cert != null) { return cert; } cert = db.getCertificate(account.server); if (cert != null) { cachedCerts.put(account, cert); } return cert; } }