Changeset 0.38.0 (#233)
Co-authored-by: gobha <jasafpro@gmail.com> Co-committed-by: gobha <jasafpro@gmail.com>
This commit is contained in:
@@ -241,31 +241,25 @@ func (h *PackageHandler) InstallPackage(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
// v0.37.15: Read script.star from archive if present.
|
||||
// Keeps the manifest clean — authors write a file, installer injects
|
||||
// it as _starlark_script for the sandbox runner.
|
||||
if _, hasInline := manifest["_starlark_script"]; !hasInline {
|
||||
// v0.38.0: Entry point validation for starlark-tier packages.
|
||||
// Scripts are loaded from disk at runtime — no _starlark_script injection.
|
||||
if manifestTier, _ := manifest["tier"].(string); manifestTier == "starlark" {
|
||||
entryPoint := "script.star"
|
||||
if ep, ok := manifest["entry_point"].(string); ok && ep != "" {
|
||||
entryPoint = ep
|
||||
}
|
||||
found := false
|
||||
for _, f := range zr.File {
|
||||
name := f.Name
|
||||
base := filepath.Base(name)
|
||||
if base == "script.star" && !f.FileInfo().IsDir() {
|
||||
rc, err := f.Open()
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
data, err := io.ReadAll(rc)
|
||||
rc.Close()
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
script := string(data)
|
||||
if strings.TrimSpace(script) != "" {
|
||||
manifest["_starlark_script"] = script
|
||||
log.Printf("[packages] Injected script.star (%d bytes) into manifest", len(data))
|
||||
}
|
||||
base := filepath.Base(f.Name)
|
||||
if base == entryPoint && !f.FileInfo().IsDir() {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("starlark package missing entry point %q", entryPoint)})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// Validate required fields
|
||||
@@ -487,17 +481,25 @@ func (h *PackageHandler) InstallPackage(c *gin.Context) {
|
||||
}
|
||||
|
||||
// extractableRelPath returns the relative path for a zip entry if it
|
||||
// belongs to an extractable static directory (js/, css/, assets/).
|
||||
// belongs to an extractable directory (js/, css/, assets/, star/) or
|
||||
// is a bare .star file at the archive root.
|
||||
// Returns "" if the file should be skipped.
|
||||
func extractableRelPath(name string) string {
|
||||
staticPrefixes := []string{"js/", "css/", "assets/"}
|
||||
staticPrefixes := []string{"js/", "css/", "assets/", "star/"}
|
||||
|
||||
// Direct match (flat archive without package-id/ wrapper)
|
||||
for _, p := range staticPrefixes {
|
||||
if strings.HasPrefix(name, p) {
|
||||
return name
|
||||
}
|
||||
}
|
||||
|
||||
// Bare .star file at root (e.g. "script.star")
|
||||
if strings.HasSuffix(name, ".star") && !strings.Contains(name, "/") {
|
||||
return name
|
||||
}
|
||||
|
||||
// Nested inside package-id/ directory
|
||||
idx := strings.Index(name, "/")
|
||||
if idx <= 0 {
|
||||
return ""
|
||||
@@ -510,6 +512,11 @@ func extractableRelPath(name string) string {
|
||||
}
|
||||
}
|
||||
|
||||
// Bare .star file inside package-id/ (e.g. "gitea-client/script.star")
|
||||
if strings.HasSuffix(rest, ".star") && !strings.Contains(rest, "/") {
|
||||
return rest
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user