From 7883b3233559b5c737ce01e6804fe14cbd59e38f Mon Sep 17 00:00:00 2001 From: Kevin Pham Date: Sun, 3 Dec 2023 23:34:46 -0600 Subject: [PATCH] work on rule reqmod resmod codegen for serialization --- pkg/ruleset_v2/rule_reqmod_types.gen.go | 1 - pkg/ruleset_v2/rule_resmod_types.gen.go | 24 --- proxychain/codegen/codegen.go | 86 ++++++++ .../ruleset_v2 => proxychain/ruleset}/rule.go | 0 proxychain/ruleset/rule_reqmod_types.gen.go | 184 ++++++++++++++++++ proxychain/ruleset/rule_resmod_types.gen.go | 184 ++++++++++++++++++ .../ruleset}/rule_test.go | 0 .../ruleset}/rule_utils.go | 0 .../ruleset}/rule_utils_test.go | 0 .../ruleset}/ruleset.go | 0 10 files changed, 454 insertions(+), 25 deletions(-) delete mode 100644 pkg/ruleset_v2/rule_reqmod_types.gen.go delete mode 100644 pkg/ruleset_v2/rule_resmod_types.gen.go create mode 100644 proxychain/codegen/codegen.go rename {pkg/ruleset_v2 => proxychain/ruleset}/rule.go (100%) create mode 100644 proxychain/ruleset/rule_reqmod_types.gen.go create mode 100644 proxychain/ruleset/rule_resmod_types.gen.go rename {pkg/ruleset_v2 => proxychain/ruleset}/rule_test.go (100%) rename {pkg/ruleset_v2 => proxychain/ruleset}/rule_utils.go (100%) rename {pkg/ruleset_v2 => proxychain/ruleset}/rule_utils_test.go (100%) rename {pkg/ruleset_v2 => proxychain/ruleset}/ruleset.go (100%) diff --git a/pkg/ruleset_v2/rule_reqmod_types.gen.go b/pkg/ruleset_v2/rule_reqmod_types.gen.go deleted file mode 100644 index 11b5a3b..0000000 --- a/pkg/ruleset_v2/rule_reqmod_types.gen.go +++ /dev/null @@ -1 +0,0 @@ -package ruleset_v2 diff --git a/pkg/ruleset_v2/rule_resmod_types.gen.go b/pkg/ruleset_v2/rule_resmod_types.gen.go deleted file mode 100644 index d578020..0000000 --- a/pkg/ruleset_v2/rule_resmod_types.gen.go +++ /dev/null @@ -1,24 +0,0 @@ -package ruleset_v2 - -import ( - "ladder/proxychain" - rx "ladder/proxychain/responsemodifiers" -) - -type ResponseModifierFactory func(params ...string) proxychain.ResponseModification - -var resModMap map[string]ResponseModifierFactory - -// TODO: create codegen using AST parsing of exported methods in ladder/proxychain/responsemodifiers/*.go -func init() { - resModMap = make(map[string]ResponseModifierFactory) - resModMap["APIContent"] = func(_ ...string) proxychain.ResponseModification { - return rx.APIContent() - } - resModMap["SetContentSecurityPolicy"] = func(params ...string) proxychain.ResponseModification { - return rx.SetContentSecurityPolicy(params[0]) - } - resModMap["SetIncomingCookie"] = func(params ...string) proxychain.ResponseModification { - return rx.SetIncomingCookie(params[0], params[1]) - } -} diff --git a/proxychain/codegen/codegen.go b/proxychain/codegen/codegen.go new file mode 100644 index 0000000..9c2f09e --- /dev/null +++ b/proxychain/codegen/codegen.go @@ -0,0 +1,86 @@ +package main + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + //"io/fs" + "os" + "path/filepath" + "strings" + //"strings" +) + +func modToFactoryMap(fn *ast.FuncDecl) (modMap string) { + paramCount := len(fn.Type.Params.List) + name := fn.Name.Name + var x string + switch paramCount { + case 0: + x = fmt.Sprintf(" resModMap[\"%s\"] = func(_ ...string) proxychain.ResponseModification {\n return rx.%s()\n }\n", name, name) + default: + p := []string{} + for i := 0; i < paramCount; i++ { + p = append(p, fmt.Sprintf("params[%d]", i)) + } + params := strings.Join(p, ", ") + x = fmt.Sprintf(" resModMap[\"%s\"] = func(params, ...string) proxychain.ResponseModification {\n return rx.%s(%s)\n }\n", name, name, params) + } + return x +} + +func main() { + fset := token.NewFileSet() + + // Directory containing your Go files + dir := "../requestmodifiers/" + + files, err := os.ReadDir(dir) + if err != nil { + panic(err) + } + + factoryMaps := []string{} + for _, file := range files { + if filepath.Ext(file.Name()) != ".go" { + continue + } + + // Parse each Go file + node, err := parser.ParseFile(fset, filepath.Join(dir, file.Name()), nil, parser.ParseComments) + if err != nil { + panic(err) + } + + ast.Inspect(node, func(n ast.Node) bool { + fn, ok := n.(*ast.FuncDecl) + if ok && fn.Recv == nil && fn.Name.IsExported() { + factoryMaps = append(factoryMaps, modToFactoryMap(fn)) + } + return true + }) + + } + + code := fmt.Sprintf(` +package ruleset_v2 + +import ( + "ladder/proxychain" + rx "ladder/proxychain/responsemodifiers" +) + +type ResponseModifierFactory func(params ...string) proxychain.ResponseModification + +var resModMap map[string]ResponseModifierFactory + +// TODO: create codegen using AST parsing of exported methods in ladder/proxychain/responsemodifiers/*.go +func init() { + resModMap = make(map[string]ResponseModifierFactory) + + %s +}`, strings.Join(factoryMaps, "\n")) + fmt.Println(code) + +} diff --git a/pkg/ruleset_v2/rule.go b/proxychain/ruleset/rule.go similarity index 100% rename from pkg/ruleset_v2/rule.go rename to proxychain/ruleset/rule.go diff --git a/proxychain/ruleset/rule_reqmod_types.gen.go b/proxychain/ruleset/rule_reqmod_types.gen.go new file mode 100644 index 0000000..88ecddf --- /dev/null +++ b/proxychain/ruleset/rule_reqmod_types.gen.go @@ -0,0 +1,184 @@ +package ruleset + +import ( + "ladder/proxychain" + rx "ladder/proxychain/responsemodifiers" +) + +type ResponseModifierFactory func(params ...string) proxychain.ResponseModification + +var resModMap map[string]ResponseModifierFactory + +// TODO: create codegen using AST parsing of exported methods in ladder/proxychain/responsemodifiers/*.go +func init() { + resModMap = make(map[string]ResponseModifierFactory) + + resModMap["ForwardRequestHeaders"] = func(_ ...string) proxychain.ResponseModification { + return rx.ForwardRequestHeaders() + } + + resModMap["MasqueradeAsGoogleBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsGoogleBot() + } + + resModMap["MasqueradeAsBingBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsBingBot() + } + + resModMap["MasqueradeAsWaybackMachineBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsWaybackMachineBot() + } + + resModMap["MasqueradeAsFacebookBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsFacebookBot() + } + + resModMap["MasqueradeAsYandexBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsYandexBot() + } + + resModMap["MasqueradeAsBaiduBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsBaiduBot() + } + + resModMap["MasqueradeAsDuckDuckBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsDuckDuckBot() + } + + resModMap["MasqueradeAsYahooBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsYahooBot() + } + + resModMap["ModifyDomainWithRegex"] = func(params, ...string) proxychain.ResponseModification { + return rx.ModifyDomainWithRegex(params[0], params[1]) + } + + resModMap["SetOutgoingCookie"] = func(params, ...string) proxychain.ResponseModification { + return rx.SetOutgoingCookie(params[0], params[1]) + } + + resModMap["SetOutgoingCookies"] = func(params, ...string) proxychain.ResponseModification { + return rx.SetOutgoingCookies(params[0]) + } + + resModMap["DeleteOutgoingCookie"] = func(params, ...string) proxychain.ResponseModification { + return rx.DeleteOutgoingCookie(params[0]) + } + + resModMap["DeleteOutgoingCookies"] = func(_ ...string) proxychain.ResponseModification { + return rx.DeleteOutgoingCookies() + } + + resModMap["DeleteOutgoingCookiesExcept"] = func(params, ...string) proxychain.ResponseModification { + return rx.DeleteOutgoingCookiesExcept(params[0]) + } + + resModMap["ModifyPathWithRegex"] = func(params, ...string) proxychain.ResponseModification { + return rx.ModifyPathWithRegex(params[0], params[1]) + } + + resModMap["ModifyQueryParams"] = func(params, ...string) proxychain.ResponseModification { + return rx.ModifyQueryParams(params[0], params[1]) + } + + resModMap["SetRequestHeader"] = func(params, ...string) proxychain.ResponseModification { + return rx.SetRequestHeader(params[0], params[1]) + } + + resModMap["DeleteRequestHeader"] = func(params, ...string) proxychain.ResponseModification { + return rx.DeleteRequestHeader(params[0]) + } + + resModMap["RequestArchiveIs"] = func(_ ...string) proxychain.ResponseModification { + return rx.RequestArchiveIs() + } + + resModMap["RequestGoogleCache"] = func(_ ...string) proxychain.ResponseModification { + return rx.RequestGoogleCache() + } + + resModMap["RequestWaybackMachine"] = func(_ ...string) proxychain.ResponseModification { + return rx.RequestWaybackMachine() + } + + resModMap["NewCustomDialer"] = func(params, ...string) proxychain.ResponseModification { + return rx.NewCustomDialer(params[0]) + } + + resModMap["ResolveWithGoogleDoH"] = func(_ ...string) proxychain.ResponseModification { + return rx.ResolveWithGoogleDoH() + } + + resModMap["SpoofOrigin"] = func(params, ...string) proxychain.ResponseModification { + return rx.SpoofOrigin(params[0]) + } + + resModMap["HideOrigin"] = func(_ ...string) proxychain.ResponseModification { + return rx.HideOrigin() + } + + resModMap["SpoofReferrer"] = func(params, ...string) proxychain.ResponseModification { + return rx.SpoofReferrer(params[0]) + } + + resModMap["HideReferrer"] = func(_ ...string) proxychain.ResponseModification { + return rx.HideReferrer() + } + + resModMap["SpoofReferrerFromBaiduSearch"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromBaiduSearch() + } + + resModMap["SpoofReferrerFromBingSearch"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromBingSearch() + } + + resModMap["SpoofReferrerFromGoogleSearch"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromGoogleSearch() + } + + resModMap["SpoofReferrerFromLinkedInPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromLinkedInPost() + } + + resModMap["SpoofReferrerFromNaverSearch"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromNaverSearch() + } + + resModMap["SpoofReferrerFromPinterestPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromPinterestPost() + } + + resModMap["SpoofReferrerFromQQPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromQQPost() + } + + resModMap["SpoofReferrerFromRedditPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromRedditPost() + } + + resModMap["SpoofReferrerFromTumblrPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromTumblrPost() + } + + resModMap["SpoofReferrerFromTwitterPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromTwitterPost() + } + + resModMap["SpoofReferrerFromVkontaktePost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromVkontaktePost() + } + + resModMap["SpoofReferrerFromWeiboPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromWeiboPost() + } + + resModMap["SpoofUserAgent"] = func(params, ...string) proxychain.ResponseModification { + return rx.SpoofUserAgent(params[0]) + } + + resModMap["SpoofXForwardedFor"] = func(params, ...string) proxychain.ResponseModification { + return rx.SpoofXForwardedFor(params[0]) + } + +} diff --git a/proxychain/ruleset/rule_resmod_types.gen.go b/proxychain/ruleset/rule_resmod_types.gen.go new file mode 100644 index 0000000..21984b3 --- /dev/null +++ b/proxychain/ruleset/rule_resmod_types.gen.go @@ -0,0 +1,184 @@ +package ruleset_v2 + +import ( + "ladder/proxychain" + rx "ladder/proxychain/responsemodifiers" +) + +type ResponseModifierFactory func(params ...string) proxychain.ResponseModification + +var resModMap map[string]ResponseModifierFactory + +// TODO: create codegen using AST parsing of exported methods in ladder/proxychain/responsemodifiers/*.go +func init() { + resModMap = make(map[string]ResponseModifierFactory) + + resModMap["ForwardRequestHeaders"] = func(_ ...string) proxychain.ResponseModification { + return rx.ForwardRequestHeaders() + } + + resModMap["MasqueradeAsGoogleBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsGoogleBot() + } + + resModMap["MasqueradeAsBingBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsBingBot() + } + + resModMap["MasqueradeAsWaybackMachineBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsWaybackMachineBot() + } + + resModMap["MasqueradeAsFacebookBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsFacebookBot() + } + + resModMap["MasqueradeAsYandexBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsYandexBot() + } + + resModMap["MasqueradeAsBaiduBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsBaiduBot() + } + + resModMap["MasqueradeAsDuckDuckBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsDuckDuckBot() + } + + resModMap["MasqueradeAsYahooBot"] = func(_ ...string) proxychain.ResponseModification { + return rx.MasqueradeAsYahooBot() + } + + resModMap["ModifyDomainWithRegex"] = func(params, ...string) proxychain.ResponseModification { + return rx.ModifyDomainWithRegex(params[0], params[1]) + } + + resModMap["SetOutgoingCookie"] = func(params, ...string) proxychain.ResponseModification { + return rx.SetOutgoingCookie(params[0], params[1]) + } + + resModMap["SetOutgoingCookies"] = func(params, ...string) proxychain.ResponseModification { + return rx.SetOutgoingCookies(params[0]) + } + + resModMap["DeleteOutgoingCookie"] = func(params, ...string) proxychain.ResponseModification { + return rx.DeleteOutgoingCookie(params[0]) + } + + resModMap["DeleteOutgoingCookies"] = func(_ ...string) proxychain.ResponseModification { + return rx.DeleteOutgoingCookies() + } + + resModMap["DeleteOutgoingCookiesExcept"] = func(params, ...string) proxychain.ResponseModification { + return rx.DeleteOutgoingCookiesExcept(params[0]) + } + + resModMap["ModifyPathWithRegex"] = func(params, ...string) proxychain.ResponseModification { + return rx.ModifyPathWithRegex(params[0], params[1]) + } + + resModMap["ModifyQueryParams"] = func(params, ...string) proxychain.ResponseModification { + return rx.ModifyQueryParams(params[0], params[1]) + } + + resModMap["SetRequestHeader"] = func(params, ...string) proxychain.ResponseModification { + return rx.SetRequestHeader(params[0], params[1]) + } + + resModMap["DeleteRequestHeader"] = func(params, ...string) proxychain.ResponseModification { + return rx.DeleteRequestHeader(params[0]) + } + + resModMap["RequestArchiveIs"] = func(_ ...string) proxychain.ResponseModification { + return rx.RequestArchiveIs() + } + + resModMap["RequestGoogleCache"] = func(_ ...string) proxychain.ResponseModification { + return rx.RequestGoogleCache() + } + + resModMap["RequestWaybackMachine"] = func(_ ...string) proxychain.ResponseModification { + return rx.RequestWaybackMachine() + } + + resModMap["NewCustomDialer"] = func(params, ...string) proxychain.ResponseModification { + return rx.NewCustomDialer(params[0]) + } + + resModMap["ResolveWithGoogleDoH"] = func(_ ...string) proxychain.ResponseModification { + return rx.ResolveWithGoogleDoH() + } + + resModMap["SpoofOrigin"] = func(params, ...string) proxychain.ResponseModification { + return rx.SpoofOrigin(params[0]) + } + + resModMap["HideOrigin"] = func(_ ...string) proxychain.ResponseModification { + return rx.HideOrigin() + } + + resModMap["SpoofReferrer"] = func(params, ...string) proxychain.ResponseModification { + return rx.SpoofReferrer(params[0]) + } + + resModMap["HideReferrer"] = func(_ ...string) proxychain.ResponseModification { + return rx.HideReferrer() + } + + resModMap["SpoofReferrerFromBaiduSearch"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromBaiduSearch() + } + + resModMap["SpoofReferrerFromBingSearch"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromBingSearch() + } + + resModMap["SpoofReferrerFromGoogleSearch"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromGoogleSearch() + } + + resModMap["SpoofReferrerFromLinkedInPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromLinkedInPost() + } + + resModMap["SpoofReferrerFromNaverSearch"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromNaverSearch() + } + + resModMap["SpoofReferrerFromPinterestPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromPinterestPost() + } + + resModMap["SpoofReferrerFromQQPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromQQPost() + } + + resModMap["SpoofReferrerFromRedditPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromRedditPost() + } + + resModMap["SpoofReferrerFromTumblrPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromTumblrPost() + } + + resModMap["SpoofReferrerFromTwitterPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromTwitterPost() + } + + resModMap["SpoofReferrerFromVkontaktePost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromVkontaktePost() + } + + resModMap["SpoofReferrerFromWeiboPost"] = func(_ ...string) proxychain.ResponseModification { + return rx.SpoofReferrerFromWeiboPost() + } + + resModMap["SpoofUserAgent"] = func(params, ...string) proxychain.ResponseModification { + return rx.SpoofUserAgent(params[0]) + } + + resModMap["SpoofXForwardedFor"] = func(params, ...string) proxychain.ResponseModification { + return rx.SpoofXForwardedFor(params[0]) + } + +} diff --git a/pkg/ruleset_v2/rule_test.go b/proxychain/ruleset/rule_test.go similarity index 100% rename from pkg/ruleset_v2/rule_test.go rename to proxychain/ruleset/rule_test.go diff --git a/pkg/ruleset_v2/rule_utils.go b/proxychain/ruleset/rule_utils.go similarity index 100% rename from pkg/ruleset_v2/rule_utils.go rename to proxychain/ruleset/rule_utils.go diff --git a/pkg/ruleset_v2/rule_utils_test.go b/proxychain/ruleset/rule_utils_test.go similarity index 100% rename from pkg/ruleset_v2/rule_utils_test.go rename to proxychain/ruleset/rule_utils_test.go diff --git a/pkg/ruleset_v2/ruleset.go b/proxychain/ruleset/ruleset.go similarity index 100% rename from pkg/ruleset_v2/ruleset.go rename to proxychain/ruleset/ruleset.go