namespace ClawdDotNet.Core.Storage;
///
/// Legt Dateien so an, dass sie unter Unix von Anfang an nur dem Besitzer gehören (#575).
///
/// Warum beim Anlegen und nicht hinterher. .NET erzeugt neue Dateien mit
/// 0666 & ~umask — auf Ubuntu mit der Maske 0002 also 0664. Ein
/// nachträgliches lässt ein Fenster offen und
/// wird an jeder neuen Schreibstelle vergessen: InstanceSettings.json ging auf der
/// Test-VM beim ersten Speichern von 0600 auf 0664.
///
/// Unter Windows wirkungslos; dort regelt die Vererbung aus dem Profil die Rechte.
///
public static class OwnerOnlyFile
{
private const UnixFileMode OwnerReadWrite = UnixFileMode.UserRead | UnixFileMode.UserWrite;
/// Öffnungsangaben, die eine neu entstehende Datei auf 0600 setzen.
public static FileStreamOptions Options(FileMode mode, FileAccess access, FileShare share)
{
var options = new FileStreamOptions { Mode = mode, Access = access, Share = share };
if (!OperatingSystem.IsWindows())
options.UnixCreateMode = OwnerReadWrite;
return options;
}
///
/// Öffnet zum Anhängen. Eine vorhandene Datei behält ihre Rechte — nur was hier neu
/// entsteht, gehört dem Besitzer allein.
///
public static FileStream OpenAppend(string path)
=> new(path, Options(FileMode.Append, FileAccess.Write, FileShare.Read));
}