Service: isolate the profile in ProgramData, out of all normal profile paths
Local checkpoint - NOT for public release. Ed: the service profile must never be reachable except through the Service menu. Also fixes a real bug: the service runs as SYSTEM, whose per-user data folder is NOT the interactive user's - so a profile saved in the user's profiles folder (or AppConfig, both per-user) was invisible to the service. It would have idled, never streaming. - New RemSound.Core.ServiceStore: the service profile + its settings (logging) live in a MACHINE-WIDE ProgramData\RemSound\service location - same absolute path for the user (config dialog) and SYSTEM (service). Moved ServiceProfileName/ServiceLoggingEnabled off AppConfig (per-user) onto this store. - ServiceSendHost.FromConfig + RemSoundService now read ServiceStore; ConfigureServiceProfile saves there (and migrates + deletes any profile left in the old user-folder location). - Because it's no longer in the user's profiles folder, it can't appear in the startup picker, File->Open, Recent profiles, or the password manager (all of which read the user ProfileStore); the reserved-title filter in ListProfileTitles stays as belt-and-braces. - Password button renamed "Set service profile password". - New self-test "Service profile isolation": store is under ProgramData, the reserved title is filtered from the listing, and it round-trips through the machine-wide store. Gate 27/27. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
f0b35b2b8c
commit
4f5265d8b0
@@ -48,15 +48,10 @@ public sealed class ServiceSendHost : IDisposable
|
||||
this.log = log;
|
||||
}
|
||||
|
||||
/// <summary>Convenience factory for the real service: loads the profile named by
|
||||
/// <see cref="AppConfig.ServiceProfileName"/> from the given profiles folder each time it's asked.</summary>
|
||||
public static ServiceSendHost FromConfig(Action<string>? log = null) => new(() =>
|
||||
{
|
||||
var cfg = AppConfig.Load();
|
||||
if (string.IsNullOrWhiteSpace(cfg.ServiceProfileName) || string.IsNullOrWhiteSpace(cfg.ProfilesDirectory)) return null;
|
||||
try { return new ProfileStore(cfg.ProfilesDirectory).Load(cfg.ServiceProfileName!); }
|
||||
catch { return null; }
|
||||
}, log);
|
||||
/// <summary>Convenience factory for the real service: loads the profile from the machine-wide
|
||||
/// <see cref="ServiceStore"/> (ProgramData) each time it's asked — the same file the config dialog
|
||||
/// writes, readable by the SYSTEM service account. Re-read on each resume so edits are picked up.</summary>
|
||||
public static ServiceSendHost FromConfig(Action<string>? log = null) => new(ServiceStore.LoadProfile, log);
|
||||
|
||||
public bool IsSending { get { lock (gate) return running; } }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user