Add support for deleting a file or directory from a server
This commit is contained in:
parent
50d16a3dcd
commit
e95c22a526
23
http.go
23
http.go
|
@ -326,9 +326,9 @@ func (rt *Router) routeServerCopyFile(w http.ResponseWriter, r *http.Request, ps
|
||||||
defer r.Body.Close()
|
defer r.Body.Close()
|
||||||
|
|
||||||
data := rt.ReaderToBytes(r.Body)
|
data := rt.ReaderToBytes(r.Body)
|
||||||
copyLocation, _ := jsonparser.GetString(data, "file_location")
|
loc, _ := jsonparser.GetString(data, "location")
|
||||||
|
|
||||||
if err := s.Filesystem.Copy(copyLocation); err != nil {
|
if err := s.Filesystem.Copy(loc); err != nil {
|
||||||
zap.S().Errorw("error copying file for server", zap.String("server", s.Uuid), zap.Error(err))
|
zap.S().Errorw("error copying file for server", zap.String("server", s.Uuid), zap.Error(err))
|
||||||
|
|
||||||
http.Error(w, "an error occurred while copying the file", http.StatusInternalServerError)
|
http.Error(w, "an error occurred while copying the file", http.StatusInternalServerError)
|
||||||
|
@ -338,6 +338,23 @@ func (rt *Router) routeServerCopyFile(w http.ResponseWriter, r *http.Request, ps
|
||||||
w.WriteHeader(http.StatusNoContent)
|
w.WriteHeader(http.StatusNoContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rt *Router) routeServerDeleteFile(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
|
||||||
|
s := rt.Servers.Get(ps.ByName("server"))
|
||||||
|
defer r.Body.Close()
|
||||||
|
|
||||||
|
data := rt.ReaderToBytes(r.Body)
|
||||||
|
loc, _ := jsonparser.GetString(data, "location")
|
||||||
|
|
||||||
|
if err := s.Filesystem.Delete(loc); err != nil {
|
||||||
|
zap.S().Errorw("failed to delete a file or directory for server", zap.String("server", s.Uuid), zap.Error(err))
|
||||||
|
|
||||||
|
http.Error(w, "an error occurred while trying to delete a file or directory", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
}
|
||||||
|
|
||||||
func (rt *Router) ReaderToBytes(r io.Reader) []byte {
|
func (rt *Router) ReaderToBytes(r io.Reader) []byte {
|
||||||
buf := bytes.Buffer{}
|
buf := bytes.Buffer{}
|
||||||
buf.ReadFrom(r)
|
buf.ReadFrom(r)
|
||||||
|
@ -358,7 +375,7 @@ func (rt *Router) ConfigureRouter() *httprouter.Router {
|
||||||
router.PUT("/api/servers/:server/files/rename", rt.AuthenticateToken("s:files", rt.AuthenticateServer(rt.routeServerRenameFile)))
|
router.PUT("/api/servers/:server/files/rename", rt.AuthenticateToken("s:files", rt.AuthenticateServer(rt.routeServerRenameFile)))
|
||||||
router.POST("/api/servers/:server/files/copy", rt.AuthenticateToken("s:files", rt.AuthenticateServer(rt.routeServerCopyFile)))
|
router.POST("/api/servers/:server/files/copy", rt.AuthenticateToken("s:files", rt.AuthenticateServer(rt.routeServerCopyFile)))
|
||||||
router.POST("/api/servers/:server/files/create-directory", rt.AuthenticateToken("s:files", rt.AuthenticateServer(rt.routeServerCreateDirectory)))
|
router.POST("/api/servers/:server/files/create-directory", rt.AuthenticateToken("s:files", rt.AuthenticateServer(rt.routeServerCreateDirectory)))
|
||||||
|
router.POST("/api/servers/:server/files/delete", rt.AuthenticateToken("s:files", rt.AuthenticateServer(rt.routeServerDeleteFile)))
|
||||||
router.POST("/api/servers/:server/power", rt.AuthenticateToken("s:power", rt.AuthenticateServer(rt.routeServerPower)))
|
router.POST("/api/servers/:server/power", rt.AuthenticateToken("s:power", rt.AuthenticateServer(rt.routeServerPower)))
|
||||||
|
|
||||||
router.GET("/api/servers/:server/ws", rt.AuthenticateToken("s:websocket", rt.AuthenticateServer(rt.routeWebsocket)))
|
router.GET("/api/servers/:server/ws", rt.AuthenticateToken("s:websocket", rt.AuthenticateServer(rt.routeWebsocket)))
|
||||||
|
|
|
@ -194,17 +194,6 @@ func (fs *Filesystem) Readfile(p string) (io.Reader, error) {
|
||||||
return bytes.NewReader(b), nil
|
return bytes.NewReader(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete a file or folder from the system. If a folder location is passed in the
|
|
||||||
// folder and all of its contents are deleted.
|
|
||||||
func (fs *Filesystem) DeleteFile(p string) error {
|
|
||||||
cleaned, err := fs.SafePath(p)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return os.RemoveAll(cleaned)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines the stat struct object.
|
// Defines the stat struct object.
|
||||||
type Stat struct {
|
type Stat struct {
|
||||||
Info os.FileInfo
|
Info os.FileInfo
|
||||||
|
@ -370,6 +359,22 @@ func (fs *Filesystem) Copy(p string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deletes a file or folder from the system. Prevents the user from accidentally
|
||||||
|
// (or maliciously) removing their root server data directory.
|
||||||
|
func (fs *Filesystem) Delete(p string) error {
|
||||||
|
cleaned, err := fs.SafePath(p)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Block any whoopsies.
|
||||||
|
if cleaned == fs.Path() {
|
||||||
|
return errors.New("cannot delete root server directory")
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.RemoveAll(cleaned)
|
||||||
|
}
|
||||||
|
|
||||||
// Lists the contents of a given directory and returns stat information about each
|
// Lists the contents of a given directory and returns stat information about each
|
||||||
// file and folder within it.
|
// file and folder within it.
|
||||||
func (fs *Filesystem) ListDirectory(p string) ([]*Stat, error) {
|
func (fs *Filesystem) ListDirectory(p string) ([]*Stat, error) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user