Add support for custom temporary directories in image creation scripts #26

Open
ali-ghanati wants to merge 2 commits from ali-ghanati/main into main
ali-ghanati commented 2026-05-16 23:32:20 -05:00 (Migrated from github.com)

note: because of my poor english, I've wrote description using ai, and did some refactor in code using ai, I just wanted to help and improve this awesome project from my own point of view, thank you everyone who helped this project

Summary

Adds an optional temp/work directory flag across all exFAT image creation paths so large builds can use a fast or spacious disk (e.g. /mnt/hdd, D:\temp) instead of default system temp or fixed mount paths.

  • Linux (mkexfat.sh): -t / --tmp-dir / --temp-dir may appear anywhere in the command line. Creates a unique mount dir under the chosen base (mkexfat.XXXXXX). Mount prefers direct exfat-fuse file access and falls back to -o loop when needed (fixes loop setup failures on some removable exFAT targets).
  • macOS (mkexfat_macos.sh): Same flag parsing; when omitted, behavior is unchanged (mktemp defaults). When set, sizing scratch file and mount staging dir are created under the given path.
  • Windows (New-OsfExfatImage.ps1, make_image.bat): -TempDir / -t (PowerShell) and -t / --tmp-dir / --temp-dir (batch). Sets %TEMP% / %TMP% for format redirect files and related scratch work.

Motivation

Large game/app images (~80GB+) can fail or run slowly when temp/mount work uses root-owned paths, small system partitions, or loop mounts on USB exFAT volumes. Letting users point temp work at another drive avoids those issues without changing default behavior for existing scripts.

Behavior

Platform Without temp flag With -t / --tmp-dir
Linux Temp mount under /tmp/mkexfat.* Temp mount under <dir>/mkexfat.*
macOS System default mktemp <dir>/mkexfat.* and <dir>/mkexfat_sizes.*
Windows Windows default %TEMP% User directory for script temp files

Output image path is always the positional/output argument you pass; only intermediate work moves to the temp directory.


Linux — mkexfat.sh

Requires: exfatprogs, exfat-fuse, fuse3, rsync
(often run with sudo for mount operations)

# Default (temp under /tmp)
./mkexfat.sh /path/to/payload /path/to/output.exfat

# Use another disk for mount staging (flag can be anywhere)
./mkexfat.sh -t /mnt/hdd /mnt/hdd/payload /media/usb/game.exfat

./mkexfat.sh /mnt/hdd/payload /media/usb/game.exfat --tmp-dir /mnt/hdd

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **New Features**
  * Specify a custom temporary directory across Windows, macOS, and Linux image-creation tools (-t/--tmp-dir), including examples in help text.

* **Improvements**
  * Improved CLI parsing, validation, and usage messages.
  * Safer mount/cleanup flow and per-run temp/mount directories to avoid conflicts and ensure proper cleanup.
  * Default output behavior and fallbacks clarified for more reliable image creation.

<!-- review_stack_entry_start -->

