Skip to content

Project and workspace APIs should reject paths with . or .. segments #80

@alexrp

Description

var path = "src";
if (root.TryGetProperty("path"u8, out var pathProp))
{
if (pathProp.ValueKind != JsonValueKind.String)
Error("'path' property, if present, must be a string.");
path = Path.TrimEndingDirectorySeparator(pathProp.GetString()!);
if (Path.IsPathFullyQualified(path))
Error("'path' property, if present, must be relative.");
// TODO: It would be good to verify that the path does not contain any . or .. segments.
}

var paths = ImmutableDictionary<ModulePath, string>.Empty;
if (root.TryGetProperty("paths"u8, out var pathsProp))
{
if (pathsProp.ValueKind != JsonValueKind.Object)
Error("'paths' property, if present, must be an object.");
foreach (var prop in pathsProp.EnumerateObject())
{
if (!ModulePath.TryCreate(prop.Name, out var modPath))
Error($"Module path '{prop.Name}' is invalid.");
if (paths.ContainsKey(modPath))
Error($"Module path '{prop.Name}' has multiple entries.");
var value = prop.Value;
if (value.ValueKind != JsonValueKind.String)
Error($"Directory path for module path '{prop.Name}' must be a string.");
var dir = Path.TrimEndingDirectorySeparator(value.GetString()!);
if (Path.IsPathFullyQualified(dir))
Error($"Directory path for module path '{prop.Name}' must be relative.");
// TODO: It would be good to verify that the path does not contain any . or .. segments.
paths = paths.SetItem(modPath, dir);
}
}

internal static bool IsValidPath(string path)
{
Check.NullOrWhiteSpace(path);
// TODO: It would be good to verify that the path does not contain any . or .. segments.
return !Path.IsPathFullyQualified(path) && Path.GetExtension(path) == ".cel";
}

Metadata

Assignees

No one assigned

    Labels

    area: toolingIssues related to the tooling layer.state: approvedEnhancements and tasks that have been approved.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions