mirror of
https://github.com/wismna/ModernKeePassLib.git
synced 2025-10-03 15:40:20 -04:00
Update to version 2.42.1
Some changes Removed FutureAccesList code as it works only with UWP
This commit is contained in:
@@ -23,18 +23,19 @@ using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
using Windows.Storage.AccessCache;
|
||||
#if (!ModernKeePassLib && !KeePassLibSD && !KeePassRT)
|
||||
using System.Security.AccessControl;
|
||||
#endif
|
||||
|
||||
using ModernKeePassLib.Native;
|
||||
using ModernKeePassLib.Utility;
|
||||
using System.Threading.Tasks;
|
||||
#if ModernKeePassLib
|
||||
using Windows.Storage;
|
||||
using Windows.Storage.Streams;
|
||||
#endif
|
||||
|
||||
using ModernKeePassLib.Cryptography;
|
||||
using ModernKeePassLib.Delegates;
|
||||
using ModernKeePassLib.Native;
|
||||
using ModernKeePassLib.Resources;
|
||||
using ModernKeePassLib.Utility;
|
||||
|
||||
namespace ModernKeePassLib.Serialization
|
||||
{
|
||||
@@ -210,10 +211,10 @@ namespace ModernKeePassLib.Serialization
|
||||
// trying to set 'Owner' or 'Group' can result in an
|
||||
// UnauthorizedAccessException; thus we restore 'Access' (DACL) only
|
||||
const AccessControlSections acs = AccessControlSections.Access;
|
||||
|
||||
#endif
|
||||
bool bEfsEncrypted = false;
|
||||
byte[] pbSec = null;
|
||||
|
||||
DateTime? otCreation = null;
|
||||
|
||||
bool bBaseExists = IOConnection.FileExists(m_iocBase);
|
||||
@@ -228,9 +229,7 @@ namespace ModernKeePassLib.Serialization
|
||||
try { if(bEfsEncrypted) File.Decrypt(m_iocBase.Path); } // For TxF
|
||||
catch(Exception) { Debug.Assert(false); }
|
||||
#endif
|
||||
#if ModernKeePassLib
|
||||
otCreation = m_iocBase.StorageFile.DateCreated.UtcDateTime;
|
||||
#else
|
||||
#if !ModernKeePassLib
|
||||
otCreation = File.GetCreationTimeUtc(m_iocBase.Path);
|
||||
#endif
|
||||
#if !ModernKeePassLib
|
||||
@@ -238,7 +237,7 @@ namespace ModernKeePassLib.Serialization
|
||||
FileSecurity sec = File.GetAccessControl(m_iocBase.Path, acs);
|
||||
if(sec != null) pbSec = sec.GetSecurityDescriptorBinaryForm();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
catch(Exception) { Debug.Assert(NativeLib.IsUnix()); }
|
||||
|
||||
// if((long)(faBase & FileAttributes.ReadOnly) != 0)
|
||||
@@ -337,6 +336,7 @@ namespace ModernKeePassLib.Serialization
|
||||
{
|
||||
if(NativeLib.IsUnix()) return;
|
||||
if(!m_iocBase.IsLocalFile()) return;
|
||||
if(IsOneDriveWorkaroundRequired()) return;
|
||||
|
||||
string strID = StrUtil.AlphaNumericOnly(Convert.ToBase64String(
|
||||
CryptoRandom.Instance.GetRandomBytes(16)));
|
||||
@@ -354,7 +354,7 @@ namespace ModernKeePassLib.Serialization
|
||||
#if ModernKeePassLib
|
||||
var tempFile = ApplicationData.Current.TemporaryFolder.CreateFileAsync(m_iocTemp.Path).GetAwaiter()
|
||||
.GetResult();
|
||||
m_iocTemp = IOConnectionInfo.FromFile(tempFile);
|
||||
m_iocTemp = IOConnectionInfo.FromStorageFile(tempFile);
|
||||
#else
|
||||
m_iocTemp = IOConnectionInfo.FromPath(strTemp);
|
||||
#endif
|
||||
@@ -370,13 +370,10 @@ namespace ModernKeePassLib.Serialization
|
||||
|
||||
if(TxfMoveWithTx()) return true;
|
||||
|
||||
// Move the temporary file onto the base file's drive first,
|
||||
// such that it cannot happen that both the base file and
|
||||
// the temporary file are deleted/corrupted
|
||||
#if ModernKeePassLib
|
||||
m_iocTemp.StorageFile = ApplicationData.Current.TemporaryFolder.CreateFileAsync(m_iocTemp.Path).GetAwaiter()
|
||||
.GetResult();
|
||||
#else
|
||||
// Move the temporary file onto the base file's drive first,
|
||||
// such that it cannot happen that both the base file and
|
||||
// the temporary file are deleted/corrupted
|
||||
#if !ModernKeePassLib
|
||||
const uint f = (NativeMethods.MOVEFILE_COPY_ALLOWED |
|
||||
NativeMethods.MOVEFILE_REPLACE_EXISTING);
|
||||
bool b = NativeMethods.MoveFileEx(m_iocTemp.Path, m_iocTxfMidFallback.Path, f);
|
||||
@@ -391,9 +388,7 @@ namespace ModernKeePassLib.Serialization
|
||||
|
||||
private bool TxfMoveWithTx()
|
||||
{
|
||||
#if ModernKeePassLib
|
||||
return true;
|
||||
#else
|
||||
#if !ModernKeePassLib
|
||||
IntPtr hTx = new IntPtr((int)NativeMethods.INVALID_HANDLE_VALUE);
|
||||
Debug.Assert(hTx.ToInt64() == NativeMethods.INVALID_HANDLE_VALUE);
|
||||
try
|
||||
@@ -438,9 +433,8 @@ namespace ModernKeePassLib.Serialization
|
||||
catch(Exception) { Debug.Assert(false); }
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static void ClearOld()
|
||||
@@ -470,5 +464,89 @@ namespace ModernKeePassLib.Serialization
|
||||
}
|
||||
catch(Exception) { Debug.Assert(false); }
|
||||
}
|
||||
|
||||
// https://sourceforge.net/p/keepass/discussion/329220/thread/672ffecc65/
|
||||
// https://sourceforge.net/p/keepass/discussion/329221/thread/514786c23a/
|
||||
private bool IsOneDriveWorkaroundRequired()
|
||||
{
|
||||
#if !ModernKeePassLib
|
||||
if(NativeLib.IsUnix()) return false;
|
||||
|
||||
try
|
||||
{
|
||||
string strReleaseId = (Registry.GetValue(
|
||||
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
|
||||
"ReleaseId", string.Empty) as string);
|
||||
if(strReleaseId != "1809") return false;
|
||||
|
||||
string strFile = m_iocBase.Path;
|
||||
|
||||
GFunc<string, string, bool> fMatch = delegate(string strRoot, string strSfx)
|
||||
{
|
||||
if(string.IsNullOrEmpty(strRoot)) return false;
|
||||
string strPfx = UrlUtil.EnsureTerminatingSeparator(
|
||||
strRoot, false) + strSfx;
|
||||
return strFile.StartsWith(strPfx, StrUtil.CaseIgnoreCmp);
|
||||
};
|
||||
GFunc<string, string, bool> fMatchEnv = delegate(string strEnv, string strSfx)
|
||||
{
|
||||
return fMatch(Environment.GetEnvironmentVariable(strEnv), strSfx);
|
||||
};
|
||||
|
||||
string strKnown = NativeMethods.GetKnownFolderPath(
|
||||
NativeMethods.FOLDERID_SkyDrive);
|
||||
if(fMatch(strKnown, string.Empty)) return true;
|
||||
|
||||
if(fMatchEnv("USERPROFILE", "OneDrive\\")) return true;
|
||||
if(fMatchEnv("OneDrive", string.Empty)) return true;
|
||||
if(fMatchEnv("OneDriveCommercial", string.Empty)) return true;
|
||||
if(fMatchEnv("OneDriveConsumer", string.Empty)) return true;
|
||||
|
||||
using(RegistryKey kAccs = Registry.CurrentUser.OpenSubKey(
|
||||
"Software\\Microsoft\\OneDrive\\Accounts", false))
|
||||
{
|
||||
string[] vAccs = (((kAccs != null) ? kAccs.GetSubKeyNames() :
|
||||
null) ?? new string[0]);
|
||||
|
||||
foreach(string strAcc in vAccs)
|
||||
{
|
||||
if(string.IsNullOrEmpty(strAcc)) { Debug.Assert(false); continue; }
|
||||
|
||||
using(RegistryKey kTenants = kAccs.OpenSubKey(
|
||||
strAcc + "\\Tenants", false))
|
||||
{
|
||||
string[] vTenants = (((kTenants != null) ?
|
||||
kTenants.GetSubKeyNames() : null) ?? new string[0]);
|
||||
|
||||
foreach(string strT in vTenants)
|
||||
{
|
||||
if(string.IsNullOrEmpty(strT)) { Debug.Assert(false); continue; }
|
||||
|
||||
using(RegistryKey kT = kTenants.OpenSubKey(strT, false))
|
||||
{
|
||||
string[] vPaths = (((kT != null) ?
|
||||
kT.GetValueNames() : null) ?? new string[0]);
|
||||
|
||||
foreach(string strPath in vPaths)
|
||||
{
|
||||
if((strPath == null) || (strPath.Length < 4) ||
|
||||
(strPath[1] != ':'))
|
||||
{
|
||||
Debug.Assert(false);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(fMatch(strPath, string.Empty)) return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception) { Debug.Assert(false); }
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user