@@ -206,41 +206,53 @@
206 206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
207 207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Searches for the user ID matching the given name and password.
208 208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** On success it returns a positive value. On error it returns 0.
209 209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** On serious (DB-level) error it will probably exit.
210 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zUsername uses double indirection because we may re-point *zUsername
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** at a C string allocated with fossil_strdup() if you pass an email
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** address instead and we find that address in the user table's info
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** field, which is expected to contain a string of the form "Human Name
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <[email protected] >". In that case, *zUsername will point to that
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** user's actual login name on return, causing a leak unless the caller
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is diligent enough to check whether its pointer was re-pointed.
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
211 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** zPassword may be either the plain-text form or the encrypted
212 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** form of the user's password.
213 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int login_search_uid(const char *zUsername, const char *zPasswd){
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zSha1Pw = sha1_shared_secret(zPasswd, zUsername, 0);
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int login_search_uid(const char **zUsername, const char *zPasswd){
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zSha1Pw = sha1_shared_secret(zPasswd, *zUsername, 0);
216 224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int uid = db_int(0,
217 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT uid FROM user"
218 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE login=%Q"
219 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" AND length(cap)>0 AND length(pw)>0"
220 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" AND login NOT IN ('anonymous','nobody','developer','reader')"
221 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" AND (pw=%Q OR (length(pw)<>40 AND pw=%Q))"
222 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" AND (info NOT LIKE '%%expires 20%%'"
223 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" OR substr(info,instr(lower(info),'expires')+8,10)>datetime('now'))",
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUsername, zSha1Pw, zPasswd
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *zUsername, zSha1Pw, zPasswd
225 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
226 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
227 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we did not find a login on the first attempt, and the username
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** looks like an email address, the perhaps the user entired their
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** looks like an email address, then perhaps the user entered their
229 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** email address instead of their login. Try again to match the user
230 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** against email addresses contained in the "info" field.
231 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( uid==0 && strchr(zUsername,'@')!=0 ){
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( uid==0 && strchr(*zUsername,'@')!=0 ){
233 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
234 242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
235 243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT login FROM user"
236 244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE find_emailaddr(info)=%Q"
237 245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" AND instr(login,'@')==0",
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUsername
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *zUsername
239 247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( uid==0 && db_step(&q)==SQLITE_ROW ){
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- uid = login_search_uid(db_column_text(&q,0),zPasswd);
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zLogin = db_column_text(&q,0);
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (uid = login_search_uid(&zLogin, zPasswd) ) != 0 ){
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *zUsername = fossil_strdup(zLogin);
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
242 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
243 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
244 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
245 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zSha1Pw);
246 258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return uid;
@@ -650,11 +662,11 @@
650 662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
redirect_to_g();
651 663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
652 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zUsername!=0 && zPasswd!=0 && zPasswd[0]!=0 ){
653 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Attempting to log in as a user other than anonymous.
654 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- uid = login_search_uid(zUsername, zPasswd);
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ uid = login_search_uid(&zUsername, zPasswd);
656 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( uid<=0 ){
657 669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sleep(1);
658 670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zErrMsg =
659 671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <p><span class="loginError">
660 672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ You entered an unknown user or an incorrect password.
@@ -951,11 +963,11 @@
951 963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPasswd = &zDecode[i+1];
952 964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
953 965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Attempting to log in as the user provided by HTTP
954 966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** basic auth
955 967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- uid = login_search_uid(zUsername, zPasswd);
968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ uid = login_search_uid(&zUsername, zPasswd);
957 969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( uid>0 ){
958 970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
record_login_attempt(zUsername, zIpAddr, 1);
959 971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
960 972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
record_login_attempt(zUsername, zIpAddr, 0);
961 973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
962 974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!