@@ -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 }
0 commit comments