@@ -607,6 +607,45 @@ func (c *Inspector) GetFailedQueries() map[string]error {
607607 return maps .Clone (c .failedQueries )
608608}
609609
610+ func ruleArgumentsValue (rc config.IacRuleConfig ) (ast.Value , bool , error ) {
611+ if rc .Arguments == nil {
612+ return nil , false , nil
613+ }
614+
615+ value , err := ast .InterfaceToValue (rc .Arguments )
616+ if err != nil {
617+ return nil , false , err
618+ }
619+ return value , true , nil
620+ }
621+
622+ func withRuleArguments (payload , args ast.Value ) (ast.Value , error ) {
623+ obj , ok := payload .(ast.Object )
624+ if ! ok {
625+ return nil , fmt .Errorf ("expected OPA input payload object, got %T" , payload )
626+ }
627+
628+ out := ast .NewObject ()
629+ _ = obj .Iter (func (k , v * ast.Term ) error {
630+ out .Insert (k , v )
631+ return nil
632+ })
633+ out .Insert (ast .StringTerm ("arguments" ), ast .NewTerm (args ))
634+ return out , nil
635+ }
636+
637+ func queryIDsFromMetadata (ctx context.Context , metadata * model.QueryMetadata ) (queryID , legacyQueryID string ) {
638+ queryID = DefaultQueryID
639+ legacyQueryID = DefaultQueryID
640+ if id , err := mapKeyToString (ctx , metadata .Metadata , "id" , false ); err == nil && id != nil {
641+ queryID = * id
642+ }
643+ if legacyID , err := mapKeyToString (ctx , metadata .Metadata , "legacyId" , true ); err == nil && legacyID != nil {
644+ legacyQueryID = * legacyID
645+ }
646+ return queryID , legacyQueryID
647+ }
648+
610649func (c * Inspector ) doRun (ctx context.Context , qCtx * QueryContext ) (vulns []model.Vulnerability , err error ) {
611650 contextLogger := logger .FromContext (ctx )
612651 defer func () {
@@ -617,7 +656,19 @@ func (c *Inspector) doRun(ctx context.Context, qCtx *QueryContext) (vulns []mode
617656 }
618657 }()
619658
620- options := []rego.EvalOption {rego .EvalParsedInput (* qCtx .payload )}
659+ payload := * qCtx .payload
660+ queryID , legacyQueryID := queryIDsFromMetadata (ctx , & qCtx .Query .Metadata )
661+ if rc , found := lookupRuleConfig (c .ruleConfigs , queryID , legacyQueryID ); found {
662+ if args , ok , err := ruleArgumentsValue (rc ); err != nil {
663+ return nil , errors .Wrap (err , "Failed to prepare rule arguments for query " + queryID )
664+ } else if ok {
665+ payload , err = withRuleArguments (payload , args )
666+ if err != nil {
667+ return nil , err
668+ }
669+ }
670+ }
671+ options := []rego.EvalOption {rego .EvalParsedInput (payload )}
621672
622673 var cov * cover.Cover
623674 if c .enableCoverageReport {
0 commit comments