Skip to content

Commit e9b93c0

Browse files
Merge pull request #520 from IABTechLab/sch-UID2-5851-migrating-to-salt-key-fields
sch-UID2-5851 handle parsing null fields into salt entry from csv
2 parents a9bfb1f + 203eb0b commit e9b93c0

File tree

4 files changed

+43
-17
lines changed

4 files changed

+43
-17
lines changed

src/main/java/com/uid2/shared/model/SaltEntry.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ public record SaltEntry(
99
Long refreshFrom, // needs to be nullable until V3 Identity Map is fully rolled out
1010
String previousSalt,
1111

12-
KeyMaterial currentKey,
13-
KeyMaterial previousKey
12+
KeyMaterial currentKeySalt,
13+
KeyMaterial previousKeySalt
1414
) {
1515
@Override
1616
public String toString() {
1717
return "SaltEntry{" +
1818
"id=" + id +
1919
", hashedId='" + hashedId + '\'' +
2020
", lastUpdated=" + lastUpdated +
21-
", currentSalt=<REDACTED>" +
21+
", currentSalt=" + (currentSalt == null ? "null" : "<REDACTED>") +
2222
", refreshFrom=" + refreshFrom +
23-
", previousSalt=<REDACTED>" +
24-
", currentKey=" + currentKey +
25-
", previousKey=" + previousKey +
23+
", previousSalt=" + (previousSalt == null ? "null" : "<REDACTED>") +
24+
", currentKeySalt=" + currentKeySalt +
25+
", previousKeySalt=" + previousKeySalt +
2626
'}';
2727
}
2828

@@ -36,7 +36,7 @@ public String toString() {
3636
return "KeyMaterial{" +
3737
"id=" + id +
3838
", key=<REDACTED>" +
39-
", currentSalt=<REDACTED>" +
39+
", salt=<REDACTED>" +
4040
'}';
4141
}
4242
}

