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) } }