58 lines
1.9 KiB
Go
58 lines
1.9 KiB
Go
package cmd
|
|
|
|
import (
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// isFileIOEnabled проверяет, разрешены ли файловые операции
|
|
// По умолчанию включено, отключается только при GO_KNOCKER_ENABLE_FILE_IO=0
|
|
func isFileIOEnabled() bool {
|
|
env := os.Getenv("GO_KNOCKER_ENABLE_FILE_IO")
|
|
return env != "0" && env != "false"
|
|
}
|
|
|
|
// authMiddleware - базовая авторизация: пользователь "knocker" + пароль
|
|
func authMiddleware(pass string) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
user, providedPass, ok := c.Request.BasicAuth()
|
|
// Проверяем пользователя "knocker" и пароль
|
|
if !ok || (providedPass != pass || user != "knocker") {
|
|
c.Header("WWW-Authenticate", "Basic realm=Restricted")
|
|
c.AbortWithStatus(http.StatusUnauthorized)
|
|
return
|
|
}
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
// staticAuthMiddleware - защищает HTML страницы, но пропускает статические ресурсы
|
|
func staticAuthMiddleware(pass string) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
path := c.Request.URL.Path
|
|
|
|
// Пропускаем статические ресурсы без авторизации
|
|
if strings.HasSuffix(path, ".js") ||
|
|
strings.HasSuffix(path, ".css") ||
|
|
strings.HasSuffix(path, ".ico") ||
|
|
strings.HasSuffix(path, ".png") ||
|
|
strings.HasSuffix(path, ".jpg") ||
|
|
strings.HasSuffix(path, ".svg") ||
|
|
strings.HasSuffix(path, ".woff") ||
|
|
strings.HasSuffix(path, ".woff2") ||
|
|
strings.HasSuffix(path, ".ttf") ||
|
|
strings.HasSuffix(path, ".eot") ||
|
|
strings.HasSuffix(path, ".webmanifest") ||
|
|
strings.HasPrefix(path, "/api/") {
|
|
c.Next()
|
|
return
|
|
}
|
|
|
|
// Для всех остальных путей (в основном HTML) применяем авторизацию
|
|
authMiddleware(pass)(c)
|
|
}
|
|
}
|