cdesktopenv/cde/programs/dtlogin/policy.c

287 lines
7.5 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* (c) Copyright 1997 The Open Group */
/* *
* (c) Copyright 1993, 1994 Hewlett-Packard Company *
* (c) Copyright 1993, 1994 International Business Machines Corp. *
* (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
* (c) Copyright 1993, 1994 Novell, Inc. *
*/
/*
* xdm - display manager daemon
*
* $TOG: policy.c /main/6 1997/03/14 13:45:03 barstow $
*
* Copyright 1988 Massachusetts Institute of Technology
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of M.I.T. not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. M.I.T. makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* Author: Keith Packard, MIT X Consortium
*/
/*
* policy.c. Implement site-dependent policy for XDMCP connections
*/
# include "dm.h"
static ARRAY8 noAuthentication = { (CARD16) 0, (CARD8Ptr) 0 };
static ARRAY8 loopbackAddress = { (CARD16) 0, (CARD8Ptr) 0 };
typedef struct _XdmAuth {
ARRAY8 authentication;
ARRAY8 authorization;
} XdmAuthRec, *XdmAuthPtr;
XdmAuthRec auth[] = {
#ifdef HASXDMAUTH
{ {(CARD16) 20, (CARD8 *) "XDM-AUTHENTICATION-1"},
{(CARD16) 19, (CARD8 *) "XDM-AUTHORIZATION-1"},
},
#endif
{ {(CARD16) 0, (CARD8 *) 0},
{(CARD16) 0, (CARD8 *) 0},
}
};
#define NumAuth (sizeof auth / sizeof auth[0])
/***************************************************************************
*
* Local procedure declarations
*
***************************************************************************/
static char * WillingMsg( void ) ;
/******** End Local Function Declarations ********/
ARRAY8Ptr
ChooseAuthentication( ARRAYofARRAY8Ptr authenticationNames )
{
int i, j;
for (i = 0; i < authenticationNames->length; i++)
for (j = 0; j < NumAuth; j++)
if (XdmcpARRAY8Equal (&authenticationNames->data[i],
&auth[j].authentication))
return &authenticationNames->data[i];
return &noAuthentication;
}
int
CheckAuthentication( struct protoDisplay *pdpy, ARRAY8Ptr displayID,
ARRAY8Ptr name, ARRAY8Ptr data )
{
#ifdef HASXDMAUTH
if (name->length && !strncmp (name->data, "XDM-AUTHENTICATION-1", 20))
return XdmCheckAuthentication (pdpy, displayID, name, data);
#endif
return TRUE;
}
int
SelectAuthorizationTypeIndex( ARRAY8Ptr authenticationName,
ARRAYofARRAY8Ptr authorizationNames )
{
int i, j;
for (j = 0; j < NumAuth; j++)
if (XdmcpARRAY8Equal (authenticationName,
&auth[j].authentication))
break;
if (j < NumAuth)
{
for (i = 0; i < authorizationNames->length; i++)
if (XdmcpARRAY8Equal (&authorizationNames->data[i],
&auth[j].authorization))
return i;
}
for (i = 0; i < authorizationNames->length; i++)
if (ValidAuthorization (authorizationNames->data[i].length,
(char *) authorizationNames->data[i].data))
return i;
return -1;
}
#if 0
int
Willing( struct sockaddr *addr, int addrlen, ARRAY8Ptr authenticationName,
ARRAY8Ptr status )
#endif
int
Willing(
ARRAY8Ptr addr,
#if NeedWidePrototypes
int connectionType,
#else
CARD16 connectionType,
#endif /* NeedWidePrototypes */
ARRAY8Ptr authenticationName,
ARRAY8Ptr status,
xdmOpCode type )
{
static char statusBuf[256];
int ret;
#if 0
extern char *localHostname ();
#endif
ret = AcceptableDisplayAddress (addr, connectionType, type);
if (!ret)
snprintf (statusBuf, sizeof(statusBuf), "Display not authorized to connect");
else
snprintf (statusBuf, sizeof(statusBuf), "%s", WillingMsg());
#if 0
snprintf (statusBuf, sizeof(statusBuf), "host %s", localHostname());
#endif
/* enforce termination */
statusBuf[255] = '\0';
status->length = strlen(statusBuf);
status->data = (CARD8Ptr) malloc (status->length);
if (!status->data)
status->length = 0;
else
bcopy (statusBuf, (char *)status->data, status->length);
return ret;
}
ARRAY8Ptr
Accept( struct sockaddr *from, int fromlen,
#if NeedWidePrototypes
int displayNumber )
#else
CARD16 displayNumber )
#endif /* NeedWidePrototypes */
{
return 0;
}
int
SelectConnectionTypeIndex( ARRAY16Ptr connectionTypes,
ARRAYofARRAY8Ptr connectionAddresses )
{
int i;
/*
* the current selection policy is to use the first connection address
* that is not the loopback address...
*/
/*
* initialize loopback address array if not already done so...
*
*/
if (loopbackAddress.length == 0 &&
XdmcpAllocARRAY8 (&loopbackAddress, 4) ) {
loopbackAddress.data[0] = 127;
loopbackAddress.data[1] = 0;
loopbackAddress.data[2] = 0;
loopbackAddress.data[3] = 1;
}
for (i = 0; i < connectionAddresses->length; i++) {
if (!XdmcpARRAY8Equal (&connectionAddresses->data[i],
&loopbackAddress))
break;
}
return i;
}
/***************************************************************************
*
* WillingMsg
*
* Generate a message for the "Willing" status field.
*
***************************************************************************/
# define LINEBUFSIZE 32
static char *
WillingMsg( void )
{
static char retbuf[LINEBUFSIZE];
char tmpbuf[LINEBUFSIZE * 8];
char *cp;
char tmpfilename[L_tmpnam + 1];
FILE *f;
/* Return selected part from an 'uptime' to Server */
/* for use in hosts status field when XDMCP broadcast is used */
/* (useful for selecting host to be managed by) */
strcpy(retbuf, "Willing to Manage");
strcpy(tmpbuf,"uptime | ");
strcat(tmpbuf,"awk '{printf(\"%s %-.5s load: %.3s, %.3s, %.3s\",$(NF-6),$(NF-5),$(NF-2),$(NF-1),$NF)}'");
strcat(tmpbuf," > ");
if ( tmpnam(tmpfilename) != (char *)NULL ) {
strcat(tmpbuf,tmpfilename);
if(-1 == system(tmpbuf)) {
perror(strerror(errno));
}
if ((f = fopen(tmpfilename,"r")) != (FILE *) NULL) {
fgets(tmpbuf,LINEBUFSIZE,f);
if ( (cp = strchr(tmpbuf,'\n')) != NULL)
*cp = '\0';
if (strlen(tmpbuf) > 10) /* seems reasonable? */
strcpy(retbuf, tmpbuf);
fclose(f);
}
unlink(tmpfilename);
}
return (retbuf);
}