Администраторы почты из Jambotron: каждый ADMIN управляет ящиками
continuous-integration/drone/pr Build is passing
continuous-integration/drone/pr Build is passing
users.is_admin (V8) — ставит только служебное API (PUT /api/service/accounts с "admin"), ящик сам себя администратором не сделает. MailAdmins: список из конфигурации + выданные Jambotron (загружаются при старте, меняются сразу). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,7 @@ class ServiceControllerTest {
|
||||
private final com.mailserver.service.MailboxAccess access = mock(com.mailserver.service.MailboxAccess.class);
|
||||
private final MailDirectory directory = new MailDirectory(users, lists, domains, access);
|
||||
private final User existing = user(7L, "jambotronpw@jambocheck.com");
|
||||
private final com.mailserver.config.MailAdmins admins = new com.mailserver.config.MailAdmins("", "", domains);
|
||||
|
||||
ServiceControllerTest() {
|
||||
when(users.findOptional(anyString())).thenReturn(Mono.empty());
|
||||
@@ -49,10 +50,30 @@ class ServiceControllerTest {
|
||||
return Mono.just(u);
|
||||
});
|
||||
when(users.setPassword(any(), anyString())).thenAnswer(i -> Mono.just((User) i.getArgument(0)));
|
||||
when(users.setAdmin(any(), any(Boolean.class))).thenAnswer(i -> {
|
||||
User u = i.getArgument(0);
|
||||
u.setAdmin(i.getArgument(1));
|
||||
return Mono.just(u);
|
||||
});
|
||||
}
|
||||
|
||||
// Jambotron ADMIN → mail administrator (Settings → MAILBOXES), and back
|
||||
@Test
|
||||
void jambotronMakesAMailboxAdministratorAndTakesItBack() {
|
||||
assertThat(admins.isAdmin("jambotronpw@jambocheck.com")).isFalse();
|
||||
var made = api("s3cret-token").saveAccount(AUTH, "jambotronpw@jambocheck.com",
|
||||
Mono.just(new ServiceController.AccountRequest(null, true, true))).block();
|
||||
assertThat(made.getBody().account().admin()).isTrue();
|
||||
assertThat(admins.isAdmin("JambotronPW@jambocheck.com")).isTrue();
|
||||
|
||||
api("s3cret-token").saveAccount(AUTH, "jambotronpw@jambocheck.com",
|
||||
Mono.just(new ServiceController.AccountRequest(null, true, false))).block();
|
||||
assertThat(admins.isAdmin("jambotronpw@jambocheck.com")).isFalse();
|
||||
assertThat(admins.isAdmin("admin@jambocheck.com")).isTrue();
|
||||
}
|
||||
|
||||
private ServiceController api(String token) {
|
||||
return new ServiceController(token, users, lists, directory, access);
|
||||
return new ServiceController(token, users, lists, directory, access, admins);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -67,12 +88,12 @@ class ServiceControllerTest {
|
||||
@Test
|
||||
void newAccountGetsPasswordOnceExistingDoesNot() {
|
||||
var created = api("s3cret-token").saveAccount(AUTH, "moder@jambocheck.com",
|
||||
Mono.just(new ServiceController.AccountRequest("Moder", true))).block();
|
||||
Mono.just(new ServiceController.AccountRequest("Moder", true, null))).block();
|
||||
assertThat(created.getStatusCode().value()).isEqualTo(201);
|
||||
assertThat(created.getBody().password()).hasSizeGreaterThan(20);
|
||||
|
||||
var again = api("s3cret-token").saveAccount(AUTH, "jambotronpw@jambocheck.com",
|
||||
Mono.just(new ServiceController.AccountRequest(null, null))).block();
|
||||
Mono.just(new ServiceController.AccountRequest(null, null, null))).block();
|
||||
assertThat(again.getStatusCode().value()).isEqualTo(200);
|
||||
assertThat(again.getBody().password()).isNull();
|
||||
verify(lists, never()).removeEverywhere(anyLong());
|
||||
@@ -83,7 +104,7 @@ class ServiceControllerTest {
|
||||
@Test
|
||||
void switchedOffLeavesEveryList() {
|
||||
var off = api("s3cret-token").saveAccount(AUTH, "jambotronpw@jambocheck.com",
|
||||
Mono.just(new ServiceController.AccountRequest(null, false))).block();
|
||||
Mono.just(new ServiceController.AccountRequest(null, false, null))).block();
|
||||
assertThat(off.getBody().account().active()).isFalse();
|
||||
verify(lists).removeEverywhere(7L);
|
||||
verify(access).removeEverywhere(7L);
|
||||
|
||||
Reference in New Issue
Block a user