github.com/prebid/prebid-server@v0.275.0/openrtb_ext/bidders.go (about) 1 package openrtb_ext 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "errors" 7 "fmt" 8 "os" 9 "path/filepath" 10 "strings" 11 12 "github.com/xeipuuv/gojsonschema" 13 ) 14 15 // BidderName refers to a core bidder id or an alias id. 16 type BidderName string 17 18 var aliasBidderToParent map[BidderName]BidderName = map[BidderName]BidderName{} 19 20 var coreBidderNames []BidderName = []BidderName{ 21 Bidder33Across, 22 BidderAax, 23 BidderAceex, 24 BidderAcuityAds, 25 BidderAdf, 26 BidderAdform, 27 BidderAdgeneration, 28 BidderAdhese, 29 BidderAdkernel, 30 BidderAdkernelAdn, 31 BidderAdman, 32 BidderAdmixer, 33 BidderAdnuntius, 34 BidderAdOcean, 35 BidderAdoppler, 36 BidderAdot, 37 BidderAdpone, 38 BidderAdprime, 39 BidderAdquery, 40 BidderAdrino, 41 BidderAdsinteractive, 42 BidderAdsyield, 43 BidderAdtarget, 44 BidderAdtrgtme, 45 BidderAdtelligent, 46 BidderAdvangelists, 47 BidderAdView, 48 BidderAdxcg, 49 BidderAdyoulike, 50 BidderAidem, 51 BidderAJA, 52 BidderAlgorix, 53 BidderAMX, 54 BidderApacdex, 55 BidderApplogy, 56 BidderAppnexus, 57 BidderAppstock, 58 BidderAppush, 59 BidderAudienceNetwork, 60 BidderAutomatad, 61 BidderAvocet, 62 BidderAxis, 63 BidderAxonix, 64 BidderBeachfront, 65 BidderBeintoo, 66 BidderBematterfull, 67 BidderBetween, 68 BidderBeyondMedia, 69 BidderBidmachine, 70 BidderBidmyadz, 71 BidderBidsCube, 72 BidderBidstack, 73 BidderBizzclick, 74 BidderBliink, 75 BidderBlue, 76 BidderBluesea, 77 BidderBmtm, 78 BidderBoldwin, 79 BidderBrave, 80 BidderCadentApertureMX, 81 BidderCcx, 82 BidderCoinzilla, 83 BidderColossus, 84 BidderCompass, 85 BidderConnectAd, 86 BidderConsumable, 87 BidderConversant, 88 BidderCopper6, 89 BidderCpmstar, 90 BidderCriteo, 91 BidderCWire, 92 BidderDatablocks, 93 BidderDecenterAds, 94 BidderDeepintent, 95 BidderDefinemedia, 96 BidderDianomi, 97 BidderDmx, 98 BidderEmtv, 99 BidderEmxDigital, 100 BidderEngageBDR, 101 BidderEPlanning, 102 BidderEpom, 103 BidderEpsilon, 104 BidderEVolution, 105 BidderEvtech, 106 BidderFlipp, 107 BidderFreewheelSSP, 108 BidderFreewheelSSPOld, 109 BidderFRVRAdNetwork, 110 BidderGamma, 111 BidderGamoshi, 112 BidderGlobalsun, 113 BidderGothamads, 114 BidderGreedygame, 115 BidderGrid, 116 BidderGumGum, 117 BidderHuaweiAds, 118 BidderIionads, 119 BidderImds, 120 BidderImpactify, 121 BidderImprovedigital, 122 BidderInfyTV, 123 BidderInMobi, 124 BidderInteractiveoffers, 125 BidderInvibes, 126 BidderIQZone, 127 BidderIx, 128 BidderJANet, 129 BidderJixie, 130 BidderKargo, 131 BidderKayzen, 132 BidderKidoz, 133 BidderKiviads, 134 BidderLmKiviads, 135 BidderKrushmedia, 136 BidderKubient, 137 BidderLiftoff, 138 BidderLimelightDigital, 139 BidderLockerDome, 140 BidderLogan, 141 BidderLogicad, 142 BidderLunaMedia, 143 BidderMabidder, 144 BidderMadvertise, 145 BidderMarsmedia, 146 BidderMediafuse, 147 BidderMedianet, 148 BidderMgid, 149 BidderMgidX, 150 BidderMobfoxpb, 151 BidderMobileFuse, 152 BidderMotorik, 153 BidderNanoInteractive, 154 BidderNextMillennium, 155 BidderNinthDecimal, 156 BidderNoBid, 157 BidderOneTag, 158 BidderOpenWeb, 159 BidderOpenx, 160 BidderOperaads, 161 BidderOrbidder, 162 BidderOutbrain, 163 BidderOwnAdx, 164 BidderPangle, 165 BidderPGAM, 166 BidderPGAMSsp, 167 BidderPubmatic, 168 BidderPubnative, 169 BidderPulsepoint, 170 BidderPWBid, 171 BidderQuantumdex, 172 BidderRevcontent, 173 BidderRhythmone, 174 BidderRichaudience, 175 BidderRise, 176 BidderRTBHouse, 177 BidderRubicon, 178 BidderSeedingAlliance, 179 BidderSaLunaMedia, 180 BidderScreencore, 181 BidderSharethrough, 182 BidderSilverMob, 183 BidderSilverPush, 184 BidderSmaato, 185 BidderSmartAdserver, 186 BidderSmartHub, 187 BidderSmartRTB, 188 BidderSmartyAds, 189 BidderSmileWanted, 190 BidderSonobi, 191 BidderSovrn, 192 BidderSspBC, 193 BidderStreamkey, 194 BidderStroeerCore, 195 BidderSuntContent, 196 BidderSynacormedia, 197 BidderTaboola, 198 BidderTappx, 199 BidderTelaria, 200 BidderTpmn, 201 BidderTrafficGate, 202 BidderTriplelift, 203 BidderTripleliftNative, 204 BidderTrustX, 205 BidderUcfunnel, 206 BidderUndertone, 207 BidderUnicorn, 208 BidderUnruly, 209 BidderValueImpression, 210 BidderVideoByte, 211 BidderVideoHeroes, 212 BidderVidoomy, 213 BidderViewdeos, 214 BidderVisibleMeasures, 215 BidderVisx, 216 BidderVox, 217 BidderVrtcal, 218 BidderXeworks, 219 BidderXtrmqb, 220 BidderYahooAds, 221 BidderYahooAdvertising, 222 BidderYahooSSP, 223 BidderYeahmobi, 224 BidderYieldlab, 225 BidderYieldmo, 226 BidderYieldone, 227 BidderZeroClickFraud, 228 BidderZetaGlobalSsp, 229 } 230 231 func GetAliasBidderToParent() map[BidderName]BidderName { 232 return aliasBidderToParent 233 } 234 235 func SetAliasBidderName(aliasBidderName string, parentBidderName BidderName) error { 236 if IsBidderNameReserved(aliasBidderName) { 237 return fmt.Errorf("alias %s is a reserved bidder name and cannot be used", aliasBidderName) 238 } 239 aliasBidder := BidderName(aliasBidderName) 240 coreBidderNames = append(coreBidderNames, aliasBidder) 241 aliasBidderToParent[aliasBidder] = parentBidderName 242 return nil 243 } 244 245 func (name BidderName) MarshalJSON() ([]byte, error) { 246 return []byte(name), nil 247 } 248 249 func (name *BidderName) String() string { 250 if name == nil { 251 return "" 252 } 253 return string(*name) 254 } 255 256 // Names of reserved bidders. These names may not be used by a core bidder or alias. 257 const ( 258 BidderReservedAll BidderName = "all" // Reserved for the /info/bidders/all endpoint. 259 BidderReservedContext BidderName = "context" // Reserved for first party data. 260 BidderReservedData BidderName = "data" // Reserved for first party data. 261 BidderReservedGeneral BidderName = "general" // Reserved for non-bidder specific messages when using a map keyed on the bidder name. 262 BidderReservedGPID BidderName = "gpid" // Reserved for Global Placement ID (GPID). 263 BidderReservedPrebid BidderName = "prebid" // Reserved for Prebid Server configuration. 264 BidderReservedSKAdN BidderName = "skadn" // Reserved for Apple's SKAdNetwork OpenRTB extension. 265 BidderReservedTID BidderName = "tid" // Reserved for Per-Impression Transactions IDs for Multi-Impression Bid Requests. 266 BidderReservedAE BidderName = "ae" // Reserved for FLEDGE Auction Environment 267 ) 268 269 // IsBidderNameReserved returns true if the specified name is a case insensitive match for a reserved bidder name. 270 func IsBidderNameReserved(name string) bool { 271 if strings.EqualFold(name, string(BidderReservedAll)) { 272 return true 273 } 274 275 if strings.EqualFold(name, string(BidderReservedContext)) { 276 return true 277 } 278 279 if strings.EqualFold(name, string(BidderReservedData)) { 280 return true 281 } 282 283 if strings.EqualFold(name, string(BidderReservedGeneral)) { 284 return true 285 } 286 287 if strings.EqualFold(name, string(BidderReservedGPID)) { 288 return true 289 } 290 291 if strings.EqualFold(name, string(BidderReservedSKAdN)) { 292 return true 293 } 294 295 if strings.EqualFold(name, string(BidderReservedPrebid)) { 296 return true 297 } 298 299 if strings.EqualFold(name, string(BidderReservedTID)) { 300 return true 301 } 302 303 if strings.EqualFold(name, string(BidderReservedAE)) { 304 return true 305 } 306 307 return false 308 } 309 310 // Names of core bidders. These names *must* match the bidder code in Prebid.js if an adapter also exists in that 311 // project. You may *not* use the name 'general' as that is reserved for general error messages nor 'context' as 312 // that is reserved for first party data. 313 // 314 // Please keep this list alphabetized to minimize merge conflicts. 315 const ( 316 Bidder33Across BidderName = "33across" 317 BidderAax BidderName = "aax" 318 BidderAceex BidderName = "aceex" 319 BidderAcuityAds BidderName = "acuityads" 320 BidderAdf BidderName = "adf" 321 BidderAdform BidderName = "adform" 322 BidderAdgeneration BidderName = "adgeneration" 323 BidderAdhese BidderName = "adhese" 324 BidderAdkernel BidderName = "adkernel" 325 BidderAdkernelAdn BidderName = "adkernelAdn" 326 BidderAdman BidderName = "adman" 327 BidderAdmixer BidderName = "admixer" 328 BidderAdnuntius BidderName = "adnuntius" 329 BidderAdOcean BidderName = "adocean" 330 BidderAdoppler BidderName = "adoppler" 331 BidderAdot BidderName = "adot" 332 BidderAdpone BidderName = "adpone" 333 BidderAdprime BidderName = "adprime" 334 BidderAdquery BidderName = "adquery" 335 BidderAdrino BidderName = "adrino" 336 BidderAdsinteractive BidderName = "adsinteractive" 337 BidderAdsyield BidderName = "adsyield" 338 BidderAdtarget BidderName = "adtarget" 339 BidderAdtrgtme BidderName = "adtrgtme" 340 BidderAdtelligent BidderName = "adtelligent" 341 BidderAdvangelists BidderName = "advangelists" 342 BidderAdView BidderName = "adview" 343 BidderAdxcg BidderName = "adxcg" 344 BidderAdyoulike BidderName = "adyoulike" 345 BidderAidem BidderName = "aidem" 346 BidderAJA BidderName = "aja" 347 BidderAlgorix BidderName = "algorix" 348 BidderAMX BidderName = "amx" 349 BidderApacdex BidderName = "apacdex" 350 BidderApplogy BidderName = "applogy" 351 BidderAppnexus BidderName = "appnexus" 352 BidderAppstock BidderName = "appstock" 353 BidderAppush BidderName = "appush" 354 BidderAudienceNetwork BidderName = "audienceNetwork" 355 BidderAutomatad BidderName = "automatad" 356 BidderAvocet BidderName = "avocet" 357 BidderAxis BidderName = "axis" 358 BidderAxonix BidderName = "axonix" 359 BidderBeachfront BidderName = "beachfront" 360 BidderBeintoo BidderName = "beintoo" 361 BidderBematterfull BidderName = "bematterfull" 362 BidderBetween BidderName = "between" 363 BidderBeyondMedia BidderName = "beyondmedia" 364 BidderBidmachine BidderName = "bidmachine" 365 BidderBidmyadz BidderName = "bidmyadz" 366 BidderBidsCube BidderName = "bidscube" 367 BidderBidstack BidderName = "bidstack" 368 BidderBizzclick BidderName = "bizzclick" 369 BidderBliink BidderName = "bliink" 370 BidderBlue BidderName = "blue" 371 BidderBluesea BidderName = "bluesea" 372 BidderBmtm BidderName = "bmtm" 373 BidderBoldwin BidderName = "boldwin" 374 BidderBrave BidderName = "brave" 375 BidderCadentApertureMX BidderName = "cadent_aperture_mx" 376 BidderCcx BidderName = "ccx" 377 BidderCoinzilla BidderName = "coinzilla" 378 BidderColossus BidderName = "colossus" 379 BidderCompass BidderName = "compass" 380 BidderConnectAd BidderName = "connectad" 381 BidderConsumable BidderName = "consumable" 382 BidderConversant BidderName = "conversant" 383 BidderCopper6 BidderName = "copper6" 384 BidderCpmstar BidderName = "cpmstar" 385 BidderCriteo BidderName = "criteo" 386 BidderCWire BidderName = "cwire" 387 BidderDatablocks BidderName = "datablocks" 388 BidderDecenterAds BidderName = "decenterads" 389 BidderDeepintent BidderName = "deepintent" 390 BidderDefinemedia BidderName = "definemedia" 391 BidderDianomi BidderName = "dianomi" 392 BidderDmx BidderName = "dmx" 393 BidderEmtv BidderName = "emtv" 394 BidderEmxDigital BidderName = "emx_digital" 395 BidderEngageBDR BidderName = "engagebdr" 396 BidderEPlanning BidderName = "eplanning" 397 BidderEpsilon BidderName = "epsilon" 398 BidderEpom BidderName = "epom" 399 BidderEVolution BidderName = "e_volution" 400 BidderEvtech BidderName = "evtech" 401 BidderFlipp BidderName = "flipp" 402 BidderFreewheelSSP BidderName = "freewheelssp" 403 BidderFreewheelSSPOld BidderName = "freewheel-ssp" 404 BidderFRVRAdNetwork BidderName = "frvradn" 405 BidderGamma BidderName = "gamma" 406 BidderGamoshi BidderName = "gamoshi" 407 BidderGlobalsun BidderName = "globalsun" 408 BidderGothamads BidderName = "gothamads" 409 BidderGreedygame BidderName = "greedygame" 410 BidderGrid BidderName = "grid" 411 BidderGumGum BidderName = "gumgum" 412 BidderHuaweiAds BidderName = "huaweiads" 413 BidderIionads BidderName = "iionads" 414 BidderImds BidderName = "imds" 415 BidderImpactify BidderName = "impactify" 416 BidderImprovedigital BidderName = "improvedigital" 417 BidderInfyTV BidderName = "infytv" 418 BidderInMobi BidderName = "inmobi" 419 BidderInteractiveoffers BidderName = "interactiveoffers" 420 BidderInvibes BidderName = "invibes" 421 BidderIQZone BidderName = "iqzone" 422 BidderIx BidderName = "ix" 423 BidderJANet BidderName = "janet" 424 BidderJixie BidderName = "jixie" 425 BidderKargo BidderName = "kargo" 426 BidderKayzen BidderName = "kayzen" 427 BidderKidoz BidderName = "kidoz" 428 BidderKiviads BidderName = "kiviads" 429 BidderLmKiviads BidderName = "lm_kiviads" 430 BidderKrushmedia BidderName = "krushmedia" 431 BidderKubient BidderName = "kubient" 432 BidderLiftoff BidderName = "liftoff" 433 BidderLimelightDigital BidderName = "limelightDigital" 434 BidderLockerDome BidderName = "lockerdome" 435 BidderLogan BidderName = "logan" 436 BidderLogicad BidderName = "logicad" 437 BidderLunaMedia BidderName = "lunamedia" 438 BidderMabidder BidderName = "mabidder" 439 BidderMadvertise BidderName = "madvertise" 440 BidderMarsmedia BidderName = "marsmedia" 441 BidderMediafuse BidderName = "mediafuse" 442 BidderMedianet BidderName = "medianet" 443 BidderMgid BidderName = "mgid" 444 BidderMgidX BidderName = "mgidX" 445 BidderMobfoxpb BidderName = "mobfoxpb" 446 BidderMobileFuse BidderName = "mobilefuse" 447 BidderMotorik BidderName = "motorik" 448 BidderNanoInteractive BidderName = "nanointeractive" 449 BidderNextMillennium BidderName = "nextmillennium" 450 BidderNinthDecimal BidderName = "ninthdecimal" 451 BidderNoBid BidderName = "nobid" 452 BidderOneTag BidderName = "onetag" 453 BidderOpenWeb BidderName = "openweb" 454 BidderOpenx BidderName = "openx" 455 BidderOperaads BidderName = "operaads" 456 BidderOrbidder BidderName = "orbidder" 457 BidderOutbrain BidderName = "outbrain" 458 BidderOwnAdx BidderName = "ownadx" 459 BidderPangle BidderName = "pangle" 460 BidderPGAM BidderName = "pgam" 461 BidderPGAMSsp BidderName = "pgamssp" 462 BidderPubmatic BidderName = "pubmatic" 463 BidderPubnative BidderName = "pubnative" 464 BidderPulsepoint BidderName = "pulsepoint" 465 BidderPWBid BidderName = "pwbid" 466 BidderQuantumdex BidderName = "quantumdex" 467 BidderRevcontent BidderName = "revcontent" 468 BidderRhythmone BidderName = "rhythmone" 469 BidderRichaudience BidderName = "richaudience" 470 BidderRise BidderName = "rise" 471 BidderRTBHouse BidderName = "rtbhouse" 472 BidderRubicon BidderName = "rubicon" 473 BidderSeedingAlliance BidderName = "seedingAlliance" 474 BidderSaLunaMedia BidderName = "sa_lunamedia" 475 BidderScreencore BidderName = "screencore" 476 BidderSharethrough BidderName = "sharethrough" 477 BidderSilverMob BidderName = "silvermob" 478 BidderSilverPush BidderName = "silverpush" 479 BidderSmaato BidderName = "smaato" 480 BidderSmartAdserver BidderName = "smartadserver" 481 BidderSmartHub BidderName = "smarthub" 482 BidderSmartRTB BidderName = "smartrtb" 483 BidderSmartyAds BidderName = "smartyads" 484 BidderSmileWanted BidderName = "smilewanted" 485 BidderSonobi BidderName = "sonobi" 486 BidderSovrn BidderName = "sovrn" 487 BidderSspBC BidderName = "sspBC" 488 BidderStreamkey BidderName = "streamkey" 489 BidderStroeerCore BidderName = "stroeerCore" 490 BidderSuntContent BidderName = "suntContent" 491 BidderSynacormedia BidderName = "synacormedia" 492 BidderTaboola BidderName = "taboola" 493 BidderTappx BidderName = "tappx" 494 BidderTelaria BidderName = "telaria" 495 BidderTpmn BidderName = "tpmn" 496 BidderTrafficGate BidderName = "trafficgate" 497 BidderTriplelift BidderName = "triplelift" 498 BidderTripleliftNative BidderName = "triplelift_native" 499 BidderTrustX BidderName = "trustx" 500 BidderUcfunnel BidderName = "ucfunnel" 501 BidderUndertone BidderName = "undertone" 502 BidderUnicorn BidderName = "unicorn" 503 BidderUnruly BidderName = "unruly" 504 BidderValueImpression BidderName = "valueimpression" 505 BidderVideoByte BidderName = "videobyte" 506 BidderVideoHeroes BidderName = "videoheroes" 507 BidderVidoomy BidderName = "vidoomy" 508 BidderViewdeos BidderName = "viewdeos" 509 BidderVisibleMeasures BidderName = "visiblemeasures" 510 BidderVisx BidderName = "visx" 511 BidderVox BidderName = "vox" 512 BidderVrtcal BidderName = "vrtcal" 513 BidderXeworks BidderName = "xeworks" 514 BidderXtrmqb BidderName = "xtrmqb" 515 BidderYahooAds BidderName = "yahooAds" 516 BidderYahooAdvertising BidderName = "yahooAdvertising" 517 BidderYahooSSP BidderName = "yahoossp" 518 BidderYeahmobi BidderName = "yeahmobi" 519 BidderYieldlab BidderName = "yieldlab" 520 BidderYieldmo BidderName = "yieldmo" 521 BidderYieldone BidderName = "yieldone" 522 BidderZeroClickFraud BidderName = "zeroclickfraud" 523 BidderZetaGlobalSsp BidderName = "zeta_global_ssp" 524 ) 525 526 // CoreBidderNames returns a slice of all core bidders. 527 func CoreBidderNames() []BidderName { 528 return coreBidderNames 529 } 530 531 // BuildBidderMap builds a map of string to BidderName, to remain compatbile with the 532 // prebioud BidderMap variable. 533 func BuildBidderMap() map[string]BidderName { 534 lookup := make(map[string]BidderName) 535 for _, name := range CoreBidderNames() { 536 lookup[string(name)] = name 537 } 538 return lookup 539 } 540 541 // BuildBidderStringSlice builds a slioce of strings for each BidderName. 542 func BuildBidderStringSlice() []string { 543 coreBidders := CoreBidderNames() 544 slice := make([]string, len(coreBidders)) 545 for i, name := range CoreBidderNames() { 546 slice[i] = string(name) 547 } 548 return slice 549 } 550 551 func BuildBidderNameHashSet() map[string]struct{} { 552 hashSet := make(map[string]struct{}) 553 for _, name := range CoreBidderNames() { 554 hashSet[string(name)] = struct{}{} 555 } 556 return hashSet 557 } 558 559 // bidderNameLookup is a map of the lower case version of the bidder name to the precise BidderName value. 560 var bidderNameLookup = func() map[string]BidderName { 561 lookup := make(map[string]BidderName) 562 for _, name := range CoreBidderNames() { 563 bidderNameLower := strings.ToLower(string(name)) 564 lookup[bidderNameLower] = name 565 } 566 return lookup 567 } 568 569 func NormalizeBidderName(name string) (BidderName, bool) { 570 nameLower := strings.ToLower(name) 571 bidderName, exists := bidderNameLookup()[nameLower] 572 return bidderName, exists 573 } 574 575 // The BidderParamValidator is used to enforce bidrequest.imp[i].ext.prebid.bidder.{anyBidder} values. 576 // 577 // This is treated differently from the other types because we rely on JSON-schemas to validate bidder params. 578 type BidderParamValidator interface { 579 Validate(name BidderName, ext json.RawMessage) error 580 // Schema returns the JSON schema used to perform validation. 581 Schema(name BidderName) string 582 } 583 584 type bidderParamsFileSystem interface { 585 readDir(name string) ([]os.DirEntry, error) 586 readFile(name string) ([]byte, error) 587 newReferenceLoader(source string) gojsonschema.JSONLoader 588 newSchema(l gojsonschema.JSONLoader) (*gojsonschema.Schema, error) 589 abs(path string) (string, error) 590 } 591 592 type standardBidderParamsFileSystem struct{} 593 594 func (standardBidderParamsFileSystem) readDir(name string) ([]os.DirEntry, error) { 595 return os.ReadDir(name) 596 } 597 598 func (standardBidderParamsFileSystem) readFile(name string) ([]byte, error) { 599 return os.ReadFile(name) 600 } 601 602 func (standardBidderParamsFileSystem) newReferenceLoader(source string) gojsonschema.JSONLoader { 603 return gojsonschema.NewReferenceLoader(source) 604 } 605 606 func (standardBidderParamsFileSystem) newSchema(l gojsonschema.JSONLoader) (*gojsonschema.Schema, error) { 607 return gojsonschema.NewSchema(l) 608 } 609 610 func (standardBidderParamsFileSystem) abs(path string) (string, error) { 611 return filepath.Abs(path) 612 } 613 614 var paramsValidator bidderParamsFileSystem = standardBidderParamsFileSystem{} 615 616 // NewBidderParamsValidator makes a BidderParamValidator, assuming all the necessary files exist in the filesystem. 617 // This will error if, for example, a Bidder gets added but no JSON schema is written for them. 618 func NewBidderParamsValidator(schemaDirectory string) (BidderParamValidator, error) { 619 fileInfos, err := paramsValidator.readDir(schemaDirectory) 620 if err != nil { 621 return nil, fmt.Errorf("Failed to read JSON schemas from directory %s. %v", schemaDirectory, err) 622 } 623 624 bidderMap := BuildBidderMap() 625 626 schemaContents := make(map[BidderName]string, 50) 627 schemas := make(map[BidderName]*gojsonschema.Schema, 50) 628 for _, fileInfo := range fileInfos { 629 bidderName := strings.TrimSuffix(fileInfo.Name(), ".json") 630 if _, ok := bidderMap[bidderName]; !ok { 631 return nil, fmt.Errorf("File %s/%s does not match a valid BidderName.", schemaDirectory, fileInfo.Name()) 632 } 633 toOpen, err := paramsValidator.abs(filepath.Join(schemaDirectory, fileInfo.Name())) 634 if err != nil { 635 return nil, fmt.Errorf("Failed to get an absolute representation of the path: %s, %v", toOpen, err) 636 } 637 schemaLoader := paramsValidator.newReferenceLoader("file:///" + filepath.ToSlash(toOpen)) 638 loadedSchema, err := paramsValidator.newSchema(schemaLoader) 639 if err != nil { 640 return nil, fmt.Errorf("Failed to load json schema at %s: %v", toOpen, err) 641 } 642 643 fileBytes, err := paramsValidator.readFile(fmt.Sprintf("%s/%s", schemaDirectory, fileInfo.Name())) 644 if err != nil { 645 return nil, fmt.Errorf("Failed to read file %s/%s: %v", schemaDirectory, fileInfo.Name(), err) 646 } 647 648 schemas[BidderName(bidderName)] = loadedSchema 649 schemaContents[BidderName(bidderName)] = string(fileBytes) 650 } 651 652 //set alias bidder params schema to its parent 653 for alias, parent := range aliasBidderToParent { 654 parentSchema := schemas[parent] 655 schemas[alias] = parentSchema 656 657 parentSchemaContents := schemaContents[parent] 658 schemaContents[alias] = parentSchemaContents 659 } 660 661 return &bidderParamValidator{ 662 schemaContents: schemaContents, 663 parsedSchemas: schemas, 664 }, nil 665 } 666 667 type bidderParamValidator struct { 668 schemaContents map[BidderName]string 669 parsedSchemas map[BidderName]*gojsonschema.Schema 670 } 671 672 func (validator *bidderParamValidator) Validate(name BidderName, ext json.RawMessage) error { 673 result, err := validator.parsedSchemas[name].Validate(gojsonschema.NewBytesLoader(ext)) 674 if err != nil { 675 return err 676 } 677 if !result.Valid() { 678 errBuilder := bytes.NewBuffer(make([]byte, 0, 300)) 679 for _, err := range result.Errors() { 680 errBuilder.WriteString(err.String()) 681 } 682 return errors.New(errBuilder.String()) 683 } 684 return nil 685 } 686 687 func (validator *bidderParamValidator) Schema(name BidderName) string { 688 return validator.schemaContents[name] 689 }