#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <X11/ICE/ICElib.h>
#include "ICElibint.h"
#include <X11/ICE/ICEutil.h>
#include <time.h>
#define Time_t time_t
static int was_called_state;
char *
IceGenerateMagicCookie (
int len
)
{
char *auth;
long ldata[2];
int seed;
int value;
int i;
if ((auth = (char *) malloc (len + 1)) == NULL)
return (NULL);
#ifdef ITIMER_REAL
{
struct timeval now;
X_GETTIMEOFDAY (&now);
ldata[0] = now.tv_sec;
ldata[1] = now.tv_usec;
}
#else
{
#ifndef __UNIXOS2__
long time ();
#endif
ldata[0] = time ((long *) 0);
ldata[1] = getpid ();
}
#endif
seed = (ldata[0]) + (ldata[1] << 16);
srand (seed);
for (i = 0; i < len; i++)
{
value = rand ();
auth[i] = value & 0xff;
}
auth[len] = '\0';
return (auth);
}
IcePoAuthStatus
_IcePoMagicCookie1Proc (
IceConn iceConn,
IcePointer *authStatePtr,
Bool cleanUp,
Bool swap,
int authDataLen,
IcePointer authData,
int *replyDataLenRet,
IcePointer *replyDataRet,
char **errorStringRet
)
{
if (cleanUp)
{
return (IcePoAuthDoneCleanup);
}
*errorStringRet = NULL;
if (*authStatePtr == NULL)
{
unsigned short length;
char *data;
_IceGetPoAuthData ("ICE", iceConn->connection_string,
"MIT-MAGIC-COOKIE-1", &length, &data);
if (!data)
{
const char *tempstr =
"Could not find correct MIT-MAGIC-COOKIE-1 authentication";
*errorStringRet = strdup(tempstr);
return (IcePoAuthFailed);
}
else
{
*authStatePtr = (IcePointer) &was_called_state;
*replyDataLenRet = length;
*replyDataRet = data;
return (IcePoAuthHaveReply);
}
}
else
{
const char *tempstr =
"MIT-MAGIC-COOKIE-1 authentication internal error";
*errorStringRet = strdup(tempstr);
return (IcePoAuthFailed);
}
}
IcePoAuthProc _IcePoAuthProcs[] = {_IcePoMagicCookie1Proc};
IcePaAuthStatus
_IcePaMagicCookie1Proc (
IceConn iceConn,
IcePointer *authStatePtr,
Bool swap,
int authDataLen,
IcePointer authData,
int *replyDataLenRet,
IcePointer *replyDataRet,
char **errorStringRet
)
{
*errorStringRet = NULL;
*replyDataLenRet = 0;
*replyDataRet = NULL;
if (*authStatePtr == NULL)
{
*authStatePtr = (IcePointer) &was_called_state;
return (IcePaAuthContinue);
}
else
{
unsigned short length;
char *data;
_IceGetPaAuthData ("ICE", iceConn->connection_string,
"MIT-MAGIC-COOKIE-1", &length, &data);
if (data)
{
IcePaAuthStatus stat;
if (authDataLen == length &&
memcmp (authData, data, authDataLen) == 0)
{
stat = IcePaAuthAccepted;
}
else
{
const char *tempstr
= "MIT-MAGIC-COOKIE-1 authentication rejected";
*errorStringRet = strdup(tempstr);
stat = IcePaAuthRejected;
}
free (data);
return (stat);
}
else
{
const char *tempstr =
"MIT-MAGIC-COOKIE-1 authentication internal error";
*errorStringRet = strdup(tempstr);
return (IcePaAuthFailed);
}
}
}
IcePaAuthProc _IcePaAuthProcs[] = {_IcePaMagicCookie1Proc};