FlattenCredentials.cp [plain text]
/*
* CCIFlattenedCredentials.cp
*
* $Header: /cvs/kfm/KerberosFramework/CredentialsCache/Sources/FlattenCredentials.cp,v 1.14 2004/09/08 20:48:35 lxs Exp $
*/
#include "FlattenCredentials.h"
// These functions write credentials to streams and extract them back from streams.
// Used to serialize credentials structures across various IPC layers.
void WriteCredentials (std::ostream& ioStream, const cc_credentials_union& inCredentials)
{
CCIUInt32 version = inCredentials.version;
//dprintf ("Entering %s(cc_credentials_union):", __FUNCTION__);
// Output the version followed by the appropriate creds
ioStream.write ((char *)&version, sizeof (version));
switch (inCredentials.version) {
case cc_credentials_v4:
WriteV4Credentials (ioStream, *inCredentials.credentials.credentials_v4);
break;
case cc_credentials_v5:
WriteV5Credentials (ioStream, *inCredentials.credentials.credentials_v5);
break;
default:
throw CCIException (ccErrBadCredentialsVersion);
}
}
void WriteV4Credentials (std::ostream& ioStream, const cc_credentials_v4_t& inCredentials)
{
//dprintf ("Entering %s():", __FUNCTION__);
ioStream.write ((char *)&inCredentials, sizeof (inCredentials));
}
void ReadV4Credentials (std::istream& ioStream, cc_credentials_v4_t& inCredentials)
{
//dprintf ("Entering %s():", __FUNCTION__);
ioStream.read ((char *)&inCredentials, sizeof (inCredentials));
}
void WriteV5Credentials (std::ostream& ioStream, const cc_credentials_v5_t& inCredentials)
{
//dprintf ("Entering %s():", __FUNCTION__);
// Write out various parts of the creds in order
WriteString (ioStream, inCredentials.client);
WriteString (ioStream, inCredentials.server);
WriteData (ioStream, inCredentials.keyblock);
WriteUInt32 (ioStream, inCredentials.authtime);
WriteUInt32 (ioStream, inCredentials.starttime);
WriteUInt32 (ioStream, inCredentials.endtime);
WriteUInt32 (ioStream, inCredentials.renew_till);
WriteUInt32 (ioStream, inCredentials.is_skey);
WriteUInt32 (ioStream, inCredentials.ticket_flags);
WriteDataArray (ioStream, inCredentials.addresses);
WriteData (ioStream, inCredentials.ticket);
WriteData (ioStream, inCredentials.second_ticket);
WriteDataArray (ioStream, inCredentials.authdata);
}
void ReadV5Credentials (std::istream& ioStream, cc_credentials_v5_t& inCredentials)
{
//dprintf ("Entering %s():", __FUNCTION__);
// Suck in the various parts of the creds in order
try {
ReadString (ioStream, inCredentials.client);
ReadString (ioStream, inCredentials.server);
ReadData (ioStream, inCredentials.keyblock);
ReadUInt32 (ioStream, inCredentials.authtime);
ReadUInt32 (ioStream, inCredentials.starttime);
ReadUInt32 (ioStream, inCredentials.endtime);
ReadUInt32 (ioStream, inCredentials.renew_till);
ReadUInt32 (ioStream, inCredentials.is_skey);
ReadUInt32 (ioStream, inCredentials.ticket_flags);
ReadDataArray (ioStream, inCredentials.addresses);
ReadData (ioStream, inCredentials.ticket);
ReadData (ioStream, inCredentials.second_ticket);
ReadDataArray (ioStream, inCredentials.authdata);
} catch (...) {
if (inCredentials.client != NULL) {
delete [] inCredentials.client;
inCredentials.client = NULL;
}
if (inCredentials.server != NULL) {
delete [] inCredentials.server;
inCredentials.server = NULL;
}
throw;
}
}
#if CCache_v2_compat
void WriteCompatCredentials (std::ostream& ioStream, const cred_union& inCredentials)
{
//dprintf ("Entering %s(cred_union):", __FUNCTION__);
WriteUInt32 (ioStream, inCredentials.cred_type);
switch (inCredentials.cred_type) {
case CC_CRED_V4:
WriteV4CompatCredentials (ioStream, *inCredentials.cred.pV4Cred);
break;
case CC_CRED_V5:
WriteV5CompatCredentials (ioStream, *inCredentials.cred.pV5Cred);
break;
default:
throw CCIException (ccErrBadCredentialsVersion);
}
}
void ReadV4CompatCredentials (std::istream& ioStream, cc_credentials_v4_compat& inCredentials)
{
//dprintf ("Entering %s():", __FUNCTION__);
ioStream.read ((char *)&inCredentials, sizeof (inCredentials));
}
void WriteV4CompatCredentials (std::ostream& ioStream, const cc_credentials_v4_compat& inCredentials)
{
//dprintf ("Entering %s():", __FUNCTION__);
ioStream.write ((char *)&inCredentials, sizeof (inCredentials));
}
void WriteV5CompatCredentials (std::ostream& ioStream, const cc_credentials_v5_compat& inCredentials)
{
//dprintf ("Entering %s():", __FUNCTION__);
WriteString (ioStream, inCredentials.client);
WriteString (ioStream, inCredentials.server);
WriteData (ioStream, inCredentials.keyblock);
WriteUInt32 (ioStream, inCredentials.authtime);
WriteUInt32 (ioStream, inCredentials.starttime);
WriteUInt32 (ioStream, inCredentials.endtime);
WriteUInt32 (ioStream, inCredentials.renew_till);
WriteUInt32 (ioStream, inCredentials.is_skey);
WriteUInt32 (ioStream, inCredentials.ticket_flags);
WriteDataArray (ioStream, inCredentials.addresses);
WriteData (ioStream, inCredentials.ticket);
WriteData (ioStream, inCredentials.second_ticket);
WriteDataArray (ioStream, inCredentials.authdata);
}
void ReadV5CompatCredentials (std::istream& ioStream, cc_credentials_v5_compat& inCredentials)
{
//dprintf ("Entering %s():", __FUNCTION__);
try {
ReadString (ioStream, inCredentials.client);
ReadString (ioStream, inCredentials.server);
ReadData (ioStream, inCredentials.keyblock);
ReadUInt32 (ioStream, inCredentials.authtime);
ReadUInt32 (ioStream, inCredentials.starttime);
ReadUInt32 (ioStream, inCredentials.endtime);
ReadUInt32 (ioStream, inCredentials.renew_till);
ReadUInt32 (ioStream, inCredentials.is_skey);
ReadUInt32 (ioStream, inCredentials.ticket_flags);
ReadDataArray (ioStream, inCredentials.addresses);
ReadData (ioStream, inCredentials.ticket);
ReadData (ioStream, inCredentials.second_ticket);
ReadDataArray (ioStream, inCredentials.authdata);
} catch (...) {
if (inCredentials.client != NULL) {
delete [] inCredentials.client;
inCredentials.client = NULL;
}
if (inCredentials.server != NULL) {
delete [] inCredentials.server;
inCredentials.server = NULL;
}
throw;
}
}
#endif // CCache_v2_Compat
void WriteData (std::ostream& ioStream, const cc_data& inData)
{
//dprintf ("Entering %s():", __FUNCTION__);
WriteUInt32 (ioStream, inData.type);
WriteUInt32 (ioStream, inData.length);
//dprintf ("Wrote type %d, length %d", inData.type, inData.length);
if (inData.length > 0) {
ioStream.write ((char *)inData.data, inData.length);
//dprintmem (inData.data, inData.length);
}
}
void ReadData (std::istream& ioStream, cc_data& inData)
{
//dprintf ("Entering %s():", __FUNCTION__);
ReadUInt32 (ioStream, inData.type);
ReadUInt32 (ioStream, inData.length);
//dprintf ("Read type %d, length %d", inData.type, inData.length);
if (inData.length > 0) {
inData.data = new char [inData.length];
ioStream.read ((char *)inData.data, inData.length);
//dprintmem (inData.data, inData.length);
} else {
inData.data = NULL;
}
}
void WriteDataArray (std::ostream& ioStream, cc_data** inDataArray)
{
//dprintf ("Entering %s():", __FUNCTION__);
CCIUInt32 arraySize = 0;
if (inDataArray != NULL) {
while (inDataArray [arraySize] != NULL) { arraySize++; }
}
WriteUInt32 (ioStream, arraySize);
for (CCIUInt32 i = 0; i < arraySize; i++) {
WriteData (ioStream, *(inDataArray [i]));
}
//dprintf ("Exiting %s():", __FUNCTION__);
}
void ReadDataArray (std::istream& ioStream, cc_data**& outDataArray)
{
//dprintf ("Entering %s():", __FUNCTION__);
CCIUInt32 arraySize = 0;
ReadUInt32 (ioStream, arraySize);
if (arraySize == 0) {
outDataArray = NULL;
return;
}
cc_data** dataArray = NULL;
try {
dataArray = new cc_data* [arraySize + 1];
for (CCIUInt32 i = 0; i < arraySize + 1; i++) {
dataArray [i] = NULL;
}
for (CCIUInt32 i = 0; i < arraySize; i++) {
dataArray [i] = new cc_data;
dataArray [i] -> data = NULL;
}
for (CCIUInt32 i = 0; i < arraySize; i++) {
ReadData (ioStream, *dataArray [i]);
}
outDataArray = dataArray;
} catch (...) {
for (CCIUInt32 i = 0; i < arraySize; i++) {
if (dataArray [i] != NULL) {
delete static_cast <char*> (dataArray [i] -> data);
}
delete dataArray [i];
}
delete [] dataArray;
throw;
}
//dprintf ("Exiting %s():", __FUNCTION__);
}
void ReadString (std::istream& ioStream, char *&outString)
{
CCIUInt32 length;
//dprintf ("Entering %s():", __FUNCTION__);
ReadUInt32 (ioStream, length);
outString = new char [length];
ioStream.read ((char *)outString, length);
//dprintf ("Read string '%s'", outString);
}
void WriteString (std::ostream& ioStream, const char *inString)
{
CCIUInt32 length = strlen (inString) + 1;
//dprintf ("Entering %s():", __FUNCTION__);
WriteUInt32 (ioStream, strlen (inString) + 1);
ioStream.write (inString, length);
//dprintf ("Wrote string '%s'", inString);
}
void ReadString (std::istream& ioStream, std::string &outString)
{
char *string = NULL;
//dprintf ("Entering %s():", __FUNCTION__);
try {
ReadString (ioStream, string);
//dprintf ("Intermediate string '%s'", string);
outString = string;
delete [] string;
} catch (...) {
if (string != NULL) { delete [] string; }
throw;
}
//dprintf ("Read std::string '%s'", outString.c_str());
}
void WriteString (std::ostream& ioStream, const std::string inString)
{
//dprintf ("Entering %s():", __FUNCTION__);
WriteString (ioStream, inString.c_str ());
//dprintf ("Wrote std::string '%s'", inString.c_str ());
}
void WriteUInt32 (std::ostream& ioStream, CCIUInt32 integer)
{
//dprintf ("Entering %s():", __FUNCTION__);
ioStream.write ((char *)&integer, sizeof (integer));
//dprintf ("Wrote integer '%d'", integer);
}
void ReadUInt32 (std::istream& ioStream, CCIUInt32& integer)
{
//dprintf ("Entering %s():", __FUNCTION__);
ioStream.read ((char *)&integer, sizeof (integer));
//dprintf ("Read integer '%d'", integer);
}