From 468d9b87d208ec12b630686942c19dfe8c58c72b Mon Sep 17 00:00:00 2001 From: Jim Norman Date: Tue, 27 Jun 2006 17:05:51 +0000 Subject: [PATCH] Added RemoveKey verb --- CASA/micasad/common/RequestParser.cs | 3 +- CASA/micasad/verbs/RemoveKey.cs | 198 +++++++++++++++++++++++++++ 2 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 CASA/micasad/verbs/RemoveKey.cs diff --git a/CASA/micasad/common/RequestParser.cs b/CASA/micasad/common/RequestParser.cs index c2e610b2..3b3cf822 100644 --- a/CASA/micasad/common/RequestParser.cs +++ b/CASA/micasad/common/RequestParser.cs @@ -82,7 +82,8 @@ namespace sscs.common msgIdMap.Add(19,"sscs.verbs.IsSecretPersistent"); msgIdMap.Add(20,"sscs.verbs.ObjectSerialization"); msgIdMap.Add(21,"sscs.verbs.WriteBinaryKey"); - msgIdMap.Add(22,"sscs.verbs.ReadBinaryKey"); + msgIdMap.Add(22,"sscs.verbs.ReadBinaryKey"); + msgIdMap.Add(23,"sscs.verbs.RemoveKey"); } diff --git a/CASA/micasad/verbs/RemoveKey.cs b/CASA/micasad/verbs/RemoveKey.cs new file mode 100644 index 00000000..b6b0e8b8 --- /dev/null +++ b/CASA/micasad/verbs/RemoveKey.cs @@ -0,0 +1,198 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +using System; +using System.Collections; +using System.Text; +using System.Threading; +using sscs.verbs; +using sscs.cache; +using sscs.common; +using sscs.constants; +namespace sscs.verbs +{ + + /* + * This class is implementation of ReadKey call. + * There will be one instance existing for every call made by the client. + */ + + internal class RemoveKey : SSVerb + { + private ushort msgId = 0; + private uint inMsgLen = 0; + private uint outMsgLen = 0; + private uint keyChainIdLen = 0; + private uint secretIdLen = 0; + private int retCode = 0; + private string keyChainId; + private string secretId; + private uint keyLen; + private string key; + + private byte[] inBuf; + private byte[] outBuf; + + /* + * This method sets the class member with the byte array received. + */ + + public void SetMessageContent(byte[] ipcBytes) + { + CSSSLogger.ExecutionTrace(this); + inBuf = ipcBytes; + } + + /* + * This method does the actual implementation of ReadKey + * + */ + + public byte[] ProcessRequest(UserIdentifier userId) + { + + Secret secret = null; + + CSSSLogger.ExecutionTrace(this); + + /* If an exception occurs in message format decoding, + * it is handled by AppHandler + */ + + // Message Format decipher - Start + msgId = BitConverter.ToUInt16(inBuf,0); + inMsgLen = BitConverter.ToUInt32(inBuf,2); + + if( inMsgLen != inBuf.Length ) + throw new FormatException(" MsgLen sent does not match the length of the message received."); + + keyChainIdLen = BitConverter.ToUInt32(inBuf,6); + + byte[] keyChainIdArr = new byte[keyChainIdLen]; + Array.Copy(inBuf,10,keyChainIdArr,0,keyChainIdLen); + keyChainId = Encoding.UTF8.GetString(keyChainIdArr); + + secretIdLen = BitConverter.ToUInt32(inBuf, + (10 + (int)keyChainIdLen)); + + byte[] secretIdArr = new byte[secretIdLen]; + Array.Copy(inBuf,(10+keyChainIdLen+4),secretIdArr,0,secretIdLen); + secretId = Encoding.UTF8.GetString(secretIdArr); + // Message Format decipher - End + + keyLen = BitConverter.ToUInt32(inBuf,(14+(int)keyChainIdLen+(int)secretIdLen)); + + byte[] keyArr = new byte[keyLen]; + Array.Copy(inBuf,(18+(int)keyChainIdLen+(int)secretIdLen),keyArr,0,keyLen); + key = Encoding.UTF8.GetString(keyArr); + + try + { + KeyChain keyChain = null; + // Secret secret = null; + SecretStore ssStore = SessionManager.GetUserSecretStore(userId); + if (!ssStore.IsStoreLocked()) + { + if( ssStore.CheckIfKeyChainExists(keyChainId) ) + { + keyChain = ssStore.GetKeyChain(keyChainId); + if( keyChain.CheckIfSecretExists(secretId) == false) + { + retCode = IPCRetCodes.SSCS_E_SECRETID_DOES_NOT_EXIST; + } + else + { + secret = keyChain.GetSecret(secretId); + if (secret != null) + { + try + { + secret.RemoveKeyValue(keyChain, key); + } + catch (Exception e) + { + CSSSLogger.ExpLog(e.ToString()); + } + } + else + { + retCode = IPCRetCodes.SSCS_E_SECRETID_DOES_NOT_EXIST; + } + } + } + else + { + retCode = IPCRetCodes.SSCS_E_KEYCHAIN_DOES_NOT_EXIST; + } + } + else + retCode = IPCRetCodes.SSCS_SECRET_STORE_IS_LOCKED; + + } + catch(UserNotInSessionException) + { + CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " Unable user's secretstore" ); + retCode = IPCRetCodes.SSCS_E_SYSTEM_ERROR; + } + catch(Exception e) + { + CSSSLogger.ExpLog(e.ToString()); + retCode = IPCRetCodes.SSCS_E_SYSTEM_ERROR; + } + + // Construct a Reply + try + { + msgId = 17; + outMsgLen = 10; + outBuf = new byte[outMsgLen]; + byte[] t = new byte[10]; + + t = BitConverter.GetBytes((ushort)msgId); + Array.Copy(t, 0, outBuf, 0, 2); + + t = BitConverter.GetBytes((uint)outMsgLen); + Array.Copy(t, 0, outBuf, 2, 4); + + t = BitConverter.GetBytes(retCode); + Array.Copy(t, 0, outBuf, 6, 4); + } + catch (Exception e) + { + CSSSLogger.ExpLog(e.ToString()); + throw new FormatException("Unable to form the response " + e.ToString()); + } + return outBuf; + + } + + /* + * Gives the name of operation performed. Will be used in case + * of error. + */ + public string GetVerbName() + { + CSSSLogger.ExecutionTrace(this); + return this.ToString(); + } + } +}