admin: public sid can't contains / to avoid path traversal

This commit is contained in:
nemunaire 2024-03-14 12:38:28 +01:00
parent 19481962d5
commit ad72eb0b95

View File

@ -7,6 +7,7 @@ import (
"net/http"
"os"
"path"
"strings"
"github.com/gin-gonic/gin"
)
@ -65,6 +66,11 @@ func savePublicTo(path string, s FICPublicDisplay) error {
}
func getPublic(c *gin.Context) {
if strings.Contains(c.Params.ByName("sid"), "/") {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "sid cannot contains /"})
return
}
if _, err := os.Stat(path.Join(DashboardDir, fmt.Sprintf("public%s.json", c.Params.ByName("sid")))); !os.IsNotExist(err) {
p, err := readPublic(path.Join(DashboardDir, fmt.Sprintf("public%s.json", c.Params.ByName("sid"))))
if err != nil {
@ -81,6 +87,11 @@ func getPublic(c *gin.Context) {
}
func deletePublic(c *gin.Context) {
if strings.Contains(c.Params.ByName("sid"), "/") {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "sid cannot contains /"})
return
}
if err := savePublicTo(path.Join(DashboardDir, fmt.Sprintf("public%s.json", c.Params.ByName("sid"))), FICPublicDisplay{}); err != nil {
log.Println("Unable to deletePublic:", err.Error())
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "An error occurs during scene deletion."})
@ -91,6 +102,11 @@ func deletePublic(c *gin.Context) {
}
func savePublic(c *gin.Context) {
if strings.Contains(c.Params.ByName("sid"), "/") {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "sid cannot contains /"})
return
}
var scenes FICPublicDisplay
err := c.ShouldBindJSON(&scenes)
if err != nil {