|
32 | 32 | #endif
|
33 | 33 |
|
34 | 34 | #include "pgapifunc.h"
|
| 35 | +#include "md5.h" |
35 | 36 |
|
36 | 37 | #define STMT_INCREMENT 16 /* how many statement holders to allocate
|
37 | 38 | * at a time */
|
@@ -508,6 +509,39 @@ CC_set_translation(ConnectionClass *self)
|
508 | 509 | return TRUE;
|
509 | 510 | }
|
510 | 511 |
|
| 512 | +static int |
| 513 | +md5_auth_send(ConnectionClass *self, const char *salt) |
| 514 | +{ |
| 515 | + char *pwd1 = NULL, *pwd2 = NULL; |
| 516 | + ConnInfo *ci = &(self->connInfo); |
| 517 | + SocketClass *sock = self->sock; |
| 518 | + |
| 519 | +mylog("MD5 user=%s password=%s\n", ci->username, ci->password); |
| 520 | + if (!(pwd1 = malloc(MD5_PASSWD_LEN + 1))) |
| 521 | + return 1; |
| 522 | + if (!EncryptMD5(ci->password, ci->username, strlen(ci->username), pwd1)) |
| 523 | + { |
| 524 | + free(pwd1); |
| 525 | + return 1; |
| 526 | + } |
| 527 | + if (!(pwd2 = malloc(MD5_PASSWD_LEN + 1))) |
| 528 | + { |
| 529 | + free(pwd1); |
| 530 | + return 1; |
| 531 | + } |
| 532 | + if (!EncryptMD5(pwd1 + strlen("md5"), salt, 4, pwd2)) |
| 533 | + { |
| 534 | + free(pwd2); |
| 535 | + free(pwd1); |
| 536 | + return 1; |
| 537 | + } |
| 538 | + free(pwd1); |
| 539 | + SOCK_put_int(sock, 4 + strlen(pwd2) + 1, 4); |
| 540 | + SOCK_put_n_char(sock, pwd2, strlen(pwd2) + 1); |
| 541 | + SOCK_flush_output(sock); |
| 542 | + free(pwd2); |
| 543 | + return 0; |
| 544 | +} |
511 | 545 |
|
512 | 546 | char
|
513 | 547 | CC_connect(ConnectionClass *self, char do_password)
|
@@ -763,10 +797,24 @@ CC_connect(ConnectionClass *self, char do_password)
|
763 | 797 | break;
|
764 | 798 |
|
765 | 799 | case AUTH_REQ_CRYPT:
|
766 |
| - case AUTH_REQ_MD5: |
767 | 800 | self->errormsg = "Password crypt authentication not supported";
|
768 | 801 | self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED;
|
769 | 802 | return 0;
|
| 803 | + case AUTH_REQ_MD5: |
| 804 | + mylog("in AUTH_REQ_MD5\n"); |
| 805 | + if (ci->password[0] == '\0') |
| 806 | + { |
| 807 | + self->errornumber = CONNECTION_NEED_PASSWORD; |
| 808 | + self->errormsg = "A password is required for this connection."; |
| 809 | + return -1; /* need password */ |
| 810 | + } |
| 811 | + if (md5_auth_send(self, salt)) |
| 812 | + { |
| 813 | + self->errormsg = "md5 hashing failed"; |
| 814 | + self->errornumber = CONN_INVALID_AUTHENTICATION; |
| 815 | + return 0; |
| 816 | + } |
| 817 | + break; |
770 | 818 |
|
771 | 819 | case AUTH_REQ_SCM_CREDS:
|
772 | 820 | self->errormsg = "Unix socket credential authentication not supported";
|
|
0 commit comments