Stufe 4c (#764): Kommentare in C#, WebUI-Skripten, CSS und HTML auf Englisch
Rund 2.600 Kommentarblöcke in 310 C#-Dateien übersetzt, Begründungen vollständig erhalten: blockweise gleiche Anzahl wie vorher, kein Block unter 60 % seiner Länge, der Code außerhalb der Kommentare per Tokenizer byte-identisch geprüft. Zitate deutscher Oberflächentexte und Testdaten bleiben deutsch. WebUI: Kommentare in JS/CSS/HTML übersetzt, JSDoc-@param an die in 4b umbenannten Parameter angeglichen. Dabei behoben: - 4b hatte "tag" (HTML-Tag) als deutsches "Tag" gelesen und zu "dayValue" gemacht (makeElement, svg, Tagesübersicht) - zurück auf tag/day. - Aufgaben "InProgress" bekamen die Plakettenart "laufend", für die es nie eine CSS-Klasse gab - jetzt "success" wie laufende Instanzen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
da4ceac7d5
commit
837a634a22
@@ -9,8 +9,8 @@ using Shouldly;
|
||||
namespace ClawdDotNet.Tools.Tests.Database;
|
||||
|
||||
/// <summary>
|
||||
/// Vorpruefung (#579), Freigabeschluessel (#609) und Rechte (#641) des Database-Werkzeugs -
|
||||
/// alles ohne Datenbankverbindung pruefbar, weil es nur Konfiguration und Statement ansieht.
|
||||
/// Pre-check (#579), approval key (#609) and permissions (#641) of the Database tool -
|
||||
/// all checkable without a database connection, because it only looks at configuration and statement.
|
||||
/// </summary>
|
||||
public sealed class DatabaseVorpruefungTests
|
||||
{
|
||||
@@ -48,8 +48,8 @@ public sealed class DatabaseVorpruefungTests
|
||||
[InlineData("DESCRIBE messwerte", "ReadOnly")]
|
||||
public void Die_Vorpruefung_urteilt_nicht_mehr_ueber_die_Operation(string sql, string level)
|
||||
{
|
||||
// #641: Ob ein INSERT eines lesenden Agenten laeuft, vorgelegt oder verboten wird,
|
||||
// entscheidet die Freigabestelle - nicht mehr eine stille Ablehnung im Werkzeug.
|
||||
// #641: Whether an INSERT of a reading agent runs, is presented or is forbidden
|
||||
// is decided by the approval point - no longer by a silent refusal in the tool.
|
||||
Tool.Preflight(Sql(sql), Kontext(level, "messwerte")).ShouldBeNull();
|
||||
}
|
||||
|
||||
@@ -88,8 +88,8 @@ public sealed class DatabaseVorpruefungTests
|
||||
[Fact]
|
||||
public async Task Ohne_Freigabestelle_bleibt_die_Zugriffsstufe_eine_harte_Grenze()
|
||||
{
|
||||
// Kein Gate, keine Pruefung: dann muss das Werkzeug selbst verweigern, bevor es
|
||||
// ueberhaupt eine Verbindung aufbaut.
|
||||
// No gate, no check: then the tool itself has to refuse before it
|
||||
// even establishes a connection.
|
||||
var ergebnis = await Tool.ExecuteAsync(
|
||||
Sql("INSERT INTO messwerte (ort) VALUES ('Berlin')"), Kontext("ReadOnly", "messwerte"), default);
|
||||
|
||||
|
||||
@@ -4,13 +4,13 @@ using Shouldly;
|
||||
namespace ClawdDotNet.Tools.Tests.Database;
|
||||
|
||||
/// <summary>
|
||||
/// S1 aus der Bestandsaufnahme: Die Tabellen-Whitelist suchte den erlaubten Namen als
|
||||
/// Teilzeichenkette irgendwo im Statement — auch in einem Kommentar. Bei
|
||||
/// allowedTables ["prices"] genügte deshalb "DELETE FROM users -- prices", um eine
|
||||
/// beliebige andere Tabelle zu löschen.
|
||||
/// S1 from the inventory: the table whitelist looked for the allowed name as a
|
||||
/// substring anywhere in the statement — including in a comment. With
|
||||
/// allowedTables ["prices"] therefore "DELETE FROM users -- prices" was enough to delete
|
||||
/// any other table.
|
||||
///
|
||||
/// Die Gegenproben sind genauso wichtig wie die Angriffe: Ein zu strenger Filter, der
|
||||
/// legitime Abfragen blockiert, wäre im Betrieb genauso unbrauchbar.
|
||||
/// The counter-checks are just as important as the attacks: a filter that is too strict and
|
||||
/// blocks legitimate queries would be just as useless in operation.
|
||||
/// </summary>
|
||||
public sealed class SqlGuardTests
|
||||
{
|
||||
@@ -19,10 +19,10 @@ public sealed class SqlGuardTests
|
||||
private static SqlInspection Inspect(string sql) => SqlGuard.Inspect(sql, Allowed);
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Angriffe — alle müssen abgelehnt werden
|
||||
// Attacks — all must be rejected
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
// ─── #610: wiederholbares Anlegen und Strukturabfragen ───
|
||||
// ─── #610: repeatable creation and structure queries ───
|
||||
|
||||
[Theory]
|
||||
[InlineData("CREATE TABLE IF NOT EXISTS prices (id INT)", SqlOperation.Schema)]
|
||||
@@ -86,7 +86,7 @@ public sealed class SqlGuardTests
|
||||
[InlineData("INSERT INTO users SELECT * FROM prices")]
|
||||
public void Ein_einziger_unerlaubter_Join_reicht_zur_Ablehnung(string sql)
|
||||
{
|
||||
// Entscheidend: JEDE referenzierte Tabelle muss erlaubt sein, nicht irgendeine.
|
||||
// Crucial: EVERY referenced table must be allowed, not just any one.
|
||||
var result = Inspect(sql);
|
||||
|
||||
result.IsValid.ShouldBeFalse();
|
||||
@@ -109,7 +109,7 @@ public sealed class SqlGuardTests
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Gegenproben — legitime Abfragen müssen durchgehen
|
||||
// Counter-checks — legitimate queries must get through
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Theory]
|
||||
@@ -132,8 +132,8 @@ public sealed class SqlGuardTests
|
||||
[InlineData("SELECT * FROM prices WHERE aktion = 'drop'")]
|
||||
public void Harmlose_Schluesselwoerter_in_Werten_gelten_nicht_als_Schreibzugriff(string sql)
|
||||
{
|
||||
// Der alte Substring-Test stufte diese Abfragen fälschlich als Schreib- bzw.
|
||||
// Strukturzugriff ein und blockierte sie für ReadOnly-Agenten.
|
||||
// The old substring test wrongly classified these queries as write or
|
||||
// structure access and blocked them for read-only agents.
|
||||
var result = Inspect(sql);
|
||||
|
||||
result.IsValid.ShouldBeTrue(result.Error);
|
||||
|
||||
Reference in New Issue
Block a user