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
1 change: 0 additions & 1 deletion conf/docker-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
"salts_expired_shutdown_hours": 12,
"store_refresh_stale_shutdown_hours": 12,
"operator_type": "public",
"disable_optout_token": true,
"enable_remote_config": true,
"uid_instance_id_prefix": "local-operator"
}
1 change: 0 additions & 1 deletion conf/integ-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
"salts_expired_shutdown_hours": 12,
"store_refresh_stale_shutdown_hours": 12,
"operator_type": "public",
"disable_optout_token": true,
"enable_remote_config": false,
"uid_instance_id_prefix": "local-operator"
}
1 change: 0 additions & 1 deletion conf/local-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
"store_refresh_stale_shutdown_hours": 12,
"operator_type": "public",
"encrypted_files": false,
"disable_optout_token": true,
"enable_remote_config": true,
"uid_instance_id_prefix": "local-operator"
}
1 change: 0 additions & 1 deletion conf/local-e2e-docker-public-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
"salts_expired_shutdown_hours": 12,
"store_refresh_stale_shutdown_hours": 12,
"operator_type": "public",
"disable_optout_token": true,
"enable_remote_config": true,
"uid_instance_id_prefix": "local-public-operator"
}
2 changes: 1 addition & 1 deletion conf/local-e2e-public-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"salts_expired_shutdown_hours": 12,
"store_refresh_stale_shutdown_hours": 12,
"operator_type": "public",
"disable_optout_token": true,

