@@ -966,10 +966,69 @@
966 966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zRemoteUser && db_get_boolean("remote_user_ok",0) ){
967 967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
uid = db_int(0, "SELECT uid FROM user WHERE login=%Q"
968 968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" AND length(cap)>0 AND length(pw)>0", zRemoteUser);
969 969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
970 970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the request didn't provide a login cookie or the login cookie didn't
973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** match a known valid user, check the HTTP "Authorization" header and
974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** see if those credentials are valid for a known user.
975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( uid==0 ){
977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zHTTPAuth = PD("HTTP_AUTHORIZATION", 0);
978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Check to see if the HTTP "Authorization" header is present
980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zHTTPAuth!=0 && zHTTPAuth[0]!=0
982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && db_get_boolean("http_authentication_ok",0)
983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zBuf = fossil_strdup(zHTTPAuth);
985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zBuf!=0 ){
987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zPos;
988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zTok = strtok_r(zBuf, " ", &zPos);
989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zTok != 0 ){
991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Check to see if the authorization scheme is HTTP
992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** basic auth.
993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (strncmp(zTok, "Basic", zTok - zBuf) == 0) {
995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTok = strtok_r(NULL, " ", &zPos);
996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int zBytesDecoded = 0;
997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zDecodedAuth = decode64(zTok, &zBytesDecoded);
998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zUsername = strtok_r(zDecodedAuth, ":", &zPos);
1000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zPasswd = strtok_r(NULL, ":", &zPos);
1001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zUsername!=0 && zPasswd!=0 && zPasswd[0]!=0 ){
1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Attempting to log in as the user provided by HTTP
1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** basic auth
1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ uid = login_search_uid(zUsername, zPasswd);
1007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( uid>0 ){
1008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ record_login_attempt(zUsername, zIpAddr, 1);
1009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ record_login_attempt(zUsername, zIpAddr, 0);
1011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The user attempted to login specifically with HTTP basic
1013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** auth, but provided invalid credentials. Inform them of
1014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the failed login attempt via 401.
1015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_set_status(401, "Unauthorized");
1017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_reply();
1018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_exit(0);
1019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zDecodedAuth);
1023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zBuf);
1027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
971 1030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
972 1031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If no user found yet, try to log in as "nobody" */
973 1032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( uid==0 ){
974 1033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
uid = db_int(0, "SELECT uid FROM user WHERE login='nobody'");
975 1034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( uid==0 ){
976 1035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!