using System; using System.Collections.Generic; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Manifest; using Umbraco.Cms.Core.Telemetry.Models; using Umbraco.Extensions; namespace Umbraco.Cms.Core.Telemetry { /// internal class TelemetryService : ITelemetryService { private readonly IOptionsMonitor _globalSettings; private readonly IManifestParser _manifestParser; private readonly IUmbracoVersion _umbracoVersion; /// /// Initializes a new instance of the class. /// public TelemetryService( IOptionsMonitor globalSettings, IManifestParser manifestParser, IUmbracoVersion umbracoVersion) { _manifestParser = manifestParser; _umbracoVersion = umbracoVersion; _globalSettings = globalSettings; } /// public bool TryGetTelemetryReportData(out TelemetryReportData telemetryReportData) { if (TryGetTelemetryId(out Guid telemetryId) is false) { telemetryReportData = null; return false; } telemetryReportData = new TelemetryReportData { Id = telemetryId, Version = _umbracoVersion.SemanticVersion.ToSemanticStringWithoutBuild(), Packages = GetPackageTelemetry() }; return true; } private bool TryGetTelemetryId(out Guid telemetryId) { // 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.CurrentValue.Id, out var parsedTelemetryId) is false) { telemetryId = Guid.Empty; return false; } telemetryId = parsedTelemetryId; return true; } private IEnumerable GetPackageTelemetry() { List packages = new (); IEnumerable manifests = _manifestParser.GetManifests(); foreach (PackageManifest manifest in manifests) { if (manifest.AllowPackageTelemetry is false) { continue; } packages.Add(new PackageTelemetry { Name = manifest.PackageName, Version = manifest.Version ?? string.Empty }); } return packages; } } }