Skip to content

Commit

Permalink
Merge pull request #32 from assimbly/feature/issue-31/googledrive-/-o…
Browse files Browse the repository at this point in the history
…auth2---replicate-last-changes-to-assimbly

GoogleDrive / OAuth2 - replicate last changes to Assimbly
  • Loading branch information
skin27 authored Aug 4, 2023
2 parents 0f43d23 + 3600042 commit 6f26e3e
Show file tree
Hide file tree
Showing 11 changed files with 160 additions and 98 deletions.
9 changes: 8 additions & 1 deletion googledrive/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,14 @@
<artifactId>google-oauth-client-jetty</artifactId>
<version>${google.oauth.version}</version>
</dependency>
</dependencies>

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>tenantvariables</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,13 @@ public GoogleDriveClientFactory() {
this.jsonFactory = new JacksonFactory();
}

public Drive makeClient(String clientId, String clientSecret, String applicationName, String refreshToken, String accessToken) {
public Drive makeClient(String clientId, String clientSecret, String applicationName, String accessToken) {
if (clientId == null || clientSecret == null) {
throw new IllegalArgumentException("clientId and clientSecret are required to create Google Drive client.");
}
try {
Credential credential = authorize(clientId, clientSecret);

if (refreshToken != null && !"".equals(refreshToken)) {
credential.setRefreshToken(refreshToken);
}
if (accessToken != null && !"".equals(accessToken)) {
credential.setAccessToken(accessToken);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriParam;
import org.assimbly.tenantvariables.mongo.MongoDao;

public class GoogleDriveConfiguration {

Expand All @@ -15,7 +16,8 @@ public GoogleDriveConfiguration() {
protected String accessToken;

@UriParam
protected String refreshToken;
@Metadata(required = true)
protected String tenant;

@UriParam
protected String directoryId;
Expand Down Expand Up @@ -70,19 +72,23 @@ public void setInitialDelay(String initialDelay) {
}

public String getAccessToken() {
return MongoDao.interpolatePossibleTenantVariable(accessToken, getTenant());
}

public String getAccessTokenNoInterporlation() {
return accessToken;
}

public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}

public String getRefreshToken() {
return refreshToken;
public String getTenant() {
return tenant;
}

public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
public void setTenant(String tenant) {
this.tenant = tenant;
}

public String getFilterFiles() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.assimbly.googledrive;

import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;
Expand Down Expand Up @@ -43,53 +44,59 @@ public class GoogleDriveConsumer extends ScheduledPollConsumer implements Consum
@Override
protected void doStart() throws Exception {
super.doStart();
service = this.endpoint.getClient();
service = this.endpoint.getClient(false);

if (configuration.getFilterFiles() != null)
filterPattern = Pattern.compile(configuration.getFilterFiles());
}

@Override
protected int poll() throws Exception {
if(configuration.getDirectoryId() == null)
configuration.setDirectoryId("root");

findOrCreateMoveToDirectory();

List<File> filesToProcess = new ArrayList<>();
String pageToken = null;

do {
FileList result = service.files().list()
.setQ( "'" + configuration.getDirectoryId() + "' in parents" +
" and mimeType != 'application/vnd.google-apps.folder'" +
" and trashed = false")
.setSpaces("drive")
.setFields("nextPageToken, files(id, name, mimeType)")
.setPageToken(pageToken)
.execute();

for (File file : result.getFiles()) {
if (isGSuiteFile(file) && configuration.getGSuiteFiles().equals("Ignore"))
continue;

if (filterPattern == null || filterPattern.matcher(file.getName()).matches())
filesToProcess.add(file);
}

pageToken = result.getNextPageToken();
try {
if(configuration.getDirectoryId() == null)
configuration.setDirectoryId("root");

findOrCreateMoveToDirectory();

List<File> filesToProcess = new ArrayList<>();
String pageToken = null;

do {
FileList result = service.files().list()
.setQ( "'" + configuration.getDirectoryId() + "' in parents" +
" and mimeType != 'application/vnd.google-apps.folder'" +
" and trashed = false")
.setSpaces("drive")
.setFields("nextPageToken, files(id, name, mimeType)")
.setPageToken(pageToken)
.execute();

} while (pageToken != null);
for (File file : result.getFiles()) {
if (isGSuiteFile(file) && configuration.getGSuiteFiles().equals("Ignore"))
continue;

for(File fileModel : filesToProcess) {
if (filterPattern == null || filterPattern.matcher(file.getName()).matches())
filesToProcess.add(file);
}

java.io.File file = downloadFile(fileModel);
pageToken = result.getNextPageToken();

Exchange exchange = endpoint.createExchange(file, fileModel);
} while (pageToken != null);

this.getProcessor().process(exchange);
for(File fileModel : filesToProcess) {

postProcess(fileModel, file);
java.io.File file = downloadFile(fileModel);

Exchange exchange = endpoint.createExchange(file, fileModel);

this.getProcessor().process(exchange);

postProcess(fileModel, file);
}
} catch (GoogleJsonResponseException e) {
LOG.error("Google Drive Consume error:", e);
service = this.endpoint.getClient(true);
}

return 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ public boolean isSingleton() {
return false;
}

Drive getClient() {
Drive getClient(boolean forceFlag) {
if (client == null) {
client = getClientFactory().makeClient(CLIENT_ID, CLIENT_SECRET, APPLICATION_NAME,
configuration.getRefreshToken(), configuration.getAccessToken());
configuration.getAccessToken());
}

return client;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.apache.camel.Exchange;
import org.apache.camel.component.file.GenericFile;
import org.apache.camel.support.DefaultProducer;
import org.assimbly.tenantvariables.mongo.MongoDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -45,7 +46,8 @@ public void process(Exchange exchange) throws Exception {
}

private void prepareGoogleDriveClient() {
this.service = ((GoogleDriveEndpoint) getEndpoint()).getClient();
boolean forceClient = MongoDao.isTenantVar(configuration.getAccessTokenNoInterporlation());
this.service = ((GoogleDriveEndpoint) getEndpoint()).getClient(forceClient);
}

private GenericFile<File> prepareCamelFile(Exchange exchange) throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -463,24 +463,7 @@ public void setAuthenticationType(String authenticationType) {
* The accessToken for login
*/
public String getAccessToken() {

StringBuffer accessTokenBuf = new StringBuffer();

Pattern pattern = Pattern.compile(TENANT_VARIABLE_EXP);
Matcher matcher = pattern.matcher(accessToken);

while(matcher.find()){
String accessTokenVarName = matcher.group(1);

TenantVariable accessTokenGlobVar = MongoDao.findTenantVariableByName(accessTokenVarName, getTenant());
String accessTokenValue = accessTokenGlobVar.find(getEnvironment()).get().getValue();

matcher.appendReplacement(accessTokenBuf, Matcher.quoteReplacement(accessTokenValue));
}
matcher.appendTail(accessTokenBuf);

return accessTokenBuf.toString();

return MongoDao.interpolatePossibleTenantVariable(accessToken, getTenant());
}

public void setAccessToken(String accessToken) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.commons.lang3.StringUtils;
import org.assimbly.tenantvariables.mongo.MongoDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -41,7 +42,7 @@ public void process(Exchange exchange) {
String expireDate = MongoDao.getTenantVariableValue(expireDateVarName, tenant, environment);
String accessToken = MongoDao.getTenantVariableValue(accessTokenVarName, tenant, environment);
String refreshFlag = MongoDao.getTenantVariableValue(refreshFlagVarName, tenant, environment);
String tokenGlobVarValue = MongoDao.getTenantVariableValue(tokenName, tenant, environment);
String tokenTenantVarValue = MongoDao.getTenantVariableValue(tokenName, tenant, environment);

Calendar expireCal = Calendar.getInstance();
Calendar expireDelayCal = Calendar.getInstance();
Expand All @@ -56,21 +57,21 @@ public void process(Exchange exchange) {
try {
expiryDelayInt = - Integer.parseInt(expiryDelay);
} catch (Exception e) {
logger.error("ERROR to parse expiryDelay value. Default value is "+expiryDelayInt);
logger.warn("Failed to parse expiryDelay value. Default value is "+expiryDelayInt);
}
expireDelayCal.add(Calendar.SECOND, expiryDelayInt);
} catch (Exception e) {
logger.error("ERROR to calculate/set expire date vars", e);
}

if(tokenGlobVarValue == null ||
if(StringUtils.isEmpty(tokenTenantVarValue) ||
nowCal.after(expireCal) || (
nowCal.before(expireCal) && nowCal.after(expireDelayCal) && refreshFlag.equals("0"))
) {
// get new access token from service
String accessTokenOld = accessToken;
accessToken = TokenService.refreshTokenInfo(id, environment, tenant);
if(accessToken!=null && (!accessToken.equals(accessTokenOld) || tokenGlobVarValue==null)) {
if(accessToken!=null && (!accessToken.equals(accessTokenOld) || StringUtils.isEmpty(tokenTenantVarValue))) {
// add token to tenant variable
MongoDao.saveTenantVariable(tokenName, accessToken, tenant, environment);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.assimbly.oauth2token.service;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.assimbly.tenantvariables.mongo.MongoDao;
import org.assimbly.util.exception.OAuth2TokenException;
Expand All @@ -12,6 +13,7 @@
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
import java.util.stream.Collectors;

@Path("/")
@Secured
Expand All @@ -29,13 +31,19 @@ public class TokenService {
public static String OAUTH2_REFRESH_TOKEN_SUFFIX = "_refresh_token";
public static String OAUTH2_REFRESH_FLAG_SUFFIX = "_refresh_flag";
public static String OAUTH2_REDIRECT_URI_SUFFIX = "_redirect_uri";
public static String OAUTH2_CREDENTIALS_TYPE_URI_SUFFIX = "_credentials_type";
public static String OAUTH2_TOKEN_TENANT_VAR_SUFFIX = "_token_global_var";

private static String SERVICE_PARAM_EXPIRES_IN = "expires_in";
private static String SERVICE_PARAM_ACCESS_TOKEN = "access_token";
private static String SERVICE_PARAM_REFRESH_TOKEN = "refresh_token";
private static String SERVICE_PARAM_ERROR = "error";
private static String SERVICE_PARAM_ERROR_DESCRIPTION = "error_description";

private static final String GOOGLE_CLIENT_ID = System.getenv("GOOGLE_CLIENT_ID");
private static final String GOOGLE_CLIENT_SECRET = System.getenv("GOOGLE_CLIENT_SECRET");
private static final String CREDENTIALS_TYPE_CUSTOM = "custom";

// call service to get token information
@GET
@Consumes("application/json")
Expand All @@ -61,20 +69,27 @@ public Map<String, String> tokenInfo(
String refreshTokenVarName = OAUTH2_PREFIX + id + OAUTH2_REFRESH_TOKEN_SUFFIX;
String refreshFlagVarName = OAUTH2_PREFIX + id + OAUTH2_REFRESH_FLAG_SUFFIX;
String redirectUriVarName = OAUTH2_PREFIX + id + OAUTH2_REDIRECT_URI_SUFFIX;
String credentialsTypeVarName = OAUTH2_PREFIX + id + OAUTH2_CREDENTIALS_TYPE_URI_SUFFIX;
String tokenTenantVarName = OAUTH2_PREFIX + id + OAUTH2_TOKEN_TENANT_VAR_SUFFIX;

// check if there's a tenant variable inside tenantVar, and return real value
String scope = MongoDao.getTenantVariableValue(scopeVarName, tenant, environment);
String clientId = MongoDao.getTenantVariableValue(clientIdVarName, tenant, environment);
String clientSecret = MongoDao.getTenantVariableValue(clientSecretVarName, tenant, environment);
String redirectUri = MongoDao.getTenantVariableValue(redirectUriVarName, tenant, environment);
String uriToken = MongoDao.getTenantVariableValue(uriTokenVarName, tenant, environment);
String credentialsType = MongoDao.getTenantVariableValue(credentialsTypeVarName, tenant, environment);
String tokenTenantVar = MongoDao.getTenantVariableValue(tokenTenantVarName, tenant, environment);

boolean customCredentialsType = StringUtils.isEmpty(credentialsType) ||
credentialsType.equals(CREDENTIALS_TYPE_CUSTOM);

// prepare data to send
String urlParameters = "client_id="+clientId+
String urlParameters = "client_id="+(customCredentialsType ? clientId : GOOGLE_CLIENT_ID)+
(scope!=null && !scope.trim().equals("") ? "&scope="+scope : "")+
"&redirect_uri="+redirectUri+
"&grant_type=authorization_code"+
"&client_secret="+clientSecret+
"&client_secret="+(customCredentialsType ? clientSecret : GOOGLE_CLIENT_SECRET)+
"&code="+code;

// call service
Expand All @@ -88,6 +103,7 @@ public Map<String, String> tokenInfo(
String accessToken = tokenInfoMap.get(SERVICE_PARAM_ACCESS_TOKEN);
if(accessToken!=null && !accessToken.isEmpty()) {
MongoDao.saveTenantVariable(accessTokenVarName, accessToken, tenant, environment);
MongoDao.saveTenantVariable(tokenTenantVar, accessToken, tenant, environment);
}
String refreshToken = tokenInfoMap.get(SERVICE_PARAM_REFRESH_TOKEN);
if(refreshToken!=null && !refreshToken.isEmpty()) {
Expand Down Expand Up @@ -116,6 +132,7 @@ public static String refreshTokenInfo(String id, String environment, String tena
String refreshTokenVarName = OAUTH2_PREFIX + id + OAUTH2_REFRESH_TOKEN_SUFFIX;
String refreshFlagVarName = OAUTH2_PREFIX + id + OAUTH2_REFRESH_FLAG_SUFFIX;
String redirectUriVarName = OAUTH2_PREFIX + id + OAUTH2_REDIRECT_URI_SUFFIX;
String credentialsTypeVarName = OAUTH2_PREFIX + id + OAUTH2_CREDENTIALS_TYPE_URI_SUFFIX;

try {
// set refresh flag to active
Expand All @@ -128,13 +145,17 @@ public static String refreshTokenInfo(String id, String environment, String tena
String redirectUri = MongoDao.getTenantVariableValue(redirectUriVarName, tenant, environment);
String refreshToken = MongoDao.getTenantVariableValue(refreshTokenVarName, tenant, environment);
String uriToken = MongoDao.getTenantVariableValue(uriTokenVarName, tenant, environment);
String credentialsType = MongoDao.getTenantVariableValue(credentialsTypeVarName, tenant, environment);

boolean customCredentialsType = StringUtils.isEmpty(credentialsType) ||
credentialsType.equals(CREDENTIALS_TYPE_CUSTOM);

// prepare data to send
String urlParameters = "client_id="+clientId+
String urlParameters = "client_id="+(customCredentialsType ? clientId : GOOGLE_CLIENT_ID)+
(scope!=null && !scope.trim().equals("") ? "&scope="+scope : "")+
"&redirect_uri="+redirectUri+
"&grant_type=refresh_token"+
"&client_secret="+clientSecret+
"&client_secret="+(customCredentialsType ? clientSecret : GOOGLE_CLIENT_SECRET)+
"&refresh_token="+refreshToken;

// call service
Expand Down Expand Up @@ -201,8 +222,8 @@ private static void callService(
stream = con.getErrorStream();
}

BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"), 8);
tokenInfoResp = reader.readLine();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
tokenInfoResp = reader.lines().collect(Collectors.joining(System.lineSeparator()));

if (tokenInfoResp != null) {
JSONObject tokenInfoJson = new JSONObject(tokenInfoResp);
Expand All @@ -224,7 +245,7 @@ private static void callService(
// access_token
String accessToken = tokenInfoJson.getString(SERVICE_PARAM_ACCESS_TOKEN);
// refresh_token
String refreshToken = tokenInfoJson.getString(SERVICE_PARAM_REFRESH_TOKEN);
String refreshToken = tokenInfoJson.optString(SERVICE_PARAM_REFRESH_TOKEN);
// add token info into hashmap
tokenInfoMap.put(SERVICE_PARAM_EXPIRES_IN, String.valueOf(nowCal.getTimeInMillis()));
tokenInfoMap.put(SERVICE_PARAM_ACCESS_TOKEN, accessToken);
Expand Down
Loading

0 comments on commit 6f26e3e

Please sign in to comment.