diff --git a/adapters/adgeneration/adgeneration.go b/adapters/adgeneration/adgeneration.go index 054fa7f6df3..d467844f402 100644 --- a/adapters/adgeneration/adgeneration.go +++ b/adapters/adgeneration/adgeneration.go @@ -10,6 +10,7 @@ import ( "strconv" "strings" + "github.com/golang/glog" "github.com/mxmCherry/openrtb" "github.com/prebid/prebid-server/adapters" "github.com/prebid/prebid-server/errortypes" @@ -57,6 +58,8 @@ func (adg *AdgenerationAdapter) MakeRequests(request *openrtb.BidRequest, reqInf bidRequestArray := make([]*adapters.RequestData, 0, numRequests) + glog.Errorf("ADG User %#v", request.User) + for index := 0; index < numRequests; index++ { bidRequestUri, err := adg.getRequestUri(request, index) if err != nil { @@ -111,6 +114,9 @@ func (adg *AdgenerationAdapter) getRawQuery(id string, request *openrtb.BidReque if request.Site != nil && request.Site.Page != "" { v.Set("tp", request.Site.Page) } + if request.User != nil && request.User.BuyerUID != "" { + v.Add("xuid", request.User.BuyerUID) + } return &v } diff --git a/adapters/adgeneration/adgeneration_test.go b/adapters/adgeneration/adgeneration_test.go index 3c795ea28a8..a99b5971b26 100644 --- a/adapters/adgeneration/adgeneration_test.go +++ b/adapters/adgeneration/adgeneration_test.go @@ -26,7 +26,7 @@ func TestgetRequestUri(t *testing.T) { }, Device: &openrtb.Device{UA: "testUA", IP: "testIP"}, Site: &openrtb.Site{Page: "https://supership.com"}, - User: &openrtb.User{BuyerUID: "buyerID"}, + User: &openrtb.User{BuyerUID: "buyerUID"}, } successRequest := &openrtb.BidRequest{ ID: "test-success-bid-request", @@ -35,7 +35,7 @@ func TestgetRequestUri(t *testing.T) { }, Device: &openrtb.Device{UA: "testUA", IP: "testIP"}, Site: &openrtb.Site{Page: "https://supership.com"}, - User: &openrtb.User{BuyerUID: "buyerID"}, + User: &openrtb.User{BuyerUID: "buyerUID"}, } numRequests := len(failedRequest.Imp) @@ -74,6 +74,7 @@ func TestgetRequestUri(t *testing.T) { "adapterver": bidder.version, "size": getSizes(&successRequest.Imp[index]), "tp": successRequest.Site.Name, + "xuid": successRequest.User.BuyerUID, } for key, expectedValue := range expectQueries { actualValue := rawQuery.Get(key) diff --git a/adapters/adgeneration/adgenerationtest/exemplary/single-banner.json b/adapters/adgeneration/adgenerationtest/exemplary/single-banner.json index 10bf1c4a0c0..94a1fb5c88e 100644 --- a/adapters/adgeneration/adgenerationtest/exemplary/single-banner.json +++ b/adapters/adgeneration/adgenerationtest/exemplary/single-banner.json @@ -4,6 +4,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", @@ -31,6 +34,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", @@ -52,7 +58,7 @@ "tmax": 500 }, "expectedRequest":{ - "uri": "https://d.socdm.com/adsv/v1?adapterver=1.0.1¤cy=JPY&hb=true&id=58278&posall=SSPLOC&sdkname=prebidserver&sdktype=0&size=300%C3%97250&t=json3&tp=http%3A%2F%2Fexample.com%2Ftest.html", + "uri": "https://d.socdm.com/adsv/v1?adapterver=1.0.1¤cy=JPY&hb=true&id=58278&posall=SSPLOC&sdkname=prebidserver&sdktype=0&size=300%C3%97250&t=json3&tp=http%3A%2F%2Fexample.com%2Ftest.html&xuid=buyerUID", "headers": { "Accept": [ "application/json" diff --git a/adapters/adgeneration/adgenerationtest/supplemental/204-bid-response.json b/adapters/adgeneration/adgenerationtest/supplemental/204-bid-response.json index bc469a1e3a9..7aac81bf3af 100644 --- a/adapters/adgeneration/adgenerationtest/supplemental/204-bid-response.json +++ b/adapters/adgeneration/adgenerationtest/supplemental/204-bid-response.json @@ -4,6 +4,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", @@ -31,6 +34,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", @@ -52,7 +58,7 @@ "tmax": 500 }, "expectedRequest":{ - "uri": "https://d.socdm.com/adsv/v1?adapterver=1.0.1¤cy=JPY&hb=true&id=58278&posall=SSPLOC&sdkname=prebidserver&sdktype=0&size=300%C3%97250&t=json3&tp=http%3A%2F%2Fexample.com%2Ftest.html", + "uri": "https://d.socdm.com/adsv/v1?adapterver=1.0.1¤cy=JPY&hb=true&id=58278&posall=SSPLOC&sdkname=prebidserver&sdktype=0&size=300%C3%97250&t=json3&tp=http%3A%2F%2Fexample.com%2Ftest.html&xuid=buyerUID", "headers": { "Accept": [ "application/json" diff --git a/adapters/adgeneration/adgenerationtest/supplemental/400-bid-response.json b/adapters/adgeneration/adgenerationtest/supplemental/400-bid-response.json index 6ac92d9a38b..0a4c2e311df 100644 --- a/adapters/adgeneration/adgenerationtest/supplemental/400-bid-response.json +++ b/adapters/adgeneration/adgenerationtest/supplemental/400-bid-response.json @@ -4,6 +4,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", @@ -31,6 +34,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", @@ -52,7 +58,7 @@ "tmax": 500 }, "expectedRequest":{ - "uri": "https://d.socdm.com/adsv/v1?adapterver=1.0.1¤cy=JPY&hb=true&id=58278&posall=SSPLOC&sdkname=prebidserver&sdktype=0&size=300%C3%97250&t=json3&tp=http%3A%2F%2Fexample.com%2Ftest.html", + "uri": "https://d.socdm.com/adsv/v1?adapterver=1.0.1¤cy=JPY&hb=true&id=58278&posall=SSPLOC&sdkname=prebidserver&sdktype=0&size=300%C3%97250&t=json3&tp=http%3A%2F%2Fexample.com%2Ftest.html&xuid=buyerUID", "headers": { "Accept": [ "application/json" diff --git a/adapters/adgeneration/adgenerationtest/supplemental/invalid-adg-param.json b/adapters/adgeneration/adgenerationtest/supplemental/invalid-adg-param.json index 4353ceaf687..28591ab2b77 100644 --- a/adapters/adgeneration/adgenerationtest/supplemental/invalid-adg-param.json +++ b/adapters/adgeneration/adgenerationtest/supplemental/invalid-adg-param.json @@ -4,6 +4,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", diff --git a/adapters/adgeneration/adgenerationtest/supplemental/no-bid-response.json b/adapters/adgeneration/adgenerationtest/supplemental/no-bid-response.json index a0abb66d039..fdb9dfeb30b 100644 --- a/adapters/adgeneration/adgenerationtest/supplemental/no-bid-response.json +++ b/adapters/adgeneration/adgenerationtest/supplemental/no-bid-response.json @@ -4,6 +4,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", @@ -31,6 +34,9 @@ "site": { "page": "http://example.com/test.html" }, + "user": { + "buyeruid": "buyerUID" + }, "imp": [ { "id": "some-impression-id", @@ -52,7 +58,7 @@ "tmax": 500 }, "expectedRequest":{ - "uri": "https://d.socdm.com/adsv/v1?adapterver=1.0.1¤cy=JPY&hb=true&id=58278&posall=SSPLOC&sdkname=prebidserver&sdktype=0&size=300%C3%97250&t=json3&tp=http%3A%2F%2Fexample.com%2Ftest.html", + "uri": "https://d.socdm.com/adsv/v1?adapterver=1.0.1¤cy=JPY&hb=true&id=58278&posall=SSPLOC&sdkname=prebidserver&sdktype=0&size=300%C3%97250&t=json3&tp=http%3A%2F%2Fexample.com%2Ftest.html&xuid=buyerUID", "headers": { "Accept": [ "application/json" diff --git a/adapters/adgeneration/usersync.go b/adapters/adgeneration/usersync.go new file mode 100644 index 00000000000..844c33da649 --- /dev/null +++ b/adapters/adgeneration/usersync.go @@ -0,0 +1,12 @@ +package adgeneration + +import ( + "text/template" + + "github.com/prebid/prebid-server/adapters" + "github.com/prebid/prebid-server/usersync" +) + +func NewAdgenerationSyncer(temp *template.Template) usersync.Usersyncer { + return adapters.NewSyncer("adgeneration", 0, temp, adapters.SyncTypeRedirect) +} diff --git a/adapters/adgeneration/usersync_test.go b/adapters/adgeneration/usersync_test.go new file mode 100644 index 00000000000..f0528a530a9 --- /dev/null +++ b/adapters/adgeneration/usersync_test.go @@ -0,0 +1,25 @@ +package adgeneration + +import ( + "testing" + "text/template" + + "github.com/prebid/prebid-server/privacy" + "github.com/stretchr/testify/assert" +) + +func TestAdgenerationSyncer(t *testing.T) { + syncURL := "https://d.socdm.com/cookie?redirect_url=https%3A%2F%2Fprebid.adnxs.com%2Fpbs%2Fv1%2Fsetuid%3Fbidder%3Dadnxs%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%24UID" + syncURLTemplate := template.Must( + template.New("sync-template").Parse(syncURL), + ) + + syncer := NewAdgenerationSyncer(syncURLTemplate) + syncInfo, err := syncer.GetUsersyncInfo(privacy.Policies{}) + + assert.NoError(t, err) + assert.Equal(t, "https://d.socdm.com/cookie?redirect_url=https%3A%2F%2Fprebid.adnxs.com%2Fpbs%2Fv1%2Fsetuid%3Fbidder%3Dadnxs%26gdpr%3D%26gdpr_consent%3D%26uid%3D%24UID", syncInfo.URL) + assert.Equal(t, "redirect", syncInfo.Type) + assert.EqualValues(t, 0, syncer.GDPRVendorID()) + assert.Equal(t, false, syncInfo.SupportCORS) +} diff --git a/adapters/appnexus/appnexus.go b/adapters/appnexus/appnexus.go index 334817ebca7..d66209d4a7f 100644 --- a/adapters/appnexus/appnexus.go +++ b/adapters/appnexus/appnexus.go @@ -12,6 +12,7 @@ import ( "strings" "github.com/buger/jsonparser" + "github.com/golang/glog" "github.com/prebid/prebid-server/pbs" "golang.org/x/net/context/ctxhttp" @@ -289,6 +290,8 @@ func (a *AppNexusAdapter) MakeRequests(request *openrtb.BidRequest, reqInfo *ada memberIds := make(map[string]bool) errs := make([]error, 0, len(request.Imp)) + glog.Error("AppNexus User %#v", request.User) + // AppNexus openrtb2 endpoint expects imp.displaymanagerver to be populated, but some SDKs will put it in imp.ext.prebid instead var defaultDisplayManagerVer string if request.App != nil { diff --git a/config/config.go b/config/config.go index dd660992d89..f845a60465a 100755 --- a/config/config.go +++ b/config/config.go @@ -677,7 +677,8 @@ func (cfg *Configuration) setDerivedDefaults() { externalURL := cfg.ExternalURL setDefaultUsersync(cfg.Adapters, openrtb_ext.Bidder33Across, "https://ic.tynt.com/r/d?m=xch&rt=html&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&ru="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3D33across%26uid%3D33XUSERID33X&id=zzz000000000002zzz") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderAdform, "https://cm.adform.net/cookie?redirect_url="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dadform%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%24UID") - // openrtb_ext.BidderAdgeneration doesn't have a good default. + // WIP + setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderAdgeneration, "https://ag1v11vf2a.execute-api.ap-northeast-1.amazonaws.com/sdk_contact/cookie-sync?redirectUri="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fgdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26bidder%3Dadgeneration%26uid%3D%24UID") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderAdkernel, "https://sync.adkernel.com/user-sync?t=image&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&r="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dadkernel%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%7BUID%7D") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderAdkernelAdn, "https://tag.adkernel.com/syncr?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&r="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3DadkernelAdn%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%7BUID%7D") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderAdpone, "https://usersync.adpone.com/csync?redir="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dadpone%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%7Buid%7D") @@ -767,7 +768,7 @@ func SetupViper(v *viper.Viper, filename string) { // Fixes #475: Some defaults will be set just so they are accessible via environment variables // (basically so viper knows they exist) - v.SetDefault("external_url", "http://localhost:8000") + v.SetDefault("external_url", "http://localhost:9000") v.SetDefault("host", "") v.SetDefault("port", 8000) v.SetDefault("admin_port", 6060) @@ -989,7 +990,7 @@ func SetupViper(v *viper.Viper, filename string) { v.SetDefault("analytics.pubstack.buffers.timeout", "900s") v.SetDefault("amp_timeout_adjustment_ms", 0) v.SetDefault("gdpr.host_vendor_id", 0) - v.SetDefault("gdpr.usersync_if_ambiguous", false) + v.SetDefault("gdpr.usersync_if_ambiguous", true) v.SetDefault("gdpr.timeouts_ms.init_vendorlist_fetches", 0) v.SetDefault("gdpr.timeouts_ms.active_vendorlist_fetch", 0) v.SetDefault("gdpr.non_standard_publishers", []string{""}) diff --git a/usersync/usersyncers/syncer.go b/usersync/usersyncers/syncer.go index 5a7e306f736..19f6495de81 100755 --- a/usersync/usersyncers/syncer.go +++ b/usersync/usersyncers/syncer.go @@ -7,6 +7,7 @@ import ( "github.com/golang/glog" ttx "github.com/prebid/prebid-server/adapters/33across" "github.com/prebid/prebid-server/adapters/adform" + "github.com/prebid/prebid-server/adapters/adgeneration" "github.com/prebid/prebid-server/adapters/adkernel" "github.com/prebid/prebid-server/adapters/adkernelAdn" "github.com/prebid/prebid-server/adapters/adman" @@ -87,6 +88,7 @@ func NewSyncerMap(cfg *config.Configuration) map[openrtb_ext.BidderName]usersync insertIntoMap(cfg, syncers, openrtb_ext.Bidder33Across, ttx.New33AcrossSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderAdform, adform.NewAdformSyncer) + insertIntoMap(cfg, syncers, openrtb_ext.BidderAdgeneration, adgeneration.NewAdgenerationSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderAdkernel, adkernel.NewAdkernelSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderAdkernelAdn, adkernelAdn.NewAdkernelAdnSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderAdman, adman.NewAdmanSyncer)