pwn 0.4.633 → 0.4.634
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
|
@@ -52,7 +52,7 @@ $ rvm use ruby-3.2.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]]
|