package com.mailserver.config; import com.mailserver.repository.UserRepository; import com.mailserver.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.security.SecureRandom; import java.util.Base64; /** * First mailbox on an empty database: {@code mailserver.admin.email} (default admin@<first domain>) with * {@code mailserver.admin.password}; no password given — a random one, printed to the log once. */ @Configuration public class DataInitializer { private static final Logger log = LoggerFactory.getLogger(DataInitializer.class); @Bean public CommandLineRunner initDatabase(UserService userService, UserRepository userRepository, MailDomains domains, @Value("${mailserver.admin.email:}") String email, @Value("${mailserver.admin.password:}") String password) { return args -> { if (userRepository.count().block() > 0) { return; } String address = email.isBlank() ? "admin@" + domains.domains().iterator().next() : email.trim().toLowerCase(); boolean generated = password.isBlank(); String secret = generated ? randomPassword() : password; userService.register(address, secret, "Administrator").block(); if (generated) { log.warn("First mailbox created: {} — password: {} (shown once, change it)", address, secret); } else { log.info("First mailbox created: {}", address); } }; } private static String randomPassword() { byte[] bytes = new byte[18]; new SecureRandom().nextBytes(bytes); return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes); } }