| | @@ -49,10 +49,25 @@ |
| 49 | 49 | # define sleep Sleep /* windows does not have sleep, but Sleep */ |
| 50 | 50 | # endif |
| 51 | 51 | #endif |
| 52 | 52 | #include <time.h> |
| 53 | 53 | |
| 54 | +/* |
| 55 | +** Compute an appropriate Anti-CSRF token into g.zCsrfToken[]. |
| 56 | +*/ |
| 57 | +static void login_create_csrf_secret(const char *zSeed){ |
| 58 | + unsigned char zResult[20]; |
| 59 | + int i; |
| 60 | + |
| 61 | + sha1sum_binary(zSeed, zResult); |
| 62 | + for(i=0; i<sizeof(g.zCsrfToken)-1; i++){ |
| 63 | + g.zCsrfToken[i] = "abcdefghijklmnopqrstuvwxyz" |
| 64 | + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| 65 | + "0123456789-/"[zResult[i]%64]; |
| 66 | + } |
| 67 | + g.zCsrfToken[i] = 0; |
| 68 | +} |
| 54 | 69 | |
| 55 | 70 | /* |
| 56 | 71 | ** Return the login-group name. Or return 0 if this repository is |
| 57 | 72 | ** not a member of a login-group. |
| 58 | 73 | */ |
| | @@ -1289,10 +1304,11 @@ |
| 1289 | 1304 | || (g.fSshClient & CGI_SSH_CLIENT)!=0 ) |
| 1290 | 1305 | && g.useLocalauth |
| 1291 | 1306 | && db_get_int("localauth",0)==0 |
| 1292 | 1307 | && P("HTTPS")==0 |
| 1293 | 1308 | ){ |
| 1309 | + char *zSeed; |
| 1294 | 1310 | if( g.localOpen ) zLogin = db_lget("default-user",0); |
| 1295 | 1311 | if( zLogin!=0 ){ |
| 1296 | 1312 | uid = db_int(0, "SELECT uid FROM user WHERE login=%Q", zLogin); |
| 1297 | 1313 | }else{ |
| 1298 | 1314 | uid = db_int(0, "SELECT uid FROM user WHERE cap LIKE '%%s%%'"); |
| | @@ -1299,11 +1315,14 @@ |
| 1299 | 1315 | } |
| 1300 | 1316 | g.zLogin = db_text("?", "SELECT login FROM user WHERE uid=%d", uid); |
| 1301 | 1317 | zCap = "sxy"; |
| 1302 | 1318 | g.noPswd = 1; |
| 1303 | 1319 | g.isHuman = 1; |
| 1304 | | - sqlite3_snprintf(sizeof(g.zCsrfToken), g.zCsrfToken, "localhost"); |
| 1320 | + zSeed = db_text("??", "SELECT uid||quote(login)||quote(pw)||quote(cookie)" |
| 1321 | + " FROM user WHERE uid=%d", uid); |
| 1322 | + login_create_csrf_secret(zSeed); |
| 1323 | + fossil_free(zSeed); |
| 1305 | 1324 | } |
| 1306 | 1325 | |
| 1307 | 1326 | /* Check the login cookie to see if it matches a known valid user. |
| 1308 | 1327 | */ |
| 1309 | 1328 | if( uid==0 && (zCookie = P(login_cookie_name()))!=0 ){ |
| | @@ -1354,11 +1373,11 @@ |
| 1354 | 1373 | if( uid==0 && login_transfer_credentials(zUser,zArg,zHash) ){ |
| 1355 | 1374 | uid = login_find_user(zUser, zHash); |
| 1356 | 1375 | if( uid ) record_login_attempt(zUser, zIpAddr, 1); |
| 1357 | 1376 | } |
| 1358 | 1377 | } |
| 1359 | | - sqlite3_snprintf(sizeof(g.zCsrfToken), g.zCsrfToken, "%.10s", zHash); |
| 1378 | + login_create_csrf_secret(zHash); |
| 1360 | 1379 | } |
| 1361 | 1380 | |
| 1362 | 1381 | /* If no user found and the REMOTE_USER environment variable is set, |
| 1363 | 1382 | ** then accept the value of REMOTE_USER as the user. |
| 1364 | 1383 | */ |
| | @@ -1404,11 +1423,11 @@ |
| 1404 | 1423 | if( uid==0 ){ |
| 1405 | 1424 | /* If there is no user "nobody", then make one up - with no privileges */ |
| 1406 | 1425 | uid = -1; |
| 1407 | 1426 | zCap = ""; |
| 1408 | 1427 | } |
| 1409 | | - sqlite3_snprintf(sizeof(g.zCsrfToken), g.zCsrfToken, "none"); |
| 1428 | + login_create_csrf_secret("none"); |
| 1410 | 1429 | } |
| 1411 | 1430 | |
| 1412 | 1431 | login_set_uid(uid, zCap); |
| 1413 | 1432 | } |
| 1414 | 1433 | |
| 1415 | 1434 | |