getauth.c revision fb5e8d76
1/******************************************************************************
2
3
4Copyright 1993, 1998  The Open Group
5
6Permission to use, copy, modify, distribute, and sell this software and its
7documentation for any purpose is hereby granted without fee, provided that
8the above copyright notice appear in all copies and that both that
9copyright notice and this permission notice appear in supporting
10documentation.
11
12The above copyright notice and this permission notice shall be included in
13all copies or substantial portions of the Software.
14
15THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22Except as contained in this notice, the name of The Open Group shall not be
23used in advertising or otherwise to promote the sale, use or other dealings
24in this Software without prior written authorization from The Open Group.
25
26Author: Ralph Mor, X Consortium
27******************************************************************************/
28
29#ifdef HAVE_CONFIG_H
30#include <config.h>
31#endif
32#include <X11/ICE/ICElib.h>
33#include "ICElibint.h"
34
35static Bool auth_valid (const char *auth_name, int num_auth_names,
36			const char **auth_names, int *index_ret);
37
38
39/*
40 * The functions in this file are not a standard part of ICElib.
41 *
42 * The sample implementation uses an .ICEauthority to manipulate
43 * authentication data.
44 *
45 * For the client that initiates a Protocol Setup, we look in the
46 * .ICEauthority file to get the data.
47 *
48 * For the client accepting the Protocol Setup, we get the data
49 * from an in-memory database of authentication data (set by the
50 * application calling IceSetPaAuthData).  We have to get the data
51 * from memory because getting it directly from the .ICEauthority
52 * file is not secure - someone can just modify the contents of the
53 * .ICEauthority file behind our back.
54 */
55
56void
57_IceGetPoAuthData (
58	const char	*protocolName,
59	const char	*networkId,
60	const char	*authName,
61	unsigned short	*authDataLenRet,
62	char		**authDataRet
63)
64{
65    IceAuthFileEntry    *entry;
66
67    entry = IceGetAuthFileEntry (protocolName, networkId, authName);
68
69    if (entry)
70    {
71	*authDataLenRet = entry->auth_data_length;
72
73	if ((*authDataRet = malloc (entry->auth_data_length)) != NULL)
74	    memcpy (*authDataRet, entry->auth_data, entry->auth_data_length);
75    }
76    else
77    {
78	*authDataLenRet = 0;
79	*authDataRet = NULL;
80    }
81
82    IceFreeAuthFileEntry (entry);
83}
84
85
86
87void
88_IceGetPaAuthData (
89	const char	*protocolName,
90	const char	*networkId,
91	const char	*authName,
92	unsigned short	*authDataLenRet,
93	char		**authDataRet
94)
95{
96    IceAuthDataEntry	*entry = NULL;
97    int			found = 0;
98    int			i;
99
100    for (i = 0; i < _IcePaAuthDataEntryCount && !found; i++)
101    {
102	entry = &_IcePaAuthDataEntries[i];
103
104	found =
105	    strcmp (protocolName, entry->protocol_name) == 0 &&
106            strcmp (networkId, entry->network_id) == 0 &&
107            strcmp (authName, entry->auth_name) == 0;
108    }
109
110    if (found)
111    {
112	*authDataLenRet = entry->auth_data_length;
113
114	if ((*authDataRet = malloc (entry->auth_data_length)) != NULL)
115	    memcpy (*authDataRet, entry->auth_data, entry->auth_data_length);
116    }
117    else
118    {
119	*authDataLenRet = 0;
120	*authDataRet = NULL;
121    }
122}
123
124
125
126void
127_IceGetPoValidAuthIndices (
128	const char	*protocol_name,
129	const char	*network_id,
130	int		num_auth_names,
131	const char	**auth_names,
132	int		*num_indices_ret,
133	int		*indices_ret		/* in/out arg */
134)
135{
136    FILE    		*auth_file;
137    char    		*filename;
138    IceAuthFileEntry    *entry;
139    int			index_ret, i;
140
141    *num_indices_ret = 0;
142
143    if (!(filename = IceAuthFileName ()))
144	return;
145
146    if (access (filename, R_OK) != 0)		/* checks REAL id */
147	return;
148
149    if (!(auth_file = fopen (filename, "rb")))
150	return;
151
152    for (;;)
153    {
154	if (!(entry = IceReadAuthFileEntry (auth_file)))
155	    break;
156
157	if (strcmp (protocol_name, entry->protocol_name) == 0 &&
158	    strcmp (network_id, entry->network_id) == 0 &&
159	    auth_valid (entry->auth_name, num_auth_names,
160	    auth_names, &index_ret))
161	{
162	    /*
163	     * Make sure we didn't store this index already.
164	     */
165
166	    for (i = 0; i < *num_indices_ret; i++)
167		if (index_ret == indices_ret[i])
168		    break;
169
170	    if (i >= *num_indices_ret)
171	    {
172		indices_ret[*num_indices_ret] = index_ret;
173		*num_indices_ret += 1;
174	    }
175	}
176
177	IceFreeAuthFileEntry (entry);
178    }
179
180    fclose (auth_file);
181}
182
183
184
185void
186_IceGetPaValidAuthIndices (
187	const char	*protocol_name,
188	const char	*network_id,
189	int		num_auth_names,
190	const char	**auth_names,
191	int		*num_indices_ret,
192	int		*indices_ret		/* in/out arg */
193)
194{
195    int			index_ret;
196    int			i, j;
197    IceAuthDataEntry	*entry;
198
199    *num_indices_ret = 0;
200
201    for (i = 0;	i < _IcePaAuthDataEntryCount; i++)
202    {
203	entry = &_IcePaAuthDataEntries[i];
204
205	if (strcmp (protocol_name, entry->protocol_name) == 0 &&
206            strcmp (network_id, entry->network_id) == 0 &&
207	    auth_valid (entry->auth_name, num_auth_names,
208	    auth_names, &index_ret))
209	{
210	    /*
211	     * Make sure we didn't store this index already.
212	     */
213
214	    for (j = 0; j < *num_indices_ret; j++)
215		if (index_ret == indices_ret[j])
216		    break;
217
218	    if (j >= *num_indices_ret)
219	    {
220		indices_ret[*num_indices_ret] = index_ret;
221		*num_indices_ret += 1;
222	    }
223	}
224    }
225}
226
227
228
229/*
230 * local routines
231 */
232
233static Bool
234auth_valid (const char *auth_name, int num_auth_names,
235	    const char **auth_names, int *index_ret)
236
237{
238    /*
239     * Check if auth_name is in auth_names.  Return index.
240     */
241
242    int i;
243
244    for (i = 0; i < num_auth_names; i++)
245	if (strcmp (auth_name, auth_names[i]) == 0)
246	{
247	    break;
248	}
249
250    if (i < num_auth_names)
251    {
252	*index_ret = i;
253	return (1);
254    }
255    else
256	return (0);
257}
258