@@ -173,10 +173,32 @@ function hasTorPrivacySignal(
173173 return ipPrivacy ?. signals . includes ( 'tor' ) ?? false
174174}
175175
176+ function hasStrongCorroboratedAbuse (
177+ countryAccess : Partial <
178+ Pick <
179+ FreeModeCountryAccess ,
180+ | 'ipPrivacy'
181+ | 'spurIpPrivacy'
182+ | 'scamalyticsIpPrivacy'
183+ | 'scamalyticsScore'
184+ >
185+ > ,
186+ ) : boolean {
187+ return (
188+ hasHardBlockedPrivacySignal ( countryAccess . ipPrivacy ) &&
189+ hasHardBlockedPrivacySignal ( countryAccess . spurIpPrivacy ) &&
190+ ( hasHardBlockedPrivacySignal ( countryAccess . scamalyticsIpPrivacy ) ||
191+ ( countryAccess . scamalyticsScore ?? 0 ) >= SCAMALYTICS_HIGH_RISK_SCORE )
192+ )
193+ }
194+
176195function maxPrivacySignalRisk (
177196 ipPrivacy : FreeModeIpPrivacy | null | undefined ,
178197) : number {
179198 let risk = 0
199+ const hasHardSignal = ipPrivacy ?. signals . some (
200+ isFreebuffHardBlockedPrivacySignal ,
201+ )
180202 for ( const signal of ipPrivacy ?. signals ?? [ ] ) {
181203 if ( signal === 'tor' ) risk = Math . max ( risk , 100 )
182204 else if ( isFreebuffHardBlockedPrivacySignal ( signal ) ) {
@@ -187,22 +209,17 @@ function maxPrivacySignalRisk(
187209 risk = Math . max ( risk , 40 )
188210 }
189211 }
190- if (
191- ipPrivacy ?. providerName &&
192- ipPrivacy . signals . some ( isFreebuffHardBlockedPrivacySignal )
193- ) {
212+ if ( ipPrivacy ?. providerName && hasHardSignal ) {
194213 risk = Math . max ( risk , 80 )
195214 }
196215 if (
216+ hasHardSignal &&
197217 typeof ipPrivacy ?. percentDaysSeen === 'number' &&
198218 ipPrivacy . percentDaysSeen >= 50
199219 ) {
200220 risk = Math . max ( risk , 85 )
201221 }
202- if (
203- ipPrivacy ?. lastSeen &&
204- ipPrivacy . signals . some ( isFreebuffHardBlockedPrivacySignal )
205- ) {
222+ if ( ipPrivacy ?. lastSeen && hasHardSignal ) {
206223 const lastSeenMs = Date . parse ( ipPrivacy . lastSeen )
207224 const sevenDaysMs = 7 * 24 * 60 * 60 * 1000
208225 if ( Number . isFinite ( lastSeenMs ) && Date . now ( ) - lastSeenMs <= sevenDaysMs ) {
@@ -215,7 +232,6 @@ function maxPrivacySignalRisk(
215232export function getFreeModeRiskScore (
216233 countryAccess : Pick <
217234 FreeModeCountryAccess ,
218- | 'allowed'
219235 | 'blockReason'
220236 | 'cfCountry'
221237 | 'ipPrivacy'
@@ -266,12 +282,7 @@ export function getFreeModeRiskScore(
266282 if ( typeof countryAccess . scamalyticsScore === 'number' ) {
267283 score = Math . max ( score , countryAccess . scamalyticsScore )
268284 }
269- if (
270- hasHardBlockedPrivacySignal ( countryAccess . ipPrivacy ) &&
271- hasHardBlockedPrivacySignal ( countryAccess . spurIpPrivacy ) &&
272- ( hasHardBlockedPrivacySignal ( countryAccess . scamalyticsIpPrivacy ) ||
273- ( countryAccess . scamalyticsScore ?? 0 ) >= SCAMALYTICS_HIGH_RISK_SCORE )
274- ) {
285+ if ( hasStrongCorroboratedAbuse ( countryAccess ) ) {
275286 score = Math . max ( score , 95 )
276287 }
277288
@@ -300,12 +311,7 @@ export function shouldHardBlockFreeModeAccess(
300311 ) {
301312 return true
302313 }
303- return (
304- hasHardBlockedPrivacySignal ( countryAccess . ipPrivacy ) &&
305- hasHardBlockedPrivacySignal ( countryAccess . spurIpPrivacy ) &&
306- ( hasHardBlockedPrivacySignal ( countryAccess . scamalyticsIpPrivacy ) ||
307- ( countryAccess . scamalyticsScore ?? 0 ) >= SCAMALYTICS_HIGH_RISK_SCORE )
308- )
314+ return hasStrongCorroboratedAbuse ( countryAccess )
309315}
310316
311317export function getFreeModePrivacyDecision (
@@ -335,12 +341,7 @@ export function getFreeModePrivacyDecision(
335341 return 'ipinfo_failed_limited'
336342 }
337343 if ( countryAccess . blockReason === 'anonymous_network' ) {
338- if (
339- hasHardBlockedPrivacySignal ( countryAccess . ipPrivacy ) &&
340- hasHardBlockedPrivacySignal ( countryAccess . spurIpPrivacy ) &&
341- ( hasHardBlockedPrivacySignal ( countryAccess . scamalyticsIpPrivacy ) ||
342- ( countryAccess . scamalyticsScore ?? 0 ) >= SCAMALYTICS_HIGH_RISK_SCORE )
343- ) {
344+ if ( hasStrongCorroboratedAbuse ( countryAccess ) ) {
344345 return 'corroborated_block'
345346 }
346347 if ( countryAccess . spurStatus === 'failed' ) {
@@ -364,7 +365,6 @@ export function getFreeModePrivacyProviderDecision(
364365 | 'ipPrivacy'
365366 | 'spurIpPrivacy'
366367 | 'spurStatus'
367- | 'scamalyticsIpPrivacy'
368368 | 'scamalyticsStatus'
369369 > ,
370370) : FreebuffPrivacyProviderDecision {
0 commit comments