iceauth.c revision 9ef0b394
1266e564dSmrg/******************************************************************************
2266e564dSmrg
3266e564dSmrg
4266e564dSmrgCopyright 1993, 1998  The Open Group
5266e564dSmrg
6266e564dSmrgPermission to use, copy, modify, distribute, and sell this software and its
7266e564dSmrgdocumentation for any purpose is hereby granted without fee, provided that
8266e564dSmrgthe above copyright notice appear in all copies and that both that
9266e564dSmrgcopyright notice and this permission notice appear in supporting
10266e564dSmrgdocumentation.
11266e564dSmrg
12266e564dSmrgThe above copyright notice and this permission notice shall be included in
13266e564dSmrgall copies or substantial portions of the Software.
14266e564dSmrg
15266e564dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16266e564dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17266e564dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18266e564dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19266e564dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20266e564dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21266e564dSmrg
22266e564dSmrgExcept as contained in this notice, the name of The Open Group shall not be
23266e564dSmrgused in advertising or otherwise to promote the sale, use or other dealings
24266e564dSmrgin this Software without prior written authorization from The Open Group.
25266e564dSmrg
26266e564dSmrgAuthor: Ralph Mor, X Consortium
27266e564dSmrg******************************************************************************/
28266e564dSmrg
29266e564dSmrg#ifdef HAVE_CONFIG_H
30266e564dSmrg#include <config.h>
31266e564dSmrg#endif
32266e564dSmrg#include <X11/ICE/ICElib.h>
33266e564dSmrg#include "ICElibint.h"
34266e564dSmrg#include <X11/ICE/ICEutil.h>
35266e564dSmrg
36266e564dSmrg#include <time.h>
37266e564dSmrg#define Time_t time_t
38266e564dSmrg
39266e564dSmrgstatic int was_called_state;
40266e564dSmrg
41266e564dSmrg/*
42266e564dSmrg * MIT-MAGIC-COOKIE-1 is a sample authentication method implemented by
43266e564dSmrg * the SI.  It is not part of standard ICElib.
44266e564dSmrg */
45266e564dSmrg
46266e564dSmrg
47266e564dSmrgchar *
48c5629e66SmrgIceGenerateMagicCookie (
49c5629e66Smrg	int len
50c5629e66Smrg)
51266e564dSmrg{
52266e564dSmrg    char    *auth;
53266e564dSmrg    long    ldata[2];
54266e564dSmrg    int	    seed;
55266e564dSmrg    int	    value;
56266e564dSmrg    int	    i;
579ef0b394Smrg
58266e564dSmrg    if ((auth = (char *) malloc (len + 1)) == NULL)
59266e564dSmrg	return (NULL);
60266e564dSmrg
61266e564dSmrg#ifdef ITIMER_REAL
62266e564dSmrg    {
63266e564dSmrg	struct timeval  now;
64266e564dSmrg	X_GETTIMEOFDAY (&now);
65266e564dSmrg	ldata[0] = now.tv_sec;
66266e564dSmrg	ldata[1] = now.tv_usec;
67266e564dSmrg    }
68266e564dSmrg#else
69266e564dSmrg    {
70266e564dSmrg#ifndef __UNIXOS2__
71266e564dSmrg	long    time ();
72266e564dSmrg#endif
73266e564dSmrg	ldata[0] = time ((long *) 0);
74266e564dSmrg	ldata[1] = getpid ();
75266e564dSmrg    }
76266e564dSmrg#endif
77266e564dSmrg    seed = (ldata[0]) + (ldata[1] << 16);
78266e564dSmrg    srand (seed);
79266e564dSmrg    for (i = 0; i < len; i++)
80266e564dSmrg    {
81266e564dSmrg	value = rand ();
82266e564dSmrg	auth[i] = value & 0xff;
83266e564dSmrg    }
84266e564dSmrg    auth[len] = '\0';
85266e564dSmrg
86266e564dSmrg    return (auth);
87266e564dSmrg}
88266e564dSmrg
89266e564dSmrg
90266e564dSmrg
91266e564dSmrgIcePoAuthStatus
92c5629e66Smrg_IcePoMagicCookie1Proc (
93c5629e66Smrg	IceConn		iceConn,
94c5629e66Smrg	IcePointer	*authStatePtr,
95c5629e66Smrg	Bool 		cleanUp,
96c5629e66Smrg	Bool		swap,
97c5629e66Smrg	int     	authDataLen,
98c5629e66Smrg	IcePointer	authData,
99c5629e66Smrg	int 		*replyDataLenRet,
100c5629e66Smrg	IcePointer	*replyDataRet,
101c5629e66Smrg	char    	**errorStringRet
102c5629e66Smrg)
103266e564dSmrg{
104266e564dSmrg    if (cleanUp)
105266e564dSmrg    {
106266e564dSmrg	/*
107266e564dSmrg	 * We didn't allocate any state.  We're done.
108266e564dSmrg	 */
109266e564dSmrg
110266e564dSmrg	return (IcePoAuthDoneCleanup);
111266e564dSmrg    }
112266e564dSmrg
113266e564dSmrg    *errorStringRet = NULL;
114266e564dSmrg
115266e564dSmrg    if (*authStatePtr == NULL)
116266e564dSmrg    {
117266e564dSmrg	/*
118266e564dSmrg	 * This is the first time we're being called.  Search the
119266e564dSmrg	 * authentication data for the first occurence of
120266e564dSmrg	 * MIT-MAGIC-COOKIE-1 that matches iceConn->connection_string.
121266e564dSmrg	 */
122266e564dSmrg
123266e564dSmrg	unsigned short  length;
124266e564dSmrg	char		*data;
125266e564dSmrg
126266e564dSmrg	_IceGetPoAuthData ("ICE", iceConn->connection_string,
127266e564dSmrg	    "MIT-MAGIC-COOKIE-1", &length, &data);
128266e564dSmrg
129266e564dSmrg	if (!data)
130266e564dSmrg	{
131266e564dSmrg	    const char *tempstr =
132266e564dSmrg		"Could not find correct MIT-MAGIC-COOKIE-1 authentication";
133266e564dSmrg
134266e564dSmrg	    *errorStringRet = strdup(tempstr);
135266e564dSmrg
136266e564dSmrg	    return (IcePoAuthFailed);
137266e564dSmrg	}
138266e564dSmrg	else
139266e564dSmrg	{
140266e564dSmrg	    *authStatePtr = (IcePointer) &was_called_state;
141266e564dSmrg
142266e564dSmrg	    *replyDataLenRet = length;
143266e564dSmrg	    *replyDataRet = data;
144266e564dSmrg
145266e564dSmrg	    return (IcePoAuthHaveReply);
146266e564dSmrg	}
147266e564dSmrg    }
148266e564dSmrg    else
149266e564dSmrg    {
150266e564dSmrg	/*
151266e564dSmrg	 * We should never get here for MIT-MAGIC-COOKIE-1 since it is
152266e564dSmrg	 * a single pass authentication method.
153266e564dSmrg	 */
154266e564dSmrg
155266e564dSmrg	const char *tempstr =
156266e564dSmrg	    "MIT-MAGIC-COOKIE-1 authentication internal error";
157266e564dSmrg
158266e564dSmrg	*errorStringRet = strdup(tempstr);
159266e564dSmrg
160266e564dSmrg	return (IcePoAuthFailed);
161266e564dSmrg    }
162266e564dSmrg}
163266e564dSmrg
164c5629e66SmrgIcePoAuthProc	_IcePoAuthProcs[] = {_IcePoMagicCookie1Proc};
165266e564dSmrg
166266e564dSmrg
167266e564dSmrgIcePaAuthStatus
168c5629e66Smrg_IcePaMagicCookie1Proc (
169c5629e66Smrg	IceConn		iceConn,
170c5629e66Smrg	IcePointer	*authStatePtr,
171c5629e66Smrg	Bool		swap,
172c5629e66Smrg	int     	authDataLen,
173c5629e66Smrg	IcePointer	authData,
174c5629e66Smrg	int 		*replyDataLenRet,
175c5629e66Smrg	IcePointer	*replyDataRet,
176c5629e66Smrg	char    	**errorStringRet
177c5629e66Smrg)
178266e564dSmrg{
179266e564dSmrg    *errorStringRet = NULL;
180266e564dSmrg    *replyDataLenRet = 0;
181266e564dSmrg    *replyDataRet = NULL;
182266e564dSmrg
183266e564dSmrg    if (*authStatePtr == NULL)
184266e564dSmrg    {
185266e564dSmrg	/*
186266e564dSmrg	 * This is the first time we're being called.  We don't have
187266e564dSmrg	 * any data to pass to the other client.
188266e564dSmrg	 */
189266e564dSmrg
190266e564dSmrg	*authStatePtr = (IcePointer) &was_called_state;
191266e564dSmrg
192266e564dSmrg	return (IcePaAuthContinue);
193266e564dSmrg    }
194266e564dSmrg    else
195266e564dSmrg    {
196266e564dSmrg	/*
197266e564dSmrg	 * Search the authentication data for the first occurence of
198266e564dSmrg	 * MIT-MAGIC-COOKIE-1 that matches iceConn->connection_string.
199266e564dSmrg	 */
200266e564dSmrg
201266e564dSmrg	unsigned short  length;
202266e564dSmrg	char		*data;
203266e564dSmrg
204266e564dSmrg	_IceGetPaAuthData ("ICE", iceConn->connection_string,
205266e564dSmrg	    "MIT-MAGIC-COOKIE-1", &length, &data);
206266e564dSmrg
207266e564dSmrg	if (data)
208266e564dSmrg	{
209266e564dSmrg	    IcePaAuthStatus stat;
210266e564dSmrg
211266e564dSmrg	    if (authDataLen == length &&
212c5629e66Smrg	        memcmp (authData, data, authDataLen) == 0)
213266e564dSmrg	    {
214266e564dSmrg		stat = IcePaAuthAccepted;
215266e564dSmrg	    }
216266e564dSmrg	    else
217266e564dSmrg	    {
218266e564dSmrg		const char *tempstr
219266e564dSmrg		    = "MIT-MAGIC-COOKIE-1 authentication rejected";
220266e564dSmrg
221266e564dSmrg		*errorStringRet = strdup(tempstr);
222266e564dSmrg
223266e564dSmrg		stat = IcePaAuthRejected;
224266e564dSmrg	    }
225266e564dSmrg
226266e564dSmrg	    free (data);
227266e564dSmrg	    return (stat);
228266e564dSmrg	}
229266e564dSmrg	else
230266e564dSmrg	{
231266e564dSmrg	    /*
232266e564dSmrg	     * We should never get here because in the ConnectionReply
233266e564dSmrg	     * we should have passed all the valid methods.  So we should
234266e564dSmrg	     * always find a valid entry.
235266e564dSmrg	     */
236266e564dSmrg
237266e564dSmrg	    const char *tempstr =
238266e564dSmrg		"MIT-MAGIC-COOKIE-1 authentication internal error";
239266e564dSmrg
240266e564dSmrg	    *errorStringRet = strdup(tempstr);
241266e564dSmrg
242266e564dSmrg	    return (IcePaAuthFailed);
243266e564dSmrg	}
244266e564dSmrg    }
245266e564dSmrg}
246266e564dSmrg
247c5629e66SmrgIcePaAuthProc	_IcePaAuthProcs[] = {_IcePaMagicCookie1Proc};
248