#include <X11/ICE/ICElib.h>
#include "ICElibint.h"
#include <X11/ICE/ICEutil.h>
#include <time.h>
#define Time_t time_t
static int binaryEqual ();
static int was_called_state;
char *
IceGenerateMagicCookie (len)
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, authStatePtr, cleanUp, swap,
authDataLen, authData, replyDataLenRet, replyDataRet, errorStringRet)
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)
{
char *tempstr =
"Could not find correct MIT-MAGIC-COOKIE-1 authentication";
*errorStringRet = (char *) malloc (strlen (tempstr) + 1);
if (*errorStringRet)
strcpy (*errorStringRet, tempstr);
return (IcePoAuthFailed);
}
else
{
*authStatePtr = (IcePointer) &was_called_state;
*replyDataLenRet = length;
*replyDataRet = data;
return (IcePoAuthHaveReply);
}
}
else
{
char *tempstr = "MIT-MAGIC-COOKIE-1 authentication internal error";
*errorStringRet = (char *) malloc (strlen (tempstr) + 1);
if (*errorStringRet)
strcpy (*errorStringRet, tempstr);
return (IcePoAuthFailed);
}
}
IcePaAuthStatus
_IcePaMagicCookie1Proc (iceConn, authStatePtr, swap,
authDataLen, authData, replyDataLenRet, replyDataRet, errorStringRet)
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 &&
binaryEqual ((char *) authData, data, authDataLen))
{
stat = IcePaAuthAccepted;
}
else
{
char *tempstr = "MIT-MAGIC-COOKIE-1 authentication rejected";
*errorStringRet = (char *) malloc (strlen (tempstr) + 1);
if (*errorStringRet)
strcpy (*errorStringRet, tempstr);
stat = IcePaAuthRejected;
}
free (data);
return (stat);
}
else
{
char *tempstr =
"MIT-MAGIC-COOKIE-1 authentication internal error";
*errorStringRet = (char *) malloc (strlen (tempstr) + 1);
if (*errorStringRet)
strcpy (*errorStringRet, tempstr);
return (IcePaAuthFailed);
}
}
}
static int
binaryEqual (a, b, len)
register char *a, *b;
register unsigned len;
{
while (len--)
if (*a++ != *b++)
return 0;
return 1;
}