Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor analytics events to encrypt or remove sensitive information #5920

Merged
merged 4 commits into from
Jul 18, 2021
Merged
Show file tree
Hide file tree
Changes from 3 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
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,15 @@ public class CommonConfig {
@Value("${signup.allowed-domains}")
private String allowedDomainsString;

// Is this instance hosted on Appsmith cloud?
// isCloudHosted should be true only for our cloud instance
@Value("${is.cloud-hosted:false}")
private boolean isCloudHosted;

@Value("${github_repo}")
private String repo;


private List<String> allowedDomains;

@Bean
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.appsmith.server.services;

import com.appsmith.external.models.BaseDomain;
import com.appsmith.server.configurations.CommonConfig;
import com.appsmith.server.constants.AnalyticsEvents;
import com.appsmith.server.domains.User;
import com.segment.analytics.Analytics;
import com.segment.analytics.messages.IdentifyMessage;
import com.segment.analytics.messages.TrackMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import reactor.core.publisher.Mono;
Expand All @@ -16,17 +18,13 @@
import java.util.Map;

@Service
@RequiredArgsConstructor
@Slf4j
public class AnalyticsService {

private final Analytics analytics;
private final SessionUserService sessionUserService;

@Autowired
public AnalyticsService(@Autowired(required = false) Analytics analytics, SessionUserService sessionUserService) {
this.analytics = analytics;
this.sessionUserService = sessionUserService;
}
private final CommonConfig commonConfig;

public boolean isActive() {
return analytics != null;
Expand Down Expand Up @@ -65,6 +63,16 @@ public void sendEvent(String event, String userId, Map<String, Object> propertie
return;
}

if (!commonConfig.isCloudHosted()) {
userId = DigestUtils.sha256Hex(userId);
if (properties.containsKey("username")) {
properties.put("username", userId);
mohanarpit marked this conversation as resolved.
Show resolved Hide resolved
}
if (properties.containsKey("request")) {
properties.remove("request");
}
}

TrackMessage.Builder messageBuilder = TrackMessage.builder(event).userId(userId);

if (!CollectionUtils.isEmpty(properties)) {
Expand Down Expand Up @@ -99,7 +107,7 @@ public <T extends BaseDomain> Mono<T> sendObjectEvent(AnalyticsEvents event, T o
return object;
}

final String username = (object instanceof User ? (User) object : user).getUsername();
String username = (object instanceof User ? (User) object : user).getUsername();

HashMap<String, Object> analyticsProperties = new HashMap<>();
analyticsProperties.put("id", username);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -770,14 +770,14 @@ private Mono<ActionExecutionRequest> sendExecuteAnalyticsEvent(
if (actionExecutionRequest != null) {
// Do a deep copy of request to not edit
request = new ActionExecutionRequest(
actionExecutionRequest.getQuery(),
actionExecutionRequest.getBody(),
actionExecutionRequest.getHeaders(),
actionExecutionRequest.getHttpMethod(),
actionExecutionRequest.getUrl(),
actionExecutionRequest.getProperties(),
actionExecutionRequest.getExecutionParameters(),
null
actionExecutionRequest.getQuery(),
actionExecutionRequest.getBody(),
actionExecutionRequest.getHeaders(),
actionExecutionRequest.getHttpMethod(),
actionExecutionRequest.getUrl(),
actionExecutionRequest.getProperties(),
actionExecutionRequest.getExecutionParameters(),
null
);
} else {
request = new ActionExecutionRequest();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.appsmith.server.solutions;

import com.appsmith.server.configurations.CloudServicesConfig;
import com.appsmith.server.configurations.CommonConfig;
import com.appsmith.server.configurations.ProjectProperties;
import com.appsmith.server.configurations.SegmentConfig;
import com.appsmith.server.dtos.ResponseDTO;
Expand All @@ -9,7 +10,6 @@
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
Expand All @@ -36,16 +36,12 @@ public class ReleaseNotesService {

private final ProjectProperties projectProperties;

private final CommonConfig commonConfig;

public final List<ReleaseNode> releaseNodesCache = new ArrayList<>();

private Instant cacheExpiryTime = null;

@Value("${github_repo}")
private String repo;

@Value("${is.cloud-hosted:false}")
private boolean isCloudHosted;

@Data
static class Releases {
private int totalCount;
Expand Down Expand Up @@ -84,8 +80,8 @@ public Mono<List<ReleaseNode>> getReleaseNodes() {
baseUrl + "/api/v1/releases?instanceId=" + instanceId +
// isCloudHosted should be true only for our cloud instance,
// For docker images that burn the segment key with the image, the CE key will be present
"&isSourceInstall=" + (isCloudHosted || StringUtils.isEmpty(segmentConfig.getCeKey())) +
(StringUtils.isEmpty(repo) ? "" : ("&repo=" + repo))
"&isSourceInstall=" + (commonConfig.isCloudHosted() || StringUtils.isEmpty(segmentConfig.getCeKey())) +
(StringUtils.isEmpty(commonConfig.getRepo()) ? "" : ("&repo=" + commonConfig.getRepo()))
)
.get()
.exchange()
Expand Down