continuous-integration/drone/pr Build is passing
Регистрация остаётся закрытой. Администраторы — MAIL_ADMINS (по умолчанию первый ящик); роль не в базе, укравший ящик себя админом не сделает. API /api/admin/mailboxes, сгенерированный пароль — один раз в ответе, в лог не пишется. Настройки → MAILBOXES (видно только администратору). Тесты: MailboxAdminControllerTest (5), всего 73. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 lines
1.3 KiB
Java
37 lines
1.3 KiB
Java
package com.mailserver.config;
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.Locale;
|
|
import java.util.Set;
|
|
import java.util.stream.Collectors;
|
|
|
|
/**
|
|
* Who manages mailboxes (Settings → Mailboxes): {@code mailserver.admins} (comma separated), by default the first
|
|
* mailbox — {@code mailserver.admin.email}, or admin@<first domain>. No role in the database: the list lives in
|
|
* the configuration, so a stolen mailbox can not make itself an administrator.
|
|
*/
|
|
@Component
|
|
public class MailAdmins {
|
|
|
|
private final Set<String> admins;
|
|
|
|
public MailAdmins(@Value("${mailserver.admins:}") String admins,
|
|
@Value("${mailserver.admin.email:}") String firstMailbox,
|
|
MailDomains domains) {
|
|
String list = !admins.isBlank() ? admins
|
|
: !firstMailbox.isBlank() ? firstMailbox
|
|
: "admin@" + domains.domains().iterator().next();
|
|
this.admins = Arrays.stream(list.split(","))
|
|
.map(a -> a.trim().toLowerCase(Locale.ROOT))
|
|
.filter(a -> !a.isEmpty())
|
|
.collect(Collectors.toUnmodifiableSet());
|
|
}
|
|
|
|
public boolean isAdmin(String email) {
|
|
return email != null && admins.contains(email.toLowerCase(Locale.ROOT));
|
|
}
|
|
}
|