Skip to content

Commit 5b3c4fc

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/master' into handle-exceptions-while-creating-activity-infrastructure
# Conflicts: # src/test/groovy/org/prebid/server/functional/tests/privacy/GppSyncUserActivitiesSpec.groovy # src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitEidsActivitiesSpec.groovy # src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitUfpdActivitiesSpec.groovy # src/test/groovy/org/prebid/server/functional/tests/privacy/PrivacyBaseSpec.groovy
2 parents 6c49d73 + fc4c33c commit 5b3c4fc

77 files changed

Lines changed: 3354 additions & 890 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/scripts/codepath-notification

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ appnexus|Appnexus: prebid@microsoft.com
2121
pubmatic|Pubmatic: header-bidding@pubmatic.com
2222
openx|OpenX: prebid@openx.com
2323
medianet|Medianet: prebid@media.net
24+
thetradedesk|TheTradeDesk: Prebid-Maintainers@thetradedesk.com

extra/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
<checkstyle.version>10.17.0</checkstyle.version>
3434

3535
<!-- Project production dependency versions -->
36-
<spring.boot.version>3.4.4</spring.boot.version>
36+
<spring.boot.version>3.4.2</spring.boot.version>
3737
<vertx.version>4.5.14</vertx.version>
3838
<validation-api.version>2.0.1.Final</validation-api.version>
3939
<commons.collections.version>4.4</commons.collections.version>

src/main/java/org/prebid/server/auction/ExchangeService.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.iab.openrtb.request.App;
66
import com.iab.openrtb.request.BidRequest;
77
import com.iab.openrtb.request.Content;
8+
import com.iab.openrtb.request.Device;
89
import com.iab.openrtb.request.Dooh;
910
import com.iab.openrtb.request.Eid;
1011
import com.iab.openrtb.request.Imp;
@@ -97,6 +98,7 @@
9798
import org.prebid.server.util.ListUtil;
9899
import org.prebid.server.util.PbsUtil;
99100
import org.prebid.server.util.StreamUtil;
101+
import org.apache.commons.lang3.tuple.Pair;
100102

