279 lines
6.0 KiB
C
279 lines
6.0 KiB
C
/* $Xorg: iceauth.c,v 1.4 2001/02/09 02:03:26 xorgcvs Exp $ */
|
||
/******************************************************************************
|
||
|
||
|
||
Copyright 1993, 1998 The Open Group
|
||
|
||
Permission to use, copy, modify, distribute, and sell this software and its
|
||
documentation for any purpose is hereby granted without fee, provided that
|
||
the above copyright notice appear in all copies and that both that
|
||
copyright notice and this permission notice appear in supporting
|
||
documentation.
|
||
|
||
The above copyright notice and this permission notice shall be included in
|
||
all copies or substantial portions of the Software.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||
|
||
Except as contained in this notice, the name of The Open Group shall not be
|
||
used in advertising or otherwise to promote the sale, use or other dealings
|
||
in this Software without prior written authorization from The Open Group.
|
||
|
||
Author: Ralph Mor, X Consortium
|
||
******************************************************************************/
|
||
/* $XFree86: xc/lib/ICE/iceauth.c,v 3.5 2001/12/14 19:53:36 dawes Exp $ */
|
||
|
||
#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 binaryEqual ();
|
||
|
||
static int was_called_state;
|
||
|
||
/*
|
||
* MIT-MAGIC-COOKIE-1 is a sample authentication method implemented by
|
||
* the SI. It is not part of standard ICElib.
|
||
*/
|
||
|
||
|
||
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)
|
||
{
|
||
/*
|
||
* We didn't allocate any state. We're done.
|
||
*/
|
||
|
||
return (IcePoAuthDoneCleanup);
|
||
}
|
||
|
||
*errorStringRet = NULL;
|
||
|
||
if (*authStatePtr == NULL)
|
||
{
|
||
/*
|
||
* This is the first time we're being called. Search the
|
||
* authentication data for the first occurence of
|
||
* MIT-MAGIC-COOKIE-1 that matches iceConn->connection_string.
|
||
*/
|
||
|
||
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
|
||
{
|
||
/*
|
||
* We should never get here for MIT-MAGIC-COOKIE-1 since it is
|
||
* a single pass authentication method.
|
||
*/
|
||
|
||
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)
|
||
{
|
||
/*
|
||
* This is the first time we're being called. We don't have
|
||
* any data to pass to the other client.
|
||
*/
|
||
|
||
*authStatePtr = (IcePointer) &was_called_state;
|
||
|
||
return (IcePaAuthContinue);
|
||
}
|
||
else
|
||
{
|
||
/*
|
||
* Search the authentication data for the first occurence of
|
||
* MIT-MAGIC-COOKIE-1 that matches iceConn->connection_string.
|
||
*/
|
||
|
||
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
|
||
{
|
||
/*
|
||
* We should never get here because in the ConnectionReply
|
||
* we should have passed all the valid methods. So we should
|
||
* always find a valid entry.
|
||
*/
|
||
|
||
char *tempstr =
|
||
"MIT-MAGIC-COOKIE-1 authentication internal error";
|
||
|
||
*errorStringRet = (char *) malloc (strlen (tempstr) + 1);
|
||
if (*errorStringRet)
|
||
strcpy (*errorStringRet, tempstr);
|
||
|
||
return (IcePaAuthFailed);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*
|
||
* local routines
|
||
*/
|
||
|
||
static int
|
||
binaryEqual (a, b, len)
|
||
|
||
register char *a, *b;
|
||
register unsigned len;
|
||
|
||
{
|
||
while (len--)
|
||
if (*a++ != *b++)
|
||
return 0;
|
||
return 1;
|
||
}
|