Skip to content

Fix upload-asset allowed-exts parsing and JS extension normalization#27591

Merged
pelikhan merged 10 commits intomainfrom
copilot/update-allowed-exts-parsing
Apr 21, 2026
Merged

Fix upload-asset allowed-exts parsing and JS extension normalization#27591
pelikhan merged 10 commits intomainfrom
copilot/update-allowed-exts-parsing

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 21, 2026

Summary

  • normalize literal safe-outputs.upload-asset.allowed-exts values during Go parsing
  • trim whitespace, lowercase values, add a leading . when missing, and deduplicate entries while preserving order
  • preserve GitHub Actions expressions in Go allowed-exts values as-is (no normalization)
  • refactor JavaScript allowed-extension parsing/normalization into a shared helper module
  • normalize GH_AW_ASSETS_ALLOWED_EXTS in JavaScript for literal extensions (trim/lowercase/add leading dot)
  • enforce that GH_AW_ASSETS_ALLOWED_EXTS is already expanded at runtime: unresolved GitHub Actions expressions (${{ ... }}) are rejected with a configuration error
  • add/update Go and JavaScript unit tests for normalization, expression pass-through, unresolved-expression rejection, and shared helper behavior

Validation

  • go test -v -run "TestUploadAssetsConfig(CustomExtensions|Defaults|NormalizesExtensions)|TestParseUploadAssetConfig" ./pkg/workflow/
  • cd actions/setup/js && npm run test:js -- allowed_extensions_helpers.test.cjs safe_outputs_handlers.test.cjs
  • make agent-finish (fails due to pre-existing lint issues in unrelated files: pkg/actionpins/spec_test.go, pkg/cli/spec_test.go)
  • parallel_validation (Code Review + CodeQL)


✨ PR Review Safe Output Test - Run 24733695961

💥 [THE END] — Illustrated by Smoke Claude · ● 147K ·

Copilot AI requested a review from pelikhan April 21, 2026 14:08
@pelikhan pelikhan marked this pull request as ready for review April 21, 2026 15:01
Copilot AI review requested due to automatic review settings April 21, 2026 15:01
@github-actions github-actions Bot mentioned this pull request Apr 21, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Normalizes safe-outputs.upload-asset.allowed-exts values during parsing so configurations that omit leading dots (or include whitespace / mixed casing / duplicates) behave consistently.

Changes:

  • Add normalizeAllowedExtension() to trim whitespace, lowercase, and add a leading . when missing.
  • Deduplicate allowed-exts entries while preserving first-seen order during config parsing.
  • Add unit tests covering normalization behavior in both config and parsing tests.
Show a summary per file
File Description
pkg/workflow/publish_assets.go Normalizes and deduplicates allowed-exts during upload-asset config parsing.
pkg/workflow/publish_assets_test.go Adds a parsing test case asserting normalization/dedup behavior.
pkg/workflow/upload_assets_config_test.go Adds a config-level test for extension normalization behavior.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 3/3 changed files
  • Comments generated: 2

}
if !strings.HasPrefix(normalized, ".") {
normalized = "." + normalized
}
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

normalizeAllowedExtension treats a single dot (".") as a valid extension and will return ".". This is unlikely to be a meaningful file extension and can lead to confusing or overly-broad allowlists if downstream validation uses suffix checks. Consider treating "." (and possibly other non-extension values like "..") as invalid by returning "" so it gets skipped during parsing.

Suggested change
}
}
if strings.Trim(normalized, ".") == "" {
return ""
}

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👋 Smoke test agent was here — this is a great catch! The bare-dot edge case is easy to overlook. Agreed that rejecting . and .. would be a safer default.

📰 BREAKING: Report filed by Smoke Copilot · ● 1.1M

