Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions openaev-api/src/main/java/io/openaev/executors/Executor.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
import io.openaev.execution.ExecutableInject;
import io.openaev.execution.ExecutableInjectDTOMapper;
import io.openaev.execution.ExecutionExecutorService;
import io.openaev.integration.ComponentRequest;
import io.openaev.integration.ManagerFactory;
import io.openaev.rest.exception.ElementNotFoundException;
import io.openaev.rest.inject.service.InjectStatusService;
import io.openaev.service.InjectorService;
import io.openaev.telemetry.metric_collectors.ActionMetricCollector;
Expand Down Expand Up @@ -39,6 +42,7 @@ public class Executor {

private final QueueService queueService;
private final ActionMetricCollector actionMetricCollector;
private final ManagerFactory managerFactory;

private final ExecutionExecutorService executionExecutorService;
private final InjectStatusService injectStatusService;
Expand All @@ -63,10 +67,20 @@ private InjectStatus executeExternal(ExecutableInject executableInject, Injector
return this.injectStatusRepository.save(injectStatus);
}

private io.openaev.executors.Injector getInjectorExecutor(Injector injector) {
try {
return managerFactory
.getManager()
.request(new ComponentRequest(injector.getType()), io.openaev.executors.Injector.class);
} catch (Exception e) {
throw new ElementNotFoundException("Failed to get executor for type: " + injector.getType());
}
}

private InjectStatus executeInternal(ExecutableInject executableInject, Injector injector) {
Inject inject = executableInject.getInjection().getInject();
io.openaev.executors.Injector executor =
this.context.getBean(injector.getType(), io.openaev.executors.Injector.class);
io.openaev.executors.Injector executor = getInjectorExecutor(injector);

Execution execution = executor.executeInjection(executableInject);
// After execution, expectations are already created
// Injection status is filled after complete execution
Expand Down
26 changes: 7 additions & 19 deletions openaev-api/src/main/java/io/openaev/executors/Injector.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,25 @@
import static io.openaev.database.model.ExecutionTrace.getNewErrorTrace;
import static io.openaev.utils.InjectionUtils.isInInjectableRange;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.openaev.database.model.*;
import io.openaev.database.repository.DocumentRepository;
import io.openaev.execution.ExecutableInject;
import io.openaev.model.ExecutionProcess;
import io.openaev.service.FileService;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import java.io.InputStream;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

public abstract class Injector {

@Resource protected ObjectMapper mapper;
private FileService fileService;
private DocumentRepository documentRepository;
protected final InjectorContext context;

@Autowired
public void setDocumentRepository(DocumentRepository documentRepository) {
this.documentRepository = documentRepository;
}

@Autowired
public void setFileService(FileService fileService) {
this.fileService = fileService;
protected Injector(InjectorContext context) {
this.context = context;
}

public abstract ExecutionProcess process(Execution execution, ExecutableInject injection)
Expand Down Expand Up @@ -85,7 +72,7 @@ public <T> T contentConvert(
throws Exception {
Inject inject = injection.getInjection().getInject();
ObjectNode content = inject.getContent();
return this.mapper.treeToValue(content, converter);
return this.context.getMapper().treeToValue(content, converter);
}

public List<DataAttachment> resolveAttachments(
Expand All @@ -110,10 +97,11 @@ public List<DataAttachment> resolveAttachments(
documents.forEach(
attachment -> {
String documentId = attachment.getId();
Optional<Document> askedDocument = documentRepository.findById(documentId);
Optional<Document> askedDocument =
this.context.getDocumentRepository().findById(documentId);
try {
Document doc = askedDocument.orElseThrow();
InputStream fileInputStream = fileService.getFile(doc).orElseThrow();
InputStream fileInputStream = this.context.getFileService().getFile(doc).orElseThrow();
byte[] content = IOUtils.toByteArray(fileInputStream);
resolved.add(new DataAttachment(documentId, doc.getName(), content, doc.getType()));
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.openaev.executors;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.openaev.config.OpenAEVConfig;
import io.openaev.database.repository.DocumentRepository;
import io.openaev.service.FileService;
import lombok.Getter;
import org.springframework.stereotype.Component;

@Component
@Getter
public class InjectorContext {
private final OpenAEVConfig openAEVConfig;
private final ObjectMapper mapper;
private final FileService fileService;
private final DocumentRepository documentRepository;

public InjectorContext(
OpenAEVConfig openAEVConfig,
ObjectMapper mapper,
FileService fileService,
DocumentRepository documentRepository) {
this.openAEVConfig = openAEVConfig;
this.mapper = mapper;
this.fileService = fileService;
this.documentRepository = documentRepository;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.openaev.database.model.PayloadCommandBlock;
import io.openaev.execution.ExecutableInject;
import io.openaev.executors.Injector;
import io.openaev.executors.InjectorContext;
import io.openaev.injectors.caldera.client.model.Ability;
import io.openaev.injectors.caldera.client.model.Agent;
import io.openaev.injectors.caldera.client.model.ExploitResult;
Expand All @@ -37,13 +38,9 @@
import java.util.*;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component(CalderaContract.TYPE)
@RequiredArgsConstructor
@Slf4j
public class CalderaExecutor extends Injector {

Expand All @@ -57,6 +54,21 @@ public class CalderaExecutor extends Injector {
private final InjectExpectationService injectExpectationService;
private final InjectService injectService;

public CalderaExecutor(
InjectorContext context,
CalderaInjectorService calderaService,
AgentService agentService,
AssetGroupService assetGroupService,
InjectExpectationService injectExpectationService,
InjectService injectService) {
super(context);
this.calderaService = calderaService;
this.agentService = agentService;
this.assetGroupService = assetGroupService;
this.injectExpectationService = injectExpectationService;
this.injectService = injectService;
}

@Override
@Transactional
public ExecutionProcess process(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import static io.openaev.helper.StreamHelper.fromIterable;
import static io.openaev.injectors.challenge.ChallengeContract.CHALLENGE_PUBLISH;

import io.openaev.config.OpenAEVConfig;
import io.openaev.database.model.*;
import io.openaev.database.repository.ChallengeRepository;
import io.openaev.execution.ExecutableInject;
import io.openaev.execution.ExecutionContext;
import io.openaev.executors.Injector;
import io.openaev.executors.InjectorContext;
import io.openaev.injectors.challenge.model.ChallengeContent;
import io.openaev.injectors.challenge.model.ChallengeVariable;
import io.openaev.injectors.email.service.EmailService;
Expand All @@ -19,35 +19,39 @@
import io.openaev.model.expectation.ChallengeExpectation;
import io.openaev.model.expectation.ManualExpectation;
import io.openaev.service.InjectExpectationService;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component(ChallengeContract.TYPE)
@RequiredArgsConstructor
public class ChallengeExecutor extends Injector {

@Resource private OpenAEVConfig openAEVConfig;

private final ChallengeRepository challengeRepository;
private final EmailService emailService;
private final InjectExpectationService injectExpectationService;

public ChallengeExecutor(
InjectorContext context,
ChallengeRepository challengeRepository,
EmailService emailService,
InjectExpectationService injectExpectationService) {
super(context);
this.challengeRepository = challengeRepository;
this.emailService = emailService;
this.injectExpectationService = injectExpectationService;
}

@Value("${openaev.mail.imap.enabled}")
private boolean imapEnabled;

private String buildChallengeUri(
ExecutionContext context, Exercise exercise, Challenge challenge) {
String userId = context.getUser().getId();
ExecutionContext executionContext, Exercise exercise, Challenge challenge) {
String userId = executionContext.getUser().getId();
String challengeId = challenge.getId();
String exerciseId = exercise.getId();
return openAEVConfig.getBaseUrl()
return this.context.getOpenAEVConfig().getBaseUrl()
+ "/challenges/"
+ exerciseId
+ "?user="
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
import static io.openaev.helper.StreamHelper.fromIterable;
import static io.openaev.injectors.channel.ChannelContract.CHANNEL_PUBLISH;

import io.openaev.config.OpenAEVConfig;
import io.openaev.database.model.*;
import io.openaev.database.repository.ArticleRepository;
import io.openaev.execution.ExecutableInject;
import io.openaev.execution.ExecutionContext;
import io.openaev.executors.Injector;
import io.openaev.executors.InjectorContext;
import io.openaev.injectors.channel.model.ArticleVariable;
import io.openaev.injectors.channel.model.ChannelContent;
import io.openaev.injectors.email.service.EmailService;
Expand All @@ -20,37 +20,42 @@
import io.openaev.model.expectation.ChannelExpectation;
import io.openaev.model.expectation.ManualExpectation;
import io.openaev.service.InjectExpectationService;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component(ChannelContract.TYPE)
@RequiredArgsConstructor
public class ChannelExecutor extends Injector {

public static final String VARIABLE_ARTICLES = "articles";
public static final String VARIABLE_ARTICLE = "article";

@Resource private OpenAEVConfig openAEVConfig;
private final ArticleRepository articleRepository;
private final EmailService emailService;
private final InjectExpectationService injectExpectationService;

public ChannelExecutor(
InjectorContext context,
ArticleRepository articleRepository,
EmailService emailService,
InjectExpectationService injectExpectationService) {
super(context);
this.articleRepository = articleRepository;
this.emailService = emailService;
this.injectExpectationService = injectExpectationService;
}

@Value("${openaev.mail.imap.enabled}")
private boolean imapEnabled;

private String buildArticleUri(ExecutionContext context, Article article) {
String userId = context.getUser().getId();
private String buildArticleUri(ExecutionContext executionContext, Article article) {
String userId = executionContext.getUser().getId();
String channelId = article.getChannel().getId();
String exerciseId = article.getExercise().getId();
String queryOptions = "article=" + article.getId() + "&user=" + userId;
return openAEVConfig.getBaseUrl()
return this.context.getOpenAEVConfig().getBaseUrl()
+ "/channels/"
+ exerciseId
+ "/"
Expand Down

This file was deleted.

Loading