11package com .uid2 .operator .service ;
22
33import com .uid2 .operator .model .*;
4+ import com .uid2 .operator .store .IConfigStore ;
5+ import com .uid2 .operator .store .RuntimeConfig ;
46import com .uid2 .operator .util .PrivacyBits ;
57import com .uid2 .shared .audit .UidInstanceIdProvider ;
68import com .uid2 .shared .model .SaltEntry ;
@@ -52,16 +54,20 @@ public class UIDOperatorService implements IUIDOperatorService {
5254
5355 private final Handler <Boolean > saltRetrievalResponseHandler ;
5456 private final UidInstanceIdProvider uidInstanceIdProvider ;
57+ private final IConfigStore configStore ;
58+ private RuntimeConfig runtimeConfig ;
5559
5660 public UIDOperatorService (IOptOutStore optOutStore , ISaltProvider saltProvider , ITokenEncoder encoder , Clock clock ,
57- IdentityScope identityScope , Handler <Boolean > saltRetrievalResponseHandler , boolean identityV3Enabled , UidInstanceIdProvider uidInstanceIdProvider ) {
61+ IdentityScope identityScope , Handler <Boolean > saltRetrievalResponseHandler , boolean identityV3Enabled , UidInstanceIdProvider uidInstanceIdProvider , IConfigStore configStore ) {
5862 this .saltProvider = saltProvider ;
5963 this .encoder = encoder ;
6064 this .optOutStore = optOutStore ;
6165 this .clock = clock ;
6266 this .identityScope = identityScope ;
6367 this .saltRetrievalResponseHandler = saltRetrievalResponseHandler ;
6468 this .uidInstanceIdProvider = uidInstanceIdProvider ;
69+ this .configStore = configStore ;
70+ this .runtimeConfig = configStore .getConfig ();
6571
6672 this .testOptOutIdentityForEmail = getFirstLevelHashIdentity (identityScope , IdentityType .Email ,
6773 InputUtil .normalizeEmail (OptOutIdentityForEmail ).getIdentityInput (), Instant .now ());
@@ -82,6 +88,12 @@ public UIDOperatorService(IOptOutStore optOutStore, ISaltProvider saltProvider,
8288 this .rawUidV3Enabled = identityV3Enabled ;
8389 }
8490
91+ private void loadAndValidateRuntimeConfig () throws Exception {
92+ this .configStore .loadContent ();
93+ this .runtimeConfig = this .configStore .getConfig ();
94+ validateTokenDurations (runtimeConfig .getRefreshIdentityTokenExpires (), runtimeConfig .getRefreshTokenExpires (), runtimeConfig .getIdentityTokenExpires ());
95+ }
96+
8597 private void validateTokenDurations (Duration refreshIdentityAfter , Duration refreshExpiresAfter , Duration identityExpiresAfter ) {
8698 if (identityExpiresAfter .compareTo (refreshExpiresAfter ) > 0 ) {
8799 throw new IllegalStateException (REFRESH_TOKEN_EXPIRES_AFTER_SECONDS + " (" + refreshExpiresAfter .toSeconds () + ") < " + IDENTITY_TOKEN_EXPIRES_AFTER_SECONDS + " (" + identityExpiresAfter .toSeconds () + ")" );
@@ -95,8 +107,9 @@ private void validateTokenDurations(Duration refreshIdentityAfter, Duration refr
95107 }
96108
97109 @ Override
98- public IdentityTokens generateIdentity (IdentityRequest request , Duration refreshIdentityAfter , Duration refreshExpiresAfter , Duration identityExpiresAfter ) {
99- this .validateTokenDurations (refreshIdentityAfter , refreshExpiresAfter , identityExpiresAfter );
110+ public IdentityTokens generateIdentity (IdentityRequest request ) throws Exception {
111+ loadAndValidateRuntimeConfig ();
112+
100113 final Instant now = EncodingUtils .NowUTCMillis (this .clock );
101114 final byte [] firstLevelHash = getFirstLevelHash (request .userIdentity .id , now );
102115 final UserIdentity firstLevelHashIdentity = new UserIdentity (
@@ -106,13 +119,14 @@ public IdentityTokens generateIdentity(IdentityRequest request, Duration refresh
106119 if (request .shouldCheckOptOut () && getGlobalOptOutResult (firstLevelHashIdentity , false ).isOptedOut ()) {
107120 return IdentityTokens .LogoutToken ;
108121 } else {
109- return this .generateIdentity (request .publisherIdentity , firstLevelHashIdentity , refreshIdentityAfter , refreshExpiresAfter , identityExpiresAfter , request . identityEnvironment );
122+ return this .generateIdentity (request .publisherIdentity , firstLevelHashIdentity );
110123 }
111124 }
112125
113126 @ Override
114- public RefreshResponse refreshIdentity (RefreshToken token , Duration refreshIdentityAfter , Duration refreshExpiresAfter , Duration identityExpiresAfter , IdentityEnvironment env ) {
115- this .validateTokenDurations (refreshIdentityAfter , refreshExpiresAfter , identityExpiresAfter );
127+ public RefreshResponse refreshIdentity (RefreshToken token ) throws Exception {
128+ loadAndValidateRuntimeConfig ();
129+
116130 // should not be possible as different scopes should be using different keys, but just in case
117131 if (token .userIdentity .identityScope != this .identityScope ) {
118132 return RefreshResponse .Invalid ;
@@ -138,7 +152,7 @@ public RefreshResponse refreshIdentity(RefreshToken token, Duration refreshIdent
138152 final Duration durationSinceLastRefresh = Duration .between (token .createdAt , now );
139153
140154 if (!optedOut ) {
141- IdentityTokens identityTokens = this .generateIdentity (token .publisherIdentity , token .userIdentity , refreshIdentityAfter , refreshExpiresAfter , identityExpiresAfter , env );
155+ IdentityTokens identityTokens = this .generateIdentity (token .publisherIdentity , token .userIdentity );
142156
143157 return RefreshResponse .createRefreshedResponse (identityTokens , durationSinceLastRefresh , isCstg );
144158 } else {
@@ -152,19 +166,21 @@ public RefreshResponse refreshIdentity(RefreshToken token, Duration refreshIdent
152166 }
153167
154168 @ Override
155- public MappedIdentity mapIdentity (MapRequest request ) {
169+ public MappedIdentity mapIdentity (MapRequest request ) throws Exception {
170+ loadAndValidateRuntimeConfig ();
171+
156172 final UserIdentity firstLevelHashIdentity = getFirstLevelHashIdentity (request .userIdentity , request .asOf );
157173 if (request .shouldCheckOptOut () && getGlobalOptOutResult (firstLevelHashIdentity , false ).isOptedOut ()) {
158174 return MappedIdentity .LogoutIdentity ;
159175 } else {
160- return getMappedIdentity (firstLevelHashIdentity , request .asOf , request . identityEnvironment );
176+ return getMappedIdentity (firstLevelHashIdentity , request .asOf );
161177 }
162178 }
163179
164180 @ Override
165- public MappedIdentity map (UserIdentity userIdentity , Instant asOf , IdentityEnvironment env ) {
181+ public MappedIdentity map (UserIdentity userIdentity , Instant asOf ) throws Exception {
166182 final UserIdentity firstLevelHashIdentity = getFirstLevelHashIdentity (userIdentity , asOf );
167- return getMappedIdentity (firstLevelHashIdentity , asOf , env );
183+ return getMappedIdentity (firstLevelHashIdentity , asOf );
168184 }
169185
170186 @ Override
@@ -183,9 +199,9 @@ private ISaltProvider.ISaltSnapshot getSaltProviderSnapshot(Instant asOf) {
183199 }
184200
185201 @ Override
186- public void invalidateTokensAsync (UserIdentity userIdentity , Instant asOf , String uidTraceId , IdentityEnvironment env , Handler <AsyncResult <Instant >> handler ) {
202+ public void invalidateTokensAsync (UserIdentity userIdentity , Instant asOf , String uidTraceId , Handler <AsyncResult <Instant >> handler ) {
187203 final UserIdentity firstLevelHashIdentity = getFirstLevelHashIdentity (userIdentity , asOf );
188- final MappedIdentity mappedIdentity = getMappedIdentity (firstLevelHashIdentity , asOf , env );
204+ final MappedIdentity mappedIdentity = getMappedIdentity (firstLevelHashIdentity , asOf );
189205
190206 this .optOutStore .addEntry (firstLevelHashIdentity , mappedIdentity .advertisingId , uidTraceId , this .uidInstanceIdProvider .getInstanceId (), r -> {
191207 if (r .succeeded ()) {
@@ -197,9 +213,9 @@ public void invalidateTokensAsync(UserIdentity userIdentity, Instant asOf, Strin
197213 }
198214
199215 @ Override
200- public boolean advertisingTokenMatches (String advertisingToken , UserIdentity userIdentity , Instant asOf , IdentityEnvironment env ) {
216+ public boolean advertisingTokenMatches (String advertisingToken , UserIdentity userIdentity , Instant asOf ) {
201217 final UserIdentity firstLevelHashIdentity = getFirstLevelHashIdentity (userIdentity , asOf );
202- final MappedIdentity mappedIdentity = getMappedIdentity (firstLevelHashIdentity , asOf , env );
218+ final MappedIdentity mappedIdentity = getMappedIdentity (firstLevelHashIdentity , asOf );
203219
204220 final AdvertisingToken token = this .encoder .decodeAdvertisingToken (advertisingToken );
205221 return Arrays .equals (mappedIdentity .advertisingId , token .userIdentity .id );
@@ -224,7 +240,7 @@ private byte[] getFirstLevelHash(byte[] identityHash, Instant asOf) {
224240 return TokenUtils .getFirstLevelHash (identityHash , getSaltProviderSnapshot (asOf ).getFirstLevelSalt ());
225241 }
226242
227- private MappedIdentity getMappedIdentity (UserIdentity firstLevelHashIdentity , Instant asOf , IdentityEnvironment env ) {
243+ private MappedIdentity getMappedIdentity (UserIdentity firstLevelHashIdentity , Instant asOf ) {
228244 final SaltEntry rotatingSalt = getSaltProviderSnapshot (asOf ).getRotatingSalt (firstLevelHashIdentity .id );
229245 final byte [] advertisingId = getAdvertisingId (firstLevelHashIdentity , rotatingSalt .currentSalt ());
230246 final byte [] previousAdvertisingId = getPreviousAdvertisingId (firstLevelHashIdentity , rotatingSalt , asOf );
@@ -262,17 +278,16 @@ private long getRefreshFrom(SaltEntry rotatingSalt, Instant asOf) {
262278 return refreshFrom ;
263279 }
264280
265- private IdentityTokens generateIdentity (PublisherIdentity publisherIdentity , UserIdentity firstLevelHashIdentity , Duration refreshIdentityAfter , Duration refreshExpiresAfter , Duration identityExpiresAfter , IdentityEnvironment env ) {
281+ private IdentityTokens generateIdentity (PublisherIdentity publisherIdentity , UserIdentity firstLevelHashIdentity ) {
266282 final Instant nowUtc = EncodingUtils .NowUTCMillis (this .clock );
267-
268- final MappedIdentity mappedIdentity = getMappedIdentity (firstLevelHashIdentity , nowUtc , env );
283+ final MappedIdentity mappedIdentity = getMappedIdentity (firstLevelHashIdentity , nowUtc );
269284 final UserIdentity advertisingIdentity = new UserIdentity (firstLevelHashIdentity .identityScope , firstLevelHashIdentity .identityType ,
270285 mappedIdentity .advertisingId , firstLevelHashIdentity .privacyBits , firstLevelHashIdentity .establishedAt , nowUtc );
271286
272287 return this .encoder .encode (
273- this .createAdvertisingToken (publisherIdentity , advertisingIdentity , nowUtc , identityExpiresAfter ),
274- this .createRefreshToken (publisherIdentity , firstLevelHashIdentity , nowUtc , refreshExpiresAfter ),
275- nowUtc .plusMillis (refreshIdentityAfter .toMillis ()),
288+ this .createAdvertisingToken (publisherIdentity , advertisingIdentity , nowUtc , runtimeConfig . getIdentityTokenExpires () ),
289+ this .createRefreshToken (publisherIdentity , firstLevelHashIdentity , nowUtc , runtimeConfig . getRefreshTokenExpires () ),
290+ nowUtc .plusMillis (runtimeConfig . getRefreshIdentityTokenExpires () .toMillis ()),
276291 nowUtc
277292 );
278293 }
0 commit comments