@@ -175,18 +175,58 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt)
175
175
176
176
if (strcmp (defel -> defname , "password" ) == 0 ||
177
177
strcmp (defel -> defname , "encryptedPassword" ) == 0 ||
178
- strcmp (defel -> defname , "unencryptedPassword" ) == 0 )
178
+ strcmp (defel -> defname , "unencryptedPassword" ) == 0 ||
179
+ strcmp (defel -> defname , "protocolPassword" ) == 0 )
179
180
{
180
181
if (dpassword )
181
182
ereport (ERROR ,
182
183
(errcode (ERRCODE_SYNTAX_ERROR ),
183
184
errmsg ("conflicting or redundant options" ),
184
185
parser_errposition (pstate , defel -> location )));
185
186
dpassword = defel ;
186
- if (strcmp (defel -> defname , "encryptedPassword" ) == 0 )
187
+ if (strcmp (defel -> defname , "password" ) == 0 )
188
+ {
189
+ /*
190
+ * Password type is enforced with GUC password_encryption
191
+ * here.
192
+ */
193
+ if (dpassword && dpassword -> arg )
194
+ password = strVal (dpassword -> arg );
195
+ }
196
+ else if (strcmp (defel -> defname , "encryptedPassword" ) == 0 )
197
+ {
187
198
password_type = PASSWORD_TYPE_MD5 ;
199
+ if (dpassword && dpassword -> arg )
200
+ password = strVal (dpassword -> arg );
201
+ }
188
202
else if (strcmp (defel -> defname , "unencryptedPassword" ) == 0 )
203
+ {
189
204
password_type = PASSWORD_TYPE_PLAINTEXT ;
205
+ if (dpassword && dpassword -> arg )
206
+ password = strVal (dpassword -> arg );
207
+ }
208
+ else if (strcmp (defel -> defname , "protocolPassword" ) == 0 )
209
+ {
210
+ /*
211
+ * This is a list of two elements, the password is first and
212
+ * then there is the protocol wanted by caller.
213
+ */
214
+ if (dpassword && dpassword -> arg )
215
+ {
216
+ char * protocol = strVal (lsecond ((List * ) dpassword -> arg ));
217
+
218
+ password = strVal (linitial ((List * ) dpassword -> arg ));
219
+
220
+ if (strcmp (protocol , "md5" ) == 0 )
221
+ password_type = PASSWORD_TYPE_MD5 ;
222
+ else if (strcmp (protocol , "plain" ) == 0 )
223
+ password_type = PASSWORD_TYPE_PLAINTEXT ;
224
+ else
225
+ ereport (ERROR ,
226
+ (errcode (ERRCODE_SYNTAX_ERROR ),
227
+ errmsg ("unsupported password protocol %s" , protocol )));
228
+ }
229
+ }
190
230
}
191
231
else if (strcmp (defel -> defname , "sysid" ) == 0 )
192
232
{
@@ -306,8 +346,6 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt)
306
346
defel -> defname );
307
347
}
308
348
309
- if (dpassword && dpassword -> arg )
310
- password = strVal (dpassword -> arg );
311
349
if (dissuper )
312
350
issuper = intVal (dissuper -> arg ) != 0 ;
313
351
if (dinherit )
@@ -582,17 +620,57 @@ AlterRole(AlterRoleStmt *stmt)
582
620
583
621
if (strcmp (defel -> defname , "password" ) == 0 ||
584
622
strcmp (defel -> defname , "encryptedPassword" ) == 0 ||
623
+ strcmp (defel -> defname , "protocolPassword" ) == 0 ||
585
624
strcmp (defel -> defname , "unencryptedPassword" ) == 0 )
586
625
{
587
626
if (dpassword )
588
627
ereport (ERROR ,
589
628
(errcode (ERRCODE_SYNTAX_ERROR ),
590
629
errmsg ("conflicting or redundant options" )));
591
630
dpassword = defel ;
592
- if (strcmp (defel -> defname , "encryptedPassword" ) == 0 )
631
+ if (strcmp (defel -> defname , "password" ) == 0 )
632
+ {
633
+ /*
634
+ * Password type is enforced with GUC password_encryption
635
+ * here.
636
+ */
637
+ if (dpassword && dpassword -> arg )
638
+ password = strVal (dpassword -> arg );
639
+ }
640
+ else if (strcmp (defel -> defname , "encryptedPassword" ) == 0 )
641
+ {
593
642
password_type = PASSWORD_TYPE_MD5 ;
643
+ if (dpassword && dpassword -> arg )
644
+ password = strVal (dpassword -> arg );
645
+ }
594
646
else if (strcmp (defel -> defname , "unencryptedPassword" ) == 0 )
647
+ {
595
648
password_type = PASSWORD_TYPE_PLAINTEXT ;
649
+ if (dpassword && dpassword -> arg )
650
+ password = strVal (dpassword -> arg );
651
+ }
652
+ else if (strcmp (defel -> defname , "protocolPassword" ) == 0 )
653
+ {
654
+ /*
655
+ * This is a list of two elements, the password is first and
656
+ * then there is the protocol wanted by caller.
657
+ */
658
+ if (dpassword && dpassword -> arg )
659
+ {
660
+ char * protocol = strVal (lsecond ((List * ) dpassword -> arg ));
661
+
662
+ if (strcmp (protocol , "md5" ) == 0 )
663
+ password_type = PASSWORD_TYPE_MD5 ;
664
+ else if (strcmp (protocol , "plain" ) == 0 )
665
+ password_type = PASSWORD_TYPE_PLAINTEXT ;
666
+ else
667
+ ereport (ERROR ,
668
+ (errcode (ERRCODE_SYNTAX_ERROR ),
669
+ errmsg ("unsupported password protocol %s" , protocol )));
670
+
671
+ password = strVal (linitial ((List * ) dpassword -> arg ));
672
+ }
673
+ }
596
674
}
597
675
else if (strcmp (defel -> defname , "superuser" ) == 0 )
598
676
{
@@ -680,8 +758,6 @@ AlterRole(AlterRoleStmt *stmt)
680
758
defel -> defname );
681
759
}
682
760
683
- if (dpassword && dpassword -> arg )
684
- password = strVal (dpassword -> arg );
685
761
if (dissuper )
686
762
issuper = intVal (dissuper -> arg );
687
763
if (dinherit )
0 commit comments