WIP: Save current state - security subsystems, migrations, logging
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/Fimeg/RedFlag/aggregator-server/internal/config"
|
||||
"github.com/Fimeg/RedFlag/aggregator-server/internal/database/queries"
|
||||
"github.com/Fimeg/RedFlag/aggregator-server/internal/services"
|
||||
"github.com/google/uuid"
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -19,13 +20,15 @@ type DownloadHandler struct {
|
||||
agentDir string
|
||||
config *config.Config
|
||||
installTemplateService *services.InstallTemplateService
|
||||
packageQueries *queries.PackageQueries
|
||||
}
|
||||
|
||||
func NewDownloadHandler(agentDir string, cfg *config.Config) *DownloadHandler {
|
||||
func NewDownloadHandler(agentDir string, cfg *config.Config, packageQueries *queries.PackageQueries) *DownloadHandler {
|
||||
return &DownloadHandler{
|
||||
agentDir: agentDir,
|
||||
config: cfg,
|
||||
installTemplateService: services.NewInstallTemplateService(),
|
||||
packageQueries: packageQueries,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,13 +140,58 @@ func (h *DownloadHandler) DownloadUpdatePackage(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: Implement actual package serving from database/filesystem
|
||||
// For now, return a placeholder response
|
||||
c.JSON(http.StatusNotImplemented, gin.H{
|
||||
"error": "Update package download not yet implemented",
|
||||
"package_id": packageID,
|
||||
"message": "This will serve the signed update package file",
|
||||
})
|
||||
parsedPackageID, err := uuid.Parse(packageID)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid package ID format"})
|
||||
return
|
||||
}
|
||||
|
||||
// Fetch package from database
|
||||
pkg, err := h.packageQueries.GetSignedPackageByID(parsedPackageID)
|
||||
if err != nil {
|
||||
if err.Error() == "update package not found" {
|
||||
c.JSON(http.StatusNotFound, gin.H{
|
||||
"error": "Package not found",
|
||||
"package_id": packageID,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[ERROR] Failed to fetch package %s: %v", packageID, err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{
|
||||
"error": "Failed to retrieve package",
|
||||
"package_id": packageID,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// Verify file exists on disk
|
||||
if _, err := os.Stat(pkg.BinaryPath); os.IsNotExist(err) {
|
||||
log.Printf("[ERROR] Package file not found on disk: %s", pkg.BinaryPath)
|
||||
c.JSON(http.StatusNotFound, gin.H{
|
||||
"error": "Package file not found on disk",
|
||||
"package_id": packageID,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// Set appropriate headers
|
||||
c.Header("Content-Type", "application/octet-stream")
|
||||
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filepath.Base(pkg.BinaryPath)))
|
||||
c.Header("X-Package-Version", pkg.Version)
|
||||
c.Header("X-Package-Platform", pkg.Platform)
|
||||
c.Header("X-Package-Architecture", pkg.Architecture)
|
||||
|
||||
if pkg.Signature != "" {
|
||||
c.Header("X-Package-Signature", pkg.Signature)
|
||||
}
|
||||
|
||||
if pkg.Checksum != "" {
|
||||
c.Header("X-Package-Checksum", pkg.Checksum)
|
||||
}
|
||||
|
||||
// Serve the file
|
||||
c.File(pkg.BinaryPath)
|
||||
}
|
||||
|
||||
// InstallScript serves the installation script
|
||||
|
||||
Reference in New Issue
Block a user