mirror of
https://github.com/coder/registry.git
synced 2026-06-02 20:48:14 +00:00
fix(coder/modules/dotfiles): allow tilde in DOTFILES_URI shell validation (#904)
Fixes https://github.com/coder/registry/issues/762 ## Problem The shell-side URI validation regex in `run.sh` did not include `~` in the allowed character set. URLs containing tilde paths (common in Bitbucket Server personal repositories, e.g. `ssh://git@bitbucket.example.org:7999/~user/repo.git`) were rejected at runtime with `ERROR: DOTFILES_URI contains invalid characters`. The Terraform-side validations in `main.tf` already allowed `~`, so the inconsistency only surfaced when the script actually ran in a workspace. ## Changes - **`run.sh`**: Added `~` to the character class in the shell validation regex, making it consistent with the three Terraform regex patterns in `main.tf`. - **`main.test.ts`**: The "accepts valid git URL formats" test now also executes the rendered shell script and asserts that the shell-side validation does not reject any of the valid URLs. This closes the coverage gap that let the Terraform/shell inconsistency go undetected. > 🤖 Generated by Coder Agents --------- Authored-by: Jay Kumar <jay.kumar@coder.com>
This commit is contained in:
@@ -18,7 +18,7 @@ Under the hood, this module uses the [coder dotfiles](https://coder.com/docs/v2/
|
|||||||
module "dotfiles" {
|
module "dotfiles" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/dotfiles/coder"
|
source = "registry.coder.com/coder/dotfiles/coder"
|
||||||
version = "1.4.1"
|
version = "1.4.2"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -31,7 +31,7 @@ module "dotfiles" {
|
|||||||
module "dotfiles" {
|
module "dotfiles" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/dotfiles/coder"
|
source = "registry.coder.com/coder/dotfiles/coder"
|
||||||
version = "1.4.1"
|
version = "1.4.2"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -42,7 +42,7 @@ module "dotfiles" {
|
|||||||
module "dotfiles" {
|
module "dotfiles" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/dotfiles/coder"
|
source = "registry.coder.com/coder/dotfiles/coder"
|
||||||
version = "1.4.1"
|
version = "1.4.2"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
user = "root"
|
user = "root"
|
||||||
}
|
}
|
||||||
@@ -54,14 +54,14 @@ module "dotfiles" {
|
|||||||
module "dotfiles" {
|
module "dotfiles" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/dotfiles/coder"
|
source = "registry.coder.com/coder/dotfiles/coder"
|
||||||
version = "1.4.1"
|
version = "1.4.2"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
}
|
}
|
||||||
|
|
||||||
module "dotfiles-root" {
|
module "dotfiles-root" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/dotfiles/coder"
|
source = "registry.coder.com/coder/dotfiles/coder"
|
||||||
version = "1.4.1"
|
version = "1.4.2"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
user = "root"
|
user = "root"
|
||||||
dotfiles_uri = module.dotfiles.dotfiles_uri
|
dotfiles_uri = module.dotfiles.dotfiles_uri
|
||||||
@@ -90,7 +90,7 @@ You can set a default dotfiles repository for all users by setting the `default_
|
|||||||
module "dotfiles" {
|
module "dotfiles" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/dotfiles/coder"
|
source = "registry.coder.com/coder/dotfiles/coder"
|
||||||
version = "1.4.1"
|
version = "1.4.2"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
default_dotfiles_uri = "https://github.com/coder/dotfiles"
|
default_dotfiles_uri = "https://github.com/coder/dotfiles"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import { describe, expect, it } from "bun:test";
|
import { describe, expect, it } from "bun:test";
|
||||||
import {
|
import {
|
||||||
|
findResourceInstance,
|
||||||
runTerraformApply,
|
runTerraformApply,
|
||||||
runTerraformInit,
|
runTerraformInit,
|
||||||
testRequiredVariables,
|
testRequiredVariables,
|
||||||
} from "~test";
|
} from "~test";
|
||||||
|
import { readableStreamToText, spawn } from "bun";
|
||||||
|
|
||||||
describe("dotfiles", async () => {
|
describe("dotfiles", async () => {
|
||||||
await runTerraformInit(import.meta.dir);
|
await runTerraformInit(import.meta.dir);
|
||||||
@@ -34,6 +36,24 @@ describe("dotfiles", async () => {
|
|||||||
dotfiles_uri: url,
|
dotfiles_uri: url,
|
||||||
});
|
});
|
||||||
expect(state.outputs.dotfiles_uri.value).toBe(url);
|
expect(state.outputs.dotfiles_uri.value).toBe(url);
|
||||||
|
|
||||||
|
// Run the rendered shell script to verify the shell-side URI
|
||||||
|
// validation also accepts the URL. The script will fail later
|
||||||
|
// (no coder binary available), but it must not fail at the
|
||||||
|
// URI validation step.
|
||||||
|
const instance = findResourceInstance(state, "coder_script");
|
||||||
|
const proc = spawn(["bash", "-c", instance.script], {
|
||||||
|
stdout: "pipe",
|
||||||
|
stderr: "pipe",
|
||||||
|
});
|
||||||
|
const stderr = await readableStreamToText(proc.stderr);
|
||||||
|
await proc.exited;
|
||||||
|
expect(stderr).not.toContain(
|
||||||
|
"ERROR: DOTFILES_URI contains invalid characters",
|
||||||
|
);
|
||||||
|
expect(stderr).not.toContain(
|
||||||
|
"ERROR: DOTFILES_URI must be a valid repository URL",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ DOTFILES_BRANCH="${DOTFILES_BRANCH}"
|
|||||||
# Validate DOTFILES_URI to prevent command injection (defense in depth)
|
# Validate DOTFILES_URI to prevent command injection (defense in depth)
|
||||||
if [ -n "$DOTFILES_URI" ]; then
|
if [ -n "$DOTFILES_URI" ]; then
|
||||||
# shellcheck disable=SC2250
|
# shellcheck disable=SC2250
|
||||||
if [[ "$DOTFILES_URI" =~ [^a-zA-Z0-9._/:@-] ]]; then
|
if [[ "$DOTFILES_URI" =~ [^a-zA-Z0-9._/:@~-] ]]; then
|
||||||
echo "ERROR: DOTFILES_URI contains invalid characters" >&2
|
echo "ERROR: DOTFILES_URI contains invalid characters" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user