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

@ -27,7 +27,9 @@ using System.IO;
using System.Xml; 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
@ -769,7 +840,11 @@ namespace sscs.cache
if (lss != null) if (lss != null)
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

@ -143,7 +143,9 @@ namespace sscs.constants
// these are used in the GUI too. // these are used in the GUI too.
internal static string CONFIG_PERSISTENT_DIRECTORY = "PersistentDirectory"; internal static string CONFIG_PERSISTENT_DIRECTORY = "PersistentDirectory";
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";
} }

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) internal UnixUser(UserIdentifier unixUserId, string sUserHome)
{ {
m_userHome = sUserHome;
this.UnixUser(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;
}
} }