Projects STRLCPY LoggerPlusPlus Commits de74e23c
🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filterlibrary/FilterLibraryController.java
    skipped 38 lines
    39 39   }
    40 40   
    41 41   public void addFilter(SavedFilter savedFilter){
     42 + int index;
    42 43   synchronized (this.savedFilters) {
    43 44   this.savedFilters.add(savedFilter);
     45 + index = this.savedFilters.size()-1;
    44 46   }
    45 47   for (FilterLibraryListener listener : this.listeners) {
    46 48   try{
    47  - listener.onFilterAdded(savedFilter);
     49 + listener.onFilterAdded(savedFilter, index);
    48 50   }catch (Exception e){
    49 51   e.printStackTrace();
    50 52   }
    skipped 2 lines
    53 55   }
    54 56   
    55 57   public void removeFilter(SavedFilter filter){
     58 + int index;
    56 59   synchronized (this.savedFilters){
    57  - this.savedFilters.remove(filter);
     60 + index = this.savedFilters.indexOf(filter);
     61 + this.savedFilters.remove(index);
    58 62   }
    59 63   for (FilterLibraryListener listener : this.listeners) {
    60 64   try{
    61  - listener.onFilterRemoved(filter);
     65 + listener.onFilterRemoved(filter, index);
    62 66   }catch (Exception e){
    63 67   e.printStackTrace();
    64 68   }
    skipped 80 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filterlibrary/FilterLibraryListener.java
    skipped 2 lines
    3 3  import com.nccgroup.loggerplusplus.filter.savedfilter.SavedFilter;
    4 4   
    5 5  public interface FilterLibraryListener {
    6  - void onFilterAdded(SavedFilter savedFilter);
    7  - void onFilterRemoved(SavedFilter savedFilter);
    8  - void onFilterModified(SavedFilter savedFilter);
     6 + void onFilterAdded(SavedFilter savedFilter, int index);
     7 + void onFilterRemoved(SavedFilter savedFilter, int index);
     8 + void onFilterModified(SavedFilter savedFilter, int index);
    9 9  }
    10 10   
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filterlibrary/FilterLibraryPanel.java
    skipped 46 lines
    47 47   });
    48 48   
    49 49   JPanel controlPanel = new JPanel(new GridLayout(1,0));
    50  - JButton addFilterButton = new JButton("Add Filter");
     50 + JButton addFilterButton = new JButton("Add Snippet");
     51 + addFilterButton.setPreferredSize(new Dimension(0, 75));
    51 52   addFilterButton.addActionListener(actionEvent -> {
    52 53   try {
    53 54   libraryController.addFilter(new SavedFilter(LoggerPlusPlus.instance.getLibraryController(),
    skipped 3 lines
    57 58   }
    58 59   });
    59 60   JButton removeSelectedButton = new JButton("Remove Selected");
     61 + removeSelectedButton.setMinimumSize(new Dimension(0, 75));
    60 62   removeSelectedButton.addActionListener(actionEvent -> {
    61 63   int selectedRow = libraryTable.getSelectedRow();
    62 64   if(selectedRow == -1) return;
    skipped 12 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filterlibrary/FilterLibraryTableModel.java
    skipped 14 lines
    15 15   private final FilterLibraryController controller;
    16 16   JButton btnApplyFilter;
    17 17   JButton btnSetColorFilter;
    18  - private final String[] columnNames = {"Alias", "LogFilter", "", ""};
     18 + private final String[] columnNames = {"Alias", "Snippet", "", ""};
    19 19   
    20 20   public FilterLibraryTableModel(FilterLibraryController controller){
    21 21   this.controller = controller;
    skipped 78 lines
    100 100   }
    101 101   
    102 102   @Override
    103  - public void onFilterAdded(SavedFilter savedFilter) {
     103 + public void onFilterAdded(SavedFilter savedFilter, int index) {
    104 104   int rows = getRowCount();
    105 105   SwingUtilities.invokeLater(() -> {
    106  - this.fireTableRowsInserted(rows-1, rows-1);
     106 + this.fireTableRowsInserted(index, index);
    107 107   });
    108 108   }
    109 109   
    110 110   @Override
    111  - public void onFilterModified(SavedFilter savedFilter) {
     111 + public void onFilterModified(SavedFilter savedFilter, int index) {
    112 112   SwingUtilities.invokeLater(() -> {
    113  - int index = controller.getSavedFilters().indexOf(savedFilter);
    114  - if (index > 0) this.fireTableRowsUpdated(index, index);
     113 + this.fireTableRowsUpdated(index, index);
    115 114   });
    116 115   }
    117 116   
    118 117   @Override
    119  - public void onFilterRemoved(SavedFilter savedFilter) {
     118 + public void onFilterRemoved(SavedFilter savedFilter, int index) {
    120 119   SwingUtilities.invokeLater(() -> {
    121  - int index = controller.getSavedFilters().indexOf(savedFilter);
    122  - if (index > 0) this.fireTableRowsDeleted(index, index);
     120 + this.fireTableRowsDeleted(index, index);
    123 121   });
    124 122   }
    125 123  }
    skipped 1 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/LogEntryField.java
    skipped 122 lines
    123 123   }
    124 124   
    125 125   public String getDescriptiveMessage(){
    126  - return String.format("Field: %s\nDescription: %s", String.join(", ", labels), description);
     126 + return String.format("Field: <b>%s</b>\nType: %s\nDescription: %s", String.join(", ", labels), type.getSimpleName(), description);
    127 127   }
    128 128   
    129 129   @Override
    skipped 6 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/HelpPanel.java
    1 1  package com.nccgroup.loggerplusplus.userinterface;
    2 2   
     3 +import com.coreyd97.BurpExtenderUtilities.Alignment;
     4 +import com.coreyd97.BurpExtenderUtilities.PanelBuilder;
     5 +import com.nccgroup.loggerplusplus.logentry.FieldGroup;
     6 +import com.nccgroup.loggerplusplus.logentry.LogEntry;
     7 +import com.nccgroup.loggerplusplus.logentry.LogEntryField;
     8 + 
    3 9  import javax.swing.*;
     10 +import javax.swing.event.HyperlinkEvent;
    4 11  import javax.swing.text.html.HTMLEditorKit;
    5 12  import java.awt.*;
     13 +import java.awt.event.MouseAdapter;
     14 +import java.awt.event.MouseEvent;
     15 +import java.util.ArrayList;
    6 16   
    7 17  /**
    8 18   * Created by corey on 27/08/17.
    9 19   */
    10 20  public class HelpPanel extends JPanel {
    11 21   
    12  - JTextPane overviewPane;
    13  - JTextPane fieldPane;
    14  - JTabbedPane contentPane;
     22 + public HelpPanel(){
     23 + setup();
     24 + this.addMouseListener(new MouseAdapter() {
     25 + @Override
     26 + public void mouseClicked(MouseEvent e) {
     27 + if(SwingUtilities.isRightMouseButton(e)){
     28 + HelpPanel.this.removeAll();
     29 + setup();
     30 + revalidate();
     31 + repaint();
     32 + }
     33 + }
     34 + });
     35 + }
    15 36   
    16  - public HelpPanel(){
    17  - contentPane = new JTabbedPane();
     37 + private void setup(){
    18 38   this.setLayout(new BorderLayout());
    19  - ScrollablePanel scrollablePanel;
     39 + JTextPane overviewTitle = new JTextPane();
     40 + overviewTitle.setContentType("text/html");
     41 + overviewTitle.setEditable(false);
     42 + overviewTitle.setText("<html><h1>Logger++</h1>" +
     43 + "Logger++ was developed as an alternative to the log history included within Burp Suite. " +
     44 + "Advantages over the original implementation are a more comprehensive number of fields, " +
     45 + "the ability to show only specific entries to better monitor activity via the use of adaptable " +
     46 + "filters from various fields and row coloring to highlight interesting entries which match a specific filter.");
    20 47   
    21  - overviewPane = new JTextPane();
     48 + JTextPane overviewPane = new JTextPane();
    22 49   overviewPane.setContentType("text/html");
    23 50   overviewPane.setEditable(false);
    24 51   overviewPane.setEditorKit(new HTMLEditorKit());
    25  - overviewPane.setText("<html><h1>Logger++</h1><span>Logger++ was developed as an alternative to the log history included within Burp Suite. Advantages over the original implementation are a more comprehensive number of fields, the ability to show only specific entries to better monitor activity via the use of adaptable filters from various fields and row coloring to highlight interesting entries which match a specific filter.</span><br /><br /><h2>Creating Filters</h2><span>Filters were developed with the intention of being highly customisable and therefore may be as simple or complex as you require. Once a filter has been entered, the color of the input field will change to reflect the validity of the filter. If a field is correctly entered, it will be converted to uppercase.</span><br /><br /><span>The basic format of a filter is:</span> <i>FIELD OP VALUE</i><br /><b>FIELD:</b> Most fields are self-descriptively named however to find the name of a filter, right clicking the grepTable header in the field will display the grepTable name and it's filter name in brackets (). <br /><i>E.g. Extension (UrlExtension)</i><br /><b>OP:</b> Comparison operation. <i>Valid operations are <, >, <=, >=, !=, ==.</i><br /><b>VALUE:</b> String, numerical or regex value.<br /><br />Multiple filters can be combined using && and || operators and can be nested on multiple levels.<br />E.g. FILTER && FILTER<br />FILTER || FILTER<br />FILTER && (FILTER || FILTER)<br />FILTER || (FILTER && (FILTER || FILTER))<br /><br /><h2>Using Regular Expressions</h2><span>Instead of static groups, regular expressions can be used within filters. To do so simply wrap the regular expression with forward slashes such as /regex/<br />To restrict results to groups which are an exact match, i.e non partial matches, anchors should be placed on either side of the word.</span><br/><span>E.g. QUERY == /^u?id=0$/</span><br /><br /><h2>Color Filters</h2><span>In addition to standard filters, color filters can be set by clicking the 'Colorize' button in the main tab. To add a filter press the add button and enter a filter as above, and optionally set the title, foreground and background colors. Changes are saved on pressing the close button. </span><br /><br /><h2>Tips and Tricks</h2><span>Filters can be generated by right clicking a log entry field, or right clicking within a request / response viewer with selected text.<br /></span>");
     52 + overviewPane.setText("<html>" +
     53 + "<h2>Creating Filters</h2>" +
     54 + "Filters were developed with the intention of being highly customisable and therefore may be " +
     55 + "as simple or complex as you require. Once a filter has been entered, the color of the input field " +
     56 + "will change to reflect the validity of the filter.<br />" +
     57 + "<br/>" +
     58 + "Basic filters take the form: <b>Field Operation Value</b><br>" +
     59 + "See <a href=\"#aliases\">Aliases</a> for info on defining reusable filter snippets which can be used in log and color filters." +
     60 + "<h3>Filter Fields</h3>" +
     61 + "With the new parser, fields have been separated into groups. A list of fields and their group can be found to the right.<br />" +
     62 + "<i>E.g. Request.Method</i><br />" +
     63 + "<h3>Basic operations</h3>" +
     64 + "Comparative operation to be evaluated.<br>" +
     65 + "<br>" +
     66 + "== - Equal, valid on all fields.<br>" +
     67 + "!= - Not Equal, valid on all fields.<br>" +
     68 + "&lt; - Less Than, only valid on numeric fields (Integer, Short, Date, ...)<br>" +
     69 + "&gt; - Greater Than, only valid on numeric fields (Integer, Short, Date, ...)<br>" +
     70 + "&lt;= - Less Than Or Equal, only valid on numeric fields (Integer, Short, Date, ...)<br>" +
     71 + "&gt;= - Greater Than Or Equal, only valid on numeric fields (Integer, Short, Date, ...)<br>" +
     72 + "<br />" +
     73 + "<h3>Special operations</h3>" +
     74 + "CONTAINS - True if value is found anywhere in the string<br>" +
     75 + "<ul><li>Request.Body <b>CONTAINS</b> \"SEARCHVALUE\"</li></ul>" +
     76 + "IN - True if value is found within the provided array<br>" +
     77 + "<ul><li>Response.InferredType <b>IN</b> [\"JSON\", \"HTML\", \"XML\"]</li></ul>" +
     78 + "MATCHES - True if value matches the provided regular expression<br>" +
     79 + "Note: <i>The matches operation expects the entire string to match the expression. <br>" +
     80 + "See <a href=\"#regex\">Regular Expressions</a> for more info on regular expressions.</i>" +
     81 + "<ul><li>Request.Path <b>MATCHES</b> \"/api/(account|payments)/.*\"</li></ul>" +
     82 + "<br>" +
     83 + "<h3>Compound Operations</h3>" +
     84 + "Multiple filters can be combined into compound filters using the following operators.<br>" +
     85 + "<br>" +
     86 + "&&, AND - True only if all components evaluate to true.<br>" +
     87 + "||, OR - True if any one of the components evaluates to true.<br>" +
     88 + "^, XOR - True only if components differ in evaluation result.<br>" +
     89 + "<br>" +
     90 + "Note: <i>Compound operations cannot be mixed without explicitly specifying order of precedence using parenthesis</i><br>" +
     91 + "Request.Body == \"A\" AND Response.Status == 200 OR Response.Status == 302 - <b>Invalid</b><br>" +
     92 + "Request.Body == \"A\" AND ( Response.Status == 200 OR Response.Status == 302 ) - <b>Valid</b><br>" +
     93 + "<br />" +
     94 + "<h3>Expression Negation</h3>" +
     95 + "Sometimes, you may wish to match only entries which do not match a certain filter.<br>" +
     96 + "This can be achieved by wrapping the section of the filter to negate like follows.<br>" +
     97 + "<ul><li><b>!(</b> Request.Body CONTAINS \"CSRF\" <b>)</b></li></ul>" +
     98 + "<br>" +
     99 + "<a name=\"regex\"><h3>Regular Expressions</h3>" +
     100 + "In addition to the MATCHES operator, regular expressions can also be used with the == and != operators.<br>" +
     101 + "To do so simply wrap the regular expression with forward slashes like /regex/<br />" +
     102 + "<ul><li>Request.QueryParams == <b>/</b>u?id=0<b>/</b></li></ul><br />" +
     103 + "<hr>" +
     104 + "<a name=\"aliases\"><h2>Aliases</h2>" +
     105 + "Aliases are reusable filter snippets which can be used in both log and color filters.<br>" +
     106 + "For example, you may wish to define an alias for POST requests without a CSRF parameter.<br>" +
     107 + "The \"Filter Library\" tab of the extension can be used to view and manage the available aliases,<br>" +
     108 + "to add an alias, click the 'Add Snippet' button at the bottom of the panel, add your snippet and set an appropriate alias for it.<br>" +
     109 + "<br>" +
     110 + "To use a defined alias in a log or color filter, prefix the alias name with the # symbol as shown in the below examples." +
     111 + "<ul>" +
     112 + "<li><b>#ALIAS_NAME</b></li>" +
     113 + "<li>Response.Status == 200 OR <b>#ALIAS_NAME</b></li>" +
     114 + "<li>!( <b>#ALIAS_NAME</b> )</li>" +
     115 + "</ul>" +
     116 + "<br>" +
     117 + "<hr>" +
     118 + "<h2>Color Filters</h2>" +
     119 + "In addition to standard filters, color filters can be set by clicking the 'Colorize' button in the main tab.<br>" +
     120 + "To add a filter press the add button and enter a filter as above, and optionally set the title, foreground and background colors.<br>" +
     121 + "Changes can be observed instantly.<br />" +
     122 + "<br>" +
     123 + "<hr>" +
     124 + "<h2>Tips and Tricks</h2>" +
     125 + "<ul>" +
     126 + "<li>Filters can be generated by right clicking a log entry field, or right clicking within a request / response viewer with selected text.</li>" +
     127 + "<li>Right-clicking in the main filter text box will show a dropdown list of the available fields to be used.</li>" +
     128 + "</ul>");
     129 + overviewPane.addHyperlinkListener(e -> {
     130 + if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){
     131 + if(e.getDescription().startsWith("#")){
     132 + overviewPane.scrollToReference(e.getDescription().substring(1));
     133 + }
     134 + }
     135 + });
    26 136   
    27  - scrollablePanel = new ScrollablePanel();
    28  - scrollablePanel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
    29  - scrollablePanel.setLayout(new BorderLayout());
    30  - scrollablePanel.add(overviewPane);
     137 + JTextPane fieldTitle = new JTextPane();
     138 + fieldTitle.setContentType("text/html");
     139 + fieldTitle.setEditable(false);
     140 + fieldTitle.setText("<html><h1>Filter Fields</h1>" +
     141 + "A number of fields are available to use from the requests within your filters. These are listed below.");
    31 142   
    32  - contentPane.addTab("Overview", new JScrollPane(scrollablePanel));
    33  - 
    34  - fieldPane = new JTextPane();
     143 + JTextPane fieldPane = new JTextPane();
    35 144   fieldPane.setContentType("text/html");
    36 145   fieldPane.setEditable(false);
    37 146   fieldPane.setEditorKit(new HTMLEditorKit());
    38  - //TODO: Rewrite below
    39  - fieldPane.setText("<html><h1>Filter Fields</h1><h2>THIS INFO IS CURRENTLY OUT OF DATE AND NEEDS TO BE REWRITTEN. </h2><span>A number of fields are available to use from the requests within your filters. These are listed below.<br /><br /><b>Request</b> - The request body.<br /><br /><b>RequestHeaders</b> - The request line and associated headers.<br /><br /><b>Response</b> - The response body.<br /><br /><b>ResponseHeaders</b> - The status line and associated headers<br /><br /><b>Number</b> - Item table number, note this may change as old requests are deleted.<br /><br /><b>Tool</b> - Tool name [Target,Proxy,Spider,Scanner,Intruder,Repeater,Sequencer]<br /><br /><b>Host</b> - Host and Protocol (similar to the Proxy tab)<br /><br /><b>Method</b> - HTTP request method<br /><br /><b>Url</b> - Destination relative URL<br /><br /><b>Path</b> - Destination relative filepath<br /><br /><b>Query</b> - Query string used in GET requests<br /><br /><b>Params</b> - Indicates whether or not the request has GET or POST parameter(s) [True, False]<br /><br /><b>Status</b> - Numerical response code<br /><br /><b>ResponseLength</b> - Length of response<br /><br /><b>MimeType</b> - MIME / Response content type specified in header<br /><br /><b>UrlExtension</b> - Target page extension <br /><br /><b>Comment</b> - Editable comment<br /><br /><b>IsSSL</b> - Indicates whether or not the HTTP protocol is HTTPS [True, False]<br /><br /><b>NewCookies</b> - Shows any new cookies in the response <br /><br /><b>RequestTime</b> - Date and time of inital request (as received by burp)<br /><br /><b>ResponseTime</b> - Date and time of receiving the response (as received by burp)<br /><br /><b>ListenerInterface</b> - Shows the proxy listener interface for proxied requests<br /><br /><b>ClientIP</b> - Shows the client IP address when using the Proxy tab<br /><br /><b>ResponseContentType</b> - Shows the content-type header in the response<br /><br /><b>InferredType</b> - Shows the content type which was inferred by Burp [HTML,SCRIPT,PNG,GIF,...] via http message content<br /><br /><b>HasQueryStringParam</b> - Indicates whether or not the request has any querystring parameters [True, False]<br /><br /><b>HasBodyParam</b> - Indicates whether or not the request contains any POST parameters [True, False]<br /><br /><b>HasCookieParam</b> - Indicates whether or not the request has any Cookie parameters [True, False]<br /><br /><b>SentCookies</b> - Shows the cookies which was sent in the request<br /><br /><b>UsesCookieJar</b> - Compares the cookies with the cookie jar ones to see if any of them in use [Yes, No, Partially]<br /><br /><b>Protocol</b> - Shows the request protocol<br /><br /><b>Hostname</b> - Shows the request host name<br /><br /><b>TargetPort</b> - Shows the target port number<br /><br /><b>RequestContentType</b> - Shows the request content-type header<br /><br /><b>Referrer</b> - Shows the referer header<br /><br /><b>RequestLength</b> - Shows the request body length<br /><br /><b>HasSetCookies</b> - Indicates whether or not the response contains the set-cookie header<br /><br /><b>Regex1Req</b> - Custom regular expression for request header/body<br /><br /><b>Regex2Req</b> - Custom regular expression for request header/body<br /><br /><b>Regex3Req</b> - Custom regular expression for request header/body<br /><br /><b>Regex4Req</b> - Custom regular expression for request header/body<br /><br /><b>Regex5Req</b> - Custom regular expression for request header/body<br /><br /><b>Regex1Resp</b> - Custom regular expression for response header/body<br /><br /><b>Regex2Resp</b> - Custom regular expression for response header/body<br /><br /><b>Regex3Resp</b> - Custom regular expression for response header/body<br /><br /><b>Regex4Resp</b> - Custom regular expression for response header/body<br /><br /><b>Regex5Resp</b> - Custom regular expression for response header/body</span>");
     147 + fieldPane.setText(getFormattedFields(FieldGroup.REQUEST) +
     148 + getFormattedFields(FieldGroup.RESPONSE) +
     149 + getFormattedFields(FieldGroup.PROXY));
    40 150   
    41  - scrollablePanel = new ScrollablePanel();
    42  - scrollablePanel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
    43  - scrollablePanel.setLayout(new BorderLayout());
    44  - scrollablePanel.add(fieldPane);
     151 + JScrollPane overviewScroll = new JScrollPane(overviewPane);
     152 + JScrollPane fieldScroll = new JScrollPane(fieldPane);
    45 153   
    46  - contentPane.addTab("Filter Fields", new JScrollPane(scrollablePanel));
     154 + Component separator = new JSeparator(JSeparator.VERTICAL);
     155 + PanelBuilder panelBuilder = new PanelBuilder();
     156 + JPanel panel = panelBuilder.build(new Component[][]{
     157 + new Component[]{overviewTitle, separator, fieldTitle},
     158 + new Component[]{overviewScroll, separator, fieldScroll}
     159 + }, new int[][]{ new int[]{0, 0, 0},
     160 + new int[]{1, 0, 1}
     161 + }, Alignment.FILL, 1.0, 1.0);
     162 + 
     163 + this.add(panel, BorderLayout.CENTER);
     164 + }
    47 165   
    48  - this.add(contentPane, BorderLayout.CENTER);
     166 + private String getFormattedFields(FieldGroup fieldGroup){
     167 + StringBuilder output = new StringBuilder();
     168 + ArrayList<LogEntryField> fields = new ArrayList<>(LogEntryField.getFieldsInGroup(fieldGroup));
     169 + for (int i = 0; i < fields.size(); i++) {
     170 + if(i != 0) output.append("<br><br>");
     171 + output.append(fields.get(i).getDescriptiveMessage().replaceAll("\n", "<br>"));
     172 + }
     173 + return String.format("<h3>Group: %s</h3><hr>%s<br><br>", fieldGroup.getLabel(), output.toString());
    49 174   }
    50 175   
    51 176  // @Override
    skipped 6 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/Globals.java
    skipped 61 lines
    62 62   private static int colModelIndex = 0;
    63 63   private static int colOrder = 0;
    64 64   public static final String DEFAULT_LOG_TABLE_COLUMNS_JSON = new StringBuilder().append("[")
    65  - .append("{'id':" + NUMBER + ",'index':" + (colModelIndex++) + ",'name':'Number','defaultVisibleName':'#','visibleName':'#','preferredWidth':35,'type':'int','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Item index number','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
     65 + .append("{'id':" + NUMBER + ",'index':" + (colModelIndex++) + ",'name':'Number','defaultVisibleName':'#','visibleName':'#','preferredWidth':65,'type':'int','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Item index number','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    66 66   .append("{'id':" + COMPLETE + ",'index':" + (colModelIndex++) + ",'name':'Complete','defaultVisibleName':'Complete','visibleName':'Complete','preferredWidth':80,'type':'boolean','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Indicates if a response has been received.','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    67 67   .append("{'id':" + PROXY_TOOL + ",'index':" + (colModelIndex++) + ",'name':'Tool','defaultVisibleName':'Tool','visibleName':'Tool','preferredWidth':70,'type':'string','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Tool name','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    68 68   .append("{'id':" + METHOD + ",'index':" + (colModelIndex++) + ",'name':'Method','defaultVisibleName':'Method','visibleName':'Method','preferredWidth':65,'type':'string','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'HTTP request method','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    skipped 13 lines
    82 82   .append("{'id':" + COMMENT + ",'index':" + (colModelIndex++) + ",'name':'Comment','defaultVisibleName':'Comment','visibleName':'Comment','preferredWidth':200,'type':'string','readonly':false,'order':" + colOrder++ + ",'visible':true,'description':'Editable comment','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    83 83   .append("{'id':" + URL + ",'index':" + (colModelIndex++) + ",'name':'Url','defaultVisibleName':'URL','visibleName':'URL','preferredWidth':250,'type':'string','readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'Complete URL','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    84 84   .append("{'id':" + MIME_TYPE + ",'index':" + (colModelIndex++) + ",'name':'MimeType','defaultVisibleName':'MIME type','visibleName':'MIME type','preferredWidth':100,'type':'string','readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'Response content type sent by the server','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    85  - .append("{'id':" + NEW_COOKIES + ",'index':" + (colModelIndex++) + ",'name':'NewCookies','defaultVisibleName':'New Cookies','visibleName':'New Cookies','preferredWidth':150,'type':'string','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Shows any new cookies in the response','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
     85 + .append("{'id':" + NEW_COOKIES + ",'index':" + (colModelIndex++) + ",'name':'NewCookies','defaultVisibleName':'New Cookies','visibleName':'New Cookies','preferredWidth':125,'type':'string','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Shows any new cookies in the response','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    86 86   .append("{'id':" + REQUEST_TIME + ",'index':" + (colModelIndex++) + ",'name':'RequestTime','defaultVisibleName':'Request Time','visibleName':'Request Time','preferredWidth':150,'type':'string','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Shows date and time of making the request in this extension','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    87 87   .append("{'id':" + RESPONSE_TIME + ",'index':" + (colModelIndex++) + ",'name':'ResponseTime','defaultVisibleName':'Response Time','visibleName':'Response Time','preferredWidth':150,'type':'string','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Shows date and time of receiving the response in this extension','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    88 88   .append("{'id':" + RTT + ",'index':" + (colModelIndex++) + ",'name':'RTT','defaultVisibleName':'RTT (ms)','visibleName':'RTT (ms)','preferredWidth':100,'type':'int','readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'Shows delay between making the request, and receiving the response. Note: Includes BurpSuite processing time','isRegEx':false,'regExString':'','regExCaseSensitive':false},")
    skipped 34 lines
Please wait...
Page is in error, reload to recover