View Javadoc
1   package com.jsql.model.suspendable;
2   
3   import com.jsql.model.InjectionModel;
4   import com.jsql.view.subscriber.Seal;
5   import com.jsql.model.exception.JSqlRuntimeException;
6   import com.jsql.model.exception.StoppedByUserSlidingException;
7   import com.jsql.model.injection.strategy.blind.AbstractInjectionBit;
8   import com.jsql.model.injection.strategy.blind.InjectionEngine;
9   import com.jsql.util.LogLevelUtil;
10  import org.apache.commons.lang3.StringUtils;
11  import org.apache.logging.log4j.LogManager;
12  import org.apache.logging.log4j.Logger;
13  
14  import java.util.concurrent.atomic.AtomicBoolean;
15  
16  public class SuspendableGetEngine extends AbstractSuspendable {
17  
18      private static final Logger LOGGER = LogManager.getRootLogger();
19  
20      public SuspendableGetEngine(InjectionModel injectionModel) {
21          super(injectionModel);
22      }
23  
24      @Override
25      public String run(Object... args) {
26          LOGGER.log(LogLevelUtil.CONSOLE_DEFAULT, "Fingerprinting database with Boolean match...");
27  
28          AtomicBoolean isEngineFound = new AtomicBoolean(false);
29          this.injectionModel.getMediatorEngine().getEnginesForFingerprint()
30          .stream()
31          .filter(engine -> engine != this.injectionModel.getMediatorEngine().getAuto())
32          .filter(engine -> StringUtils.isNotEmpty(
33              engine.instance().getModelYaml().getStrategy().getConfiguration().getFingerprint().getEngineSpecific()
34          ))
35          .forEach(engine -> {
36              if (isEngineFound.get()) {
37                  return;
38              }
39              String engineSpecificWithOperator = this.injectionModel.getMediatorEngine().getEngine().instance().sqlTestBlindWithOperator(
40                  engine.instance().getModelYaml().getStrategy().getConfiguration().getFingerprint().getEngineSpecific(),
41                  AbstractInjectionBit.BlindOperator.OR  // TODO should also test AND and no mode
42              );
43              try {
44                  var injectionCharInsertion = new InjectionEngine(this.injectionModel, engineSpecificWithOperator, engine);
45                  if (injectionCharInsertion.isInjectable(engineSpecificWithOperator)) {
46                      if (this.isSuspended()) {
47                          throw new StoppedByUserSlidingException();
48                      }
49  
50                      LOGGER.log(LogLevelUtil.CONSOLE_SUCCESS, "Found [{}] using Boolean match", engine);
51                      this.injectionModel.getMediatorEngine().setEngine(engine);
52                      isEngineFound.set(true);
53  
54                      this.injectionModel.sendToViews(new Seal.ActivateEngine(this.injectionModel.getMediatorEngine().getEngine()));
55                  }
56              } catch (StoppedByUserSlidingException e) {
57                  throw new JSqlRuntimeException(e);
58              }
59          });
60          return null;  // unused
61      }
62  }