* CachingFileStorage: Added more callbacks to provide user with more information what's going on
* Changed TestCacheSupervisor for easier use of the many callbacks * Adapted tests for new callbacks * GroupBaseActivity: Added sync menu command * Preferences: Added option to enable/disable offline caching * App: don't lock database when user wants to reload. This is done in PasswordActivity and should be done there after the password was filled into the pw field * CheckDatabaseForChanges.cs: used when syncing a non-cached database
This commit is contained in:
		
							
								
								
									
										74
									
								
								src/Kp2aBusinessLogic/database/CheckDatabaseForChanges.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/Kp2aBusinessLogic/database/CheckDatabaseForChanges.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Security.Cryptography;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using Android.App;
 | 
			
		||||
using Android.Content;
 | 
			
		||||
using KeePassLib.Cryptography;
 | 
			
		||||
using KeePassLib.Serialization;
 | 
			
		||||
using KeePassLib.Utility;
 | 
			
		||||
using keepass2android.Io;
 | 
			
		||||
 | 
			
		||||
namespace keepass2android
 | 
			
		||||
{
 | 
			
		||||
	public class CheckDatabaseForChanges: RunnableOnFinish
 | 
			
		||||
	{
 | 
			
		||||
		private readonly Context _context;
 | 
			
		||||
		private readonly IKp2aApp _app;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		public CheckDatabaseForChanges(Context context, IKp2aApp app, OnFinish finish)
 | 
			
		||||
			: base(finish)
 | 
			
		||||
		{
 | 
			
		||||
			_context = context;
 | 
			
		||||
			_app = app;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override void Run()
 | 
			
		||||
		{
 | 
			
		||||
			try
 | 
			
		||||
			{
 | 
			
		||||
				IOConnectionInfo ioc = _app.GetDb().Ioc;
 | 
			
		||||
				IFileStorage fileStorage = _app.GetFileStorage(ioc);
 | 
			
		||||
				if (fileStorage is CachingFileStorage)
 | 
			
		||||
				{
 | 
			
		||||
					throw new Exception("Cannot sync a cached database!");
 | 
			
		||||
				}
 | 
			
		||||
				StatusLogger.UpdateMessage(UiStringKey.CheckingDatabaseForChanges);
 | 
			
		||||
				
 | 
			
		||||
				//download file from remote location and calculate hash:
 | 
			
		||||
				StatusLogger.UpdateSubMessage(_app.GetResourceString(UiStringKey.DownloadingRemoteFile));
 | 
			
		||||
				
 | 
			
		||||
 | 
			
		||||
				MemoryStream remoteData = new MemoryStream();
 | 
			
		||||
				using (
 | 
			
		||||
					HashingStreamEx hashingRemoteStream = new HashingStreamEx(fileStorage.OpenFileForRead(ioc), false,
 | 
			
		||||
																				new SHA256Managed()))
 | 
			
		||||
				{
 | 
			
		||||
					hashingRemoteStream.CopyTo(remoteData);
 | 
			
		||||
					hashingRemoteStream.Close();
 | 
			
		||||
					
 | 
			
		||||
					if (!MemUtil.ArraysEqual(_app.GetDb().KpDatabase.HashOfFileOnDisk, hashingRemoteStream.Hash))
 | 
			
		||||
					{
 | 
			
		||||
						_app.TriggerReload(_context);
 | 
			
		||||
						Finish(true);
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						Finish(true, _app.GetResourceString(UiStringKey.RemoteDatabaseUnchanged));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			
 | 
			
		||||
				
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			catch (Exception e)
 | 
			
		||||
			{
 | 
			
		||||
				Finish(false, e.Message);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -48,7 +48,8 @@ namespace keepass2android
 | 
			
		||||
			try
 | 
			
		||||
			{
 | 
			
		||||
				StatusLogger.UpdateMessage(UiStringKey.loading_database);
 | 
			
		||||
				_app.LoadDatabase(_ioc, _databaseData == null ? null : _databaseData.Result, _pass, _key, StatusLogger);
 | 
			
		||||
				MemoryStream memoryStream = _databaseData == null ? null : _databaseData.Result;
 | 
			
		||||
				_app.LoadDatabase(_ioc, memoryStream, _pass, _key, StatusLogger);
 | 
			
		||||
				SaveFileData (_ioc, _key);
 | 
			
		||||
				
 | 
			
		||||
			} catch (KeyFileException) {
 | 
			
		||||
@@ -56,7 +57,7 @@ namespace keepass2android
 | 
			
		||||
				Finish(false, /*TODO Localize: use Keepass error text KPRes.KeyFileError (including "or invalid format")*/ _app.GetResourceString(UiStringKey.keyfile_does_not_exist));
 | 
			
		||||
			}
 | 
			
		||||
			catch (Exception e) {
 | 
			
		||||
				Kp2aLog.Log("Exception: " + e.Message);
 | 
			
		||||
				Kp2aLog.Log("Exception: " + e);
 | 
			
		||||
				Finish(false, "An error occured: " + e.Message);
 | 
			
		||||
				return;
 | 
			
		||||
			} 
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user