Projects STRLCPY LoggerPlusPlus Commits 7aaf1bfa
🤬
  • ■ ■ ■ ■ ■ ■
    build.gradle
    skipped 13 lines
    14 14  }
    15 15   
    16 16  dependencies {
    17  - implementation 'net.portswigger.burp.extensions:montoya-api:0.10.1'
     17 + implementation 'net.portswigger.burp.extensions:montoya-api:1.0.0'
    18 18   implementation 'org.swinglabs:swingx:1.6.1'
    19  - implementation 'com.github.CoreyD97:Burp-Montoya-Utilities:896a540db7'
     19 + implementation 'com.github.CoreyD97:Burp-Montoya-Utilities:8501f80f05'
    20 20   implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.15.2'
    21 21   implementation 'org.apache.httpcomponents:httpclient:4.5.13'
    22 22   implementation 'org.apache.commons:commons-text:1.10.0'
    skipped 22 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/LoggerContextMenuFactory.java
    skipped 13 lines
    14 14  import org.apache.commons.text.StringEscapeUtils;
    15 15   
    16 16  import javax.swing.*;
     17 +import java.awt.*;
    17 18  import java.awt.event.ActionEvent;
    18 19  import java.util.Arrays;
    19 20  import java.util.HashMap;
    skipped 8 lines
    28 29   }
    29 30   
    30 31   @Override
    31  - public List<JMenuItem> provideMenuItems(ContextMenuEvent event) {
     32 + public List<Component> provideMenuItems(ContextMenuEvent event) {
    32 33   JMenuItem filterMenu = new JMenu("Logger++");
    33 34   
    34 35   //We're handling a message editor context menu
    skipped 7 lines
    42 43   switch (event.invocationType()){
    43 44   case MESSAGE_EDITOR_REQUEST:
    44 45   case MESSAGE_VIEWER_REQUEST: {
    45  - target = requestResponse.getRequestResponse().httpRequest();
     46 + target = requestResponse.requestResponse().request();
    46 47   try {
    47 48   if (selectedRange.startIndexInclusive() <= target.bodyOffset()) {
    48 49   context = LogEntryField.REQUEST_HEADERS;
    49 50   } else {
    50 51   context = LogEntryField.REQUEST_BODY;
    51 52   }
    52  - selectedBytes = Arrays.copyOfRange(target.asBytes().getBytes(), selectedRange.startIndexInclusive(),
     53 + selectedBytes = Arrays.copyOfRange(target.toByteArray().getBytes(), selectedRange.startIndexInclusive(),
    53 54   selectedRange.endIndexExclusive());
    54 55   }catch (NullPointerException nPException){ return null; }
    55 56   break;
    skipped 1 lines
    57 58   
    58 59   case MESSAGE_EDITOR_RESPONSE:
    59 60   case MESSAGE_VIEWER_RESPONSE: {
    60  - target = requestResponse.getRequestResponse().httpResponse();
     61 + target = requestResponse.requestResponse().response();
    61 62   try {
    62 63   if (selectedRange.startIndexInclusive() <= target.bodyOffset()) {
    63 64   context = LogEntryField.RESPONSE_HEADERS;
    64 65   } else {
    65 66   context = LogEntryField.RESPONSE_BODY;
    66 67   }
    67  - selectedBytes = Arrays.copyOfRange(target.asBytes().getBytes(), selectedRange.startIndexInclusive(),
     68 + selectedBytes = Arrays.copyOfRange(target.toByteArray().getBytes(), selectedRange.startIndexInclusive(),
    68 69   selectedRange.endIndexExclusive());
    69 70   } catch (NullPointerException nPException) {
    70 71   return null;
    skipped 71 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/LoggerPlusPlus.java
    skipped 87 lines
    88 88   montoya.userInterface().registerSuiteTab(NAME, mainViewController.getUiComponent());
    89 89   
    90 90   montoya.http().registerHttpHandler(logProcessor.getHttpHandler());
    91  - montoya.proxy().registerResponseHandler(logProcessor.getProxyHttpResponseHandler());
     91 + montoya.proxy().registerResponseHandler(logProcessor.getProxyResponseHandler());
    92 92   
    93 93   //Add menu item to Burp's frame menu.
    94 94   Frame rootFrame = null;
    skipped 51 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/exports/HarSerializer.java
    1 1  package com.nccgroup.loggerplusplus.exports;
    2 2   
    3  -import burp.api.montoya.http.message.cookies.Cookie;
    4  -import burp.api.montoya.http.message.headers.HttpHeader;
     3 +import burp.api.montoya.http.message.Cookie;
     4 +import burp.api.montoya.http.message.HttpHeader;
    5 5  import burp.api.montoya.http.message.params.HttpParameter;
    6 6  import burp.api.montoya.http.message.params.HttpParameterType;
    7 7  import burp.api.montoya.http.message.requests.HttpRequest;
    skipped 195 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/grepper/GrepperController.java
    1 1  package com.nccgroup.loggerplusplus.grepper;
    2 2   
    3  -import burp.api.montoya.core.Annotations;
     3 +import burp.api.montoya.core.Marker;
    4 4  import burp.api.montoya.core.Range;
    5 5  import burp.api.montoya.http.message.HttpRequestResponse;
    6  -import burp.api.montoya.http.message.MarkedHttpRequestResponse;
    7 6  import com.coreyd97.BurpExtenderUtilities.Preferences;
    8 7  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    9 8  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    skipped 50 lines
    60 59   }
    61 60   }
    62 61   
    63  - public MarkedHttpRequestResponse addMarkers(HttpRequestResponse requestResponse, List<GrepResults.Match> matches) {
    64  - List<Range> requestMarkers = new ArrayList<>(), responseMarkers = new ArrayList<>();
     62 + public HttpRequestResponse addMarkers(HttpRequestResponse requestResponse, List<GrepResults.Match> matches) {
     63 + List<Marker> requestMarkers = new ArrayList<>(), responseMarkers = new ArrayList<>();
    65 64   for (GrepResults.Match match : matches) {
    66  - Range marker = Range.range(match.startIndex, match.endIndex);
     65 + Marker marker = Marker.marker(match.startIndex, match.endIndex);
    67 66   if (match.isRequest) requestMarkers.add(marker);
    68 67   else responseMarkers.add(marker);
    69 68   }
    70 69   
    71  - return requestResponse.withMarkers(requestMarkers, responseMarkers);
     70 + return requestResponse.withRequestMarkers(requestMarkers).withResponseMarkers(responseMarkers);
    72 71   }
    73 72   
    74 73   public void beginSearch(final Pattern pattern, final boolean inScopeOnly, final boolean searchRequests, final boolean searchResponses) {
    skipped 116 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/imports/LoggerImport.java
    skipped 18 lines
    19 19  import burp.api.montoya.http.message.HttpRequestResponse;
    20 20  import burp.api.montoya.http.message.requests.HttpRequest;
    21 21  import burp.api.montoya.http.message.responses.HttpResponse;
     22 +import burp.api.montoya.utilities.Base64DecodingOptions;
     23 +import burp.api.montoya.utilities.Base64Utils;
    22 24  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    23 25  import com.nccgroup.loggerplusplus.logview.processor.EntryImportWorker;
    24 26  import lombok.extern.log4j.Log4j2;
     27 +import org.apache.logging.log4j.util.Base64Util;
    25 28   
    26 29  import javax.swing.*;
    27 30  import java.io.BufferedReader;
    skipped 62 lines
    90 93   String[] v = line.split(","); // Format: "base64(request),base64(response),url"
    91 94   
    92 95   String url = v[3];
    93  - Base64.Decoder b64Decoder = LoggerPlusPlus.montoya.utilities().base64Utils().getDecoder();
     96 + Base64Utils b64Decoder = LoggerPlusPlus.montoya.utilities().base64Utils();
    94 97   HttpService httpService = HttpService.httpService(url);
    95  - HttpRequest httpRequest = HttpRequest.httpRequest(httpService, ByteArray.byteArray(b64Decoder.decode(v[0])));
    96  - HttpResponse httpResponse = HttpResponse.httpResponse(ByteArray.byteArray(b64Decoder.decode(v[1])));
     98 + HttpRequest httpRequest = HttpRequest.httpRequest(httpService, b64Decoder.decode(v[0], Base64DecodingOptions.URL));
     99 + HttpResponse httpResponse = HttpResponse.httpResponse(b64Decoder.decode(v[1], Base64DecodingOptions.URL));
    97 100   HttpRequestResponse requestResponse = HttpRequestResponse.httpRequestResponse(httpRequest, httpResponse);
    98 101   
    99 102   requests.add(requestResponse);
    skipped 117 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/LogEntry.java
    skipped 14 lines
    15 15   
    16 16  import burp.api.montoya.core.ToolType;
    17 17  import burp.api.montoya.http.HttpService;
    18  -import burp.api.montoya.http.MimeType;
    19  -import burp.api.montoya.http.message.cookies.Cookie;
    20  -import burp.api.montoya.http.message.headers.HttpHeader;
     18 +import burp.api.montoya.http.message.Cookie;
     19 +import burp.api.montoya.http.message.HttpHeader;
     20 +import burp.api.montoya.http.message.MimeType;
    21 21  import burp.api.montoya.http.message.params.HttpParameter;
    22 22  import burp.api.montoya.http.message.params.HttpParameterType;
    23 23  import burp.api.montoya.http.message.requests.HttpRequest;
    skipped 390 lines
    414 414   if (responseBodyLength < maxRespSize) {
    415 415   //Only title match HTML files. Prevents expensive regex running on e.g. binary downloads.
    416 416   if (this.responseInferredMimeType == MimeType.HTML) {
    417  - Matcher titleMatcher = Globals.HTML_TITLE_PATTERN.matcher(response.bodyAsString());
     417 + Matcher titleMatcher = Globals.HTML_TITLE_PATTERN.matcher(response.bodyToString());
    418 418   if (titleMatcher.find()) {
    419 419   this.title = titleMatcher.group(1);
    420 420   }
    skipped 1 lines
    422 422   
    423 423   ReflectionController reflectionController = LoggerPlusPlus.instance.getReflectionController();
    424 424   reflectedParameters = request.parameters().parallelStream()
    425  - .filter(parameter -> !reflectionController.isParameterFiltered(parameter) && reflectionController.validReflection(response.bodyAsString(), parameter))
     425 + .filter(parameter -> !reflectionController.isParameterFiltered(parameter) && reflectionController.validReflection(response.bodyToString(), parameter))
    426 426   .map(HttpParameter::name).collect(Collectors.toList());
    427 427   
    428 428  // this.requestResponse = LoggerPlusPlus.montoya.saveBuffersToTempFiles(requestResponse);
    skipped 2 lines
    431 431   ReflectionController reflectionController = LoggerPlusPlus.instance.getReflectionController();
    432 432   reflectedParameters = request.parameters().parallelStream()
    433 433   .filter(parameter -> !reflectionController.isParameterFiltered(parameter)
    434  - && reflectionController.validReflection(new String(response.asBytes().getBytes(), 0, bodyOffset), parameter))
     434 + && reflectionController.validReflection(response.bodyToString(), parameter))
    435 435   .map(HttpParameter::name).collect(Collectors.toList());
    436 436   
    437 437   //Trim the response down to a maximum size, but at least keep the headers!
    skipped 61 lines
    499 499   }
    500 500   
    501 501   public byte[] getRequestBytes() {
    502  - return this.request.asBytes().getBytes();
     502 + return this.request.toByteArray().getBytes();
    503 503   }
    504 504   
    505 505   public byte[] getResponseBytes() {
    506  - return response.asBytes().getBytes();
     506 + return response.toByteArray().getBytes();
    507 507   }
    508 508   
    509 509   public void setReqestTime(Date requestTime) {
    skipped 129 lines
    639 639   case REFLECTION_COUNT:
    640 640   return reflectedParameters.size();
    641 641   case REQUEST_BODY: // request
    642  - return request.bodyAsString();
     642 + return request.bodyToString();
    643 643   case REQUEST_BODY_LENGTH:
    644 644   return request.body().length();
    645 645  // .substring(request.length - requestBodyLength);
    646 646   case RESPONSE_BODY: // response
    647  - return response.bodyAsString();
     647 + return response.bodyToString();
    648 648   case RESPONSE_BODY_LENGTH:
    649 649   return response.body().length();
    650 650   case RTT:
    skipped 123 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/MultipleLogEntryMenu.java
    skipped 1 lines
    2 2   
    3 3  import burp.api.montoya.core.BurpSuiteEdition;
    4 4  import burp.api.montoya.http.message.HttpRequestResponse;
    5  -import burp.api.montoya.scanner.BuiltInScanConfiguration;
    6  -import burp.api.montoya.scanner.InvalidLauncherConfigurationException;
    7  -import burp.api.montoya.scanner.Scan;
     5 +import burp.api.montoya.http.message.requests.HttpRequest;
     6 +import burp.api.montoya.scanner.AuditConfiguration;
     7 +import burp.api.montoya.scanner.BuiltInAuditConfiguration;
     8 +import burp.api.montoya.scanner.Crawl;
     9 +import burp.api.montoya.scanner.CrawlConfiguration;
     10 +import burp.api.montoya.scanner.audit.Audit;
    8 11  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    9 12  import com.nccgroup.loggerplusplus.exports.ContextMenuExportProvider;
    10 13  import com.nccgroup.loggerplusplus.exports.ExportController;
    skipped 90 lines
    101 104   JMenuItem scanner = new JMenuItem(new AbstractAction("Crawl selected " + selectedEntries.size() + " urls") {
    102 105   @Override
    103 106   public void actionPerformed(ActionEvent actionEvent) {
    104  - Scan scan = LoggerPlusPlus.montoya.scanner().createScan();
    105  - 
    106  - for (LogEntry entry : selectedEntries) {
    107  - scan.addRequestResponse(HttpRequestResponse.httpRequestResponse(entry.getRequest(), entry.getResponse()));
    108  - }
    109  - 
    110  - try {
    111  - scan.startCrawl();
    112  - } catch (InvalidLauncherConfigurationException e) {
    113  - log.error(e);
    114  - }
     107 + List<String> urls = selectedEntries.stream().map(logEntry -> logEntry.getUrl().toExternalForm()).toList();
     108 + CrawlConfiguration config = CrawlConfiguration.crawlConfiguration(urls.toArray(String[]::new));
     109 + Crawl crawl = LoggerPlusPlus.montoya.scanner().startCrawl(config);
    115 110   }
    116 111   });
    117 112   this.add(scanner);
    skipped 1 lines
    119 114   JMenuItem activeScan = new JMenuItem(new AbstractAction("Active scan selected " + selectedEntries.size() + " urls") {
    120 115   @Override
    121 116   public void actionPerformed(ActionEvent actionEvent) {
    122  - Scan scan = LoggerPlusPlus.montoya.scanner().createScan();
    123  - scan.addConfiguration(BuiltInScanConfiguration.ACTIVE_AUDIT_CHECKS);
    124  - 
    125  - for (LogEntry entry : selectedEntries) {
    126  - scan.addRequestResponse(HttpRequestResponse.httpRequestResponse(entry.getRequest(), entry.getResponse()));
    127  - }
    128  - 
    129  - try {
    130  - scan.startAudit();
    131  - } catch (InvalidLauncherConfigurationException e) {
    132  - log.error(e);
     117 + AuditConfiguration auditConfiguration = AuditConfiguration.auditConfiguration(BuiltInAuditConfiguration.LEGACY_ACTIVE_AUDIT_CHECKS);
     118 + Audit scan = LoggerPlusPlus.montoya.scanner().startAudit(auditConfiguration);
     119 + for (LogEntry selectedEntry : selectedEntries) {
     120 + scan.addRequestResponse(HttpRequestResponse.httpRequestResponse(selectedEntry.getRequest(), selectedEntry.getResponse()));
    133 121   }
    134 122   }
    135 123   });
    skipped 3 lines
    139 127   JMenuItem passiveScan = new JMenuItem(new AbstractAction("Passive scan selected " + selectedEntries.size() + " urls") {
    140 128   @Override
    141 129   public void actionPerformed(ActionEvent actionEvent) {
    142  - Scan scan = LoggerPlusPlus.montoya.scanner().createScan();
    143  - scan.addConfiguration(BuiltInScanConfiguration.PASSIVE_AUDIT_CHECKS);
    144  - 
    145  - for (LogEntry entry : selectedEntries) {
    146  - scan.addRequestResponse(HttpRequestResponse.httpRequestResponse(entry.getRequest(), entry.getResponse()));
    147  - }
    148  - 
    149  - try {
    150  - scan.startAudit();
    151  - } catch (InvalidLauncherConfigurationException e) {
    152  - log.error(e);
     130 + AuditConfiguration auditConfiguration = AuditConfiguration.auditConfiguration(BuiltInAuditConfiguration.LEGACY_PASSIVE_AUDIT_CHECKS);
     131 + Audit scan = LoggerPlusPlus.montoya.scanner().startAudit(auditConfiguration);
     132 + for (LogEntry selectedEntry : selectedEntries) {
     133 + scan.addRequestResponse(HttpRequestResponse.httpRequestResponse(selectedEntry.getRequest(), selectedEntry.getResponse()));
    153 134   }
    154 135   }
    155 136   });
    skipped 27 lines
    183 164   @Override
    184 165   public void actionPerformed(ActionEvent actionEvent) {
    185 166   for (LogEntry entry : selectedEntries) {
    186  - LoggerPlusPlus.montoya.comparer().sendToComparer(entry.getRequest().asBytes());
     167 + LoggerPlusPlus.montoya.comparer().sendToComparer(entry.getRequest().toByteArray());
    187 168   }
    188 169   }
    189 170   });
    skipped 3 lines
    193 174   public void actionPerformed(ActionEvent actionEvent) {
    194 175   for (LogEntry entry : selectedEntries) {
    195 176   if (entry.isComplete()) { //Do not add entries without a response
    196  - LoggerPlusPlus.montoya.comparer().sendToComparer(entry.getResponse().asBytes());
     177 + LoggerPlusPlus.montoya.comparer().sendToComparer(entry.getResponse().toByteArray());
    197 178   }
    198 179   }
    199 180   }
    skipped 43 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/SingleLogEntryMenu.java
    skipped 1 lines
    2 2   
    3 3  import burp.api.montoya.core.BurpSuiteEdition;
    4 4  import burp.api.montoya.http.message.HttpRequestResponse;
    5  -import burp.api.montoya.scanner.BuiltInScanConfiguration;
    6  -import burp.api.montoya.scanner.InvalidLauncherConfigurationException;
    7  -import burp.api.montoya.scanner.Scan;
     5 +import burp.api.montoya.scanner.AuditConfiguration;
     6 +import burp.api.montoya.scanner.BuiltInAuditConfiguration;
     7 +import burp.api.montoya.scanner.Crawl;
     8 +import burp.api.montoya.scanner.CrawlConfiguration;
     9 +import burp.api.montoya.scanner.audit.Audit;
    8 10  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    9 11  import com.nccgroup.loggerplusplus.exports.ContextMenuExportProvider;
    10 12  import com.nccgroup.loggerplusplus.exports.ExportController;
    skipped 156 lines
    167 169   JMenuItem spider = new JMenuItem(new AbstractAction("Crawl from here") {
    168 170   @Override
    169 171   public void actionPerformed(ActionEvent actionEvent) {
    170  - Scan scan = LoggerPlusPlus.montoya.scanner().createScan();
    171  - scan.addRequestResponse(HttpRequestResponse.httpRequestResponse(entry.getRequest(), entry.getResponse()));
    172  - 
    173  - try {
    174  - scan.startCrawl();
    175  - } catch (InvalidLauncherConfigurationException e) {
    176  - log.error(e);
    177  - }
     172 + CrawlConfiguration config = CrawlConfiguration.crawlConfiguration(entry.getUrl().toExternalForm());
     173 + Crawl crawl = LoggerPlusPlus.montoya.scanner().startCrawl(config);
    178 174   }
    179 175   });
    180 176   this.add(spider);
    skipped 1 lines
    182 178   JMenuItem activeScan = new JMenuItem(new AbstractAction("Do an active scan") {
    183 179   @Override
    184 180   public void actionPerformed(ActionEvent actionEvent) {
    185  - Scan scan = LoggerPlusPlus.montoya.scanner().createScan();
    186  - scan.addConfiguration(BuiltInScanConfiguration.ACTIVE_AUDIT_CHECKS);
     181 + AuditConfiguration auditConfiguration = AuditConfiguration.auditConfiguration(BuiltInAuditConfiguration.LEGACY_ACTIVE_AUDIT_CHECKS);
     182 + Audit scan = LoggerPlusPlus.montoya.scanner().startAudit(auditConfiguration);
    187 183   scan.addRequestResponse(HttpRequestResponse.httpRequestResponse(entry.getRequest(), entry.getResponse()));
    188  - 
    189  - try {
    190  - scan.startAudit();
    191  - } catch (InvalidLauncherConfigurationException e) {
    192  - log.error(e);
    193  - }
    194 184   }
    195 185   });
    196 186   this.add(activeScan);
    skipped 2 lines
    199 189   JMenuItem passiveScan = new JMenuItem(new AbstractAction("Do a passive scan") {
    200 190   @Override
    201 191   public void actionPerformed(ActionEvent actionEvent) {
    202  - Scan scan = LoggerPlusPlus.montoya.scanner().createScan();
    203  - scan.addConfiguration(BuiltInScanConfiguration.PASSIVE_AUDIT_CHECKS);
     192 + AuditConfiguration auditConfiguration = AuditConfiguration.auditConfiguration(BuiltInAuditConfiguration.LEGACY_PASSIVE_AUDIT_CHECKS);
     193 + Audit scan = LoggerPlusPlus.montoya.scanner().startAudit(auditConfiguration);
    204 194   scan.addRequestResponse(HttpRequestResponse.httpRequestResponse(entry.getRequest(), entry.getResponse()));
    205  - 
    206  - try {
    207  - scan.startAudit();
    208  - } catch (InvalidLauncherConfigurationException e) {
    209  - log.error(e);
    210  - }
    211 195   }
    212 196   });
    213 197   passiveScan.setEnabled(entry.isComplete() && isPro);
    skipped 21 lines
    235 219   JMenuItem comparerRequest = new JMenuItem(new AbstractAction("Request") {
    236 220   @Override
    237 221   public void actionPerformed(ActionEvent actionEvent) {
    238  - LoggerPlusPlus.montoya.comparer().sendToComparer(entry.getRequest().asBytes());
     222 + LoggerPlusPlus.montoya.comparer().sendToComparer(entry.getRequest().toByteArray());
    239 223   }
    240 224   });
    241 225   sendToComparer.add(comparerRequest);
    242 226   JMenuItem comparerResponse = new JMenuItem(new AbstractAction("Response") {
    243 227   @Override
    244 228   public void actionPerformed(ActionEvent actionEvent) {
    245  - LoggerPlusPlus.montoya.comparer().sendToComparer(entry.getResponse().asBytes());
     229 + LoggerPlusPlus.montoya.comparer().sendToComparer(entry.getResponse().toByteArray());
    246 230   }
    247 231   });
    248 232   sendToComparer.add(comparerResponse);
    skipped 14 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/processor/EntryImportWorker.java
    skipped 3 lines
    4 4  import burp.api.montoya.http.message.HttpRequestResponse;
    5 5  import burp.api.montoya.http.message.requests.HttpRequest;
    6 6  import burp.api.montoya.http.message.responses.HttpResponse;
    7  -import burp.api.montoya.proxy.ProxyRequestResponse;
     7 +import burp.api.montoya.proxy.ProxyHttpRequestResponse;
    8 8  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    9 9   
    10 10  import javax.swing.*;
    skipped 6 lines
    17 17   
    18 18   private final LogProcessor logProcessor;
    19 19   private final ToolType originatingTool;
    20  - private final List<ProxyRequestResponse> proxyEntries;
     20 + private final List<ProxyHttpRequestResponse> proxyEntries;
    21 21   private final List<HttpRequestResponse> httpEntries;
    22 22   private final Consumer<List<Integer>> interimConsumer;
    23 23   private final Runnable callback;
    skipped 26 lines
    50 50   request = proxyEntries.get(index).finalRequest();
    51 51   response = proxyEntries.get(index).originalResponse();
    52 52   }else{
    53  - request = httpEntries.get(index).httpRequest();
    54  - response = httpEntries.get(index).httpResponse();
     53 + request = httpEntries.get(index).request();
     54 + response = httpEntries.get(index).response();
    55 55   }
    56 56   final LogEntry logEntry = new LogEntry(originatingTool, request, response);
    57 57   int finalIndex = index;
    skipped 28 lines
    86 86   
    87 87   private final LogProcessor logProcessor;
    88 88   private ToolType originatingTool = ToolType.EXTENSIONS;
    89  - private List<ProxyRequestResponse> proxyEntries;
     89 + private List<ProxyHttpRequestResponse> proxyEntries;
    90 90   private List<HttpRequestResponse> httpEntries;
    91 91   private Consumer<List<Integer>> interimConsumer;
    92 92   private Runnable callback;
    skipped 8 lines
    101 101   return this;
    102 102   }
    103 103   
    104  - public Builder setProxyEntries(List<ProxyRequestResponse> entries) {
     104 + public Builder setProxyEntries(List<ProxyHttpRequestResponse> entries) {
    105 105   this.proxyEntries.addAll(entries);
    106 106   this.httpEntries.clear();
    107 107   return this;
    skipped 30 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/processor/LogProcessor.java
    1 1  package com.nccgroup.loggerplusplus.logview.processor;
    2 2   
    3 3  import burp.api.montoya.core.Annotations;
    4  -import burp.api.montoya.core.ToolSource;
    5 4  import burp.api.montoya.core.ToolType;
    6  -import burp.api.montoya.http.HttpHandler;
    7  -import burp.api.montoya.http.RequestResult;
    8  -import burp.api.montoya.http.ResponseResult;
    9  -import burp.api.montoya.http.message.requests.HttpRequest;
     5 +import burp.api.montoya.http.handler.*;
    10 6  import burp.api.montoya.http.message.responses.HttpResponse;
    11  -import burp.api.montoya.proxy.*;
     7 +import burp.api.montoya.proxy.ProxyHttpRequestResponse;
     8 +import burp.api.montoya.proxy.http.InterceptedResponse;
     9 +import burp.api.montoya.proxy.http.ProxyResponseHandler;
     10 +import burp.api.montoya.proxy.http.ProxyResponseReceivedAction;
     11 +import burp.api.montoya.proxy.http.ProxyResponseToBeSentAction;
    12 12  import com.coreyd97.BurpExtenderUtilities.Preferences;
    13 13  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    14 14  import com.nccgroup.loggerplusplus.exports.ExportController;
    skipped 35 lines
    50 50   @Getter
    51 51   private final HttpHandler httpHandler;
    52 52   @Getter
    53  - private final ProxyHttpResponseHandler proxyHttpResponseHandler;
     53 + private final ProxyResponseHandler proxyResponseHandler;
    54 54   
    55 55   Logger logger = LogManager.getLogger(this);
    56 56   
    skipped 20 lines
    77 77   
    78 78   //TODO Enable new logging API when support for matching requests and their responses improves...
    79 79   this.httpHandler = createHttpHandler();
    80  - this.proxyHttpResponseHandler = createProxyResponseHandler();
     80 + this.proxyResponseHandler = createProxyResponseHandler();
    81 81   }
    82 82   
    83 83   private HttpHandler createHttpHandler(){
    84 84   return new HttpHandler() {
    85 85   @Override
    86  - public RequestResult handleHttpRequest(HttpRequest request, Annotations annotations, ToolSource toolSource) {
    87  - if (!(Boolean) preferences.getSetting(PREF_ENABLED) || !isValidTool(toolSource.toolType())
    88  - || !LoggerPlusPlus.isUrlInScope(request.url())){
    89  - return RequestResult.requestResult(request,annotations);
     86 + public RequestToBeSentAction handleHttpRequestToBeSent(HttpRequestToBeSent requestToBeSent) {
     87 + if (!(Boolean) preferences.getSetting(PREF_ENABLED) || !isValidTool(requestToBeSent.toolSource().toolType())
     88 + || !LoggerPlusPlus.isUrlInScope(requestToBeSent.url())){
     89 + return RequestToBeSentAction.continueWith(requestToBeSent);
    90 90   }
    91 91   Date arrivalTime = new Date();
    92 92   
    93 93   //If we're handling a new request, create a log entry.
    94 94   //We must also handle proxy messages here, since the HTTP listener operates after the proxy listener
    95  - final LogEntry logEntry = new LogEntry(toolSource.toolType(), request, arrivalTime);
     95 + final LogEntry logEntry = new LogEntry(requestToBeSent.toolSource().toolType(), requestToBeSent, arrivalTime);
    96 96   
    97 97   //Set the entry's identifier to the HTTP request's hashcode.
    98 98   // For non-proxy messages, this doesn't change when we receive the response
    99  - Integer identifier = System.identityHashCode(request.body());
     99 + Integer identifier = System.identityHashCode(requestToBeSent.body());
     100 + log.info("HTTP Request - Request Identifier: " + identifier);
     101 + 
    100 102   logEntry.setIdentifier(identifier);
    101  - annotations = LogProcessorHelper.addIdentifierInComment(identifier, annotations);
     103 + Annotations annotations = LogProcessorHelper.addIdentifierInComment(identifier, requestToBeSent.annotations());
    102 104   //Submit a new task to process the entry
    103 105   submitNewEntryProcessingRunnable(logEntry);
    104 106   
    105  - return RequestResult.requestResult(request, annotations);
     107 + return RequestToBeSentAction.continueWith(requestToBeSent, annotations);
    106 108   }
    107 109   
    108 110   @Override
    109  - public ResponseResult handleHttpResponse(HttpResponse response, HttpRequest initiatingRequest, Annotations annotations, ToolSource toolSource) {
    110  - if (!(Boolean) preferences.getSetting(PREF_ENABLED) || !isValidTool(toolSource.toolType())
    111  - || !LoggerPlusPlus.isUrlInScope(initiatingRequest.url())){
    112  - return ResponseResult.responseResult(response,annotations);
     111 + public ResponseReceivedAction handleHttpResponseReceived(HttpResponseReceived responseReceived) {
     112 + if (!(Boolean) preferences.getSetting(PREF_ENABLED) || !isValidTool(responseReceived.toolSource().toolType())
     113 + || !LoggerPlusPlus.isUrlInScope(responseReceived.initiatingRequest().url())){
     114 + return ResponseReceivedAction.continueWith(responseReceived);
    113 115   }
    114 116   Date arrivalTime = new Date();
    115 117   
    116  - if (toolSource.isFromTool(ToolType.PROXY)) {
     118 + Annotations annotations = responseReceived.annotations();
     119 + if (responseReceived.toolSource().isFromTool(ToolType.PROXY)) {
    117 120   //If the request came from the proxy, the response isn't final yet.
    118 121   //Just tag the comment with the identifier so we can match it up later.
    119  -// Integer identifier = System.identityHashCode(initiatingRequest);
    120  -// System.out.println("HTTP Response Proxy - Initiating Request: " + identifier);
    121  -// log.info("New Proxy Response: " + identifier);
     122 + Integer identifier = System.identityHashCode(responseReceived.initiatingRequest());
     123 + log.info("HTTP Response Proxy - Response Received: " + identifier);
    122 124  // annotations = LogProcessorHelper.addIdentifierInComment(identifier, annotations);
    123 125  // return ResponseResult.responseResult(response, annotations); //Process proxy responses using processProxyMessage
    124 126   } else {
    125 127   //Otherwise, we have the final HTTP response, and can use the request hashcode to match it up with the log entry.
    126  - Object[] identifierAndAnnotation = LogProcessorHelper.extractAndRemoveIdentifierFromRequestResponseComment(annotations);
     128 + Object[] identifierAndAnnotation = LogProcessorHelper.extractAndRemoveIdentifierFromRequestResponseComment(responseReceived.annotations());
    127 129   Integer identifier = (Integer) identifierAndAnnotation[0]; //TODO Ew.
    128 130   annotations = (Annotations) identifierAndAnnotation[1];
    129  - updateRequestWithResponse(identifier, arrivalTime, response);
     131 + updateRequestWithResponse(identifier, arrivalTime, responseReceived);
    130 132   }
    131  - return ResponseResult.responseResult(response, annotations);
     133 + return ResponseReceivedAction.continueWith(responseReceived, annotations);
    132 134   }
    133 135   };
    134 136   }
    135 137   
    136  - private ProxyHttpResponseHandler createProxyResponseHandler(){
    137  - return new ProxyHttpResponseHandler() {
     138 + private ProxyResponseHandler createProxyResponseHandler(){
     139 + return new ProxyResponseHandler() {
    138 140   @Override
    139  - public ResponseInitialInterceptResult handleReceivedResponse(InterceptedHttpResponse interceptedResponse, HttpRequest initiatingRequest, Annotations annotations) {
    140  - return ResponseInitialInterceptResult.followUserRules(interceptedResponse, annotations); //Do nothing
     141 + public ProxyResponseReceivedAction handleResponseReceived(InterceptedResponse interceptedResponse) {
     142 + return ProxyResponseReceivedAction.continueWith(interceptedResponse); //Do nothing
    141 143   }
    142 144   
    143 145   @Override
    144  - public ResponseFinalInterceptResult handleResponseToReturn(InterceptedHttpResponse interceptedResponse, HttpRequest initiatingRequest, Annotations annotations) {
     146 + public ProxyResponseToBeSentAction handleResponseToBeSent(InterceptedResponse interceptedResponse) {
    145 147   if(!((boolean) preferences.getSetting(PREF_ENABLED)) || !((boolean) preferences.getSetting(PREF_LOG_PROXY))
    146  - || !LoggerPlusPlus.isUrlInScope(initiatingRequest.url())) {
    147  - return ResponseFinalInterceptResult.continueWith(interceptedResponse, annotations);
     148 + || !LoggerPlusPlus.isUrlInScope(interceptedResponse.initiatingRequest().url())) {
     149 + return ProxyResponseToBeSentAction.continueWith(interceptedResponse);
    148 150   }
    149 151   
     152 + Integer identifier2 = System.identityHashCode(interceptedResponse.initiatingRequest());
     153 + log.info("Proxy Response - Identifier: " + identifier2);
     154 + 
    150 155   Date arrivalTime = new Date();
    151  - Object[] identifierAndAnnotation = LogProcessorHelper.extractAndRemoveIdentifierFromRequestResponseComment(annotations);
     156 + Object[] identifierAndAnnotation = LogProcessorHelper.extractAndRemoveIdentifierFromRequestResponseComment(interceptedResponse.annotations());
    152 157   Integer identifier = (Integer) identifierAndAnnotation[0]; //TODO Ew.
    153  - annotations = (Annotations) identifierAndAnnotation[1];
     158 + Annotations annotations = (Annotations) identifierAndAnnotation[1];
    154 159   
    155 160   updateRequestWithResponse(identifier, arrivalTime, interceptedResponse);
    156  - return ResponseFinalInterceptResult.continueWith(interceptedResponse, annotations);
     161 + return ProxyResponseToBeSentAction.continueWith(interceptedResponse, annotations);
    157 162   }
    158 163   };
    159 164   }
    skipped 180 lines
    340 345   //TODO Remove to more suitable UI class and show dialog
    341 346   
    342 347   //Build list of entries to import
    343  - List<ProxyRequestResponse> proxyHistory = LoggerPlusPlus.montoya.proxy().history();
     348 + List<ProxyHttpRequestResponse> proxyHistory = LoggerPlusPlus.montoya.proxy().history();
    344 349   int maxEntries = preferences.getSetting(PREF_MAXIMUM_ENTRIES);
    345 350   int startIndex = Math.max(proxyHistory.size() - maxEntries, 0);
    346  - List<ProxyRequestResponse> entriesToImport = proxyHistory.subList(startIndex, proxyHistory.size());
     351 + List<ProxyHttpRequestResponse> entriesToImport = proxyHistory.subList(startIndex, proxyHistory.size());
    347 352   
    348 353   //Build and start import worker
    349 354   EntryImportWorker importWorker = new EntryImportWorker.Builder(this)
    skipped 99 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/processor/LogProcessorHelper.java
    skipped 8 lines
    9 9  public class LogProcessorHelper {
    10 10   
    11 11   public static Annotations addIdentifierInComment(Integer identifier, Annotations annotations) {
    12  - String originalComment = annotations.comment() != null ? annotations.comment() : "";
    13  - annotations = annotations.withComment(originalComment + "$LPP:" + identifier + "$");
     12 + String originalComment = annotations.notes() != null ? annotations.notes() : "";
     13 + annotations = annotations.withNotes(originalComment + "$LPP:" + identifier + "$");
    14 14   return annotations;
    15 15   }
    16 16   
    17 17   public static Object[] extractAndRemoveIdentifierFromRequestResponseComment(Annotations annotations) {
    18 18   Integer identifier = null;
    19  - if (!StringUtils.isEmpty(annotations.comment())) {
    20  - Matcher matcher = Globals.LOG_ENTRY_ID_PATTERN.matcher(annotations.comment());
     19 + if (!StringUtils.isEmpty(annotations.notes())) {
     20 + Matcher matcher = Globals.LOG_ENTRY_ID_PATTERN.matcher(annotations.notes());
    21 21   if (matcher.find()) {
    22 22   identifier = Integer.parseInt(matcher.group(1));
    23  - annotations = annotations.withComment(matcher.replaceAll(""));
     23 + annotations = annotations.withNotes(matcher.replaceAll(""));
    24 24   }
    25 25   }
    26 26   
    skipped 4 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/preferences/LoggerPreferenceFactory.java
    skipped 15 lines
    16 16  import com.nccgroup.loggerplusplus.logentry.LogEntrySerializer;
    17 17  import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumn;
    18 18  import com.nccgroup.loggerplusplus.util.Globals;
     19 +import lombok.extern.java.Log;
     20 +import lombok.extern.log4j.Log4j2;
    19 21  import org.apache.logging.log4j.Level;
    20 22   
    21 23  import javax.swing.*;
    skipped 1 lines
    23 25   
    24 26  import static com.nccgroup.loggerplusplus.util.Globals.*;
    25 27   
     28 +@Log4j2
    26 29  public class LoggerPreferenceFactory extends PreferenceFactory {
    27 30   
    28 31   private HashMap<UUID, ColorFilter> defaultColorFilters;
    skipped 12 lines
    41 44   protected void createDefaults(){
    42 45   defaultColorFilters = this.gsonProvider.getGson().fromJson(
    43 46   Globals.DEFAULT_COLOR_FILTERS_JSON, new TypeToken<HashMap<UUID, ColorFilter>>(){}.getType());
     47 + log.info(DEFAULT_LOG_TABLE_COLUMNS_JSON);
    44 48   defaultlogTableColumns = this.gsonProvider.getGson().fromJson(
    45 49   Globals.DEFAULT_LOG_TABLE_COLUMNS_JSON, new TypeToken<List<LogTableColumn>>() {}.getType());
    46 50   defaultBlacklistedReflections = new TreeSet(String.CASE_INSENSITIVE_ORDER);
    skipped 78 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/Globals.java
    skipped 85 lines
    86 86   public static final int CURRENT_COLUMN_VERSION = 9;
    87 87   private static int colOrder = 0;
    88 88   public static final String DEFAULT_LOG_TABLE_COLUMNS_JSON = new StringBuilder().append("[")
    89  - .append("{'id':" + NUMBER + ",'name':'Number','defaultVisibleName':'#','visibleName':'#','preferredWidth':65,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(NUMBER.getDescription()) + "'},")
    90  - .append("{'id':" + TAGS + ",'name':'Tags','defaultVisibleName':'Tags','visibleName':'Tags','preferredWidth':100,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(TAGS.getDescription()) + "'},")
    91  - .append("{'id':" + COMPLETE + ",'name':'Complete','defaultVisibleName':'Complete','visibleName':'Complete','preferredWidth':80,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(COMPLETE.getDescription()) + "'},")
    92  - .append("{'id':" + PROXY_TOOL + ",'name':'Tool','defaultVisibleName':'Tool','visibleName':'Tool','preferredWidth':70,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(PROXY_TOOL.getDescription()) + "'},")
    93  - .append("{'id':" + ISSSL + ",'name':'IsSSL','defaultVisibleName':'SSL','visibleName':'SSL','preferredWidth':50,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(ISSSL.getDescription()) + "'},")
    94  - .append("{'id':" + METHOD + ",'name':'Method','defaultVisibleName':'Method','visibleName':'Method','preferredWidth':65,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(METHOD.getDescription()) + "'},")
    95  - .append("{'id':" + PROTOCOL + ",'name':'Protocol','defaultVisibleName':'Protocol','visibleName':'Protocol','preferredWidth':80,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(PROTOCOL.getDescription()) + "'},")
    96  - .append("{'id':" + HOSTNAME + ",'name':'Hostname','defaultVisibleName':'Host Name','visibleName':'Host Name','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(HOSTNAME.getDescription()) + "'},")
    97  - .append("{'id':" + PORT + ",'name':'TargetPort','defaultVisibleName':'Port','visibleName':'Port','preferredWidth':50,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(PORT.getDescription()) + "'},")
    98  - .append("{'id':" + HOST + ",'name':'Host','defaultVisibleName':'Host','visibleName':'Host','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(HOST.getDescription()) + "'},")
    99  - .append("{'id':" + PATH + ",'name':'Path','defaultVisibleName':'Path','visibleName':'Path','preferredWidth':250,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(PATH.getDescription()) + "'},")
    100  - .append("{'id':" + EXTENSION + ",'name':'UrlExtension','defaultVisibleName':'Extension','visibleName':'Extension','preferredWidth':70,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(EXTENSION.getDescription()) + "'},")
    101  - .append("{'id':" + QUERY + ",'name':'Query','defaultVisibleName':'Query','visibleName':'Query','preferredWidth':250,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(QUERY.getDescription()) + "'},")
    102  - .append("{'id':" + PATHQUERY + ",'name':'Path Query','defaultVisibleName':'Path Query','visibleName':'Path Query','preferredWidth':250,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(PATHQUERY.getDescription()) + "'},")
    103  - .append("{'id':" + URL + ",'name':'Url','defaultVisibleName':'URL','visibleName':'URL','preferredWidth':250,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(URL.getDescription()) + "'},")
    104  - .append("{'id':" + HASPARAMS + ",'name':'Has Params','defaultVisibleName':'Has Params','visibleName':'Has Params','preferredWidth':75,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(HASPARAMS.getDescription()) + "'},")
    105  - .append("{'id':" + STATUS + ",'name':'Status','defaultVisibleName':'Status','visibleName':'Status','preferredWidth':55,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(STATUS.getDescription()) + "'},")
    106  - .append("{'id':" + TITLE + ",'name':'Title','defaultVisibleName':'Title','visibleName':'Title','preferredWidth':100,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(TITLE.getDescription()) + "'},")
    107  - .append("{'id':" + REQUEST_LENGTH + ",'name':'RequestLength','defaultVisibleName':'Request Length','visibleName':'Request Length','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(REQUEST_LENGTH.getDescription()) + "'},")
    108  - .append("{'id':" + RESPONSE_LENGTH + ",'name':'ResponseLength','defaultVisibleName':'Response Length','visibleName':'Response Length','preferredWidth':125,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(RESPONSE_LENGTH.getDescription()) + "'},")
    109  - .append("{'id':" + INFERRED_TYPE + ",'name':'InferredType','defaultVisibleName':'Inferred Type','visibleName':'Inferred Type','preferredWidth':100,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(INFERRED_TYPE.getDescription()) + "'},")
    110  - .append("{'id':" + COMMENT + ",'name':'Comment','defaultVisibleName':'Comment','visibleName':'Comment','preferredWidth':200,'readonly':false,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(COMMENT.getDescription()) + "'},")
    111  - .append("{'id':" + PARAMETER_COUNT + ",'name':'ParameterCount','defaultVisibleName':'Parameter Count','visibleName':'Parameter Count','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(PARAMETER_COUNT.getDescription()) + "'},")
    112  - .append("{'id':" + PARAMETERS + ",'name':'Parameters','defaultVisibleName':'Parameters','visibleName':'Parameters','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(PARAMETERS.getDescription()) + "'},")
    113  - .append("{'id':" + REFLECTED_PARAMS + ",'name':'ReflectedParams','defaultVisibleName':'Reflected Params','visibleName':'Reflected Params','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(REFLECTED_PARAMS.getDescription()) + "'},")
    114  - .append("{'id':" + REFLECTION_COUNT + ",'name':'ReflectionCount','defaultVisibleName':'Reflection Count','visibleName':'Reflection Count','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(REFLECTION_COUNT.getDescription()) + "'},")
    115  - .append("{'id':" + ORIGIN + ",'name':'origin','defaultVisibleName':'Origin header','visibleName':'Origin header','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(ORIGIN.getDescription()) + "'},")
    116  - .append("{'id':" + MIME_TYPE + ",'name':'MimeType','defaultVisibleName':'MIME type','visibleName':'MIME type','preferredWidth':100,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(MIME_TYPE.getDescription()) + "'},")
    117  - .append("{'id':" + NEW_COOKIES + ",'name':'NewCookies','defaultVisibleName':'New Cookies','visibleName':'New Cookies','preferredWidth':125,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(NEW_COOKIES.getDescription()) + "'},")
    118  - .append("{'id':" + REQUEST_TIME + ",'name':'RequestTime','defaultVisibleName':'Request Time','visibleName':'Request Time','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(REQUEST_TIME.getDescription()) + "'},")
    119  - .append("{'id':" + RESPONSE_TIME + ",'name':'ResponseTime','defaultVisibleName':'Response Time','visibleName':'Response Time','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(RESPONSE_TIME.getDescription()) + "'},")
    120  - .append("{'id':" + RESPONSE_HASH + ",'name':'ResponseHash','defaultVisibleName':'Response Hash','visibleName':'Response Hash','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(RESPONSE_HASH.getDescription()) + "'},")
    121  - .append("{'id':" + RTT + ",'name':'RTT','defaultVisibleName':'RTT (ms)','visibleName':'RTT (ms)','preferredWidth':100,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(RTT.getDescription()) + "'},")
    122  - .append("{'id':" + LISTENER_INTERFACE + ",'name':'ListenerInterface','defaultVisibleName':'Proxy Listener Interface','visibleName':'Proxy Listener Interface','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(LISTENER_INTERFACE.getDescription()) + "'},")
    123  - .append("{'id':" + CLIENT_IP + ",'name':'ClientIP','defaultVisibleName':'Proxy Client IP','visibleName':'Proxy Client IP','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(CLIENT_IP.getDescription()) + "'},")
    124  - .append("{'id':" + RESPONSE_CONTENT_TYPE + ",'name':'ResponseContentType','defaultVisibleName':'Response Content-Type','visibleName':'Response Content-Type','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(RESPONSE_CONTENT_TYPE.getDescription()) + "'},")
    125  - .append("{'id':" + HASGETPARAM + ",'name':'HasQueryStringParam','defaultVisibleName':'Query String?','visibleName':'Query String?','preferredWidth':50,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(HASGETPARAM.getDescription()) + "'},")
    126  - .append("{'id':" + HASPOSTPARAM + ",'name':'HasBodyParam','defaultVisibleName':'Body Params?','visibleName':'Body Params?','preferredWidth':50,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(HASPOSTPARAM.getDescription()) + "'},")
    127  - .append("{'id':" + HASCOOKIEPARAM + ",'name':'HasCookieParam','defaultVisibleName':'Sent Cookie?','visibleName':'Sent Cookie?','preferredWidth':50,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(HASCOOKIEPARAM.getDescription()) + "'},")
    128  - .append("{'id':" + SENTCOOKIES + ",'name':'SentCookies','defaultVisibleName':'Sent Cookies','visibleName':'Sent Cookies','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(SENTCOOKIES.getDescription()) + "'},")
    129  - .append("{'id':" + USES_COOKIE_JAR + ",'name':'UsesCookieJar','defaultVisibleName':'Contains cookie jar?','visibleName':'Contains cookie jar?','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(USES_COOKIE_JAR.getDescription()) + "'},")
    130  - .append("{'id':" + REQUEST_CONTENT_TYPE + ",'name':'RequestContentType','defaultVisibleName':'Request Content Type','visibleName':'Request Type','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(REQUEST_CONTENT_TYPE.getDescription()) + "'},")
    131  - .append("{'id':" + REFERRER + ",'name':'Referrer','defaultVisibleName':'Referrer','visibleName':'Referrer','preferredWidth':250,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(REFERRER.getDescription()) + "'},")
    132  - .append("{'id':" + REDIRECT_URL + ",'name':'Redirect','defaultVisibleName':'Redirect','visibleName':'Redirect','preferredWidth':250,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(REDIRECT_URL.getDescription()) + "'},")
    133  - .append("{'id':" + HAS_SET_COOKIES + ",'name':'HasSetCookies','defaultVisibleName':'Set-Cookie?','visibleName':'Set-Cookie?','preferredWidth':50,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(HAS_SET_COOKIES.getDescription()) + "'},")
    134  - .append("{'id':" + REQUEST_BODY + ",'name':'Request','defaultVisibleName':'Request Body','visibleName':'Request Body','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(REQUEST_BODY.getDescription()) + "'},")
    135  - .append("{'id':" + REQUEST_BODY_LENGTH + ",'name':'RequestBodyLength','defaultVisibleName':'Request Body Length','visibleName':'Request Body Length','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(REQUEST_BODY_LENGTH.getDescription()) + "'},")
    136  - .append("{'id':" + REQUEST_HEADERS + ",'name':'RequestHeaders','defaultVisibleName':'Request Headers','visibleName':'Request Headers','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(REQUEST_HEADERS.getDescription()) + "'},")
    137  - .append("{'id':" + RESPONSE_BODY + ",'name':'Response','defaultVisibleName':'Response Body','visibleName':'Response Body','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(RESPONSE_BODY.getDescription()) + "'},")
    138  - .append("{'id':" + RESPONSE_BODY_LENGTH + ",'name':'ResponseBodyLength','defaultVisibleName':'Response Body Length','visibleName':'Response Body Length','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(RESPONSE_BODY_LENGTH.getDescription()) + "'},")
    139  - .append("{'id':" + RESPONSE_HEADERS + ",'name':'ResponseHeaders','defaultVisibleName':'Response Headers','visibleName':'Response Headers','preferredWidth':150,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(RESPONSE_HEADERS.getDescription()) + "'}")
     89 + .append("{\"id\":" + NUMBER + ",\"name\":\"Number\",\"defaultVisibleName\":\"#\",\"visibleName\":\"#\",\"preferredWidth\":65,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(NUMBER.getDescription()) + "\"},")
     90 + .append("{\"id\":" + TAGS + ",\"name\":\"Tags\",\"defaultVisibleName\":\"Tags\",\"visibleName\":\"Tags\",\"preferredWidth\":100,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(TAGS.getDescription()) + "\"},")
     91 + .append("{\"id\":" + COMPLETE + ",\"name\":\"Complete\",\"defaultVisibleName\":\"Complete\",\"visibleName\":\"Complete\",\"preferredWidth\":80,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(COMPLETE.getDescription()) + "\"},")
     92 + .append("{\"id\":" + PROXY_TOOL + ",\"name\":\"Tool\",\"defaultVisibleName\":\"Tool\",\"visibleName\":\"Tool\",\"preferredWidth\":70,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(PROXY_TOOL.getDescription()) + "\"},")
     93 + .append("{\"id\":" + ISSSL + ",\"name\":\"IsSSL\",\"defaultVisibleName\":\"SSL\",\"visibleName\":\"SSL\",\"preferredWidth\":50,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(ISSSL.getDescription()) + "\"},")
     94 + .append("{\"id\":" + METHOD + ",\"name\":\"Method\",\"defaultVisibleName\":\"Method\",\"visibleName\":\"Method\",\"preferredWidth\":65,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(METHOD.getDescription()) + "\"},")
     95 + .append("{\"id\":" + PROTOCOL + ",\"name\":\"Protocol\",\"defaultVisibleName\":\"Protocol\",\"visibleName\":\"Protocol\",\"preferredWidth\":80,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(PROTOCOL.getDescription()) + "\"},")
     96 + .append("{\"id\":" + HOSTNAME + ",\"name\":\"Hostname\",\"defaultVisibleName\":\"Host Name\",\"visibleName\":\"Host Name\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(HOSTNAME.getDescription()) + "\"},")
     97 + .append("{\"id\":" + PORT + ",\"name\":\"TargetPort\",\"defaultVisibleName\":\"Port\",\"visibleName\":\"Port\",\"preferredWidth\":50,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(PORT.getDescription()) + "\"},")
     98 + .append("{\"id\":" + HOST + ",\"name\":\"Host\",\"defaultVisibleName\":\"Host\",\"visibleName\":\"Host\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(HOST.getDescription()) + "\"},")
     99 + .append("{\"id\":" + PATH + ",\"name\":\"Path\",\"defaultVisibleName\":\"Path\",\"visibleName\":\"Path\",\"preferredWidth\":250,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(PATH.getDescription()) + "\"},")
     100 + .append("{\"id\":" + EXTENSION + ",\"name\":\"UrlExtension\",\"defaultVisibleName\":\"Extension\",\"visibleName\":\"Extension\",\"preferredWidth\":70,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(EXTENSION.getDescription()) + "\"},")
     101 + .append("{\"id\":" + QUERY + ",\"name\":\"Query\",\"defaultVisibleName\":\"Query\",\"visibleName\":\"Query\",\"preferredWidth\":250,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(QUERY.getDescription()) + "\"},")
     102 + .append("{\"id\":" + PATHQUERY + ",\"name\":\"Path Query\",\"defaultVisibleName\":\"Path Query\",\"visibleName\":\"Path Query\",\"preferredWidth\":250,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(PATHQUERY.getDescription()) + "\"},")
     103 + .append("{\"id\":" + URL + ",\"name\":\"Url\",\"defaultVisibleName\":\"URL\",\"visibleName\":\"URL\",\"preferredWidth\":250,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(URL.getDescription()) + "\"},")
     104 + .append("{\"id\":" + HASPARAMS + ",\"name\":\"Has Params\",\"defaultVisibleName\":\"Has Params\",\"visibleName\":\"Has Params\",\"preferredWidth\":75,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(HASPARAMS.getDescription()) + "\"},")
     105 + .append("{\"id\":" + STATUS + ",\"name\":\"Status\",\"defaultVisibleName\":\"Status\",\"visibleName\":\"Status\",\"preferredWidth\":55,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(STATUS.getDescription()) + "\"},")
     106 + .append("{\"id\":" + TITLE + ",\"name\":\"Title\",\"defaultVisibleName\":\"Title\",\"visibleName\":\"Title\",\"preferredWidth\":100,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(TITLE.getDescription()) + "\"},")
     107 + .append("{\"id\":" + REQUEST_LENGTH + ",\"name\":\"RequestLength\",\"defaultVisibleName\":\"Request Length\",\"visibleName\":\"Request Length\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(REQUEST_LENGTH.getDescription()) + "\"},")
     108 + .append("{\"id\":" + RESPONSE_LENGTH + ",\"name\":\"ResponseLength\",\"defaultVisibleName\":\"Response Length\",\"visibleName\":\"Response Length\",\"preferredWidth\":125,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(RESPONSE_LENGTH.getDescription()) + "\"},")
     109 + .append("{\"id\":" + INFERRED_TYPE + ",\"name\":\"InferredType\",\"defaultVisibleName\":\"Inferred Type\",\"visibleName\":\"Inferred Type\",\"preferredWidth\":100,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(INFERRED_TYPE.getDescription()) + "\"},")
     110 + .append("{\"id\":" + COMMENT + ",\"name\":\"Comment\",\"defaultVisibleName\":\"Comment\",\"visibleName\":\"Comment\",\"preferredWidth\":200,\"readonly\":false,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(COMMENT.getDescription()) + "\"},")
     111 + .append("{\"id\":" + PARAMETER_COUNT + ",\"name\":\"ParameterCount\",\"defaultVisibleName\":\"Parameter Count\",\"visibleName\":\"Parameter Count\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(PARAMETER_COUNT.getDescription()) + "\"},")
     112 + .append("{\"id\":" + PARAMETERS + ",\"name\":\"Parameters\",\"defaultVisibleName\":\"Parameters\",\"visibleName\":\"Parameters\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(PARAMETERS.getDescription()) + "\"},")
     113 + .append("{\"id\":" + REFLECTED_PARAMS + ",\"name\":\"ReflectedParams\",\"defaultVisibleName\":\"Reflected Params\",\"visibleName\":\"Reflected Params\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(REFLECTED_PARAMS.getDescription()) + "\"},")
     114 + .append("{\"id\":" + REFLECTION_COUNT + ",\"name\":\"ReflectionCount\",\"defaultVisibleName\":\"Reflection Count\",\"visibleName\":\"Reflection Count\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(REFLECTION_COUNT.getDescription()) + "\"},")
     115 + .append("{\"id\":" + ORIGIN + ",\"name\":\"origin\",\"defaultVisibleName\":\"Origin header\",\"visibleName\":\"Origin header\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(ORIGIN.getDescription()) + "\"},")
     116 + .append("{\"id\":" + MIME_TYPE + ",\"name\":\"MimeType\",\"defaultVisibleName\":\"MIME type\",\"visibleName\":\"MIME type\",\"preferredWidth\":100,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(MIME_TYPE.getDescription()) + "\"},")
     117 + .append("{\"id\":" + NEW_COOKIES + ",\"name\":\"NewCookies\",\"defaultVisibleName\":\"New Cookies\",\"visibleName\":\"New Cookies\",\"preferredWidth\":125,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(NEW_COOKIES.getDescription()) + "\"},")
     118 + .append("{\"id\":" + REQUEST_TIME + ",\"name\":\"RequestTime\",\"defaultVisibleName\":\"Request Time\",\"visibleName\":\"Request Time\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(REQUEST_TIME.getDescription()) + "\"},")
     119 + .append("{\"id\":" + RESPONSE_TIME + ",\"name\":\"ResponseTime\",\"defaultVisibleName\":\"Response Time\",\"visibleName\":\"Response Time\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(RESPONSE_TIME.getDescription()) + "\"},")
     120 + .append("{\"id\":" + RESPONSE_HASH + ",\"name\":\"ResponseHash\",\"defaultVisibleName\":\"Response Hash\",\"visibleName\":\"Response Hash\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(RESPONSE_HASH.getDescription()) + "\"},")
     121 + .append("{\"id\":" + RTT + ",\"name\":\"RTT\",\"defaultVisibleName\":\"RTT (ms)\",\"visibleName\":\"RTT (ms)\",\"preferredWidth\":100,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(RTT.getDescription()) + "\"},")
     122 + .append("{\"id\":" + LISTENER_INTERFACE + ",\"name\":\"ListenerInterface\",\"defaultVisibleName\":\"Proxy Listener Interface\",\"visibleName\":\"Proxy Listener Interface\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":true,\"description\":\"" + StringEscapeUtils.escapeJson(LISTENER_INTERFACE.getDescription()) + "\"},")
     123 + .append("{\"id\":" + CLIENT_IP + ",\"name\":\"ClientIP\",\"defaultVisibleName\":\"Proxy Client IP\",\"visibleName\":\"Proxy Client IP\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(CLIENT_IP.getDescription()) + "\"},")
     124 + .append("{\"id\":" + RESPONSE_CONTENT_TYPE + ",\"name\":\"ResponseContentType\",\"defaultVisibleName\":\"Response Content-Type\",\"visibleName\":\"Response Content-Type\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(RESPONSE_CONTENT_TYPE.getDescription()) + "\"},")
     125 + .append("{\"id\":" + HASGETPARAM + ",\"name\":\"HasQueryStringParam\",\"defaultVisibleName\":\"Query String?\",\"visibleName\":\"Query String?\",\"preferredWidth\":50,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(HASGETPARAM.getDescription()) + "\"},")
     126 + .append("{\"id\":" + HASPOSTPARAM + ",\"name\":\"HasBodyParam\",\"defaultVisibleName\":\"Body Params?\",\"visibleName\":\"Body Params?\",\"preferredWidth\":50,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(HASPOSTPARAM.getDescription()) + "\"},")
     127 + .append("{\"id\":" + HASCOOKIEPARAM + ",\"name\":\"HasCookieParam\",\"defaultVisibleName\":\"Sent Cookie?\",\"visibleName\":\"Sent Cookie?\",\"preferredWidth\":50,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(HASCOOKIEPARAM.getDescription()) + "\"},")
     128 + .append("{\"id\":" + SENTCOOKIES + ",\"name\":\"SentCookies\",\"defaultVisibleName\":\"Sent Cookies\",\"visibleName\":\"Sent Cookies\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(SENTCOOKIES.getDescription()) + "\"},")
     129 + .append("{\"id\":" + USES_COOKIE_JAR + ",\"name\":\"UsesCookieJar\",\"defaultVisibleName\":\"Contains cookie jar?\",\"visibleName\":\"Contains cookie jar?\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(USES_COOKIE_JAR.getDescription()) + "\"},")
     130 + .append("{\"id\":" + REQUEST_CONTENT_TYPE + ",\"name\":\"RequestContentType\",\"defaultVisibleName\":\"Request Content Type\",\"visibleName\":\"Request Type\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(REQUEST_CONTENT_TYPE.getDescription()) + "\"},")
     131 + .append("{\"id\":" + REFERRER + ",\"name\":\"Referrer\",\"defaultVisibleName\":\"Referrer\",\"visibleName\":\"Referrer\",\"preferredWidth\":250,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(REFERRER.getDescription()) + "\"},")
     132 + .append("{\"id\":" + REDIRECT_URL + ",\"name\":\"Redirect\",\"defaultVisibleName\":\"Redirect\",\"visibleName\":\"Redirect\",\"preferredWidth\":250,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(REDIRECT_URL.getDescription()) + "\"},")
     133 + .append("{\"id\":" + HAS_SET_COOKIES + ",\"name\":\"HasSetCookies\",\"defaultVisibleName\":\"Set-Cookie?\",\"visibleName\":\"Set-Cookie?\",\"preferredWidth\":50,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(HAS_SET_COOKIES.getDescription()) + "\"},")
     134 + .append("{\"id\":" + REQUEST_BODY + ",\"name\":\"Request\",\"defaultVisibleName\":\"Request Body\",\"visibleName\":\"Request Body\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(REQUEST_BODY.getDescription()) + "\"},")
     135 + .append("{\"id\":" + REQUEST_BODY_LENGTH + ",\"name\":\"RequestBodyLength\",\"defaultVisibleName\":\"Request Body Length\",\"visibleName\":\"Request Body Length\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(REQUEST_BODY_LENGTH.getDescription()) + "\"},")
     136 + .append("{\"id\":" + REQUEST_HEADERS + ",\"name\":\"RequestHeaders\",\"defaultVisibleName\":\"Request Headers\",\"visibleName\":\"Request Headers\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(REQUEST_HEADERS.getDescription()) + "\"},")
     137 + .append("{\"id\":" + RESPONSE_BODY + ",\"name\":\"Response\",\"defaultVisibleName\":\"Response Body\",\"visibleName\":\"Response Body\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(RESPONSE_BODY.getDescription()) + "\"},")
     138 + .append("{\"id\":" + RESPONSE_BODY_LENGTH + ",\"name\":\"ResponseBodyLength\",\"defaultVisibleName\":\"Response Body Length\",\"visibleName\":\"Response Body Length\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(RESPONSE_BODY_LENGTH.getDescription()) + "\"},")
     139 + .append("{\"id\":" + RESPONSE_HEADERS + ",\"name\":\"ResponseHeaders\",\"defaultVisibleName\":\"Response Headers\",\"visibleName\":\"Response Headers\",\"preferredWidth\":150,\"readonly\":true,\"order\":" + colOrder++ + ",\"visible\":false,\"description\":\"" + StringEscapeUtils.escapeJson(RESPONSE_HEADERS.getDescription()) + "\"}")
    140 140   .append("]").toString();
    141 141   
    142 142   
    skipped 4 lines
  • ■ ■ ■ ■ ■
    src/test/java/Test.java
     1 +import com.nccgroup.loggerplusplus.LoggerPlusPlus;
     2 + 
    1 3  import java.lang.reflect.Method;
     4 +import java.util.ArrayList;
     5 +import java.util.Arrays;
     6 +import java.util.List;
    2 7   
    3 8  public class Test {
    4 9   public static void main(String[] args) {
    5 10   try {
    6 11   Method main = Class.forName("burp.StartBurp").getMethod("main", String[].class);
    7  - main.invoke(null, (Object) args);
     12 + ArrayList<String> argList = new ArrayList<>(Arrays.stream(args).toList());
     13 + argList.add("--developer-extension-class-name=" + LoggerPlusPlus.class.getName());
     14 + main.invoke(null, (Object) argList.toArray(new String[]{}));
    8 15   }catch (Exception e){
    9 16   System.err.println("Cannot start burp. Check the burp jar is correctly included in the classpath.");
     17 + e.printStackTrace();
    10 18   }
    11 19   }
    12 20  }
    skipped 1 lines
Please wait...
Page is in error, reload to recover