From 01c16aeb912a993cb9d9560408bee25b2ab81245 Mon Sep 17 00:00:00 2001 From: Keagan McClelland Date: Thu, 24 Sep 2020 16:44:41 -0600 Subject: [PATCH] reduces cyclomatic complexity by actually using data already in scope --- http/commands.go | 118 +++++++++++++++++++++++------------------------ http/http.go | 2 +- 2 files changed, 59 insertions(+), 61 deletions(-) diff --git a/http/commands.go b/http/commands.go index 5d15663d..6c37adc2 100644 --- a/http/commands.go +++ b/http/commands.go @@ -37,76 +37,74 @@ func wsErr(ws *websocket.Conn, r *http.Request, status int, err error) { //nolin } } -func commandsHandler (enableExec bool) handleFunc { - return withUser(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { - conn, err := upgrader.Upgrade(w, r, nil) - if err != nil { - return http.StatusInternalServerError, err - } - defer conn.Close() +var commandsHandler = withUser(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return http.StatusInternalServerError, err + } + defer conn.Close() - var raw string + var raw string - for { - _, msg, err := conn.ReadMessage() //nolint:shadow - if err != nil { - wsErr(conn, r, http.StatusInternalServerError, err) - return 0, nil - } - - raw = strings.TrimSpace(string(msg)) - if raw != "" { - break - } - } - - if !enableExec || !d.user.CanExecute(strings.Split(raw, " ")[0]) { - if err := conn.WriteMessage(websocket.TextMessage, cmdNotAllowed); err != nil { //nolint:shadow - wsErr(conn, r, http.StatusInternalServerError, err) - } - - return 0, nil - } - - command, err := runner.ParseCommand(d.settings, raw) - if err != nil { - if err := conn.WriteMessage(websocket.TextMessage, []byte(err.Error())); err != nil { //nolint:shadow - wsErr(conn, r, http.StatusInternalServerError, err) - } - return 0, nil - } - - cmd := exec.Command(command[0], command[1:]...) //nolint:gosec - cmd.Dir = d.user.FullPath(r.URL.Path) - - stdout, err := cmd.StdoutPipe() + for { + _, msg, err := conn.ReadMessage() //nolint:shadow if err != nil { wsErr(conn, r, http.StatusInternalServerError, err) return 0, nil } - stderr, err := cmd.StderrPipe() - if err != nil { - wsErr(conn, r, http.StatusInternalServerError, err) - return 0, nil + raw = strings.TrimSpace(string(msg)) + if raw != "" { + break } + } - if err := cmd.Start(); err != nil { - wsErr(conn, r, http.StatusInternalServerError, err) - return 0, nil - } - - s := bufio.NewScanner(io.MultiReader(stdout, stderr)) - for s.Scan() { - if err := conn.WriteMessage(websocket.TextMessage, s.Bytes()); err != nil { - log.Print(err) - } - } - - if err := cmd.Wait(); err != nil { + if !d.server.EnableExec || !d.user.CanExecute(strings.Split(raw, " ")[0]) { + if err := conn.WriteMessage(websocket.TextMessage, cmdNotAllowed); err != nil { //nolint:shadow wsErr(conn, r, http.StatusInternalServerError, err) } return 0, nil - }) -} + } + + command, err := runner.ParseCommand(d.settings, raw) + if err != nil { + if err := conn.WriteMessage(websocket.TextMessage, []byte(err.Error())); err != nil { //nolint:shadow + wsErr(conn, r, http.StatusInternalServerError, err) + } + return 0, nil + } + + cmd := exec.Command(command[0], command[1:]...) //nolint:gosec + cmd.Dir = d.user.FullPath(r.URL.Path) + + stdout, err := cmd.StdoutPipe() + if err != nil { + wsErr(conn, r, http.StatusInternalServerError, err) + return 0, nil + } + + stderr, err := cmd.StderrPipe() + if err != nil { + wsErr(conn, r, http.StatusInternalServerError, err) + return 0, nil + } + + if err := cmd.Start(); err != nil { + wsErr(conn, r, http.StatusInternalServerError, err) + return 0, nil + } + + s := bufio.NewScanner(io.MultiReader(stdout, stderr)) + for s.Scan() { + if err := conn.WriteMessage(websocket.TextMessage, s.Bytes()); err != nil { + log.Print(err) + } + } + + if err := cmd.Wait(); err != nil { + wsErr(conn, r, http.StatusInternalServerError, err) + } + + return 0, nil +}) diff --git a/http/http.go b/http/http.go index 8c70c558..a4b3c2d2 100644 --- a/http/http.go +++ b/http/http.go @@ -61,7 +61,7 @@ func NewHandler(imgSvc ImgService, fileCache FileCache, store *storage.Storage, api.PathPrefix("/raw").Handler(monkey(rawHandler, "/api/raw")).Methods("GET") api.PathPrefix("/preview/{size}/{path:.*}"). Handler(monkey(previewHandler(imgSvc, fileCache, server.EnableThumbnails, server.ResizePreview), "/api/preview")).Methods("GET") - api.PathPrefix("/command").Handler(monkey(commandsHandler(server.EnableExec), "/api/command")).Methods("GET") + api.PathPrefix("/command").Handler(monkey(commandsHandler, "/api/command")).Methods("GET") api.PathPrefix("/search").Handler(monkey(searchHandler, "/api/search")).Methods("GET") public := api.PathPrefix("/public").Subrouter()