Stufe 4c (#764): Bezeichner auf Englisch - Typen, Methoden, Felder, Parameter, Locals, Testnamen
Mit Roslyn umbenannt (Verweise folgen, Zeichenketten bleiben unberuehrt). Nicht umbenannt, weil gespeichert oder ueber die API gebunden (Stufe 4e): Properties, Record-Parameter, Enum-Member sowie die Parameter der Endpunkt-Handler (Routen-/Query-Bindung ueber den Namen). Die JSON-Felder anonymer Objekte bleiben ausdruecklich benannt (JsonFilter: pfad). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
837a634a22
commit
77062facc9
@@ -37,27 +37,27 @@ public sealed class PathBoundaryTests : IDisposable
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
public void Ein_Nachbarverzeichnis_mit_gleichem_Praefix_liegt_ausserhalb()
|
||||
public void A_sibling_directory_with_the_same_prefix_lies_outside()
|
||||
{
|
||||
PathBoundary.IsInside(Path.Combine(_root + "-Backup", "geheim.txt"), _root)
|
||||
.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Das_Wurzelverzeichnis_selbst_liegt_innerhalb()
|
||||
public void The_root_directory_itself_lies_inside()
|
||||
{
|
||||
PathBoundary.IsInside(_root, _root).ShouldBeTrue();
|
||||
PathBoundary.IsInside(_root + Path.DirectorySeparatorChar, _root).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ein_Unterverzeichnis_liegt_innerhalb()
|
||||
public void A_subdirectory_lies_inside()
|
||||
{
|
||||
PathBoundary.IsInside(Path.Combine(_root, "a", "b", "c.txt"), _root).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Punkt_Punkt_fuehrt_hinaus()
|
||||
public void Dot_dot_leads_outside()
|
||||
{
|
||||
PathBoundary.IsInside(Path.Combine(_root, "..", "evil.txt"), _root).ShouldBeFalse();
|
||||
}
|
||||
@@ -67,7 +67,7 @@ public sealed class PathBoundaryTests : IDisposable
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[LinuxFact]
|
||||
public void Unter_Linux_ist_ein_Verzeichnis_mit_anderer_Schreibweise_ein_anderes()
|
||||
public void On_Linux_a_directory_with_different_case_is_a_different_one()
|
||||
{
|
||||
// "workspace" next to "Workspace": two real, separate directories.
|
||||
var lower = Path.Combine(_base, "workspace");
|
||||
@@ -77,7 +77,7 @@ public sealed class PathBoundaryTests : IDisposable
|
||||
}
|
||||
|
||||
[WindowsFact]
|
||||
public void Unter_Windows_meint_eine_andere_Schreibweise_dasselbe_Verzeichnis()
|
||||
public void On_Windows_a_different_case_means_the_same_directory()
|
||||
{
|
||||
var lower = Path.Combine(_base, "workspace");
|
||||
|
||||
@@ -85,16 +85,16 @@ public sealed class PathBoundaryTests : IDisposable
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Der_Schluessel_fuer_Sperren_folgt_der_Plattform()
|
||||
public void The_key_for_locks_follows_the_platform()
|
||||
{
|
||||
var upper = Path.Combine(_base, "Config.json");
|
||||
var lower = Path.Combine(_base, "config.json");
|
||||
|
||||
var gleich = PathBoundary.CanonicalKey(upper) == PathBoundary.CanonicalKey(lower);
|
||||
var same = PathBoundary.CanonicalKey(upper) == PathBoundary.CanonicalKey(lower);
|
||||
|
||||
// Under Windows the same file — the same lock. Under Linux two files
|
||||
// that must not share one.
|
||||
gleich.ShouldBe(OperatingSystem.IsWindows() || OperatingSystem.IsMacOS());
|
||||
same.ShouldBe(OperatingSystem.IsWindows() || OperatingSystem.IsMacOS());
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
@@ -102,20 +102,20 @@ public sealed class PathBoundaryTests : IDisposable
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[LinuxFact]
|
||||
public void Eine_Verknuepfung_aus_dem_Wurzelverzeichnis_heraus_wird_erkannt()
|
||||
public void A_link_out_of_the_root_directory_is_recognised()
|
||||
{
|
||||
// The case the plain path calculation does not see: "Workspace/raus" points
|
||||
// outside, but "Workspace/raus/beute.txt" lies lexically inside.
|
||||
var draussen = Path.Combine(_base, "Draussen");
|
||||
Directory.CreateDirectory(draussen);
|
||||
Directory.CreateSymbolicLink(Path.Combine(_root, "raus"), draussen);
|
||||
var outside = Path.Combine(_base, "Draussen");
|
||||
Directory.CreateDirectory(outside);
|
||||
Directory.CreateSymbolicLink(Path.Combine(_root, "raus"), outside);
|
||||
|
||||
PathBoundary.IsInside(Path.Combine(_root, "raus", "beute.txt"), _root)
|
||||
.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[LinuxFact]
|
||||
public void Eine_Verknuepfung_innerhalb_des_Wurzelverzeichnisses_bleibt_erlaubt()
|
||||
public void A_link_inside_the_root_directory_stays_allowed()
|
||||
{
|
||||
// Counter-check: whoever stays inside is not locked out.
|
||||
var ziel = Path.Combine(_root, "echte-daten");
|
||||
@@ -127,22 +127,22 @@ public sealed class PathBoundaryTests : IDisposable
|
||||
}
|
||||
|
||||
[LinuxFact]
|
||||
public void Ein_Wurzelverzeichnis_hinter_einer_Verknuepfung_sperrt_sich_nicht_selbst_aus()
|
||||
public void A_root_directory_behind_a_link_does_not_lock_itself_out()
|
||||
{
|
||||
// If the workspace itself lies behind a link (common with /var → /private/var
|
||||
// or mounted data directories), the resolution must apply on both sides
|
||||
// — otherwise nothing matches any more after resolving.
|
||||
var echt = Path.Combine(_base, "EchterOrt");
|
||||
Directory.CreateDirectory(echt);
|
||||
var ueber = Path.Combine(_base, "Verknuepft");
|
||||
Directory.CreateSymbolicLink(ueber, echt);
|
||||
var real = Path.Combine(_base, "EchterOrt");
|
||||
Directory.CreateDirectory(real);
|
||||
var over = Path.Combine(_base, "Verknuepft");
|
||||
Directory.CreateSymbolicLink(over, real);
|
||||
|
||||
PathBoundary.IsInside(Path.Combine(ueber, "datei.txt"), ueber).ShouldBeTrue();
|
||||
PathBoundary.IsInside(Path.Combine(echt, "datei.txt"), ueber).ShouldBeTrue();
|
||||
PathBoundary.IsInside(Path.Combine(over, "datei.txt"), over).ShouldBeTrue();
|
||||
PathBoundary.IsInside(Path.Combine(real, "datei.txt"), over).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Nicht_existierende_Pfade_bleiben_pruefbar()
|
||||
public void Non_existent_paths_stay_checkable()
|
||||
{
|
||||
// When writing, the file does not exist yet. What does not exist cannot be a
|
||||
// link — the resolution must not fail on that.
|
||||
|
||||
Reference in New Issue
Block a user