package fs12import (3"context"4"os"56"github.com/projectdiscovery/nuclei/v3/pkg/protocols/common/protocolstate"7)89// ListDir lists itemType values within a directory10// depending on the itemType provided11// itemType can be any one of ['file','dir',”]12// @example13// ```javascript14// const fs = require('nuclei/fs');15// // this will only return files in /tmp directory16// const files = fs.ListDir('/tmp', 'file');17// ```18// @example19// ```javascript20// const fs = require('nuclei/fs');21// // this will only return directories in /tmp directory22// const dirs = fs.ListDir('/tmp', 'dir');23// ```24// @example25// ```javascript26// const fs = require('nuclei/fs');27// // when no itemType is provided, it will return both files and directories28// const items = fs.ListDir('/tmp');29// ```30func ListDir(ctx context.Context, path string, itemType string) ([]string, error) {31executionId := ctx.Value("executionId").(string)32finalPath, err := protocolstate.NormalizePathWithExecutionId(executionId, path)33if err != nil {34return nil, err35}36values, err := os.ReadDir(finalPath)37if err != nil {38return nil, err39}40var results []string41for _, value := range values {42if itemType == "file" && value.IsDir() {43continue44}45if itemType == "dir" && !value.IsDir() {46continue47}48results = append(results, value.Name())49}50return results, nil51}5253// ReadFile reads file contents within permitted paths54// and returns content as byte array55// @example56// ```javascript57// const fs = require('nuclei/fs');58// // here permitted directories are $HOME/nuclei-templates/*59// const content = fs.ReadFile('helpers/usernames.txt');60// ```61func ReadFile(ctx context.Context, path string) ([]byte, error) {62executionId := ctx.Value("executionId").(string)63finalPath, err := protocolstate.NormalizePathWithExecutionId(executionId, path)64if err != nil {65return nil, err66}67bin, err := os.ReadFile(finalPath)68return bin, err69}7071// ReadFileAsString reads file contents within permitted paths72// and returns content as string73// @example74// ```javascript75// const fs = require('nuclei/fs');76// // here permitted directories are $HOME/nuclei-templates/*77// const content = fs.ReadFileAsString('helpers/usernames.txt');78// ```79func ReadFileAsString(ctx context.Context, path string) (string, error) {80bin, err := ReadFile(ctx, path)81if err != nil {82return "", err83}84return string(bin), nil85}8687// ReadFilesFromDir reads all files from a directory88// and returns a string array with file contents of all files89// @example90// ```javascript91// const fs = require('nuclei/fs');92// // here permitted directories are $HOME/nuclei-templates/*93// const contents = fs.ReadFilesFromDir('helpers/ssh-keys');94// log(contents);95// ```96func ReadFilesFromDir(ctx context.Context, dir string) ([]string, error) {97files, err := ListDir(ctx, dir, "file")98if err != nil {99return nil, err100}101var results []string102for _, file := range files {103content, err := ReadFileAsString(ctx, dir+"/"+file)104if err != nil {105return nil, err106}107results = append(results, content)108}109return results, nil110}111112113