[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/drakmor/ShadowMountPlus/pull/26?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
note: because of my poor english, I've wrote description using ai, and did some refactor in code using ai, I just wanted to help and improve this awesome project from my own point of view, thank you everyone who helped this project ## Summary Adds an optional temp/work directory flag across all exFAT image creation paths so large builds can use a fast or spacious disk (e.g. `/mnt/hdd`, `D:\temp`) instead of default system temp or fixed mount paths. - **Linux (`mkexfat.sh`)**: `-t` / `--tmp-dir` / `--temp-dir` may appear anywhere in the command line. Creates a unique mount dir under the chosen base (`mkexfat.XXXXXX`). Mount prefers direct `exfat-fuse` file access and falls back to `-o loop` when needed (fixes loop setup failures on some removable exFAT targets). - **macOS (`mkexfat_macos.sh`)**: Same flag parsing; when omitted, behavior is unchanged (`mktemp` defaults). When set, sizing scratch file and mount staging dir are created under the given path. - **Windows (`New-OsfExfatImage.ps1`, `make_image.bat`)**: `-TempDir` / `-t` (PowerShell) and `-t` / `--tmp-dir` / `--temp-dir` (batch). Sets `%TEMP%` / `%TMP%` for format redirect files and related scratch work. ## Motivation Large game/app images (~80GB+) can fail or run slowly when temp/mount work uses root-owned paths, small system partitions, or loop mounts on USB exFAT volumes. Letting users point temp work at another drive avoids those issues without changing default behavior for existing scripts. ## Behavior | Platform | Without temp flag | With `-t` / `--tmp-dir` | |---|---|---| | Linux | Temp mount under `/tmp/mkexfat.*` | Temp mount under `<dir>/mkexfat.*` | | macOS | System default `mktemp` | `<dir>/mkexfat.*` and `<dir>/mkexfat_sizes.*` | | Windows | Windows default `%TEMP%` | User directory for script temp files | Output image path is always the positional/output argument you pass; only intermediate work moves to the temp directory. --- ## Linux — `mkexfat.sh` **Requires:** `exfatprogs`, `exfat-fuse`, `fuse3`, `rsync` (often run with `sudo` for mount operations) ```bash # Default (temp under /tmp) ./mkexfat.sh /path/to/payload /path/to/output.exfat # Use another disk for mount staging (flag can be anywhere) ./mkexfat.sh -t /mnt/hdd /mnt/hdd/payload /media/usb/game.exfat ./mkexfat.sh /mnt/hdd/payload /media/usb/game.exfat --tmp-dir /mnt/hdd <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Specify a custom temporary directory across Windows, macOS, and Linux image-creation tools (-t/--tmp-dir), including examples in help text. * **Improvements** * Improved CLI parsing, validation, and usage messages. * Safer mount/cleanup flow and per-run temp/mount directories to avoid conflicts and ensure proper cleanup. * Default output behavior and fallbacks clarified for more reliable image creation. <!-- review_stack_entry_start --> [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/drakmor/ShadowMountPlus/pull/26?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
coderabbitai[bot] commented 2026-05-16 23:32:31 -05:00 (Migrated from github.com)

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 92284f79-afba-42c4-8713-d31e05e94403

📥 Commits

Reviewing files that changed from the base of the PR and between 9d6505d5d3 and b45396c134.

📒 Files selected for processing (4)
  • New-OsfExfatImage.ps1
  • make_image.bat
  • mkexfat.sh
  • mkexfat_macos.sh

📝 Walkthrough

Walkthrough

Adds an optional temp-directory option across PowerShell, Batch, Linux, and macOS scripts to control where temporary files and mount points are created during exFAT image building; includes CLI parsing, validation, dynamic mounts, and a PowerShell temp-file helper.

Changes

Temporary Directory Control Across Platforms

Layer / File(s) Summary
PowerShell Parameter and Temp Directory Helpers
New-OsfExfatImage.ps1
New-OsfExfatImage.ps1 adds a -TempDir parameter (alias -t) with documentation, implements Initialize-ScriptTempDir to validate and configure environment variables, and New-ScriptTempFile to create temp files within the specified directory.
PowerShell Format and Initialization Integration
New-OsfExfatImage.ps1
Invoke-FormatVolume uses the new temp-file helper for format.com stdout/stderr redirection instead of direct system temp names, and the main script flow initializes the temp directory before image creation.
Batch Script Argument Parsing and Pass-Through
make_image.bat
Argument parsing replaces positional handling with a loop parser supporting -t, --tmp-dir, and --temp-dir flags; validation confirms directory existence and passes it to PowerShell conditionally; usage documentation includes new examples.
Linux Shell Script CLI Parsing and Dynamic Mounting
mkexfat.sh
Option parsing supports -t/--tmp-dir/--temp-dir alongside -h/--help and -- positional separation; new cleanup() trap handler unmounts and removes dynamically created mount directories; mounting attempts unwrapped exfat-fuse before falling back to loop device and uses rsync into the dynamic mount.
macOS Shell Script CLI Parsing and Conditional Temp Placement
mkexfat_macos.sh
Option parsing supports -t/--tmp-dir/--temp-dir with -- separation and expands validation; intermediate sizes file and mount-point directory are conditionally placed under the user-specified temp base when provided.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

"🐰 I hopped through temp paths wide and narrow,
I tucked the files where you point the burrow,
Mounts cleaned up with a tidy sweep,
ExFAT sleeps safe and copies sleep deep,
Hooray — one small hop to a neater burrow!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately and concisely describes the main change across all affected scripts: adding support for custom temporary directories in image creation tools.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- This is an auto-generated comment: failure by coderabbit.ai --> > [!CAUTION] > ## Review failed > > The pull request is closed. <!-- end of auto-generated comment: failure by coderabbit.ai --> <details> <summary>ℹ️ Recent review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro Plus **Run ID**: `92284f79-afba-42c4-8713-d31e05e94403` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 9d6505d5d306f3a627abfc7e4a840300e5735ac0 and b45396c1341f811a0cbb9082301d0571bda7d105. </details> <details> <summary>📒 Files selected for processing (4)</summary> * `New-OsfExfatImage.ps1` * `make_image.bat` * `mkexfat.sh` * `mkexfat_macos.sh` </details> </details> --- <!-- walkthrough_start --> <details> <summary>📝 Walkthrough</summary> ## Walkthrough Adds an optional temp-directory option across PowerShell, Batch, Linux, and macOS scripts to control where temporary files and mount points are created during exFAT image building; includes CLI parsing, validation, dynamic mounts, and a PowerShell temp-file helper. ## Changes **Temporary Directory Control Across Platforms** |Layer / File(s)|Summary| |---|---| |**PowerShell Parameter and Temp Directory Helpers** <br> `New-OsfExfatImage.ps1`|New-OsfExfatImage.ps1 adds a `-TempDir` parameter (alias `-t`) with documentation, implements `Initialize-ScriptTempDir` to validate and configure environment variables, and `New-ScriptTempFile` to create temp files within the specified directory.| |**PowerShell Format and Initialization Integration** <br> `New-OsfExfatImage.ps1`|`Invoke-FormatVolume` uses the new temp-file helper for format.com stdout/stderr redirection instead of direct system temp names, and the main script flow initializes the temp directory before image creation.| |**Batch Script Argument Parsing and Pass-Through** <br> `make_image.bat`|Argument parsing replaces positional handling with a loop parser supporting `-t`, `--tmp-dir`, and `--temp-dir` flags; validation confirms directory existence and passes it to PowerShell conditionally; usage documentation includes new examples.| |**Linux Shell Script CLI Parsing and Dynamic Mounting** <br> `mkexfat.sh`|Option parsing supports `-t/--tmp-dir/--temp-dir` alongside `-h/--help` and `--` positional separation; new `cleanup()` trap handler unmounts and removes dynamically created mount directories; mounting attempts unwrapped exfat-fuse before falling back to loop device and uses `rsync` into the dynamic mount.| |**macOS Shell Script CLI Parsing and Conditional Temp Placement** <br> `mkexfat_macos.sh`|Option parsing supports `-t/--tmp-dir/--temp-dir` with `--` separation and expands validation; intermediate sizes file and mount-point directory are conditionally placed under the user-specified temp base when provided.| ## Estimated code review effort 🎯 3 (Moderate) | ⏱️ ~25 minutes > "🐰 I hopped through temp paths wide and narrow, > I tucked the files where you point the burrow, > Mounts cleaned up with a tidy sweep, > ExFAT sleeps safe and copies sleep deep, > Hooray — one small hop to a neater burrow!" </details> <!-- walkthrough_end --> <!-- pre_merge_checks_walkthrough_start --> <details> <summary>🚥 Pre-merge checks | ✅ 4 | ❌ 1</summary> ### ❌ Failed checks (1 warning) | Check name | Status | Explanation | Resolution | | :----------------: | :--------- | :----------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------- | | Docstring Coverage | ⚠️ Warning | Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. | <details> <summary>✅ Passed checks (4 passed)</summary> | Check name | Status | Explanation | | :------------------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. | | Title check | ✅ Passed | The title accurately and concisely describes the main change across all affected scripts: adding support for custom temporary directories in image creation tools. | | Linked Issues check | ✅ Passed | Check skipped because no linked issues were found for this pull request. | | Out of Scope Changes check | ✅ Passed | Check skipped because no linked issues were found for this pull request. | </details> <sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub> </details> <!-- pre_merge_checks_walkthrough_end --> <!-- finishing_touch_checkbox_start --> <details> <summary>✨ Finishing Touches</summary> <details> <summary>🧪 Generate unit tests (beta)</summary> - [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Create PR with unit tests </details> </details> <!-- finishing_touch_checkbox_end --> <!-- tips_start --> --- <sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub> <!-- tips_end --> <!-- internal state start --> <!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpETZWaCrKPR1AGxJcAgrXoO3Nz4FLiQAGYhjNiIBMyQNMzBVC6QtPAUogQU8NIoWPDMaKSMmdTw+FiIDDncuMgAFLaQZgBMAGwAlJCQBgCqiJRcaB7wxLCY5ZCAKASQAMr42BQM3pBF8FiASYQwzqSca9pYs3O41DFc+NxkM5AAwmU0tFytAAwdYC8ArGAAjADs0BeABYOABmVocV4ALR6/RsABkuLBcLhuIgOAB6DFEdSwbACDRMZgY2hUADWzBCGLmE1o+AA7gBZRYYXBWDwxDHcbAeDwYjpuBDIbm8yCZACO2GkYTQ/mQmH4dQqGBGCRISRCzlkGPpITJaQyWRC8nCHmK6Bq+EQ8tFJAAHgAxHzQFBFEo1EjlSo8aiwZCIfCQM0UEoCbDwDy0ZAMBUxEjoexXBjwcK5ejpRD6yJ8DY0ChsdLUeO6ij6jaxT30fDheyyCvxRLcfh8VN2uhrFlhbi+xAaIy3CYYUgyeTcM24bPMDgGKDwjbYO2QBrMMn28LUDSIWCdXxy3RhDG6MC4JJgdJ8Q8QRtnjJLoryNBBT18TCyemwSgkToaO4PPJoSBsAweBJXjSkgLCc8jVSIClD4XAP0YWArWuAQ0EGO9VztddNAADXwgjv0gZkIJ4TJwkoZAoLESA12oMBwjjCII3jNAGBWa10Aweh115GQ2P1AhdEDDx8EuSB32ucg6DoH8bBISVDWQOjUQofAiEQAAaWjsPoxjBm0/SSFBbSKEQWQMAYABufhwhoLAKCAiTcXsbA6QiKJwNZXsZwOBgAHk5kwlSAH0iiYXstx3eY0DYCIzSIH0zI2IgbMkqoSFwbTEHgAAvFL7BqagGFgZivC4+gvLCWJigK6jsgfTJSk9R5AO4ygEkQnEpCwbsEJ/AB1D8sBYdRHm0gQSAmCQKj4TJ1gwZAgJKzBSHoZcyUbNISHXHl6m/XyBo2Ol6UaAA5Eh6TAfzEHCABRXTcAASTdEgNDRH5tKKVcQsKYo3rQ3Bor8KNdGgdVuAAEVvS8wiaBlKBpEheW6TB6GPSBL2PU9z0xo9r1xhpAZKoi5ky5AAFJoDuxkrApvGqdp+mGjR6wEYoJHbUUiQRnYRBumzDz82oMU6ENGjUy8eVuNF8d22qKhcBKiS9T7AxmXEHnxEqLgyBUcrgxKBoAD8AA4XgAcQAIQAam6P7Q3DSNkCEtAJHweAeO0DlMmQKJEFE+kTsWxg0Djeg5DFMTcDABlyHoPq/WyopRXM+skvEbXFu0qJRPEqq/Yc9V8B5gRyvtJ0XXdjk2BHINMvEIdAMGMyeA91k1Q1FJ5BLQTAwA9cKz4XPdg6jMyTVq2prd2bIAwfAaHRfg8G5MIHfjRPRYWl3EOCHKs5GDFFlRPB0BDRx2BsyoPHkXNKALeAixV0sOykF3AwQ+NECTFM007pt6rGjVvoYw4AoBkCrDWMOBBiBkGUK1IkbBWRcF4PwYQWRJB5EjkwOCKg1CaG0EeQwJgoBwFQKgBU0DCCkHIIrdsiD2BcCoPSVyThUjYMUMoVQ6gtA6BAaA0wBgLpXRuvdR6L1/rvUQD8acAAieRBgLCQB8E9WBtCiwBEcEUVI1YkKrWkEYAABsI66t0Ho4QkaQKRPxDGQCIIcaWioD4eEgIYsA4MkjQwoLY7sVA2B5iXCMR+yA3G4EMd0ISmR6qFVqDHD0Gj/6alSJLPIDRw5C1cZODcRJbGxDpHgDEeTKAUHtqyfuiZRC/3bIAlwP44BfxqPAOo+RcBqVoNgDirinrAXEEE3KJAwBzEaXUDxUMMi2KEjzUYtAiymWkPgDwUhtKsykDkcIPccg0AtBxd+nV4w1NkNpT+GV6iuIACRkAkBwamtNDEYkMRcjAVzoC3ISIGdQNl1DoA8AGdAe5jGXUGcM3AoyHQsQmYGeJWytopOQPSXEGw9n5HUI/UY/T6BbQOUuXiowm5oQYH3VxFtMqgpYmdWKJAGidFselNqgwgY/kMd092q4wAOhCEUXAAA1BZF9bHzxYXGEJJihmxNJV4WxgtP6ZI5dklgtjj6rwxMUqIUTxZZzKnkcsNBZS2WbgVNOiR/6apVLXA0mQxA3zqYhBaMSmlhFNAyUOfEuk9NRXlAZor7WjK8boXGZyfXjNos4G+kBJrZnjNK9ezUvQYAxFklEKUMRMG4PIUSOIGBiiAr2SAAx/oYg/B4JsNA7RryWtwGZrV4UISShSgJdIGAX1ZLGiqXEdKxTHPGGIBU3GBu8WrcwlgfAeDzLG3Z0qlAMGDGOvV9pkitSiNyMu8BM3sBRQY3yXrmm+LrR1WUSgniuPcRDLxtiGi4FkFcVxsQchDnCfkVxJjRHmOoJYt6H1DHaWraVIJ6Ej1hL7FAB0y0NX7roFwJlbq+meuBX2hoABtG9KUAC6ZzzzUofQCkRZjxGvWsYYwDkBgOWVA/4cDj7AVbpBRDMFXgqW2MRVh0xYiLF4Y/YRqjYBqiXHbDzHI+tWJkcPQ8hW9qOBUb7ZAAAvJAM5GAeQeAY1gJjz7cOSPY0YOc5BoyDjWlwG2QJ2gYjAK0Iwd1Yh/QQZw0WM1Lq0XCNmfYjIxaOAMPI2RRgIBgCMN9Egv08OAzkQopRKi1HwPllorUeqVpDg3YY3z/nJGA1sfu/02AgghAdVES4zjjVYsQNWkqqTQnGextwG8FBSsE3Gd0SOuY2kdIKrsJtXZnA5SbghEWMY6hLDyE9RkPgLZ3W0nMGwtxIZPRsMsmWDQcvKhGDfboNyrATam62tSeAtVPKCbQDEzAkDtcShsVeuz0uVvbDEf6apS2DWGjAGmK3JsoDS0EUYdBtJfKmZ7IsO8RYTvVcaHSSBTms3tOoOFLkALzwwP0tStEKBqT4Dg+MKY54Lx/E9MIxyFDcRRZUBbt8nn4FXMKwFqnWPqekZ+n01oe3Hs8beWRVMHurYprIhVGBQ20uW6t579hMrWvjIYjgl3SAKpXqfUHdoO1Swkp+QCFaElCQbS1pF5AWHVZbAlaWGKPy3lF29IwRvFFDpHfA5U47EKTunVnP2NY52ZfbIu/EoxV2snXYgTzkAzqVHjA0K2zo7XNImMgeeOl510C5C7ldyirBPW2lO5wM7EUIVQCkzommNh5Bi3pyANtPifGM38MzFnOX0Os5kWzLCdqOa4M59Irn3OecESuFSm5YBBY8yF1RNDwuaLYfIXROe4ut8eu3/lTqhUJkMQb+jZ4cg9W0oY98LFk3oRILYxBaMwC4o3m1jqnXqrpfnSE48VWcYZCqxDCrEL+CrJyEoJFaEMKNiSfIA5S+wCwFK4W7g1PWZuJgCSr+wkA7qNyJR7x44qguLNZIL1AY6QQ7RhwjohIvJWAhQB5zB3S353Inh/7ZTkyuL+R9DQBWAkE4GLyaAqQ0p3ajQojvbrYKThi+xdJnRkHQAhSra2KTRkQlyeyyQwCISibNJfbnaoG0wYE+BYHcELylRg6xA65870ibICbKptiNqnBlzxjhohAbxqQrBixDhqyQxLAFTRpQrKh7adgpQfZhBQr/htQgRSg8CUBgCORYBVTmrQTyCwQdQPJoGSHSH6pNzxabQQz/57gASGJTqejybcD0YRAgbKiiw4hDy8aPyuKtKPi35ASeENC0pVR0CowyzzQlyRo2qdheFiCA7ehg64AYh3wI7pZZSMGUhvxIq8AkAzSLDICtjth3LMCshqE4S2KeGOr0gIFCyco7zxiKqnzrxHJ3YFyQAzRRGeEYwqQMRxiSoZCxCto4r8QEpvKuLrFhCbFGTCRBhiR/4oA1jSqphmQyj0FJAOrexaQeS8gIwRzyCGJmQWQMAKp3GITHanxYq5gfwVEQTtiwp1iJADom7KJm6KwW7HETqiA24om6IO6hBO58BLqu60Tu7iAbpAZJHehga7b1aKAdLkahFt5bgcAi6ID/QJGMaj44Tj5Ljq6MDsBUBorti3Dwjx6/7KoI5RAG7XYygyxzbeijCxAHSkkkbJEUkQbskbgMkcAxGYDpasnKZqmaBbhnrcmGJZE3GDi0BeAtjikYBVRJqlEzQdaIRbSeEHIHQGBabZ66bkY2ymwACcxmvpJe4gZe9AyONmuQ1eDmmWdeLmzAbmCiM4LeWEOEYUbEVo7eneCJoWvedC/e2ig+NYw+nuBgdJj0qZEUnJqWrkGWoQGSMp0B/8FW3hOOqYRASwLaqx/65+5W54V+F+3iH2SQakDpiUsB7ASUh2xx5p5UgBKWji9Zao+YGw1AUQrMvAfB6QTcZ2CSM+zJpACRJaUp9AohLags+2tOQ4ahWRZ8bZcBOa9SQeYQAq/Opy0qcxiBu0I6nUG2RApU0q3Jvik54xixUksq/JMxy8J8rWNarsWAKgAYHIWym8OhTUTA7u8mBU36+Qq8SEogZIOaQ01wAEW0z+KOwow5/BtAthKxlAVSEFpFVRDUQOCh2k9hEFjRD8T8hicwT0UId0cwIUDoT08I2BbUcEnUIspF02oZf4EFVUYAwQuYjFgOvh8EQhFKYa6+gSPygYogyEBU0qmKAOLgRED5DgAggwoEHcFcgeOU+UQ4g5V2FhlQyyKIbE3+CaVhEEpk5klk0ljAXg2pTYk000s8qAshlA8KGEy0XptA8JIWSJM6QkaJieyJlQdu4ejuVYeJ0ebumcuQxZipYgyR25jwEGs+GGbJyZ1A5Z6ZhpS4Eph5aOLCKud5XZV4/ZfZPZQa9Z/Mme2meisWh6NsvpheYApsQZlm5ej+leEZ9mtexEsZ8ZHmiZhgBgJChJkCOAMCOZCSDCyCYoaALCDgA+Ya8gyOVA3CBCfCYAxCYCgh5CjiVCYWuZCgrAjC20pwLEoZ1mZc+ARxJ1+Zh1sWdcF1eCPChC/C8GAA3rIlQLFk9LQLIhwHDfoiFO0H8OEAIKbJ8AIL6QIJ8KCKCLIppLIonMjbIk+jhhTlYh9CTbIjVKEB6cja0H8KTRAszWCCZAzZFi4BTX0IrovEigbgWsjMFaJEcVhVDnZvaDLvssXItFkeAUen2sAUjuvsgKMKuEGKPAoNwAVc2PYIHLWOnKSJgr2PTcjlbBLWSLcCwJ2naOoLIBTYHLIgAL6aSw3w2kCI0U3e1+amxoCvACAximx/BoBoBAj03k0o1U0savpsbSL02M24Cc1Aimzs3cRp2+mk2A1agU0gzChJ7+Jjz/UtanlRD/l2a9ono9VKguX5BTpuQGWIShIpajB/qswhUzxRC0p0GPAaCW2cLW3/W2321eCO0Xou0Mju2e2o0I1I0o3+0hS0A/D+B/CqB/CghoA/ACDR2+gU1x0vrPSJ0/DJ2nBM1Z7I1/DtCZ20Cc1/AZ080D4U0PT2SgzSrCGtZ+KZQdRylY7vKWQciP6GLwbDrBINAAA6siuA0DnQyGiGrSKGAatd3i6A859dDZO6JdFAg9pNVtNtdtSQE9Tt099Is9Xt+ivtS9aNDAk0rQoIpsPwQIrQaA7QUdpNMdlNZO1NCdlOZ9udF9qdV9HAPwjDd9nNPwGNudvNztKN3SrS1JnSX9jZYJGA4QVAN6HSuAvWww9g2Q7YvsCyUgGKEM5qS4ImwK4msGqD4SS+3SKK0GQKYqtjxxJ5NAGIRjiy+yxlD4MsqyKYGy6gKgEYTtgSMs9K5yly1yD2dyDy0TaBdjraTGEmNG4Kxxu10KZjKSPoCEyAKeEwkEvjEkd2Gwjj/JcVQ9SgI9BKRDDtpDKND8jgFD89Pti9rTfm/wLwKgSg7QPwdAps+9CEh9PD8dJ9/D59zgwj5AyNoILwLwEjIjczn0z9+ZFN3SrqLKAy7Kws3KvKbA1OmQY4bEeQ/2FqdhDwyRuihiCahI8q+j+S9RRSCOxqsKzkNaKTNjSQtGG+9gEJ8Yaq5zyRbzyE88fANdDO/aVTJANTY9xDdRcjsirtHtlDC9ftaNfpnoAgtADAq9vp/wQzsAIz2GYzb61ikzl9MzYIQICzsiHNSzQIKzedfNKNhdCYC0DExtMYooQkkG5THqzj3qqDfqt4KDkL3BO0uhSKvsYQuiUar0MaGq6aMek0OIi0eDsiBDo9dTJDU9KNyLc9/t1DHTIUczQIJArwnwJAQI2NnwhLFNCW68GggMFL0zJAyNnwizVLQI3NzLiL8kxznSfRCcVoUBqoY5Hc7jyRUtVxlwXGF65UEb39LcElYQFq6kwE/Sp+YSn+ZWN+/lgBmu1OwQIoP2XSA2Q21O3FY2XBBbPOk2/+ETECyA55h2V5VAGIQEZIAqcF58cBhUesOQVoxxwuBuhiNkqYDZRWBKyki0vWkA/Wg2d0rao242T2zgeh0g7AGrWrtT49CLDrsZLTRr7Ty94IQIEdaAoI7QnwKwgznDB9jTaAP0TrLrgjUznN7DXr7rHAj9MjL9rLe4aF6QuWmukA05KUXA3OLOT2qASgk7DBATqYWqZxjtChradREONaCoKqOYNY88uANkpVpziEVg7MnMLiGw7sMYGqQkGwTdID9OYyfA0DzOtMrO0DHOoaBTXW6+O7w9hD+7k9iLTTzAx7VDp7aNvp7QbE7Q0nDA5rYd9rT7L7AW1ArrnN+L37yN0n/7azKNAtYhSKo7e5vzv+kpxx9HwD5R8YxpZ+HV3VlWV41+54uShWH4ihVZst8LVECtN65QjpJA+ugw/H1Tgn8LwnZD4naLNDsWIU1rQIfw7EczuNaALwynsi+p7eGnIjQI2nv7rQen+dKNAbZonSkBziYASb4HaMuKiUMbJWDnFWXVN+TiyRgFHUY4MQR63+EAv+KWMss5bc+882LigwYByonyrIDWnSu5LJGGrMZTvS4FriARmB2B9jbBJBnBDbBbxBpB5BX6Lkhi+37Bti8HyBytvLlBGg1BJToFXYFFB6oXML4X9TermXR7KLHTxry9LwO0jDLwfT/TJAAjZNj7mX1VBpRL77lLP7pseXdLWdIjvphXqzxXsibLnRpo8Av5YQUb3ogshia3UhG3jdwDBU07+FqbKAqHwOihqAAgshEkKhWhGH6heAAmL3sLOrB7+rM933J76LcXzDdDtASXfwF7rQ7rD7wzjTUP2XsPbryNPwnwiP9LVL/wiPfrFNcw7neQGjLACYwbrie2Qxd3nhrsWaGAXGP8qYmazplRWK9hx5GRoRjY47LSM3eQ0RgVcRCRWFJpVANxQkuRlRrM9pNnylLgRHgteQnhyrDvH8qQ8WlRGxj0WxgwOxjx+xC2mlRxvLpxOkOEmf8Yscsb+Beyymfxlkhi7FGAOFajyVkJrI7YTr0LPPQnDTsiCAv50XbTwvpA8XDAoIfwkvoISg2N4QGX+ptVkUMPDNQjnN3NGv8PbN6PLLsi8kvc7YFXo3VXfb45EHTc4JxvCmbX3oHXfAgQ86dO9RTXvZzn/ZVbX+P+Ytjb9AQ3QksQ4kC565OyKUWPudk/4VVxcUFDDmKTxI9gMkrbJNF2x7btsAISbd4tjkiZolPyYQE7iQTO4RA1IDYXePvnoC+w9oraMFinA9T0AvksFdABZV5RIVfQYaSVk1CjaBdsKoJXxtzze66sROX3Q1hJ0H5+Yge4QC9i8HNgvA/grQPerLyJby9Qo4UOqgvxTqacc6SPe+iIx+BfAium/EGO2AAjAcw2LiKnjT3cY+8SeQReQqclpSGVr8DFBcqgD1haFKm+DATtqy74fcDWqLAfrFyH7CC6AvpCOgIB+C+kXgxNaQQ6yh5z9Fei/D9uoKCH5cfgDDLQYiwHD6IZKLUK5kCRRyt98wYsLijxT4oCUhKIlHIhhHd5mNoGAaCQutwxAaBahnHe7nBWNQMVUA65GaAehzifwKAUVeMDinz6Ep0Bl3E4mESSC2IJasaTga4Ii7d8PBP3STnF0Zb/BQQiwhTp8D+Az8Ih8g+fjl015h14hvpdfjrxRqEUsA14BipSEfz2CVQjgkCo+Waq0QSo+AEjvGAeGDAThZjLFKzDYrGdGQxBM6BwSsD+Qnofw2xKpVW5VDSeZ6CKl0KQAo4wgU+AYSQLKFJA/Uow/6rGm/Ad8uBfPT7g3jE5u1kMAicBNKSgR4BqEcCV6vtX2BKAvqXgH6o/j+oA1ZGwNYcGdQUC4IrqvCIhOtXuqIJ1Av0KMCFFmqXQ6AIUFOlyO5EQBIAvpWgDey+C0BPgtAOZu0HCDb12grNFQOEAYB/BrWaABHiEPmYkBVhoIT4GxBeDiiNqvI3APyMQCCiuiEZEURAi5EbUqEIUbsHGFFGnAaAHoqZuKNhpmhYgVgMOIMFoA+BcA8kKvHQCIb7ZcAdtCCMjReBu1CR21fAK6KDF+YaoXox0foCAA --> <!-- internal state end -->
coderabbitai[bot] (Migrated from github.com) reviewed 2026-05-16 23:35:51 -05:00
coderabbitai[bot] (Migrated from github.com) left a comment

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@make_image.bat`:
- Around line 75-77: Replace the insecure hardcoded "-ExecutionPolicy Bypass"
invocations for launching "%SCRIPT%" with a safer approach: sign
New-OsfExfatImage.ps1 using a code-signing certificate and change the PowerShell
launches in the batch file (the two powershell.exe calls that pass -File
"%SCRIPT%") to use "-ExecutionPolicy RemoteSigned"; if signing cannot be done,
add clear documentation near the "%SCRIPT%" invocation explaining the security
implications of using Bypass and require an explicit opt-in approval step
instead of silently bypassing execution policy.

In `@mkexfat_macos.sh`:
- Around line 76-79: Add an explicit validation step before normalizing OUTPUT:
check the parent directory of OUTPUT (derived via dirname "$OUTPUT") exists and
is writable; if it does not, print a clear error message referencing OUTPUT and
exit non-zero instead of letting the subsequent cd fail. Implement this
validation right before the OUTPUT="$(cd ...)" normalization and keep the OUTPUT
variable name and the dirname/"basename" approach so the check targets the same
path used for normalization.

In `@mkexfat.sh`:
- Around line 84-87: The current check only verifies TMP_BASE exists; change it
to validate that TMP_BASE is both writable and searchable/executable so mktemp
and child processes can create files there: update the directory check around
TMP_BASE to assert -d, -w and -x (or attempt a safe mktemp creation) and, on
failure, emit a clear error mentioning missing write/execute permissions for
TMP_BASE and exit 1; reference the TMP_BASE variable and the mktemp usage in the
script when implementing the check.

In `@New-OsfExfatImage.ps1`:
- Around line 140-149: The Initialize-ScriptTempDir function currently only
checks existence; update it to fail fast on non-writable directories by
attempting a safe write/delete in $resolved (e.g., create and remove a small
temp marker file) and throw a clear error if that operation fails; keep the
existing Resolve-Path, $script:ScriptTempDir assignment and env:TEMP/TMP updates
but perform the write-check before setting those and before continuing, and
ensure the thrown message mentions the directory and that it is not writable to
aid debugging.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c0061dd0-8ac7-44cf-9c95-cd3cc12002a5

📥 Commits

Reviewing files that changed from the base of the PR and between 8622d8757f and 9d6505d5d3.

📒 Files selected for processing (4)
  • New-OsfExfatImage.ps1
  • make_image.bat
  • mkexfat.sh
  • mkexfat_macos.sh
**Actionable comments posted: 4** <details> <summary>🤖 Prompt for all review comments with AI agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. Inline comments: In `@make_image.bat`: - Around line 75-77: Replace the insecure hardcoded "-ExecutionPolicy Bypass" invocations for launching "%SCRIPT%" with a safer approach: sign New-OsfExfatImage.ps1 using a code-signing certificate and change the PowerShell launches in the batch file (the two powershell.exe calls that pass -File "%SCRIPT%") to use "-ExecutionPolicy RemoteSigned"; if signing cannot be done, add clear documentation near the "%SCRIPT%" invocation explaining the security implications of using Bypass and require an explicit opt-in approval step instead of silently bypassing execution policy. In `@mkexfat_macos.sh`: - Around line 76-79: Add an explicit validation step before normalizing OUTPUT: check the parent directory of OUTPUT (derived via dirname "$OUTPUT") exists and is writable; if it does not, print a clear error message referencing OUTPUT and exit non-zero instead of letting the subsequent cd fail. Implement this validation right before the OUTPUT="$(cd ...)" normalization and keep the OUTPUT variable name and the dirname/"basename" approach so the check targets the same path used for normalization. In `@mkexfat.sh`: - Around line 84-87: The current check only verifies TMP_BASE exists; change it to validate that TMP_BASE is both writable and searchable/executable so mktemp and child processes can create files there: update the directory check around TMP_BASE to assert -d, -w and -x (or attempt a safe mktemp creation) and, on failure, emit a clear error mentioning missing write/execute permissions for TMP_BASE and exit 1; reference the TMP_BASE variable and the mktemp usage in the script when implementing the check. In `@New-OsfExfatImage.ps1`: - Around line 140-149: The Initialize-ScriptTempDir function currently only checks existence; update it to fail fast on non-writable directories by attempting a safe write/delete in $resolved (e.g., create and remove a small temp marker file) and throw a clear error if that operation fails; keep the existing Resolve-Path, $script:ScriptTempDir assignment and env:TEMP/TMP updates but perform the write-check before setting those and before continuing, and ensure the thrown message mentions the directory and that it is not writable to aid debugging. ``` </details> <details> <summary>🪄 Autofix (Beta)</summary> Fix all unresolved CodeRabbit comments on this PR: - [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended) - [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes </details> --- <details> <summary>ℹ️ Review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro Plus **Run ID**: `c0061dd0-8ac7-44cf-9c95-cd3cc12002a5` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 8622d8757fe29a153c519c4e13e0b127d6881125 and 9d6505d5d306f3a627abfc7e4a840300e5735ac0. </details> <details> <summary>📒 Files selected for processing (4)</summary> * `New-OsfExfatImage.ps1` * `make_image.bat` * `mkexfat.sh` * `mkexfat_macos.sh` </details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
coderabbitai[bot] (Migrated from github.com) commented 2026-05-16 23:35:50 -05:00

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fail fast when -TempDir is not writable.

The current check only verifies directory existence. If the directory exists but isn’t writable, the script fails later during formatting/log redirection with a less actionable error.

💡 Proposed fix
 function Initialize-ScriptTempDir([string]$dir) {
   if ([string]::IsNullOrWhiteSpace($dir)) { return }
   $resolved = $dir.Trim()
   if (-not (Test-Path -LiteralPath $resolved -PathType Container)) {
     throw "Temp directory not found: $resolved"
   }
   $script:ScriptTempDir = (Resolve-Path -LiteralPath $resolved).Path
+  $probe = Join-Path $script:ScriptTempDir ([System.IO.Path]::GetRandomFileName())
+  try {
+    Set-Content -LiteralPath $probe -Value "" -NoNewline
+    Remove-Item -LiteralPath $probe -Force -ErrorAction SilentlyContinue
+  } catch {
+    throw "Temp directory is not writable: $script:ScriptTempDir"
+  }
   $env:TEMP = $script:ScriptTempDir
   $env:TMP = $script:ScriptTempDir
   Write-Host "[Info] Temp directory: $script:ScriptTempDir"
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

function Initialize-ScriptTempDir([string]$dir) {
  if ([string]::IsNullOrWhiteSpace($dir)) { return }
  $resolved = $dir.Trim()
  if (-not (Test-Path -LiteralPath $resolved -PathType Container)) {
    throw "Temp directory not found: $resolved"
  }
  $script:ScriptTempDir = (Resolve-Path -LiteralPath $resolved).Path
  $probe = Join-Path $script:ScriptTempDir ([System.IO.Path]::GetRandomFileName())
  try {
    Set-Content -LiteralPath $probe -Value "" -NoNewline
    Remove-Item -LiteralPath $probe -Force -ErrorAction SilentlyContinue
  } catch {
    throw "Temp directory is not writable: $script:ScriptTempDir"
  }
  $env:TEMP = $script:ScriptTempDir
  $env:TMP = $script:ScriptTempDir
  Write-Host "[Info] Temp directory: $script:ScriptTempDir"
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@New-OsfExfatImage.ps1` around lines 140 - 149, The Initialize-ScriptTempDir
function currently only checks existence; update it to fail fast on non-writable
directories by attempting a safe write/delete in $resolved (e.g., create and
remove a small temp marker file) and throw a clear error if that operation
fails; keep the existing Resolve-Path, $script:ScriptTempDir assignment and
env:TEMP/TMP updates but perform the write-check before setting those and before
continuing, and ensure the thrown message mentions the directory and that it is
not writable to aid debugging.

✅ Addressed in commit b45396c

_⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_ **Fail fast when `-TempDir` is not writable.** The current check only verifies directory existence. If the directory exists but isn’t writable, the script fails later during formatting/log redirection with a less actionable error. <details> <summary>💡 Proposed fix</summary> ```diff function Initialize-ScriptTempDir([string]$dir) { if ([string]::IsNullOrWhiteSpace($dir)) { return } $resolved = $dir.Trim() if (-not (Test-Path -LiteralPath $resolved -PathType Container)) { throw "Temp directory not found: $resolved" } $script:ScriptTempDir = (Resolve-Path -LiteralPath $resolved).Path + $probe = Join-Path $script:ScriptTempDir ([System.IO.Path]::GetRandomFileName()) + try { + Set-Content -LiteralPath $probe -Value "" -NoNewline + Remove-Item -LiteralPath $probe -Force -ErrorAction SilentlyContinue + } catch { + throw "Temp directory is not writable: $script:ScriptTempDir" + } $env:TEMP = $script:ScriptTempDir $env:TMP = $script:ScriptTempDir Write-Host "[Info] Temp directory: $script:ScriptTempDir" } ``` </details> <!-- suggestion_start --> <details> <summary>📝 Committable suggestion</summary> > ‼️ **IMPORTANT** > Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements. ```suggestion function Initialize-ScriptTempDir([string]$dir) { if ([string]::IsNullOrWhiteSpace($dir)) { return } $resolved = $dir.Trim() if (-not (Test-Path -LiteralPath $resolved -PathType Container)) { throw "Temp directory not found: $resolved" } $script:ScriptTempDir = (Resolve-Path -LiteralPath $resolved).Path $probe = Join-Path $script:ScriptTempDir ([System.IO.Path]::GetRandomFileName()) try { Set-Content -LiteralPath $probe -Value "" -NoNewline Remove-Item -LiteralPath $probe -Force -ErrorAction SilentlyContinue } catch { throw "Temp directory is not writable: $script:ScriptTempDir" } $env:TEMP = $script:ScriptTempDir $env:TMP = $script:ScriptTempDir Write-Host "[Info] Temp directory: $script:ScriptTempDir" } ``` </details> <!-- suggestion_end --> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@New-OsfExfatImage.ps1` around lines 140 - 149, The Initialize-ScriptTempDir function currently only checks existence; update it to fail fast on non-writable directories by attempting a safe write/delete in $resolved (e.g., create and remove a small temp marker file) and throw a clear error if that operation fails; keep the existing Resolve-Path, $script:ScriptTempDir assignment and env:TEMP/TMP updates but perform the write-check before setting those and before continuing, and ensure the thrown message mentions the directory and that it is not writable to aid debugging. ``` </details> <!-- fingerprinting:phantom:poseidon:hawk --> <!-- This is an auto-generated comment by CodeRabbit --> ✅ Addressed in commit b45396c
@ -29,10 +61,21 @@ if not exist "%SRCDIR%\eboot.bin" (
exit /b 4
coderabbitai[bot] (Migrated from github.com) commented 2026-05-16 23:35:50 -05:00

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

Is using powershell.exe -ExecutionPolicy Bypass recommended for automation scripts, and what safer alternatives does Microsoft recommend?

💡 Result:

Using powershell.exe -ExecutionPolicy Bypass is generally not recommended as a standard practice for automation scripts because it explicitly instructs PowerShell to ignore all security policies, including signature verification [1][2]. While it is a common method to resolve script execution errors, it should be used with caution and only when you fully trust the script being executed [1][2]. It is important to understand that PowerShell execution policies are not a security boundary; they are safety features designed to prevent accidental execution of scripts [3][2]. They do not prevent a determined user or attacker from running malicious code, as there are many ways to circumvent these policies [3][4]. Microsoft and security professionals recommend the following safer alternatives for automation: 1. Use RemoteSigned: This is the recommended policy for most environments [5]. It allows scripts created on the local machine to run without restriction, while requiring that scripts downloaded from the internet (or other remote locations) be digitally signed by a trusted publisher [3][5]. 2. Digitally Sign Your Scripts: For production, enterprise, or CI/CD environments, the most secure approach is to sign your automation scripts with a code-signing certificate [5]. This allows you to enforce a stricter policy, such as AllSigned, ensuring that only verified, trusted code can execute [5]. 3. Use the Process Scope: If you must bypass the policy for a specific, trusted automation task, you can set the execution policy for the current process only, rather than globally [6][7]. This limits the exposure to the duration of that specific script execution [8][7]. You can do this by using: powershell.exe -ExecutionPolicy RemoteSigned -Scope Process -File script.ps1 4. Implement Defense-in-Depth: Because execution policies are not a security boundary, rely on broader security controls such as AppLocker, Windows Defender Application Control (WDAC), and monitoring tools (e.g., AMSI, logging) to detect and block malicious activity, rather than relying on the execution policy alone [9][10]. In summary, while -ExecutionPolicy Bypass is a functional way to run scripts, it removes a layer of safety. Prioritize signing your scripts and using the RemoteSigned policy to maintain a balance between security and operational requirements [5][2].

Citations:


🏁 Script executed:

git ls-files make_image.bat

Repository: drakmor/ShadowMountPlus

Length of output: 82


🏁 Script executed:

cat -n make_image.bat | head -100

Repository: drakmor/ShadowMountPlus

Length of output: 3173


🏁 Script executed:

# Search for any execution policy handling earlier in the file
rg "ExecutionPolicy|powershell" make_image.bat -A 2 -B 2

Repository: drakmor/ShadowMountPlus

Length of output: 378


🏁 Script executed:

# Check if the PowerShell script exists and look for any signing info
fd "New-OsfExfatImage.ps1"

Repository: drakmor/ShadowMountPlus

Length of output: 89


🏁 Script executed:

# Check for any documentation about execution policy or script signing
rg "ExecutionPolicy|signing|signed|certificate" --type txt --type md

Repository: drakmor/ShadowMountPlus

Length of output: 294


🏁 Script executed:

# Look for any CI/CD or build documentation that might explain the bypass requirement
fd "README|CONTRIBUTING|BUILD|\.github" --type f

Repository: drakmor/ShadowMountPlus

Length of output: 77


🏁 Script executed:

# Read README to understand the context of the documented Bypass usage
cat -n README.md | grep -A 10 -B 10 "ExecutionPolicy Bypass"

Repository: drakmor/ShadowMountPlus

Length of output: 1154


Use script signing and RemoteSigned policy instead of hardcoding -ExecutionPolicy Bypass.

Microsoft guidance confirms that -ExecutionPolicy Bypass should not be standard practice. However, simply removing it would break the documented usage pattern. The recommended approach is to digitally sign New-OsfExfatImage.ps1 with a code-signing certificate and use -ExecutionPolicy RemoteSigned instead, which maintains security while allowing locally-created scripts to run. If signing is not feasible, document the security implications of the Bypass decision.

🧰 Tools
🪛 Blinter (1.0.112)

[error] 75-75: PowerShell execution policy bypass. Explanation: Bypassing PowerShell execution policy can allow malicious scripts to run. Recommendation: Avoid using -ExecutionPolicy Bypass unless absolutely necessary. Context: PowerShell execution policy bypass detected

(SEC009)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@make_image.bat` around lines 75 - 77, Replace the insecure hardcoded
"-ExecutionPolicy Bypass" invocations for launching "%SCRIPT%" with a safer
approach: sign New-OsfExfatImage.ps1 using a code-signing certificate and change
the PowerShell launches in the batch file (the two powershell.exe calls that
pass -File "%SCRIPT%") to use "-ExecutionPolicy RemoteSigned"; if signing cannot
be done, add clear documentation near the "%SCRIPT%" invocation explaining the
security implications of using Bypass and require an explicit opt-in approval
step instead of silently bypassing execution policy.

✅ Addressed in commit b45396c

_⚠️ Potential issue_ | _🟠 Major_ | _⚡ Quick win_ <details> <summary>🧩 Analysis chain</summary> 🌐 Web query: `Is using `powershell.exe -ExecutionPolicy Bypass` recommended for automation scripts, and what safer alternatives does Microsoft recommend?` 💡 Result: Using powershell.exe -ExecutionPolicy Bypass is generally not recommended as a standard practice for automation scripts because it explicitly instructs PowerShell to ignore all security policies, including signature verification [1][2]. While it is a common method to resolve script execution errors, it should be used with caution and only when you fully trust the script being executed [1][2]. It is important to understand that PowerShell execution policies are not a security boundary; they are safety features designed to prevent accidental execution of scripts [3][2]. They do not prevent a determined user or attacker from running malicious code, as there are many ways to circumvent these policies [3][4]. Microsoft and security professionals recommend the following safer alternatives for automation: 1. Use RemoteSigned: This is the recommended policy for most environments [5]. It allows scripts created on the local machine to run without restriction, while requiring that scripts downloaded from the internet (or other remote locations) be digitally signed by a trusted publisher [3][5]. 2. Digitally Sign Your Scripts: For production, enterprise, or CI/CD environments, the most secure approach is to sign your automation scripts with a code-signing certificate [5]. This allows you to enforce a stricter policy, such as AllSigned, ensuring that only verified, trusted code can execute [5]. 3. Use the Process Scope: If you must bypass the policy for a specific, trusted automation task, you can set the execution policy for the current process only, rather than globally [6][7]. This limits the exposure to the duration of that specific script execution [8][7]. You can do this by using: powershell.exe -ExecutionPolicy RemoteSigned -Scope Process -File script.ps1 4. Implement Defense-in-Depth: Because execution policies are not a security boundary, rely on broader security controls such as AppLocker, Windows Defender Application Control (WDAC), and monitoring tools (e.g., AMSI, logging) to detect and block malicious activity, rather than relying on the execution policy alone [9][10]. In summary, while -ExecutionPolicy Bypass is a functional way to run scripts, it removes a layer of safety. Prioritize signing your scripts and using the RemoteSigned policy to maintain a balance between security and operational requirements [5][2]. Citations: - 1: http://shop.r.avlandesign.com/guides/browser-issues/how-to-run-powershell-scripts-with-bypass-execution-policy-69fc1f024559036ad1a7ddff.html - 2: http://www.thenewbeatmaker.com/guides/windows-fixes/powershell-execution-policy-bypass-vs-unrestricted-69fc19d14559036ad1a7dd04.html - 3: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.6 - 4: https://www.netspi.com/blog/technical-blog/network-pentesting/15-ways-to-bypass-the-powershell-execution-policy/ - 5: http://www.q.accessgcc.com/guides/macos-help/powershell-execution-policy-best-practices-69fc1a964559036ad1a7dd2e.html - 6: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7.6 - 7: https://stackoverflow.com/questions/67270197/windows-powershell-policy-execution-bypass - 8: https://stackoverflow.com/questions/67270197/windows-powershell-policy-execution-bypass/67270549 - 9: https://www.paloaltonetworks.com/blog/security-operations/stopping-powershell-without-powershell/ - 10: https://www.microsoft.com/en-us/security/blog/2026/05/14/defense-in-depth-autonomous-ai-agents/ --- 🏁 Script executed: ```shell git ls-files make_image.bat ``` Repository: drakmor/ShadowMountPlus Length of output: 82 --- 🏁 Script executed: ```shell cat -n make_image.bat | head -100 ``` Repository: drakmor/ShadowMountPlus Length of output: 3173 --- 🏁 Script executed: ```shell # Search for any execution policy handling earlier in the file rg "ExecutionPolicy|powershell" make_image.bat -A 2 -B 2 ``` Repository: drakmor/ShadowMountPlus Length of output: 378 --- 🏁 Script executed: ```shell # Check if the PowerShell script exists and look for any signing info fd "New-OsfExfatImage.ps1" ``` Repository: drakmor/ShadowMountPlus Length of output: 89 --- 🏁 Script executed: ```shell # Check for any documentation about execution policy or script signing rg "ExecutionPolicy|signing|signed|certificate" --type txt --type md ``` Repository: drakmor/ShadowMountPlus Length of output: 294 --- 🏁 Script executed: ```shell # Look for any CI/CD or build documentation that might explain the bypass requirement fd "README|CONTRIBUTING|BUILD|\.github" --type f ``` Repository: drakmor/ShadowMountPlus Length of output: 77 --- 🏁 Script executed: ```shell # Read README to understand the context of the documented Bypass usage cat -n README.md | grep -A 10 -B 10 "ExecutionPolicy Bypass" ``` Repository: drakmor/ShadowMountPlus Length of output: 1154 --- </details> **Use script signing and `RemoteSigned` policy instead of hardcoding `-ExecutionPolicy Bypass`.** Microsoft guidance confirms that `-ExecutionPolicy Bypass` should not be standard practice. However, simply removing it would break the documented usage pattern. The recommended approach is to digitally sign `New-OsfExfatImage.ps1` with a code-signing certificate and use `-ExecutionPolicy RemoteSigned` instead, which maintains security while allowing locally-created scripts to run. If signing is not feasible, document the security implications of the Bypass decision. <details> <summary>🧰 Tools</summary> <details> <summary>🪛 Blinter (1.0.112)</summary> [error] 75-75: PowerShell execution policy bypass. Explanation: Bypassing PowerShell execution policy can allow malicious scripts to run. Recommendation: Avoid using -ExecutionPolicy Bypass unless absolutely necessary. Context: PowerShell execution policy bypass detected (SEC009) </details> </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@make_image.bat` around lines 75 - 77, Replace the insecure hardcoded "-ExecutionPolicy Bypass" invocations for launching "%SCRIPT%" with a safer approach: sign New-OsfExfatImage.ps1 using a code-signing certificate and change the PowerShell launches in the batch file (the two powershell.exe calls that pass -File "%SCRIPT%") to use "-ExecutionPolicy RemoteSigned"; if signing cannot be done, add clear documentation near the "%SCRIPT%" invocation explaining the security implications of using Bypass and require an explicit opt-in approval step instead of silently bypassing execution policy. ``` </details> <!-- fingerprinting:phantom:poseidon:hawk --> <!-- This is an auto-generated comment by CodeRabbit --> ✅ Addressed in commit b45396c
@ -95,0 +165,4 @@
}
trap cleanup EXIT INT TERM
coderabbitai[bot] (Migrated from github.com) commented 2026-05-16 23:35:50 -05:00

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Validate temp-directory permissions, not just existence.

A directory can exist but still be unusable for mktemp (missing write/execute perms), which leads to a later opaque failure.

💡 Proposed fix
 if [ ! -d "$TMP_BASE" ]; then
     echo "Error: temp directory not found: $TMP_BASE"
     exit 1
 fi
+if [ ! -w "$TMP_BASE" ] || [ ! -x "$TMP_BASE" ]; then
+    echo "Error: temp directory is not writable/executable: $TMP_BASE"
+    exit 1
+fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

if [ ! -d "$TMP_BASE" ]; then
    echo "Error: temp directory not found: $TMP_BASE"
    exit 1
fi
if [ ! -w "$TMP_BASE" ] || [ ! -x "$TMP_BASE" ]; then
    echo "Error: temp directory is not writable/executable: $TMP_BASE"
    exit 1
fi
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mkexfat.sh` around lines 84 - 87, The current check only verifies TMP_BASE
exists; change it to validate that TMP_BASE is both writable and
searchable/executable so mktemp and child processes can create files there:
update the directory check around TMP_BASE to assert -d, -w and -x (or attempt a
safe mktemp creation) and, on failure, emit a clear error mentioning missing
write/execute permissions for TMP_BASE and exit 1; reference the TMP_BASE
variable and the mktemp usage in the script when implementing the check.

✅ Addressed in commit b45396c

_⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_ **Validate temp-directory permissions, not just existence.** A directory can exist but still be unusable for `mktemp` (missing write/execute perms), which leads to a later opaque failure. <details> <summary>💡 Proposed fix</summary> ```diff if [ ! -d "$TMP_BASE" ]; then echo "Error: temp directory not found: $TMP_BASE" exit 1 fi +if [ ! -w "$TMP_BASE" ] || [ ! -x "$TMP_BASE" ]; then + echo "Error: temp directory is not writable/executable: $TMP_BASE" + exit 1 +fi ``` </details> <!-- suggestion_start --> <details> <summary>📝 Committable suggestion</summary> > ‼️ **IMPORTANT** > Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements. ```suggestion if [ ! -d "$TMP_BASE" ]; then echo "Error: temp directory not found: $TMP_BASE" exit 1 fi if [ ! -w "$TMP_BASE" ] || [ ! -x "$TMP_BASE" ]; then echo "Error: temp directory is not writable/executable: $TMP_BASE" exit 1 fi ``` </details> <!-- suggestion_end --> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@mkexfat.sh` around lines 84 - 87, The current check only verifies TMP_BASE exists; change it to validate that TMP_BASE is both writable and searchable/executable so mktemp and child processes can create files there: update the directory check around TMP_BASE to assert -d, -w and -x (or attempt a safe mktemp creation) and, on failure, emit a clear error mentioning missing write/execute permissions for TMP_BASE and exit 1; reference the TMP_BASE variable and the mktemp usage in the script when implementing the check. ``` </details> <!-- fingerprinting:phantom:poseidon:hawk --> <!-- This is an auto-generated comment by CodeRabbit --> ✅ Addressed in commit b45396c
coderabbitai[bot] (Migrated from github.com) commented 2026-05-16 23:35:50 -05:00

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add explicit output-directory validation before path normalization.

With set -e, a missing parent directory causes an abrupt cd failure. Emit a clear error before converting to absolute path.

💡 Proposed fix
 OUTPUT="${OUTPUT:-test.exfat}"
 # newfs_exfat interprets relative paths as device names under /dev/ — resolve to absolute
-OUTPUT="$(cd "$(dirname "$OUTPUT")" && pwd)/$(basename "$OUTPUT")"
+OUT_DIR="$(dirname "$OUTPUT")"
+if [ ! -d "$OUT_DIR" ]; then
+    echo "Error: output directory not found: $OUT_DIR"
+    exit 1
+fi
+OUTPUT="$(cd "$OUT_DIR" && pwd)/$(basename "$OUTPUT")"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

OUTPUT="${OUTPUT:-test.exfat}"
# newfs_exfat interprets relative paths as device names under /dev/ — resolve to absolute
OUT_DIR="$(dirname "$OUTPUT")"
if [ ! -d "$OUT_DIR" ]; then
    echo "Error: output directory not found: $OUT_DIR"
    exit 1
fi
OUTPUT="$(cd "$OUT_DIR" && pwd)/$(basename "$OUTPUT")"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mkexfat_macos.sh` around lines 76 - 79, Add an explicit validation step
before normalizing OUTPUT: check the parent directory of OUTPUT (derived via
dirname "$OUTPUT") exists and is writable; if it does not, print a clear error
message referencing OUTPUT and exit non-zero instead of letting the subsequent
cd fail. Implement this validation right before the OUTPUT="$(cd ...)"
normalization and keep the OUTPUT variable name and the dirname/"basename"
approach so the check targets the same path used for normalization.

✅ Addressed in commit b45396c

_⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_ **Add explicit output-directory validation before path normalization.** With `set -e`, a missing parent directory causes an abrupt `cd` failure. Emit a clear error before converting to absolute path. <details> <summary>💡 Proposed fix</summary> ```diff OUTPUT="${OUTPUT:-test.exfat}" # newfs_exfat interprets relative paths as device names under /dev/ — resolve to absolute -OUTPUT="$(cd "$(dirname "$OUTPUT")" && pwd)/$(basename "$OUTPUT")" +OUT_DIR="$(dirname "$OUTPUT")" +if [ ! -d "$OUT_DIR" ]; then + echo "Error: output directory not found: $OUT_DIR" + exit 1 +fi +OUTPUT="$(cd "$OUT_DIR" && pwd)/$(basename "$OUTPUT")" ``` </details> <!-- suggestion_start --> <details> <summary>📝 Committable suggestion</summary> > ‼️ **IMPORTANT** > Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements. ```suggestion OUTPUT="${OUTPUT:-test.exfat}" # newfs_exfat interprets relative paths as device names under /dev/ — resolve to absolute OUT_DIR="$(dirname "$OUTPUT")" if [ ! -d "$OUT_DIR" ]; then echo "Error: output directory not found: $OUT_DIR" exit 1 fi OUTPUT="$(cd "$OUT_DIR" && pwd)/$(basename "$OUTPUT")" ``` </details> <!-- suggestion_end --> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@mkexfat_macos.sh` around lines 76 - 79, Add an explicit validation step before normalizing OUTPUT: check the parent directory of OUTPUT (derived via dirname "$OUTPUT") exists and is writable; if it does not, print a clear error message referencing OUTPUT and exit non-zero instead of letting the subsequent cd fail. Implement this validation right before the OUTPUT="$(cd ...)" normalization and keep the OUTPUT variable name and the dirname/"basename" approach so the check targets the same path used for normalization. ``` </details> <!-- fingerprinting:phantom:poseidon:hawk --> <!-- This is an auto-generated comment by CodeRabbit --> ✅ Addressed in commit b45396c
This pull request is broken due to missing fork information.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin 'ali-ghanati/main:ali-ghanati/main'
git switch 'ali-ghanati/main'

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch 'main'
git merge --no-ff 'ali-ghanati/main'
git switch 'ali-ghanati/main'
git rebase 'main'
git switch 'main'
git merge --ff-only 'ali-ghanati/main'
git switch 'ali-ghanati/main'
git rebase 'main'
git switch 'main'
git merge --no-ff 'ali-ghanati/main'
git switch 'main'
git merge --squash 'ali-ghanati/main'
git switch 'main'
git merge --ff-only 'ali-ghanati/main'
git switch 'main'
git merge 'ali-ghanati/main'
git push origin 'main'
Sign in to join this conversation.
No description provided.