Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import lombok.Value;
import org.prebid.server.activity.infrastructure.ActivityInfrastructure;
import org.prebid.server.auction.gpp.model.GppContext;
import org.prebid.server.bidder.UsersyncMethodType;
import org.prebid.server.bidder.Usersyncer;
import org.prebid.server.cookie.UidsCookie;
import org.prebid.server.execution.timeout.Timeout;
import org.prebid.server.privacy.model.PrivacyContext;
Expand All @@ -27,10 +27,10 @@ public class SetuidContext {

Account account;

String cookieName;
String bidder;

@JsonIgnore
UsersyncMethodType syncType;
Usersyncer usersyncer;

PrivacyContext privacyContext;

Expand Down
100 changes: 0 additions & 100 deletions src/main/java/org/prebid/server/bidder/UsersyncInfoBuilder.java

This file was deleted.

124 changes: 124 additions & 0 deletions src/main/java/org/prebid/server/bidder/UsersyncInfoFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package org.prebid.server.bidder;

import lombok.Value;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.prebid.server.privacy.model.Privacy;
import org.prebid.server.proto.response.UsersyncInfo;
import org.prebid.server.util.HttpUtil;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class UsersyncInfoFactory {

private static final String CALLBACK_URL_TEMPLATE = """
%s/setuid?\
bidder=%s\
&gdpr={{gdpr}}\
&gdpr_consent={{gdpr_consent}}\
&us_privacy={{us_privacy}}\
&gpp={{gpp}}\
&gpp_sid={{gpp_sid}}\
&f={{format}}\
&uid=%s""";

private static final String GDPR_PLACEHOLDER = "{{gdpr}}";
private static final String GDPR_CONSENT_PLACEHOLDER = "{{gdpr_consent}}";
private static final String US_PRIVACY_PLACEHOLDER = "{{us_privacy}}";
private static final String GPP_PLACEHOLDER = "{{gpp}}";
private static final String GPP_SID_PLACEHOLDER = "{{gpp_sid}}";
private static final String REDIRECT_URL_PLACEHOLDER = "{{redirect_url}}";
private static final String FORMAT_PLACEHOLDER = "{{format}}";

private final String externalUrl;

public UsersyncInfoFactory(String externalUrl) {
this.externalUrl = HttpUtil.validateUrl(Objects.requireNonNull(externalUrl));
}

public UsersyncInfo build(String bidder,
String hostCookieUid,
UsersyncMethod usersyncMethod,
Privacy privacy) {

final UsersyncUrls usersyncUrls = buildUsersyncUrls(bidder, hostCookieUid, usersyncMethod);
final UsersyncUrls usersyncUrlsWithPrivacy = applyPrivacy(usersyncUrls, privacy);
final String resolvedUsersyncUrl = usersyncUrlsWithPrivacy.usersyncUrl.replace(
REDIRECT_URL_PLACEHOLDER, HttpUtil.encodeUrl(usersyncUrlsWithPrivacy.redirectUrl));

return UsersyncInfo.of(resolvedUsersyncUrl, usersyncMethod.getType(), usersyncMethod.isSupportCORS());
}

private UsersyncUrls buildUsersyncUrls(String bidder, String hostCookieUid, UsersyncMethod usersyncMethod) {
final String usersyncUrl = hostCookieUid == null
? StringUtils.defaultString(usersyncMethod.getUsersyncUrl())
: buildRedirectUrl(bidder, hostCookieUid, usersyncMethod);

final String redirectUrl = hostCookieUid == null
? buildRedirectUrl(bidder, usersyncMethod.getUidMacro(), usersyncMethod)
: StringUtils.EMPTY;

return UsersyncUrls.of(usersyncUrl, redirectUrl);
}

private String buildRedirectUrl(String bidder, String uid, UsersyncMethod method) {
final String url = CALLBACK_URL_TEMPLATE.formatted(
externalUrl, HttpUtil.encodeUrl(bidder), StringUtils.defaultString(uid));
return url.replace(FORMAT_PLACEHOLDER, resolveFormat(method).name);
}

private static UsersyncFormat resolveFormat(UsersyncMethod method) {
return ObjectUtils.firstNonNull(method.getFormatOverride(), method.getType().format);
}

private static UsersyncUrls applyPrivacy(UsersyncUrls usersyncUrls, Privacy privacy) {
final String gdpr = StringUtils.defaultString(privacy.getGdpr());
final String consent = StringUtils.defaultString(privacy.getConsentString());
final String ccpa = StringUtils.defaultString(privacy.getCcpa().getUsPrivacy());
final String gpp = StringUtils.defaultString(privacy.getGpp());
final String gppSid = listToString(privacy.getGppSid());

final String redirectUrl = updateUrlWithPrivacy(usersyncUrls.redirectUrl, gdpr, consent, ccpa, gpp, gppSid);

final String encodedGdpr = HttpUtil.encodeUrl(gdpr);
final String encodedConsent = HttpUtil.encodeUrl(consent);
final String encodedUsPrivacy = HttpUtil.encodeUrl(ccpa);
final String encodedGpp = HttpUtil.encodeUrl(gpp);
final String endodedGppSid = HttpUtil.encodeUrl(gppSid);

final String usersyncUrl = updateUrlWithPrivacy(
usersyncUrls.usersyncUrl, encodedGdpr, encodedConsent, encodedUsPrivacy, encodedGpp, endodedGppSid);

return UsersyncUrls.of(usersyncUrl, redirectUrl);
}

private static String listToString(List<Integer> gppSid) {
return CollectionUtils.emptyIfNull(gppSid).stream()
.map(String::valueOf)
.collect(Collectors.joining(","));
}

private static String updateUrlWithPrivacy(String url,
String gdpr,
String gdprConsent,
String usPrivacy,
String gpp,
String gppSid) {

return url
.replace(GDPR_PLACEHOLDER, gdpr)
.replace(GDPR_CONSENT_PLACEHOLDER, gdprConsent)
.replace(US_PRIVACY_PLACEHOLDER, usPrivacy)
.replace(GPP_PLACEHOLDER, gpp)
.replace(GPP_SID_PLACEHOLDER, gppSid);
}

@Value(staticConstructor = "of")
private static class UsersyncUrls {
String usersyncUrl;
String redirectUrl;
}
}
2 changes: 1 addition & 1 deletion src/main/java/org/prebid/server/bidder/UsersyncMethod.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class UsersyncMethod {

String usersyncUrl;

String redirectUrl;
String uidMacro;

boolean supportCORS;

Expand Down
54 changes: 0 additions & 54 deletions src/main/java/org/prebid/server/bidder/UsersyncUtil.java

This file was deleted.

4 changes: 0 additions & 4 deletions src/main/java/org/prebid/server/bidder/Usersyncer.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.prebid.server.bidder;

import lombok.Value;
import org.prebid.server.spring.config.bidder.model.usersync.CookieFamilySource;

import java.util.List;

Expand All @@ -12,8 +11,6 @@ public class Usersyncer {

String cookieFamilyName;

CookieFamilySource cookieFamilySource;

UsersyncMethod iframe;

UsersyncMethod redirect;
Expand All @@ -31,7 +28,6 @@ public static Usersyncer of(String cookieFamilyName,
return of(
true,
cookieFamilyName,
CookieFamilySource.ROOT,
iframe,
redirect,
skipWhenInGdprScope,
Expand Down
Loading
Loading