Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 22 additions & 9 deletions src/main/java/Diadoc/Api/DiadocApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,30 @@ public class DiadocApi {
private EmployeePowerOfAttorneyClient employeePowerOfAttorneyClient;
private DocumentWorkflowClient documentWorkflowClient;

protected final DiadocHttpClient diadocHttpClient;

public DiadocApi(String apiClientId, String url, @Nullable HttpHost proxyHost, @Nullable ConnectionSettings connectionSettings) {
if (url == null) {
throw new IllegalArgumentException("url");
this(
new DiadocHttpClient(
apiClientId,
url,
proxyHost,
connectionSettings
)
);
}

public DiadocApi(String apiClientId, String url) {
this(apiClientId, url, null, null);
}

public DiadocApi(DiadocHttpClient diadocHttpClient) {
if (diadocHttpClient == null) {
throw new IllegalArgumentException("diadocHttpClient");
}
authManager = new AuthManager(apiClientId);
DiadocHttpClient diadocHttpClient = new DiadocHttpClient(authManager.getCredentialsProvider(), url, proxyHost, connectionSettings);
authClient = new AuthenticateClient(authManager, diadocHttpClient);
this.diadocHttpClient = diadocHttpClient;
authManager = new AuthManager(diadocHttpClient);
authClient = new AuthenticateClient(diadocHttpClient);
organizationClient = new OrganizationClient(diadocHttpClient);
departmentClient = new DepartmentClient(diadocHttpClient);
employeeClient = new EmployeeClient(diadocHttpClient);
Expand All @@ -78,10 +95,6 @@ public DiadocApi(String apiClientId, String url, @Nullable HttpHost proxyHost, @
authManager.setCredentials(null);
}

public DiadocApi(String apiClientId, String url) {
this(apiClientId, url, null, null);
}

public AuthenticateClient getAuthClient() {
return authClient;
}
Expand Down
27 changes: 11 additions & 16 deletions src/main/java/Diadoc/Api/auth/AuthManager.java
Original file line number Diff line number Diff line change
@@ -1,35 +1,30 @@
package Diadoc.Api.auth;

import org.apache.http.auth.AuthScope;
import Diadoc.Api.httpClient.DiadocHttpClient;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;

public class AuthManager {
private boolean isAuthenticated = false;
private String apiClientId;
private CredentialsProvider credentialsProvider;

public AuthManager(String apiClientId) {
this.apiClientId = apiClientId;
credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new DiadocCredentials(apiClientId, null));

private final DiadocHttpClient diadocHttpClient;

public AuthManager(DiadocHttpClient diadocHttpClient) {
this.diadocHttpClient = diadocHttpClient;
}

public CredentialsProvider getCredentialsProvider() {
return credentialsProvider;
return diadocHttpClient.getCredentialsProvider();
}

public boolean isAuthenticated() {
return isAuthenticated;
return diadocHttpClient.isAuthenticated();
}

public void setCredentials(String authToken) {
isAuthenticated = (authToken != null);
credentialsProvider.setCredentials(AuthScope.ANY, new DiadocCredentials(apiClientId, authToken));
diadocHttpClient.setCredentials(authToken);
}

public void clearCredentials(){
isAuthenticated = false;
credentialsProvider.setCredentials(AuthScope.ANY, new DiadocCredentials(apiClientId, null));
diadocHttpClient.clearCredentials();
}

}
20 changes: 9 additions & 11 deletions src/main/java/Diadoc/Api/auth/AuthenticateClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,20 @@
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;

import static Diadoc.Api.Proto.ExternalServiceAuthInfoProtos.*;
import static java.nio.charset.StandardCharsets.*;
import static Diadoc.Api.Proto.ExternalServiceAuthInfoProtos.ExternalServiceAuthInfo;
import static java.nio.charset.StandardCharsets.UTF_8;

public class AuthenticateClient {
private static final String V_3_AUTHENTICATE = "/V3/Authenticate";
private AuthManager authManager;
private DiadocHttpClient diadocHttpClient;

public AuthenticateClient(AuthManager authManager, DiadocHttpClient diadocHttpClient) {
this.authManager = authManager;
public AuthenticateClient(DiadocHttpClient diadocHttpClient) {
this.diadocHttpClient = diadocHttpClient;
}

public void authenticate(String sid) throws DiadocSdkException {
try {
authManager.clearCredentials();
diadocHttpClient.clearCredentials();
var request = RequestBuilder
.post(new URIBuilder(diadocHttpClient.getBaseUrl())
.setPath(V_3_AUTHENTICATE)
Expand All @@ -41,15 +39,15 @@ public void authenticate(String sid) throws DiadocSdkException {
.setEntity(new ByteArrayEntity(sid.getBytes()));

var response = diadocHttpClient.performRequest(request);
authManager.setCredentials(new String(response, UTF_8));
diadocHttpClient.setCredentials(new String(response, UTF_8));
} catch (URISyntaxException | IOException ex) {
throw new DiadocSdkException(ex);
}
}

public void authenticate(String login, String password) throws DiadocSdkException {
try {
authManager.clearCredentials();
diadocHttpClient.clearCredentials();

var request = RequestBuilder
.post(new URIBuilder(diadocHttpClient.getBaseUrl())
Expand All @@ -65,7 +63,7 @@ public void authenticate(String login, String password) throws DiadocSdkExceptio
.toByteArray()));

var response = diadocHttpClient.performRequest(request);
authManager.setCredentials(new String(response, UTF_8));
diadocHttpClient.setCredentials(new String(response, UTF_8));
} catch (IOException | URISyntaxException e) {
throw new DiadocSdkException(e);
}
Expand All @@ -74,7 +72,7 @@ public void authenticate(String login, String password) throws DiadocSdkExceptio

public void authenticate(X509Certificate currentCert, boolean autoConfirm) throws DiadocSdkException {
try {
authManager.clearCredentials();
diadocHttpClient.clearCredentials();

var request = RequestBuilder
.post(new URIBuilder(diadocHttpClient.getBaseUrl())
Expand Down Expand Up @@ -110,7 +108,7 @@ public void confirmAuthenticationByCertificate(X509Certificate currentCert, Stri

var response = diadocHttpClient.performRequest(request);

authManager.setCredentials(StringUtils.newStringUtf8(response));
diadocHttpClient.setCredentials(StringUtils.newStringUtf8(response));
} catch (URISyntaxException | CertificateEncodingException | IOException ex) {
throw new DiadocSdkException(ex);
}
Expand Down
105 changes: 105 additions & 0 deletions src/main/java/Diadoc/Api/httpClient/DefaultHttpClientBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package Diadoc.Api.httpClient;

import Diadoc.Api.ConnectionSettings;
import Diadoc.Api.auth.DiadocPreemptiveAuthRequestInterceptor;
import Diadoc.Api.helpers.EnvironmentHelpers;
import org.apache.http.HttpHost;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustAllStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.jetbrains.annotations.Nullable;

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.function.Consumer;

public class DefaultHttpClientBuilder {

private Consumer<PoolingHttpClientConnectionManager> connectionManagerConfigurer;

private Consumer<HttpClientBuilder> httpBuilderConfigurer;

public CloseableHttpClient build(CredentialsProvider credentialsProvider) {
SSLConnectionSocketFactory sslSocketFactory = trustfulSslSocketFactory();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(
RegistryBuilder.<ConnectionSocketFactory>create()
.register("https", sslSocketFactory)
.register("http", new PlainConnectionSocketFactory())
.build()
);
if (connectionManagerConfigurer != null) {
connectionManagerConfigurer.accept(connectionManager);
}

HttpClientBuilder builder = HttpClients.custom()
.setSSLSocketFactory(sslSocketFactory)
.setConnectionManager(connectionManager)
.setUserAgent(EnvironmentHelpers.getUserAgentString())
.addInterceptorFirst(new DiadocPreemptiveAuthRequestInterceptor())
.addInterceptorLast(new ContentLengthInterceptor())
.setDefaultCredentialsProvider(credentialsProvider);

if (httpBuilderConfigurer != null) {
httpBuilderConfigurer.accept(builder);
}

return builder.build();
}

public DefaultHttpClientBuilder configureConnectionManager(
Consumer<PoolingHttpClientConnectionManager> connectionManagerConfigurer
) {
this.connectionManagerConfigurer = connectionManagerConfigurer;
return this;
}


public DefaultHttpClientBuilder configureHttpBuilder(Consumer<HttpClientBuilder> httpBuilderConfigurer) {
this.httpBuilderConfigurer = httpBuilderConfigurer;
return this;
}


public static DefaultHttpClientBuilder defaultClient(
@Nullable HttpHost proxyHost,
@Nullable ConnectionSettings connectionSettings
) {
DefaultHttpClientBuilder builder = new DefaultHttpClientBuilder();
if (connectionSettings != null) {
builder.configureConnectionManager(cm -> {
cm.setMaxTotal(connectionSettings.getMaxTotalConnections());
cm.setDefaultMaxPerRoute(connectionSettings.getMaxConnectionsPerRoute());
});
}

if (proxyHost != null) {
builder.configureHttpBuilder(b -> {
b.setProxy(proxyHost);
});
}
return builder;
}


public static SSLConnectionSocketFactory trustfulSslSocketFactory() {
try {
var ctx = SSLContextBuilder.create().loadTrustMaterial(new TrustAllStrategy()).build();
return new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
e.printStackTrace();
throw new RuntimeException("Can't create ssl connection factory", e);
}
}


}
Loading