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  }