From 7781f2f1dc1cc93179e99202d49479dbeebb29f9 Mon Sep 17 00:00:00 2001 From: Ad Generation Date: Wed, 23 Sep 2020 00:32:49 +0900 Subject: [PATCH 1/3] WIP: feat: add ADGeneration Cookie sync --- adapters/adgeneration/usersync.go | 12 ++++++++++++ adapters/adgeneration/usersync_test.go | 25 +++++++++++++++++++++++++ config/config.go | 3 ++- usersync/usersyncers/syncer.go | 2 ++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 adapters/adgeneration/usersync.go create mode 100644 adapters/adgeneration/usersync_test.go 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/config/config.go b/config/config.go index dd660992d89..e831d7a4108 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://d.socdm.com/cookie?redirect_url="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fgdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%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") 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) From 9e29b79345c99b326b75d650e96a975235d8fdb8 Mon Sep 17 00:00:00 2001 From: Ad Generation Date: Wed, 7 Oct 2020 17:59:29 +0900 Subject: [PATCH 2/3] add: add buyerUID params. --- adapters/adgeneration/adgeneration.go | 3 +++ adapters/adgeneration/adgeneration_test.go | 5 +++-- .../adgenerationtest/exemplary/single-banner.json | 8 +++++++- .../adgenerationtest/supplemental/204-bid-response.json | 8 +++++++- .../adgenerationtest/supplemental/400-bid-response.json | 8 +++++++- .../adgenerationtest/supplemental/invalid-adg-param.json | 3 +++ .../adgenerationtest/supplemental/no-bid-response.json | 8 +++++++- 7 files changed, 37 insertions(+), 6 deletions(-) diff --git a/adapters/adgeneration/adgeneration.go b/adapters/adgeneration/adgeneration.go index 054fa7f6df3..b6bc36f4773 100644 --- a/adapters/adgeneration/adgeneration.go +++ b/adapters/adgeneration/adgeneration.go @@ -111,6 +111,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" From b856a054de8d4435788f721182a84049168b9404 Mon Sep 17 00:00:00 2001 From: Ad Generation Date: Wed, 7 Oct 2020 10:33:14 +0900 Subject: [PATCH 3/3] =?UTF-8?q?test:=20ADG=20mock=20cookie-sync=20endpoint?= =?UTF-8?q?=E3=81=AB=E7=BD=AE=E3=81=8D=E6=8F=9B=E3=81=88=E3=82=8B=20HB=5FT?= =?UTF-8?q?EST=E3=81=AEDocker-Compose=E3=81=AB=E5=90=88=E3=82=8F=E3=81=9B?= =?UTF-8?q?=E3=81=A6HTTPS=E6=8E=A5=E7=B6=9A=E3=81=AE=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=81=ABport=E3=82=929000=E3=81=AB=E5=A4=89=E6=9B=B4=20uid?= =?UTF-8?q?=E3=81=8C=E4=BB=98=E4=B8=8E=E3=81=95=E3=82=8C=E3=82=8B=20reques?= =?UTF-8?q?t.User.BuyerUID=E3=81=AE=E3=83=AD=E3=82=B0=E3=82=92=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adapters/adgeneration/adgeneration.go | 3 +++ adapters/appnexus/appnexus.go | 3 +++ config/config.go | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/adapters/adgeneration/adgeneration.go b/adapters/adgeneration/adgeneration.go index b6bc36f4773..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 { 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 e831d7a4108..f845a60465a 100755 --- a/config/config.go +++ b/config/config.go @@ -678,7 +678,7 @@ func (cfg *Configuration) setDerivedDefaults() { 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") // WIP - setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderAdgeneration, "https://d.socdm.com/cookie?redirect_url="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fgdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%24UID") + 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") @@ -768,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) @@ -990,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{""})