Skip to content

Commit d9db6d0

Browse files
committed
Fix #3592. Bad Input Error if pbjs s2s config contains alias configuration for a disabled adapter
1 parent f978b0e commit d9db6d0

File tree

13 files changed

+218
-104
lines changed

13 files changed

+218
-104
lines changed

src/main/java/org/prebid/server/auction/requestfactory/AmpRequestFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ private Future<BidRequest> updateBidRequest(AuctionContext auctionContext) {
415415
.map(bidRequest -> paramsResolver.resolve(bidRequest, auctionContext, ENDPOINT, true))
416416
.map(bidRequest -> ortb2RequestFactory.removeEmptyEids(bidRequest, auctionContext.getDebugWarnings()))
417417
.compose(resolvedBidRequest -> ortb2RequestFactory.validateRequest(
418+
account,
418419
resolvedBidRequest,
419420
auctionContext.getHttpRequest(),
420421
auctionContext.getDebugContext(),

src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ private Future<BidRequest> updateAndValidateBidRequest(AuctionContext auctionCon
242242
return storedRequestProcessor.processAuctionRequest(account.getId(), auctionContext.getBidRequest())
243243
.compose(auctionStoredResult -> updateBidRequest(auctionStoredResult, auctionContext))
244244
.compose(bidRequest -> ortb2RequestFactory.validateRequest(
245-
bidRequest, httpRequest, auctionContext.getDebugContext(), debugWarnings))
245+
account, bidRequest, httpRequest, auctionContext.getDebugContext(), debugWarnings))
246246
.map(interstitialProcessor::process);
247247
}
248248

src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,13 @@ public Future<ActivityInfrastructure> activityInfrastructureFrom(AuctionContext
192192
auctionContext.getDebugContext().getTraceLevel()));
193193
}
194194