"enable_remote_config": true,
"uid_instance_id_prefix": "local-public-operator"
}
1 change: 0 additions & 1 deletion conf/validator-latest-e2e-docker-public-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
},
"config_scan_period_ms": 300000
},
"disable_optout_token": true,
"enable_remote_config": true,
"uid_instance_id_prefix": "local-public-operator"
}
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.uid2</groupId>
<artifactId>uid2-operator</artifactId>
<version>5.63.22</version>
<version>5.63.23-alpha-287-SNAPSHOT</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand Down
1 change: 0 additions & 1 deletion src/main/java/com/uid2/operator/Const.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ public class Config extends com.uid2.shared.Const.Config {

public static final String ConfigScanPeriodMsProp = "config_scan_period_ms";
public static final String IdentityV3Prop = "identity_v3";
public static final String DisableOptoutTokenProp = "disable_optout_token";
public static final String EnableRemoteConfigProp = "enable_remote_config";
public static final String RuntimeConfigMetadataPathProp = "runtime_config_metadata_path";

Expand Down
7 changes: 0 additions & 7 deletions src/main/java/com/uid2/operator/model/IdentityRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,14 @@
public final class IdentityRequest {
public final PublisherIdentity publisherIdentity;
public final UserIdentity userIdentity;
public final OptoutCheckPolicy optoutCheckPolicy;
public final IdentityEnvironment identityEnvironment;

public IdentityRequest(
PublisherIdentity publisherIdentity,
UserIdentity userIdentity,
OptoutCheckPolicy tokenGeneratePolicy,
IdentityEnvironment identityEnvironment) {
this.publisherIdentity = publisherIdentity;
this.userIdentity = userIdentity;
this.optoutCheckPolicy = tokenGeneratePolicy;
this.identityEnvironment = identityEnvironment;
}

public boolean shouldCheckOptOut() {
return optoutCheckPolicy.equals(OptoutCheckPolicy.RespectOptOut);
}
}
7 changes: 0 additions & 7 deletions src/main/java/com/uid2/operator/model/MapRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,15 @@

public final class MapRequest {
public final UserIdentity userIdentity;
public final OptoutCheckPolicy optoutCheckPolicy;
public final Instant asOf;
public final IdentityEnvironment identityEnvironment;

public MapRequest(
UserIdentity userIdentity,
OptoutCheckPolicy optoutCheckPolicy,
Instant asOf,
IdentityEnvironment identityEnvironment) {
this.userIdentity = userIdentity;
this.optoutCheckPolicy = optoutCheckPolicy;
this.asOf = asOf;
this.identityEnvironment = identityEnvironment;
}

public boolean shouldCheckOptOut() {
return optoutCheckPolicy.equals(OptoutCheckPolicy.RespectOptOut);
}
}
27 changes: 0 additions & 27 deletions src/main/java/com/uid2/operator/model/OptoutCheckPolicy.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public IdentityTokens generateIdentity(IdentityRequest request, Duration refresh
request.userIdentity.identityScope, request.userIdentity.identityType, firstLevelHash, request.userIdentity.privacyBits,
request.userIdentity.establishedAt, request.userIdentity.refreshedAt);

if (request.shouldCheckOptOut() && getGlobalOptOutResult(firstLevelHashIdentity, false).isOptedOut()) {
if (getGlobalOptOutResult(firstLevelHashIdentity, false).isOptedOut()) {
return IdentityTokens.LogoutToken;
} else {
return this.generateIdentity(request.publisherIdentity, firstLevelHashIdentity, refreshIdentityAfter, refreshExpiresAfter, identityExpiresAfter, request.identityEnvironment);
Expand Down Expand Up @@ -153,7 +153,7 @@ public RefreshResponse refreshIdentity(RefreshToken token, Duration refreshIdent
@Override
public MappedIdentity mapIdentity(MapRequest request) {
final UserIdentity firstLevelHashIdentity = getFirstLevelHashIdentity(request.userIdentity, request.asOf);
if (request.shouldCheckOptOut() && getGlobalOptOutResult(firstLevelHashIdentity, false).isOptedOut()) {
if (getGlobalOptOutResult(firstLevelHashIdentity, false).isOptedOut()) {
return MappedIdentity.LogoutIdentity;
} else {
return getMappedIdentity(firstLevelHashIdentity, request.asOf, request.identityEnvironment);
Expand Down
85 changes: 2 additions & 83 deletions src/main/java/com/uid2/operator/vertx/UIDOperatorVerticle.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,12 @@ public class UIDOperatorVerticle extends AbstractVerticle {
private final IClientKeyProvider clientKeyProvider;
private final Clock clock;
private final boolean identityV3Enabled;
private final boolean disableOptoutToken;
private final UidInstanceIdProvider uidInstanceIdProvider;
protected IUIDOperatorService idService;

private final Map<String, DistributionSummary> _identityMapMetricSummaries = new HashMap<>();
private final Map<Tuple.Tuple2<String, Boolean>, DistributionSummary> _refreshDurationMetricSummaries = new HashMap<>();
private final Map<Tuple.Tuple3<String, Boolean, Boolean>, Counter> _advertisingTokenExpiryStatus = new HashMap<>();
private final Map<Tuple.Tuple3<String, OptoutCheckPolicy, String>, Counter> _tokenGeneratePolicyCounters = new HashMap<>();
private final Map<String, Counter> _tokenGenerateTCFUsage = new HashMap<>();
private final Map<String, Tuple.Tuple2<Counter, Counter>> _identityMapUnmappedIdentifiers = new HashMap<>();
private final Map<String, Counter> _identityMapRequestWithUnmapped = new HashMap<>();
Expand Down Expand Up @@ -196,7 +194,6 @@ public UIDOperatorVerticle(IConfigStore configStore,
this.optOutStatusApiEnabled = config.getBoolean(Const.Config.OptOutStatusApiEnabled, true);
this.optOutStatusMaxRequestSize = config.getInteger(Const.Config.OptOutStatusMaxRequestSize, 5000);
this.identityV3Enabled = config.getBoolean(IdentityV3Prop, false);
this.disableOptoutToken = config.getBoolean(DisableOptoutTokenProp, false);
this.uidInstanceIdProvider = uidInstanceIdProvider;
}

Expand Down Expand Up @@ -488,7 +485,6 @@ private void handleClientSideTokenGenerateImpl(RoutingContext rc) throws NoSuchA
new IdentityRequest(
new PublisherIdentity(clientSideKeypair.getSiteId(), 0, 0),
input.toUserIdentity(this.identityScope, privacyBits.getAsInt(), Instant.now()),
OptoutCheckPolicy.RespectOptOut,
identityEnvironment
),
refreshIdentityAfter,
Expand Down Expand Up @@ -945,50 +941,18 @@ private void handleTokenGenerateV2(RoutingContext rc) {
}
}

final Tuple.Tuple2<OptoutCheckPolicy, String> optoutCheckPolicy = readOptoutCheckPolicy(req);
recordTokenGeneratePolicy(apiContact, optoutCheckPolicy.getItem1(), optoutCheckPolicy.getItem2());

if (!meetPolicyCheckRequirements(rc)) {
SendClientErrorResponseAndRecordStats(ResponseStatus.ClientError, 400, rc, "Required opt-out policy argument for token/generate is missing or not set to 1", siteId, TokenResponseStatsCollector.Endpoint.GenerateV2, TokenResponseStatsCollector.ResponseStatus.BadPayload, siteProvider, platformType);
return;
}

final IdentityTokens t = this.idService.generateIdentity(
new IdentityRequest(
new PublisherIdentity(siteId, 0, 0),
input.toUserIdentity(this.identityScope, 1, Instant.now()),
OptoutCheckPolicy.respectOptOut(),
identityEnvironment),
refreshIdentityAfter,
refreshExpiresAfter,
identityExpiresAfter);

if (t.isEmptyToken()) {
if (optoutCheckPolicy.getItem1() == OptoutCheckPolicy.DoNotRespect && !this.disableOptoutToken) { // only legacy can use this policy
final InputUtil.InputVal optOutTokenInput = input.getIdentityType() == IdentityType.Email
? InputUtil.InputVal.validEmail(OptOutTokenIdentityForEmail, OptOutTokenIdentityForEmail)
: InputUtil.InputVal.validPhone(OptOutTokenIdentityForPhone, OptOutTokenIdentityForPhone);

PrivacyBits pb = new PrivacyBits();
pb.setLegacyBit();
pb.setClientSideTokenGenerateOptout();

final IdentityTokens optOutTokens = this.idService.generateIdentity(
new IdentityRequest(
new PublisherIdentity(siteId, 0, 0),
optOutTokenInput.toUserIdentity(this.identityScope, pb.getAsInt(), Instant.now()),
OptoutCheckPolicy.DoNotRespect,
identityEnvironment),
refreshIdentityAfter,
refreshExpiresAfter,
identityExpiresAfter);

ResponseUtil.SuccessV2(rc, toTokenResponseJson(optOutTokens));
recordTokenResponseStats(siteId, TokenResponseStatsCollector.Endpoint.GenerateV2, TokenResponseStatsCollector.ResponseStatus.Success, siteProvider, optOutTokens.getAdvertisingTokenVersion(), platformType);
} else { // new participant, or legacy specified policy/optout_check=1
ResponseUtil.SuccessNoBodyV2("optout", rc);
recordTokenResponseStats(siteId, TokenResponseStatsCollector.Endpoint.GenerateV2, TokenResponseStatsCollector.ResponseStatus.OptOut, siteProvider, null, platformType);
}
ResponseUtil.SuccessNoBodyV2("optout", rc);
recordTokenResponseStats(siteId, TokenResponseStatsCollector.Endpoint.GenerateV2, TokenResponseStatsCollector.ResponseStatus.OptOut, siteProvider, null, platformType);
} else {
ResponseUtil.SuccessV2(rc, toTokenResponseJson(t));
recordTokenResponseStats(siteId, TokenResponseStatsCollector.Endpoint.GenerateV2, TokenResponseStatsCollector.ResponseStatus.Success, siteProvider, t.getAdvertisingTokenVersion(), platformType);
Expand Down Expand Up @@ -1132,7 +1096,6 @@ private JsonObject handleIdentityMapCommon(RoutingContext rc, InputUtil.InputVal
final MappedIdentity mappedIdentity = idService.mapIdentity(
new MapRequest(
input.toUserIdentity(this.identityScope, 0, now),
OptoutCheckPolicy.respectOptOut(),
now,
env));

Expand Down Expand Up @@ -1187,7 +1150,6 @@ private JsonObject processIdentityMapV3Response(RoutingContext rc, Map<String, I
final MappedIdentity mappedId = idService.mapIdentity(
new MapRequest(
rawId.toUserIdentity(this.identityScope, 0, now),
OptoutCheckPolicy.respectOptOut(),
now,
env));

Expand Down Expand Up @@ -1642,49 +1604,6 @@ private UserConsentStatus validateUserConsent(JsonObject req, String apiContact)
return UserConsentStatus.SUFFICIENT;
}

private static final String POLICY_PARAM = "policy";
private static final String OPTOUT_CHECK_POLICY_PARAM = "optout_check";

private boolean meetPolicyCheckRequirements(RoutingContext rc) {
JsonObject requestJsonObject = (JsonObject) rc.data().get(REQUEST);
boolean respectOptOut = false;
if (requestJsonObject.containsKey(OPTOUT_CHECK_POLICY_PARAM)) {
respectOptOut = OptoutCheckPolicy.fromValue(requestJsonObject.getInteger(OPTOUT_CHECK_POLICY_PARAM)) == OptoutCheckPolicy.respectOptOut();
} else if (requestJsonObject.containsKey(POLICY_PARAM)) {
respectOptOut = OptoutCheckPolicy.fromValue(requestJsonObject.getInteger(POLICY_PARAM)) == OptoutCheckPolicy.respectOptOut();
}

final ClientKey clientKey = (ClientKey) AuthMiddleware.getAuthClient(rc);
final ClientKey oldestClientKey = this.clientKeyProvider.getOldestClientKey(clientKey.getSiteId());
boolean newClient = oldestClientKey.getCreated() >= OPT_OUT_CHECK_CUTOFF_DATE;

if (newClient && !respectOptOut) {
// log policy violation
LOGGER.warn(String.format("Failed to respect opt-out policy: siteId=%d, clientKeyName=%s, clientKeyCreated=%d",
oldestClientKey.getSiteId(), oldestClientKey.getName(), oldestClientKey.getCreated()));
return false;
}
return true;
}

private Tuple.Tuple2<OptoutCheckPolicy, String> readOptoutCheckPolicy(JsonObject req) {
if(req.containsKey(OPTOUT_CHECK_POLICY_PARAM)) {
return new Tuple.Tuple2<>(OptoutCheckPolicy.fromValue(req.getInteger(OPTOUT_CHECK_POLICY_PARAM)), OPTOUT_CHECK_POLICY_PARAM);
} else if(req.containsKey(POLICY_PARAM)) {
return new Tuple.Tuple2<>(OptoutCheckPolicy.fromValue(req.getInteger(POLICY_PARAM)), POLICY_PARAM);
} else {
return new Tuple.Tuple2<>(OptoutCheckPolicy.defaultPolicy(), "null");
}
}

private void recordTokenGeneratePolicy(String apiContact, OptoutCheckPolicy policy, String policyParameterKey) {
_tokenGeneratePolicyCounters.computeIfAbsent(new Tuple.Tuple3<>(apiContact, policy, policyParameterKey), triple -> Counter
.builder("uid2_token_generate_policy_usage_total")
.description("Counter for token generate policy usage")
.tags("api_contact", triple.getItem1(), "policy", String.valueOf(triple.getItem2()), "policy_parameter", triple.getItem3())
.register(Metrics.globalRegistry)).increment();
}

private void recordTokenGenerateTCFUsage(String apiContact) {
_tokenGenerateTCFUsage.computeIfAbsent(apiContact, contact -> Counter
.builder("uid2_token_generate_tcf_usage_total")
Expand Down
Loading
Loading