pwn 0.4.608 → 0.4.610
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/open_ai.rb +3 -3
- 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
|
[](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/open_ai.rb
CHANGED
@@ -96,7 +96,7 @@ module PWN
|
|
96
96
|
# request: 'required - message to ChatGPT'
|
97
97
|
# model: 'optional - model to use for text generation (defaults to text-davinci-003)',
|
98
98
|
# temp: 'optional - creative response float (deafults to 0)',
|
99
|
-
# max_tokens: 'optional - integer (defaults to
|
99
|
+
# max_tokens: 'optional - integer (defaults to 4_097 - request.length || 300)'
|
100
100
|
# )
|
101
101
|
|
102
102
|
public_class_method def self.chat_gpt(opts = {})
|
@@ -108,7 +108,7 @@ module PWN
|
|
108
108
|
temp = 0 unless temp.positive?
|
109
109
|
max_tokens = opts[:max_tokens].to_i
|
110
110
|
max_tokens = 4_097 - request.to_s.length
|
111
|
-
max_tokens =
|
111
|
+
max_tokens = 300 unless max_tokens.positive?
|
112
112
|
|
113
113
|
rest_call = 'completions'
|
114
114
|
|
@@ -184,7 +184,7 @@ module PWN
|
|
184
184
|
request: 'required - message to ChatGPT',
|
185
185
|
model: 'optional - model to use for text generation (defaults to text-davinci-003)',
|
186
186
|
temp: 'optional - creative response float (deafults to 0)',
|
187
|
-
max_tokens: 'optional - integer (deafults to
|
187
|
+
max_tokens: 'optional - integer (deafults to 4_097 - request.length || 300)'
|
188
188
|
)
|
189
189
|
|
190
190
|
response = #{self}.img_gen(
|
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
|