diff --git a/pom.xml b/pom.xml
index da02b78c0..fcd218bee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.uid2
uid2-operator
- 5.66.29
+ 5.66.24-alpha-317-SNAPSHOT
UTF-8
diff --git a/src/main/java/com/uid2/operator/model/MapRequest.java b/src/main/java/com/uid2/operator/model/MapRequest.java
index 1d70c7ba3..afeb2020c 100644
--- a/src/main/java/com/uid2/operator/model/MapRequest.java
+++ b/src/main/java/com/uid2/operator/model/MapRequest.java
@@ -6,13 +6,23 @@ public final class MapRequest {
public final UserIdentity userIdentity;
public final Instant asOf;
public final IdentityEnvironment identityEnvironment;
+ public final boolean includePreviousAdvertisingId;
public MapRequest(
UserIdentity userIdentity,
Instant asOf,
IdentityEnvironment identityEnvironment) {
+ this(userIdentity, asOf, identityEnvironment, true);
+ }
+
+ public MapRequest(
+ UserIdentity userIdentity,
+ Instant asOf,
+ IdentityEnvironment identityEnvironment,
+ boolean includePreviousAdvertisingId) {
this.userIdentity = userIdentity;
this.asOf = asOf;
this.identityEnvironment = identityEnvironment;
+ this.includePreviousAdvertisingId = includePreviousAdvertisingId;
}
}
diff --git a/src/main/java/com/uid2/operator/model/MappedIdentity.java b/src/main/java/com/uid2/operator/model/MappedIdentity.java
index df669c171..fd894f3f3 100644
--- a/src/main/java/com/uid2/operator/model/MappedIdentity.java
+++ b/src/main/java/com/uid2/operator/model/MappedIdentity.java
@@ -4,6 +4,13 @@ public class MappedIdentity {
public static final MappedIdentity LogoutIdentity = new MappedIdentity(new byte[33], "", null, null);
public final byte[] advertisingId;
public final String bucketId;
+ /**
+ * The advertising ID computed using the previous rotating salt, or {@code null} if:
+ *
+ * - The caller did not request it (i.e. {@code MapRequest.includePreviousAdvertisingId} was {@code false}), or
+ * - No previous salt is available, or the salt was last rotated more than 90 days ago.
+ *
+ */
public final byte[] previousAdvertisingId;
public final Long refreshFrom;
diff --git a/src/main/java/com/uid2/operator/service/UIDOperatorService.java b/src/main/java/com/uid2/operator/service/UIDOperatorService.java
index 9662dc59d..20531778c 100644
--- a/src/main/java/com/uid2/operator/service/UIDOperatorService.java
+++ b/src/main/java/com/uid2/operator/service/UIDOperatorService.java
@@ -156,7 +156,7 @@ public MappedIdentity mapIdentity(MapRequest request) {
if (getGlobalOptOutResult(firstLevelHashIdentity, false).isOptedOut()) {
return MappedIdentity.LogoutIdentity;
} else {
- return getMappedIdentity(firstLevelHashIdentity, request.asOf, request.identityEnvironment);
+ return getMappedIdentity(firstLevelHashIdentity, request.asOf, request.identityEnvironment, request.includePreviousAdvertisingId);
}
}
@@ -248,9 +248,15 @@ private byte[] getFirstLevelHash(byte[] identityHash, Instant asOf) {
}
private MappedIdentity getMappedIdentity(UserIdentity firstLevelHashIdentity, Instant asOf, IdentityEnvironment env) {
+ return getMappedIdentity(firstLevelHashIdentity, asOf, env, false);
+ }
+
+ private MappedIdentity getMappedIdentity(UserIdentity firstLevelHashIdentity, Instant asOf, IdentityEnvironment env, boolean includePreviousAdvertisingId) {
final SaltEntry rotatingSalt = getSaltProviderSnapshot(asOf).getRotatingSalt(firstLevelHashIdentity.id);
final byte[] advertisingId = getAdvertisingId(firstLevelHashIdentity, rotatingSalt.currentSalt(), rotatingSalt.currentKeySalt(), env);
- final byte[] previousAdvertisingId = getPreviousAdvertisingId(firstLevelHashIdentity, rotatingSalt, asOf, env);
+ final byte[] previousAdvertisingId = includePreviousAdvertisingId
+ ? getPreviousAdvertisingId(firstLevelHashIdentity, rotatingSalt, asOf, env)
+ : null;
final long refreshFrom = getRefreshFrom(rotatingSalt, asOf);
return new MappedIdentity(
diff --git a/src/main/java/com/uid2/operator/vertx/UIDOperatorVerticle.java b/src/main/java/com/uid2/operator/vertx/UIDOperatorVerticle.java
index 503ac9ace..a4c4ebdac 100644
--- a/src/main/java/com/uid2/operator/vertx/UIDOperatorVerticle.java
+++ b/src/main/java/com/uid2/operator/vertx/UIDOperatorVerticle.java
@@ -1114,7 +1114,8 @@ private JsonObject handleIdentityMapCommon(RoutingContext rc, InputUtil.InputVal
new MapRequest(
input.toUserIdentity(this.identityScope, 0, now),
now,
- env));
+ env,
+ false)); // v2 does not use previousAdvertisingId
if (mappedIdentity.isOptedOut()) {
final JsonObject resp = new JsonObject();
diff --git a/src/test/java/com/uid2/operator/UIDOperatorServiceTest.java b/src/test/java/com/uid2/operator/UIDOperatorServiceTest.java
index 8356ffac2..1a572697a 100644
--- a/src/test/java/com/uid2/operator/UIDOperatorServiceTest.java
+++ b/src/test/java/com/uid2/operator/UIDOperatorServiceTest.java
@@ -835,7 +835,7 @@ void testMappedIdentityWithPreviousSaltReturnsPreviousUid() {
var email = "test@uid.com";
InputUtil.InputVal emailInput = generateInputVal(TestIdentityInputType.Email, email);
- MapRequest mapRequest = new MapRequest(emailInput.toUserIdentity(IdentityScope.UID2, 0, this.now), now, IdentityEnvironment.TEST);
+ MapRequest mapRequest = new MapRequest(emailInput.toUserIdentity(IdentityScope.UID2, 0, this.now), now, IdentityEnvironment.TEST);
MappedIdentity mappedIdentity = uid2Service.mapIdentity(mapRequest);
@@ -858,7 +858,7 @@ void testMappedIdentityWithOutdatedPreviousSaltReturnsNoPreviousUid(long extraMs
var email = "test@uid.com";
InputUtil.InputVal emailInput = generateInputVal(TestIdentityInputType.Email, email);
- MapRequest mapRequest = new MapRequest(emailInput.toUserIdentity(IdentityScope.UID2, 0, this.now), now, IdentityEnvironment.TEST);
+ MapRequest mapRequest = new MapRequest(emailInput.toUserIdentity(IdentityScope.UID2, 0, this.now), now, IdentityEnvironment.TEST);
MappedIdentity mappedIdentity = uid2Service.mapIdentity(mapRequest);
var expectedCurrentUID = UIDOperatorVerticleTest.getRawUid(IdentityScope.UID2, IdentityType.Email, email, FIRST_LEVEL_SALT, salt.currentSalt(), uid2Config.getBoolean(IdentityV3Prop));
@@ -878,7 +878,7 @@ void testMappedIdentityWithNoPreviousSaltReturnsNoPreviousUid() {
var email = "test@uid.com";
InputUtil.InputVal emailInput = generateInputVal(TestIdentityInputType.Email, email);
- MapRequest mapRequest = new MapRequest(emailInput.toUserIdentity(IdentityScope.UID2, 0, this.now), now, IdentityEnvironment.TEST);
+ MapRequest mapRequest = new MapRequest(emailInput.toUserIdentity(IdentityScope.UID2, 0, this.now), now, IdentityEnvironment.TEST);
MappedIdentity mappedIdentity = uid2Service.mapIdentity(mapRequest);