正在查看: 逼多多 v3.6.2 应用的 AdvancedTlsX509KeyManager.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: 逼多多 v3.6.2 应用的 AdvancedTlsX509KeyManager.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package io.grpc.util;
import io.grpc.ExperimentalApi;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.security.GeneralSecurityException;
import java.security.Principal;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.X509ExtendedKeyManager;
import q.l;
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/8024")
public final class AdvancedTlsX509KeyManager extends X509ExtendedKeyManager {
private static final Logger log = Logger.getLogger(AdvancedTlsX509KeyManager.class.getName());
private volatile KeyInfo keyInfo;
public interface Closeable extends java.io.Closeable {
@Override
void close();
}
private static class KeyInfo {
final X509Certificate[] certs;
final PrivateKey key;
public KeyInfo(PrivateKey privateKey, X509Certificate[] x509CertificateArr) {
this.key = privateKey;
this.certs = x509CertificateArr;
}
}
private class LoadFilePathExecution implements Runnable {
File certFile;
File keyFile;
long currentKeyTime = 0;
long currentCertTime = 0;
public LoadFilePathExecution(File file, File file2) {
this.keyFile = file;
this.certFile = file2;
}
@Override
public void run() {
try {
UpdateResult readAndUpdate = AdvancedTlsX509KeyManager.this.readAndUpdate(this.keyFile, this.certFile, this.currentKeyTime, this.currentCertTime);
if (readAndUpdate.success) {
this.currentKeyTime = readAndUpdate.keyTime;
this.currentCertTime = readAndUpdate.certTime;
}
} catch (IOException | GeneralSecurityException e) {
AdvancedTlsX509KeyManager.log.log(Level.SEVERE, "Failed refreshing private key and certificate chain from files. Using previous ones", e);
}
}
}
private static class UpdateResult {
long certTime;
long keyTime;
boolean success;
public UpdateResult(boolean z, long j, long j3) {
this.success = z;
this.keyTime = j;
this.certTime = j3;
}
}
public UpdateResult readAndUpdate(File file, File file2, long j, long j3) throws IOException, GeneralSecurityException {
long lastModified = file.lastModified();
long lastModified2 = file2.lastModified();
if (lastModified == j || lastModified2 == j3) {
return new UpdateResult(false, j, j3);
}
FileInputStream fileInputStream = new FileInputStream(file);
try {
try {
PrivateKey privateKey = CertificateUtils.getPrivateKey(fileInputStream);
FileInputStream fileInputStream2 = new FileInputStream(file2);
try {
try {
updateIdentityCredentials(privateKey, CertificateUtils.getX509Certificates(fileInputStream2));
UpdateResult updateResult = new UpdateResult(true, lastModified, lastModified2);
fileInputStream2.close();
fileInputStream.close();
return updateResult;
} catch (Throwable th) {
th = th;
fileInputStream2.close();
throw th;
}
} catch (Throwable th2) {
th = th2;
}
} catch (Throwable th3) {
th = th3;
fileInputStream.close();
throw th;
}
} catch (Throwable th4) {
th = th4;
fileInputStream.close();
throw th;
}
}
@Override
public String chooseClientAlias(String[] strArr, Principal[] principalArr, Socket socket) {
return "default";
}
@Override
public String chooseEngineClientAlias(String[] strArr, Principal[] principalArr, SSLEngine sSLEngine) {
return "default";
}
@Override
public String chooseEngineServerAlias(String str, Principal[] principalArr, SSLEngine sSLEngine) {
return "default";
}
@Override
public String chooseServerAlias(String str, Principal[] principalArr, Socket socket) {
return "default";
}
@Override
public X509Certificate[] getCertificateChain(String str) {
if (str.equals("default")) {
return (X509Certificate[]) Arrays.copyOf(this.keyInfo.certs, this.keyInfo.certs.length);
}
return null;
}
@Override
public String[] getClientAliases(String str, Principal[] principalArr) {
return new String[]{"default"};
}
@Override
public PrivateKey getPrivateKey(String str) {
if (str.equals("default")) {
return this.keyInfo.key;
}
return null;
}
@Override
public String[] getServerAliases(String str, Principal[] principalArr) {
return new String[]{"default"};
}
public void updateIdentityCredentials(PrivateKey privateKey, X509Certificate[] x509CertificateArr) {
this.keyInfo = new KeyInfo((PrivateKey) l.o(privateKey, "key"), (X509Certificate[]) l.o(x509CertificateArr, "certs"));
}
public Closeable updateIdentityCredentialsFromFile(File file, File file2, long j, TimeUnit timeUnit, ScheduledExecutorService scheduledExecutorService) throws IOException, GeneralSecurityException {
if (!readAndUpdate(file, file2, 0L, 0L).success) {
throw new GeneralSecurityException("Files were unmodified before their initial update. Probably a bug.");
}
final ScheduledFuture<?> scheduleWithFixedDelay = scheduledExecutorService.scheduleWithFixedDelay(new LoadFilePathExecution(file, file2), j, j, timeUnit);
return new Closeable() {
@Override
public void close() {
scheduleWithFixedDelay.cancel(false);
}
};
}
public void updateIdentityCredentialsFromFile(File file, File file2) throws IOException, GeneralSecurityException {
if (!readAndUpdate(file, file2, 0L, 0L).success) {
throw new GeneralSecurityException("Files were unmodified before their initial update. Probably a bug.");
}
}
}