Add per-tenant rate limits for emails sending
This commit is contained in:
parent
082d11ea99
commit
b78c4fd21a
@ -22,6 +22,7 @@ import jakarta.xml.bind.DatatypeConverter;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.MessageSource;
|
import org.springframework.context.MessageSource;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.core.NestedRuntimeException;
|
import org.springframework.core.NestedRuntimeException;
|
||||||
@ -33,6 +34,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
|
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
|
||||||
import org.thingsboard.rule.engine.api.MailService;
|
import org.thingsboard.rule.engine.api.MailService;
|
||||||
import org.thingsboard.rule.engine.api.TbEmail;
|
import org.thingsboard.rule.engine.api.TbEmail;
|
||||||
|
import org.thingsboard.server.cache.limits.RateLimitService;
|
||||||
import org.thingsboard.server.common.data.AdminSettings;
|
import org.thingsboard.server.common.data.AdminSettings;
|
||||||
import org.thingsboard.server.common.data.ApiFeature;
|
import org.thingsboard.server.common.data.ApiFeature;
|
||||||
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
import org.thingsboard.server.common.data.ApiUsageRecordKey;
|
||||||
@ -43,6 +45,7 @@ import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
|
|||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
import org.thingsboard.server.common.data.limit.LimitedApi;
|
||||||
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
|
||||||
import org.thingsboard.server.dao.exception.IncorrectParameterException;
|
import org.thingsboard.server.dao.exception.IncorrectParameterException;
|
||||||
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
||||||
@ -84,6 +87,12 @@ public class DefaultMailService implements MailService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private TbMailContextComponent tbMailContextComponent;
|
private TbMailContextComponent tbMailContextComponent;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RateLimitService rateLimitService;
|
||||||
|
|
||||||
|
@Value("${mail.per_tenant_rate_limits:}")
|
||||||
|
private String perTenantRateLimitConfig;
|
||||||
|
|
||||||
private TbMailSender mailSender;
|
private TbMailSender mailSender;
|
||||||
|
|
||||||
private String mailFrom;
|
private String mailFrom;
|
||||||
@ -214,6 +223,10 @@ public class DefaultMailService implements MailService {
|
|||||||
|
|
||||||
private void sendMail(TenantId tenantId, CustomerId customerId, TbEmail tbEmail, JavaMailSender javaMailSender, long timeout) throws ThingsboardException {
|
private void sendMail(TenantId tenantId, CustomerId customerId, TbEmail tbEmail, JavaMailSender javaMailSender, long timeout) throws ThingsboardException {
|
||||||
if (apiUsageStateService.getApiUsageState(tenantId).isEmailSendEnabled()) {
|
if (apiUsageStateService.getApiUsageState(tenantId).isEmailSendEnabled()) {
|
||||||
|
if (tenantId != null && !tenantId.isSysTenantId() && StringUtils.isNotEmpty(perTenantRateLimitConfig) &&
|
||||||
|
!rateLimitService.checkRateLimit(LimitedApi.EMAILS, (Object) tenantId, perTenantRateLimitConfig)) {
|
||||||
|
throw new ThingsboardException("Rate limit for emails sending is exceeded", ThingsboardErrorCode.TOO_MANY_REQUESTS);
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
MimeMessage mailMsg = javaMailSender.createMimeMessage();
|
MimeMessage mailMsg = javaMailSender.createMimeMessage();
|
||||||
boolean multipart = (tbEmail.getImages() != null && !tbEmail.getImages().isEmpty());
|
boolean multipart = (tbEmail.getImages() != null && !tbEmail.getImages().isEmpty());
|
||||||
|
|||||||
@ -164,6 +164,8 @@ mail:
|
|||||||
oauth2:
|
oauth2:
|
||||||
# Interval for checking refresh token expiration in seconds(by default, 1 day).
|
# Interval for checking refresh token expiration in seconds(by default, 1 day).
|
||||||
refreshTokenCheckingInterval: "${REFRESH_TOKEN_EXPIRATION_CHECKING_INTERVAL:86400}"
|
refreshTokenCheckingInterval: "${REFRESH_TOKEN_EXPIRATION_CHECKING_INTERVAL:86400}"
|
||||||
|
# Rate limits for sending mails per tenant
|
||||||
|
per_tenant_rate_limits: "${MAIL_PER_TENANT_RATE_LIMITS:}"
|
||||||
|
|
||||||
# Usage statistics parameters
|
# Usage statistics parameters
|
||||||
usage:
|
usage:
|
||||||
|
|||||||
@ -39,7 +39,8 @@ public enum LimitedApi {
|
|||||||
TWO_FA_VERIFICATION_CODE_SEND(false, true),
|
TWO_FA_VERIFICATION_CODE_SEND(false, true),
|
||||||
TWO_FA_VERIFICATION_CODE_CHECK(false, true),
|
TWO_FA_VERIFICATION_CODE_CHECK(false, true),
|
||||||
TRANSPORT_MESSAGES_PER_TENANT("transport messages", true),
|
TRANSPORT_MESSAGES_PER_TENANT("transport messages", true),
|
||||||
TRANSPORT_MESSAGES_PER_DEVICE("transport messages per device", false);
|
TRANSPORT_MESSAGES_PER_DEVICE("transport messages per device", false),
|
||||||
|
EMAILS("emails", true);
|
||||||
|
|
||||||
private Function<DefaultTenantProfileConfiguration, String> configExtractor;
|
private Function<DefaultTenantProfileConfiguration, String> configExtractor;
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user