Support LUID in cSharp miCASA APIs. Windows only change.
This commit is contained in:
parent
f7441b20ac
commit
f6c4512fb4
@ -245,6 +245,7 @@
|
|||||||
<Compile Include="verbs\ISSVerb.cs">
|
<Compile Include="verbs\ISSVerb.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="verbs\MergeCache.cs" />
|
||||||
<Compile Include="verbs\ObjectSerialization.cs">
|
<Compile Include="verbs\ObjectSerialization.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
141
CASA/micasad/verbs/MergeCache.cs
Normal file
141
CASA/micasad/verbs/MergeCache.cs
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
using System;
|
||||||
|
using sscs.verbs;
|
||||||
|
using sscs.cache;
|
||||||
|
using sscs.common;
|
||||||
|
using sscs.constants;
|
||||||
|
using sscs.lss;
|
||||||
|
|
||||||
|
namespace sscs.verbs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Summary description for MergeCache.
|
||||||
|
/// </summary>
|
||||||
|
internal class MergeCache : SSVerb
|
||||||
|
{
|
||||||
|
private ushort msgId = 0;
|
||||||
|
private uint inMsgLen = 0;
|
||||||
|
private uint outMsgLen = 0;
|
||||||
|
|
||||||
|
private int retCode = 0;
|
||||||
|
|
||||||
|
private byte[] inBuf;
|
||||||
|
private byte[] outBuf;
|
||||||
|
|
||||||
|
public void SetMessageContent(byte[] ipcBytes)
|
||||||
|
{
|
||||||
|
CSSSLogger.ExecutionTrace(this);
|
||||||
|
inBuf = ipcBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This method does the actual implementation of MergeSecret
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
public byte[] ProcessRequest(UserIdentifier userId)
|
||||||
|
{
|
||||||
|
|
||||||
|
CSSSLogger.ExecutionTrace(this);
|
||||||
|
UserIdentifier tempUserId = userId;
|
||||||
|
|
||||||
|
/* 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.");
|
||||||
|
|
||||||
|
|
||||||
|
// get the src LUID
|
||||||
|
int luidLow = BitConverter.ToInt32(inBuf, 14);
|
||||||
|
int luidHigh = BitConverter.ToInt32(inBuf, 18);
|
||||||
|
|
||||||
|
// get the target LUID
|
||||||
|
int targetLuidLow = BitConverter.ToInt32(inBuf, 30);
|
||||||
|
int targetLuidHigh = BitConverter.ToInt32(inBuf, 34);
|
||||||
|
|
||||||
|
// get destroy flag
|
||||||
|
int iDestroySrcCache = BitConverter.ToInt32(inBuf, 38);
|
||||||
|
|
||||||
|
|
||||||
|
#if W32
|
||||||
|
// only allow the merge if the calling process is "System"
|
||||||
|
WinUserIdentifier callingUser = (WinUserIdentifier)userId;
|
||||||
|
if ((callingUser.GetUIDLow() == 999) && (callingUser.GetUIDHigh() == 0))
|
||||||
|
{
|
||||||
|
|
||||||
|
// get the store for the src
|
||||||
|
try
|
||||||
|
{
|
||||||
|
WinUserIdentifier srcUser = new WinUserIdentifier(luidLow, luidHigh);
|
||||||
|
SecretStore srcStore = SessionManager.GetUserSecretStore(srcUser);
|
||||||
|
|
||||||
|
WinUserIdentifier targetUser = new WinUserIdentifier(targetLuidLow, targetLuidHigh);
|
||||||
|
SecretStore targetStore = SessionManager.CreateUserSession(targetUser);
|
||||||
|
|
||||||
|
byte[] baSecrets = LocalStorage.GetSecretsAsXMLStream(srcStore, ConstStrings.SSCS_SESSION_KEY_CHAIN_ID).ToArray();
|
||||||
|
|
||||||
|
if (baSecrets != null)
|
||||||
|
{
|
||||||
|
targetStore.MergeXMLSecrets(baSecrets);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iDestroySrcCache > 0)
|
||||||
|
{
|
||||||
|
SessionManager.RemoveUserSession(srcUser, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
CSSSLogger.DbgLog(e.ToString());
|
||||||
|
retCode = IPCRetCodes.SSCS_E_INVALID_INPUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retCode = IPCRetCodes.SSCS_E_INVALID_INPUT;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
retCode = IPCRetCodes.SSCS_E_SYSTEM_ERROR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
msgId = 19;
|
||||||
|
outMsgLen = 10;
|
||||||
|
outBuf = new byte[10];
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -103,17 +103,38 @@ namespace Novell.Casa
|
|||||||
string sUsername,
|
string sUsername,
|
||||||
string sPassword)
|
string sPassword)
|
||||||
{
|
{
|
||||||
NativeCalls.SetCredential(ssFlags, sAppSecretID, sSharedSecretID, unFlag, NativeCalls.SSCS_CRED_TYPE_BASIC_F, sUsername, sPassword);
|
SetCredential(ssFlags, sAppSecretID, sSharedSecretID, unFlag, sUsername, sPassword, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetCredential(
|
||||||
|
uint ssFlags,
|
||||||
|
string sAppSecretID,
|
||||||
|
string sSharedSecretID,
|
||||||
|
uint unFlag,
|
||||||
|
string sUsername,
|
||||||
|
string sPassword,
|
||||||
|
WinLuid luid)
|
||||||
|
{
|
||||||
|
NativeCalls.SetCredential(ssFlags, sAppSecretID, sSharedSecretID, unFlag, NativeCalls.SSCS_CRED_TYPE_BASIC_F, sUsername, sPassword, luid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BasicCredential GetCredential(
|
||||||
|
uint ssFlags,
|
||||||
|
string sAppSecretID,
|
||||||
|
string sSharedSecretID,
|
||||||
|
uint unFlag)
|
||||||
|
{
|
||||||
|
return GetCredential(ssFlags, sAppSecretID, sSharedSecretID, unFlag, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BasicCredential GetCredential(
|
public static BasicCredential GetCredential(
|
||||||
uint ssFlags,
|
uint ssFlags,
|
||||||
string sAppSecretID,
|
string sAppSecretID,
|
||||||
string sSharedSecretID,
|
string sSharedSecretID,
|
||||||
uint unFlag)
|
uint unFlag,
|
||||||
|
WinLuid luid)
|
||||||
{
|
{
|
||||||
return NativeCalls.GetCredential(ssFlags, sAppSecretID, sSharedSecretID, unFlag, NativeCalls.SSCS_CRED_TYPE_BASIC_F);
|
return NativeCalls.GetCredential(ssFlags, sAppSecretID, sSharedSecretID, unFlag, NativeCalls.SSCS_CRED_TYPE_BASIC_F, luid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RemoveCredential(
|
public static void RemoveCredential(
|
||||||
@ -136,6 +157,11 @@ namespace Novell.Casa
|
|||||||
string secretID)
|
string secretID)
|
||||||
{
|
{
|
||||||
return NativeCalls.IsSecretPersistent(ssFlags,secretID);
|
return NativeCalls.IsSecretPersistent(ssFlags,secretID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void miCASAMergeCache(WinLuid srcLuid, WinLuid destLuid, bool bDestroySrcCache)
|
||||||
|
{
|
||||||
|
NativeCalls.miCASAMergeCache(srcLuid, destLuid, bDestroySrcCache);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,6 +122,13 @@ namespace Novell.Casa
|
|||||||
public byte[] password;
|
public byte[] password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||||
|
private struct LUID
|
||||||
|
{
|
||||||
|
public int luidLow;
|
||||||
|
public int luidHigh;
|
||||||
|
}
|
||||||
|
|
||||||
// * The following functions will be exposed as exported API:
|
// * The following functions will be exposed as exported API:
|
||||||
// **************************************************************
|
// **************************************************************
|
||||||
// * These function calls will utilize the Support Functions for
|
// * These function calls will utilize the Support Functions for
|
||||||
@ -204,6 +211,82 @@ namespace Novell.Casa
|
|||||||
[In, Out] SSCS_EXT_T ext
|
[In, Out] SSCS_EXT_T ext
|
||||||
);
|
);
|
||||||
|
|
||||||
|
[DllImport(NDK_LIBRARY)]
|
||||||
|
internal static extern int miCASAMergeCache
|
||||||
|
(
|
||||||
|
[In] SSCS_EXT_T extSrc,
|
||||||
|
[In] SSCS_EXT_T extDest,
|
||||||
|
[In] uint bDestroySrcCache
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
internal static void miCASAMergeCache(WinLuid srcLUID, WinLuid destLUID, bool bDestroySrc)
|
||||||
|
{
|
||||||
|
// marshall the luids
|
||||||
|
SSCS_EXT_T extSrc = new SSCS_EXT_T();
|
||||||
|
LUID sluid;
|
||||||
|
if (srcLUID != null)
|
||||||
|
{
|
||||||
|
// allocate a structure to marshal
|
||||||
|
sluid = new LUID();
|
||||||
|
sluid.luidHigh = srcLUID.GetHighPart();
|
||||||
|
sluid.luidLow = srcLUID.GetLowPart();
|
||||||
|
|
||||||
|
extSrc.extID = 1;
|
||||||
|
extSrc.version = 1;
|
||||||
|
extSrc.ext = Marshal.AllocHGlobal(Marshal.SizeOf(sluid));
|
||||||
|
|
||||||
|
Marshal.StructureToPtr(sluid, extSrc.ext, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new MiCasaException(MiCasaException.NSSCS_E_INVALID_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
SSCS_EXT_T extDest = new SSCS_EXT_T();
|
||||||
|
LUID dluid;
|
||||||
|
if (destLUID != null)
|
||||||
|
{
|
||||||
|
// allocate a structure to marshal
|
||||||
|
dluid = new LUID();
|
||||||
|
dluid.luidHigh = destLUID.GetHighPart();
|
||||||
|
dluid.luidLow = destLUID.GetLowPart();
|
||||||
|
|
||||||
|
extDest.extID = 1;
|
||||||
|
extDest.version = 1;
|
||||||
|
extDest.ext = Marshal.AllocHGlobal(Marshal.SizeOf(dluid));
|
||||||
|
|
||||||
|
Marshal.StructureToPtr(dluid, extDest.ext, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new MiCasaException(MiCasaException.NSSCS_E_INVALID_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint iDestroySrcCache = 0;
|
||||||
|
if (bDestroySrc)
|
||||||
|
{
|
||||||
|
iDestroySrcCache = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make the call
|
||||||
|
int rcode = miCASAMergeCache(extSrc, extDest, iDestroySrcCache);
|
||||||
|
|
||||||
|
if (extSrc.ext != IntPtr.Zero)
|
||||||
|
Marshal.FreeHGlobal(extSrc.ext);
|
||||||
|
|
||||||
|
if (extDest.ext != IntPtr.Zero)
|
||||||
|
Marshal.FreeHGlobal(extDest.ext);
|
||||||
|
|
||||||
|
if (rcode != 0)
|
||||||
|
{
|
||||||
|
throw new MiCasaException(rcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <param name="ssFlags"></param>
|
/// <param name="ssFlags"></param>
|
||||||
/// <param name="sAppSecretID"></param>
|
/// <param name="sAppSecretID"></param>
|
||||||
@ -216,7 +299,8 @@ namespace Novell.Casa
|
|||||||
string sAppSecretID,
|
string sAppSecretID,
|
||||||
string sSharedSecretID,
|
string sSharedSecretID,
|
||||||
uint unFlag,
|
uint unFlag,
|
||||||
uint credType)
|
uint credType,
|
||||||
|
WinLuid luid)
|
||||||
{
|
{
|
||||||
if (sAppSecretID == null || sAppSecretID.Length == 0)
|
if (sAppSecretID == null || sAppSecretID.Length == 0)
|
||||||
throw new MiCasaException(MiCasaException.NSSCS_E_INVALID_PARAM);
|
throw new MiCasaException(MiCasaException.NSSCS_E_INVALID_PARAM);
|
||||||
@ -243,6 +327,24 @@ namespace Novell.Casa
|
|||||||
IntPtr pCredential = Marshal.AllocHGlobal(Marshal.SizeOf(credential));
|
IntPtr pCredential = Marshal.AllocHGlobal(Marshal.SizeOf(credential));
|
||||||
Marshal.StructureToPtr(credential, pCredential, false);
|
Marshal.StructureToPtr(credential, pCredential, false);
|
||||||
|
|
||||||
|
// marshall luid if there is one
|
||||||
|
SSCS_EXT_T ext = new SSCS_EXT_T();
|
||||||
|
LUID sluid;
|
||||||
|
if ((luid != null) &&
|
||||||
|
((luid.GetHighPart() != 0) || (luid.GetLowPart() != 0)))
|
||||||
|
{
|
||||||
|
// allocate a structure to marshal
|
||||||
|
sluid = new LUID();
|
||||||
|
sluid.luidHigh = luid.GetHighPart();
|
||||||
|
sluid.luidLow = luid.GetLowPart();
|
||||||
|
|
||||||
|
ext.extID = 1;
|
||||||
|
ext.version = 1;
|
||||||
|
ext.ext = Marshal.AllocHGlobal(Marshal.SizeOf(sluid));
|
||||||
|
|
||||||
|
Marshal.StructureToPtr(sluid, ext.ext, false);
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
rcode = miCASAGetCredential(
|
rcode = miCASAGetCredential(
|
||||||
@ -251,7 +353,7 @@ namespace Novell.Casa
|
|||||||
sharedID,
|
sharedID,
|
||||||
ref credType,
|
ref credType,
|
||||||
pCredential,
|
pCredential,
|
||||||
new SSCS_EXT_T()
|
ext
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
@ -287,7 +389,8 @@ namespace Novell.Casa
|
|||||||
uint unFlag,
|
uint unFlag,
|
||||||
uint uCredType,
|
uint uCredType,
|
||||||
string sUsername,
|
string sUsername,
|
||||||
string sPassword)
|
string sPassword,
|
||||||
|
WinLuid luid)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (sAppSecretID == null || sUsername == null || sPassword == null
|
if (sAppSecretID == null || sUsername == null || sPassword == null
|
||||||
@ -320,13 +423,31 @@ namespace Novell.Casa
|
|||||||
|
|
||||||
Marshal.StructureToPtr(credential, pCredential, true);
|
Marshal.StructureToPtr(credential, pCredential, true);
|
||||||
|
|
||||||
|
SSCS_EXT_T ext = new SSCS_EXT_T();
|
||||||
|
LUID sluid;
|
||||||
|
if ((luid != null) &&
|
||||||
|
((luid.GetHighPart() != 0) || (luid.GetLowPart() != 0)))
|
||||||
|
{
|
||||||
|
// allocate a structure to marshal
|
||||||
|
sluid = new LUID();
|
||||||
|
sluid.luidHigh = luid.GetHighPart();
|
||||||
|
sluid.luidLow = luid.GetLowPart();
|
||||||
|
|
||||||
|
ext.extID = 1;
|
||||||
|
ext.version = 1;
|
||||||
|
ext.ext = Marshal.AllocHGlobal(Marshal.SizeOf(sluid));
|
||||||
|
|
||||||
|
Marshal.StructureToPtr(sluid, ext.ext, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
rcode = miCASASetCredential
|
rcode = miCASASetCredential
|
||||||
(ssFlags,
|
(ssFlags,
|
||||||
appSecretID,
|
appSecretID,
|
||||||
sharedID,
|
sharedID,
|
||||||
uCredType,
|
uCredType,
|
||||||
pCredential,
|
pCredential,
|
||||||
new SSCS_EXT_T()
|
ext
|
||||||
);
|
);
|
||||||
|
|
||||||
if (rcode != 0)
|
if (rcode != 0)
|
||||||
|
29
CASA/sharp/Novell.Casa.MiCasa/WinLuid.cs
Normal file
29
CASA/sharp/Novell.Casa.MiCasa/WinLuid.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Novell.Casa
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Summary description for WinLuid.
|
||||||
|
/// </summary>
|
||||||
|
public class WinLuid
|
||||||
|
{
|
||||||
|
private int m_low = 0;
|
||||||
|
private int m_high = 0;
|
||||||
|
|
||||||
|
public WinLuid(int lowPart, int highPart )
|
||||||
|
{
|
||||||
|
m_low = lowPart;
|
||||||
|
m_high = highPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLowPart()
|
||||||
|
{
|
||||||
|
return m_low;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetHighPart()
|
||||||
|
{
|
||||||
|
return m_high;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user