Branch data Line data Source code
1 : : /*
2 : : *****************************************************************************
3 : : *
4 : : * File: fko_user.c
5 : : *
6 : : * Purpose: Set/Get the current username.
7 : : *
8 : : * Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
9 : : * Copyright (C) 2009-2014 fwknop developers and contributors. For a full
10 : : * list of contributors, see the file 'CREDITS'.
11 : : *
12 : : * License (GNU General Public License):
13 : : *
14 : : * This program is free software; you can redistribute it and/or
15 : : * modify it under the terms of the GNU General Public License
16 : : * as published by the Free Software Foundation; either version 2
17 : : * of the License, or (at your option) any later version.
18 : : *
19 : : * This program is distributed in the hope that it will be useful,
20 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 : : * GNU General Public License for more details.
23 : : *
24 : : * You should have received a copy of the GNU General Public License
25 : : * along with this program; if not, write to the Free Software
26 : : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
27 : : * USA
28 : : *
29 : : *****************************************************************************
30 : : */
31 : : #include "fko_common.h"
32 : : #include "fko.h"
33 : :
34 : : #ifdef WIN32
35 : : #include <getlogin.h>
36 : : #endif
37 : :
38 : : /* Get or Set the username for the fko context spa data.
39 : : */
40 : : int
41 : 1392 : fko_set_username(fko_ctx_t ctx, const char * const spoof_user)
42 : : {
43 : 1392 : char *username = NULL;
44 : 1392 : int res = FKO_SUCCESS, is_user_heap_allocated=0;
45 : :
46 : : #if HAVE_LIBFIU
47 : : fiu_return_on("fko_set_username_init", FKO_ERROR_CTX_NOT_INITIALIZED);
48 : : #endif
49 : :
50 : : /* Must be initialized
51 : : */
52 [ + - ][ + - ]: 1392 : if(!CTX_INITIALIZED(ctx))
53 : : return FKO_ERROR_CTX_NOT_INITIALIZED;
54 : :
55 : : /* If spoof_user was not passed in, check for a SPOOF_USER enviroment
56 : : * variable. If it is set, use its value.
57 : : */
58 [ + + ][ - + ]: 1392 : if(spoof_user != NULL && strnlen(spoof_user, MAX_SPA_USERNAME_SIZE))
59 : : username = (char*)spoof_user;
60 : : else
61 : 1014 : username = getenv("SPOOF_USER");
62 : :
63 : : /* Try to get the username from the system.
64 : : */
65 [ + + ]: 1392 : if(username == NULL)
66 : : {
67 : : /* Since we've already tried looking at an env variable, try
68 : : * LOGNAME next (and the cuserid() man page recommends this)
69 : : */
70 [ - + ]: 1014 : if((username = getenv("LOGNAME")) == NULL)
71 : : {
72 : : #ifdef _XOPEN_SOURCE
73 : : /* cuserid will return the effective user (i.e. su or setuid).
74 : : */
75 : 0 : username = cuserid(NULL);
76 : : #else
77 : : username = getlogin();
78 : : #endif
79 : : /* if we still didn't get a username, continue falling back
80 : : */
81 [ # # ]: 0 : if(username == NULL)
82 : : {
83 [ # # ]: 0 : if((username = getenv("USER")) == NULL)
84 : : {
85 : : #if HAVE_LIBFIU
86 : : fiu_return_on("fko_set_username_strdup1", FKO_ERROR_MEMORY_ALLOCATION);
87 : : #endif
88 : 0 : username = strdup("NO_USER");
89 [ # # ]: 0 : if(username == NULL)
90 : : return(FKO_ERROR_MEMORY_ALLOCATION);
91 : : is_user_heap_allocated = 1;
92 : : }
93 : : }
94 : : }
95 : : }
96 : :
97 : : /* Truncate the username if it is too long.
98 : : */
99 [ - + ]: 1392 : if(strnlen(username, MAX_SPA_USERNAME_SIZE) == MAX_SPA_USERNAME_SIZE)
100 : 0 : *(username + MAX_SPA_USERNAME_SIZE - 1) = '\0';
101 : :
102 [ + + ]: 1392 : if((res = validate_username(username)) != FKO_SUCCESS)
103 : : {
104 [ - + ]: 25 : if(is_user_heap_allocated == 1)
105 : 0 : free(username);
106 : : #if HAVE_LIBFIU
107 : : fiu_return_on("fko_set_username_valuser", FKO_ERROR_INVALID_DATA);
108 : : #endif
109 : 25 : return res;
110 : : }
111 : :
112 : : /* Just in case this is a subsquent call to this function. We
113 : : * do not want to be leaking memory.
114 : : */
115 [ + + ]: 1367 : if(ctx->username != NULL)
116 : 353 : free(ctx->username);
117 : :
118 : : #if HAVE_LIBFIU
119 : : fiu_return_on("fko_set_username_strdup2", FKO_ERROR_MEMORY_ALLOCATION);
120 : : #endif
121 : :
122 : 1367 : ctx->username = strdup(username);
123 : :
124 : 1367 : ctx->state |= FKO_DATA_MODIFIED;
125 : :
126 [ - + ]: 1367 : if(is_user_heap_allocated == 1)
127 : 0 : free(username);
128 : :
129 [ + - ]: 1367 : if(ctx->username == NULL)
130 : : return(FKO_ERROR_MEMORY_ALLOCATION);
131 : :
132 : 1367 : return(FKO_SUCCESS);
133 : : }
134 : :
135 : : /* Return the current username for this fko context.
136 : : */
137 : : int
138 : 449 : fko_get_username(fko_ctx_t ctx, char **username)
139 : : {
140 : :
141 : : #if HAVE_LIBFIU
142 : : fiu_return_on("fko_get_username_init", FKO_ERROR_CTX_NOT_INITIALIZED);
143 : : #endif
144 : :
145 : : /* Must be initialized
146 : : */
147 [ + - ][ + - ]: 449 : if(!CTX_INITIALIZED(ctx))
148 : : return(FKO_ERROR_CTX_NOT_INITIALIZED);
149 : :
150 [ + - ]: 449 : if(username == NULL)
151 : : return(FKO_ERROR_INVALID_DATA);
152 : :
153 : : #if HAVE_LIBFIU
154 : : fiu_return_on("fko_get_username_val", FKO_ERROR_INVALID_DATA);
155 : : #endif
156 : :
157 : 449 : *username = ctx->username;
158 : :
159 : 449 : return(FKO_SUCCESS);
160 : : }
161 : :
162 : : int
163 : 2183 : validate_username(const char *username)
164 : : {
165 : : int i;
166 : :
167 [ + - ][ + - ]: 2183 : if(username == NULL || strnlen(username, MAX_SPA_USERNAME_SIZE) == 0)
168 : : return(FKO_ERROR_INVALID_DATA_USER_MISSING);
169 : :
170 : : /* Exclude a few chars - this list is consistent with MS guidance since
171 : : * libfko runs on Windows:
172 : : * http://technet.microsoft.com/en-us/library/bb726984.aspx
173 : : */
174 [ + + ]: 13615 : for (i=0; i < (int)strnlen(username, MAX_SPA_USERNAME_SIZE); i++)
175 : : {
176 [ + + ]: 11469 : if((isalnum(username[i]) == 0)
177 [ + + ]: 895 : && ((username[i] < 0x20 || username[i] > 0x7e)
178 : : /* Not allowed chars: " / \ [ ] : ; | = , + * ? < >
179 : : */
180 [ + + ]: 884 : || (username[i] == 0x22
181 : 884 : || username[i] == 0x2f
182 [ + - ]: 876 : || username[i] == 0x5c
183 [ + - ]: 876 : || username[i] == 0x5b
184 [ + + ]: 876 : || username[i] == 0x5d
185 [ + - ]: 873 : || username[i] == 0x3a
186 [ + - ]: 873 : || username[i] == 0x3b
187 [ + + ]: 873 : || username[i] == 0x7c
188 [ + - ]: 870 : || username[i] == 0x3d
189 [ + + ]: 870 : || username[i] == 0x2c
190 [ + + ]: 862 : || username[i] == 0x2b
191 [ + + ]: 860 : || username[i] == 0x2a
192 [ + - ]: 858 : || username[i] == 0x3f
193 [ + - ]: 858 : || username[i] == 0x3c
194 [ - + ]: 858 : || username[i] == 0x3e)))
195 : : {
196 [ + + ]: 37 : if(i == 0)
197 : : {
198 : : return(FKO_ERROR_INVALID_DATA_USER_FIRSTCHAR_VALIDFAIL);
199 : : }
200 : : else
201 : : {
202 : 31 : return(FKO_ERROR_INVALID_DATA_USER_REMCHAR_VALIDFAIL);
203 : : }
204 : : }
205 : : }
206 : :
207 : : return FKO_SUCCESS;
208 : : }
209 : :
210 : : /***EOF***/
|