datahub/wherehows-backend/app/utils/PasswordManager.java
Mars Lan 5f5c0937d1 Rename web, backend-service (#490)
* Rename web to wherehows-api and update README.

* Rename backend-service to wherehows-backend

* Rename metadata-etl to wherehows-etl

* Rename hadoop-dataset-extractor-standalone to wherehows-hadoop
2017-07-10 13:42:56 -07:00

121 lines
4.3 KiB
Java

/**
* Copyright 2015 LinkedIn Corp. All rights reserved.
*
* 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.
*/
package utils;
import com.google.common.base.Charsets;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.io.Closer;
import com.google.common.io.LineReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.jasypt.util.text.BasicTextEncryptor;
import play.Logger;
/**
* A password util class for encryption and decryption
* Modified from PasswordManager class in Gobblin (github.com/linkedin/gobblin) project
*
*/
public class PasswordManager {
private static final Logger.ALogger LOG = Logger.of(PasswordManager.class);
private static final String ERROR_ENCRY_MSG = "A master password needs to be provided for encrypting passwords, check your master key location!";
private static final String ERROR_DECRY_MSG = "A master password needs to be provided for decrypting passwords, check your master key location!";
public static String encryptPassword(String plain, String masterPwdLoc) {
return encryptPassword(plain, getMasterPassword(masterPwdLoc));
}
public static String decryptPassword(String plain, String masterPwdLoc) {
return decryptPassword(plain, getMasterPassword(masterPwdLoc));
}
/**
* Encrypt a password. A master password must have been provided in the constructor.
* @param plain A plain password to be encrypted.
* @return The encrypted password.
*/
public static String encryptPassword(String plain, Optional<String> masterPassword) {
Optional<BasicTextEncryptor> encryptor = getEncryptor(masterPassword);
Preconditions.checkArgument(getEncryptor(masterPassword).isPresent(), ERROR_ENCRY_MSG);
try {
return encryptor.get().encrypt(plain);
} catch (Exception e) {
throw new RuntimeException("Failed to encrypt password", e);
}
}
/**
* Decrypt an encrypted password. A master password must have been provided in the constructor.
* @param encrypted An encrypted password.
* @return The decrypted password.
*/
public static String decryptPassword(String encrypted, Optional<String> masterPassword) {
Optional<BasicTextEncryptor> encryptor = getEncryptor(masterPassword);
Preconditions
.checkArgument(encryptor.isPresent(), ERROR_DECRY_MSG);
try {
return encryptor.get().decrypt(encrypted);
} catch (Exception e) {
throw new RuntimeException("Failed to decrypt password " + encrypted, e);
}
}
private static Optional<BasicTextEncryptor> getEncryptor(Optional<String> masterPassword) {
Optional<BasicTextEncryptor> encryptor;
if (masterPassword.isPresent()) {
encryptor = Optional.of(new BasicTextEncryptor());
try {
encryptor.get().setPassword(masterPassword.get());
} catch (Exception e) {
LOG.error("Failed to set master password for encryptor", e);
encryptor = Optional.absent();
}
} else {
encryptor = Optional.absent();
}
return encryptor;
}
public static Optional<String> getMasterPassword(String masterPwdLoc) {
Closer closer = Closer.create();
try {
File file = new File(masterPwdLoc);
if (!file.exists() || file.isDirectory()) {
LOG.warn(masterPwdLoc + " does not exist or is not a file. Cannot decrypt any encrypted password.");
return Optional.absent();
}
InputStream in = new FileInputStream(file);
return Optional.of(new LineReader(new InputStreamReader(in, Charsets.UTF_8)).readLine());
} catch (IOException e) {
throw new RuntimeException("Failed to obtain master password from " + masterPwdLoc, e);
} finally {
try {
closer.close();
} catch (IOException e) {
throw new RuntimeException("Failed to close inputstream for " + masterPwdLoc, e);
}
}
}
}