getauth.c revision a3129944
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