reduces cyclomatic complexity by actually using data already in scope
This commit is contained in:
parent
dba8d53c9f
commit
01c16aeb91
118
http/commands.go
118
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 {
|
var commandsHandler = withUser(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
|
||||||
return withUser(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
|
conn, err := upgrader.Upgrade(w, r, nil)
|
||||||
conn, err := upgrader.Upgrade(w, r, nil)
|
if err != nil {
|
||||||
if err != nil {
|
return http.StatusInternalServerError, err
|
||||||
return http.StatusInternalServerError, err
|
}
|
||||||
}
|
defer conn.Close()
|
||||||
defer conn.Close()
|
|
||||||
|
|
||||||
var raw string
|
var raw string
|
||||||
|
|
||||||
for {
|
for {
|
||||||
_, msg, err := conn.ReadMessage() //nolint:shadow
|
_, 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()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
wsErr(conn, r, http.StatusInternalServerError, err)
|
wsErr(conn, r, http.StatusInternalServerError, err)
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
stderr, err := cmd.StderrPipe()
|
raw = strings.TrimSpace(string(msg))
|
||||||
if err != nil {
|
if raw != "" {
|
||||||
wsErr(conn, r, http.StatusInternalServerError, err)
|
break
|
||||||
return 0, nil
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if !d.server.EnableExec || !d.user.CanExecute(strings.Split(raw, " ")[0]) {
|
||||||
wsErr(conn, r, http.StatusInternalServerError, err)
|
if err := conn.WriteMessage(websocket.TextMessage, cmdNotAllowed); err != nil { //nolint:shadow
|
||||||
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)
|
wsErr(conn, r, http.StatusInternalServerError, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0, nil
|
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
|
||||||
|
})
|
||||||
|
|||||||
@ -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("/raw").Handler(monkey(rawHandler, "/api/raw")).Methods("GET")
|
||||||
api.PathPrefix("/preview/{size}/{path:.*}").
|
api.PathPrefix("/preview/{size}/{path:.*}").
|
||||||
Handler(monkey(previewHandler(imgSvc, fileCache, server.EnableThumbnails, server.ResizePreview), "/api/preview")).Methods("GET")
|
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")
|
api.PathPrefix("/search").Handler(monkey(searchHandler, "/api/search")).Methods("GET")
|
||||||
|
|
||||||
public := api.PathPrefix("/public").Subrouter()
|
public := api.PathPrefix("/public").Subrouter()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user