Projects STRLCPY LoggerPlusPlus Commits 4d713531
🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filter/colorfilter/ColorFilterListener.java
    skipped 4 lines
    5 5   */
    6 6  public interface ColorFilterListener {
    7 7   
    8  - void onFilterChange(ColorFilter filter);
    9  - void onFilterAdd(ColorFilter filter);
    10  - void onFilterRemove(ColorFilter filter);
     8 + void onColorFilterChange(ColorFilter filter);
     9 + 
     10 + void onColorFilterAdd(ColorFilter filter);
     11 + 
     12 + void onColorFilterRemove(ColorFilter filter);
    11 13  }
    12 14   
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filterlibrary/FilterLibraryController.java
    skipped 4 lines
    5 5  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    6 6  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilterListener;
    7 7  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
     8 +import com.nccgroup.loggerplusplus.filter.savedfilter.SavedFilter;
     9 +import com.nccgroup.loggerplusplus.filter.tag.Tag;
     10 +import com.nccgroup.loggerplusplus.filter.tag.TagListener;
    8 11  import com.nccgroup.loggerplusplus.preferences.PreferencesController;
    9 12  import com.nccgroup.loggerplusplus.util.Globals;
    10  -import com.nccgroup.loggerplusplus.filter.savedfilter.SavedFilter;
     13 +import org.apache.logging.log4j.LogManager;
     14 +import org.apache.logging.log4j.Logger;
    11 15   
    12 16  import java.awt.*;
    13 17  import java.util.ArrayList;
    skipped 9 lines
    23 27   private final ArrayList<SavedFilter> savedFilters;
    24 28   private final HashMap<UUID, ColorFilter> colorFilters;
    25 29   private final ArrayList<ColorFilterListener> colorFilterListeners;
     30 + private final HashMap<UUID, Tag> tagFilters;
     31 + private final ArrayList<TagListener> tagListeners;
    26 32   
    27  - public FilterLibraryController(LoggerPlusPlus loggerPlusPlus, PreferencesController preferencesController){
     33 + Logger logger = LogManager.getLogger(this);
     34 + 
     35 + public FilterLibraryController(LoggerPlusPlus loggerPlusPlus, PreferencesController preferencesController) {
    28 36   this.loggerPlusPlus = loggerPlusPlus;
    29 37   this.preferences = preferencesController.getPreferences();
    30 38   this.listeners = new ArrayList<>();
    31 39   this.colorFilterListeners = new ArrayList<>();
     40 + this.tagListeners = new ArrayList<>();
    32 41   this.savedFilters = preferences.getSetting(Globals.PREF_SAVED_FILTERS);
    33 42   this.colorFilters = preferences.getSetting(Globals.PREF_COLOR_FILTERS);
     43 + this.tagFilters = preferences.getSetting(Globals.PREF_TAG_FILTERS);
    34 44   this.panel = new FilterLibraryPanel(this);
    35 45   }
    36 46   
    skipped 70 lines
    107 117   
    108 118   for (ColorFilterListener colorFilterListener : this.colorFilterListeners) {
    109 119   try {
    110  - colorFilterListener.onFilterAdd(colorFilter);
    111  - }catch (Exception ignored){}
     120 + colorFilterListener.onColorFilterAdd(colorFilter);
     121 + } catch (Exception e) {
     122 + logger.error(e);
     123 + }
    112 124   }
    113 125   saveColorFilters();
    114 126   }
    skipped 4 lines
    119 131   }
    120 132   for (ColorFilterListener listener : this.colorFilterListeners) {
    121 133   try{
    122  - listener.onFilterRemove(colorFilter);
     134 + listener.onColorFilterRemove(colorFilter);
    123 135   }catch (Exception e){
    124  - e.printStackTrace();
     136 + logger.error(e);
    125 137   }
    126 138   }
    127 139   saveColorFilters();
    skipped 3 lines
    131 143   public void updateColorFilter(ColorFilter colorFilter){
    132 144   for (ColorFilterListener listener : this.colorFilterListeners) {
    133 145   try{
    134  - listener.onFilterChange(colorFilter);
     146 + listener.onColorFilterChange(colorFilter);
    135 147   }catch (Exception e){
    136  - e.printStackTrace();
     148 + logger.error(e);
    137 149   }
    138 150   }
    139 151   saveColorFilters();
    skipped 3 lines
    143 155   this.preferences.setSetting(Globals.PREF_COLOR_FILTERS, colorFilters);
    144 156   }
    145 157   
    146  - public void addColorFilterListener(ColorFilterListener listener){
     158 + public void addColorFilterListener(ColorFilterListener listener) {
    147 159   this.colorFilterListeners.add(listener);
    148 160   }
    149 161   
    150  - public void removeColorFilterListener(ColorFilterListener listener){
     162 + public void removeColorFilterListener(ColorFilterListener listener) {
    151 163   this.colorFilterListeners.remove(listener);
    152 164   }
    153 165   
     166 + public HashMap<UUID, Tag> getTags() {
     167 + return tagFilters;
     168 + }
     169 + 
     170 + public void addTag(Tag tag) {
     171 + this.tagFilters.put(tag.getUUID(), tag);
     172 + 
     173 + for (TagListener listener : this.tagListeners) {
     174 + try {
     175 + listener.onTagAdd(tag);
     176 + } catch (Exception error) {
     177 + logger.error(error);
     178 + }
     179 + }
     180 + saveTags();
     181 + }
     182 + 
     183 + public void removeTag(Tag tag) {
     184 + synchronized (this.tagFilters) {
     185 + this.tagFilters.remove(tag.getUUID());
     186 + }
     187 + for (TagListener listener : this.tagListeners) {
     188 + try {
     189 + listener.onTagRemove(tag);
     190 + } catch (Exception error) {
     191 + logger.error(error);
     192 + }
     193 + }
     194 + saveTags();
     195 + }
     196 + 
     197 + //Called when a filter is modified.
     198 + public void updateTag(Tag tag) {
     199 + for (TagListener listener : this.tagListeners) {
     200 + try {
     201 + listener.onTagChange(tag);
     202 + } catch (Exception e) {
     203 + logger.error(e);
     204 + }
     205 + }
     206 + saveTags();
     207 + }
     208 + 
     209 + public void saveTags() {
     210 + this.preferences.setSetting(Globals.PREF_TAG_FILTERS, tagFilters);
     211 + }
     212 + 
     213 + public void addTagListener(TagListener listener) {
     214 + this.tagListeners.add(listener);
     215 + }
     216 + 
     217 + public void removeTagListener(TagListener listener) {
     218 + this.tagListeners.remove(listener);
     219 + }
    154 220   
    155 221  }
    156 222   
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/help/HelpPanel.java
    skipped 169 lines
    170 170   fieldPane.setDocument(doc);
    171 171   fieldPane.setText("<body>" + getFormattedFields(FieldGroup.REQUEST) +
    172 172   getFormattedFields(FieldGroup.RESPONSE) +
    173  - getFormattedFields(FieldGroup.PROXY) + "</body>");
     173 + getFormattedFields(FieldGroup.ENTRY) + "</body>");
    174 174   
    175 175   JScrollPane overviewScroll = new JScrollPane(overviewPane);
    176 176   JScrollPane fieldScroll = new JScrollPane(fieldPane);
    skipped 29 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/FieldGroup.java
    1 1  package com.nccgroup.loggerplusplus.logentry;
    2 2   
     3 +import java.util.Arrays;
    3 4  import java.util.HashMap;
     5 +import java.util.List;
    4 6   
    5 7  public enum FieldGroup {
    6  - PROXY("Proxy"),
     8 + ENTRY("Entry", "Log", "Proxy"),
    7 9   REQUEST("Request"),
    8 10   RESPONSE("Response");
    9 11   private String label;
     12 + private List<String> additionalLabels;
    10 13   
    11 14   private static final HashMap<String, FieldGroup> groupLabelMap = new HashMap<>();
     15 + 
    12 16   static {
    13 17   for (FieldGroup fieldGroup : FieldGroup.values()) {
    14 18   groupLabelMap.put(fieldGroup.label.toUpperCase(), fieldGroup);
     19 + fieldGroup.additionalLabels.forEach(label -> groupLabelMap.put(label.toUpperCase(), fieldGroup));
    15 20   }
    16 21   }
    17 22   
    18  - FieldGroup(String label){
    19  - this.label = label;
     23 + FieldGroup(String primaryLabel, String... labels) {
     24 + this.label = primaryLabel;
     25 + additionalLabels = Arrays.asList(labels);
    20 26   }
    21 27   
    22 28   public String getLabel() {
    23 29   return label;
    24 30   }
    25 31   
    26  - public static FieldGroup findByLabel(String label){
     32 + public static FieldGroup findByLabel(String label) {
    27 33   return groupLabelMap.get(label.toUpperCase());
    28 34   }
    29 35  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/LogEntry.java
    skipped 15 lines
    16 16  import burp.*;
    17 17  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    18 18  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
     19 +import com.nccgroup.loggerplusplus.filter.tag.Tag;
    19 20  import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
    20 21  import com.nccgroup.loggerplusplus.reflection.ReflectionController;
    21 22  import com.nccgroup.loggerplusplus.util.Globals;
    skipped 50 lines
    72 73   // public String[] regexAllResp = {"","","","",""};
    73 74   
    74 75   public List<UUID> matchingColorFilters;
     76 + public List<Tag> matchingTags;
    75 77   public String formattedRequestTime;
    76 78   public Date responseDateTime;
    77 79   public Date requestDateTime;
    skipped 7 lines
    85 87   private LogEntry() {
    86 88   this.identifier = UUID.randomUUID();
    87 89   this.matchingColorFilters = Collections.synchronizedList(new ArrayList<UUID>());
     90 + this.matchingTags = Collections.synchronizedList(new ArrayList<Tag>());
    88 91   }
    89 92   
    90 93   public LogEntry(int tool, IHttpRequestResponse requestResponse) {
    skipped 385 lines
    476 479   case PROXY_TOOL:
    477 480   case REQUEST_TOOL:
    478 481   return toolName;
     482 + case TAGS:
     483 + return this.matchingTags.stream().map(Tag::getName).collect(Collectors.toList());
    479 484   case URL:
    480 485   return this.url;
    481 486   case PATH:
    skipped 103 lines
    585 590   case RTT:
    586 591   return requestResponseDelay;
    587 592   case REQUEST_HEADERS:
    588  - return requestHeaders != null ? requestHeaders : "";
     593 + return requestHeaders != null ? String.join("\r\n", requestHeaders) : "";
    589 594   case RESPONSE_HEADERS:
    590  - return responseHeaders != null ? responseHeaders : "";
     595 + return responseHeaders != null ? String.join("\r\n", responseHeaders) : "";
    591 596   case BASE64_REQUEST:
    592 597   return Base64.getEncoder().encodeToString(requestResponse.getRequest());
    593 598   case BASE64_RESPONSE:
    skipped 15 lines
    609 614   
    610 615   public List<UUID> getMatchingColorFilters() {
    611 616   return matchingColorFilters;
     617 + }
     618 + 
     619 + public List<Tag> getMatchingTags() {
     620 + return matchingTags;
    612 621   }
    613 622   
    614 623   public enum CookieJarStatus {
    skipped 42 lines
    657 666   }
    658 667   }
    659 668   
     669 + /*
     670 + * @param Tag
     671 + * @param retest
     672 + * @return If the list of matching color filters was updated
     673 + */
     674 + public boolean testTag(Tag tag, boolean retest) {
     675 + if (!tag.isEnabled() || tag.getFilter() == null) {
     676 + return this.getMatchingTags().remove(tag);
     677 + }
     678 + 
     679 + // If we don't already know if the color filter matches (e.g. haven't checked it
     680 + // before)
     681 + if (!this.matchingTags.contains(tag)) {
     682 + if (tag.getFilter().matches(this)) {
     683 + this.matchingTags.add(tag);
     684 + return true;
     685 + } else {
     686 + return false;
     687 + }
     688 + } else if (retest) { // Or if we are forcing a retest (e.g. filter was updated)
     689 + if (!tag.getFilter().matches(this)) {
     690 + this.matchingTags.remove(tag);
     691 + }
     692 + return true;
     693 + } else {
     694 + return false;
     695 + }
     696 + }
     697 + 
    660 698   @Override
    661 699   public String toString() {
    662  - return this.url.toString();
     700 + return this.status + " " + this.url.toString();
    663 701   }
    664 702  }
    665 703   
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/LogEntryField.java
    skipped 7 lines
    8 8  public enum LogEntryField {
    9 9   
    10 10   //Proxy
    11  - NUMBER(FieldGroup.PROXY, Integer.class, "Item table number. Not valid for filter use.", "Number"),
    12  - PROXY_TOOL(FieldGroup.PROXY, String.class, "Originating tool name. Extension generated requests will be displayed as \"Extender\".", "Tool"),
    13  - LISTENER_INTERFACE(FieldGroup.PROXY, String.class, "The interface the proxied message was delivered to.", "ListenInterface", "Interface"),
    14  - CLIENT_IP(FieldGroup.PROXY, String.class, "The requesting client IP address.", "ClientIP", "ClientAddress"),
     11 + NUMBER(FieldGroup.ENTRY, Integer.class, "Item table number. Not valid for filter use.", "Number"),
     12 + PROXY_TOOL(FieldGroup.ENTRY, String.class, "Originating tool name. Extension generated requests will be displayed as \"Extender\".", "Tool"),
     13 + TAGS(FieldGroup.ENTRY, String.class, "The configured tags for which this entry match.", "Tags"),
     14 + LISTENER_INTERFACE(FieldGroup.ENTRY, String.class, "The interface the proxied message was delivered to.", "ListenInterface", "Interface"),
     15 + CLIENT_IP(FieldGroup.ENTRY, String.class, "The requesting client IP address.", "ClientIP", "ClientAddress"),
    15 16   
    16 17   //Request,
    17 18   BASE64_REQUEST(FieldGroup.REQUEST, String.class, "The entire request encoded in Base64", "AsBase64"),
    skipped 130 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/MainControlsPanel.java
    skipped 2 lines
    3 3  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    4 4  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilterController;
    5 5  import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterDialog;
     6 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.TagDialog;
    6 7   
    7 8  import javax.swing.*;
    8 9  import java.awt.*;
    skipped 17 lines
    26 27   gbc.gridx = 1;
    27 28   gbc.weightx = 99.0;
    28 29   this.add(logFilterController.getFilterField(), gbc);
     30 + 
     31 + final JButton tagsButton = new JButton("Tags");
     32 + tagsButton.addActionListener(actionEvent -> new TagDialog(LoggerPlusPlus.instance.getLibraryController()).setVisible(true));
     33 + 
     34 + gbc.gridx = 2;
     35 + gbc.weightx = 0;
     36 + this.add(tagsButton, gbc);
    29 37   
    30 38   final JButton colorFilterButton = new JButton("Colorize");
    31 39   colorFilterButton.addActionListener(actionEvent -> new ColorFilterDialog(LoggerPlusPlus.instance.getLibraryController()).setVisible(true));
    skipped 17 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/logtable/LogTableController.java
    skipped 25 lines
    26 26   this.logTable = new LogTable(this);
    27 27   
    28 28   this.filterLibraryController.addColorFilterListener(logTableModel);
     29 + this.filterLibraryController.addTagListener(logTableModel);
    29 30   }
    30 31   
    31 32   public LogViewController getLogViewController() {
    skipped 37 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/logtable/LogTableModel.java
    skipped 1 lines
    2 2   
    3 3  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    4 4  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilterListener;
     5 +import com.nccgroup.loggerplusplus.filter.tag.Tag;
     6 +import com.nccgroup.loggerplusplus.filter.tag.TagListener;
    5 7  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    6 8  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    7 9  import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
    skipped 3 lines
    11 13  import java.util.*;
    12 14   
    13 15  /* Extending AbstractTableModel to design the logTable behaviour based on the array list */
    14  -public class LogTableModel extends AbstractTableModel implements ColorFilterListener {
     16 +public class LogTableModel extends AbstractTableModel implements ColorFilterListener, TagListener {
    15 17   
    16 18   private final LogTableController controller;
    17 19   private final List<LogEntry> entries;
    skipped 106 lines
    124 126   
    125 127   // FilterListeners
    126 128   @Override
    127  - public void onFilterChange(final ColorFilter filter) {
     129 + public void onColorFilterChange(final ColorFilter filter) {
    128 130   createFilterTestingWorker(filter, filter.shouldRetest()).execute();
    129 131   }
    130 132   
    131 133   @Override
    132  - public void onFilterAdd(final ColorFilter filter) {
     134 + public void onColorFilterAdd(final ColorFilter filter) {
    133 135   if (!filter.isEnabled() || filter.getFilter() == null)
    134 136   return;
    135 137   createFilterTestingWorker(filter, false);
    136 138   }
    137 139   
    138 140   @Override
    139  - public void onFilterRemove(final ColorFilter filter) {
     141 + public void onColorFilterRemove(final ColorFilter filter) {
    140 142   if (!filter.isEnabled() || filter.getFilter() == null)
    141 143   return;
    142 144   new SwingWorker<Void, Integer>() {
    skipped 24 lines
    167 169   protected Void doInBackground() {
    168 170   for (int i = 0; i < entries.size(); i++) {
    169 171   boolean testResultChanged = entries.get(i).testColorFilter(filter, retestExisting);
     172 + if (testResultChanged) {
     173 + publish(i);
     174 + }
     175 + }
     176 + 
     177 + return null;
     178 + }
     179 + 
     180 + @Override
     181 + protected void process(List<Integer> updatedRows) {
     182 + for (Integer row : updatedRows) {
     183 + fireTableRowsUpdated(row, row);
     184 + }
     185 + }
     186 + };
     187 + }
     188 + 
     189 + //TagListeners
     190 + @Override
     191 + public void onTagChange(final Tag filter) {
     192 + createFilterTestingWorker(filter, filter.shouldRetest()).execute();
     193 + }
     194 + 
     195 + @Override
     196 + public void onTagAdd(final Tag filter) {
     197 + if (!filter.isEnabled() || filter.getFilter() == null)
     198 + return;
     199 + createFilterTestingWorker(filter, false);
     200 + }
     201 + 
     202 + @Override
     203 + public void onTagRemove(final Tag filter) {
     204 + if (!filter.isEnabled() || filter.getFilter() == null)
     205 + return;
     206 + new SwingWorker<Void, Integer>() {
     207 + @Override
     208 + protected Void doInBackground() {
     209 + for (int i = 0; i < entries.size(); i++) {
     210 + boolean wasPresent = entries.get(i).matchingTags.remove(filter);
     211 + if (wasPresent) {
     212 + publish(i);
     213 + }
     214 + }
     215 + return null;
     216 + }
     217 + 
     218 + @Override
     219 + protected void process(List<Integer> rows) {
     220 + for (Integer row : rows) {
     221 + fireTableRowsUpdated(row, row);
     222 + }
     223 + }
     224 + }.execute();
     225 + }
     226 + 
     227 + private SwingWorker<Void, Integer> createFilterTestingWorker(final Tag filter, boolean retestExisting) {
     228 + return new SwingWorker<Void, Integer>() {
     229 + 
     230 + @Override
     231 + protected Void doInBackground() {
     232 + for (int i = 0; i < entries.size(); i++) {
     233 + boolean testResultChanged = entries.get(i).testTag(filter, retestExisting);
    170 234   if (testResultChanged) {
    171 235   publish(i);
    172 236   }
    skipped 14 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/processor/LogProcessor.java
    skipped 6 lines
    7 7  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    8 8  import com.nccgroup.loggerplusplus.exports.ExportController;
    9 9  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
     10 +import com.nccgroup.loggerplusplus.filter.tag.Tag;
    10 11  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    11 12  import com.nccgroup.loggerplusplus.logentry.Status;
    12 13  import com.nccgroup.loggerplusplus.logview.logtable.LogTableController;
    skipped 201 lines
    214 215   HashMap<UUID, ColorFilter> colorFilters = preferences.getSetting(PREF_COLOR_FILTERS);
    215 216   for (ColorFilter colorFilter : colorFilters.values()) {
    216 217   logEntry.testColorFilter(colorFilter, true);
     218 + }
     219 + 
     220 + //Check against tags
     221 + HashMap<UUID, Tag> tagMap = preferences.getSetting(PREF_TAG_FILTERS);
     222 + for (Tag tag : tagMap.values()) {
     223 + logEntry.testTag(tag, true);
    217 224   }
    218 225   }
    219 226   }
    skipped 149 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/preferences/LoggerPreferenceFactory.java
    skipped 8 lines
    9 9  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    10 10  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
    11 11  import com.nccgroup.loggerplusplus.filter.savedfilter.SavedFilter;
     12 +import com.nccgroup.loggerplusplus.filter.tag.Tag;
    12 13  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    13 14  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    14 15  import com.nccgroup.loggerplusplus.logentry.LogEntryFieldSerializer;
    skipped 57 lines
    72 73   prefs.registerSetting(PREF_LOG_SEQUENCER, Boolean.class, true);
    73 74   prefs.registerSetting(PREF_LOG_EXTENDER, Boolean.class, true);
    74 75   prefs.registerSetting(PREF_LOG_TARGET_TAB, Boolean.class, true);
    75  - prefs.registerSetting(PREF_COLOR_FILTERS, new TypeToken<Map<UUID, ColorFilter>>() {}.getType(), defaultColorFilters);
    76  - prefs.registerSetting(PREF_SAVED_FILTERS, new TypeToken<List<SavedFilter>>() {}.getType(), new ArrayList<SavedFilter>());
     76 + prefs.registerSetting(PREF_COLOR_FILTERS, new TypeToken<Map<UUID, ColorFilter>>() {
     77 + }.getType(), defaultColorFilters);
     78 + prefs.registerSetting(PREF_TAG_FILTERS, new TypeToken<Map<UUID, Tag>>() {
     79 + }.getType(), new HashMap<>());
     80 + prefs.registerSetting(PREF_SAVED_FILTERS, new TypeToken<List<SavedFilter>>() {
     81 + }.getType(), new ArrayList<SavedFilter>());
    77 82   prefs.registerSetting(PREF_SORT_COLUMN, Integer.class, -1);
    78 83   prefs.registerSetting(PREF_SORT_ORDER, SortOrder.class, SortOrder.UNSORTED);
    79 84   prefs.registerSetting(PREF_RESPONSE_TIMEOUT, Integer.class, 60);
    skipped 39 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/Globals.java
    skipped 38 lines
    39 39   public static final String PREF_LOG_EXTENDER = "logextender";
    40 40   public static final String PREF_LOG_TARGET_TAB = "logtargettab";
    41 41   public static final String PREF_COLOR_FILTERS = "colorfilters";
     42 + public static final String PREF_TAG_FILTERS = "tagfilters";
    42 43   public static final String PREF_SAVED_FILTERS = "savedfilters";
    43 44   public static final String PREF_SORT_COLUMN = "sortcolumn";
    44 45   public static final String PREF_SORT_ORDER = "sortorder";
    skipped 35 lines
    80 81   "\"filter\":{\"filter\":\"Request.Complete == False\"},\"filterString\":\"Request.Complete == False\",\"backgroundColor\":{\"value\":-16777216,\"falpha\":0.0}," +
    81 82   "\"foregroundColor\":{\"value\":-65536,\"falpha\":0.0},\"enabled\":true,\"modified\":false,\"shouldRetest\":true,\"priority\":1}}";
    82 83   
    83  - public static final int CURRENT_COLUMN_VERSION = 4;
     84 + public static final int CURRENT_COLUMN_VERSION = 5;
    84 85   private static int colOrder = 0;
    85 86   public static final String DEFAULT_LOG_TABLE_COLUMNS_JSON = new StringBuilder().append("[")
    86 87   .append("{'id':" + NUMBER + ",'name':'Number','defaultVisibleName':'#','visibleName':'#','preferredWidth':65,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(NUMBER.getDescription()) + "'},")
     88 + .append("{'id':" + TAGS + ",'name':'Tags','defaultVisibleName':'Tags','visibleName':'Tags','preferredWidth':100,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(TAGS.getDescription()) + "'},")
    87 89   .append("{'id':" + COMPLETE + ",'name':'Complete','defaultVisibleName':'Complete','visibleName':'Complete','preferredWidth':80,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(COMPLETE.getDescription()) + "'},")
    88 90   .append("{'id':" + PROXY_TOOL + ",'name':'Tool','defaultVisibleName':'Tool','visibleName':'Tool','preferredWidth':70,'readonly':true,'order':" + colOrder++ + ",'visible':true,'description':'" + StringEscapeUtils.escapeJson(PROXY_TOOL.getDescription()) + "'},")
    89 91   .append("{'id':" + ISSSL + ",'name':'IsSSL','defaultVisibleName':'SSL','visibleName':'SSL','preferredWidth':50,'readonly':true,'order':" + colOrder++ + ",'visible':false,'description':'" + StringEscapeUtils.escapeJson(ISSSL.getDescription()) + "'},")
    skipped 49 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/userinterface/dialog/TagDialog.java
     1 +package com.nccgroup.loggerplusplus.util.userinterface.dialog;
     2 + 
     3 +import com.nccgroup.loggerplusplus.filter.tag.Tag;
     4 +import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
     5 + 
     6 +import javax.swing.*;
     7 +import java.awt.*;
     8 +import java.awt.event.ActionEvent;
     9 +import java.awt.event.ActionListener;
     10 +import java.awt.event.WindowEvent;
     11 + 
     12 +/**
     13 + * Created by corey on 19/07/17.
     14 + */
     15 +public class TagDialog extends JFrame {
     16 + private static TagDialog instance;
     17 + private final FilterLibraryController filterLibraryController;
     18 + private final TagTable filterTable;
     19 + 
     20 + public TagDialog(FilterLibraryController filterLibraryController) {
     21 + if (instance != null) instance.dispose();
     22 + instance = this;
     23 + this.filterLibraryController = filterLibraryController;
     24 + this.filterTable = new TagTable(filterLibraryController);
     25 + buildDialog();
     26 + pack();
     27 + }
     28 + 
     29 + private void buildDialog() {
     30 + this.setLayout(new BorderLayout());
     31 + this.setTitle("Log Tags");
     32 + JPanel content = new JPanel(new GridBagLayout());
     33 + this.add(content, BorderLayout.CENTER);
     34 + final JScrollPane filterListWrapper = new JScrollPane(filterTable);
     35 + GridBagConstraints gbcFilterWrapper = new GridBagConstraints();
     36 + gbcFilterWrapper.gridx = 0;
     37 + gbcFilterWrapper.gridy = 0;
     38 + gbcFilterWrapper.weighty = 999;
     39 + gbcFilterWrapper.weightx = 999;
     40 + gbcFilterWrapper.fill = GridBagConstraints.BOTH;
     41 + this.setMinimumSize(filterTable.getMinimumSize());
     42 + content.add(filterListWrapper, gbcFilterWrapper);
     43 + 
     44 + gbcFilterWrapper.gridx = 1;
     45 + gbcFilterWrapper.weightx = 1;
     46 + gbcFilterWrapper.fill = GridBagConstraints.HORIZONTAL;
     47 + final JPanel priorityControls = new JPanel(new GridLayout(0, 1));
     48 + priorityControls.add(new JButton(new AbstractAction("\u25B2") {
     49 + @Override
     50 + public void actionPerformed(ActionEvent actionEvent) {
     51 + filterTable.moveSelectedUp();
     52 + }
     53 + }));
     54 + priorityControls.add(new JButton(new AbstractAction("\u25BC") {
     55 + @Override
     56 + public void actionPerformed(ActionEvent actionEvent) {
     57 + filterTable.moveSelectedDown();
     58 + }
     59 + }));
     60 + content.add(priorityControls, gbcFilterWrapper);
     61 + 
     62 + GridBagConstraints gbcFooter = new GridBagConstraints();
     63 + gbcFooter.gridx = 0;
     64 + gbcFooter.gridy = 1;
     65 + gbcFooter.fill = GridBagConstraints.BOTH;
     66 + gbcFooter.weighty = gbcFooter.weightx = 1;
     67 + gbcFooter.gridwidth = 2;
     68 + JPanel buttonPanel = new JPanel(new BorderLayout());
     69 + JButton btnDeleteAll = new JButton("Delete All");
     70 + btnDeleteAll.addActionListener(new ActionListener() {
     71 + @Override
     72 + public void actionPerformed(ActionEvent actionEvent) {
     73 + ((TagTableModel) filterTable.getModel()).removeAll();
     74 + }
     75 + });
     76 + JPanel rightPanel = new JPanel(new BorderLayout());
     77 + JButton btnAddFilter = new JButton("Add Tag");
     78 + btnAddFilter.addActionListener(new ActionListener() {
     79 + @Override
     80 + public void actionPerformed(ActionEvent actionEvent) {
     81 + ((TagTableModel) filterTable.getModel()).addTag(new Tag());
     82 + }
     83 + });
     84 + JButton btnClose = new JButton("Close");
     85 + btnClose.addActionListener(new ActionListener() {
     86 + @Override
     87 + public void actionPerformed(ActionEvent actionEvent) {
     88 + TagDialog.this.dispatchEvent(new WindowEvent(TagDialog.this, WindowEvent.WINDOW_CLOSING));
     89 + }
     90 + });
     91 + rightPanel.add(btnAddFilter, BorderLayout.WEST);
     92 + rightPanel.add(btnClose, BorderLayout.EAST);
     93 + buttonPanel.add(btnDeleteAll, BorderLayout.WEST);
     94 + buttonPanel.add(rightPanel, BorderLayout.EAST);
     95 + content.add(buttonPanel, gbcFooter);
     96 + 
     97 + }
     98 +}
     99 + 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/userinterface/dialog/TagTableModel.java
     1 +package com.nccgroup.loggerplusplus.util.userinterface.dialog;
     2 + 
     3 +import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
     4 +import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
     5 +import com.nccgroup.loggerplusplus.filter.parser.ParseException;
     6 +import com.nccgroup.loggerplusplus.filter.tag.Tag;
     7 +import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
     8 + 
     9 +import javax.swing.*;
     10 +import javax.swing.table.AbstractTableModel;
     11 +import java.util.*;
     12 + 
     13 +/**
     14 + * Created by corey on 19/07/17.
     15 + */
     16 +public class TagTableModel extends AbstractTableModel {
     17 + 
     18 + private final Map<Short, UUID> rowUUIDs = new HashMap<Short, UUID>();
     19 + private final Map<UUID, Tag> tags;
     20 + private final String[] columnNames = {"Tag", "LogFilter", "Enabled", ""};
     21 + private final JButton removeButton = new JButton("Remove");
     22 + private final FilterLibraryController filterLibraryController;
     23 + 
     24 + TagTableModel(FilterLibraryController filterLibraryController) {
     25 + this.filterLibraryController = filterLibraryController;
     26 + //Sort existing filters by their priority before adding to table.
     27 + tags = filterLibraryController.getTags();
     28 + List<Tag> sorted = new ArrayList<Tag>(tags.values());
     29 + Collections.sort(sorted);
     30 + for (Tag filter : sorted) {
     31 + rowUUIDs.put((short) rowUUIDs.size(), filter.getUUID());
     32 + }
     33 + }
     34 + 
     35 + @Override
     36 + public int getRowCount() {
     37 + return tags.size();
     38 + }
     39 + 
     40 + @Override
     41 + public int getColumnCount() {
     42 + return columnNames.length;
     43 + }
     44 + 
     45 + @Override
     46 + public String getColumnName(int i) {
     47 + return columnNames[i];
     48 + }
     49 + 
     50 + @Override
     51 + public Object getValueAt(int row, int col) {
     52 + UUID rowUid = rowUUIDs.get((short) row);
     53 + switch (col) {
     54 + case 0:
     55 + return (tags.get(rowUid).getName() == null ? "" : tags.get(rowUid).getName());
     56 + case 1:
     57 + return (tags.get(rowUid).getFilterString() == null ? "" : tags.get(rowUid).getFilterString());
     58 + case 2:
     59 + return tags.get(rowUid).isEnabled();
     60 + case 3:
     61 + return removeButton;
     62 + default:
     63 + return false;
     64 + }
     65 + }
     66 + 
     67 + public boolean validFilterAtRow(int row) {
     68 + return getTagAtRow(row).getFilter() != null;
     69 + }
     70 + 
     71 +// public LogFilter getFilterAtRow(int row){
     72 +// return filters.get(rowUUIDs.get((short) row)).getFilter();
     73 +// }
     74 + 
     75 + public Tag getTagAtRow(int row) {
     76 + return tags.get(rowUUIDs.get((short) row));
     77 + }
     78 + 
     79 + public void setValueAt(Object value, int row, int col) {
     80 + UUID rowUid = rowUUIDs.get((short) row);
     81 + Tag tag = tags.get(rowUid);
     82 + switch (col) {
     83 + case 0:
     84 + tag.setName((String) value);
     85 + break;
     86 + case 1: {
     87 + tag.setFilterString((String) value);
     88 + try {
     89 + tag.setFilter(new LogFilter(filterLibraryController, (String) value));
     90 + } catch (ParseException e) {
     91 + tag.setFilter(null);
     92 + }
     93 + break;
     94 + }
     95 + case 2:
     96 + tag.setEnabled((Boolean) value);
     97 + break;
     98 + default:
     99 + return;
     100 + }
     101 + 
     102 + this.filterLibraryController.updateTag(tag);
     103 + }
     104 + 
     105 + 
     106 + @Override
     107 + public Class<?> getColumnClass(int columnIndex) {
     108 + switch (columnIndex) {
     109 + case 2:
     110 + return Boolean.class;
     111 + case 3:
     112 + return JButton.class;
     113 + default:
     114 + return String.class;
     115 + }
     116 + }
     117 + 
     118 + @Override
     119 + public boolean isCellEditable(int row, int col) {
     120 + return col != 3;
     121 + }
     122 + 
     123 + public void addTag(Tag tag) {
     124 + int i = tags.size();
     125 + filterLibraryController.addTag(tag);
     126 + rowUUIDs.put((short) i, tag.getUUID());
     127 + tag.setPriority((short) i);
     128 + this.fireTableRowsInserted(i, i);
     129 + }
     130 + 
     131 + public void onClick(int row, int column) {
     132 + if (row != -1 && row < tags.size() && column == 3) {
     133 + synchronized (rowUUIDs) {
     134 + Tag removedFilter = tags.get(rowUUIDs.get((short) row));
     135 + filterLibraryController.removeTag(removedFilter);
     136 + this.fireTableRowsDeleted(row, row);
     137 + rowUUIDs.remove((short) row);
     138 + 
     139 + for (int i = row + 1; i <= rowUUIDs.size(); i++) {
     140 + rowUUIDs.put((short) (i - 1), rowUUIDs.get((short) i));
     141 + tags.get(rowUUIDs.get((short) i)).setPriority((short) (i - 1));
     142 + rowUUIDs.remove((short) i);
     143 + }
     144 + }
     145 + }
     146 + }
     147 + 
     148 + public void switchRows(int from, int to) {
     149 + UUID toUid = this.rowUUIDs.get((short) to);
     150 + rowUUIDs.put((short) to, rowUUIDs.get((short) from));
     151 + rowUUIDs.put((short) from, toUid);
     152 + Tag toFilter = tags.get(rowUUIDs.get((short) to));
     153 + toFilter.setPriority((short) to);
     154 + Tag fromFilter = tags.get(rowUUIDs.get((short) from));
     155 + fromFilter.setPriority((short) from);
     156 + filterLibraryController.updateTag(toFilter);
     157 + filterLibraryController.updateTag(fromFilter);
     158 + this.fireTableRowsUpdated(from, from);
     159 + this.fireTableRowsUpdated(to, to);
     160 + }
     161 + 
     162 + public void removeAll() {
     163 + for (ColorFilter filter : new ArrayList<>(filterLibraryController.getColorFilters().values())) {
     164 + filterLibraryController.removeColorFilter(filter);
     165 + }
     166 + 
     167 + this.rowUUIDs.clear();
     168 + this.fireTableDataChanged();
     169 + }
     170 +}
     171 + 
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/userinterface/renderer/FilterRenderer.java
    skipped 2 lines
    3 3  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
    4 4  import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterTable;
    5 5  import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterTableModel;
     6 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.TagTable;
     7 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.TagTableModel;
    6 8   
    7 9  import javax.swing.*;
    8 10  import javax.swing.table.DefaultTableCellRenderer;
    skipped 8 lines
    17 19   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    18 20   Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    19 21   boolean validFilter;
    20  - if(table instanceof ColorFilterTable){
     22 + if (table instanceof ColorFilterTable) {
    21 23   validFilter = ((ColorFilterTableModel) table.getModel()).validFilterAtRow(row);
    22  - }else{
     24 + } else if (table instanceof TagTable) {
     25 + validFilter = ((TagTableModel) table.getModel()).validFilterAtRow(row);
     26 + } else {
    23 27   validFilter = (value instanceof LogFilter);
    24 28   }
    25 29   
    skipped 12 lines
Please wait...
Page is in error, reload to recover