BaseSafeOutputConfig: BaseSafeOutputConfig{},
},
},
{
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new normalization behavior is covered for missing dots, whitespace, casing, and duplicates, but there isn't a test case for edge inputs like "." or whitespace-only strings. Adding such a case would clarify the intended behavior (e.g., whether these entries should be ignored) and prevent regressions as normalization rules evolve.

Suggested change
{
{
name: "upload-asset config ignores empty allowed-exts entries",
input: map[string]any{
"upload-asset": map[string]any{
"allowed-exts": []any{".", " ", "\t", " GIF ", "."},
},
},
expected: &UploadAssetsConfig{
BranchName: "assets/${{ github.workflow }}",
MaxSizeKB: 10240,
AllowedExts: []string{".gif"},
BaseSafeOutputConfig: BaseSafeOutputConfig{},
},
},
{

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator

@pelikhan pelikhan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot normalize in JavaScript to account for scripts using github actions expressions (${{...

Copilot AI and others added 2 commits April 21, 2026 15:15
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 21, 2026

@copilot normalize in JavaScript to account for scripts using github actions expressions (${{...

Implemented in 1cba0d6: JavaScript now normalizes GH_AW_ASSETS_ALLOWED_EXTS entries (trim/lowercase/add leading dot for literals), preserves ${{ ... }} entries, and fails safely with a clear error if an unresolved GitHub Actions expression remains at validation time. Added/updated tests in safe_outputs_handlers.test.cjs for normalization and unresolved-expression handling.

Copilot AI changed the title Fix upload-asset allowed-exts parsing for missing leading dots Fix upload-asset allowed-exts parsing and JS extension normalization Apr 21, 2026
Comment thread actions/setup/js/safe_outputs_handlers.cjs Outdated
Comment thread actions/setup/js/safe_outputs_handlers.cjs Outdated
Comment thread actions/setup/js/safe_outputs_handlers.cjs Outdated
Comment thread pkg/workflow/publish_assets.go Outdated
var publishAssetsLog = logger.New("workflow:publish_assets")

func normalizeAllowedExtension(extension string) string {
normalized := strings.ToLower(strings.TrimSpace(extension))
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot do not normalize if it is a github actions expression, pass as is the JavaScript will normalize

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in cfc57d4: Go now preserves GitHub Actions expressions in allowed-exts as-is, and JavaScript handles normalization/validation at runtime. Screenshot: N/A (no UI changes).

Copilot AI requested a review from pelikhan April 21, 2026 16:02
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot make sure the file are copied with setup.sh

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 21, 2026

@copilot make sure the file are copied with setup.sh

Fixed in fb416b5: added allowed_extensions_helpers.cjs to SAFE_OUTPUTS_FILES in actions/setup/setup.sh so setup copies it into the safe-outputs runtime directory. Screenshot: N/A (no UI changes).

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 21, 2026

🚀 Smoke OpenCode MISSION COMPLETE! OpenCode delivered. 🔥

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 21, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 21, 2026

⚠️ Smoke Gemini failed. Gemini encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 21, 2026

⚠️ Smoke Crush failed. Crush encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions github-actions Bot removed the smoke label Apr 21, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 21, 2026

🌑 The shadows whisper... Smoke Codex failed. The oracle requires further meditation...

@github-actions
Copy link
Copy Markdown
Contributor

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.53.0
jq 1.7
yq v4.52.5
curl 8.5.0
gh 2.89.0
node v20.20.2
python3 3.12.3
go 1.24.13
java 21.0.10
dotnet 10.0.201

Result: 12/12 tools available ✅

Overall Status: PASS

🔧 Tool validation by Agent Container Smoke Test · ● 160.9K ·

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Test Results — Run §24733695961

Core Tests Status
1. GitHub MCP
2. MCP Scripts GH CLI
3. Serena MCP
4. Make Build
5. Playwright
6. Tavily Web Search
7. File Writing
8. Bash Tool
9. Discussion Comment
10. AW MCP Status
11. Slack Safe Output
12. Code Scanning Alert
PR Review Tests Status
13. Update PR Body
14. Review Comments
15. Submit Review
16. Resolve Thread ⚠️
17. Add Reviewer
18. Push to Branch
19. Close PR ⚠️

Overall: PARTIAL (1 failure: AW MCP Status tool error; 2 skipped)

💥 [THE END] — Illustrated by Smoke Claude · ● 147K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💥 Automated smoke test review — all systems nominal! This review was auto-generated by the Claude smoke test agent for run §24733695961.

💥 [THE END] — Illustrated by Smoke Claude · ● 147K

function isGitHubExpression(value) {
const trimmed = value.trim();
return /^\$\{\{[\s\S]*\}\}$/.test(trimmed);
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke test review comment — The regex [\s\S]* is correct for matching multiline expressions. Consider naming the exported isGitHubExpression helper with a _ prefix or JSDoc @internal if it's only used internally, to clarify the public API surface. ✅ Logic looks solid!


func isGitHubExpression(value string) bool {
trimmed := strings.TrimSpace(value)
return githubExpressionPattern.MatchString(trimmed)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke test review commentisGitHubExpression in Go mirrors the JS helper nicely. The (?s) flag in the regex makes . match newlines, which is correct for multiline expressions like $\{\{ steps.x.outputs\ny }}. 💡 Consider exporting this as IsGitHubExpression if other packages need it in the future.

@github-actions
Copy link
Copy Markdown
Contributor

🧪 Smoke Test Results — Run §24733696225

  • GitHub MCP ✅ | MCP Scripts GH CLI ✅ | Serena CLI ✅
  • Playwright ✅ | Web Fetch ✅ | File Write ✅
  • Build gh-aw ✅ | Upload Artifact ✅ | Discussion ✅
  • Workflow Dispatch ✅ | PR Review ✅

Overall: ✅ PASS (13/13)

PR Author: @Copilot | Assignees: @pelikhan @Copilot

📰 BREAKING: Report filed by Smoke Copilot · ● 1.1M ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall the PR cleanly refactors extension normalization into shared helpers for both Go and JS sides, with good test coverage. Two minor points: (1) normalizeAllowedExtension should reject a bare . input; (2) confirm the .test.cjs file uses require() rather than ES import to match the CJS helper module.

📰 BREAKING: Report filed by Smoke Copilot · ● 1.1M

normalized := strings.ToLower(trimmed)
if !strings.HasPrefix(normalized, ".") {
normalized = "." + normalized
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The normalizeAllowedExtension function returns "." for a single-dot input, which could create misleading allowlists. Consider rejecting bare dots: if strings.Trim(normalized, ".") == "" { return "" }

return normalized.startsWith(".") ? normalized : `.${normalized}`;
}

/**
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test file uses ES module import syntax but the helper uses CommonJS (module.exports). Make sure the test runner is configured for CJS or switch the test to require() to avoid module format mismatches.

@github-actions
Copy link
Copy Markdown
Contributor

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

@pelikhan pelikhan merged commit 758a1a9 into main Apr 21, 2026
166 of 170 checks passed
@pelikhan pelikhan deleted the copilot/update-allowed-exts-parsing branch April 21, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants