Code to maintain a single server keychain.
This commit is contained in:
		
							
								
								
									
										81
									
								
								CASA/micasad/cache/SecretStore.cs
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										81
									
								
								CASA/micasad/cache/SecretStore.cs
									
									
									
									
										vendored
									
									
								
							| @@ -28,6 +28,8 @@ using System.Xml; | |||||||
| using System.Xml.Serialization; | using System.Xml.Serialization; | ||||||
| using System.Security.Cryptography; | using System.Security.Cryptography; | ||||||
| using System.Text; | using System.Text; | ||||||
|  | using System.Diagnostics; | ||||||
|  |  | ||||||
| using sscs.cache; | using sscs.cache; | ||||||
| using sscs.common; | using sscs.common; | ||||||
| using sscs.constants; | using sscs.constants; | ||||||
| @@ -60,11 +62,67 @@ namespace sscs.cache | |||||||
|         bool bIsStorePersistent = false;  |         bool bIsStorePersistent = false;  | ||||||
|         bool bIsServerStorePersistent = false;  |         bool bIsServerStorePersistent = false;  | ||||||
|  |  | ||||||
| 	string m_persistenceDirectory = null; | 	    string m_persistenceDirectory = null; | ||||||
| 	private static string POLICY_DIRECTORY = "/home/.casa"; | 	    private static string POLICY_DIRECTORY = "/home/.casa";	 | ||||||
|  | 	    private MPFileWatcher mpWatcher = null; | ||||||
|  |  | ||||||
| 	private MPFileWatcher mpWatcher = null; |         private static SecretStore casaStore; | ||||||
|  |  | ||||||
|  |         static SecretStore() | ||||||
|  |         { | ||||||
|  |             if (casaStore == null) | ||||||
|  |             { | ||||||
|  |                 User casaUser; | ||||||
|  |  | ||||||
|  | #if LINUX                 | ||||||
|  |                 Directory.CreateDirectory("/home/.casa/" + constants.ConstStrings.MICASA_SERVICE_NAME); | ||||||
|  |                 casaUser = new UnixUser(new UnixUserIdentifier(GetCasaServiceUID()), "/home/.casa/" + constants.ConstStrings.MICASA_SERVICE_NAME)); | ||||||
|  | #else | ||||||
|  |                 // create a data directory for server secrets | ||||||
|  |                 Process proc = Process.GetCurrentProcess(); | ||||||
|  |                 string exePath = proc.MainModule.FileName; | ||||||
|  |                 exePath = exePath.Substring(0, exePath.LastIndexOf("\\")); | ||||||
|  |                 Directory.CreateDirectory(exePath + "\\data"); | ||||||
|  |  | ||||||
|  |                 // create a casa User | ||||||
|  |                 casaUser = new WinUser(new WinUserIdentifier(998, 0), exePath + "\\data");                                                                 | ||||||
|  | #endif | ||||||
|  |                 casaUser.SetUserName(constants.ConstStrings.MICASA_SERVICE_NAME); | ||||||
|  |                 casaStore = casaUser.GetSecretStore(); | ||||||
|  |                 casaStore.refCount++; | ||||||
|  |  | ||||||
|  |                 casaStore.AddKeyChain(new KeyChain(constants.ConstStrings.SSCS_SERVER_KEY_CHAIN_ID + "\0")); | ||||||
|  |                 casaStore.StartPersistenceOfServerSecretsBySystemKey(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  | #if LINUX | ||||||
|  |         static private int GetCasaServiceUID() | ||||||
|  |         { | ||||||
|  |             Mono.Unix.UnixUserInfo uui; | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 uui = new Mono.Unix.UnixUserInfo(constants.ConstStrings.MICASA_SERVICE_NAME); | ||||||
|  |             } | ||||||
|  |             catch | ||||||
|  |             { | ||||||
|  |                 Process proc = new Process(); | ||||||
|  |  | ||||||
|  |                 ProcessStartInfo psi = new ProcessStartInfo("useradd"); | ||||||
|  |                 psi.Arguments = constants.ConstStrings.MICASA_SERVICE_NAME; | ||||||
|  |                 psi.UseShellExecute = false; | ||||||
|  |                 psi.RedirectStandardOutput = true; | ||||||
|  |  | ||||||
|  |                 proc.StartInfo = psi; | ||||||
|  |                 proc.Start(); | ||||||
|  |                 proc.WaitForExit(); | ||||||
|  |  | ||||||
|  |                 uui = new Mono.Unix.UnixUserInfo(constants.ConstStrings.MICASA_SERVICE_NAME);                | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return uui.UserId; | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|         private DateTime createTime; |         private DateTime createTime; | ||||||
|         public DateTime CreateTime |         public DateTime CreateTime | ||||||
|         { |         { | ||||||
| @@ -741,6 +799,15 @@ namespace sscs.cache | |||||||
|  |  | ||||||
|         internal KeyChain GetKeyChain(string id) |         internal KeyChain GetKeyChain(string id) | ||||||
|         { |         { | ||||||
|  |             // if this is the server keychain, return the casaStore controlled one. | ||||||
|  |             if (id.StartsWith(constants.ConstStrings.SSCS_SERVER_KEY_CHAIN_ID)) | ||||||
|  |             { | ||||||
|  |                 KeyChain casakc = (KeyChain)casaStore.keyChainList[id]; | ||||||
|  |                 casakc.AccessedTime = DateTime.Now; | ||||||
|  |                 return casakc;                | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |  | ||||||
|             if(keyChainList.ContainsKey(id)) |             if(keyChainList.ContainsKey(id)) | ||||||
|             { |             { | ||||||
|                CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " Keychain already exists."); |                CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " Keychain already exists."); | ||||||
| @@ -757,6 +824,10 @@ namespace sscs.cache | |||||||
| 		 | 		 | ||||||
| 		internal bool CheckIfKeyChainExists(string id) | 		internal bool CheckIfKeyChainExists(string id) | ||||||
|         { |         { | ||||||
|  |             // return true if this is the server keychain | ||||||
|  |             if (id.StartsWith(constants.ConstStrings.SSCS_SERVER_KEY_CHAIN_ID)) | ||||||
|  |                 return true; | ||||||
|  |  | ||||||
|             if(keyChainList.ContainsKey(id)) |             if(keyChainList.ContainsKey(id)) | ||||||
|                 return true; |                 return true; | ||||||
|             else |             else | ||||||
| @@ -770,6 +841,10 @@ namespace sscs.cache | |||||||
| 				lss.PersistStoreWithDelay(); | 				lss.PersistStoreWithDelay(); | ||||||
| 			if (slss != null) | 			if (slss != null) | ||||||
| 			    slss.PersistServerStoreWithDelay(); | 			    slss.PersistServerStoreWithDelay(); | ||||||
|  |  | ||||||
|  |             // persist casastore data | ||||||
|  |             if (casaStore.slss != null) | ||||||
|  |                 casaStore.slss.PersistServerStoreWithDelay(); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|         /* This function would need to do any storage/cleanup required |         /* This function would need to do any storage/cleanup required | ||||||
|   | |||||||
| @@ -145,6 +145,8 @@ namespace sscs.constants | |||||||
| 		internal static string CONFIG_PERSIST_SECRETS			= "PersistSecrets"; | 		internal static string CONFIG_PERSIST_SECRETS			= "PersistSecrets"; | ||||||
| 		internal static string CONFIG_DECRYPT_USING_DESKTOP_PASS	= "DecryptUsingDesktopPassword"; | 		internal static string CONFIG_DECRYPT_USING_DESKTOP_PASS	= "DecryptUsingDesktopPassword"; | ||||||
|  |  | ||||||
|  |         internal static string MICASA_SERVICE_NAME = "casa-service-user"; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal class ConstFlags |     internal class ConstFlags | ||||||
|   | |||||||
| @@ -32,16 +32,22 @@ namespace sscs.common | |||||||
| { | { | ||||||
|     internal class UnixUser : User |     internal class UnixUser : User | ||||||
|     { |     { | ||||||
|  |         private string m_userHome = null; | ||||||
|  |  | ||||||
|         internal UnixUser() |         internal UnixUser() | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         internal UnixUser(UserIdentifier unixUserId, string sUserHome) | ||||||
|  |         { | ||||||
|  |             m_userHome = sUserHome; | ||||||
|  |             this.UnixUser(unixUserId);             | ||||||
|  |         } | ||||||
|  |  | ||||||
|         internal UnixUser(UserIdentifier unixUserId) |         internal UnixUser(UserIdentifier unixUserId) | ||||||
|         {             |         {             | ||||||
|              |  | ||||||
|             userId = unixUserId; |             userId = unixUserId; | ||||||
|             secretStore = new SecretStore(this);             |             secretStore = new SecretStore(this);             | ||||||
|              |  | ||||||
|         } |         } | ||||||
|     |     | ||||||
|         override internal void SetUserName(string username) |         override internal void SetUserName(string username) | ||||||
| @@ -56,10 +62,17 @@ namespace sscs.common | |||||||
|  |  | ||||||
|         override internal string GetUserHomeDir() |         override internal string GetUserHomeDir() | ||||||
|         { |         { | ||||||
|             uint uid = (uint)userId.GetUID(); |             if (m_userHome == null) | ||||||
| 			Mono.Unix.UnixUserInfo uui = new Mono.Unix.UnixUserInfo(uid); |             { | ||||||
| 			userName = uui.UserName; |                 uint uid = (uint)userId.GetUID(); | ||||||
|             return uui.HomeDirectory;  |                 Mono.Unix.UnixUserInfo uui = new Mono.Unix.UnixUserInfo(uid); | ||||||
|  |                 userName = uui.UserName; | ||||||
|  |                 return uui.HomeDirectory; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 return m_userHome; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|          |          | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user