|
25 | 25 |
|
26 | 26 | import java.net.UnknownHostException;
|
27 | 27 | import java.util.Arrays;
|
| 28 | +import java.util.List; |
28 | 29 |
|
29 | 30 | import static com.mongodb.ReadPreference.primary;
|
30 | 31 | import static com.mongodb.ReadPreference.primaryPreferred;
|
|
37 | 38 | import static org.hamcrest.CoreMatchers.sameInstance;
|
38 | 39 | import static org.junit.Assert.assertEquals;
|
39 | 40 | import static org.junit.Assert.assertFalse;
|
| 41 | +import static org.junit.Assert.assertNotNull; |
| 42 | +import static org.junit.Assert.assertNull; |
40 | 43 | import static org.junit.Assert.assertThat;
|
41 | 44 | import static org.junit.Assert.assertTrue;
|
42 | 45 | import static org.junit.Assume.assumeFalse;
|
@@ -461,6 +464,100 @@ public void shouldNotThrowAnExceptionOnCommandFailure() {
|
461 | 464 | assertThat(commandResult, hasFields(new String[]{"serverUsed", "ok", "errmsg"}));
|
462 | 465 | }
|
463 | 466 |
|
| 467 | + @Test |
| 468 | + public void shouldAddReadOnlyUser() { |
| 469 | + String userName = "newUser"; |
| 470 | + String pwd = "pwd"; |
| 471 | + getDatabase().addUser(userName, pwd.toCharArray(), true); |
| 472 | + try { |
| 473 | + assertCorrectUserExists(userName, pwd, true, getDatabase()); |
| 474 | + } finally { |
| 475 | + getDatabase().removeUser(userName); |
| 476 | + } |
| 477 | + } |
| 478 | + |
| 479 | + @Test |
| 480 | + public void shouldAddReadOnlyAdminUser() { |
| 481 | + String userName = "newUser"; |
| 482 | + String pwd = "pwd"; |
| 483 | + DB adminDB = getDatabase().getSisterDB("admin"); |
| 484 | + adminDB.addUser(userName, pwd.toCharArray(), true); |
| 485 | + try { |
| 486 | + assertCorrectUserExists(userName, pwd, true, adminDB); |
| 487 | + } finally { |
| 488 | + adminDB.removeUser(userName); |
| 489 | + } |
| 490 | + } |
| 491 | + |
| 492 | + @Test |
| 493 | + public void shouldAddReadWriteUser() { |
| 494 | + String userName = "newUser"; |
| 495 | + String pwd = "pwd"; |
| 496 | + getDatabase().addUser(userName, pwd.toCharArray(), false); |
| 497 | + try { |
| 498 | + assertCorrectUserExists(userName, pwd, false, getDatabase()); |
| 499 | + } finally { |
| 500 | + getDatabase().removeUser(userName); |
| 501 | + } |
| 502 | + } |
| 503 | + |
| 504 | + @Test |
| 505 | + public void shouldAddReadWriteAdminUser() { |
| 506 | + String userName = "newUser"; |
| 507 | + String pwd = "pwd"; |
| 508 | + DB adminDB = getDatabase().getSisterDB("admin"); |
| 509 | + adminDB.addUser(userName, pwd.toCharArray(), false); |
| 510 | + try { |
| 511 | + assertCorrectUserExists(userName, pwd, false, adminDB); |
| 512 | + } finally { |
| 513 | + adminDB.removeUser(userName); |
| 514 | + } |
| 515 | + } |
| 516 | + |
| 517 | + @Test |
| 518 | + public void shouldRemoveUser() { |
| 519 | + String userName = "newUser"; |
| 520 | + getDatabase().addUser(userName, "pwd".toCharArray(), true); |
| 521 | + getDatabase().removeUser(userName); |
| 522 | + assertThatUserIsRemoved(userName, getDatabase()); |
| 523 | + } |
| 524 | + |
| 525 | + private void assertThatUserIsRemoved(final String userName, final DB database) { |
| 526 | + if (serverIsAtLeastVersion(2.6)) { |
| 527 | + CommandResult usersInfo = database.command(new BasicDBObject("usersInfo", userName)); |
| 528 | + assertEquals(0, ((List) usersInfo.get("users")).size()); |
| 529 | + } |
| 530 | + else { |
| 531 | + assertNull(database.getCollection("system.users").findOne(new BasicDBObject("user", userName))); |
| 532 | + } |
| 533 | + } |
| 534 | + |
| 535 | + |
| 536 | + private void assertCorrectUserExists(final String userName, final String password, final boolean isReadOnly, final DB database) { |
| 537 | + if (serverIsAtLeastVersion(2.6)) { |
| 538 | + CommandResult usersInfo = database.command(new BasicDBObject("usersInfo", userName)); |
| 539 | + DBObject user = (DBObject) ((List) usersInfo.get("users")).get(0); |
| 540 | + assertEquals(userName, user.get("user")); |
| 541 | + assertEquals(database.getName(), user.get("db")); |
| 542 | + assertEquals(getExpectedRole(isReadOnly, database), ((DBObject) ((List) user.get("roles")).get(0)).get("role")); |
| 543 | + } |
| 544 | + else { |
| 545 | + assertEquals(new BasicDBObject("user", userName).append("readOnly", isReadOnly) |
| 546 | + .append("pwd", getDatabase()._hash(userName, password.toCharArray())), |
| 547 | + database.getCollection("system.users").findOne(new BasicDBObject("user", userName), |
| 548 | + new BasicDBObject("_id", 0))); |
| 549 | + } |
| 550 | + } |
| 551 | + |
| 552 | + private String getExpectedRole(final boolean isReadOnly, final DB database) { |
| 553 | + if (database.getName().equals("admin")) { |
| 554 | + return isReadOnly ? "readAnyDatabase" : "root"; |
| 555 | + } else { |
| 556 | + return isReadOnly ? "read" : "dbOwner"; |
| 557 | + } |
| 558 | + } |
| 559 | + |
| 560 | + |
464 | 561 | private DB getReplicaSetDB() throws UnknownHostException {
|
465 | 562 | Mongo mongo = new MongoClient(Arrays.asList(new ServerAddress("127.0.0.1"), new ServerAddress("127.0.0.1", 27018)));
|
466 | 563 | return mongo.getDB("database-" + System.nanoTime());
|
|
0 commit comments