Skip to content

Commit cba7595

Browse files
committed
FINERACT-1724: Set system user when a job got restarted by stuck job listener
1 parent 4e87745 commit cba7595

3 files changed

Lines changed: 11 additions & 10 deletions

File tree

fineract-provider/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.springframework.batch.core.step.tasklet.Tasklet;
3737
import org.springframework.batch.repeat.RepeatStatus;
3838
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
39-
import org.springframework.security.core.authority.mapping.NullAuthoritiesMapper;
4039
import org.springframework.security.core.context.SecurityContextHolder;
4140

4241
@Slf4j
@@ -49,8 +48,7 @@ public class InitialisationTasklet implements Tasklet {
4948
public RepeatStatus execute(@NotNull StepContribution contribution, @NotNull ChunkContext chunkContext) throws Exception {
5049
HashMap<BusinessDateType, LocalDate> businessDates = ThreadLocalContextUtil.getBusinessDates();
5150
AppUser user = userRepository.fetchSystemUser();
52-
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, user.getPassword(),
53-
new NullAuthoritiesMapper().mapAuthorities(user.getAuthorities()));
51+
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());
5452
SecurityContextHolder.getContext().setAuthentication(auth);
5553
ThreadLocalContextUtil.setActionContext(ActionContext.COB);
5654
String businessDateString = Objects.requireNonNull((String) chunkContext.getStepContext().getStepExecution().getJobExecution()

fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobListener.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636
import org.quartz.JobListener;
3737
import org.quartz.Trigger;
3838
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
39-
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
40-
import org.springframework.security.core.authority.mapping.NullAuthoritiesMapper;
4139
import org.springframework.security.core.context.SecurityContextHolder;
4240
import org.springframework.stereotype.Component;
4341

@@ -52,7 +50,6 @@ public class SchedulerJobListener implements JobListener {
5250
private final String name = SchedulerServiceConstants.DEFAULT_LISTENER_NAME;
5351
private final SchedularWritePlatformService schedularService;
5452
private final AppUserRepositoryWrapper userRepository;
55-
private final GrantedAuthoritiesMapper authoritiesMapper = new NullAuthoritiesMapper();
5653
private final BusinessDateReadPlatformService businessDateReadPlatformService;
5754
private int stackTraceLevel = 0;
5855

@@ -64,8 +61,7 @@ public String getName() {
6461
@Override
6562
public void jobToBeExecuted(@SuppressWarnings("unused") final JobExecutionContext context) {
6663
AppUser user = this.userRepository.fetchSystemUser();
67-
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, user.getPassword(),
68-
authoritiesMapper.mapAuthorities(user.getAuthorities()));
64+
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());
6965
SecurityContextHolder.getContext().setAuthentication(auth);
7066
HashMap<BusinessDateType, LocalDate> businessDates = businessDateReadPlatformService.getBusinessDates();
7167
ThreadLocalContextUtil.setActionContext(ActionContext.DEFAULT);

fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/StuckJobListener.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@
3030
import org.apache.fineract.infrastructure.core.service.tenant.TenantDetailsService;
3131
import org.apache.fineract.infrastructure.event.external.service.JdbcTemplateFactory;
3232
import org.apache.fineract.infrastructure.jobs.domain.JobExecutionRepository;
33-
import org.apache.fineract.infrastructure.jobs.service.jobname.JobNameProvider;
33+
import org.apache.fineract.useradministration.domain.AppUser;
34+
import org.apache.fineract.useradministration.domain.AppUserRepositoryWrapper;
3435
import org.springframework.batch.core.configuration.JobRegistry;
3536
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3637
import org.springframework.context.ApplicationListener;
3738
import org.springframework.context.event.ContextRefreshedEvent;
3839
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
40+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
41+
import org.springframework.security.core.context.SecurityContextHolder;
3942
import org.springframework.stereotype.Service;
4043

4144
@Service
@@ -46,10 +49,10 @@ public class StuckJobListener implements ApplicationListener<ContextRefreshedEve
4649
private final JobExecutionRepository jobExecutionRepository;
4750
private final JdbcTemplateFactory jdbcTemplateFactory;
4851
private final TenantDetailsService tenantDetailsService;
49-
private final JobNameProvider jobNameProvider;
5052
private final JobRegistry jobRegistry;
5153
private final BusinessDateReadPlatformService businessDateReadPlatformService;
5254
private final StuckJobExecutorService stuckJobExecutorService;
55+
private final AppUserRepositoryWrapper userRepository;
5356

5457
@Override
5558
public void onApplicationEvent(ContextRefreshedEvent event) {
@@ -64,6 +67,10 @@ public void onApplicationEvent(ContextRefreshedEvent event) {
6467
HashMap<BusinessDateType, LocalDate> businessDates = businessDateReadPlatformService.getBusinessDates();
6568
ThreadLocalContextUtil.setActionContext(ActionContext.DEFAULT);
6669
ThreadLocalContextUtil.setBusinessDates(businessDates);
70+
AppUser user = userRepository.fetchSystemUser();
71+
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, user.getPassword(),
72+
user.getAuthorities());
73+
SecurityContextHolder.getContext().setAuthentication(auth);
6774
stuckJobNames.forEach(stuckJobExecutorService::resumeStuckJob);
6875
} catch (Exception e) {
6976
throw new RuntimeException("Error while trying to restart stuck jobs", e);

0 commit comments

Comments
 (0)