Code to maintain a single server keychain.

This commit is contained in:
Jim Norman 2006-12-04 09:07:14 +00:00
parent ac1d64c52a
commit effc79937b
3 changed files with 106 additions and 16 deletions

View File

@ -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;
@ -62,9 +64,65 @@ namespace sscs.cache
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

View File

@ -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

View File

@ -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)
@ -55,12 +61,19 @@ namespace sscs.common
} }
override internal string GetUserHomeDir() override internal string GetUserHomeDir()
{
if (m_userHome == null)
{ {
uint uid = (uint)userId.GetUID(); uint uid = (uint)userId.GetUID();
Mono.Unix.UnixUserInfo uui = new Mono.Unix.UnixUserInfo(uid); Mono.Unix.UnixUserInfo uui = new Mono.Unix.UnixUserInfo(uid);
userName = uui.UserName; userName = uui.UserName;
return uui.HomeDirectory; return uui.HomeDirectory;
} }
else
{
return m_userHome;
}
}
} }