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 org.apache.commons.lang3.exception.ExceptionUtils;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.context.MessageSource;
 | 
			
		||||
import org.springframework.context.annotation.Lazy;
 | 
			
		||||
import org.springframework.core.NestedRuntimeException;
 | 
			
		||||
@ -33,6 +34,7 @@ import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
 | 
			
		||||
import org.thingsboard.rule.engine.api.MailService;
 | 
			
		||||
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.ApiFeature;
 | 
			
		||||
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.id.CustomerId;
 | 
			
		||||
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.dao.exception.IncorrectParameterException;
 | 
			
		||||
import org.thingsboard.server.dao.settings.AdminSettingsService;
 | 
			
		||||
@ -84,6 +87,12 @@ public class DefaultMailService implements MailService {
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private TbMailContextComponent tbMailContextComponent;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RateLimitService rateLimitService;
 | 
			
		||||
 | 
			
		||||
    @Value("${mail.per_tenant_rate_limits:}")
 | 
			
		||||
    private String perTenantRateLimitConfig;
 | 
			
		||||
 | 
			
		||||
    private TbMailSender mailSender;
 | 
			
		||||
 | 
			
		||||
    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 {
 | 
			
		||||
        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 {
 | 
			
		||||
                MimeMessage mailMsg = javaMailSender.createMimeMessage();
 | 
			
		||||
                boolean multipart = (tbEmail.getImages() != null && !tbEmail.getImages().isEmpty());
 | 
			
		||||
 | 
			
		||||
@ -164,6 +164,8 @@ mail:
 | 
			
		||||
  oauth2:
 | 
			
		||||
    # Interval for checking refresh token expiration in seconds(by default, 1 day).
 | 
			
		||||
    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:
 | 
			
		||||
 | 
			
		||||
@ -39,7 +39,8 @@ public enum LimitedApi {
 | 
			
		||||
    TWO_FA_VERIFICATION_CODE_SEND(false, true),
 | 
			
		||||
    TWO_FA_VERIFICATION_CODE_CHECK(false, 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;
 | 
			
		||||
    @Getter
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user