Skip to content

Commit 9631fbf

Browse files
committed
Bugfix: UAC prompt cannot be shown if secure desktop was used
Fixes #52
1 parent 113e7f8 commit 9631fbf

5 files changed

Lines changed: 44 additions & 21 deletions

File tree

src/EarlyUpdateCheck.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ private void MainWindow_FormLoadPost(object sender, EventArgs e)
136136

137137
private void WindowAdded(object sender, GwmWindowEventArgs e)
138138
{
139+
PluginUpdateHandler.CheckCanShieldify(e.Form);
139140
if (!PluginConfig.Active) return;
140141
PluginDebug.AddInfo("Form added", 0, e.Form.Name, e.Form.GetType().FullName, DebugPrint);
141142
if (e.Form is UpdateCheckForm)
@@ -766,7 +767,7 @@ private bool ShowUpdateButton(Form form, bool enable, object oKeePassUpdate)
766767
bUpdate.Name = "EUCUpdateButton";
767768
bUpdate.Click += bUpdatePlugins_Click;
768769
bClose.Parent.Controls.Add(bUpdate);
769-
if (PluginUpdateHandler.Shieldify)
770+
if (PluginUpdateHandler.MustShieldify)
770771
{
771772
bUpdate.Width += DpiUtil.ScaleIntX(16);
772773
UIUtil.SetShield(bUpdate, true);
@@ -912,7 +913,7 @@ private void DoUpdateKeePass(KeePass_Update kpu)
912913
{
913914
m_slUpdatePlugins.StartLogging(PluginTranslate.PluginUpdateCaption, false);
914915

915-
PluginDebug.AddInfo("Use temp folder", PluginUpdateHandler.Shieldify.ToString(), sTempPluginsFolder, DebugPrint);
916+
PluginDebug.AddInfo("Use temp folder", PluginUpdateHandler.MustShieldify.ToString(), sTempPluginsFolder, DebugPrint);
916917

917918
bool bOK = true;
918919
if (m_slUpdatePlugins != null)
@@ -978,7 +979,7 @@ private void UpdatePlugins(UpdateFlags uf, bool bForceExternalPluginUpdatesDownl
978979
{
979980
m_slUpdatePlugins.StartLogging(PluginTranslate.PluginUpdateCaption, false);
980981

981-
PluginDebug.AddInfo("Use temp folder", PluginUpdateHandler.Shieldify.ToString(), sTempPluginsFolder, DebugPrint);
982+
PluginDebug.AddInfo("Use temp folder", PluginUpdateHandler.MustShieldify.ToString(), sTempPluginsFolder, DebugPrint);
982983

983984
//Download files
984985
foreach (PluginUpdate upd in PluginUpdateHandler.Plugins)

src/Options.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Options()
4545
else
4646
cbDownloadCurrentTranslation.Text = string.Format(PluginTranslate.TranslationDownload_DownloadCurrent, KeePass.Program.Translation.Properties.NameNative);
4747
bUpdateTranslations.Text = PluginTranslate.TranslationDownload_Update;
48-
if (PluginUpdateHandler.Shieldify) KeePass.UI.UIUtil.SetShield(bUpdateTranslations, true);
48+
if (PluginUpdateHandler.MustShieldify) KeePass.UI.UIUtil.SetShield(bUpdateTranslations, true);
4949
bDownloadExternalPluginUpdates.Text = PluginTranslate.UpdateExternalInfoDownload;
5050

5151
tpKeePass.Text = PluginTranslate.PluginUpdateKeePass;

src/PluginUpdateInfo.cs

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,18 @@ internal static bool CheckTranslations
2929
}
3030
internal static string LanguageIso = string.Empty;
3131

32-
internal static bool Shieldify
32+
internal static bool MustShieldify
3333
{
3434
get
3535
{
36-
if (m_bShieldify.HasValue) return m_bShieldify.Value;
37-
CheckShieldify();
38-
return m_bShieldify.Value;
36+
if (m_bMustShieldify.HasValue) return m_bMustShieldify.Value;
37+
CheckMustShieldify();
38+
return m_bMustShieldify.Value;
3939
}
4040
}
4141

42+
internal static bool CanShieldify { get { return m_bCanShieldify; } }
43+
4244
internal static string PluginsFolder { get; private set; }
4345
internal static string PluginsTranslationsFolder { get; private set; }
4446

@@ -67,7 +69,7 @@ internal static void Init()
6769
List<string> lMsg = new List<string>();
6870
lMsg.Add("Plugins folder: " + PluginsFolder);
6971
lMsg.Add("Plugins translation folder: " + PluginsTranslationsFolder);
70-
lMsg.Add("Shieldify: " + Shieldify.ToString());
72+
lMsg.Add("Shieldify: " + MustShieldify.ToString());
7173
lMsg.Add("Last update check: " + m_sLastUpdateCheck);
7274
PluginDebug.AddInfo("PluginUpdateHandler initialized", 0, lMsg.ToArray());
7375
}
@@ -137,11 +139,11 @@ internal static bool VersionsEqual(Version vA, Version vB)
137139
internal static bool MoveAll(string sTempFolder)
138140
{
139141
string sTargetFolder = PluginUpdateHandler.PluginsFolder;
140-
if (Shieldify) return MoveAllShieldified(sTempFolder, sTargetFolder, false);
141-
else return MoveAllNonShieldified(sTempFolder, sTargetFolder);
142+
if (MustShieldify) return MoveAllShieldified(sTempFolder, sTargetFolder, false);
143+
else return MoveAllNonShieldified(sTempFolder, sTargetFolder, false);
142144
}
143145

144-
private static bool MoveAllNonShieldified(string sTempFolder, string sTargetFolder)
146+
private static bool MoveAllNonShieldified(string sTempFolder, string sTargetFolder, bool bShieldifyTriedAndFailed)
145147
{
146148
bool bSuccess = true;
147149
List<string> lFiles = UrlUtil.GetFilePaths(sTempFolder, "*", SearchOption.AllDirectories);
@@ -188,8 +190,9 @@ private static bool MoveAllNonShieldified(string sTempFolder, string sTargetFold
188190
}
189191
if (!bSuccess)
190192
{
193+
if (bShieldifyTriedAndFailed) lMsg.Insert(0, "UAC not possible, secure desktop was shown at least once");
191194
PluginDebug.AddError("Error moving files", 0, lMsg.ToArray());
192-
if (WinUtil.IsAtLeastWindowsVista) return MoveAllShieldified(sTempFolder, sTargetFolder, true);
195+
if (WinUtil.IsAtLeastWindowsVista && !bShieldifyTriedAndFailed) return MoveAllShieldified(sTempFolder, sTargetFolder, true);
193196
if (Tools.AskYesNo(PluginTranslate.PluginUpdateFailed, PluginTranslate.PluginUpdateCaption) == DialogResult.Yes)
194197
{
195198
System.Diagnostics.Process.Start(sTempFolder);
@@ -203,6 +206,7 @@ private static bool MoveAllNonShieldified(string sTempFolder, string sTargetFold
203206

204207
private static bool MoveAllShieldified(string sTempFolder, string sTargetFolder, bool bOnlyTryShieldify)
205208
{
209+
if (!CanShieldify) return MoveAllNonShieldified(sTempFolder, sTargetFolder, true);
206210
bool bSuccess = false;
207211
bool bOpenTempFolder = false;
208212
GFunc<DialogResult> f = new GFunc<DialogResult>(() =>
@@ -258,19 +262,37 @@ internal static void DeleteSpecialFile(string sFile, bool bAddDebugInfo)
258262

259263
private static Dictionary<string, Version> m_Plugins = new Dictionary<string, Version>();
260264
private static string m_sLastUpdateCheck = string.Empty;
261-
private static bool? m_bShieldify;
265+
private static bool? m_bMustShieldify;
266+
private static bool m_bCanShieldify = true; //https://github.com/Rookiestyle/EarlyUpdateCheck/issues/52
262267
private static string EnsureNonNull(string v)
263268
{
264269
if (v == null) return string.Empty;
265270
return v;
266271
}
267272

268-
private static void CheckShieldify()
273+
//KeePass secure desktop does not play nicely with SHFileOperation
274+
//cf. https://github.com/Rookiestyle/EarlyUpdateCheck/issues/52
275+
//
276+
//SHFileOperation cannot be used if KeePass secure desktop has been shown before
277+
public static void CheckCanShieldify(Form f)
278+
{
279+
if (!MustShieldify)
280+
{
281+
m_bCanShieldify = true;
282+
return;
283+
}
284+
285+
if (!(f is KeePass.Forms.KeyPromptForm || f is KeePass.Forms.KeyCreationForm)) return;
286+
287+
if (m_bCanShieldify) m_bCanShieldify = !KeePass.Program.Config.Security.MasterKeyOnSecureDesktop;
288+
}
289+
290+
private static void CheckMustShieldify()
269291
{
270292
List<string> lShieldify = new List<string>();
271293
try
272294
{
273-
m_bShieldify = false;
295+
m_bMustShieldify = false;
274296
if (KeePassLib.Native.NativeLib.IsUnix())
275297
{
276298
lShieldify.Add("Detected Unix");
@@ -287,7 +309,7 @@ private static void CheckShieldify()
287309
catch { sPF86_2 = sPF86; }
288310
string sPF = EnsureNonNull(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles));
289311
string sKP = EnsureNonNull(UrlUtil.GetFileDirectory(WinUtil.GetExecutable(), true, false));
290-
m_bShieldify = sKP.StartsWith(sPF86) || sKP.StartsWith(sPF) || sKP.StartsWith(sPF86_2);
312+
m_bMustShieldify = sKP.StartsWith(sPF86) || sKP.StartsWith(sPF) || sKP.StartsWith(sPF86_2);
291313
lShieldify.Add("KeePass folder inside ProgramFiles(x86): " + sKP.StartsWith(sPF86));
292314
lShieldify.Add("KeePass folder inside Environment.SpecialFolder.ProgramFilesX86: " + sKP.StartsWith(sPF86_2));
293315
lShieldify.Add("KeePass folder inside Environment.SpecialFolder.ProgramFiles: " + sKP.StartsWith(sPF));
@@ -296,7 +318,7 @@ private static void CheckShieldify()
296318
catch (Exception ex) { lShieldify.Add("Exception: " + ex.Message); return; }
297319
finally
298320
{
299-
lShieldify.Insert(0, "Shieldify: " + m_bShieldify.ToString());
321+
lShieldify.Insert(0, "Shieldify: " + m_bMustShieldify.ToString());
300322
PluginDebug.AddInfo("Check Shieldify", 0, lShieldify.ToArray());
301323
}
302324
}

src/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@
2626
//
2727
// You can specify all the values or you can use the default the Revision and
2828
// Build Numbers by using the '*' as shown below:
29-
[assembly: AssemblyVersion("4.2")]
30-
[assembly: AssemblyFileVersion("4.2")]
29+
[assembly: AssemblyVersion("4.2.1")]
30+
[assembly: AssemblyFileVersion("4.2.1")]
3131
[assembly: Guid("672570AF-CC57-4980-86F9-D48FD1CC707D")]

version.info

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
:
2-
Early update check:4.2
2+
Early update check:4.2.1
33
Early update check!de:9
44
Early update check!ru:2
55
Early update check!fr:1

0 commit comments

Comments
 (0)