195-
public Future<BidRequest> validateRequest(BidRequest bidRequest,
195+
public Future<BidRequest> validateRequest(Account account, BidRequest bidRequest,
196196
HttpRequestContext httpRequestContext,
197197
DebugContext debugContext,
198198
List<String> warnings) {
199199

200200
final ValidationResult validationResult = requestValidator.validate(
201-
bidRequest, httpRequestContext, debugContext);
201+
account, bidRequest, httpRequestContext, debugContext);
202202

203203
if (validationResult.hasWarnings()) {
204204
warnings.addAll(validationResult.getWarnings());

src/main/java/org/prebid/server/auction/requestfactory/VideoRequestFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.prebid.server.model.HttpRequestContext;
3434
import org.prebid.server.proto.openrtb.ext.request.ExtPublisher;
3535
import org.prebid.server.proto.openrtb.ext.request.ExtPublisherPrebid;
36+
import org.prebid.server.settings.model.Account;
3637
import org.prebid.server.util.HttpUtil;
3738
import org.prebid.server.util.ObjectUtil;
3839

@@ -120,6 +121,7 @@ public Future<WithPodErrors<AuctionContext>> fromRequest(RoutingContext routingC
120121
.map(auctionContext -> auctionContext.with(debugResolver.debugContextFrom(auctionContext)))
121122

122123
.compose(auctionContext -> ortb2RequestFactory.validateRequest(
124+
auctionContext.getAccount(),
123125
auctionContext.getBidRequest(),
124126
auctionContext.getHttpRequest(),
125127
auctionContext.getDebugContext(),

src/main/java/org/prebid/server/metric/MetricName.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public enum MetricName {
6363
nobid,
6464
gotbids,
6565
badinput,
66+
disabled_bidder,
67+
unknown_bidder,
6668
blocklisted_account,
6769
blocklisted_app,
6870
badserverresponse,

src/main/java/org/prebid/server/metric/Metrics.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,22 @@ public void updateAdapterRequestErrorMetric(String bidder, MetricName errorMetri
336336
forAdapter(bidder).request().incCounter(errorMetric);
337337
}
338338

339+
public void updateAdapterRequestDisabledBidderMetric(String bidder, Account account) {
340+
forAdapter(bidder).request().incCounter(MetricName.disabled_bidder);
341+
if (accountMetricsVerbosityResolver.forAccount(account)
342+
.isAtLeast(AccountMetricsVerbosityLevel.detailed)) {
343+
forAccount(account.getId()).adapter().forAdapter(bidder).request().incCounter(MetricName.disabled_bidder);
344+
}
345+
}
346+
347+
public void updateAdapterRequestUnknownBidderMetric(String bidder, Account account) {
348+
forAdapter(bidder).request().incCounter(MetricName.unknown_bidder);
349+
if (accountMetricsVerbosityResolver.forAccount(account)
350+
.isAtLeast(AccountMetricsVerbosityLevel.detailed)) {
351+
forAccount(account.getId()).adapter().forAdapter(bidder).request().incCounter(MetricName.unknown_bidder);
352+
}
353+
}
354+
339355
public void updateAnalyticEventMetric(String analyticCode, MetricName eventType, MetricName result) {
340356
forAnalyticReporter(analyticCode).forEventType(eventType).incCounter(result);
341357
}

src/main/java/org/prebid/server/validation/RequestValidator.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.prebid.server.proto.openrtb.ext.request.ExtUserPrebid;
4242
import org.prebid.server.proto.openrtb.ext.request.ImpMediaType;
4343
import org.prebid.server.proto.openrtb.ext.response.BidType;
44+
import org.prebid.server.settings.model.Account;
4445
import org.prebid.server.util.HttpUtil;
4546
import org.prebid.server.validation.model.ValidationResult;
4647

@@ -97,7 +98,8 @@ public RequestValidator(BidderCatalog bidderCatalog,
9798
* Validates the {@link BidRequest} against a list of validation checks, however, reports only one problem
9899
* at a time.
99100
*/
100-
public ValidationResult validate(BidRequest bidRequest,
101+
public ValidationResult validate(Account account,
102+
BidRequest bidRequest,
101103
HttpRequestContext httpRequestContext,
102104
DebugContext debugContext) {
103105

@@ -126,7 +128,7 @@ public ValidationResult validate(BidRequest bidRequest,
126128
validateTargeting(targeting);
127129
}
128130
aliases = ObjectUtils.defaultIfNull(extRequestPrebid.getAliases(), Collections.emptyMap());
129-
validateAliases(aliases);
131+
validateAliases(aliases, warnings, metrics, account);
130132
validateAliasesGvlIds(extRequestPrebid, aliases);
131133
validateBidAdjustmentFactors(extRequestPrebid.getBidadjustmentfactors(), aliases);
132134
validateExtBidPrebidData(extRequestPrebid.getData(), aliases, isDebugEnabled, warnings);
@@ -505,18 +507,22 @@ private static void validateGranularityRangeIncrement(ExtGranularityRange range)
505507
* Validates aliases. Throws {@link ValidationException} in cases when alias points to invalid bidder or when alias
506508
* is equals to itself.
507509
*/
508-
private void validateAliases(Map<String, String> aliases) throws ValidationException {
510+
private void validateAliases(Map<String, String> aliases, List<String> warnings,
511+
Metrics metrics, Account account) throws ValidationException {
512+
509513
for (final Map.Entry<String, String> aliasToBidder : aliases.entrySet()) {
510514
final String alias = aliasToBidder.getKey();
511515
final String coreBidder = aliasToBidder.getValue();
512516
if (!bidderCatalog.isValidName(coreBidder)) {
513-
throw new ValidationException(
517+
warnings.add(
514518
"request.ext.prebid.aliases.%s refers to unknown bidder: %s".formatted(alias, coreBidder));
515-
}
516-
if (!bidderCatalog.isActive(coreBidder)) {
517-
throw new ValidationException(
519+
metrics.updateAdapterRequestUnknownBidderMetric(coreBidder, account);
520+
} else if (!bidderCatalog.isActive(coreBidder)) {
521+
warnings.add(
518522
"request.ext.prebid.aliases.%s refers to disabled bidder: %s".formatted(alias, coreBidder));
523+
metrics.updateAdapterRequestDisabledBidderMetric(coreBidder, account);
519524
}
525+
520526
if (alias.equals(coreBidder)) {
521527
throw new ValidationException("""
522528
request.ext.prebid.aliases.%s defines a no-op alias. \

src/test/java/org/prebid/server/auction/requestfactory/AmpRequestFactoryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1753,7 +1753,7 @@ private void givenBidRequest(
17531753

17541754
given(ortb2ImplicitParametersResolver.resolve(any(), any(), any(), anyBoolean())).willAnswer(
17551755
answerWithFirstArgument());
1756-
given(ortb2RequestFactory.validateRequest(any(), any(), any(), any()))
1756+
given(ortb2RequestFactory.validateRequest(any(), any(), any(), any(), any()))
17571757
.willAnswer(invocation -> Future.succeededFuture((BidRequest) invocation.getArgument(0)));
17581758

17591759
given(ortb2RequestFactory.enrichBidRequestWithAccountAndPrivacyData(any()))

src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public void setUp() {
165165
given(ortb2RequestFactory.executeRawAuctionRequestHooks(any()))
166166
.willAnswer(invocation -> Future.succeededFuture(
167167
((AuctionContext) invocation.getArgument(0)).getBidRequest()));
168-
given(ortb2RequestFactory.validateRequest(any(), any(), any(), any()))
168+
given(ortb2RequestFactory.validateRequest(any(), any(), any(), any(), any()))
169169
.willAnswer(invocationOnMock -> Future.succeededFuture((BidRequest) invocationOnMock.getArgument(0)));
170170
given(ortb2RequestFactory.removeEmptyEids(any(), any()))
171171
.willAnswer(invocationOnMock -> invocationOnMock.getArgument(0));
@@ -662,7 +662,7 @@ public void shouldReturnFailedFutureIfRequestValidationFailed() {
662662
// given
663663
givenValidBidRequest();
664664

665-
given(ortb2RequestFactory.validateRequest(any(), any(), any(), any()))
665+
given(ortb2RequestFactory.validateRequest(any(), any(), any()))
666666
.willReturn(Future.failedFuture(new InvalidRequestException("errors")));
667667

668668
// when

src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
public class Ortb2RequestFactoryTest extends VertxTest {
105105

106106
private static final List<String> BLOCKLISTED_ACCOUNTS = singletonList("bad_acc");
107+
private static final String ACCOUNT_ID = "accountId";
107108

108109
@Mock
109110
private UidsCookieService uidsCookieService;
@@ -658,12 +659,13 @@ public void enrichAuctionContextShouldSetDebugOff() {
658659
@Test
659660
public void validateRequestShouldThrowInvalidRequestExceptionIfRequestIsInvalid() {
660661
// given
661-
given(requestValidator.validate(any(), any(), any())).willReturn(ValidationResult.error("error"));
662+
given(requestValidator.validate(any(), any(), any(), any())).willReturn(ValidationResult.error("error"));
662663

663664
final BidRequest bidRequest = givenBidRequest(identity());
664665

665666
// when
666667
final Future<BidRequest> result = target.validateRequest(
668+
Account.empty(ACCOUNT_ID),
667669
bidRequest,
668670
HttpRequestContext.builder().build(),
669671
DebugContext.empty(),
@@ -675,25 +677,26 @@ public void validateRequestShouldThrowInvalidRequestExceptionIfRequestIsInvalid(
675677
.isInstanceOf(InvalidRequestException.class)
676678
.hasMessage("error");
677679

678-
verify(requestValidator).validate(eq(bidRequest), any(), any());
680+
verify(requestValidator).validate(any(), eq(bidRequest), any(), any());
679681
}
680682

681683
@Test
682684
public void validateRequestShouldReturnSameBidRequest() {
683685
// given
684-
given(requestValidator.validate(any(), any(), any())).willReturn(ValidationResult.success());
686+
given(requestValidator.validate(any(), any(), any(), any())).willReturn(ValidationResult.success());
685687

686688
final BidRequest bidRequest = givenBidRequest(identity());
687689

688690
// when
689691
final BidRequest result = target.validateRequest(
692+
Account.empty(ACCOUNT_ID),
690693
bidRequest,
691694
HttpRequestContext.builder().build(),
692695
DebugContext.empty(),
693696
new ArrayList<>()).result();
694697

695698
// then
696-
verify(requestValidator).validate(eq(bidRequest), any(), any());
699+
verify(requestValidator).validate(any(), eq(bidRequest), any(), any());
697700

698701
assertThat(result).isSameAs(bidRequest);
699702
}

0 commit comments

Comments
 (0)