101103
import java.math.BigDecimal;
102104
import java.time.Clock;
@@ -502,10 +504,10 @@ private Future<List<AuctionParticipation>> makeAuctionParticipation(
502504
final ExtRequestPrebid prebid = requestExt == null ? null : requestExt.getPrebid();
503505
final Map<String, ExtBidderConfigOrtb> biddersToConfigs = getBiddersToConfigs(prebid);
504506
final Map<String, List<String>> eidPermissions = getEidPermissions(prebid);
505-
final Map<String, User> bidderToUser =
506-
prepareUsers(bidders, context, aliases, biddersToConfigs, eidPermissions);
507+
final Map<String, Pair<User, Device>> bidderToUserAndDevice =
508+
prepareUsersAndDevices(bidders, context, aliases, biddersToConfigs, eidPermissions);
507509

508-
return privacyEnforcementService.mask(context, bidderToUser, aliases)
510+
return privacyEnforcementService.mask(context, bidderToUserAndDevice, aliases)
509511
.map(bidderToPrivacyResult -> getAuctionParticipation(
510512
bidderToPrivacyResult,
511513
bidRequest,
@@ -557,7 +559,7 @@ private static List<String> firstPartyDataBidders(ExtRequest requestExt) {
557559
return data == null ? null : data.getBidders();
558560
}
559561

560-
private Map<String, User> prepareUsers(List<String> bidders,
562+
private Map<String, Pair<User, Device>> prepareUsersAndDevices(List<String> bidders,
561563
AuctionContext context,
562564
BidderAliases aliases,
563565
Map<String, ExtBidderConfigOrtb> biddersToConfigs,
@@ -566,17 +568,19 @@ private Map<String, User> prepareUsers(List<String> bidders,
566568
final BidRequest bidRequest = context.getBidRequest();
567569
final List<String> firstPartyDataBidders = firstPartyDataBidders(bidRequest.getExt());
568570

569-
final Map<String, User> bidderToUser = new HashMap<>();
571+
final Map<String, Pair<User, Device>> bidderToUserAndDevice = new HashMap<>();
570572
for (String bidder : bidders) {
571573
final ExtBidderConfigOrtb fpdConfig = ObjectUtils.defaultIfNull(biddersToConfigs.get(bidder),
572574
biddersToConfigs.get(ALL_BIDDERS_CONFIG));
573575
final boolean useFirstPartyData = firstPartyDataBidders == null || firstPartyDataBidders.stream()
574576
.anyMatch(fpdBidder -> StringUtils.equalsIgnoreCase(fpdBidder, bidder));
575577
final User preparedUser = prepareUser(
576578
bidder, context, aliases, useFirstPartyData, fpdConfig, eidPermissions);
577-
bidderToUser.put(bidder, preparedUser);
579+
final Device preparedDevice = prepareDevice(
580+
bidRequest.getDevice(), fpdConfig, useFirstPartyData);
581+
bidderToUserAndDevice.put(bidder, Pair.of(preparedUser, preparedDevice));
578582
}
579-
return bidderToUser;
583+
return bidderToUserAndDevice;
580584
}
581585

582586
private User prepareUser(String bidder,
@@ -813,7 +817,6 @@ private BidRequest prepareBidRequest(BidderPrivacyResult bidderPrivacyResult,
813817
final boolean isApp = preparedApp != null;
814818
final boolean isDooh = !isApp && preparedDooh != null;
815819
final boolean isSite = !isApp && !isDooh && preparedSite != null;
816-
817820
final List<Imp> preparedImps = prepareImps(
818821
bidder,
819822
bidRequest,
@@ -945,6 +948,13 @@ private App prepareApp(App app, ObjectNode fpdApp, boolean useFirstPartyData) {
945948
return useFirstPartyData ? fpdResolver.resolveApp(maskedApp, fpdApp) : maskedApp;
946949
}
947950

951+
private Device prepareDevice(Device device, ExtBidderConfigOrtb fpdConfig, boolean useFirstPartyData) {
952+
if (fpdConfig == null) {
953+
return device;
954+
}
955+
return useFirstPartyData ? fpdResolver.resolveDevice(device, fpdConfig.getDevice()) : device;
956+
}
957+
948958
private static ExtApp maskExtApp(ExtApp appExt) {
949959
final ExtApp maskedExtApp = ExtApp.of(appExt.getPrebid(), null);
950960
return maskedExtApp.isEmpty() ? null : maskedExtApp;

src/main/java/org/prebid/server/auction/FpdResolver.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.databind.node.NullNode;
77
import com.fasterxml.jackson.databind.node.ObjectNode;
88
import com.iab.openrtb.request.App;
9+
import com.iab.openrtb.request.Device;
910
import com.iab.openrtb.request.Dooh;
1011
import com.iab.openrtb.request.Site;
1112
import com.iab.openrtb.request.User;
@@ -23,7 +24,8 @@ public class FpdResolver {
2324
private static final String BIDDERS = "bidders";
2425
private static final String APP = "app";
2526
private static final String DOOH = "dooh";
26-
private static final Set<String> KNOWN_FPD_ATTRIBUTES = Set.of(USER, SITE, APP, DOOH, BIDDERS);
27+
private static final String DEVICE = "device";
28+
private static final Set<String> KNOWN_FPD_ATTRIBUTES = Set.of(USER, SITE, APP, DOOH, DEVICE, BIDDERS);
2729
private static final String CONTEXT = "context";
2830
private static final String DATA = "data";
2931

@@ -51,6 +53,10 @@ public Dooh resolveDooh(Dooh originDooh, ObjectNode fpdDooh) {
5153
return mergeFpd(originDooh, fpdDooh, Dooh.class);
5254
}
5355

56+
public Device resolveDevice(Device originDevice, ObjectNode fpdDevice) {
57+
return mergeFpd(originDevice, fpdDevice, Device.class);
58+
}
59+
5460
private <T> T mergeFpd(T original, ObjectNode fpd, Class<T> tClass) {
5561
if (fpd == null || fpd.isNull() || fpd.isMissingNode()) {
5662
return original;

src/main/java/org/prebid/server/auction/gpp/model/GppModelWrapper.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,7 @@ public class GppModelWrapper extends GppModel {
1717
private IntObjectMap<String> sectionIdToEncodedString;
1818

1919
public GppModelWrapper(String encodedString) throws DecodingException {
20-
super(padSections(encodedString));
21-
}
22-
23-
private static String padSections(String gpp) {
24-
final StringBuilder gppBuilder = new StringBuilder(gpp);
25-
26-
int subsectionStart = 0;
27-
int offset = 0;
28-
for (int i = 1; i < gpp.length(); i++) {
29-
final char currentChar = gpp.charAt(i);
30-
31-
if (currentChar == '~' || currentChar == '.') {
32-
if ((i - subsectionStart) % 4 != 0 && gpp.charAt(i - 1) != '=') {
33-
gppBuilder.insert(i + offset, "A");
34-
offset++;
35-
}
36-
37-
subsectionStart = i + 1;
38-
}
39-
}
40-
41-
final int lastSubsectionLength = gpp.length() - subsectionStart;
42-
if (lastSubsectionLength > 0 && lastSubsectionLength % 4 != 0 && !gpp.endsWith("=")) {
43-
gppBuilder.append("A");
44-
}
45-
46-
return gppBuilder.toString();
20+
super(encodedString);
4721
}
4822

4923
private void init() {

src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementService.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.prebid.server.auction.privacy.enforcement;
22

3+
import com.iab.openrtb.request.Device;
34
import com.iab.openrtb.request.User;
45
import io.vertx.core.Future;
56
import org.prebid.server.auction.aliases.BidderAliases;
67
import org.prebid.server.auction.model.AuctionContext;
78
import org.prebid.server.auction.model.BidderPrivacyResult;
9+
import org.apache.commons.lang3.tuple.Pair;
810

911
import java.util.List;
1012
import java.util.Map;
@@ -22,14 +24,14 @@ public PrivacyEnforcementService(final List<PrivacyEnforcement> enforcements) {
2224
}
2325

2426
public Future<List<BidderPrivacyResult>> mask(AuctionContext auctionContext,
25-
Map<String, User> bidderToUser,
27+
Map<String, Pair<User, Device>> bidderToUserAndDevice,
2628
BidderAliases aliases) {
2729

28-
final List<BidderPrivacyResult> initialResults = bidderToUser.entrySet().stream()
30+
final List<BidderPrivacyResult> initialResults = bidderToUserAndDevice.entrySet().stream()
2931
.map(entry -> BidderPrivacyResult.builder()
3032
.requestBidder(entry.getKey())
31-
.user(entry.getValue())
32-
.device(auctionContext.getBidRequest().getDevice())
33+
.user(entry.getValue().getLeft())
34+
.device(entry.getValue().getRight())
3335
.build())
3436
.toList();
3537

src/main/java/org/prebid/server/bidder/epsilon/EpsilonBidder.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,12 @@ private Bid updateBidWithId(Bid bid) {
261261
private static BidType getType(String impId, List<Imp> imps) {
262262
for (Imp imp : imps) {
263263
if (imp.getId().equals(impId)) {
264-
if (imp.getVideo() != null) {
265-
return BidType.video;
266-
} else if (imp.getAudio() != null) {
264+
if (imp.getAudio() != null) {
267265
return BidType.audio;
266+
} else if (imp.getXNative() != null) {
267+
return BidType.xNative;
268+
} else if (imp.getVideo() != null) {
269+
return BidType.video;
268270
} else {
269271
return BidType.banner;
270272
}

src/main/java/org/prebid/server/bidder/invibes/InvibesBidder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ private static String resolveWidth(Device device) {
247247
}
248248

249249
private static String resolveHost(Integer domainId) {
250-
if (domainId == 0 || domainId == 1 || domainId == 1001) {
250+
if (domainId == null || domainId == 0 || domainId == 1 || domainId == 1001) {
251251
return "bid";
252252
} else if (domainId < 1002) {
253253
return "bid" + domainId;

src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import com.iab.openrtb.response.BidResponse;
1313
import com.iab.openrtb.response.SeatBid;
1414
import io.vertx.core.MultiMap;
15-
import io.vertx.core.http.HttpMethod;
1615
import org.apache.commons.collections4.CollectionUtils;
1716
import org.apache.commons.lang3.ObjectUtils;
1817
import org.apache.commons.lang3.StringUtils;
@@ -22,17 +21,22 @@
2221
import org.prebid.server.bidder.model.BidderError;
2322
import org.prebid.server.bidder.model.HttpRequest;
2423
import org.prebid.server.bidder.model.Result;
24+
import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExt;
25+
import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExtBidder;
2526
import org.prebid.server.exception.PreBidException;
2627
import org.prebid.server.json.DecodeException;
2728
import org.prebid.server.json.JacksonMapper;
2829
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
2930
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
3031
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
32+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidServer;
3133
import org.prebid.server.proto.openrtb.ext.request.ExtStoredRequest;
3234
import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtImpNextMillennium;
3335
import org.prebid.server.proto.openrtb.ext.response.BidType;
36+
import org.prebid.server.util.BidderUtil;
3437
import org.prebid.server.util.HttpUtil;
3538
import org.prebid.server.util.ObjectUtil;
39+
import org.prebid.server.version.PrebidVersionProvider;
3640

3741
import java.util.ArrayList;
3842
import java.util.Collection;
@@ -46,15 +50,22 @@ public class NextMillenniumBidder implements Bidder<BidRequest> {
4650
new TypeReference<>() {
4751
};
4852

53+
private static final String NM_ADAPTER_VERSION = "v1.0.0";
54+
4955
private final String endpointUrl;
5056
private final JacksonMapper mapper;
5157
private final List<String> nmmFlags;
58+
private final PrebidVersionProvider versionProvider;
59+
60+
public NextMillenniumBidder(String endpointUrl,
61+
JacksonMapper mapper,
62+
List<String> nmmFlags,
63+
PrebidVersionProvider versionProvider) {
5264

53-
public NextMillenniumBidder(String endpointUrl, JacksonMapper mapper, List<String> nmmFlags) {
5465
this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl));
5566
this.mapper = Objects.requireNonNull(mapper);
5667
this.nmmFlags = nmmFlags;
57-
68+
this.versionProvider = Objects.requireNonNull(versionProvider);
5869
}
5970

6071
@Override
@@ -70,7 +81,12 @@ public final Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest b
7081
errors.add(BidderError.badInput(e.getMessage()));
7182
continue;
7283
}
73-
httpRequests.add(makeHttpRequest(updateBidRequest(bidRequest, extImpNextMillennium)));
84+
final BidRequest updatedRequest = updateBidRequest(bidRequest, extImpNextMillennium);
85+
httpRequests.add(BidderUtil.defaultRequest(
86+
updatedRequest,
87+
headers(),
88+
endpointUrl,
89+
mapper));
7490
}
7591

7692
return errors.isEmpty() ? Result.withValues(httpRequests) : Result.withErrors(errors);
@@ -84,31 +100,19 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) {
84100
}
85101
}
86102

87-
private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium ext) {
88-
final ExtStoredRequest storedRequest = ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext));
89-
90-
final ExtRequestPrebid createdExtRequestPrebid = ExtRequestPrebid.builder()
91-
.storedrequest(storedRequest)
92-
.build();
93-
94-
final ExtRequestPrebid extRequestPrebid = Optional.of(bidRequest)
95-
.map(BidRequest::getExt)
103+
private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium extImp) {
104+
final String soredRequestId = resolveStoredRequestId(bidRequest, extImp);
105+
final ExtRequestPrebidServer extRequestPrebidServer = Optional.ofNullable(bidRequest.getExt())
96106
.map(ExtRequest::getPrebid)
97-
.map(prebid -> prebid.toBuilder().storedrequest(storedRequest).build())
98-
.orElse(createdExtRequestPrebid);
107+
.map(ExtRequestPrebid::getServer)
108+
.orElse(null);
99109

100110
return bidRequest.toBuilder()
101-
.imp(updateImps(bidRequest, createdExtRequestPrebid))
102-
.ext(ExtRequest.of(extRequestPrebid))
111+
.imp(modifyFirstImp(bidRequest.getImp(), soredRequestId))
112+
.ext(createExtRequest(soredRequestId, extRequestPrebidServer))
103113
.build();
104114
}
105115

106-
private List<Imp> updateImps(BidRequest bidRequest, ExtRequestPrebid extRequestPrebid) {
107-
return bidRequest.getImp().stream()
108-
.map(imp -> imp.toBuilder().ext(createImpExt(extRequestPrebid)).build())
109-
.toList();
110-
}
111-
112116
private static String resolveStoredRequestId(BidRequest bidRequest, ExtImpNextMillennium extImpNextMillennium) {
113117
final String groupId = extImpNextMillennium.getGroupId();
114118
if (StringUtils.isEmpty(groupId)) {
@@ -146,24 +150,38 @@ private static String formatSize(Integer w, Integer h) {
146150
: null;
147151
}
148152

149-
private ObjectNode createImpExt(ExtRequestPrebid prebid) {
150-
final ObjectNode impExt = mapper.mapper().createObjectNode();
151-
impExt.set("prebid", mapper.mapper().valueToTree(prebid));
152-
if (CollectionUtils.isNotEmpty(nmmFlags)) {
153-
impExt.putObject("nextMillennium")
154-
.set("nmmFlags", mapper.mapper().valueToTree(nmmFlags));
155-
}
156-
return impExt;
153+
private List<Imp> modifyFirstImp(List<Imp> imps, String storedRequestId) {
154+
final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid.builder()
155+
.storedrequest(ExtStoredRequest.of(storedRequestId))
156+
.build();
157+
158+
final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of(
159+
NextMillenniumExtBidder.of(nmmFlags, null, null));
160+
161+
final ExtRequest extRequest = ExtRequest.of(extRequestPrebid);
162+
mapper.fillExtension(extRequest, nextMillenniumExt);
163+
164+
final ObjectNode impExt = mapper.mapper().valueToTree(extRequest);
165+
166+
final List<Imp> modifiedImps = new ArrayList<>(imps);
167+
modifiedImps.set(0, imps.getFirst().toBuilder().ext(impExt).build());
168+
169+
return modifiedImps;
157170
}
158171

159-
private HttpRequest<BidRequest> makeHttpRequest(BidRequest bidRequest) {
160-
return HttpRequest.<BidRequest>builder()
161-
.method(HttpMethod.POST)
162-
.uri(endpointUrl)
163-
.headers(headers())
164-
.payload(bidRequest)
165-
.body(mapper.encodeToBytes(bidRequest))
172+
private ExtRequest createExtRequest(String storedRequestId, ExtRequestPrebidServer extRequestPrebidServer) {
173+
final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid.builder()
174+
.storedrequest(ExtStoredRequest.of(storedRequestId))
175+
.server(extRequestPrebidServer)
166176
.build();
177+
178+
final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of(
179+
NextMillenniumExtBidder.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord()));
180+
181+
final ExtRequest extRequest = ExtRequest.of(extRequestPrebid);
182+
mapper.fillExtension(extRequest, nextMillenniumExt);
183+
184+
return extRequest;
167185
}
168186

169187
private static MultiMap headers() {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.prebid.server.bidder.nextmillennium.proto;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Value;
5+
6+
@Value(staticConstructor = "of")
7+
public class NextMillenniumExt {
8+
9+
@JsonProperty("nextMillennium")
10+
NextMillenniumExtBidder nextMillennium;
11+
}

0 commit comments

Comments
 (0)