* ParsePrivilegesArray parses the privileges array from the createRole command. */
| 426 | * ParsePrivilegesArray parses the privileges array from the createRole command. |
| 427 | */ |
| 428 | static void |
| 429 | ParsePrivilegesArray(bson_iter_t *privilegesIter, CreateRoleSpec *createRoleSpec) |
| 430 | { |
| 431 | if (bson_iter_type(privilegesIter) != BSON_TYPE_ARRAY) |
| 432 | { |
| 433 | ereport(ERROR, (errcode(ERRCODE_DOCUMENTDB_BADVALUE), |
| 434 | errmsg( |
| 435 | "'privileges' must be an array."))); |
| 436 | } |
| 437 | |
| 438 | bson_iter_t privilegesArrayIter; |
| 439 | bson_iter_recurse(privilegesIter, &privilegesArrayIter); |
| 440 | |
| 441 | while (bson_iter_next(&privilegesArrayIter)) |
| 442 | { |
| 443 | if (bson_iter_type(&privilegesArrayIter) != BSON_TYPE_DOCUMENT) |
| 444 | { |
| 445 | ereport(ERROR, (errcode(ERRCODE_DOCUMENTDB_BADVALUE), |
| 446 | errmsg( |
| 447 | "Each privilege entry must be a document."))); |
| 448 | } |
| 449 | |
| 450 | bson_iter_t privilegeDocIter; |
| 451 | bson_iter_recurse(&privilegesArrayIter, &privilegeDocIter); |
| 452 | |
| 453 | StringView dbName = { 0 }; |
| 454 | StringView collectionName = { 0 }; |
| 455 | HTAB *actions = NULL; |
| 456 | bool resourceFound = false; |
| 457 | bool actionsFound = false; |
| 458 | |
| 459 | while (bson_iter_next(&privilegeDocIter)) |
| 460 | { |
| 461 | const char *privilegeKey = bson_iter_key(&privilegeDocIter); |
| 462 | |
| 463 | if (strcmp(privilegeKey, "resource") == 0) |
| 464 | { |
| 465 | resourceFound = true; |
| 466 | ParseResourceDocument(&privilegeDocIter, &dbName, &collectionName); |
| 467 | } |
| 468 | else if (strcmp(privilegeKey, "actions") == 0) |
| 469 | { |
| 470 | actionsFound = true; |
| 471 | actions = ParseActionsArray(&privilegeDocIter); |
| 472 | } |
| 473 | else |
| 474 | { |
| 475 | ereport(ERROR, (errcode(ERRCODE_DOCUMENTDB_BADVALUE), |
| 476 | errmsg( |
| 477 | "The specified field '%s' is not supported in privilege.", |
| 478 | privilegeKey))); |
| 479 | } |
| 480 | } |
| 481 | |
| 482 | if (!resourceFound) |
| 483 | { |
| 484 | ereport(ERROR, (errcode(ERRCODE_DOCUMENTDB_BADVALUE), |
| 485 | errmsg( |
no test coverage detected