src/main/java/com/uid2/shared/store/salt/RotatingSaltProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
}
4242
4343
2. currentSalt file format
44-
<id>, <hash_id>, <currentSalt>
45-
9000099,1614556800000,currentSalt
44+
<id>,<hash_id>,<currentSalt>,<refreshFrom>,<previousSalt>,<currentKey.id>,<currentKey.key>,<currentKey.salt>,<previousKey.id>,<previousKey.key>,<previousKey.salt>
45+
9000099,1614556800000,currentSalt,1756252800000,previousSalt,100,currentKeyKey,currentKeySalt,1,previousKeyKey,previousKeySalt
4646
*/
4747
public class RotatingSaltProvider implements ISaltProvider, IMetadataVersionedStore {
4848
private static final Logger LOGGER = LoggerFactory.getLogger(RotatingSaltProvider.class);
@@ -159,10 +159,10 @@ public SaltSnapshot(Instant effective, Instant expires, SaltEntry[] entries, Str
159159
this.entries = entries;
160160
this.firstLevelSalt = firstLevelSalt;
161161
if (entries.length == 1_048_576) {
162-
LOGGER.info("Total currentSalt entries 1 million, {}, special production currentSalt entry indexer", entries.length);
162+
LOGGER.info("Total salt bucket entries 1 million, {}, special production currentSalt entry indexer", entries.length);
163163
this.saltEntryIndexer = MILLION_ENTRY_INDEXER;
164164
} else {
165-
LOGGER.warn("Total currentSalt entries {}, using slower mod-based indexer", entries.length);
165+
LOGGER.warn("Total salt bucket entries {}, using slower mod-based indexer", entries.length);
166166
this.saltEntryIndexer = MOD_BASED_INDEXER;
167167
}
168168
}

src/main/java/com/uid2/shared/store/salt/SaltFileParser.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,23 @@ private SaltEntry parseLine(String line, int lineNumber) {
3131
final long id = Integer.parseInt(fields[0]);
3232
final String hashedId = this.idHashingScheme.encode(id);
3333
final long lastUpdated = Long.parseLong(fields[1]);
34-
final String salt = fields[2];
34+
final String salt = trimToNull(fields[2]);
3535
final long refreshFrom = Long.parseLong(fields[3]);
3636
final String previousSalt = trimToNull(fields[4]);
3737

3838
// TODO: The fields below should stop being optional once refreshable UIDs features get rolled out in production. We can remove them one by one as necessary.
3939
// AU, 2025/07/28
40-
SaltEntry.KeyMaterial currentKey = null;
41-
SaltEntry.KeyMaterial previousKey = null;
40+
SaltEntry.KeyMaterial currentKeySalt = null;
41+
SaltEntry.KeyMaterial previousKeySalt = null;
4242
if (trimToNull(fields[5]) != null && trimToNull(fields[6]) != null) {
43-
currentKey = new SaltEntry.KeyMaterial(Integer.parseInt(fields[5]), fields[6], fields[7]);
43+
currentKeySalt = new SaltEntry.KeyMaterial(Integer.parseInt(fields[5]), fields[6], fields[7]);
4444
}
4545

4646
if (trimToNull(fields[8]) != null && trimToNull(fields[9]) != null) {
47-
previousKey = new SaltEntry.KeyMaterial(Integer.parseInt(fields[8]), fields[9], fields[10]);
47+
previousKeySalt = new SaltEntry.KeyMaterial(Integer.parseInt(fields[8]), fields[9], fields[10]);
4848
}
4949

50-
return new SaltEntry(id, hashedId, lastUpdated, salt, refreshFrom, previousSalt, currentKey, previousKey);
50+
return new SaltEntry(id, hashedId, lastUpdated, salt, refreshFrom, previousSalt, currentKeySalt, previousKeySalt);
5151
} catch (Exception e) {
5252
throw new RuntimeException("Trouble parsing Salt Entry, line number: " + lineNumber, e);
5353
}

src/test/java/com/uid2/shared/store/salt/SaltFileParserTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ class SaltFileParserTest {
1414
private final String hashed1 = hashingScheme.encode(1);
1515
private final String hashed2 = hashingScheme.encode(2);
1616
private final String hashed3 = hashingScheme.encode(3);
17+
private final String hashed4 = hashingScheme.encode(4);
18+
private final String hashed5 = hashingScheme.encode(5);
1719

1820
@Test
1921
void parsesSaltFileWithAllFields() {
@@ -71,4 +73,28 @@ void parsesSaltFileWithNullValuesForKeyFields() {
7173
};
7274
assertThat(actual).isEqualTo(expected);
7375
}
76+
77+
@Test
78+
void parseSaltFileWithEmptyValuesMixedSaltKeyFields() {
79+
var file = """
80+
1,100,,1000,old_salt,,,,,,
81+
2,200,,2000,old_salt,0,current_key_key,current_key_salt,,,
82+
3,300,,3000,,0,current_key_key,current_key_salt,,,
83+
4,400,,4000,,0,current_key_key,current_key_salt,1,previous_key_key,previous_key_salt
84+
5,500,salt,5000,,,,,1,previous_key_key,previous_key_salt
85+
""";
86+
SaltEntry[] actual = parser.parseFile(file, 5);
87+
88+
var expectedCurrentKey = new KeyMaterial(0, "current_key_key", "current_key_salt");
89+
var expectedPreviousKey = new KeyMaterial(1, "previous_key_key", "previous_key_salt");
90+
91+
SaltEntry[] expected = new SaltEntry[]{
92+
new SaltEntry(1, hashed1, 100, null, 1000L, "old_salt",null, null),
93+
new SaltEntry(2, hashed2, 200, null, 2000L, "old_salt", expectedCurrentKey,null),
94+
new SaltEntry(3, hashed3, 300, null, 3000L, null, expectedCurrentKey, null),
95+
new SaltEntry(4, hashed4, 400, null, 4000L, null, expectedCurrentKey, expectedPreviousKey),
96+
new SaltEntry(5, hashed5, 500, "salt", 5000L, null,null, expectedPreviousKey)
97+
};
98+
assertThat(actual).isEqualTo(expected);
99+
}
74100
}

0 commit comments

Comments
 (0)