From e87aabf146251f2659a1d26e0baf73710d33c8b3 Mon Sep 17 00:00:00 2001 From: alfiankan Date: Sun, 2 Jul 2023 21:54:16 +0700 Subject: [PATCH 1/2] fix(whitelisting): disable if there is no list --- teleterm/telegram_handler.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/teleterm/telegram_handler.go b/teleterm/telegram_handler.go index 2a490c7..3113f54 100644 --- a/teleterm/telegram_handler.go +++ b/teleterm/telegram_handler.go @@ -67,12 +67,14 @@ func Start(ctx context.Context, db *sql.DB, telebotToken string) { } configWhitelist := viper.GetIntSlice("whitelist") - var whitelist []int64 - for _, id := range configWhitelist { - whitelist = append(whitelist, int64(id)) - } - b.Use(middleware.Whitelist(whitelist...)) - + log.Info().Str("state", "white listing").Msg(fmt.Sprintf("total: %v", len(configWhitelist))) + if len(configWhitelist) > 0 { + var whitelist []int64 + for _, id := range configWhitelist { + whitelist = append(whitelist, int64(id)) + } + b.Use(middleware.Whitelist(whitelist...)) + } menu := &tele.ReplyMarkup{ResizeKeyboard: true} b.Handle("/refresh", func(c tele.Context) error { From f1822174af2f5593addf5b83b80e1ee382c5a769 Mon Sep 17 00:00:00 2001 From: alfiankan Date: Sun, 2 Jul 2023 23:28:12 +0700 Subject: [PATCH 2/2] feat(exec-timeout): add timeout execution for go routine --- empty/config.yaml | 3 ++- executor/command.go | 49 ++++++++++++++++++++++++++++++------ teleterm/telegram_handler.go | 6 +++-- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/empty/config.yaml b/empty/config.yaml index a3e8b14..db52eb3 100644 --- a/empty/config.yaml +++ b/empty/config.yaml @@ -3,4 +3,5 @@ teleterm: shell_executor: "/bin/bash" whitelist: - - - \ No newline at end of file + - +execution_timeout_second: 10 diff --git a/executor/command.go b/executor/command.go index 2c82c70..ba62840 100644 --- a/executor/command.go +++ b/executor/command.go @@ -1,29 +1,64 @@ package executor import ( + "errors" "fmt" "os/exec" + "time" "github.com/spf13/viper" ) -type CommandOutputWriter struct{} +type CommandOutputWriter struct { + TimeoutSecond int +} + +type CmdExecutionResult struct { + Stdout []byte + Stderr []byte +} + func (c *CommandOutputWriter) ExecFullOutput(command string) (outOk []byte, outErr []byte, err error) { - executor := viper.GetString("shell_executor") + chResponse := make(chan CmdExecutionResult) + + executor := viper.GetString("shell_executor") if executor == "" { executor = "/bin/bash" } cmd := exec.Command(executor, "-c", command) - out, err := cmd.CombinedOutput() - if err != nil { - outErr = out - return + go func(cnl chan CmdExecutionResult, cmd *exec.Cmd) { + + out, err := cmd.CombinedOutput() + errOut := []byte("") + if err != nil { + errOut = []byte(err.Error()) + } + cnl <- CmdExecutionResult{Stdout: out, Stderr: errOut} + + }(chResponse, cmd) + + if c.TimeoutSecond == 0 { + result := <-chResponse + outOk = result.Stdout + outErr = result.Stderr + return + } + + select { + case result := <-chResponse: + outOk = result.Stdout + outErr = result.Stderr + cmd.Process.Kill() + case <-time.After(time.Second * time.Duration(c.TimeoutSecond)): + cmd.Process.Kill() + errMsg := "TIMEOUT: EXCEEDED -- Process killed" + err = errors.New(errMsg) + outErr = []byte(errMsg) } - outOk = out return } diff --git a/teleterm/telegram_handler.go b/teleterm/telegram_handler.go index 3113f54..d254cd6 100644 --- a/teleterm/telegram_handler.go +++ b/teleterm/telegram_handler.go @@ -50,9 +50,11 @@ func createButtonReplay(ctx context.Context, persist Persistence, menu *tele.Rep func Start(ctx context.Context, db *sql.DB, telebotToken string) { log := common.InitLog() - log.Info().Str("version", "v2.0.0").Msg("Starting Teleterm") + log.Info().Str("version", "v2.2.0").Msg("Starting Teleterm") - commandExecutor := new(executor.CommandOutputWriter) + commandExecutor := executor.CommandOutputWriter{ + TimeoutSecond: viper.GetInt("execution_timeout_second"), + } persist := Persistence{db: db} pref := tele.Settings{