@@ -176,18 +176,58 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt)
176
176
177
177
if (strcmp (defel -> defname , "password" ) == 0 ||
178
178
strcmp (defel -> defname , "encryptedPassword" ) == 0 ||
179
- strcmp (defel -> defname , "unencryptedPassword" ) == 0 )
179
+ strcmp (defel -> defname , "unencryptedPassword" ) == 0 ||
180
+ strcmp (defel -> defname , "methodPassword" ) == 0 )
180
181
{
181
182
if (dpassword )
182
183
ereport (ERROR ,
183
184
(errcode (ERRCODE_SYNTAX_ERROR ),
184
185
errmsg ("conflicting or redundant options" ),
185
186
parser_errposition (pstate , defel -> location )));
186
187
dpassword = defel ;
187
- if (strcmp (defel -> defname , "encryptedPassword" ) == 0 )
188
+ if (strcmp (defel -> defname , "password" ) == 0 )
189
+ {
190
+ /*
191
+ * Password type is enforced with GUC password_encryption
192
+ * here.
193
+ */
194
+ if (dpassword && dpassword -> arg )
195
+ password = strVal (dpassword -> arg );
196
+ }
197
+ else if (strcmp (defel -> defname , "encryptedPassword" ) == 0 )
198
+ {
188
199
password_type = PASSWORD_TYPE_MD5 ;
200
+ if (dpassword && dpassword -> arg )
201
+ password = strVal (dpassword -> arg );
202
+ }
189
203
else if (strcmp (defel -> defname , "unencryptedPassword" ) == 0 )
204
+ {
190
205
password_type = PASSWORD_TYPE_PLAINTEXT ;
206
+ if (dpassword && dpassword -> arg )
207
+ password = strVal (dpassword -> arg );
208
+ }
209
+ else if (strcmp (defel -> defname , "methodPassword" ) == 0 )
210
+ {
211
+ /*
212
+ * This is a list of two elements, the password is first and
213
+ * then there is the method wanted by caller.
214
+ */
215
+ if (dpassword && dpassword -> arg )
216
+ {
217
+ char * method = strVal (lsecond ((List * ) dpassword -> arg ));
218
+
219
+ password = strVal (linitial ((List * ) dpassword -> arg ));
220
+
221
+ if (strcmp (method , "md5" ) == 0 )
222
+ password_type = PASSWORD_TYPE_MD5 ;
223
+ else if (strcmp (method , "plain" ) == 0 )
224
+ password_type = PASSWORD_TYPE_PLAINTEXT ;
225
+ else
226
+ ereport (ERROR ,
227
+ (errcode (ERRCODE_SYNTAX_ERROR ),
228
+ errmsg ("unsupported password method %s" , method )));
229
+ }
230
+ }
191
231
}
192
232
else if (strcmp (defel -> defname , "sysid" ) == 0 )
193
233
{
@@ -307,8 +347,6 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt)
307
347
defel -> defname );
308
348
}
309
349
310
- if (dpassword && dpassword -> arg )
311
- password = strVal (dpassword -> arg );
312
350
if (dissuper )
313
351
issuper = intVal (dissuper -> arg ) != 0 ;
314
352
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 , "methodPassword" ) == 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 , "methodPassword" ) == 0 )
653
+ {
654
+ /*
655
+ * This is a list of two elements, the password is first and
656
+ * then there is the method wanted by caller.
657
+ */
658
+ if (dpassword && dpassword -> arg )
659
+ {
660
+ char * method = strVal (lsecond ((List * ) dpassword -> arg ));
661
+
662
+ if (strcmp (method , "md5" ) == 0 )
663
+ password_type = PASSWORD_TYPE_MD5 ;
664
+ else if (strcmp (method , "plain" ) == 0 )
665
+ password_type = PASSWORD_TYPE_PLAINTEXT ;
666
+ else
667
+ ereport (ERROR ,
668
+ (errcode (ERRCODE_SYNTAX_ERROR ),
669
+ errmsg ("unsupported password method %s" , method )));
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