using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; namespace Umbraco.Cms.Core.Telemetry; /// internal class SiteIdentifierService : ISiteIdentifierService { private readonly IConfigManipulator _configManipulator; private readonly ILogger _logger; private GlobalSettings _globalSettings; public SiteIdentifierService( IOptionsMonitor optionsMonitor, IConfigManipulator configManipulator, ILogger logger) { _globalSettings = optionsMonitor.CurrentValue; optionsMonitor.OnChange(globalSettings => _globalSettings = globalSettings); _configManipulator = configManipulator; _logger = logger; } /// public bool TryGetSiteIdentifier(out Guid siteIdentifier) { // Parse telemetry string as a GUID & verify its a GUID and not some random string // since users may have messed with or decided to empty the app setting or put in something random if (Guid.TryParse(_globalSettings.Id, out Guid parsedTelemetryId) is false || parsedTelemetryId == Guid.Empty) { siteIdentifier = Guid.Empty; return false; } siteIdentifier = parsedTelemetryId; return true; } /// public bool TryGetOrCreateSiteIdentifier(out Guid siteIdentifier) { if (TryGetSiteIdentifier(out Guid existingId)) { siteIdentifier = existingId; return true; } if (TryCreateSiteIdentifier(out Guid createdId)) { siteIdentifier = createdId; return true; } siteIdentifier = Guid.Empty; return false; } /// public bool TryCreateSiteIdentifier(out Guid createdGuid) { createdGuid = Guid.NewGuid(); try { _configManipulator.SetGlobalId(createdGuid.ToString()); } catch (Exception ex) { _logger.LogError(ex, "Couldn't update config files with a telemetry site identifier"); createdGuid = Guid.Empty; return false; } return true; } }