You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

76 lines
3.7 KiB

package com.mydreamjob.auth.company;
import com.mydreamjob.audit.AuditContext;
import com.mydreamjob.audit.AuditService;
import com.mydreamjob.auth.AuthSessionService;
import com.mydreamjob.auth.SmsVerificationService;
import com.mydreamjob.auth.User;
import com.mydreamjob.auth.UserRepository;
import com.mydreamjob.auth.password.PasswordPolicy;
import com.mydreamjob.company.Company;
import com.mydreamjob.company.CompanyRepository;
import com.mydreamjob.deletion.AccountDeletionPhoneHasher;
import com.mydreamjob.deletion.AccountDeletionRepository;
import org.junit.jupiter.api.Test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneOffset;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
class CompanyRegistrationSensitiveDataTest {
@Test
void responseAndAuditContainNoPasswordCodePhoneHashOrToken() {
String phone = "19900000301";
String password = "Company-strong-password-2026";
CompanyRegistrationProperties properties = new CompanyRegistrationProperties();
properties.setEnabled("true");
SmsVerificationService sms = mock(SmsVerificationService.class);
UserRepository users = mock(UserRepository.class);
CompanyRepository companies = mock(CompanyRepository.class);
AccountDeletionRepository deletions = mock(AccountDeletionRepository.class);
AccountDeletionPhoneHasher hasher = mock(AccountDeletionPhoneHasher.class);
AuthSessionService sessions = mock(AuthSessionService.class);
AuditService audit = mock(AuditService.class);
when(hasher.hash(phone)).thenReturn("h");
when(deletions.findByDeletedPhoneHash("h")).thenReturn(Optional.empty());
when(users.findByPhoneForUpdate(phone)).thenReturn(Optional.empty());
when(users.saveAndFlush(any(User.class))).thenAnswer(invocation -> {
User user = invocation.getArgument(0);
user.setId(301L);
return user;
});
when(companies.saveAndFlush(any(Company.class))).thenAnswer(invocation -> {
Company company = invocation.getArgument(0);
company.setId(401L);
return company;
});
when(sessions.createSession(any(), any(), any()))
.thenReturn(new AuthSessionService.SessionTokens("access-secret", "refresh-secret", "sid"));
CompanyRegistrationService service = new CompanyRegistrationService(properties, sms, users, companies,
new PasswordPolicy(), new BCryptPasswordEncoder(), deletions, hasher, sessions, audit,
Clock.fixed(Instant.parse("2026-09-22T00:00:00Z"), ZoneOffset.UTC));
CompanyRegistrationRequest request = new CompanyRegistrationRequest();
request.setPhone(phone);
request.setCode("123456");
request.setPassword(password);
CompanyRegistrationRequest.CompanyDetails details = new CompanyRegistrationRequest.CompanyDetails();
details.setName("安全测试企业");
details.setIndustry("互联网");
details.setDescription("简介");
details.setAddress("地址");
request.setCompany(details);
CompanyRegistrationResponse response = service.register(request, AuditContext.builder().build());
assertThat(response.toString()).doesNotContain(phone, password);
verify(audit).logRequired(anyLong(), eq("COMPANY_REGISTERED"), anyString(), anyLong(),
argThat(detailsText -> !detailsText.contains(phone) && !detailsText.contains(password)),
any(), any());
}
}