Bugtracker-Durchgang: 13 Bugs behoben, Build ohne Warnungen
Alle Behebungen auf der Linux-Test-VM gegengeprueft (Ubuntu, .NET 10.0.111): Build 0 Warnungen / 0 Fehler, 637 Tests gruen, 1 uebersprungen (WindowsFact). Sicherheit und Zielplattform #373 PathBoundary.Canonicalize fiel offen aus. File.ResolveLinkTarget wirft fuer einen fehlenden Abschnitt FileNotFoundException; der catch(IOException) verliess daraufhin die GANZE Aufloesung mit dem unaufgeloesten Pfad - und der besteht jede Praefixpruefung. Der Symlink-Schutz war damit bei jedem Schreibvorgang wirkungslos. Jetzt ueber FileSystemInfo.LinkTarget, und TryCanonicalize meldet "nicht bestimmbar", statt fail-open durchzureichen. #374 WorkspacePath weist den Backslash rundheraus ab, wie den Doppelpunkt. Eine Schreibweise statt einer Sonderregel je Windows-Form. #375 Log-Verzeichnis: leer heisst "Anwendungseinstellung"; ein relativer Wert zaehlt gegen das Instanzverzeichnis, nicht gegen das Arbeitsverzeichnis des Prozesses. Ein systemd-Dienst landet nicht mehr auf /Logs. Agentenkommunikation #206 Delegationskette gegen A->B->A (Test A13). Zyklusfrei per Bauart, dazu MaxDelegationDepth gegen die Staffel, die niemand beauftragt hat. #461 Zwei unabhaengige Ketten ueber Kreuz - beim Beheben von #206 gefunden und reproduziert. Ein delegierter Lauf wartet nur noch begrenzt auf ein fremdes Gate; ein Chat vom Menschen reiht sich weiter unbegrenzt ein. #234 Instanz-Id wird durchgereicht statt aus einem nur beilaeufig gesetzten Feld gelesen. Betrieb und Oberflaeche #376 Log-Ansicht chronologisch statt gruppiert je Moduldatei, mit Stacktraces an ihrer Meldung - auch ueber Taktgrenzen hinweg. #377 Info-Tabelle: feste Spaltenbreiten, damit ein langer Aenderungstext den anderen Spalten nicht den Platz nimmt. #378 Sicherung: Mindestabstand zwischen Ueberschrift und Schaltflaechenleiste. #379 Hellmodus: drei von vier gedaempften Textpinseln lagen unter 4,5:1. Die helle Palette ist als Ganzes verschoben, damit die Staffelung sichtbar bleibt statt auf einen Wert zusammenzufallen. Hygiene #233 stock_add: der Indexstand wird innerhalb der Sperre festgehalten. #235 Zeitumstellung: eine nicht existierende Ortszeit wird auf den ersten Zeitpunkt nach der Luecke verschoben statt uebersprungen (R4, R5). #236 45 Nullable-Warnungen und eine CA1416 - nicht unterdrueckt, sondern die Stellen so umgebaut, dass die Zusage nachvollziehbar wird. Mail meldet jetzt, WELCHER Zugangsschluessel fehlt, statt an einer KeyNotFoundException zu scheitern. #203 Kompaktiert wird vor dem API-Aufruf statt danach; die gemessenen Prompt-Groessen kalibrieren die Schaetzung je Modell. Neu: tests/ClawdDotNet.App.Tests - fuer #375 und #376 gab es keinen Ort fuer Tests. Dazu Regressionstests fuer jede Behebung; jeder wurde gegen den alten Stand geprueft, damit belegt ist, dass er den Fehler faengt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,23 +31,31 @@ public static class WorkspacePath
|
||||
var value = string.IsNullOrWhiteSpace(relativePath) ? "." : relativePath.Trim();
|
||||
|
||||
// Absolute Pfade und UNC-Freigaben würden Path.Combine den Root verwerfen lassen.
|
||||
if (Path.IsPathRooted(value) || value.StartsWith(@"\\") || value.StartsWith("//"))
|
||||
if (Path.IsPathRooted(value) || value.StartsWith("//"))
|
||||
{
|
||||
throw new UnauthorizedAccessException(
|
||||
$"Zugriff verweigert: Absolute Pfade sind im {workspaceName} Workspace nicht erlaubt.");
|
||||
}
|
||||
|
||||
// Alternate Data Streams (datei.txt:versteckt) umgehen die Endungsprüfung.
|
||||
// Doppelpunkt und Backslash werden rundheraus abgewiesen.
|
||||
//
|
||||
// Die Prüfung trägt unter Linux zusätzlich: Dort meldet Path.IsPathRooted für
|
||||
// "C:\Windows\…" false — ein Windows-Pfad ist unter Linux ein gewöhnlicher
|
||||
// Dateiname. Ohne diese Zeile käme er als relativer Pfad durch. Ein Doppelpunkt
|
||||
// im Dateinamen ist unter Linux zwar erlaubt, aber nichts, was ein Agent
|
||||
// Beide sind unter Linux gewöhnliche Namenszeichen, und genau daran scheiterte
|
||||
// die Abwehr der Windows-Formen: Path.IsPathRooted(@"C:\temp\x") meldet dort
|
||||
// false, und @"..\..\evil.txt" ist ein einzelner Dateiname statt eines
|
||||
// Ausbruchs. Ein Ausbruch war das nie — die Datei blieb im Workspace —, aber
|
||||
// eine Sonderregel je Windows-Form (Doppelpunkt für Laufwerke, "\\" für UNC)
|
||||
// lässt immer eine Form übrig, die durchfällt. Hier gilt darum eine
|
||||
// Schreibweise: "/" trennt Abschnitte, alles andere ist ein Name. Beide Zeichen
|
||||
// sind unter Linux in Dateinamen zwar erlaubt, aber nichts, was ein Agent
|
||||
// braucht; die Einschränkung kostet uns nichts.
|
||||
if (value.Contains(':'))
|
||||
//
|
||||
// Der Doppelpunkt fängt nebenbei Alternate Data Streams (datei.txt:versteckt),
|
||||
// die unter Windows die Endungsprüfung umgehen.
|
||||
if (value.Contains(':') || value.Contains('\\'))
|
||||
{
|
||||
throw new UnauthorizedAccessException(
|
||||
$"Zugriff verweigert: Der Pfad enthält ein unzulässiges Zeichen (':').");
|
||||
@"Zugriff verweigert: Der Pfad enthält ein unzulässiges Zeichen (':' oder '\'). " +
|
||||
"Abschnitte werden mit '/' getrennt.");
|
||||
}
|
||||
|
||||
var normalizedRoot = NormalizeDirectory(root);
|
||||
|
||||
Reference in New Issue
Block a user