Merge pull request #926 from tr4wzified/improved-keys

Improve metric key storage
This commit is contained in:
Timothy Baldridge 2020-06-15 18:52:53 -07:00 committed by GitHub
commit addec5e881
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 12 deletions

View File

@ -3,8 +3,10 @@ using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using Wabbajack.Common.Exceptions;
namespace Wabbajack.Common
@ -21,20 +23,48 @@ namespace Wabbajack.Common
using var _ = await _creationLock.WaitAsync();
if (!Utils.HaveEncryptedJson(Consts.MetricsKeyHeader))
{
var key = Utils.MakeRandomKey();
await key.ToEcryptedJson(Consts.MetricsKeyHeader);
return key;
if (!Utils.HaveRegKeyMetricsKey())
{
// When there's no file or regkey
var key = Utils.MakeRandomKey();
await key.ToEcryptedJson(Consts.MetricsKeyHeader);
using (RegistryKey regKey = Registry.CurrentUser.CreateSubKey(@"Software\Wabbajack", RegistryKeyPermissionCheck.Default)!)
{
regKey.SetValue("x-metrics-key", key);
}
return key;
}
else
{
// If there is no file but a registry key, create the file and transfer the data from the registry key
using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Software\Wabbajack", RegistryKeyPermissionCheck.Default)!)
{
string key = (string)regKey.GetValue(Consts.MetricsKeyHeader)!;
await key.ToEcryptedJson(Consts.MetricsKeyHeader);
return key;
}
}
}
try
else
{
return await Utils.FromEncryptedJson<string>(Consts.MetricsKeyHeader);
}
catch (Exception)
{
var key = Utils.MakeRandomKey();
await key.ToEcryptedJson(Consts.MetricsKeyHeader);
return key;
if (Utils.HaveRegKeyMetricsKey())
{
// When there's a file and a regkey
using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Software\Wabbajack", RegistryKeyPermissionCheck.Default)!)
{
return (string)regKey.GetValue(Consts.MetricsKeyHeader)!;
}
}
else
{
// If there's a regkey and a file, return regkey
using (RegistryKey regKey = Registry.CurrentUser.CreateSubKey(@"Software\Wabbajack", RegistryKeyPermissionCheck.Default)!)
{
string key = await Utils.FromEncryptedJson<string>(Consts.MetricsKeyHeader)!;
regKey.SetValue("x-metrics-key", key);
return key;
}
}
}
}
/// <summary>

View File

@ -21,6 +21,7 @@ using ICSharpCode.SharpZipLib.BZip2;
using IniParser;
using IniParser.Model.Configuration;
using IniParser.Parser;
using Microsoft.Win32;
using Newtonsoft.Json;
using ReactiveUI;
using RocksDbSharp;
@ -970,6 +971,21 @@ namespace Wabbajack.Common
return Consts.LocalAppDataPath.Combine(key).IsFile;
}
public static bool HaveRegKey()
{
return Registry.CurrentUser.OpenSubKey(@"Software\Wabbajack") != null;
}
public static bool HaveRegKeyMetricsKey()
{
if (HaveRegKey())
{
return Registry.CurrentUser.OpenSubKey(@"Software\Wabbajack")!.GetValueNames().Contains(Consts.MetricsKeyHeader);
}
return false;
}
public static IObservable<(FileEventType, FileSystemEventArgs)> AppLocalEvents { get; }
public static IObservable<bool> HaveEncryptedJsonObservable(string key)