|
Packit |
e18bd3 |
/******************************************************************************
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
Copyright 1993, 1998 The Open Group
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
Permission to use, copy, modify, distribute, and sell this software and its
|
|
Packit |
e18bd3 |
documentation for any purpose is hereby granted without fee, provided that
|
|
Packit |
e18bd3 |
the above copyright notice appear in all copies and that both that
|
|
Packit |
e18bd3 |
copyright notice and this permission notice appear in supporting
|
|
Packit |
e18bd3 |
documentation.
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
The above copyright notice and this permission notice shall be included in
|
|
Packit |
e18bd3 |
all copies or substantial portions of the Software.
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Packit |
e18bd3 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Packit |
e18bd3 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
Packit |
e18bd3 |
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
Packit |
e18bd3 |
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
e18bd3 |
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
Except as contained in this notice, the name of The Open Group shall not be
|
|
Packit |
e18bd3 |
used in advertising or otherwise to promote the sale, use or other dealings
|
|
Packit |
e18bd3 |
in this Software without prior written authorization from The Open Group.
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
Author: Ralph Mor, X Consortium
|
|
Packit |
e18bd3 |
******************************************************************************/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
e18bd3 |
#include <config.h>
|
|
Packit |
e18bd3 |
#endif
|
|
Packit |
e18bd3 |
#include <X11/ICE/ICElib.h>
|
|
Packit |
e18bd3 |
#include "ICElibint.h"
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
static Bool auth_valid (const char *auth_name, int num_auth_names,
|
|
Packit |
e18bd3 |
const char **auth_names, int *index_ret);
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* The functions in this file are not a standard part of ICElib.
|
|
Packit |
e18bd3 |
*
|
|
Packit |
e18bd3 |
* The sample implementation uses an .ICEauthority to manipulate
|
|
Packit |
e18bd3 |
* authentication data.
|
|
Packit |
e18bd3 |
*
|
|
Packit |
e18bd3 |
* For the client that initiates a Protocol Setup, we look in the
|
|
Packit |
e18bd3 |
* .ICEauthority file to get the data.
|
|
Packit |
e18bd3 |
*
|
|
Packit |
e18bd3 |
* For the client accepting the Protocol Setup, we get the data
|
|
Packit |
e18bd3 |
* from an in-memory database of authentication data (set by the
|
|
Packit |
e18bd3 |
* application calling IceSetPaAuthData). We have to get the data
|
|
Packit |
e18bd3 |
* from memory because getting it directly from the .ICEauthority
|
|
Packit |
e18bd3 |
* file is not secure - someone can just modify the contents of the
|
|
Packit |
e18bd3 |
* .ICEauthority file behind our back.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
void
|
|
Packit |
e18bd3 |
_IceGetPoAuthData (
|
|
Packit |
e18bd3 |
const char *protocolName,
|
|
Packit |
e18bd3 |
const char *networkId,
|
|
Packit |
e18bd3 |
const char *authName,
|
|
Packit |
e18bd3 |
unsigned short *authDataLenRet,
|
|
Packit |
e18bd3 |
char **authDataRet
|
|
Packit |
e18bd3 |
)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
IceAuthFileEntry *entry;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
entry = IceGetAuthFileEntry (protocolName, networkId, authName);
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (entry)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
*authDataLenRet = entry->auth_data_length;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if ((*authDataRet = malloc (entry->auth_data_length)) != NULL)
|
|
Packit |
e18bd3 |
memcpy (*authDataRet, entry->auth_data, entry->auth_data_length);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
else
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
*authDataLenRet = 0;
|
|
Packit |
e18bd3 |
*authDataRet = NULL;
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
IceFreeAuthFileEntry (entry);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
void
|
|
Packit |
e18bd3 |
_IceGetPaAuthData (
|
|
Packit |
e18bd3 |
const char *protocolName,
|
|
Packit |
e18bd3 |
const char *networkId,
|
|
Packit |
e18bd3 |
const char *authName,
|
|
Packit |
e18bd3 |
unsigned short *authDataLenRet,
|
|
Packit |
e18bd3 |
char **authDataRet
|
|
Packit |
e18bd3 |
)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
IceAuthDataEntry *entry = NULL;
|
|
Packit |
e18bd3 |
int found = 0;
|
|
Packit |
e18bd3 |
int i;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
for (i = 0; i < _IcePaAuthDataEntryCount && !found; i++)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
entry = &_IcePaAuthDataEntries[i];
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
found =
|
|
Packit |
e18bd3 |
strcmp (protocolName, entry->protocol_name) == 0 &&
|
|
Packit |
e18bd3 |
strcmp (networkId, entry->network_id) == 0 &&
|
|
Packit |
e18bd3 |
strcmp (authName, entry->auth_name) == 0;
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (found)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
*authDataLenRet = entry->auth_data_length;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if ((*authDataRet = malloc (entry->auth_data_length)) != NULL)
|
|
Packit |
e18bd3 |
memcpy (*authDataRet, entry->auth_data, entry->auth_data_length);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
else
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
*authDataLenRet = 0;
|
|
Packit |
e18bd3 |
*authDataRet = NULL;
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
void
|
|
Packit |
e18bd3 |
_IceGetPoValidAuthIndices (
|
|
Packit |
e18bd3 |
const char *protocol_name,
|
|
Packit |
e18bd3 |
const char *network_id,
|
|
Packit |
e18bd3 |
int num_auth_names,
|
|
Packit |
e18bd3 |
const char **auth_names,
|
|
Packit |
e18bd3 |
int *num_indices_ret,
|
|
Packit |
e18bd3 |
int *indices_ret /* in/out arg */
|
|
Packit |
e18bd3 |
)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
FILE *auth_file;
|
|
Packit |
e18bd3 |
char *filename;
|
|
Packit |
e18bd3 |
IceAuthFileEntry *entry;
|
|
Packit |
e18bd3 |
int index_ret, i;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
*num_indices_ret = 0;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (!(filename = IceAuthFileName ()))
|
|
Packit |
e18bd3 |
return;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (access (filename, R_OK) != 0) /* checks REAL id */
|
|
Packit |
e18bd3 |
return;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (!(auth_file = fopen (filename, "rb")))
|
|
Packit |
e18bd3 |
return;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
for (;;)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
if (!(entry = IceReadAuthFileEntry (auth_file)))
|
|
Packit |
e18bd3 |
break;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (strcmp (protocol_name, entry->protocol_name) == 0 &&
|
|
Packit |
e18bd3 |
strcmp (network_id, entry->network_id) == 0 &&
|
|
Packit |
e18bd3 |
auth_valid (entry->auth_name, num_auth_names,
|
|
Packit |
e18bd3 |
auth_names, &index_ret))
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* Make sure we didn't store this index already.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
for (i = 0; i < *num_indices_ret; i++)
|
|
Packit |
e18bd3 |
if (index_ret == indices_ret[i])
|
|
Packit |
e18bd3 |
break;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (i >= *num_indices_ret)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
indices_ret[*num_indices_ret] = index_ret;
|
|
Packit |
e18bd3 |
*num_indices_ret += 1;
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
IceFreeAuthFileEntry (entry);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
fclose (auth_file);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
void
|
|
Packit |
e18bd3 |
_IceGetPaValidAuthIndices (
|
|
Packit |
e18bd3 |
const char *protocol_name,
|
|
Packit |
e18bd3 |
const char *network_id,
|
|
Packit |
e18bd3 |
int num_auth_names,
|
|
Packit |
e18bd3 |
const char **auth_names,
|
|
Packit |
e18bd3 |
int *num_indices_ret,
|
|
Packit |
e18bd3 |
int *indices_ret /* in/out arg */
|
|
Packit |
e18bd3 |
)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
int index_ret;
|
|
Packit |
e18bd3 |
int i, j;
|
|
Packit |
e18bd3 |
IceAuthDataEntry *entry;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
*num_indices_ret = 0;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
for (i = 0; i < _IcePaAuthDataEntryCount; i++)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
entry = &_IcePaAuthDataEntries[i];
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (strcmp (protocol_name, entry->protocol_name) == 0 &&
|
|
Packit |
e18bd3 |
strcmp (network_id, entry->network_id) == 0 &&
|
|
Packit |
e18bd3 |
auth_valid (entry->auth_name, num_auth_names,
|
|
Packit |
e18bd3 |
auth_names, &index_ret))
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* Make sure we didn't store this index already.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
for (j = 0; j < *num_indices_ret; j++)
|
|
Packit |
e18bd3 |
if (index_ret == indices_ret[j])
|
|
Packit |
e18bd3 |
break;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (j >= *num_indices_ret)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
indices_ret[*num_indices_ret] = index_ret;
|
|
Packit |
e18bd3 |
*num_indices_ret += 1;
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* local routines
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
static Bool
|
|
Packit |
e18bd3 |
auth_valid (const char *auth_name, int num_auth_names,
|
|
Packit |
e18bd3 |
const char **auth_names, int *index_ret)
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* Check if auth_name is in auth_names. Return index.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
int i;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
for (i = 0; i < num_auth_names; i++)
|
|
Packit |
e18bd3 |
if (strcmp (auth_name, auth_names[i]) == 0)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
break;
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (i < num_auth_names)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
*index_ret = i;
|
|
Packit |
e18bd3 |
return (1);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
else
|
|
Packit |
e18bd3 |
return (0);
|
|
Packit |
e18bd3 |
}
|