All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.snowflake.client.core.CredentialManager Maven / Gradle / Ivy

/*
 * Copyright (c) 2012-2019 Snowflake Computing Inc. All rights reserved.
 */

package net.snowflake.client.core;

import com.google.common.base.Strings;
import java.net.MalformedURLException;
import java.net.URL;
import net.snowflake.client.jdbc.ErrorCode;
import net.snowflake.client.log.SFLogger;
import net.snowflake.client.log.SFLoggerFactory;

public class CredentialManager {
  private static final SFLogger logger = SFLoggerFactory.getLogger(CredentialManager.class);
  private SecureStorageManager secureStorageManager;

  private CredentialManager() {
    if (Constants.getOS() == Constants.OS.MAC) {
      secureStorageManager = SecureStorageAppleManager.builder();
    } else if (Constants.getOS() == Constants.OS.WINDOWS) {
      secureStorageManager = SecureStorageWindowsManager.builder();
    } else if (Constants.getOS() == Constants.OS.LINUX) {
      secureStorageManager = SecureStorageLinuxManager.builder();
    } else {
      logger.error("Unsupported Operating System. Expected: OSX, Windows, Linux");
    }
  }

  private static class CredentialManagerHolder {
    private static final CredentialManager INSTANCE = new CredentialManager();
  }

  public static CredentialManager getInstance() {
    return CredentialManagerHolder.INSTANCE;
  }

  /**
   * Reuse the cached id token stored locally
   *
   * @param loginInput login input to attach id token
   */
  synchronized void fillCachedIdToken(SFLoginInput loginInput) throws SFException {
    String idToken =
        secureStorageManager.getCredential(
            extractHostFromServerUrl(loginInput.getServerUrl()), loginInput.getUserName());

    if (idToken == null) {
      logger.debug("retrieved idToken is null");
    }
    loginInput.setIdToken(idToken); // idToken can be null
    return;
  }

  /**
   * Store the temporary credential
   *
   * @param loginInput loginInput to denote to the cache
   * @param loginOutput loginOutput to denote to the cache
   */
  synchronized void writeTemporaryCredential(SFLoginInput loginInput, SFLoginOutput loginOutput)
      throws SFException {
    String idToken = loginOutput.getIdToken();
    if (Strings.isNullOrEmpty(idToken)) {
      logger.debug("no idToken is given.");
      return; // no idToken
    }

    secureStorageManager.setCredential(
        extractHostFromServerUrl(loginInput.getServerUrl()), loginInput.getUserName(), idToken);
  }

  /** Delete the id token cache */
  void deleteIdTokenCache(String host, String user) {
    secureStorageManager.deleteCredential(host, user);
  }

  /**
   * Used to extract host name from a well formated internal serverUrl, e.g., serverUrl in
   * SFLoginInput.
   */
  private String extractHostFromServerUrl(String serverUrl) throws SFException {
    URL url = null;
    try {
      url = new URL(serverUrl);
    } catch (MalformedURLException e) {
      logger.error("Invalid serverUrl for retrieving host name");
      throw new SFException(ErrorCode.INTERNAL_ERROR, "Invalid serverUrl for retrieving host name");
    }
    return url.getHost();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy