pwn 0.4.609 → 0.4.610
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.each do |bytes_matched| +51 -0
- data/Gemfile +8 -9
- data/README.md +2 -2
- data/bin/pwn_shodan_search +1 -0
- data/build_pwn_gem.sh +2 -1
- data/find_latest_gem_versions_per_Gemfile.sh +3 -0
- data/lib/pwn/plugins/shodan.rb +4 -0
- data/lib/pwn/version.rb +1 -1
- metadata +20 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0446e4910a77fbad2d9cd1741ca3512381159942a04e6e62ac8f20e3c533909e
|
4
|
+
data.tar.gz: c52ebec64bb57ab09834bb6b342b0fcd671f798c3b83012146282f7c41ab0ece
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93ff9c664ff6885e5a8d328dc67ed331692e3d507f7eea7065e602d5decc3e255157c7575a548373fffb8ecf83c7b587b4fde9dbffecda062a9219018f4a651e
|
7
|
+
data.tar.gz: ff3d9b90e7dfe11638822dc1e5da4b1d0e67fa9e790c69af935f0828b72a154efe5d6649dd52a54240bd0bbb6ad1926604a1cfdd8a530fed4576ea00ba11583d
|
@@ -0,0 +1,51 @@
|
|
1
|
+
=> [[[31m[1;31m"[0m[31mstatic const char *hdr2hex(const struct MBuf *data, char *buf, unsigned buflen)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mconst uint8_t *bin = data->data + data->read_pos;[1;35m\n[0m[31m[1;35m\t[0m[31munsigned int dlen;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mdlen = mbuf_avail_for_read(data);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn bin2hex(bin, dlen, buf, buflen);[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
2
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mconst uint8_t *bin = data->data + data->read_pos;[1;35m\n[0m[31m[1;35m\t[0m[31munsigned int dlen;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mdlen = mbuf_avail_for_read(data);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn bin2hex(bin, dlen, buf, buflen);[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
3
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
4
|
+
[[31m[1;31m"[0m[31mPgDatabase *prepare_auth_database(PgSocket *client)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mPgDatabase *auth_db = NULL;[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *auth_dbname = client->db->auth_dbname ? client->db->auth_dbname : cf_auth_dbname;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!auth_dbname)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn client->db;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mauth_db = find_database(auth_dbname);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!auth_db) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mauthentication database [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m is not configured.[1;35m\"[0m[31m, auth_dbname);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbouncer config error[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn NULL;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (auth_db->db_disabled) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client([1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mtrue,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\"[0m[31mauthentication database [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m is disabled[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mauth_dbname);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn NULL;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mreturn auth_db;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
5
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mPgDatabase *auth_db = NULL;[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *auth_dbname = client->db->auth_dbname ? client->db->auth_dbname : cf_auth_dbname;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!auth_dbname)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn client->db;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mauth_db = find_database(auth_dbname);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!auth_db) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mauthentication database [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m is not configured.[1;35m\"[0m[31m, auth_dbname);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbouncer config error[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn NULL;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (auth_db->db_disabled) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client([1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mtrue,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\"[0m[31mauthentication database [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m is disabled[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mauth_dbname);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn NULL;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mreturn auth_db;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
6
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
7
|
+
[[31m[1;31m"[0m[31mstatic bool check_client_passwd(PgSocket *client, const char *passwd)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mPgUser *user = client->login_user;[1;35m\n[0m[31m[1;35m\t[0m[31mint auth_type = client->client_auth_type;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (user->mock_auth)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* disallow empty passwords */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!*user->passwd)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (auth_type) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_PLAIN:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mswitch (get_password_type(user->passwd)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_PLAINTEXT:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn strcmp(user->passwd, passwd) == 0;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_MD5: {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar md5[MD5_PASSWD_LEN + 1];[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpg_md5_encrypt(passwd, user->name, strlen(user->name), md5);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn strcmp(user->passwd, md5) == 0;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_SCRAM_SHA_256:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn scram_verify_plain_password(client, user->name, passwd, user->passwd);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_MD5: {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar *stored_passwd;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar md5[MD5_PASSWD_LEN + 1];[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (strlen(passwd) != MD5_PASSWD_LEN)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * The client sends[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * 'md5'+md5(md5(password+username)+salt). The stored[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * password is either 'md5'+md5(password+username) or[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * plain text. If the latter, we compute the inner[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * md5() call first.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (get_password_type(user->passwd) == PASSWORD_TYPE_PLAINTEXT) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpg_md5_encrypt(user->passwd, user->name, strlen(user->name), md5);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mstored_passwd = md5;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mstored_passwd = user->passwd;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpg_md5_encrypt(stored_passwd + 3, (char *)client->tmp_login_salt, 4, md5);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn strcmp(md5, passwd) == 0;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
8
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mPgUser *user = client->login_user;[1;35m\n[0m[31m[1;35m\t[0m[31mint auth_type = client->client_auth_type;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (user->mock_auth)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* disallow empty passwords */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!*user->passwd)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (auth_type) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_PLAIN:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mswitch (get_password_type(user->passwd)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_PLAINTEXT:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn strcmp(user->passwd, passwd) == 0;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_MD5: {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar md5[MD5_PASSWD_LEN + 1];[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpg_md5_encrypt(passwd, user->name, strlen(user->name), md5);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn strcmp(user->passwd, md5) == 0;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_SCRAM_SHA_256:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn scram_verify_plain_password(client, user->name, passwd, user->passwd);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_MD5: {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar *stored_passwd;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar md5[MD5_PASSWD_LEN + 1];[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (strlen(passwd) != MD5_PASSWD_LEN)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * The client sends[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * 'md5'+md5(md5(password+username)+salt). The stored[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * password is either 'md5'+md5(password+username) or[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * plain text. If the latter, we compute the inner[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * md5() call first.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (get_password_type(user->passwd) == PASSWORD_TYPE_PLAINTEXT) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpg_md5_encrypt(user->passwd, user->name, strlen(user->name), md5);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mstored_passwd = md5;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mstored_passwd = user->passwd;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpg_md5_encrypt(stored_passwd + 3, (char *)client->tmp_login_salt, 4, md5);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn strcmp(md5, passwd) == 0;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
9
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
10
|
+
[[31m[1;31m"[0m[31mstatic bool send_client_authreq(PgSocket *client)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mint res;[1;35m\n[0m[31m[1;35m\t[0m[31mint auth_type = client->client_auth_type;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (auth_type == AUTH_MD5) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31muint8_t saltlen = 4;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mget_random_bytes((void*)client->tmp_login_salt, saltlen);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31mib[1;35m\"[0m[31m, AUTH_MD5, client->tmp_login_salt, saltlen);[1;35m\n[0m[31m[1;35m\t[0m[31m} else if (auth_type == AUTH_PLAIN || auth_type == AUTH_PAM) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31mi[1;35m\"[0m[31m, AUTH_PLAIN);[1;35m\n[0m[31m[1;35m\t[0m[31m} else if (auth_type == AUTH_SCRAM_SHA_256) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31miss[1;35m\"[0m[31m, AUTH_SASL, [1;35m\"[0m[31mSCRAM-SHA-256[1;35m\"[0m[31m, [1;35m\"[0m[31m[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!res) {[1;35m\n[0m[31m[1;35m\t[0m[31m slog_noise(client, [1;35m\"[0m[31mNo authentication response received[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to send auth req[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mAuth request sent successfully[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mreturn res;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
11
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mint res;[1;35m\n[0m[31m[1;35m\t[0m[31mint auth_type = client->client_auth_type;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (auth_type == AUTH_MD5) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31muint8_t saltlen = 4;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mget_random_bytes((void*)client->tmp_login_salt, saltlen);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31mib[1;35m\"[0m[31m, AUTH_MD5, client->tmp_login_salt, saltlen);[1;35m\n[0m[31m[1;35m\t[0m[31m} else if (auth_type == AUTH_PLAIN || auth_type == AUTH_PAM) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31mi[1;35m\"[0m[31m, AUTH_PLAIN);[1;35m\n[0m[31m[1;35m\t[0m[31m} else if (auth_type == AUTH_SCRAM_SHA_256) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31miss[1;35m\"[0m[31m, AUTH_SASL, [1;35m\"[0m[31mSCRAM-SHA-256[1;35m\"[0m[31m, [1;35m\"[0m[31m[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!res) {[1;35m\n[0m[31m[1;35m\t[0m[31m slog_noise(client, [1;35m\"[0m[31mNo authentication response received[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to send auth req[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mAuth request sent successfully[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mreturn res;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
12
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
13
|
+
[[31m[1;31m"[0m[31mstatic void start_auth_query(PgSocket *client, const char *username)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mint res;[1;35m\n[0m[31m[1;35m\t[0m[31mPktBuf *buf;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* have to fetch user info from db */[1;35m\n[0m[31m[1;35m\t[0m[31mPgDatabase *auth_db = prepare_auth_database(client);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!auth_db)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mclient->pool = get_pool(auth_db, client->db->auth_user);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!find_server(client)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->wait_for_user_conn = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mdoing auth_conn query[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31mclient->wait_for_user_conn = false;[1;35m\n[0m[31m[1;35m\t[0m[31mclient->wait_for_user = true;[1;35m\n[0m[31m[1;35m\t[0m[31mif (!sbuf_pause(&client->sbuf)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mrelease_server(client->link);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mpause failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mclient->link->ready = false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mres = 0;[1;35m\n[0m[31m[1;35m\t[0m[31mbuf = pktbuf_dynamic(512);[1;35m\n[0m[31m[1;35m\t[0m[31mif (buf) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpktbuf_write_ExtQuery(buf, cf_auth_query, 1, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = pktbuf_send_immediate(buf, client->link);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpktbuf_free(buf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * Should do instead:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * res = pktbuf_send_queued(buf, client->link);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * but that needs better integration with SBuf.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (!res)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(client->link, false, [1;35m\"[0m[31munable to send auth_query[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31mclient->expect_rfq_count++;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
14
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mint res;[1;35m\n[0m[31m[1;35m\t[0m[31mPktBuf *buf;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* have to fetch user info from db */[1;35m\n[0m[31m[1;35m\t[0m[31mPgDatabase *auth_db = prepare_auth_database(client);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!auth_db)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mclient->pool = get_pool(auth_db, client->db->auth_user);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!find_server(client)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->wait_for_user_conn = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mdoing auth_conn query[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31mclient->wait_for_user_conn = false;[1;35m\n[0m[31m[1;35m\t[0m[31mclient->wait_for_user = true;[1;35m\n[0m[31m[1;35m\t[0m[31mif (!sbuf_pause(&client->sbuf)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mrelease_server(client->link);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mpause failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mclient->link->ready = false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mres = 0;[1;35m\n[0m[31m[1;35m\t[0m[31mbuf = pktbuf_dynamic(512);[1;35m\n[0m[31m[1;35m\t[0m[31mif (buf) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpktbuf_write_ExtQuery(buf, cf_auth_query, 1, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = pktbuf_send_immediate(buf, client->link);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpktbuf_free(buf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * Should do instead:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * res = pktbuf_send_queued(buf, client->link);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * but that needs better integration with SBuf.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (!res)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(client->link, false, [1;35m\"[0m[31munable to send auth_query[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31mclient->expect_rfq_count++;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
15
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
16
|
+
[[31m[1;31m"[0m[31mstatic bool login_via_cert(PgSocket *client)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mstruct tls *tls = client->sbuf.tls;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!tls) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mTLS connection required[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (!tls_peer_cert_provided(client->sbuf.tls)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mTLS client certificate required[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->login_user->mock_auth)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mlog_debug([1;35m\"[0m[31mTLS cert login: %s[1;35m\"[0m[31m, tls_peer_cert_subject(client->sbuf.tls));[1;35m\n[0m[31m[1;35m\t[0m[31mif (!tls_peer_cert_contains_name(client->sbuf.tls, client->login_user->name)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mTLS certificate name mismatch[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* login successful */[1;35m\n[0m[31m[1;35m\t[0m[31mreturn finish_client_login(client);[1;35m\n[0m[31mfail:[1;35m\n[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mcertificate authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
17
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mstruct tls *tls = client->sbuf.tls;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!tls) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mTLS connection required[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (!tls_peer_cert_provided(client->sbuf.tls)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mTLS client certificate required[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->login_user->mock_auth)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mlog_debug([1;35m\"[0m[31mTLS cert login: %s[1;35m\"[0m[31m, tls_peer_cert_subject(client->sbuf.tls));[1;35m\n[0m[31m[1;35m\t[0m[31mif (!tls_peer_cert_contains_name(client->sbuf.tls, client->login_user->name)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mTLS certificate name mismatch[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* login successful */[1;35m\n[0m[31m[1;35m\t[0m[31mreturn finish_client_login(client);[1;35m\n[0m[31mfail:[1;35m\n[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mcertificate authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
18
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
19
|
+
[[31m[1;31m"[0m[31mstatic bool login_as_unix_peer(PgSocket *client)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mif (!pga_is_unix(&client->remote_addr))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->login_user->mock_auth)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31mif (!check_unix_peer_name(sbuf_socket(&client->sbuf), client->login_user->name))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31mreturn finish_client_login(client);[1;35m\n[0m[31mfail:[1;35m\n[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31munix socket login rejected[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
20
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!pga_is_unix(&client->remote_addr))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->login_user->mock_auth)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31mif (!check_unix_peer_name(sbuf_socket(&client->sbuf), client->login_user->name))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto fail;[1;35m\n[0m[31m[1;35m\t[0m[31mreturn finish_client_login(client);[1;35m\n[0m[31mfail:[1;35m\n[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31munix socket login rejected[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
21
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
22
|
+
[[31m[1;31m"[0m[31mstatic bool finish_set_pool(PgSocket *client, bool takeover)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mbool ok = false;[1;35m\n[0m[31m[1;35m\t[0m[31mint auth;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->login_user->mock_auth && !client->db->fake) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mPgUser *pool_user;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->forced_user)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpool_user = client->db->forced_user;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpool_user = client->login_user;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->pool = get_pool(client->db, pool_user);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->pool) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mno memory for pool[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (cf_log_connections) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->sbuf.tls) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar infobuf[96] = [1;35m\"[0m[31m[1;35m\"[0m[31m;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mtls_get_connection_info(client->sbuf.tls, infobuf, sizeof infobuf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin attempt: db=%s user=%s tls=%s[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->db->name, client->login_user->name, infobuf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin attempt: db=%s user=%s tls=no[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->db->name, client->login_user->name);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (takeover)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->pool && client->pool->db->admin) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!admin_post_login(client))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->own_user)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn finish_client_login(client);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mauth = cf_auth_type;[1;35m\n[0m[31m[1;35m\t[0m[31mif (auth == AUTH_HBA) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mauth = hba_eval(parsed_hba, &client->remote_addr, !!client->sbuf.tls,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db->name, client->login_user->name);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (auth == AUTH_MD5)[1;35m\n[0m[31m[1;35m\t[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (get_password_type(client->login_user->passwd) == PASSWORD_TYPE_SCRAM_SHA_256)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mauth = AUTH_SCRAM_SHA_256;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* remember method */[1;35m\n[0m[31m[1;35m\t[0m[31mclient->client_auth_type = auth;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (auth) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_ANY:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = finish_client_login(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_TRUST:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->login_user->mock_auth)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31m[1;35m\\[0m[31m[1;35m\"[0m[31mtrust[1;35m\\[0m[31m[1;35m\"[0m[31m authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = finish_client_login(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_PLAIN:[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_MD5:[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_PAM:[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_SCRAM_SHA_256:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = send_client_authreq(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_CERT:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = login_via_cert(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_PEER:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = login_as_unix_peer(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mlogin rejected[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mreturn ok;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
23
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mbool ok = false;[1;35m\n[0m[31m[1;35m\t[0m[31mint auth;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->login_user->mock_auth && !client->db->fake) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mPgUser *pool_user;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->forced_user)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpool_user = client->db->forced_user;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpool_user = client->login_user;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->pool = get_pool(client->db, pool_user);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->pool) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mno memory for pool[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (cf_log_connections) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->sbuf.tls) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar infobuf[96] = [1;35m\"[0m[31m[1;35m\"[0m[31m;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mtls_get_connection_info(client->sbuf.tls, infobuf, sizeof infobuf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin attempt: db=%s user=%s tls=%s[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->db->name, client->login_user->name, infobuf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin attempt: db=%s user=%s tls=no[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->db->name, client->login_user->name);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (takeover)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->pool && client->pool->db->admin) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!admin_post_login(client))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->own_user)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn finish_client_login(client);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mauth = cf_auth_type;[1;35m\n[0m[31m[1;35m\t[0m[31mif (auth == AUTH_HBA) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mauth = hba_eval(parsed_hba, &client->remote_addr, !!client->sbuf.tls,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db->name, client->login_user->name);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (auth == AUTH_MD5)[1;35m\n[0m[31m[1;35m\t[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (get_password_type(client->login_user->passwd) == PASSWORD_TYPE_SCRAM_SHA_256)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mauth = AUTH_SCRAM_SHA_256;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* remember method */[1;35m\n[0m[31m[1;35m\t[0m[31mclient->client_auth_type = auth;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (auth) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_ANY:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = finish_client_login(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_TRUST:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->login_user->mock_auth)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31m[1;35m\\[0m[31m[1;35m\"[0m[31mtrust[1;35m\\[0m[31m[1;35m\"[0m[31m authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = finish_client_login(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_PLAIN:[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_MD5:[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_PAM:[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_SCRAM_SHA_256:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = send_client_authreq(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_CERT:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = login_via_cert(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase AUTH_PEER:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = login_as_unix_peer(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mlogin rejected[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mreturn ok;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
24
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
25
|
+
[[31m[1;31m"[0m[31mbool set_pool(PgSocket *client, const char *dbname, const char *username, const char *password, bool takeover)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mAssert((password && takeover) || (!password && !takeover));[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* find database */[1;35m\n[0m[31m[1;35m\t[0m[31mclient->db = find_database(dbname);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->db) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db = register_auto_database(dbname);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mregistered new auto-database: db=%s[1;35m\"[0m[31m, dbname);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->db) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db = calloc(1, sizeof(*client->db));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db->fake = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mstrlcpy(client->db->name, dbname, sizeof(client->db->name));[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->db->admin) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (admin_pre_login(client, username))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn finish_set_pool(client, takeover);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* avoid dealing with invalid data below, and give an[1;35m\n[0m[31m[1;35m\t[0m[31m * appropriate error message */[1;35m\n[0m[31m[1;35m\t[0m[31mif (strlen(username) >= MAX_USERNAME) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31musername too long[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (cf_log_connections)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin failed: db=%s user=%s[1;35m\"[0m[31m, dbname, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (password && strlen(password) >= MAX_PASSWORD) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mpassword too long[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (cf_log_connections)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin failed: db=%s user=%s[1;35m\"[0m[31m, dbname, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* find user */[1;35m\n[0m[31m[1;35m\t[0m[31mif (cf_auth_type == AUTH_ANY) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* ignore requested user */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->forced_user == NULL) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mauth_type=any requires forced user[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbouncer config error[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = client->db->forced_user;[1;35m\n[0m[31m[1;35m\t[0m[31m} else if (cf_auth_type == AUTH_PAM) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->auth_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mPAM can't be used together with database authentication[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbouncer config error[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* Password will be set after successful authentication when not in takeover mode */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = add_pam_user(username, password);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mset_pool(): failed to allocate new PAM user[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbouncer resources exhaustion[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = find_user(username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * If the login user specified by the client[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * does not exist, check if an auth_user is[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * set and if so send off an auth_query. If[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * no auth_user is set for the db, see if the[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * global auth_user is set and use that.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->db->auth_user && cf_auth_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db->auth_user = find_user(cf_auth_user);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->db->auth_user)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db->auth_user = add_user(cf_auth_user, [1;35m\"[0m[31m[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->auth_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->fake)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mnot running auth_query because database is fake[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (takeover) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = add_db_user(client->db, username, password);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn finish_set_pool(client, takeover);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mstart_auth_query(client, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mno such user: %s[1;35m\"[0m[31m, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = calloc(1, sizeof(*client->login_user));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user->mock_auth = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msafe_strcpy(client->login_user->name, username, sizeof(client->login_user->name));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mreturn finish_set_pool(client, takeover);[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
26
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mAssert((password && takeover) || (!password && !takeover));[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* find database */[1;35m\n[0m[31m[1;35m\t[0m[31mclient->db = find_database(dbname);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->db) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db = register_auto_database(dbname);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mregistered new auto-database: db=%s[1;35m\"[0m[31m, dbname);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->db) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db = calloc(1, sizeof(*client->db));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db->fake = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mstrlcpy(client->db->name, dbname, sizeof(client->db->name));[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->db->admin) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (admin_pre_login(client, username))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn finish_set_pool(client, takeover);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* avoid dealing with invalid data below, and give an[1;35m\n[0m[31m[1;35m\t[0m[31m * appropriate error message */[1;35m\n[0m[31m[1;35m\t[0m[31mif (strlen(username) >= MAX_USERNAME) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31musername too long[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (cf_log_connections)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin failed: db=%s user=%s[1;35m\"[0m[31m, dbname, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (password && strlen(password) >= MAX_PASSWORD) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mpassword too long[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (cf_log_connections)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin failed: db=%s user=%s[1;35m\"[0m[31m, dbname, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* find user */[1;35m\n[0m[31m[1;35m\t[0m[31mif (cf_auth_type == AUTH_ANY) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* ignore requested user */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->forced_user == NULL) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mauth_type=any requires forced user[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbouncer config error[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = client->db->forced_user;[1;35m\n[0m[31m[1;35m\t[0m[31m} else if (cf_auth_type == AUTH_PAM) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->auth_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mPAM can't be used together with database authentication[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbouncer config error[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* Password will be set after successful authentication when not in takeover mode */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = add_pam_user(username, password);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mset_pool(): failed to allocate new PAM user[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbouncer resources exhaustion[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = find_user(username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * If the login user specified by the client[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * does not exist, check if an auth_user is[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * set and if so send off an auth_query. If[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * no auth_user is set for the db, see if the[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * global auth_user is set and use that.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->db->auth_user && cf_auth_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db->auth_user = find_user(cf_auth_user);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->db->auth_user)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->db->auth_user = add_user(cf_auth_user, [1;35m\"[0m[31m[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->auth_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->db->fake)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mnot running auth_query because database is fake[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (takeover) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = add_db_user(client->db, username, password);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn finish_set_pool(client, takeover);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mstart_auth_query(client, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mno such user: %s[1;35m\"[0m[31m, username);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = calloc(1, sizeof(*client->login_user));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user->mock_auth = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msafe_strcpy(client->login_user->name, username, sizeof(client->login_user->name));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mreturn finish_set_pool(client, takeover);[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
27
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
28
|
+
[[31m[1;31m"[0m[31mbool handle_auth_query_response(PgSocket *client, PktHdr *pkt) {[1;35m\n[0m[31m[1;35m\t[0m[31muint16_t columns;[1;35m\n[0m[31m[1;35m\t[0m[31muint32_t length;[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *username, *password;[1;35m\n[0m[31m[1;35m\t[0m[31mPgUser user;[1;35m\n[0m[31m[1;35m\t[0m[31mPgSocket *server = client->link;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch(pkt->type) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'T':[1;35m\t[0m[31m/* RowDescription */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint16be(&pkt->data, &columns)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (columns != 2u) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mexpected 2 columns from auth_query, not %hu[1;35m\"[0m[31m, columns);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'D':[1;35m\t[0m[31m/* DataRow */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemset(&user, 0, sizeof(user));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint16be(&pkt->data, &columns)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (columns != 2u) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mexpected 2 columns from auth_query, not %hu[1;35m\"[0m[31m, columns);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint32be(&pkt->data, &length)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (length == (uint32_t)-1) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mauth_query response contained null user name[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_chars(&pkt->data, length, &username)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (sizeof(user.name) - 1 < length)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mlength = sizeof(user.name) - 1;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(user.name, username, length);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint32be(&pkt->data, &length)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (length == (uint32_t)-1) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * NULL - set an md5 password with an impossible value,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * so that nothing will ever match[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpassword = [1;35m\"[0m[31mmd5[1;35m\"[0m[31m;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mlength = 3;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_chars(&pkt->data, length, &password)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (sizeof(user.passwd) - 1 < length)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mlength = sizeof(user.passwd) - 1;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(user.passwd, password, length);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = add_db_user(client->db, user.name, user.passwd);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31munable to allocate new user for auth[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'N':[1;35m\t[0m[31m/* NoticeResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'C':[1;35m\t[0m[31m/* CommandComplete */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase '1':[1;35m\t[0m[31m/* ParseComplete */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase '2':[1;35m\t[0m[31m/* BindComplete */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'S': /* ParameterStatus */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'Z':[1;35m\t[0m[31m/* ReadyForQuery */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msbuf_prepare_skip(&client->link->sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (cf_log_connections)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin failed: db=%s[1;35m\"[0m[31m, client->db->name);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * TODO: Currently no mock authentication when[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * using auth_query/auth_user; we just abort[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * with a revealing message to the client.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * The main problem is that at this point we[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * don't know the original user name anymore[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * to do that. As a workaround, the[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * auth_query could be written in a way that[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * it returns a fake user and password if the[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * requested user doesn't exist.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mno such user[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mauth query complete[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->link->resetting = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msbuf_continue(&client->sbuf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * either sbuf_continue or disconnect_client could disconnect the server[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * way down in their bowels of other callbacks. so check that, and[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * return appropriately (similar to reuse_on_release)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (server->state == SV_FREE || server->state == SV_JUSTFREE)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'E':[1;35m\t[0m[31m/* ErrorResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31merror response from auth_query[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31munexpected response from auth_query[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31msbuf_prepare_skip(&server->sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
29
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31muint16_t columns;[1;35m\n[0m[31m[1;35m\t[0m[31muint32_t length;[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *username, *password;[1;35m\n[0m[31m[1;35m\t[0m[31mPgUser user;[1;35m\n[0m[31m[1;35m\t[0m[31mPgSocket *server = client->link;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch(pkt->type) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'T':[1;35m\t[0m[31m/* RowDescription */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint16be(&pkt->data, &columns)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (columns != 2u) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mexpected 2 columns from auth_query, not %hu[1;35m\"[0m[31m, columns);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'D':[1;35m\t[0m[31m/* DataRow */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemset(&user, 0, sizeof(user));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint16be(&pkt->data, &columns)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (columns != 2u) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mexpected 2 columns from auth_query, not %hu[1;35m\"[0m[31m, columns);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint32be(&pkt->data, &length)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (length == (uint32_t)-1) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mauth_query response contained null user name[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_chars(&pkt->data, length, &username)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (sizeof(user.name) - 1 < length)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mlength = sizeof(user.name) - 1;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(user.name, username, length);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint32be(&pkt->data, &length)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (length == (uint32_t)-1) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * NULL - set an md5 password with an impossible value,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * so that nothing will ever match[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpassword = [1;35m\"[0m[31mmd5[1;35m\"[0m[31m;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mlength = 3;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_chars(&pkt->data, length, &password)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (sizeof(user.passwd) - 1 < length)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mlength = sizeof(user.passwd) - 1;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(user.passwd, password, length);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->login_user = add_db_user(client->db, user.name, user.passwd);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31munable to allocate new user for auth[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'N':[1;35m\t[0m[31m/* NoticeResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'C':[1;35m\t[0m[31m/* CommandComplete */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase '1':[1;35m\t[0m[31m/* ParseComplete */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase '2':[1;35m\t[0m[31m/* BindComplete */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'S': /* ParameterStatus */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'Z':[1;35m\t[0m[31m/* ReadyForQuery */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msbuf_prepare_skip(&client->link->sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (cf_log_connections)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_info(client, [1;35m\"[0m[31mlogin failed: db=%s[1;35m\"[0m[31m, client->db->name);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * TODO: Currently no mock authentication when[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * using auth_query/auth_user; we just abort[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * with a revealing message to the client.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * The main problem is that at this point we[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * don't know the original user name anymore[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * to do that. As a workaround, the[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * auth_query could be written in a way that[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * it returns a fake user and password if the[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * requested user doesn't exist.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mno such user[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mauth query complete[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->link->resetting = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msbuf_continue(&client->sbuf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * either sbuf_continue or disconnect_client could disconnect the server[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * way down in their bowels of other callbacks. so check that, and[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * return appropriately (similar to reuse_on_release)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (server->state == SV_FREE || server->state == SV_JUSTFREE)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'E':[1;35m\t[0m[31m/* ErrorResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31merror response from auth_query[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(server, false, [1;35m\"[0m[31munexpected response from auth_query[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31msbuf_prepare_skip(&server->sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
30
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
31
|
+
[[31m[1;31m"[0m[31mstatic void set_appname(PgSocket *client, const char *app_name)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mchar buf[400], abuf[300];[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *details;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (cf_application_name_add_host) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* give app a name */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!app_name)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mapp_name = [1;35m\"[0m[31mapp[1;35m\"[0m[31m;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* add details */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdetails = pga_details(&client->remote_addr, abuf, sizeof(abuf));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msnprintf(buf, sizeof(buf), [1;35m\"[0m[31m%s - %s[1;35m\"[0m[31m, app_name, details);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mapp_name = buf;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (app_name) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31musing application_name: %s[1;35m\"[0m[31m, app_name);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mvarcache_set(&client->vars, [1;35m\"[0m[31mapplication_name[1;35m\"[0m[31m, app_name);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
32
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mchar buf[400], abuf[300];[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *details;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (cf_application_name_add_host) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* give app a name */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!app_name)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mapp_name = [1;35m\"[0m[31mapp[1;35m\"[0m[31m;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* add details */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdetails = pga_details(&client->remote_addr, abuf, sizeof(abuf));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msnprintf(buf, sizeof(buf), [1;35m\"[0m[31m%s - %s[1;35m\"[0m[31m, app_name, details);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mapp_name = buf;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (app_name) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31musing application_name: %s[1;35m\"[0m[31m, app_name);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mvarcache_set(&client->vars, [1;35m\"[0m[31mapplication_name[1;35m\"[0m[31m, app_name);[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
33
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
34
|
+
[[31m[1;31m"[0m[31mstatic bool decide_startup_pool(PgSocket *client, PktHdr *pkt)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *username = NULL, *dbname = NULL;[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *key, *val;[1;35m\n[0m[31m[1;35m\t[0m[31mbool ok;[1;35m\n[0m[31m[1;35m\t[0m[31mbool appname_found = false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mwhile (1) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = mbuf_get_string(&pkt->data, &key);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!ok || *key == 0)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = mbuf_get_string(&pkt->data, &val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!ok)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (strcmp(key, [1;35m\"[0m[31mdatabase[1;35m\"[0m[31m) == 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mgot var: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdbname = val;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (strcmp(key, [1;35m\"[0m[31muser[1;35m\"[0m[31m) == 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mgot var: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31musername = val;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (strcmp(key, [1;35m\"[0m[31mapplication_name[1;35m\"[0m[31m) == 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mset_appname(client, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mappname_found = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (varcache_set(&client->vars, key, val)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mgot var: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (strlist_contains(cf_ignore_startup_params, key)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mignoring startup parameter: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_warning(client, [1;35m\"[0m[31munsupported startup parameter: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31munsupported startup parameter: %s[1;35m\"[0m[31m, key);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (!username || !username[0]) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mno username supplied[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* if missing dbname, default to username */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!dbname || !dbname[0])[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdbname = username;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* create application_name if requested */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!appname_found)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mset_appname(client, NULL);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* check if limit allows, don't limit admin db[1;35m\n[0m[31m[1;35m\t[0m[31m nb: new incoming conn will be attached to PgSocket, thus[1;35m\n[0m[31m[1;35m\t[0m[31m get_active_client_count() counts it */[1;35m\n[0m[31m[1;35m\t[0m[31mif (get_active_client_count() > cf_max_client_conn) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (strcmp(dbname, [1;35m\"[0m[31mpgbouncer[1;35m\"[0m[31m) != 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mno more connections allowed (max_client_conn)[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* find pool */[1;35m\n[0m[31m[1;35m\t[0m[31mreturn set_pool(client, dbname, username, NULL, false);[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
35
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *username = NULL, *dbname = NULL;[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *key, *val;[1;35m\n[0m[31m[1;35m\t[0m[31mbool ok;[1;35m\n[0m[31m[1;35m\t[0m[31mbool appname_found = false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mwhile (1) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = mbuf_get_string(&pkt->data, &key);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!ok || *key == 0)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = mbuf_get_string(&pkt->data, &val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!ok)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (strcmp(key, [1;35m\"[0m[31mdatabase[1;35m\"[0m[31m) == 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mgot var: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdbname = val;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (strcmp(key, [1;35m\"[0m[31muser[1;35m\"[0m[31m) == 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mgot var: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31musername = val;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (strcmp(key, [1;35m\"[0m[31mapplication_name[1;35m\"[0m[31m) == 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mset_appname(client, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mappname_found = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (varcache_set(&client->vars, key, val)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mgot var: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (strlist_contains(cf_ignore_startup_params, key)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mignoring startup parameter: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_warning(client, [1;35m\"[0m[31munsupported startup parameter: %s=%s[1;35m\"[0m[31m, key, val);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31munsupported startup parameter: %s[1;35m\"[0m[31m, key);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mif (!username || !username[0]) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mno username supplied[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* if missing dbname, default to username */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!dbname || !dbname[0])[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdbname = username;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* create application_name if requested */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!appname_found)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mset_appname(client, NULL);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* check if limit allows, don't limit admin db[1;35m\n[0m[31m[1;35m\t[0m[31m nb: new incoming conn will be attached to PgSocket, thus[1;35m\n[0m[31m[1;35m\t[0m[31m get_active_client_count() counts it */[1;35m\n[0m[31m[1;35m\t[0m[31mif (get_active_client_count() > cf_max_client_conn) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (strcmp(dbname, [1;35m\"[0m[31mpgbouncer[1;35m\"[0m[31m) != 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mno more connections allowed (max_client_conn)[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* find pool */[1;35m\n[0m[31m[1;35m\t[0m[31mreturn set_pool(client, dbname, username, NULL, false);[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
36
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
37
|
+
[[31m[1;31m"[0m[31mstatic bool scram_client_first(PgSocket *client, uint32_t datalen, const uint8_t *data)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mchar *ibuf;[1;35m\n[0m[31m[1;35m\t[0m[31mchar *input;[1;35m\n[0m[31m[1;35m\t[0m[31mint res;[1;35m\n[0m[31m[1;35m\t[0m[31mPgUser *user = client->login_user;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mibuf = malloc(datalen + 1);[1;35m\n[0m[31m[1;35m\t[0m[31mif (ibuf == NULL)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mmemcpy(ibuf, data, datalen);[1;35m\n[0m[31m[1;35m\t[0m[31mibuf[datalen] = '[1;35m\\[0m[31m0';[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31minput = ibuf;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM client-first-message = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, input);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!read_client_first_message(client, input,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &client->scram_state.cbind_flag,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &client->scram_state.client_first_message_bare,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &client->scram_state.client_nonce))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!user->mock_auth) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mstored secret = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, user->passwd);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mswitch (get_password_type(user->passwd)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_MD5:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mSCRAM authentication failed: user has MD5 secret[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_PLAINTEXT:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_SCRAM_SHA_256:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!build_server_first_message(&client->scram_state, user->name, user->mock_auth ? NULL : user->passwd))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM server-first-message = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, client->scram_state.server_first_message);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31mib[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m AUTH_SASL_CONT,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->scram_state.server_first_message,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m strlen(client->scram_state.server_first_message));[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mfree(ibuf);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn res;[1;35m\n[0m[31mfailed:[1;35m\n[0m[31m[1;35m\t[0m[31mfree(ibuf);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
38
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mchar *ibuf;[1;35m\n[0m[31m[1;35m\t[0m[31mchar *input;[1;35m\n[0m[31m[1;35m\t[0m[31mint res;[1;35m\n[0m[31m[1;35m\t[0m[31mPgUser *user = client->login_user;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mibuf = malloc(datalen + 1);[1;35m\n[0m[31m[1;35m\t[0m[31mif (ibuf == NULL)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mmemcpy(ibuf, data, datalen);[1;35m\n[0m[31m[1;35m\t[0m[31mibuf[datalen] = '[1;35m\\[0m[31m0';[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31minput = ibuf;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM client-first-message = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, input);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!read_client_first_message(client, input,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &client->scram_state.cbind_flag,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &client->scram_state.client_first_message_bare,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &client->scram_state.client_nonce))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!user->mock_auth) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mstored secret = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, user->passwd);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mswitch (get_password_type(user->passwd)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_MD5:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mSCRAM authentication failed: user has MD5 secret[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_PLAINTEXT:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase PASSWORD_TYPE_SCRAM_SHA_256:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!build_server_first_message(&client->scram_state, user->name, user->mock_auth ? NULL : user->passwd))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM server-first-message = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, client->scram_state.server_first_message);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31mib[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m AUTH_SASL_CONT,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->scram_state.server_first_message,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m strlen(client->scram_state.server_first_message));[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mfree(ibuf);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn res;[1;35m\n[0m[31mfailed:[1;35m\n[0m[31m[1;35m\t[0m[31mfree(ibuf);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
39
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
40
|
+
[[31m[1;31m"[0m[31mstatic bool scram_client_final(PgSocket *client, uint32_t datalen, const uint8_t *data)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mchar *ibuf;[1;35m\n[0m[31m[1;35m\t[0m[31mchar *input;[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *client_final_nonce = NULL;[1;35m\n[0m[31m[1;35m\t[0m[31mchar *proof = NULL;[1;35m\n[0m[31m[1;35m\t[0m[31mchar *server_final_message;[1;35m\n[0m[31m[1;35m\t[0m[31mint res;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mibuf = malloc(datalen + 1);[1;35m\n[0m[31m[1;35m\t[0m[31mif (ibuf == NULL)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mmemcpy(ibuf, data, datalen);[1;35m\n[0m[31m[1;35m\t[0m[31mibuf[datalen] = '[1;35m\\[0m[31m0';[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31minput = ibuf;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM client-final-message = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, input);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!read_client_final_message(client, data, input,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &client_final_nonce,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &proof))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM client-final-message-without-proof = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->scram_state.client_final_message_without_proof);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!verify_final_nonce(&client->scram_state, client_final_nonce)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31minvalid SCRAM response (nonce does not match)[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!verify_client_proof(&client->scram_state, proof)[1;35m\n[0m[31m[1;35m\t[0m[31m || !client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mpassword authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mserver_final_message = build_server_final_message(&client->scram_state);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!server_final_message)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM server-final-message = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, server_final_message);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31mib[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m AUTH_SASL_FIN,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m server_final_message,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m strlen(server_final_message));[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mfree(server_final_message);[1;35m\n[0m[31m[1;35m\t[0m[31mfree(proof);[1;35m\n[0m[31m[1;35m\t[0m[31mfree(ibuf);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn res;[1;35m\n[0m[31mfailed:[1;35m\n[0m[31m[1;35m\t[0m[31mfree(proof);[1;35m\n[0m[31m[1;35m\t[0m[31mfree(ibuf);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
41
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mchar *ibuf;[1;35m\n[0m[31m[1;35m\t[0m[31mchar *input;[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *client_final_nonce = NULL;[1;35m\n[0m[31m[1;35m\t[0m[31mchar *proof = NULL;[1;35m\n[0m[31m[1;35m\t[0m[31mchar *server_final_message;[1;35m\n[0m[31m[1;35m\t[0m[31mint res;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mibuf = malloc(datalen + 1);[1;35m\n[0m[31m[1;35m\t[0m[31mif (ibuf == NULL)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mmemcpy(ibuf, data, datalen);[1;35m\n[0m[31m[1;35m\t[0m[31mibuf[datalen] = '[1;35m\\[0m[31m0';[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31minput = ibuf;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM client-final-message = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, input);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!read_client_final_message(client, data, input,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &client_final_nonce,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m &proof))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM client-final-message-without-proof = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->scram_state.client_final_message_without_proof);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!verify_final_nonce(&client->scram_state, client_final_nonce)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31minvalid SCRAM response (nonce does not match)[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (!verify_client_proof(&client->scram_state, proof)[1;35m\n[0m[31m[1;35m\t[0m[31m || !client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mpassword authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mserver_final_message = build_server_final_message(&client->scram_state);[1;35m\n[0m[31m[1;35m\t[0m[31mif (!server_final_message)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mgoto failed;[1;35m\n[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mSCRAM server-final-message = [1;35m\\[0m[31m[1;35m\"[0m[31m%s[1;35m\\[0m[31m[1;35m\"[0m[31m[1;35m\"[0m[31m, server_final_message);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mSEND_generic(res, client, 'R', [1;35m\"[0m[31mib[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m AUTH_SASL_FIN,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m server_final_message,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m strlen(server_final_message));[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mfree(server_final_message);[1;35m\n[0m[31m[1;35m\t[0m[31mfree(proof);[1;35m\n[0m[31m[1;35m\t[0m[31mfree(ibuf);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn res;[1;35m\n[0m[31mfailed:[1;35m\n[0m[31m[1;35m\t[0m[31mfree(proof);[1;35m\n[0m[31m[1;35m\t[0m[31mfree(ibuf);[1;35m\n[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
42
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
43
|
+
[[31m[1;31m"[0m[31mstatic bool handle_client_startup(PgSocket *client, PktHdr *pkt)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *passwd;[1;35m\n[0m[31m[1;35m\t[0m[31mconst uint8_t *key;[1;35m\n[0m[31m[1;35m\t[0m[31mbool ok;[1;35m\n[0m[31m[1;35m\t[0m[31mbool is_unix = pga_is_unix(&client->remote_addr);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mSBuf *sbuf = &client->sbuf;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* don't tolerate partial packets */[1;35m\n[0m[31m[1;35m\t[0m[31mif (incomplete_pkt(pkt)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mclient sent partial pkt in startup phase[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->wait_for_welcome || client->wait_for_auth) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (finish_client_login(client)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* the packet was already parsed */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msbuf_prepare_skip(sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (pkt->type) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_SSLREQ:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mC: req SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->sbuf.tls) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mSSL req inside SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client_accept_sslmode != SSLMODE_DISABLED && !is_unix) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mP: SSL ack[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_answer(&client->sbuf, [1;35m\"[0m[31mS[1;35m\"[0m[31m, 1)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to ack SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_tls_accept(&client->sbuf)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to accept SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* reject SSL attempt */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mP: nak[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_answer(&client->sbuf, [1;35m\"[0m[31mN[1;35m\"[0m[31m, 1)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to nak SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_GSSENCREQ:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* reject GSS encryption attempt */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mC: req GSS enc[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_answer(&client->sbuf, [1;35m\"[0m[31mN[1;35m\"[0m[31m, 1)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to nak GSS enc[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_STARTUP_V2:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mold V2 protocol not supported[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_STARTUP:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* require SSL except on unix socket */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client_accept_sslmode >= SSLMODE_REQUIRE && !client->sbuf.tls && !is_unix) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mSSL required[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->pool && !client->wait_for_user_conn && !client->wait_for_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mclient re-sent startup pkt[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->wait_for_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->wait_for_user = false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!finish_set_pool(client, false))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (!decide_startup_pool(client, pkt)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'p':[1;35m\t[0m[31m[1;35m\t[0m[31m/* PasswordMessage, SASLInitialResponse, or SASLResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* too early */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mclient password pkt before startup packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->client_auth_type == AUTH_SCRAM_SHA_256) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mconst char *mech;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31muint32_t length;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mconst uint8_t *data;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->scram_state.server_nonce) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* process as SASLInitialResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_string(&pkt->data, &mech))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mC: selected SASL mechanism: %s[1;35m\"[0m[31m, mech);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (strcmp(mech, [1;35m\"[0m[31mSCRAM-SHA-256[1;35m\"[0m[31m) != 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mclient selected an invalid SASL authentication mechanism[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint32be(&pkt->data, &length))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_bytes(&pkt->data, length, &data))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!scram_client_first(client, length, data)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mSASL authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* process as SASLResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mlength = mbuf_avail_for_read(&pkt->data);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_bytes(&pkt->data, length, &data))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (scram_client_final(client, length, data)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* save SCRAM keys for user */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->scram_state.adhoc && !client->db->fake) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(client->pool->user->scram_ClientKey,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->scram_state.ClientKey,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m sizeof(client->scram_state.ClientKey));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(client->pool->user->scram_ServerKey,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->scram_state.ServerKey,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m sizeof(client->scram_state.ServerKey));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->pool->user->has_scram_keys = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mfree_scram_state(&client->scram_state);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!finish_client_login(client))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mSASL authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* process as PasswordMessage */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = mbuf_get_string(&pkt->data, &passwd);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (ok) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * Don't allow an empty password; see[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * PostgreSQL recv_password_packet().[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!*passwd) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mempty password returned by client[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->client_auth_type == AUTH_PAM) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_pause(&client->sbuf)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mpause failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpam_auth_begin(client, passwd);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (check_client_passwd(client, passwd)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!finish_client_login(client))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mpassword authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_CANCEL:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (mbuf_avail_for_read(&pkt->data) == BACKENDKEY_LEN[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m && mbuf_get_bytes(&pkt->data, BACKENDKEY_LEN, &key))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(client->cancel_key, key, BACKENDKEY_LEN);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31maccept_cancel_request(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mbad cancel request[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31msbuf_prepare_skip(sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\t[0m[31mclient->request_time = get_cached_time();[1;35m\n[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
44
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mconst char *passwd;[1;35m\n[0m[31m[1;35m\t[0m[31mconst uint8_t *key;[1;35m\n[0m[31m[1;35m\t[0m[31mbool ok;[1;35m\n[0m[31m[1;35m\t[0m[31mbool is_unix = pga_is_unix(&client->remote_addr);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mSBuf *sbuf = &client->sbuf;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* don't tolerate partial packets */[1;35m\n[0m[31m[1;35m\t[0m[31mif (incomplete_pkt(pkt)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mclient sent partial pkt in startup phase[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->wait_for_welcome || client->wait_for_auth) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (finish_client_login(client)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* the packet was already parsed */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msbuf_prepare_skip(sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (pkt->type) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_SSLREQ:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mC: req SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->sbuf.tls) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mSSL req inside SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client_accept_sslmode != SSLMODE_DISABLED && !is_unix) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mP: SSL ack[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_answer(&client->sbuf, [1;35m\"[0m[31mS[1;35m\"[0m[31m, 1)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to ack SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_tls_accept(&client->sbuf)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to accept SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* reject SSL attempt */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mP: nak[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_answer(&client->sbuf, [1;35m\"[0m[31mN[1;35m\"[0m[31m, 1)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to nak SSL[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_GSSENCREQ:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* reject GSS encryption attempt */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mC: req GSS enc[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_answer(&client->sbuf, [1;35m\"[0m[31mN[1;35m\"[0m[31m, 1)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mfailed to nak GSS enc[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_STARTUP_V2:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mold V2 protocol not supported[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_STARTUP:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* require SSL except on unix socket */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client_accept_sslmode >= SSLMODE_REQUIRE && !client->sbuf.tls && !is_unix) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mSSL required[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->pool && !client->wait_for_user_conn && !client->wait_for_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mclient re-sent startup pkt[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->wait_for_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->wait_for_user = false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!finish_set_pool(client, false))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else if (!decide_startup_pool(client, pkt)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'p':[1;35m\t[0m[31m[1;35m\t[0m[31m/* PasswordMessage, SASLInitialResponse, or SASLResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* too early */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->login_user) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mclient password pkt before startup packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->client_auth_type == AUTH_SCRAM_SHA_256) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mconst char *mech;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31muint32_t length;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mconst uint8_t *data;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->scram_state.server_nonce) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* process as SASLInitialResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_string(&pkt->data, &mech))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_debug(client, [1;35m\"[0m[31mC: selected SASL mechanism: %s[1;35m\"[0m[31m, mech);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (strcmp(mech, [1;35m\"[0m[31mSCRAM-SHA-256[1;35m\"[0m[31m) != 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mclient selected an invalid SASL authentication mechanism[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_uint32be(&pkt->data, &length))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_bytes(&pkt->data, length, &data))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!scram_client_first(client, length, data)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mSASL authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* process as SASLResponse */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mlength = mbuf_avail_for_read(&pkt->data);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!mbuf_get_bytes(&pkt->data, length, &data))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (scram_client_final(client, length, data)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* save SCRAM keys for user */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!client->scram_state.adhoc && !client->db->fake) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(client->pool->user->scram_ClientKey,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->scram_state.ClientKey,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m sizeof(client->scram_state.ClientKey));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(client->pool->user->scram_ServerKey,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m client->scram_state.ServerKey,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m sizeof(client->scram_state.ServerKey));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->pool->user->has_scram_keys = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mfree_scram_state(&client->scram_state);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!finish_client_login(client))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mSASL authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* process as PasswordMessage */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mok = mbuf_get_string(&pkt->data, &passwd);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (ok) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * Don't allow an empty password; see[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * PostgreSQL recv_password_packet().[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!*passwd) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mempty password returned by client[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->client_auth_type == AUTH_PAM) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!sbuf_pause(&client->sbuf)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mpause failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mpam_auth_begin(client, passwd);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (check_client_passwd(client, passwd)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!finish_client_login(client))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mpassword authentication failed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase PKT_CANCEL:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (mbuf_avail_for_read(&pkt->data) == BACKENDKEY_LEN[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m && mbuf_get_bytes(&pkt->data, BACKENDKEY_LEN, &key))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mmemcpy(client->cancel_key, key, BACKENDKEY_LEN);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31maccept_cancel_request(client);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m} else {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mbad cancel request[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mbad packet[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31msbuf_prepare_skip(sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\t[0m[31mclient->request_time = get_cached_time();[1;35m\n[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
45
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
46
|
+
[[31m[1;31m"[0m[31mstatic bool handle_client_work(PgSocket *client, PktHdr *pkt)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mSBuf *sbuf = &client->sbuf;[1;35m\n[0m[31m[1;35m\t[0m[31mint rfq_delta = 0;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (pkt->type) {[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* one-packet queries */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'Q':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Query */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (cf_disable_pqexec) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mclient used 'Q' packet type[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mPQexec disallowed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mrfq_delta++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'F':[1;35m\t[0m[31m[1;35m\t[0m[31m/* FunctionCall */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mrfq_delta++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* request immediate response from server */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'S':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Sync */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mrfq_delta++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'H':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Flush */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* copy end markers */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'c':[1;35m\t[0m[31m[1;35m\t[0m[31m/* CopyDone(F/B) */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'f':[1;35m\t[0m[31m[1;35m\t[0m[31m/* CopyFail(F/B) */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m * extended protocol allows server (and thus pooler)[1;35m\n[0m[31m[1;35m\t[0m[31m * to buffer packets until sync or flush is sent by client[1;35m\n[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'P':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Parse */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'E':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Execute */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'C':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Close */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'B':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Bind */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'D':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Describe */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'd':[1;35m\t[0m[31m[1;35m\t[0m[31m/* CopyData(F/B) */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* client wants to go away */[1;35m\n[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31munknown pkt from client: %u/0x%x[1;35m\"[0m[31m, pkt->type, pkt->type);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31munknown pkt[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'X': /* Terminate */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mclient close request[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* update stats */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->query_start) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->pool->stats.query_count++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->query_start = get_cached_time();[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* remember timestamp of the first query in a transaction */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->xact_start) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->pool->stats.xact_count++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->xact_start = client->query_start;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->pool->db->admin)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn admin_handle_client(client, pkt);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* acquire server */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!find_server(client))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* postpone rfq change until certain that client will not be paused */[1;35m\n[0m[31m[1;35m\t[0m[31mif (rfq_delta) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->expect_rfq_count += rfq_delta;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mclient->pool->stats.client_bytes += pkt->len;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* tag the server as dirty */[1;35m\n[0m[31m[1;35m\t[0m[31mclient->link->ready = false;[1;35m\n[0m[31m[1;35m\t[0m[31mclient->link->idle_tx = false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* forward the packet */[1;35m\n[0m[31m[1;35m\t[0m[31msbuf_prepare_send(sbuf, &client->link->sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
47
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mSBuf *sbuf = &client->sbuf;[1;35m\n[0m[31m[1;35m\t[0m[31mint rfq_delta = 0;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (pkt->type) {[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* one-packet queries */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'Q':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Query */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (cf_disable_pqexec) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31mclient used 'Q' packet type[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mPQexec disallowed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mrfq_delta++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'F':[1;35m\t[0m[31m[1;35m\t[0m[31m/* FunctionCall */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mrfq_delta++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* request immediate response from server */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'S':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Sync */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mrfq_delta++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'H':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Flush */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* copy end markers */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'c':[1;35m\t[0m[31m[1;35m\t[0m[31m/* CopyDone(F/B) */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'f':[1;35m\t[0m[31m[1;35m\t[0m[31m/* CopyFail(F/B) */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m * extended protocol allows server (and thus pooler)[1;35m\n[0m[31m[1;35m\t[0m[31m * to buffer packets until sync or flush is sent by client[1;35m\n[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'P':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Parse */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'E':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Execute */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'C':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Close */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'B':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Bind */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'D':[1;35m\t[0m[31m[1;35m\t[0m[31m/* Describe */[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'd':[1;35m\t[0m[31m[1;35m\t[0m[31m/* CopyData(F/B) */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* client wants to go away */[1;35m\n[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_error(client, [1;35m\"[0m[31munknown pkt from client: %u/0x%x[1;35m\"[0m[31m, pkt->type, pkt->type);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31munknown pkt[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31mcase 'X': /* Terminate */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mclient close request[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* update stats */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->query_start) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->pool->stats.query_count++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->query_start = get_cached_time();[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* remember timestamp of the first query in a transaction */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!client->xact_start) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->pool->stats.xact_count++;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->xact_start = client->query_start;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->pool->db->admin)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn admin_handle_client(client, pkt);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* acquire server */[1;35m\n[0m[31m[1;35m\t[0m[31mif (!find_server(client))[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* postpone rfq change until certain that client will not be paused */[1;35m\n[0m[31m[1;35m\t[0m[31mif (rfq_delta) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->expect_rfq_count += rfq_delta;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mclient->pool->stats.client_bytes += pkt->len;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* tag the server as dirty */[1;35m\n[0m[31m[1;35m\t[0m[31mclient->link->ready = false;[1;35m\n[0m[31m[1;35m\t[0m[31mclient->link->idle_tx = false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* forward the packet */[1;35m\n[0m[31m[1;35m\t[0m[31msbuf_prepare_send(sbuf, &client->link->sbuf, pkt->len);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mreturn true;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
48
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m],
|
49
|
+
[[31m[1;31m"[0m[31mbool client_proto(SBuf *sbuf, SBufEvent evtype, struct MBuf *data)[1;35m\n[0m[31m{[1;35m\n[0m[31m[1;35m\t[0m[31mbool res = false;[1;35m\n[0m[31m[1;35m\t[0m[31mPgSocket *client = container_of(sbuf, PgSocket, sbuf);[1;35m\n[0m[31m[1;35m\t[0m[31mPktHdr pkt;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mAssert(!is_server_socket(client));[1;35m\n[0m[31m[1;35m\t[0m[31mAssert(client->sbuf.sock);[1;35m\n[0m[31m[1;35m\t[0m[31mAssert(client->state != CL_FREE);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* may happen if close failed */[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->state == CL_JUSTFREE)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (evtype) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_CONNECT_OK:[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_CONNECT_FAILED:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* ^ those should not happen */[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_RECV_FAILED:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * Don't log error if client disconnects right away,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * could be monitoring probe.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->state == CL_LOGIN && mbuf_avail_for_read(data) == 0)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, NULL);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mclient unexpected eof[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_SEND_FAILED:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(client->link, false, [1;35m\"[0m[31mserver connection closed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_READ:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* Wait until full packet headers is available. */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (incomplete_header(data)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mC: got partial header, trying to wait a bit[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!get_header(data, &pkt)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar hex[8*2 + 1];[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbad packet header: '%s'[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m hdr2hex(data, hex, sizeof(hex)));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mread pkt='%c' len=%u[1;35m\"[0m[31m, pkt_desc(&pkt), pkt.len);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * If we are reading an SSL request or GSSAPI[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * encryption request, we should have no data already[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * buffered at this point. If we do, it was received[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * before we performed the SSL or GSSAPI handshake, so[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * it wasn't encrypted and indeed may have been[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * injected by a man-in-the-middle. We report this[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * case to the client.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (pkt.type == PKT_SSLREQ && mbuf_avail_for_read(data) > 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mreceived unencrypted data after SSL request[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (pkt.type == PKT_GSSENCREQ && mbuf_avail_for_read(data) > 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mreceived unencrypted data after GSSAPI encryption request[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->request_time = get_cached_time();[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mswitch (client->state) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase CL_LOGIN:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = handle_client_startup(client, &pkt);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase CL_ACTIVE:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->wait_for_welcome)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = handle_client_startup(client, &pkt);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = handle_client_work(client, &pkt);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase CL_WAITING:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mfatal([1;35m\"[0m[31mwhy waiting client in client_proto()[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mfatal([1;35m\"[0m[31mbad client state: %d[1;35m\"[0m[31m, client->state);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_FLUSH:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* client is not interested in it */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_PKT_CALLBACK:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* unused ATM */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_TLS_READY:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msbuf_continue(&client->sbuf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mreturn res;[1;35m\n[0m[31m}[1;31m"[0m[31m[0m,
|
50
|
+
[31m[1;31m"[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mbool res = false;[1;35m\n[0m[31m[1;35m\t[0m[31mPgSocket *client = container_of(sbuf, PgSocket, sbuf);[1;35m\n[0m[31m[1;35m\t[0m[31mPktHdr pkt;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mAssert(!is_server_socket(client));[1;35m\n[0m[31m[1;35m\t[0m[31mAssert(client->sbuf.sock);[1;35m\n[0m[31m[1;35m\t[0m[31mAssert(client->state != CL_FREE);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m/* may happen if close failed */[1;35m\n[0m[31m[1;35m\t[0m[31mif (client->state == CL_JUSTFREE)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31mswitch (evtype) {[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_CONNECT_OK:[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_CONNECT_FAILED:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* ^ those should not happen */[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_RECV_FAILED:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * Don't log error if client disconnects right away,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * could be monitoring probe.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->state == CL_LOGIN && mbuf_avail_for_read(data) == 0)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, NULL);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, false, [1;35m\"[0m[31mclient unexpected eof[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_SEND_FAILED:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_server(client->link, false, [1;35m\"[0m[31mserver connection closed[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_READ:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* Wait until full packet headers is available. */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (incomplete_header(data)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mC: got partial header, trying to wait a bit[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (!get_header(data, &pkt)) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mchar hex[8*2 + 1];[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mbad packet header: '%s'[1;35m\"[0m[31m,[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m hdr2hex(data, hex, sizeof(hex)));[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mslog_noise(client, [1;35m\"[0m[31mread pkt='%c' len=%u[1;35m\"[0m[31m, pkt_desc(&pkt), pkt.len);[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/*[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * If we are reading an SSL request or GSSAPI[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * encryption request, we should have no data already[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * buffered at this point. If we do, it was received[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * before we performed the SSL or GSSAPI handshake, so[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * it wasn't encrypted and indeed may have been[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * injected by a man-in-the-middle. We report this[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m * case to the client.[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (pkt.type == PKT_SSLREQ && mbuf_avail_for_read(data) > 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mreceived unencrypted data after SSL request[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (pkt.type == PKT_GSSENCREQ && mbuf_avail_for_read(data) > 0) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdisconnect_client(client, true, [1;35m\"[0m[31mreceived unencrypted data after GSSAPI encryption request[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mreturn false;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mclient->request_time = get_cached_time();[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mswitch (client->state) {[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase CL_LOGIN:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = handle_client_startup(client, &pkt);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase CL_ACTIVE:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mif (client->wait_for_welcome)[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = handle_client_startup(client, &pkt);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31melse[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = handle_client_work(client, &pkt);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mcase CL_WAITING:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mfatal([1;35m\"[0m[31mwhy waiting client in client_proto()[1;35m\"[0m[31m);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mdefault:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mfatal([1;35m\"[0m[31mbad client state: %d[1;35m\"[0m[31m, client->state);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_FLUSH:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* client is not interested in it */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_PKT_CALLBACK:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31m/* unused ATM */[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31mcase SBUF_EV_TLS_READY:[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31msbuf_continue(&client->sbuf);[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mres = true;[1;35m\n[0m[31m[1;35m\t[0m[31m[1;35m\t[0m[31mbreak;[1;35m\n[0m[31m[1;35m\t[0m[31m}[1;35m\n[0m[31m[1;35m\t[0m[31mreturn res;[1;35m\n[0m[31m[1;31m"[0m[31m[0m,
|
51
|
+
[31m[1;31m"[0m[31m}[1;31m"[0m[31m[0m]]
|
data/Gemfile
CHANGED
@@ -11,16 +11,16 @@ gemspec
|
|
11
11
|
# In some circumstances custom flags are passed to gems in order
|
12
12
|
# to build appropriately. Defer to ./reinstall_pwn_gemset.sh
|
13
13
|
# to review these custom flags (e.g. pg, serialport, etc).
|
14
|
-
gem 'activesupport', '7.0.4.
|
14
|
+
gem 'activesupport', '7.0.4.2'
|
15
15
|
gem 'anemone', '0.7.2'
|
16
16
|
gem 'authy', '3.0.1'
|
17
17
|
gem 'aws-sdk', '3.1.0'
|
18
18
|
gem 'bettercap', '1.6.2'
|
19
19
|
gem 'brakeman', '5.4.0'
|
20
20
|
gem 'bson', '4.15.0'
|
21
|
-
gem 'bundler', '>=2.4.
|
21
|
+
gem 'bundler', '>=2.4.6'
|
22
22
|
gem 'bundler-audit', '0.9.1'
|
23
|
-
gem 'bunny', '2.20.
|
23
|
+
gem 'bunny', '2.20.3'
|
24
24
|
gem 'colorize', '0.8.1'
|
25
25
|
gem 'credit_card_validations', '6.0.0'
|
26
26
|
gem 'eventmachine', '1.2.7'
|
@@ -37,16 +37,16 @@ gem 'ipaddress', '0.8.3'
|
|
37
37
|
gem 'js-beautify', '0.1.8'
|
38
38
|
gem 'json', '2.6.3'
|
39
39
|
gem 'jsonpath', '1.1.2'
|
40
|
-
gem 'jwt', '2.
|
40
|
+
gem 'jwt', '2.7.0'
|
41
41
|
gem 'luhn', '1.0.2'
|
42
|
-
gem 'mail', '2.8.
|
42
|
+
gem 'mail', '2.8.1'
|
43
43
|
gem 'mongo', '2.18.2'
|
44
44
|
gem 'msfrpc-client', '1.1.2'
|
45
45
|
gem 'net-ldap', '0.17.1'
|
46
46
|
gem 'net-openvpn', '0.8.7'
|
47
47
|
gem 'net-smtp', '0.3.3'
|
48
48
|
gem 'nexpose', '7.3.0'
|
49
|
-
gem 'nokogiri', '1.14.
|
49
|
+
gem 'nokogiri', '1.14.1'
|
50
50
|
gem 'oily_png', '1.2.1'
|
51
51
|
gem 'os', '1.1.4'
|
52
52
|
gem 'packetfu', '1.1.13'
|
@@ -63,7 +63,7 @@ gem 'rex', '2.0.13'
|
|
63
63
|
gem 'rmagick', '5.1.0'
|
64
64
|
gem 'rspec', '3.12.0'
|
65
65
|
gem 'rtesseract', '3.1.2'
|
66
|
-
gem 'rubocop', '1.44.
|
66
|
+
gem 'rubocop', '1.44.1'
|
67
67
|
gem 'rubocop-rake', '0.6.0'
|
68
68
|
gem 'rubocop-rspec', '2.18.1'
|
69
69
|
gem 'ruby-audio', '1.6.1'
|
@@ -82,8 +82,7 @@ gem 'thin', '1.8.1'
|
|
82
82
|
gem 'tty-prompt', '0.23.1'
|
83
83
|
gem 'watir', '7.2.2'
|
84
84
|
gem 'waveform', '0.1.2'
|
85
|
-
gem 'webrick', '1.
|
85
|
+
gem 'webrick', '1.8.1'
|
86
86
|
gem 'whois', '5.1.0'
|
87
87
|
gem 'whois-parser', '2.0.0'
|
88
88
|
gem 'wicked_pdf', '2.6.3'
|
89
|
-
gem 'yard', '0.9.28'
|
data/README.md
CHANGED
@@ -37,7 +37,7 @@ $ rvm use ruby-3.2.0@pwn
|
|
37
37
|
$ rvm list gemsets
|
38
38
|
$ gem install --verbose pwn
|
39
39
|
$ pwn
|
40
|
-
pwn[v0.4.
|
40
|
+
pwn[v0.4.610]:001 >>> PWN.help
|
41
41
|
```
|
42
42
|
|
43
43
|
[![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
|
@@ -52,7 +52,7 @@ $ rvm use ruby-3.2.0@pwn
|
|
52
52
|
$ gem uninstall --all --executables pwn
|
53
53
|
$ gem install --verbose pwn
|
54
54
|
$ pwn
|
55
|
-
pwn[v0.4.
|
55
|
+
pwn[v0.4.610]:001 >>> PWN.help
|
56
56
|
```
|
57
57
|
|
58
58
|
|
data/bin/pwn_shodan_search
CHANGED
data/build_pwn_gem.sh
CHANGED
@@ -14,6 +14,8 @@ rvmsudo git config pull.rebase false
|
|
14
14
|
rvmsudo git pull
|
15
15
|
new_ruby_version=`cat ${pwn_root}/.ruby-version`
|
16
16
|
|
17
|
+
rvmsudo gem update --system
|
18
|
+
|
17
19
|
if [[ $old_ruby_version == $new_ruby_version ]]; then
|
18
20
|
export rvmsudo_secure_path=1
|
19
21
|
rvmsudo /bin/bash --login -c "cd ${pwn_root} && ./reinstall_pwn_gemset.sh"
|
@@ -21,7 +23,6 @@ if [[ $old_ruby_version == $new_ruby_version ]]; then
|
|
21
23
|
rvmsudo rake
|
22
24
|
rvmsudo rake install
|
23
25
|
rvmsudo rake rerdoc
|
24
|
-
rvmsudo gem update --system
|
25
26
|
rvmsudo gem rdoc --rdoc --ri --overwrite -V pwn
|
26
27
|
echo "Invoking bundle-audit Gemfile Scanner..."
|
27
28
|
rvmsudo bundle-audit
|
@@ -1,4 +1,7 @@
|
|
1
1
|
#!/bin/bash --login
|
2
|
+
export rvmsudo_secure_path=1
|
3
|
+
rvmsudo gem update --system
|
4
|
+
|
2
5
|
cat Gemfile | awk '{print $2}' | grep -E "^'.+$" | grep -v -e rubygems.org | while read gem; do
|
3
6
|
this_gem=`echo $gem | sed "s/'//g" | sed 's/\,//g'`
|
4
7
|
latest_version=`gem search -r $this_gem | grep -E "^${this_gem}\s.+$" | awk '{print $2}' | sed 's/(//g' | sed 's/)//g' | sed 's/,//g'`
|
data/lib/pwn/plugins/shodan.rb
CHANGED
@@ -63,6 +63,10 @@ module PWN
|
|
63
63
|
raise @@logger.error("Unsupported HTTP Method #{http_method} for #{self} Plugin")
|
64
64
|
end
|
65
65
|
response
|
66
|
+
rescue RestClient::TooManyRequests
|
67
|
+
print 'Too many requests. Sleeping 10s...'
|
68
|
+
sleep 10
|
69
|
+
retry
|
66
70
|
rescue StandardError => e
|
67
71
|
case e.message
|
68
72
|
when '400 Bad Request', '404 Resource Not Found'
|
data/lib/pwn/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pwn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.610
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 0day Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 7.0.4.
|
19
|
+
version: 7.0.4.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 7.0.4.
|
26
|
+
version: 7.0.4.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: anemone
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 2.4.
|
117
|
+
version: 2.4.6
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 2.4.
|
124
|
+
version: 2.4.6
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: bundler-audit
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 2.20.
|
145
|
+
version: 2.20.3
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - '='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 2.20.
|
152
|
+
version: 2.20.3
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: colorize
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -366,14 +366,14 @@ dependencies:
|
|
366
366
|
requirements:
|
367
367
|
- - '='
|
368
368
|
- !ruby/object:Gem::Version
|
369
|
-
version: 2.
|
369
|
+
version: 2.7.0
|
370
370
|
type: :runtime
|
371
371
|
prerelease: false
|
372
372
|
version_requirements: !ruby/object:Gem::Requirement
|
373
373
|
requirements:
|
374
374
|
- - '='
|
375
375
|
- !ruby/object:Gem::Version
|
376
|
-
version: 2.
|
376
|
+
version: 2.7.0
|
377
377
|
- !ruby/object:Gem::Dependency
|
378
378
|
name: luhn
|
379
379
|
requirement: !ruby/object:Gem::Requirement
|
@@ -394,14 +394,14 @@ dependencies:
|
|
394
394
|
requirements:
|
395
395
|
- - '='
|
396
396
|
- !ruby/object:Gem::Version
|
397
|
-
version: 2.8.
|
397
|
+
version: 2.8.1
|
398
398
|
type: :runtime
|
399
399
|
prerelease: false
|
400
400
|
version_requirements: !ruby/object:Gem::Requirement
|
401
401
|
requirements:
|
402
402
|
- - '='
|
403
403
|
- !ruby/object:Gem::Version
|
404
|
-
version: 2.8.
|
404
|
+
version: 2.8.1
|
405
405
|
- !ruby/object:Gem::Dependency
|
406
406
|
name: mongo
|
407
407
|
requirement: !ruby/object:Gem::Requirement
|
@@ -492,14 +492,14 @@ dependencies:
|
|
492
492
|
requirements:
|
493
493
|
- - '='
|
494
494
|
- !ruby/object:Gem::Version
|
495
|
-
version: 1.14.
|
495
|
+
version: 1.14.1
|
496
496
|
type: :runtime
|
497
497
|
prerelease: false
|
498
498
|
version_requirements: !ruby/object:Gem::Requirement
|
499
499
|
requirements:
|
500
500
|
- - '='
|
501
501
|
- !ruby/object:Gem::Version
|
502
|
-
version: 1.14.
|
502
|
+
version: 1.14.1
|
503
503
|
- !ruby/object:Gem::Dependency
|
504
504
|
name: oily_png
|
505
505
|
requirement: !ruby/object:Gem::Requirement
|
@@ -730,14 +730,14 @@ dependencies:
|
|
730
730
|
requirements:
|
731
731
|
- - '='
|
732
732
|
- !ruby/object:Gem::Version
|
733
|
-
version: 1.44.
|
733
|
+
version: 1.44.1
|
734
734
|
type: :runtime
|
735
735
|
prerelease: false
|
736
736
|
version_requirements: !ruby/object:Gem::Requirement
|
737
737
|
requirements:
|
738
738
|
- - '='
|
739
739
|
- !ruby/object:Gem::Version
|
740
|
-
version: 1.44.
|
740
|
+
version: 1.44.1
|
741
741
|
- !ruby/object:Gem::Dependency
|
742
742
|
name: rubocop-rake
|
743
743
|
requirement: !ruby/object:Gem::Requirement
|
@@ -996,14 +996,14 @@ dependencies:
|
|
996
996
|
requirements:
|
997
997
|
- - '='
|
998
998
|
- !ruby/object:Gem::Version
|
999
|
-
version: 1.
|
999
|
+
version: 1.8.1
|
1000
1000
|
type: :runtime
|
1001
1001
|
prerelease: false
|
1002
1002
|
version_requirements: !ruby/object:Gem::Requirement
|
1003
1003
|
requirements:
|
1004
1004
|
- - '='
|
1005
1005
|
- !ruby/object:Gem::Version
|
1006
|
-
version: 1.
|
1006
|
+
version: 1.8.1
|
1007
1007
|
- !ruby/object:Gem::Dependency
|
1008
1008
|
name: whois
|
1009
1009
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1046,20 +1046,6 @@ dependencies:
|
|
1046
1046
|
- - '='
|
1047
1047
|
- !ruby/object:Gem::Version
|
1048
1048
|
version: 2.6.3
|
1049
|
-
- !ruby/object:Gem::Dependency
|
1050
|
-
name: yard
|
1051
|
-
requirement: !ruby/object:Gem::Requirement
|
1052
|
-
requirements:
|
1053
|
-
- - '='
|
1054
|
-
- !ruby/object:Gem::Version
|
1055
|
-
version: 0.9.28
|
1056
|
-
type: :runtime
|
1057
|
-
prerelease: false
|
1058
|
-
version_requirements: !ruby/object:Gem::Requirement
|
1059
|
-
requirements:
|
1060
|
-
- - '='
|
1061
|
-
- !ruby/object:Gem::Version
|
1062
|
-
version: 0.9.28
|
1063
1049
|
description: https://github.com/0dayinc/pwn/README.md
|
1064
1050
|
email:
|
1065
1051
|
- request.pentest@0dayinc.com
|
@@ -1113,6 +1099,7 @@ executables:
|
|
1113
1099
|
extensions: []
|
1114
1100
|
extra_rdoc_files: []
|
1115
1101
|
files:
|
1102
|
+
- ".each do |bytes_matched|"
|
1116
1103
|
- ".github/FUNDING.yml"
|
1117
1104
|
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
1118
1105
|
- ".gitignore"
|
@@ -2078,7 +2065,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
2078
2065
|
- !ruby/object:Gem::Version
|
2079
2066
|
version: '0'
|
2080
2067
|
requirements: []
|
2081
|
-
rubygems_version: 3.4.
|
2068
|
+
rubygems_version: 3.4.6
|
2082
2069
|
signing_key:
|
2083
2070
|
specification_version: 4
|
2084
2071
|
summary: Automated Security Testing for CI/CD Pipelines & Beyond
|