From 5fa28220b4253ebe55877130c2289ec91495f97d Mon Sep 17 00:00:00 2001 From: Hiddify Date: Mon, 29 Jan 2024 21:55:01 +0100 Subject: [PATCH] new: add tunnel service --- admin_service/service.go | 74 +++++++++++++++++ {web => admin_service}/web.go | 95 +++++++++++----------- admin_service_cmd/admin_service.manifest | 17 ++++ admin_service_cmd/admin_service.syso | Bin 0 -> 12510 bytes admin_service_cmd/main.go | 33 ++++++++ build_windows.bat | 4 + cmd/cmd_admin_service.go | 19 +++++ cmd/cmd_config.go | 2 +- cmd/cmd_gen_cert.go | 5 +- cmd/cmd_parse.go | 2 +- cmd/cmd_run.go | 53 +++++++++++++ cmd/cmd_service.go | 10 --- cmd/cmd_service_install.go | 12 --- cmd/cmd_service_start.go | 12 --- cmd/cmd_service_stop.go | 12 --- cmd/main.go | 8 +- config/debug.go | 26 ++++-- custom/command_admin_service.go | 15 ++++ custom/custom.go | 2 +- custom/status.go | 3 +- global/global.go | 97 +++++++++++++++-------- global/parameters.go | 4 +- go.mod | 1 + go.sum | 2 + mobile/mobile.go | 2 +- service/service.go | 76 ------------------ utils/certificate_li.go | 4 +- utils/certificate_wi.go | 5 +- 28 files changed, 364 insertions(+), 231 deletions(-) create mode 100644 admin_service/service.go rename {web => admin_service}/web.go (64%) create mode 100644 admin_service_cmd/admin_service.manifest create mode 100644 admin_service_cmd/admin_service.syso create mode 100644 admin_service_cmd/main.go create mode 100644 cmd/cmd_admin_service.go create mode 100644 cmd/cmd_run.go delete mode 100644 cmd/cmd_service.go delete mode 100644 cmd/cmd_service_install.go delete mode 100644 cmd/cmd_service_start.go delete mode 100644 cmd/cmd_service_stop.go create mode 100644 custom/command_admin_service.go delete mode 100644 service/service.go diff --git a/admin_service/service.go b/admin_service/service.go new file mode 100644 index 0000000..341e908 --- /dev/null +++ b/admin_service/service.go @@ -0,0 +1,74 @@ +package admin_service + +import ( + "log" + + "github.com/hiddify/libcore/global" + "github.com/kardianos/service" +) + +var logger service.Logger + +type hiddifyNext struct{} + +var port int = 18020 + +func (m *hiddifyNext) Start(s service.Service) error { + go m.run() + return nil +} +func (m *hiddifyNext) Stop(s service.Service) error { + err := global.StopService() + if err != nil { + return err + } + // Stop should not block. Return with a few seconds. + // <-time.After(time.Second * 1) + return nil +} +func (m *hiddifyNext) run() { + StartWebServer(port, false) +} + +func StartService(goArg string) { + svcConfig := &service.Config{ + Name: "Hiddify Tunnel Service", + DisplayName: "Hiddify Tunnel Service", + Description: "This is a bridge for tunnel", + } + + prg := &hiddifyNext{} + s, err := service.New(prg, svcConfig) + if err != nil { + log.Fatal(err) + } + if len(goArg) > 0 { + if goArg == "uninstall" { + err = s.Stop() + if err != nil { + log.Fatal(err) + } + } + err = service.Control(s, goArg) + if err != nil { + log.Fatal(err) + } + if goArg == "install" { + err = s.Start() + if err != nil { + log.Fatal(err) + } + } + + return + } + + logger, err = s.Logger(nil) + if err != nil { + log.Fatal(err) + } + err = s.Run() + if err != nil { + logger.Error(err) + } +} diff --git a/web/web.go b/admin_service/web.go similarity index 64% rename from web/web.go rename to admin_service/web.go index f71dfd6..835e9c6 100644 --- a/web/web.go +++ b/admin_service/web.go @@ -1,12 +1,13 @@ -package web +package admin_service import ( "crypto/tls" "fmt" - "github.com/hiddify/libcore/global" - "github.com/hiddify/libcore/utils" "net/http" "strconv" + + "github.com/hiddify/libcore/global" + "github.com/hiddify/libcore/utils" ) const ( @@ -16,65 +17,61 @@ const ( clientKeyPath = "cert/client-key.pem" ) -func StartWebServer(Port int) { +func StartWebServer(Port int, TLS bool) { http.HandleFunc("/start", startHandler) http.HandleFunc("/stop", StopHandler) server := &http.Server{ Addr: "127.0.0.1:" + fmt.Sprintf("%d", Port), - TLSConfig: &tls.Config{ + } + var err error + if TLS { + server.TLSConfig = &tls.Config{ MinVersion: tls.VersionTLS12, Certificates: []tls.Certificate{utils.LoadCertificate(serverCertPath, serverKeyPath)}, ClientAuth: tls.RequireAndVerifyClientCert, ClientCAs: utils.LoadClientCA(clientCertPath), - }, + } + err = server.ListenAndServeTLS(serverCertPath, serverKeyPath) + } else { + err = server.ListenAndServe() } - err := server.ListenAndServeTLS(serverCertPath, serverKeyPath) if err != nil { panic("Error: " + err.Error()) } } func startHandler(w http.ResponseWriter, r *http.Request) { queryParams := r.URL.Query() - Ipv6 := queryParams.Get("Ipv6") - ServerPort := queryParams.Get("ServerPort") - StrictRoute := queryParams.Get("StrictRoute") - EndpointIndependentNat := queryParams.Get("EndpointIndependentNat") - TheStack := queryParams.Get("Stack") + ipv6, err := strconv.ParseBool(queryParams.Get("Ipv6")) + if err != nil { + fmt.Printf("ipv6 Error: %v ==>using false\n", err) + ipv6 = false + } + serverPort, err := strconv.Atoi(queryParams.Get("ServerPort")) + if err != nil { + fmt.Printf("serverPort Error: %v ==>using 2334\n", err) + serverPort = 2334 + } + strictRoute, err := strconv.ParseBool(queryParams.Get("StrictRoute")) + if err != nil { + fmt.Printf("strictRoute Error: %v ==>using false\n", err) + strictRoute = false + } + endpointIndependentNat, err := strconv.ParseBool(queryParams.Get("EndpointIndependentNat")) + if err != nil { + fmt.Printf("endpointIndependentNat Error: %v ==>using false\n", err) + endpointIndependentNat = false + } + theStack := GetStack(queryParams.Get("Stack")) - ipv6, err := strconv.ParseBool(Ipv6) - if err != nil { - http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest) - return - } - serverPort, err := strconv.Atoi(ServerPort) - if err != nil { - http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest) - return - } - strictRoute, err := strconv.ParseBool(StrictRoute) - if err != nil { - http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest) - return - } - endpointIndependentNat, err := strconv.ParseBool(EndpointIndependentNat) - if err != nil { - http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest) - return - } - theStack := GetStack(TheStack) - if theStack == "UNKNOWN" { - http.Error(w, fmt.Sprintf("Error: %s", "Stack is not valid"), http.StatusBadRequest) - return - } - - parameters := global.Parameters{Ipv6: ipv6, ServerPort: serverPort, StrictRoute: strictRoute, EndpointIndependentNat: endpointIndependentNat, Stack: GetStack(TheStack)} + parameters := global.Parameters{Ipv6: ipv6, ServerPort: serverPort, StrictRoute: strictRoute, EndpointIndependentNat: endpointIndependentNat, Stack: theStack} err = global.WriteParameters(parameters.Ipv6, parameters.ServerPort, parameters.StrictRoute, parameters.EndpointIndependentNat, GetStringFromStack(parameters.Stack)) if err != nil { http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest) return } - err = global.SetupC("./", "./work", "./tmp", false) + err = global.SetupC("./", "./", "./tmp", false) + if err != nil { http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest) return @@ -84,7 +81,7 @@ func startHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest) return } - + http.Error(w, fmt.Sprintf("Ok"), http.StatusOK) } func StopHandler(w http.ResponseWriter, r *http.Request) { err := global.StopService() @@ -94,17 +91,19 @@ func StopHandler(w http.ResponseWriter, r *http.Request) { } } func GetStack(stack string) global.Stack { + switch stack { case "system": return global.System - case "gVisor": + case "gvisor": return global.GVisor case "mixed": return global.Mixed - case "LWIP": - return global.LWIP + // case "LWIP": + // return global.LWIP default: - return "UNKNOWN" + fmt.Printf("Stack Error: %s is not valid==> using GVisor\n", stack) + return global.GVisor } } func GetStringFromStack(stack global.Stack) string { @@ -112,11 +111,11 @@ func GetStringFromStack(stack global.Stack) string { case global.System: return "system" case global.GVisor: - return "gVisor" + return "gvisor" case global.Mixed: return "mixed" - case global.LWIP: - return "LWIP" + // case global.LWIP: + // return "LWIP" default: return "UNKNOWN" } diff --git a/admin_service_cmd/admin_service.manifest b/admin_service_cmd/admin_service.manifest new file mode 100644 index 0000000..514190c --- /dev/null +++ b/admin_service_cmd/admin_service.manifest @@ -0,0 +1,17 @@ + + + +Hiddify Tunnel Service + + + + + + + + \ No newline at end of file diff --git a/admin_service_cmd/admin_service.syso b/admin_service_cmd/admin_service.syso new file mode 100644 index 0000000000000000000000000000000000000000..18651d28507c66534772723a692b2588ad72b251 GIT binary patch literal 12510 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 literal 0 HcmV?d00001 diff --git a/admin_service_cmd/main.go b/admin_service_cmd/main.go new file mode 100644 index 0000000..45bae49 --- /dev/null +++ b/admin_service_cmd/main.go @@ -0,0 +1,33 @@ +package main + +/* +#cgo LDFLAGS: bin/libcore.dll +#include +#include + +// Import the function from the DLL +extern void AdminServiceStart(char *arg); + +*/ +import "C" +import ( + "os" +) + +func main() { + args := os.Args + // Check if there is at least one command-line argument + if len(args) < 2 { + println("Usage: hiddify-service.exe empty/start/stop/uninstall/install") + // os.Exit(1) + args = append(args, "") + } + // fmt.Printf("os.Args: %+v", args) + os.Chdir(os.Args[0]) + // Convert the Go string to a C string + arg := C.CString(args[1]) + // defer C.free(unsafe.Pointer(arg)) + + // Call AdminServiceStart with the C string + C.AdminServiceStart(arg) +} diff --git a/build_windows.bat b/build_windows.bat index f4edcec..26c0a0f 100644 --- a/build_windows.bat +++ b/build_windows.bat @@ -4,3 +4,7 @@ set GOARCH=amd64 set CC=x86_64-w64-mingw32-gcc set CGO_ENABLED=1 go build -trimpath -tags with_gvisor,with_quic,with_wireguard,with_ech,with_utls,with_clash_api,with_grpc -ldflags="-w -s" -buildmode=c-shared -o bin/libcore.dll ./custom + +rsrc -manifest admin_service_cmd\admin_service.manifest -ico ..\assets\images\tray_icon_connected.ico -o admin_service_cmd\admin_service.syso +go build -o bin/hiddify-service.exe ./admin_service_cmd +@REM copy .\admin_service_cmd\admin_service.manifest bin\hiddify-service.exe.manifest diff --git a/cmd/cmd_admin_service.go b/cmd/cmd_admin_service.go new file mode 100644 index 0000000..7180974 --- /dev/null +++ b/cmd/cmd_admin_service.go @@ -0,0 +1,19 @@ +package main + +import ( + "github.com/hiddify/libcore/admin_service" + + "github.com/spf13/cobra" +) + +var commandService = &cobra.Command{ + Use: "admin-service", + Short: "Sign box service start/stop/install/uninstall", + Args: cobra.MaximumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + if len(args) < 2 { + admin_service.StartService("") + } + admin_service.StartService(args[1]) + }, +} diff --git a/cmd/cmd_config.go b/cmd/cmd_config.go index 6553335..221934c 100644 --- a/cmd/cmd_config.go +++ b/cmd/cmd_config.go @@ -75,7 +75,7 @@ func build(path string, optionsPath string) error { } if commandBuildOutputPath != "" { outputPath, _ := filepath.Abs(filepath.Join(workingDir, commandBuildOutputPath)) - err = os.WriteFile(outputPath, []byte(config), 0777) + err = os.WriteFile(outputPath, []byte(config), 0644) if err != nil { return err } diff --git a/cmd/cmd_gen_cert.go b/cmd/cmd_gen_cert.go index a441825..6915ded 100644 --- a/cmd/cmd_gen_cert.go +++ b/cmd/cmd_gen_cert.go @@ -1,16 +1,17 @@ package main import ( + "os" + "github.com/hiddify/libcore/utils" "github.com/spf13/cobra" - "os" ) var commandGenerateCertification = &cobra.Command{ Use: "gen-cert", Short: "Generate certification for web server", Run: func(cmd *cobra.Command, args []string) { - err := os.MkdirAll("cert", 600) + err := os.MkdirAll("cert", 0644) if err != nil { panic("Error: " + err.Error()) } diff --git a/cmd/cmd_parse.go b/cmd/cmd_parse.go index c4ab148..193ed48 100644 --- a/cmd/cmd_parse.go +++ b/cmd/cmd_parse.go @@ -39,7 +39,7 @@ func parse(path string) error { } if commandParseOutputPath != "" { outputPath, _ := filepath.Abs(filepath.Join(workingDir, commandParseOutputPath)) - err = os.WriteFile(outputPath, config, 0777) + err = os.WriteFile(outputPath, config, 0644) if err != nil { return err } diff --git a/cmd/cmd_run.go b/cmd/cmd_run.go new file mode 100644 index 0000000..dafe4fd --- /dev/null +++ b/cmd/cmd_run.go @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + "time" + + "github.com/hiddify/libcore/config" + "github.com/hiddify/libcore/global" + "github.com/sagernet/sing-box/log" + + "github.com/spf13/cobra" +) + +var commandRunInputPath string + +var commandRun = &cobra.Command{ + Use: "run", + Short: "run", + Args: cobra.ExactArgs(0), + Run: func(cmd *cobra.Command, args []string) { + err := runSingbox(commandRunInputPath) + if err != nil { + log.Fatal(err) + } + }, +} + +func init() { + commandRun.Flags().StringVarP(&commandRunInputPath, "config", "c", "", "read config") + mainCommand.AddCommand(commandRun) + +} + +func runSingbox(configPath string) error { + options, err := readConfigAt(configPath) + options.Log.Disabled = false + options.Log.Level = "trace" + options.Log.Output = "" + options.Log.DisableColor = false + + err = global.SetupC("./", "./", "./tmp", false) + if err != nil { + return err + } + configStr, err := config.ToJson(*options) + if err != nil { + return err + } + go global.StartServiceC(false, configStr) + fmt.Printf("Waiting for 30 seconds\n") + <-time.After(time.Second * 30) + return err +} diff --git a/cmd/cmd_service.go b/cmd/cmd_service.go deleted file mode 100644 index 5d77639..0000000 --- a/cmd/cmd_service.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/spf13/cobra" -) - -var commandService = &cobra.Command{ - Use: "service", - Short: "Sign box service", -} diff --git a/cmd/cmd_service_install.go b/cmd/cmd_service_install.go deleted file mode 100644 index 6cdd34f..0000000 --- a/cmd/cmd_service_install.go +++ /dev/null @@ -1,12 +0,0 @@ -package main - -import ( - "github.com/hiddify/libcore/service" - "github.com/spf13/cobra" -) - -var commandServiceInstall = &cobra.Command{ - Use: "install", - Short: "install the service", - Run: service.InstallService, -} diff --git a/cmd/cmd_service_start.go b/cmd/cmd_service_start.go deleted file mode 100644 index e757206..0000000 --- a/cmd/cmd_service_start.go +++ /dev/null @@ -1,12 +0,0 @@ -package main - -import ( - "github.com/hiddify/libcore/service" - "github.com/spf13/cobra" -) - -var commandServiceStart = &cobra.Command{ - Use: "start", - Short: "Start a sign box instance", - Run: service.StartService, -} diff --git a/cmd/cmd_service_stop.go b/cmd/cmd_service_stop.go deleted file mode 100644 index b0f1a33..0000000 --- a/cmd/cmd_service_stop.go +++ /dev/null @@ -1,12 +0,0 @@ -package main - -import ( - "github.com/hiddify/libcore/service" - "github.com/spf13/cobra" -) - -var commandServiceStop = &cobra.Command{ - Use: "stop", - Short: "stop sign box", - Run: service.StopService, -} diff --git a/cmd/main.go b/cmd/main.go index 779d241..6cb73b4 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -25,12 +25,6 @@ func init() { mainCommand.AddCommand(commandService) mainCommand.AddCommand(commandGenerateCertification) - commandService.AddCommand(commandServiceStart) - commandService.AddCommand(commandServiceStop) - commandService.AddCommand(commandServiceInstall) - - commandServiceStart.Flags().Int("port", 8080, "Webserver port number") - mainCommand.PersistentFlags().StringVarP(&workingDir, "directory", "D", "", "set working directory") mainCommand.PersistentFlags().BoolVarP(&disableColor, "disable-color", "", false, "disable color output") @@ -49,7 +43,7 @@ func preRun(cmd *cobra.Command, args []string) { if workingDir != "" { _, err := os.Stat(workingDir) if err != nil { - os.MkdirAll(workingDir, 0o777) + os.MkdirAll(workingDir, 0o0644) } if err := os.Chdir(workingDir); err != nil { log.Fatal(err) diff --git a/config/debug.go b/config/debug.go index 8c1e214..71713e4 100644 --- a/config/debug.go +++ b/config/debug.go @@ -12,15 +12,29 @@ import ( ) func SaveCurrentConfig(path string, options option.Options) error { - var buffer bytes.Buffer - json.NewEncoder(&buffer) - encoder := json.NewEncoder(&buffer) - encoder.SetIndent("", " ") - err := encoder.Encode(options) + json, err := ToJson(options) if err != nil { return err } - return os.WriteFile(filepath.Join(path, "current-config.json"), buffer.Bytes(), 0777) + p, err := filepath.Abs(filepath.Join(path, "current-config.json")) + fmt.Printf("Saving config to %v %+v\n", p, err) + if err != nil { + return err + } + return os.WriteFile(p, []byte(json), 0644) +} + +func ToJson(options option.Options) (string, error) { + var buffer bytes.Buffer + encoder := json.NewEncoder(&buffer) + encoder.SetIndent("", " ") + // fmt.Printf("%+v\n", options) + err := encoder.Encode(options) + if err != nil { + fmt.Printf("ERROR in coding:%+v\n", err) + return "", err + } + return buffer.String(), nil } func DeferPanicToError(name string, err func(error)) { diff --git a/custom/command_admin_service.go b/custom/command_admin_service.go new file mode 100644 index 0000000..7f28ff3 --- /dev/null +++ b/custom/command_admin_service.go @@ -0,0 +1,15 @@ +// Copyright 2015 Daniel Theophanes. +// Use of this source code is governed by a zlib-style +// license that can be found in the LICENSE file. + +// simple does nothing except block while running the service. +package main + +import "C" +import "github.com/hiddify/libcore/admin_service" + +//export AdminServiceStart +func AdminServiceStart(arg *C.char) { + goArg := C.GoString(arg) + admin_service.StartService(goArg) +} diff --git a/custom/custom.go b/custom/custom.go index d311ceb..a195273 100644 --- a/custom/custom.go +++ b/custom/custom.go @@ -66,7 +66,7 @@ func parse(path *C.char, tempPath *C.char, debug bool) (CErr *C.char) { if err != nil { return C.CString(err.Error()) } - err = os.WriteFile(C.GoString(path), config, 0777) + err = os.WriteFile(C.GoString(path), config, 0644) if err != nil { return C.CString(err.Error()) } diff --git a/custom/status.go b/custom/status.go index 3c45720..3aae1a5 100644 --- a/custom/status.go +++ b/custom/status.go @@ -3,6 +3,7 @@ package main import "C" import ( "encoding/json" + "fmt" "github.com/hiddify/libcore/bridge" ) @@ -26,7 +27,7 @@ func propagateStatus(newStatus string) { func stopAndAlert(alert string, err error) error { status = Stopped message := err.Error() - + fmt.Printf("Error: %s: %v\n", alert, err) msg, _ := json.Marshal(StatusMessage{Status: status, Alert: &alert, Message: &message}) bridge.SendStringToPort(statusPropagationPort, string(msg)) return nil diff --git a/global/global.go b/global/global.go index fd575b6..f01dab5 100644 --- a/global/global.go +++ b/global/global.go @@ -4,16 +4,17 @@ import ( "encoding/json" "errors" "fmt" - "github.com/hiddify/libcore/config" - "github.com/sagernet/sing-box/experimental/libbox" - "github.com/sagernet/sing-box/log" - "github.com/sagernet/sing-box/option" "io" "os" "path/filepath" "strconv" "strings" "time" + + "github.com/hiddify/libcore/config" + "github.com/sagernet/sing-box/experimental/libbox" + "github.com/sagernet/sing-box/log" + "github.com/sagernet/sing-box/option" ) var box *libbox.BoxService @@ -47,7 +48,7 @@ func parse(path string, tempPath string, debug bool) error { if err != nil { return err } - err = os.WriteFile(path, config, 0777) + err = os.WriteFile(path, config, 0644) if err != nil { return err } @@ -235,45 +236,48 @@ func urlTest(groupTag string) error { } func StartServiceC(delayStart bool, content string) error { - options, err := parseConfig(content) - if err != nil { - return stopAndAlert(EmptyConfiguration, err) - } - configOptions = &config.ConfigOptions{} - patchedOptions, err := config.BuildConfig(*configOptions, options) - options = *patchedOptions + options, err := parseConfig(content) + // if err != nil { + // return stopAndAlert(EmptyConfiguration, err) + // } + // configOptions = &config.ConfigOptions{} + // patchedOptions, err := config.BuildConfig(*configOptions, options) + + // options = *patchedOptions err = config.SaveCurrentConfig(sWorkingPath, options) if err != nil { + fmt.Printf("Error in saving config: %v\n", err) return err } - err = startCommandServer(*logFactory) - if err != nil { - return stopAndAlert(StartCommandServer, err) - } + // err = startCommandServer(*logFactory) + // if err != nil { + // return stopAndAlert(StartCommandServer, err) + // } instance, err := NewService(options) - if err != nil { - return stopAndAlert(CreateService, err) - } + // if err != nil { + // return stopAndAlert(CreateService, err) + // } - if delayStart { - time.Sleep(250 * time.Millisecond) - } + // if delayStart { + // time.Sleep(250 * time.Millisecond) + // } err = instance.Start() if err != nil { - return stopAndAlert(StartService, err) + // return stopAndAlert(StartService, err) + fmt.Printf("String Service Error: %v\n", err) + return err } - box = instance - commandServer.SetService(box) + // box = instance + // commandServer.SetService(box) - propagateStatus(Started) + // propagateStatus(Started) return nil } - func StopService() error { if status != Started { return nil @@ -301,15 +305,15 @@ func StopService() error { } func SetupC(baseDir string, workDir string, tempDir string, debug bool) error { - err := os.MkdirAll("./bin", 600) + err := os.MkdirAll(baseDir, 0644) if err != nil { return err } - err = os.MkdirAll("./work", 600) + err = os.MkdirAll(workDir, 0644) if err != nil { return err } - err = os.MkdirAll("./temp", 600) + err = os.MkdirAll(tempDir, 0644) if err != nil { return err } @@ -334,24 +338,49 @@ func SetupC(baseDir string, workDir string, tempDir string, debug bool) error { func MakeConfig(Ipv6 bool, ServerPort int, StrictRoute bool, EndpointIndependentNat bool, Stack string) string { var ipv6 string if Ipv6 { - ipv6 = " \"inet6_address\": \"fdfe:dcba:9876::1/126\",\n" + ipv6 = ` "inet6_address": "fdfe:dcba:9876::1/126",` } else { ipv6 = "" } - base := "{\n \"inbounds\": [\n {\n \"type\": \"tun\",\n \"tag\": \"tun-in\",\n \"interface_name\": \"tun0\",\n \"inet4_address\": \"172.19.0.1/30\",\n" + ipv6 + " \"mtu\": 9000,\n \"auto_route\": true,\n \"strict_route\": " + fmt.Sprintf("%t", StrictRoute) + ",\n \"endpoint_independent_nat\": " + fmt.Sprintf("%t", EndpointIndependentNat) + ",\n \"stack\": \"" + Stack + "\"\n }],\n \"outbounds\": [\n {\n \"type\": \"socks\",\n \"tag\": \"socks-out\",\n \"server\": \"127.0.0.1\",\n \"server_port\": " + fmt.Sprintf("%d", ServerPort) + ",\n \"version\": \"5\"\n }\n ]\n}\n" + base := `{ + "inbounds": [ + { + "type": "tun", + "tag": "tun-in", + "interface_name": "tun0", + "inet4_address": "172.19.0.1/30", + ` + ipv6 + ` + "mtu": 9000, + "auto_route": true, + "strict_route": ` + fmt.Sprintf("%t", StrictRoute) + `, + "endpoint_independent_nat": ` + fmt.Sprintf("%t", EndpointIndependentNat) + `, + "stack": "` + Stack + `" + } + ], + "outbounds": [ + { + "type": "socks", + "tag": "socks-out", + "server": "127.0.0.1", + "server_port": ` + fmt.Sprintf("%d", ServerPort) + `, + "version": "5" + } + ] + }` + return base } func WriteParameters(Ipv6 bool, ServerPort int, StrictRoute bool, EndpointIndependentNat bool, Stack string) error { parameters := fmt.Sprintf("%t,%d,%t,%t,%s", Ipv6, ServerPort, StrictRoute, EndpointIndependentNat, Stack) - err := os.WriteFile("bin/parameters.config", []byte(parameters), 600) + err := os.WriteFile("parameters.config", []byte(parameters), 0644) if err != nil { return err } return nil } func ReadParameters() (bool, int, bool, bool, string, error) { - Data, err := os.ReadFile("bin/parameters.config") + Data, err := os.ReadFile("parameters.config") if err != nil { return false, 0, false, false, "", err } diff --git a/global/parameters.go b/global/parameters.go index 9a3bc92..8945955 100644 --- a/global/parameters.go +++ b/global/parameters.go @@ -4,9 +4,9 @@ type Stack string const ( System Stack = "system" - GVisor Stack = "gVisor" + GVisor Stack = "gvisor" Mixed Stack = "mixed" - LWIP Stack = "LWIP" + // LWIP Stack = "LWIP" ) type Parameters struct { diff --git a/go.mod b/go.mod index 5cbf695..4714941 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( require ( berty.tech/go-libtor v1.0.385 // indirect github.com/ajg/form v1.5.1 // indirect + github.com/akavel/rsrc v0.10.2 // indirect github.com/andybalholm/brotli v1.0.6 // indirect github.com/caddyserver/certmagic v0.20.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect diff --git a/go.sum b/go.sum index d575372..0c247b8 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ berty.tech/go-libtor v1.0.385 h1:RWK94C3hZj6Z2GdvePpHJLnWYobFr3bY/OdUJ5aoEXw= berty.tech/go-libtor v1.0.385/go.mod h1:9swOOQVb+kmvuAlsgWUK/4c52pm69AdbJsxLzk+fJEw= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/caddyserver/certmagic v0.20.0 h1:bTw7LcEZAh9ucYCRXyCpIrSAGplplI0vGYJ4BpCQ/Fc= diff --git a/mobile/mobile.go b/mobile/mobile.go index 2a52f9c..0dd9e86 100644 --- a/mobile/mobile.go +++ b/mobile/mobile.go @@ -15,7 +15,7 @@ func Parse(path string, tempPath string, debug bool) error { if err != nil { return err } - return os.WriteFile(path, config, 0777) + return os.WriteFile(path, config, 0644) } func BuildConfig(path string, configOptionsJson string) (string, error) { diff --git a/service/service.go b/service/service.go deleted file mode 100644 index 03cee6a..0000000 --- a/service/service.go +++ /dev/null @@ -1,76 +0,0 @@ -package service - -import ( - "github.com/hiddify/libcore/global" - "github.com/hiddify/libcore/web" - "github.com/kardianos/service" - "github.com/spf13/cobra" -) - -type hiddifyNext struct{} - -var port int - -func (m *hiddifyNext) Start(s service.Service) error { - go m.run() - return nil -} -func (m *hiddifyNext) Stop(s service.Service) error { - err := global.StopService() - if err != nil { - return err - } - return nil -} -func (m *hiddifyNext) run() { - web.StartWebServer(port) -} -func StartService(cmd *cobra.Command, args []string) { - port, _ = cmd.Flags().GetInt("port") - svcConfig := &service.Config{ - Name: "hiddify_next_core", - DisplayName: "hiddify next core", - Description: "@hiddify_com set this", - } - prg := &hiddifyNext{} - svc, err := service.New(prg, svcConfig) - if err != nil { - panic("Error: " + err.Error()) - } - err = svc.Run() - if err != nil { - panic("Error: " + err.Error()) - } -} -func StopService(cmd *cobra.Command, args []string) { - svcConfig := &service.Config{ - Name: "hiddify_next_core", - DisplayName: "hiddify next core", - Description: "@hiddify_com set this", - } - prg := &hiddifyNext{} - svc, err := service.New(prg, svcConfig) - if err != nil { - panic("Error: " + err.Error()) - } - err = svc.Stop() - if err != nil { - panic("Error: " + err.Error()) - } -} -func InstallService(cmd *cobra.Command, args []string) { - svcConfig := &service.Config{ - Name: "hiddify_next_core", - DisplayName: "hiddify next core", - Description: "@hiddify_com set this", - } - prg := &hiddifyNext{} - svc, err := service.New(prg, svcConfig) - if err != nil { - panic("Error: " + err.Error()) - } - err = svc.Install() - if err != nil { - panic("Error: " + err.Error()) - } -} diff --git a/utils/certificate_li.go b/utils/certificate_li.go index f52552d..dc05ecc 100644 --- a/utils/certificate_li.go +++ b/utils/certificate_li.go @@ -56,7 +56,7 @@ func GenerateCertificate(certPath, keyPath string, isServer bool) { panic(err) } defer certFile.Close() - certFile.Chmod(600) + certFile.Chmod(0644) pem.Encode(certFile, &pem.Block{Type: "CERTIFICATE", Bytes: certDER}) keyFile, err := os.Create(keyPath) @@ -68,7 +68,7 @@ func GenerateCertificate(certPath, keyPath string, isServer bool) { if err != nil { panic(err) } - keyFile.Chmod(600) + keyFile.Chmod(0644) pem.Encode(keyFile, &pem.Block{Type: "EC PRIVATE KEY", Bytes: privBytes}) } diff --git a/utils/certificate_wi.go b/utils/certificate_wi.go index 6a51447..0926346 100644 --- a/utils/certificate_wi.go +++ b/utils/certificate_wi.go @@ -10,7 +10,6 @@ import ( "crypto/x509" "crypto/x509/pkix" "encoding/pem" - "github.com/hectane/go-acl" "io/ioutil" "math/big" "os" @@ -57,7 +56,7 @@ func GenerateCertificate(certPath, keyPath string, isServer bool) { panic(err) } defer certFile.Close() - acl.Chmod(certFile.Name(), 600) + // acl.Chmod(certFile.Name(), 0644) pem.Encode(certFile, &pem.Block{Type: "CERTIFICATE", Bytes: certDER}) keyFile, err := os.Create(keyPath) @@ -69,7 +68,7 @@ func GenerateCertificate(certPath, keyPath string, isServer bool) { if err != nil { panic(err) } - acl.Chmod(keyFile.Name(), 600) + // acl.Chmod(keyFile.Name(), 0644) pem.Encode(keyFile, &pem.Block{Type: "EC PRIVATE KEY", Bytes: privBytes}) }