github.com/projectdiscovery/nuclei/v2@v2.9.15/pkg/protocols/file/request_test.go (about)

     1  package file
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/projectdiscovery/nuclei/v2/pkg/model"
    11  	"github.com/projectdiscovery/nuclei/v2/pkg/model/types/severity"
    12  	"github.com/projectdiscovery/nuclei/v2/pkg/operators"
    13  	"github.com/projectdiscovery/nuclei/v2/pkg/operators/extractors"
    14  	"github.com/projectdiscovery/nuclei/v2/pkg/operators/matchers"
    15  	"github.com/projectdiscovery/nuclei/v2/pkg/output"
    16  	"github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/contextargs"
    17  	"github.com/projectdiscovery/nuclei/v2/pkg/testutils"
    18  	permissionutil "github.com/projectdiscovery/utils/permission"
    19  )
    20  
    21  func TestFileExecuteWithResults(t *testing.T) {
    22  	options := testutils.DefaultOptions
    23  
    24  	testutils.Init(options)
    25  	templateID := "testing-file"
    26  	executerOpts := testutils.NewMockExecuterOptions(options, &testutils.TemplateInfo{
    27  		ID:   templateID,
    28  		Info: model.Info{SeverityHolder: severity.Holder{Severity: severity.Low}, Name: "test"},
    29  	})
    30  	request := &Request{
    31  		ID:          templateID,
    32  		MaxSize:     "1Gb",
    33  		NoRecursive: false,
    34  		Extensions:  []string{"all"},
    35  		DenyList:    []string{".go"},
    36  		Operators: operators.Operators{
    37  			Matchers: []*matchers.Matcher{{
    38  				Name:  "test",
    39  				Part:  "raw",
    40  				Type:  matchers.MatcherTypeHolder{MatcherType: matchers.WordsMatcher},
    41  				Words: []string{"1.1.1.1"},
    42  			}},
    43  			Extractors: []*extractors.Extractor{{
    44  				Part:  "raw",
    45  				Type:  extractors.ExtractorTypeHolder{ExtractorType: extractors.RegexExtractor},
    46  				Regex: []string{"[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+"},
    47  			}},
    48  		},
    49  		options: executerOpts,
    50  	}
    51  	err := request.Compile(executerOpts)
    52  	require.Nil(t, err, "could not compile file request")
    53  
    54  	tempDir, err := os.MkdirTemp("", "test-*")
    55  	require.Nil(t, err, "could not create temporary directory")
    56  	defer os.RemoveAll(tempDir)
    57  
    58  	files := map[string]string{
    59  		"config.yaml": "TEST\r\n1.1.1.1\r\n",
    60  	}
    61  	for k, v := range files {
    62  		err = os.WriteFile(filepath.Join(tempDir, k), []byte(v), permissionutil.TempFilePermission)
    63  		require.Nil(t, err, "could not write temporary file")
    64  	}
    65  
    66  	var finalEvent *output.InternalWrappedEvent
    67  	t.Run("valid", func(t *testing.T) {
    68  		metadata := make(output.InternalEvent)
    69  		previous := make(output.InternalEvent)
    70  		ctxArgs := contextargs.NewWithInput(tempDir)
    71  		err := request.ExecuteWithResults(ctxArgs, metadata, previous, func(event *output.InternalWrappedEvent) {
    72  			finalEvent = event
    73  		})
    74  		require.Nil(t, err, "could not execute file request")
    75  	})
    76  	require.NotNil(t, finalEvent, "could not get event output from request")
    77  	require.Equal(t, 1, len(finalEvent.Results), "could not get correct number of results")
    78  	require.Equal(t, "test", finalEvent.Results[0].MatcherName, "could not get correct matcher name of results")
    79  	require.Equal(t, 1, len(finalEvent.Results[0].ExtractedResults), "could not get correct number of extracted results")
    80  	require.Equal(t, "1.1.1.1", finalEvent.Results[0].ExtractedResults[0], "could not get correct extracted results")
    81  	finalEvent = nil
    82  }