pwn 0.4.633 → 0.4.634
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/README.md +2 -2
- data/lib/pwn/version.rb +1 -1
- metadata +1 -2
- data/.each do |bytes_matched| +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fb832accac7268a584655b8dba3fb618f58cc8fd7ea9151897c1a164a3d0c23
|
4
|
+
data.tar.gz: d87a84d5411d8ab60f526f47a7e8f915358fa7528fc5a9ab741db2d00d8a3744
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f59ad00b51892108357b9b6daa0a13c4eef91b1bb31e95d0ab11a2fa31baaee93a83b8415b13c52cdfd40f3edd0649eb73745be549ae008f66e0187a415ff9e8
|
7
|
+
data.tar.gz: 86b721306e332d7a3ac2feef0bd583ef88806c86ce7278c5b9ce3a106eb74733cecdf50c73b2d40b60af1f32226246a30bc6e70d5d7d51d26be968679084bc0d
|
data/README.md
CHANGED
@@ -37,7 +37,7 @@ $ rvm use ruby-3.2.2@pwn
|
|
37
37
|
$ rvm list gemsets
|
38
38
|
$ gem install --verbose pwn
|
39
39
|
$ pwn
|
40
|
-
pwn[v0.4.
|
40
|
+
pwn[v0.4.634]:001 >>> PWN.help
|
41
41
|
```
|
42
42
|
|
43
43
|
[](https://youtu.be/G7iLUY4FzsI)
|
@@ -52,7 +52,7 @@ $ rvm use ruby-3.2.2@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.634]:001 >>> PWN.help
|
56
56
|
```
|
57
57
|
|
58
58
|
|
data/lib/pwn/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.634
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 0day Inc.
|
@@ -1128,7 +1128,6 @@ executables:
|
|
1128
1128
|
extensions: []
|
1129
1129
|
extra_rdoc_files: []
|
1130
1130
|
files:
|
1131
|
-
- ".each do |bytes_matched|"
|
1132
1131
|
- ".github/FUNDING.yml"
|
1133
1132
|
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
1134
1133
|
- ".gitignore"
|
data/.each do |bytes_matched|
DELETED
@@ -1,51 +0,0 @@
|
|
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]]
|