@@ -35,6 +35,7 @@ import (
35
35
"github.com/projectdiscovery/utils/errkit"
36
36
errorutil "github.com/projectdiscovery/utils/errors"
37
37
iputil "github.com/projectdiscovery/utils/ip"
38
+ mapsutil "github.com/projectdiscovery/utils/maps"
38
39
syncutil "github.com/projectdiscovery/utils/sync"
39
40
urlutil "github.com/projectdiscovery/utils/url"
40
41
)
@@ -346,17 +347,33 @@ func (request *Request) ExecuteWithResults(target *contextargs.Context, dynamicV
346
347
TimeoutVariants : requestOptions .Options .GetTimeouts (),
347
348
Source : & request .PreCondition , Context : target .Context (),
348
349
})
349
- if err != nil {
350
- return errorutil .NewWithTag (request .TemplateID , "could not execute pre-condition: %s" , err )
351
- }
352
- if ! result .GetSuccess () || types .ToString (result ["error" ]) != "" {
353
- gologger .Warning ().Msgf ("[%s] Precondition for request %s was not satisfied\n " , request .TemplateID , request .PreCondition )
354
- request .options .Progress .IncrementFailedRequestsBy (1 )
355
- return nil
356
- }
357
- if request .options .Options .Debug || request .options .Options .DebugRequests {
358
- request .options .Progress .IncrementRequests ()
359
- gologger .Debug ().Msgf ("[%s] Precondition for request was satisfied\n " , request .TemplateID )
350
+ // if precondition was successful
351
+ if err == nil && result .GetSuccess () {
352
+ if request .options .Options .Debug || request .options .Options .DebugRequests {
353
+ request .options .Progress .IncrementRequests ()
354
+ gologger .Debug ().Msgf ("[%s] Precondition for request was satisfied\n " , request .TemplateID )
355
+ }
356
+ } else {
357
+ var outError error
358
+ // if js code failed to execute
359
+ if err != nil {
360
+ outError = errkit .Append (errkit .New ("pre-condition not satisfied skipping template execution" ), err )
361
+ } else {
362
+ // execution successful but pre-condition returned false
363
+ outError = errkit .New ("pre-condition not satisfied skipping template execution" )
364
+ }
365
+ results := map [string ]interface {}(result )
366
+ results ["error" ] = outError .Error ()
367
+ // generate and return failed event
368
+ data := request .generateEventData (input , results , hostPort )
369
+ data = generators .MergeMaps (data , payloadValues )
370
+ event := eventcreator .CreateEventWithAdditionalOptions (request , data , request .options .Options .Debug || request .options .Options .DebugResponse , func (wrappedEvent * output.InternalWrappedEvent ) {
371
+ allVars := argsCopy .Map ()
372
+ allVars = generators .MergeMaps (allVars , data )
373
+ wrappedEvent .OperatorsResult .PayloadValues = allVars
374
+ })
375
+ callback (event )
376
+ return err
360
377
}
361
378
}
362
379
@@ -531,24 +548,72 @@ func (request *Request) executeRequestWithPayloads(hostPort string, input *conte
531
548
}
532
549
}
533
550
551
+ values := mapsutil .Merge (payloadValues , results )
552
+ // generate event data
553
+ data := request .generateEventData (input , values , hostPort )
554
+
555
+ // add and get values from templatectx
556
+ request .options .AddTemplateVars (input .MetaInput , request .Type (), request .GetID (), data )
557
+ data = generators .MergeMaps (data , request .options .GetTemplateCtx (input .MetaInput ).GetAll ())
558
+
559
+ if requestOptions .Options .Debug || requestOptions .Options .DebugRequests || requestOptions .Options .StoreResponse {
560
+ msg := fmt .Sprintf ("[%s] Dumped Javascript response for %s:\n %v" , requestOptions .TemplateID , input .MetaInput .Input , vardump .DumpVariables (results ))
561
+ if requestOptions .Options .Debug || requestOptions .Options .DebugRequests {
562
+ gologger .Debug ().Str ("address" , input .MetaInput .Input ).Msg (msg )
563
+ }
564
+ if requestOptions .Options .StoreResponse {
565
+ request .options .Output .WriteStoreDebugData (input .MetaInput .Input , request .options .TemplateID , request .Type ().String (), msg )
566
+ }
567
+ }
568
+
569
+ if _ , ok := data ["error" ]; ok {
570
+ event := eventcreator .CreateEventWithAdditionalOptions (request , generators .MergeMaps (data , payloadValues ), request .options .Options .Debug || request .options .Options .DebugResponse , func (wrappedEvent * output.InternalWrappedEvent ) {
571
+ wrappedEvent .OperatorsResult .PayloadValues = payload
572
+ })
573
+ callback (event )
574
+ return err
575
+ }
576
+
577
+ if request .options .Interactsh != nil {
578
+ request .options .Interactsh .MakePlaceholders (interactshURLs , data )
579
+ }
580
+
581
+ var event * output.InternalWrappedEvent
582
+ if len (interactshURLs ) == 0 {
583
+ event = eventcreator .CreateEventWithAdditionalOptions (request , generators .MergeMaps (data , payloadValues ), request .options .Options .Debug || request .options .Options .DebugResponse , func (wrappedEvent * output.InternalWrappedEvent ) {
584
+ wrappedEvent .OperatorsResult .PayloadValues = payload
585
+ })
586
+ callback (event )
587
+ } else if request .options .Interactsh != nil {
588
+ event = & output.InternalWrappedEvent {InternalEvent : data , UsesInteractsh : true }
589
+ request .options .Interactsh .RequestEvent (interactshURLs , & interactsh.RequestData {
590
+ MakeResultFunc : request .MakeResultEvent ,
591
+ Event : event ,
592
+ Operators : request .CompiledOperators ,
593
+ MatchFunc : request .Match ,
594
+ ExtractFunc : request .Extract ,
595
+ })
596
+ }
597
+ return nil
598
+ }
599
+
600
+ // generateEventData generates event data for the request
601
+ func (request * Request ) generateEventData (input * contextargs.Context , values map [string ]interface {}, matched string ) map [string ]interface {} {
534
602
data := make (map [string ]interface {})
535
- for k , v := range payloadValues {
603
+ for k , v := range values {
536
604
data [k ] = v
537
605
}
538
606
data ["type" ] = request .Type ().String ()
539
- for k , v := range results {
540
- data [k ] = v
541
- }
607
+ data ["request-pre-condition" ] = beautifyJavascript (request .PreCondition )
542
608
data ["request" ] = beautifyJavascript (request .Code )
543
609
data ["host" ] = input .MetaInput .Input
544
- data ["matched" ] = hostPort
545
- data ["template-path" ] = requestOptions .TemplatePath
546
- data ["template-id" ] = requestOptions .TemplateID
547
- data ["template-info" ] = requestOptions .TemplateInfo
610
+ data ["matched" ] = matched
611
+ data ["template-path" ] = request . options .TemplatePath
612
+ data ["template-id" ] = request . options .TemplateID
613
+ data ["template-info" ] = request . options .TemplateInfo
548
614
if request .StopAtFirstMatch || request .options .StopAtFirstMatch {
549
615
data ["stop-at-first-match" ] = true
550
616
}
551
-
552
617
// add ip address to data
553
618
if input .MetaInput .CustomIP != "" {
554
619
data ["ip" ] = input .MetaInput .CustomIP
@@ -588,50 +653,7 @@ func (request *Request) executeRequestWithPayloads(hostPort string, input *conte
588
653
}
589
654
}
590
655
}
591
-
592
- // add and get values from templatectx
593
- request .options .AddTemplateVars (input .MetaInput , request .Type (), request .GetID (), data )
594
- data = generators .MergeMaps (data , request .options .GetTemplateCtx (input .MetaInput ).GetAll ())
595
-
596
- if requestOptions .Options .Debug || requestOptions .Options .DebugRequests || requestOptions .Options .StoreResponse {
597
- msg := fmt .Sprintf ("[%s] Dumped Javascript response for %s:\n %v" , requestOptions .TemplateID , input .MetaInput .Input , vardump .DumpVariables (results ))
598
- if requestOptions .Options .Debug || requestOptions .Options .DebugRequests {
599
- gologger .Debug ().Str ("address" , input .MetaInput .Input ).Msg (msg )
600
- }
601
- if requestOptions .Options .StoreResponse {
602
- request .options .Output .WriteStoreDebugData (input .MetaInput .Input , request .options .TemplateID , request .Type ().String (), msg )
603
- }
604
- }
605
-
606
- if _ , ok := data ["error" ]; ok {
607
- event := eventcreator .CreateEventWithAdditionalOptions (request , generators .MergeMaps (data , payloadValues ), request .options .Options .Debug || request .options .Options .DebugResponse , func (wrappedEvent * output.InternalWrappedEvent ) {
608
- wrappedEvent .OperatorsResult .PayloadValues = payload
609
- })
610
- callback (event )
611
- return err
612
- }
613
-
614
- if request .options .Interactsh != nil {
615
- request .options .Interactsh .MakePlaceholders (interactshURLs , data )
616
- }
617
-
618
- var event * output.InternalWrappedEvent
619
- if len (interactshURLs ) == 0 {
620
- event = eventcreator .CreateEventWithAdditionalOptions (request , generators .MergeMaps (data , payloadValues ), request .options .Options .Debug || request .options .Options .DebugResponse , func (wrappedEvent * output.InternalWrappedEvent ) {
621
- wrappedEvent .OperatorsResult .PayloadValues = payload
622
- })
623
- callback (event )
624
- } else if request .options .Interactsh != nil {
625
- event = & output.InternalWrappedEvent {InternalEvent : data , UsesInteractsh : true }
626
- request .options .Interactsh .RequestEvent (interactshURLs , & interactsh.RequestData {
627
- MakeResultFunc : request .MakeResultEvent ,
628
- Event : event ,
629
- Operators : request .CompiledOperators ,
630
- MatchFunc : request .Match ,
631
- ExtractFunc : request .Extract ,
632
- })
633
- }
634
- return nil
656
+ return data
635
657
}
636
658
637
659
func (request * Request ) getArgsCopy (input * contextargs.Context , payloadValues map [string ]interface {}, requestOptions * protocols.ExecutorOptions , ignoreErrors bool ) (* compiler.ExecuteArgs , error ) {
0 commit comments