Projects STRLCPY LoggerPlusPlus Commits b8ee5393
🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■
    build.gradle
    skipped 11 lines
    12 12  dependencies {
    13 13   compile 'net.portswigger.burp.extender:burp-extender-api:1.7.22'
    14 14   compile 'org.swinglabs:swingx:1.6.1'
    15  - compile 'com.github.CoreyD97:BurpExtenderUtilities:3e5df57fb8dec5d64f61206dda5f4e1e9d643558'
     15 + compile 'com.github.CoreyD97:BurpExtenderUtilities:5bc1d3f'
    16 16   compile 'com.google.code.gson:gson:2.8.2'
    17 17   compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.5.2'
    18 18   compile 'org.apache.httpcomponents:httpclient:4.5.6'
    skipped 21 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/LoggerContextMenuFactory.java
    skipped 6 lines
    7 7  import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
    8 8  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    9 9  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
    10  -import com.nccgroup.loggerplusplus.userinterface.dialog.ColorFilterDialog;
     10 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterDialog;
    11 11   
    12 12  import javax.swing.*;
    13 13  import java.awt.event.ActionEvent;
    skipped 5 lines
    19 19  import static com.nccgroup.loggerplusplus.util.Globals.PREF_COLOR_FILTERS;
    20 20   
    21 21  public class LoggerContextMenuFactory implements IContextMenuFactory {
     22 + 
     23 + private final LoggerPlusPlus loggerPlusPlus;
     24 +
     25 + public LoggerContextMenuFactory(LoggerPlusPlus loggerPlusPlus){
     26 + this.loggerPlusPlus = loggerPlusPlus;
     27 + }
    22 28  
    23 29   @Override
    24 30   public List<JMenuItem> createMenuItems(IContextMenuInvocation invocation) {
    skipped 40 lines
    65 71   default: return null;
    66 72   }
    67 73   
    68  - final LogTable logTable = LoggerPlusPlus.instance.getLogTable();
     74 + final LogTable logTable = loggerPlusPlus.getLogViewController().getLogTableController().getLogTable();
    69 75   String selectedText = new String(selectedBytes);
    70 76   
    71 77   JMenuItem useAsFilter = new JMenuItem(new AbstractAction("Use Selection As LogFilter") {
    72 78   @Override
    73 79   public void actionPerformed(ActionEvent actionEvent) {
    74  - LoggerPlusPlus.instance.getLogFilterController().setFilter(context.getFullLabel() + " CONTAINS \"" + selectedText + "\"");
     80 + loggerPlusPlus.getLogViewController().getLogFilterController().setFilter(context.getFullLabel() + " CONTAINS \"" + selectedText + "\"");
    75 81   }
    76 82   });
    77 83   
    skipped 4 lines
    82 88   JMenuItem andFilter = new JMenuItem(new AbstractAction("AND") {
    83 89   @Override
    84 90   public void actionPerformed(ActionEvent actionEvent) {
    85  - LoggerPlusPlus.instance.getLogFilterController().setFilter(logTable.getCurrentFilter().toString() + " && "
     91 + loggerPlusPlus.getLogViewController().getLogFilterController().setFilter(logTable.getCurrentFilter().toString() + " && "
    86 92   + "" + context.getFullLabel() + " CONTAINS \"" + selectedText + "\"");
    87 93   }
    88 94   });
    89 95   JMenuItem orFilter = new JMenuItem(new AbstractAction("OR") {
    90 96   @Override
    91 97   public void actionPerformed(ActionEvent actionEvent) {
    92  - LoggerPlusPlus.instance.getLogFilterController().setFilter(logTable.getCurrentFilter().toString() + " || "
     98 + loggerPlusPlus.getLogViewController().getLogFilterController().setFilter(logTable.getCurrentFilter().toString() + " || "
    93 99   + context.getFullLabel() + " CONTAINS \"" + selectedText + "\"");
    94 100   }
    95 101   });
    skipped 7 lines
    103 109   public void actionPerformed(ActionEvent actionEvent) {
    104 110   try {
    105 111   ColorFilter colorFilter = new ColorFilter();
    106  - colorFilter.setFilter(new LogFilter(LoggerPlusPlus.instance.getLibraryController(),
     112 + colorFilter.setFilter(new LogFilter(loggerPlusPlus.getLibraryController(),
    107 113   context.getFullLabel() + " CONTAINS \"" + selectedText + "\""));
    108  - HashMap<UUID,ColorFilter> colorFilters = LoggerPlusPlus.preferences.getSetting(PREF_COLOR_FILTERS);
     114 + HashMap<UUID,ColorFilter> colorFilters = loggerPlusPlus.getPreferencesController().getPreferences().getSetting(PREF_COLOR_FILTERS);
    109 115   colorFilters.put(colorFilter.getUUID(), colorFilter);
    110  - new ColorFilterDialog(LoggerPlusPlus.instance.getLibraryController()).setVisible(true);
     116 + new ColorFilterDialog(loggerPlusPlus.getLibraryController()).setVisible(true);
    111 117   } catch (ParseException e) {
    112 118   return;
    113 119   }
    skipped 7 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/LoggerPlusPlus.java
    skipped 2 lines
    3 3  import burp.IBurpExtender;
    4 4  import burp.IBurpExtenderCallbacks;
    5 5  import burp.IExtensionStateListener;
    6  -import burp.ITab;
    7  -import com.coreyd97.BurpExtenderUtilities.*;
    8  -import com.nccgroup.loggerplusplus.filter.logfilter.LogFilterController;
     6 +import com.coreyd97.BurpExtenderUtilities.DefaultGsonProvider;
     7 +import com.coreyd97.BurpExtenderUtilities.IGsonProvider;
    9 8  import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
    10 9  import com.nccgroup.loggerplusplus.grepper.GrepperController;
    11  -import com.nccgroup.loggerplusplus.logentry.LogProcessor;
    12  -import com.nccgroup.loggerplusplus.logentry.logger.ElasticSearchLogger;
    13  -import com.nccgroup.loggerplusplus.logview.LogViewPanel;
    14  -import com.nccgroup.loggerplusplus.logview.RequestViewerController;
    15  -import com.nccgroup.loggerplusplus.userinterface.*;
    16  -import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
     10 +import com.nccgroup.loggerplusplus.logging.LoggingController;
     11 +import com.nccgroup.loggerplusplus.logview.LogViewController;
     12 +import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
     13 +import com.nccgroup.loggerplusplus.preferences.PreferencesController;
    17 14  import com.nccgroup.loggerplusplus.util.Globals;
    18 15  import com.nccgroup.loggerplusplus.util.MoreHelp;
     16 +import com.nccgroup.loggerplusplus.util.userinterface.LoggerMenu;
    19 17   
    20 18  import javax.swing.*;
    21  -import java.awt.*;
    22 19  import java.net.URL;
    23  -import java.util.Arrays;
    24  -import java.util.HashSet;
    25 20   
    26 21  import static com.nccgroup.loggerplusplus.util.Globals.PREF_RESTRICT_TO_SCOPE;
    27 22   
    28 23  /**
    29 24   * Created by corey on 07/09/17.
    30 25   */
    31  -public class LoggerPlusPlus implements ITab, IBurpExtender, IExtensionStateListener, ILogProvider {
     26 +public class LoggerPlusPlus implements IBurpExtender, IExtensionStateListener {
    32 27   public static LoggerPlusPlus instance;
    33 28   public static IBurpExtenderCallbacks callbacks;
    34  - public static IGsonProvider gsonProvider;
    35  - public static Preferences preferences;
    36 29   
     30 + private final IGsonProvider gsonProvider;
     31 + private LoggingController loggingController;
    37 32   private LogProcessor logProcessor;
    38  - private LogFilterController logFilterController;
     33 + private PreferencesController preferencesController;
     34 + private LogViewController logViewController;
    39 35   private FilterLibraryController libraryController;
    40  - private ElasticSearchLogger elasticSearchLogger;
     36 + private LoggerContextMenuFactory contextMenuFactory;
     37 + private GrepperController grepperController;
     38 + private MainViewController mainViewController;
    41 39   
    42 40   //UX
    43  - private PopOutPanel uiPopOutPanel;
    44  - private PopOutPanel uiReqRespPopOut;
    45  - private JTabbedPane tabbedWrapper;
    46  - private LogViewPanel logViewPanel;
    47  - private VariableViewPanel logSplitPanel;
    48  - private VariableViewPanel reqRespPanel;
    49  - private LoggerOptionsPanel optionsJPanel;
    50 41   private LoggerMenu loggerMenu;
    51 42   
    52  - private RequestViewerController requestViewerController;
    53  - private GrepperController grepperController;
     43 + 
     44 + public LoggerPlusPlus(){
     45 + this.gsonProvider = new DefaultGsonProvider();
     46 + }
    54 47   
    55 48   @Override
    56 49   public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks)
    skipped 9 lines
    66 59   //Darcula is not installed.
    67 60   }
    68 61   
    69  - if(LoggerPlusPlus.instance != null){
    70  - callbacks.printError("Existing Logger++ extension detected! Have you installed the Jar twice?");
    71  - }
    72  - 
    73 62   //Burp Specific
    74 63   LoggerPlusPlus.instance = this;
    75 64   LoggerPlusPlus.callbacks = callbacks;
    76  - LoggerPlusPlus.gsonProvider = new DefaultGsonProvider();
    77  - LoggerPlusPlus.preferences = new LoggerPreferenceFactory(LoggerPlusPlus.gsonProvider, this, callbacks).buildPreferences();
    78 65   
    79  - logFilterController = new LogFilterController(preferences);
    80  - grepperController = new GrepperController(preferences);
    81  - libraryController = new FilterLibraryController(preferences);
    82  - logProcessor = new LogProcessor(preferences);
     66 + loggingController = new LoggingController(this);
     67 + preferencesController = new PreferencesController(this, loggingController);
     68 + libraryController = new FilterLibraryController(this, preferencesController);
     69 + logViewController = new LogViewController(this, libraryController);
     70 + logProcessor = new LogProcessor(this, logViewController.getLogTableController());
     71 + grepperController = new GrepperController(this, logViewController.getLogTableController(), preferencesController);
     72 + contextMenuFactory = new LoggerContextMenuFactory(this);
     73 + 
     74 + mainViewController = new MainViewController(this);
    83 75   
    84  - Double lastVersion = preferences.getSetting(Globals.PREF_LAST_USED_VERSION);
    85  - preferences.resetSettings(new HashSet<>(Arrays.asList(Globals.VERSION_CHANGE_SETTINGS_TO_RESET)));
    86  - if(lastVersion > Globals.VERSION){
    87  - //If we had a newer version previously.
    88  - //reset all settings
    89  - preferences.resetSettings(preferences.getRegisteredSettings().keySet());
    90  - }else if(lastVersion < Globals.VERSION){
    91  - //Reset preferences which may cause issues.
    92  - preferences.resetSettings(new HashSet<>(Arrays.asList(Globals.VERSION_CHANGE_SETTINGS_TO_RESET)));
    93  - }
    94 76   
    95 77   callbacks.setExtensionName("Logger++");
    96  - elasticSearchLogger = new ElasticSearchLogger(logProcessor);
    97 78   
    98  - if(!callbacks.isExtensionBapp() && (boolean) preferences.getSetting(Globals.PREF_UPDATE_ON_STARTUP)){
     79 + if(!callbacks.isExtensionBapp() && (boolean) preferencesController.getPreferences().getSetting(Globals.PREF_UPDATE_ON_STARTUP)){
    99 80   MoreHelp.checkForUpdate(false);
    100 81   }
    101 82   
    102  - buildUI();
    103  - }
    104  - 
    105  - private void buildUI(){
    106  - SwingUtilities.invokeLater(new Runnable()
    107  - {
    108  - @Override
    109  - public void run()
    110  - {
    111  - //UI
    112  - JPanel logOuterPanel = new JPanel(new GridBagLayout());
    113  - logViewPanel = new LogViewPanel(logProcessor);
    114  - logFilterController.addFilterListener(logViewPanel.getLogTable());
    115  - GridBagConstraints gbc = new GridBagConstraints();
    116  - gbc.weighty = 0;
    117  - gbc.weightx = 1;
    118  - gbc.gridy = 0;
    119  - gbc.fill = GridBagConstraints.BOTH;
    120  - logOuterPanel.add(new MainControlsPanel(logFilterController), gbc);
    121  - 
    122  - requestViewerController = new RequestViewerController(callbacks, false, false);
    123  - reqRespPanel = new VariableViewPanel(preferences, Globals.PREF_MESSAGE_VIEW_LAYOUT,
    124  - requestViewerController.getRequestEditor().getComponent(), "Request",
    125  - requestViewerController.getResponseEditor().getComponent(), "Response",
    126  - VariableViewPanel.View.HORIZONTAL);
    127  - 
    128  - uiReqRespPopOut = new PopOutPanel(reqRespPanel, "Request/Response"){
    129  - @Override
    130  - public void popOut() {
    131  - LoggerPlusPlus.this.logSplitPanel.setView(VariableViewPanel.View.VERTICAL);
    132  - super.popOut();
    133  - }
    134  - 
    135  - @Override
    136  - public void popIn() {
    137  - super.popIn();
    138  - }
    139  - };
    140  - 
    141  - logSplitPanel = new VariableViewPanel(preferences, Globals.PREF_LAYOUT,
    142  - logViewPanel, "Log Table",
    143  - uiReqRespPopOut, "Request/Response", VariableViewPanel.View.VERTICAL);
    144  - 
    145  - gbc.gridy++;
    146  - gbc.weighty = 1;
    147  - logOuterPanel.add(logSplitPanel, gbc);
    148  - 
    149  - optionsJPanel = new LoggerOptionsPanel();
    150  - tabbedWrapper = new JTabbedPane();
    151  - uiPopOutPanel = new PopOutPanel(tabbedWrapper, "Logger++");
    152  - tabbedWrapper.addTab("View Logs", null, logOuterPanel, null);
    153  - tabbedWrapper.addTab("Filter Library", null, libraryController.getUIComponent(), null);
    154  - tabbedWrapper.addTab("Grep Values", null, grepperController.getUIComponent(), null);
    155  - tabbedWrapper.addTab("Options", null, optionsJPanel, null);
    156  - tabbedWrapper.addTab("About", null, new AboutPanel(), null);
    157  - tabbedWrapper.addTab("Help", null, new HelpPanel(), null);
    158  - 
     83 + LoggerPlusPlus.callbacks.registerContextMenuFactory(contextMenuFactory);
     84 + LoggerPlusPlus.callbacks.registerExtensionStateListener(LoggerPlusPlus.this);
    159 85   
    160  - LoggerPlusPlus.callbacks.addSuiteTab(LoggerPlusPlus.this);
    161 86   
    162  - //Add menu item to Burp's frame menu.
    163  - JFrame rootFrame = (JFrame) SwingUtilities.getWindowAncestor(uiPopOutPanel);
    164  - try{
    165  - JMenuBar menuBar = rootFrame.getJMenuBar();
    166  - loggerMenu = new LoggerMenu();
    167  - loggerMenu.add(uiPopOutPanel.getPopoutMenuItem(), 1);
    168  - loggerMenu.add(uiReqRespPopOut.getPopoutMenuItem(), 2);
    169  - menuBar.add(loggerMenu, menuBar.getMenuCount() - 1);
    170  - }catch (NullPointerException nPException){
    171  - loggerMenu = null;
    172  - }
     87 + SwingUtilities.invokeLater(() -> {
    173 88   
    174  - LoggerPlusPlus.callbacks.registerHttpListener(logProcessor);
    175  - LoggerPlusPlus.callbacks.registerProxyListener(logProcessor);
    176  - LoggerPlusPlus.callbacks.registerContextMenuFactory(new LoggerContextMenuFactory());
    177  - LoggerPlusPlus.callbacks.registerExtensionStateListener(LoggerPlusPlus.this);
     89 + LoggerPlusPlus.callbacks.addSuiteTab(mainViewController);
    178 90   
    179  - if(LoggerPlusPlus.preferences.getSetting(Globals.PREF_AUTO_IMPORT_PROXY_HISTORY)){
    180  - logProcessor.importProxyHistory();
    181  - }
     91 + //Add menu item to Burp's frame menu.
     92 + JFrame rootFrame = (JFrame) SwingUtilities.getWindowAncestor(mainViewController.getUiComponent());
     93 + try{
     94 + JMenuBar menuBar = rootFrame.getJMenuBar();
     95 + loggerMenu = new LoggerMenu(LoggerPlusPlus.this);
     96 + menuBar.add(loggerMenu, menuBar.getMenuCount() - 1);
     97 + }catch (NullPointerException nPException){
     98 + loggerMenu = null;
    182 99   }
    183 100   });
     101 + 
    184 102   }
    185 103   
    186 104   @Override
    skipped 1 lines
    188 106   if(loggerMenu != null && loggerMenu.getParent() != null){
    189 107   loggerMenu.getParent().remove(loggerMenu);
    190 108   }
    191  - if(uiPopOutPanel.isPoppedOut()) uiPopOutPanel.getPopoutFrame().dispose();
    192  - if(uiReqRespPopOut.isPoppedOut()) uiReqRespPopOut.getPopoutFrame().dispose();
     109 + if(mainViewController.getPopOutWrapper().isPoppedOut()) {
     110 + mainViewController.getPopOutWrapper().getPopoutFrame().dispose();
     111 + }
     112 + if(logViewController.getRequestViewerController().getRequestViewerPanel().isPoppedOut()) {
     113 + logViewController.getRequestViewerController().getRequestViewerPanel().getPopoutFrame().dispose();
     114 + }
    193 115   
    194  - //Stop LogManager executors and pending tasks.
     116 + //Stop log processor executors and pending tasks.
    195 117   logProcessor.shutdown();
    196 118   
    197 119   //Null out static variables so not leftover.
    198 120   LoggerPlusPlus.instance = null;
    199  - LoggerPlusPlus.preferences = null;
    200 121   LoggerPlusPlus.callbacks = null;
    201  - LoggerPlusPlus.gsonProvider = null;
    202  - }
    203  - 
    204  - @Override
    205  - public String getTabCaption()
    206  - {
    207  - return "Logger++";
    208  - }
    209  - 
    210  - @Override
    211  - public Component getUiComponent()
    212  - {
    213  - return uiPopOutPanel;
    214  - }
    215  - 
    216  - @Override
    217  - public void logOutput(String message) {
    218  - System.out.println(message);
    219  - callbacks.printOutput(message);
    220  - if(preferences == null) {
    221  - Boolean isDebug = gsonProvider.getGson().fromJson(callbacks.loadExtensionSetting(Globals.PREF_IS_DEBUG), Boolean.class);
    222  - if(isDebug != null && isDebug){
    223  - System.out.println(message);
    224  - }
    225  - }else{
    226  - if (preferences.getSetting(Globals.PREF_IS_DEBUG) != null
    227  - && (boolean) preferences.getSetting(Globals.PREF_IS_DEBUG)) {
    228  - System.out.println(message);
    229  - }
    230  - }
    231  - }
    232  - 
    233  - @Override
    234  - public void logError(String errorMessage) {
    235  - System.err.println(errorMessage);
    236  - callbacks.printError(errorMessage);
    237  - if(preferences == null) {
    238  - Boolean isDebug = gsonProvider.getGson().fromJson(callbacks.loadExtensionSetting(Globals.PREF_IS_DEBUG), Boolean.class);
    239  - if(isDebug != null && isDebug){
    240  - System.err.println(errorMessage);
    241  - }
    242  - }else{
    243  - if (preferences.getSetting(Globals.PREF_IS_DEBUG) != null
    244  - && (boolean) preferences.getSetting(Globals.PREF_IS_DEBUG)) {
    245  - System.err.println(errorMessage);
    246  - }
    247  - }
    248 122   }
    249 123   
    250 124   public static boolean isUrlInScope(URL url){
    251  - return (!(Boolean) preferences.getSetting(PREF_RESTRICT_TO_SCOPE)
     125 + return (!(Boolean) instance.getPreferencesController().getPreferences().getSetting(PREF_RESTRICT_TO_SCOPE)
    252 126   || callbacks.isInScope(url));
    253 127   }
    254 128   
    255  - public void reset(){
    256  - this.logProcessor.clearEntries();
    257  - this.logViewPanel.getLogTable().getModel().fireTableDataChanged();
    258  - }
    259 129   
    260  - public LogFilterController getLogFilterController() {
    261  - return logFilterController;
     130 + public LogViewController getLogViewController() {
     131 + return logViewController;
    262 132   }
    263 133   
    264  - public Preferences getPreferences() {
    265  - return preferences;
     134 + public IGsonProvider getGsonProvider() {
     135 + return gsonProvider;
    266 136   }
    267 137   
    268  - public LogTable getLogTable() {
    269  - return logViewPanel.getLogTable();
     138 + public GrepperController getGrepperController() {
     139 + return grepperController;
    270 140   }
    271 141   
    272  - public LoggerOptionsPanel getLoggerOptionsPanel() {
    273  - return optionsJPanel;
    274  - }
    275  - 
    276  - public VariableViewPanel getLogSplitPanel() {
    277  - return logSplitPanel;
    278  - }
    279  - 
    280  - public VariableViewPanel getReqRespPanel() {
    281  - return reqRespPanel;
    282  - }
    283  - 
    284  - public JScrollPane getLogScrollPanel() {
    285  - return logViewPanel.getScrollPane();
     142 + public MainViewController getMainViewController() {
     143 + return mainViewController;
    286 144   }
    287 145   
    288 146   public FilterLibraryController getLibraryController() {
    289 147   return libraryController;
    290 148   }
    291 149   
    292  - public RequestViewerController getRequestViewerController(){
    293  - return requestViewerController;
     150 + public LoggingController getLoggingController() {
     151 + return loggingController;
    294 152   }
    295 153   
    296  - public JTabbedPane getTabbedPane() {
    297  - return this.tabbedWrapper;
     154 + public PreferencesController getPreferencesController() {
     155 + return preferencesController;
    298 156   }
    299 157   
    300 158   public LogProcessor getLogProcessor() {
    301 159   return logProcessor;
    302 160   }
    303 161   
    304  - public void setEsEnabled(boolean esEnabled) throws Exception {
    305  - this.elasticSearchLogger.setEnabled(esEnabled);
     162 + public LoggerMenu getLoggerMenu() {
     163 + return loggerMenu;
    306 164   }
    307 165  }
    308 166   
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/MainViewController.java
     1 +package com.nccgroup.loggerplusplus;
     2 + 
     3 +import burp.ITab;
     4 +import com.coreyd97.BurpExtenderUtilities.PopOutPanel;
     5 +import com.nccgroup.loggerplusplus.about.AboutPanel;
     6 +import com.nccgroup.loggerplusplus.help.HelpPanel;
     7 +import com.nccgroup.loggerplusplus.util.Globals;
     8 + 
     9 +import javax.swing.*;
     10 +import java.awt.*;
     11 + 
     12 +public class MainViewController implements ITab {
     13 + 
     14 + private final LoggerPlusPlus loggerPlusPlus;
     15 + private final JTabbedPane tabbedPane;
     16 + private final PopOutPanel popOutWrapper;
     17 + 
     18 + public MainViewController(LoggerPlusPlus loggerPlusPlus) {
     19 + this.loggerPlusPlus = loggerPlusPlus;
     20 + this.tabbedPane = new JTabbedPane();
     21 + tabbedPane.addTab("View Logs", null, loggerPlusPlus.getLogViewController().getLogViewPanel(), null);
     22 + tabbedPane.addTab("Filter Library", null, loggerPlusPlus.getLibraryController().getFilterLibraryPanel(), null);
     23 + tabbedPane.addTab("Grep Values", null, loggerPlusPlus.getGrepperController().getGrepperPanel(), null);
     24 + tabbedPane.addTab("Options", null, loggerPlusPlus.getPreferencesController().getPreferencesPanel(), null);
     25 + tabbedPane.addTab("About", null, new AboutPanel(), null);
     26 + tabbedPane.addTab("Help", null, new HelpPanel(), null);
     27 + this.popOutWrapper = new PopOutPanel(tabbedPane, Globals.APP_NAME);
     28 + }
     29 + 
     30 + @Override
     31 + public String getTabCaption() {
     32 + return Globals.APP_NAME;
     33 + }
     34 + 
     35 + @Override
     36 + public Component getUiComponent() {
     37 + return popOutWrapper;
     38 + }
     39 + 
     40 + public JTabbedPane getTabbedPanel(){
     41 + return tabbedPane;
     42 + }
     43 + 
     44 + public PopOutPanel getPopOutWrapper() {
     45 + return popOutWrapper;
     46 + }
     47 +}
     48 + 
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/AboutPanel.java src/main/java/com/nccgroup/loggerplusplus/about/AboutPanel.java
    skipped 9 lines
    10 10  // Released under AGPL see LICENSE for more information
    11 11  //
    12 12   
    13  -package com.nccgroup.loggerplusplus.userinterface;
     13 +package com.nccgroup.loggerplusplus.about;
    14 14   
     15 +import com.nccgroup.loggerplusplus.util.userinterface.ScrollablePanel;
    15 16  import com.nccgroup.loggerplusplus.util.Globals;
    16 17  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    17 18  import com.nccgroup.loggerplusplus.util.MoreHelp;
    skipped 179 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filter/colorfilter/ColorFilterListener.java
    skipped 7 lines
    8 8   void onFilterChange(ColorFilter filter);
    9 9   void onFilterAdd(ColorFilter filter);
    10 10   void onFilterRemove(ColorFilter filter);
    11  - void onFilterRemoveAll();
    12 11  }
    13 12   
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filter/logfilter/LogFilter.java
    skipped 10 lines
    11 11  import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
    12 12  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    13 13  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    14  -import com.nccgroup.loggerplusplus.userinterface.LogTableModel;
     14 +import com.nccgroup.loggerplusplus.logview.logtable.LogTableModel;
    15 15   
    16 16  import javax.swing.*;
    17 17  import javax.swing.table.TableModel;
    skipped 73 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filter/logfilter/LogFilterController.java
    skipped 6 lines
    7 7  import com.nccgroup.loggerplusplus.filter.parser.ParseException;
    8 8  import com.nccgroup.loggerplusplus.logentry.FieldGroup;
    9 9  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
     10 +import com.nccgroup.loggerplusplus.logview.LogViewController;
     11 +import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
    10 12  import com.nccgroup.loggerplusplus.util.Globals;
    11 13   
    12 14  import javax.swing.*;
    13 15  import java.awt.*;
    14 16  import java.awt.event.*;
    15  -import java.util.ArrayList;
    16 17  import java.util.HashMap;
    17 18   
    18 19  public class LogFilterController {
    19 20   
     21 + private final LogViewController logViewController;
     22 + private final Preferences preferences;
     23 + private final LogTable logTable;
    20 24   private final HistoryField filterField;
    21 25   private final JPopupMenu fieldMenu;
    22  - private final ArrayList<LogFilterListener> logFilterListeners;
    23  - private String currentFilterString;
    24 26   
    25  - public LogFilterController(Preferences preferences) {
    26  - this.logFilterListeners = new ArrayList<>();
     27 + public LogFilterController(LogViewController logViewController) {
     28 + this.logViewController = logViewController;
     29 + this.preferences = logViewController.getPreferences();
     30 + this.logTable = logViewController.getLogTableController().getLogTable();
    27 31   this.filterField = buildFilterField(preferences);
    28 32   this.fieldMenu = buildFieldMenu();
    29 33   }
    skipped 61 lines
    91 95   return autoComplete;
    92 96   }
    93 97   
    94  - public void addFilterListener(LogFilterListener logFilterListener) {
    95  - this.logFilterListeners.add(logFilterListener);
    96  - }
    97  - 
    98  - public void removeFilterListener(LogFilterListener logFilterListener) {
    99  - this.logFilterListeners.remove(logFilterListener);
    100  - }
    101  - 
    102 98   public void setFilter(final String filterString) {
    103  - SwingUtilities.invokeLater(() -> {
    104  - if (filterString == null || filterString.length() == 0 || filterString.matches(" +")) {
    105  - setFilter((LogFilter) null);
    106  - } else {
    107  - currentFilterString = filterString;
    108  - try {
    109  - LogFilter filter = new LogFilter(LoggerPlusPlus.instance.getLibraryController(), filterString);
    110  - setFilter(filter);
    111  - } catch (ParseException e) {
    112  - for (LogFilterListener logFilterListener : logFilterListeners) {
    113  - try {
    114  - logFilterListener.onFilterError(filterString, e);
    115  - } catch (Exception e1) {
    116  - e1.printStackTrace();
    117  - }
    118  - }
     99 + if (filterString == null || filterString.length() == 0 || filterString.matches(" +")) {
     100 + setFilter((LogFilter) null);
     101 + } else {
     102 + try {
     103 + LogFilter filter = new LogFilter(LoggerPlusPlus.instance.getLibraryController(), filterString);
     104 + setFilter(filter);
     105 + } catch (ParseException e) {
     106 + logTable.setFilter(null);
    119 107   
    120  - JLabel header = new JLabel("Could not parse filter:");
    121  - JTextArea errorArea = new JTextArea(e.getMessage());
    122  - errorArea.setEditable(false);
     108 + JLabel header = new JLabel("Could not parse filter:");
     109 + JTextArea errorArea = new JTextArea(e.getMessage());
     110 + errorArea.setEditable(false);
    123 111   
    124  - JScrollPane errorScroller = new JScrollPane(errorArea);
    125  - errorScroller.setBorder(BorderFactory.createEmptyBorder());
    126  - JPanel wrapper = new JPanel(new BorderLayout());
    127  - wrapper.add(errorScroller, BorderLayout.CENTER);
    128  - wrapper.setPreferredSize(new Dimension(600, 300));
     112 + JScrollPane errorScroller = new JScrollPane(errorArea);
     113 + errorScroller.setBorder(BorderFactory.createEmptyBorder());
     114 + JPanel wrapper = new JPanel(new BorderLayout());
     115 + wrapper.add(errorScroller, BorderLayout.CENTER);
     116 + wrapper.setPreferredSize(new Dimension(600, 300));
    129 117   
    130  - JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(BurpExtender.instance.getUiComponent()),
    131  - new Component[]{header, wrapper}, "Parse Error", JOptionPane.ERROR_MESSAGE);
     118 + JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(logTable),
     119 + new Component[]{header, wrapper}, "Parse Error", JOptionPane.ERROR_MESSAGE);
    132 120   
    133  - formatFilter(filterString, Color.WHITE, new Color(221, 70, 57));
    134  - }
     121 + formatFilter(filterString, Color.WHITE, new Color(221, 70, 57));
    135 122   }
    136  - });
     123 + }
    137 124   }
    138 125   
    139 126   public void clearFilter() {
    140  - for (LogFilterListener logFilterListener : this.logFilterListeners) {
    141  - logFilterListener.onFilterCleared();
    142  - }
    143  - 
     127 + logTable.setFilter(null);
    144 128   formatFilter("", null, null);
    145 129   }
    146 130   
    skipped 4 lines
    151 135   String filterString = filter.toString();
    152 136   formatFilter(filterString, Color.BLACK, new Color(76, 255, 155));
    153 137   
    154  - new Thread(() -> {
    155  - for (LogFilterListener logFilterListener : logFilterListeners) {
    156  - logFilterListener.onFilterSet(filter);
    157  - }
    158  - }).start();
     138 + logTable.setFilter(filter);
    159 139   }
    160 140   }
    161 141   
    skipped 8 lines
    170 150   filterField.setForegroundColor(foregroundColor);
    171 151   filterField.setBackgroundColor(backgroundColor);
    172 152   });
     153 + }
     154 + 
     155 + public LogViewController getLogViewController() {
     156 + return logViewController;
    173 157   }
    174 158   
    175 159   public HistoryField getFilterField() {
    skipped 4 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filter/logfilter/LogFilterListener.java
    1  -package com.nccgroup.loggerplusplus.filter.logfilter;
    2  - 
    3  -import com.nccgroup.loggerplusplus.filter.parser.ParseException;
    4  - 
    5  -public interface LogFilterListener {
    6  - void onFilterSet(LogFilter filter);
    7  - void onFilterError(String invalidFilter, ParseException exception);
    8  - void onFilterCleared();
    9  -}
    10  - 
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filter/parser/ASTComparison.java
    skipped 3 lines
    4 4   
    5 5  import com.nccgroup.loggerplusplus.filter.BooleanOperator;
    6 6  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    7  -import com.nccgroup.loggerplusplus.logentry.LogProcessor;
     7 +import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
    8 8  import org.apache.commons.text.StringEscapeUtils;
    9 9   
    10 10  import java.util.Date;
    skipped 72 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filter/parser/FilterParser.java
    skipped 12 lines
    13 13  import java.util.ArrayList;
    14 14  import java.util.regex.Pattern;
    15 15  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    16  -import com.nccgroup.loggerplusplus.logentry.FieldGroup;import com.nccgroup.loggerplusplus.logentry.LogProcessor;
     16 +import com.nccgroup.loggerplusplus.logentry.FieldGroup;import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
    17 17  import static com.nccgroup.loggerplusplus.logentry.LogEntryField.getFieldsInGroup;
    18 18   
    19 19  public class FilterParser/*@bgen(jjtree)*/implements FilterParserTreeConstants, FilterParserConstants {/*@bgen(jjtree)*/
    skipped 1361 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filterlibrary/FilterLibraryController.java
    1 1  package com.nccgroup.loggerplusplus.filterlibrary;
    2 2   
    3 3  import com.coreyd97.BurpExtenderUtilities.Preferences;
     4 +import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    4 5  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    5 6  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilterListener;
    6 7  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
     8 +import com.nccgroup.loggerplusplus.preferences.PreferencesController;
    7 9  import com.nccgroup.loggerplusplus.util.Globals;
    8 10  import com.nccgroup.loggerplusplus.filter.savedfilter.SavedFilter;
    9 11   
    skipped 4 lines
    14 16   
    15 17  public class FilterLibraryController {
    16 18   
     19 + private final LoggerPlusPlus loggerPlusPlus;
    17 20   private final Preferences preferences;
    18 21   private final FilterLibraryPanel panel;
    19  - private final ArrayList<SavedFilter> savedFilters;
    20 22   private final ArrayList<FilterLibraryListener> listeners;
     23 + private final ArrayList<SavedFilter> savedFilters;
    21 24   private final HashMap<UUID, ColorFilter> colorFilters;
    22 25   private final ArrayList<ColorFilterListener> colorFilterListeners;
    23 26   
    24  - public FilterLibraryController(Preferences preferences){
    25  - this.preferences = preferences;
     27 + public FilterLibraryController(LoggerPlusPlus loggerPlusPlus, PreferencesController preferencesController){
     28 + this.loggerPlusPlus = loggerPlusPlus;
     29 + this.preferences = preferencesController.getPreferences();
    26 30   this.listeners = new ArrayList<>();
    27 31   this.colorFilterListeners = new ArrayList<>();
    28 32   this.savedFilters = preferences.getSetting(Globals.PREF_SAVED_FILTERS);
    skipped 1 lines
    30 34   this.panel = new FilterLibraryPanel(this);
    31 35   }
    32 36   
    33  - public FilterLibraryPanel getUIComponent() {
     37 + public LoggerPlusPlus getLoggerPlusPlus() {
     38 + return loggerPlusPlus;
     39 + }
     40 + 
     41 + public FilterLibraryPanel getFilterLibraryPanel() {
    34 42   return panel;
    35 43   }
    36 44   
    skipped 112 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filterlibrary/FilterLibraryPanel.java
    skipped 2 lines
    3 3  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    4 4  import com.nccgroup.loggerplusplus.filter.parser.ParseException;
    5 5  import com.nccgroup.loggerplusplus.filter.savedfilter.SavedFilter;
    6  -import com.nccgroup.loggerplusplus.userinterface.renderer.ButtonRenderer;
    7  -import com.nccgroup.loggerplusplus.userinterface.renderer.FilterRenderer;
     6 +import com.nccgroup.loggerplusplus.util.userinterface.renderer.ButtonRenderer;
     7 +import com.nccgroup.loggerplusplus.util.userinterface.renderer.FilterRenderer;
    8 8   
    9 9  import javax.swing.*;
    10 10  import java.awt.*;
    11 11  import java.awt.event.MouseAdapter;
    12 12  import java.awt.event.MouseEvent;
    13  -import java.util.logging.Logger;
    14 13   
    15 14  /**
    16 15   * Created by corey on 27/08/17.
    skipped 34 lines
    51 50   addFilterButton.setPreferredSize(new Dimension(0, 75));
    52 51   addFilterButton.addActionListener(actionEvent -> {
    53 52   try {
    54  - libraryController.addFilter(new SavedFilter(LoggerPlusPlus.instance.getLibraryController(),
     53 + libraryController.addFilter(new SavedFilter(libraryController,
    55 54   "Unnamed", "Response.body CONTAINS \"Example\""));
    56 55   } catch (ParseException e) {
    57 56   e.printStackTrace();
    skipped 19 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/filterlibrary/FilterLibraryTableModel.java
    skipped 4 lines
    5 5  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
    6 6  import com.nccgroup.loggerplusplus.filter.parser.ParseException;
    7 7  import com.nccgroup.loggerplusplus.filter.savedfilter.SavedFilter;
    8  -import com.nccgroup.loggerplusplus.userinterface.dialog.ColorFilterDialog;
     8 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterDialog;
    9 9  import com.nccgroup.loggerplusplus.util.MoreHelp;
    10 10   
    11 11  import javax.swing.*;
    skipped 56 lines
    68 68   if(column == 0) {
    69 69   savedFilter.setName((String) value);
    70 70   if(!((String) value).equalsIgnoreCase(savedFilter.getName())){
    71  - JOptionPane.showMessageDialog(BurpExtender.instance.getUiComponent(), "Alias names may only contain alphanumeric characters and the symbols period (.) and underscore (_)\n" +
     71 + JOptionPane.showMessageDialog(LoggerPlusPlus.instance.getMainViewController().getUiComponent(), "Alias names may only contain alphanumeric characters and the symbols period (.) and underscore (_)\n" +
    72 72   "Invalid characters have been replaced with an underscore.", "Alias Error", JOptionPane.WARNING_MESSAGE);
    73 73   }
    74 74   }
    skipped 5 lines
    80 80   savedFilter.setFilterString((String) value);
    81 81   savedFilter.setFilter(null);
    82 82   MoreHelp.showLargeOutputDialog("Filter Exception", "<html>" + e.getMessage().replaceAll("\n", "<br>") + "</html>");
    83  -// JOptionPane.showMessageDialog(BurpExtender.instance.getUiComponent(), "<html><body style=\"max-height: 400px; max-width: 400px;\">" + e.getMessage().replaceAll("\n", "<br>") + "</html>", "Filter Exception", JOptionPane.ERROR_MESSAGE);
     83 +// JOptionPane.showMessageDialog(LoggerPlusPlus.instance.getMainViewController().getUiComponent(), "<html><body style=\"max-height: 400px; max-width: 400px;\">" + e.getMessage().replaceAll("\n", "<br>") + "</html>", "Filter Exception", JOptionPane.ERROR_MESSAGE);
    84 84   }
    85 85   }
    86 86   controller.saveFilters();
    skipped 3 lines
    90 90   if(row < 0 || row >= controller.getSavedFilters().size()) return;
    91 91   SavedFilter savedFilter = controller.getSavedFilters().get(row);
    92 92   if(col == 2){
    93  - LoggerPlusPlus.instance.getLogFilterController().setFilter(savedFilter.getFilterString());
    94  - LoggerPlusPlus.instance.getTabbedPane().setSelectedIndex(0);
     93 + controller.getLoggerPlusPlus().getLogViewController().getLogFilterController().setFilter(savedFilter.getFilterString());
     94 + controller.getLoggerPlusPlus().getMainViewController().getTabbedPanel().setSelectedIndex(0);
    95 95   return;
    96 96   }
    97 97   if(col == 3){
    98  - LoggerPlusPlus.instance.getLibraryController().addColorFilter(savedFilter.getName(), savedFilter.getFilter());
     98 + controller.addColorFilter(savedFilter.getName(), savedFilter.getFilter());
    99 99   ColorFilterDialog dialog = new ColorFilterDialog(LoggerPlusPlus.instance.getLibraryController());
    100 100   dialog.setVisible(true);
    101 101   }
    skipped 25 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/grepper/GrepResultsTable.java
    skipped 45 lines
    46 46   } else if (obj instanceof GrepResults.Match) {
    47 47   obj = ((GrepResults) path.getPathComponent(path.getPathCount() - 2)).getLogEntry();
    48 48   }
    49  - final int index = LoggerPlusPlus.instance.getLogTable().getModel().getData().indexOf(obj);
     49 + final int index = controller.getLogTableController()
     50 + .getLogTable().getModel().getData().indexOf(obj);
    50 51   JMenuItem viewInLogs = new JMenuItem(new AbstractAction("View in Logs") {
    51 52   @Override
    52 53   public void actionPerformed(ActionEvent actionEvent) {
    53  - LogTable table = LoggerPlusPlus.instance.getLogTable();
     54 + LogTable table = controller.getLogTableController().getLogTable();
    54 55   table.changeSelection(table.convertRowIndexToView(index), 1, false, false);
    55  - LoggerPlusPlus.instance.getTabbedPane().setSelectedIndex(0);
     56 + controller.getLoggerPlusPlus().getMainViewController().getTabbedPanel().setSelectedIndex(0);
    56 57   }
    57 58   });
    58 59   menu.add(viewInLogs);
    59  - if(LoggerPlusPlus.instance.getLogTable().convertRowIndexToView(index) == -1){
     60 + if(controller.getLogTableController().getLogTable().convertRowIndexToView(index) == -1){
    60 61   viewInLogs.setEnabled(false);
    61 62   viewInLogs.setToolTipText("Unavailable. Hidden by filter.");
    62 63   viewInLogs.addMouseListener(new MouseAdapter() {
    skipped 163 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/grepper/GrepperController.java
    skipped 2 lines
    3 3  import com.coreyd97.BurpExtenderUtilities.Preferences;
    4 4  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    5 5  import com.nccgroup.loggerplusplus.logentry.LogEntry;
     6 +import com.nccgroup.loggerplusplus.logview.logtable.LogTableController;
     7 +import com.nccgroup.loggerplusplus.preferences.PreferencesController;
    6 8  import com.nccgroup.loggerplusplus.util.Globals;
    7 9  import com.nccgroup.loggerplusplus.util.NamedThreadFactory;
    8 10   
    skipped 5 lines
    14 16   
    15 17  public class GrepperController {
    16 18   
     19 + private final LoggerPlusPlus loggerPlusPlus;
     20 + private final LogTableController logTableController;
    17 21   private final Preferences preferences;
    18 22   private final GrepperPanel grepPanel;
    19 23   private final ArrayList<GrepperListener> listeners;
    skipped 1 lines
    21 25   
    22 26   private ExecutorService searchExecutor;
    23 27   
    24  - public GrepperController(Preferences preferences){
    25  - this.preferences = preferences;
     28 + public GrepperController(LoggerPlusPlus loggerPlusPlus, LogTableController logTableController, PreferencesController preferencesController){
     29 + this.loggerPlusPlus = loggerPlusPlus;
     30 + this.logTableController = logTableController;
     31 + this.preferences = preferencesController.getPreferences();
    26 32   this.listeners = new ArrayList<>();
    27 33   this.remainingEntries = new AtomicInteger(0);
    28 34   this.grepPanel = new GrepperPanel(this, preferences);
    29 35   }
    30 36   
    31  - public GrepperPanel getUIComponent() {
     37 + public LoggerPlusPlus getLoggerPlusPlus() {
     38 + return loggerPlusPlus;
     39 + }
     40 + 
     41 + public LogTableController getLogTableController() {
     42 + return logTableController;
     43 + }
     44 + 
     45 + public GrepperPanel getGrepperPanel() {
    32 46   return grepPanel;
    33 47   }
    34 48   
    skipped 14 lines
    49 63   this.searchExecutor = Executors.newFixedThreadPool(searchThreads, new NamedThreadFactory("LPP-Grepper"));
    50 64   
    51 65   new Thread(() -> {
    52  - ArrayList<LogEntry> logEntries = new ArrayList<>(LoggerPlusPlus.instance.getLogProcessor().getLogEntries());
     66 + ArrayList<LogEntry> logEntries = new ArrayList<>(loggerPlusPlus.getLogViewController().getLogTableController().getLogTableModel().getData());
    53 67   remainingEntries.getAndSet(logEntries.size());
    54 68   
    55 69   this.listeners.forEach(listener -> {
    skipped 77 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/grepper/GrepperPanel.java
    skipped 86 lines
    87 87   try {
    88 88   pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
    89 89   }catch (PatternSyntaxException e){
    90  - JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(BurpExtender.instance.getUiComponent()), "Pattern Syntax Invalid", "Invalid Pattern", JOptionPane.ERROR_MESSAGE);
     90 + JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(controller.getLoggerPlusPlus().getMainViewController().getUiComponent()), "Pattern Syntax Invalid", "Invalid Pattern", JOptionPane.ERROR_MESSAGE);
    91 91   return;
    92 92   }
    93 93   
    skipped 54 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/HelpPanel.java src/main/java/com/nccgroup/loggerplusplus/help/HelpPanel.java
    1  -package com.nccgroup.loggerplusplus.userinterface;
     1 +package com.nccgroup.loggerplusplus.help;
    2 2   
    3 3  import com.coreyd97.BurpExtenderUtilities.Alignment;
    4 4  import com.coreyd97.BurpExtenderUtilities.PanelBuilder;
    skipped 202 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/imports/LoggerImport.java
    skipped 12 lines
    13 13   
    14 14  package com.nccgroup.loggerplusplus.imports;
    15 15   
     16 +import burp.IBurpExtenderCallbacks;
     17 +import burp.IExtensionHelpers;
     18 +import burp.IHttpRequestResponse;
    16 19  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    17  -import com.nccgroup.loggerplusplus.logentry.EntryImportWorker;
     20 +import com.nccgroup.loggerplusplus.logview.processor.EntryImportWorker;
    18 21   
    19  -import burp.*;
     22 +import javax.swing.*;
     23 +import java.io.BufferedReader;
     24 +import java.io.FileNotFoundException;
     25 +import java.io.FileReader;
     26 +import java.io.IOException;
     27 +import java.net.URL;
    20 28  import java.util.ArrayList;
    21 29  import java.util.Iterator;
    22  -import java.io.*;
    23  -import java.net.URL;
    24  -import java.net.http.HttpRequest;
    25  - 
    26  -import javax.swing.*;
    27 30   
    28 31  public class LoggerImport {
    29 32   
    skipped 178 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/LogEntry.java
    skipped 13 lines
    14 14  package com.nccgroup.loggerplusplus.logentry;
    15 15   
    16 16  import burp.*;
     17 +import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
    17 18  import com.nccgroup.loggerplusplus.util.Globals;
    18 19  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    19 20  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    20  -import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
    21  -import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumn;
    22  -import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumnModel;
    23  -import org.apache.commons.text.StringEscapeUtils;
    24 21  import org.apache.commons.lang3.StringUtils;
    25 22   
    26  -import javax.swing.table.TableColumn;
    27 23  import java.net.URL;
    28 24  import java.text.ParseException;
    29 25  import java.util.*;
    skipped 2 lines
    32 28   
    33 29  public class LogEntry
    34 30  {
    35  - enum Status {UNPROCESSED, AWAITING_RESPONSE, PROCESSED, IGNORED}
    36 31   Status previousStatus;
    37 32   Status status = Status.UNPROCESSED;
    38 33   public transient IHttpRequestResponse requestResponse;
    skipped 67 lines
    106 101   }
    107 102   
    108 103   public void process(){
     104 + //TODO Move into separate processing class
    109 105   previousStatus = this.status;
    110 106   switch (this.status){
    111 107   case UNPROCESSED: {
    skipped 482 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/LogEntryField.java
    1 1  package com.nccgroup.loggerplusplus.logentry;
    2 2   
    3  -import java.util.*;
     3 +import java.util.Collection;
     4 +import java.util.Date;
     5 +import java.util.HashMap;
     6 +import java.util.LinkedHashMap;
    4 7   
    5 8  public enum LogEntryField {
    6 9   
    skipped 129 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/LogEntryListener.java
    1  -package com.nccgroup.loggerplusplus.logentry;
    2  - 
    3  -/**
    4  - * Created by corey on 21/08/17.
    5  - */
    6  -public interface LogEntryListener {
    7  - void onRequestAdded(final int modelIndex, final LogEntry logEntry, final boolean isComplete);
    8  - void onResponseUpdated(final int modelIndex, final LogEntry existingEntry);
    9  - void onRequestRemoved(final int modelIndex, final LogEntry logEntry);
    10  - void onLogsCleared();
    11  -}
    12  - 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/PendingResponseEntry.java
    1  -package com.nccgroup.loggerplusplus.logentry;
    2  - 
    3  -public class PendingResponseEntry {
    4  - 
    5  - private final LogEntry logEntry;
    6  - private int modelIndex = -1;
    7  - 
    8  - public PendingResponseEntry(LogEntry logEntry){
    9  - this.logEntry = logEntry;
    10  - }
    11  - 
    12  - public LogEntry getLogEntry() {
    13  - return logEntry;
    14  - }
    15  - 
    16  - public int getModelIndex() {
    17  - return modelIndex;
    18  - }
    19  - 
    20  - public void setModelIndex(int modelIndex) {
    21  - this.modelIndex = modelIndex;
    22  - }
    23  -}
    24  - 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/Status.java
     1 +package com.nccgroup.loggerplusplus.logentry;
     2 + 
     3 +public enum Status {
     4 + UNPROCESSED, AWAITING_RESPONSE, PROCESSED, IGNORED
     5 +}
     6 + 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/logger/ElasticSearchLogger.java
    skipped 1 lines
    2 2   
    3 3  import com.nccgroup.loggerplusplus.*;
    4 4  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    5  -import com.nccgroup.loggerplusplus.logentry.LogEntryListener;
    6  -import com.nccgroup.loggerplusplus.logentry.LogProcessor;
     5 +import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
    7 6  import com.nccgroup.loggerplusplus.util.Globals;
    8 7  import org.apache.http.HttpHost;
    9 8  import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
    skipped 18 lines
    28 27   
    29 28  import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
    30 29   
    31  -public class ElasticSearchLogger implements LogEntryListener {
    32  - IndicesAdminClient adminClient;
    33  - Client client;
    34  - RestHighLevelClient httpClient;
    35  - ArrayList<LogEntry> pendingEntries;
    36  - private InetAddress address;
    37  - private int port;
    38  - private String clusterName;
    39  - private boolean isEnabled;
    40  - private String indexName;
    41  - private boolean includeReqResp;
    42  - 
    43  - private final ScheduledExecutorService executorService;
    44  - private ScheduledFuture indexTask;
    45  - 
    46  - 
    47  - public ElasticSearchLogger(LogProcessor logProcessor){
    48  - this.isEnabled = false;
    49  - this.indexName = "logger";
    50  - 
    51  - logProcessor.addLogListener(this);
    52  - executorService = Executors.newScheduledThreadPool(1);
    53  - }
    54  - 
    55  - public void setEnabled(boolean isEnabled) throws UnknownHostException {
    56  - if(isEnabled){
    57  - this.address = InetAddress.getByName(LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_ADDRESS));
    58  - this.port = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_PORT);
    59  - this.clusterName = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_CLUSTER_NAME);
    60  - this.indexName = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_INDEX);
    61  - Settings settings = Settings.builder().put("cluster.name", this.clusterName).build();
    62  - 
    63  - httpClient = new RestHighLevelClient(RestClient.builder(
    64  - new HttpHost(this.address, this.port, "http")));
    65  - 
    66  - createIndices();
    67  - pendingEntries = new ArrayList<>();
    68  - includeReqResp = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_INCLUDE_REQ_RESP);
    69  - int delay = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_DELAY);
    70  - indexTask = executorService.scheduleAtFixedRate(() -> indexPendingEntries(), delay, delay, TimeUnit.SECONDS);
    71  - }else{
    72  - if(this.indexTask != null){
    73  - indexTask.cancel(true);
    74  - }
    75  - this.pendingEntries = null;
    76  - this.client = null;
    77  - this.adminClient = null;
    78  - }
    79  - this.isEnabled = isEnabled;
    80  - }
    81  - 
    82  - private void createIndices(){
    83  - GetIndexRequest request = new GetIndexRequest();
    84  - request.indices(this.indexName);
    85  - 
    86  - boolean exists = false;
    87  - try {
    88  - exists = httpClient.indices().exists(request, RequestOptions.DEFAULT);
    89  - } catch (IOException e) {
    90  - e.printStackTrace();
    91  - }
    92  - 
    93  - if(!exists) {
    94  - CreateIndexRequest _request = new CreateIndexRequest(this.indexName);
    95  - 
    96  - try {
    97  - CreateIndexResponse createIndexResponse = httpClient.indices().create(_request, RequestOptions.DEFAULT);
    98  - } catch (IOException e) {
    99  - e.printStackTrace();
    100  - }
    101  - }
    102  - }
    103  - 
    104  - public IndexRequest buildIndexRequest(LogEntry logEntry){
    105  - try{
    106  - IndexRequestBuilder requestBuilder = client.prepareIndex(this.indexName, "requestresponse")
    107  - .setSource(
    108  - jsonBuilder().startObject()
    109  - .field("protocol", logEntry.protocol)
    110  - .field("method", logEntry.method)
    111  - .field("host", logEntry.hostname)
    112  - .field("path", logEntry.url.getPath())
    113  - .field("requesttime", logEntry.formattedRequestTime.equals("NA") ? null : logEntry.formattedRequestTime)
    114  - .field("responsetime", logEntry.formattedResponseTime.equals("NA") ? null : logEntry.formattedResponseTime)
    115  - .field("responsedelay", logEntry.requestResponseDelay)
    116  - .field("status", logEntry.responseStatus)
    117  - .field("title", logEntry.title)
    118  - .field("newcookies", logEntry.newCookies)
    119  - .field("sentcookies", logEntry.sentCookies)
    120  - .field("referrer", logEntry.referrerURL)
    121  - .field("requestcontenttype", logEntry.requestContentType)
    122  - .field("requestlength", logEntry.requestLength)
    123  - .field("responselength", logEntry.responseLength)
    124  - .field("requestbody", this.includeReqResp ? new String(logEntry.requestResponse.getRequest()) : "")
    125  - .field("responsebody", this.includeReqResp ? new String(logEntry.requestResponse.getResponse()) : "")
    126  - .endObject()
    127  - );
    128  - return requestBuilder.request();
    129  - } catch (IOException e) {
    130  - e.printStackTrace();
    131  - }
    132  - return null;
    133  - }
    134  - 
    135  - private void addToPending(LogEntry logEntry){
    136  - if(!this.isEnabled) return;
    137  - synchronized (pendingEntries) {
    138  - pendingEntries.add(logEntry);
    139  - }
    140  - }
    141  - 
    142  - private void indexPendingEntries(){
    143  - if(!this.isEnabled || this.pendingEntries.size() == 0) return;
    144  - 
    145  - BulkRequest httpBulkBuilder = new BulkRequest();
    146  - 
    147  - ArrayList<LogEntry> entriesInBulk;
    148  - synchronized (pendingEntries){
    149  - entriesInBulk = (ArrayList<LogEntry>) pendingEntries.clone();
    150  - pendingEntries.clear();
    151  - }
    152  - 
    153  - for (LogEntry logEntry : entriesInBulk) {
    154  - IndexRequest request = buildIndexRequest(logEntry);
    155  - if(request != null) {
    156  - httpBulkBuilder.add(request);
    157  - }else{
    158  - //Could not buildPreferences index request. Ignore it?
    159  - }
    160  - }
    161  - 
    162  - try {
    163  - BulkResponse bulkResponse = httpClient.bulk(httpBulkBuilder, RequestOptions.DEFAULT);
    164  - if(bulkResponse.hasFailures()){
    165  - for (BulkItemResponse bulkItemResponse : bulkResponse.getItems()) {
    166  - System.err.println(bulkItemResponse.getFailureMessage());
    167  - }
    168  - }
    169  - } catch (IOException e) {
    170  - e.printStackTrace();
    171  - }
    172  - 
    173  -// if(resp.hasFailures()){
    174  -// for (BulkItemResponse bulkItemResponse : resp.getItems()) {
    175  -// System.err.println(bulkItemResponse.getFailureMessage());
     30 +public class ElasticSearchLogger {
     31 + //TODO REIMPLEMENT
     32 +// IndicesAdminClient adminClient;
     33 +// Client client;
     34 +// RestHighLevelClient httpClient;
     35 +// ArrayList<LogEntry> pendingEntries;
     36 +// private InetAddress address;
     37 +// private int port;
     38 +// private String clusterName;
     39 +// private boolean isEnabled;
     40 +// private String indexName;
     41 +// private boolean includeReqResp;
     42 +//
     43 +// private final ScheduledExecutorService executorService;
     44 +// private ScheduledFuture indexTask;
     45 +//
     46 +//
     47 +// public ElasticSearchLogger(LogProcessor logProcessor){
     48 +// this.isEnabled = false;
     49 +// this.indexName = "logger";
     50 +//
     51 +// logProcessor.addLogListener(this);
     52 +// executorService = Executors.newScheduledThreadPool(1);
     53 +// }
     54 +//
     55 +// public void setEnabled(boolean isEnabled) throws UnknownHostException {
     56 +// if(isEnabled){
     57 +// this.address = InetAddress.getByName(LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_ADDRESS));
     58 +// this.port = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_PORT);
     59 +// this.clusterName = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_CLUSTER_NAME);
     60 +// this.indexName = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_INDEX);
     61 +// Settings settings = Settings.builder().put("cluster.name", this.clusterName).build();
     62 +//
     63 +// httpClient = new RestHighLevelClient(RestClient.builder(
     64 +// new HttpHost(this.address, this.port, "http")));
     65 +//
     66 +// createIndices();
     67 +// pendingEntries = new ArrayList<>();
     68 +// includeReqResp = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_INCLUDE_REQ_RESP);
     69 +// int delay = LoggerPlusPlus.preferences.getSetting(Globals.PREF_ELASTIC_DELAY);
     70 +// indexTask = executorService.scheduleAtFixedRate(() -> indexPendingEntries(), delay, delay, TimeUnit.SECONDS);
     71 +// }else{
     72 +// if(this.indexTask != null){
     73 +// indexTask.cancel(true);
    176 74  // }
     75 +// this.pendingEntries = null;
     76 +// this.client = null;
     77 +// this.adminClient = null;
    177 78  // }
    178  - }
    179  - 
    180  - @Override
    181  - public void onRequestAdded(int modelIndex, LogEntry logEntry, boolean hasResponse) {
    182  - if(!this.isEnabled) return;
    183  - if(hasResponse){
    184  - addToPending(logEntry);
    185  - }
    186  - }
    187  - 
    188  - @Override
    189  - public void onResponseUpdated(int modelRow, LogEntry existingEntry) {
    190  - if(!this.isEnabled) return;
    191  - addToPending(existingEntry);
    192  - }
    193  - 
    194  - @Override
    195  - public void onRequestRemoved(int modelIndex, LogEntry logEntry) {
    196  - 
    197  - }
    198  - 
    199  - @Override
    200  - public void onLogsCleared() {
    201  - 
    202  - }
     79 +// this.isEnabled = isEnabled;
     80 +// }
     81 +//
     82 +// private void createIndices(){
     83 +// GetIndexRequest request = new GetIndexRequest();
     84 +// request.indices(this.indexName);
     85 +//
     86 +// boolean exists = false;
     87 +// try {
     88 +// exists = httpClient.indices().exists(request, RequestOptions.DEFAULT);
     89 +// } catch (IOException e) {
     90 +// e.printStackTrace();
     91 +// }
     92 +//
     93 +// if(!exists) {
     94 +// CreateIndexRequest _request = new CreateIndexRequest(this.indexName);
     95 +//
     96 +// try {
     97 +// CreateIndexResponse createIndexResponse = httpClient.indices().create(_request, RequestOptions.DEFAULT);
     98 +// } catch (IOException e) {
     99 +// e.printStackTrace();
     100 +// }
     101 +// }
     102 +// }
     103 +//
     104 +// public IndexRequest buildIndexRequest(LogEntry logEntry){
     105 +// try{
     106 +// IndexRequestBuilder requestBuilder = client.prepareIndex(this.indexName, "requestresponse")
     107 +// .setSource(
     108 +// jsonBuilder().startObject()
     109 +// .field("protocol", logEntry.protocol)
     110 +// .field("method", logEntry.method)
     111 +// .field("host", logEntry.hostname)
     112 +// .field("path", logEntry.url.getPath())
     113 +// .field("requesttime", logEntry.formattedRequestTime.equals("NA") ? null : logEntry.formattedRequestTime)
     114 +// .field("responsetime", logEntry.formattedResponseTime.equals("NA") ? null : logEntry.formattedResponseTime)
     115 +// .field("responsedelay", logEntry.requestResponseDelay)
     116 +// .field("status", logEntry.responseStatus)
     117 +// .field("title", logEntry.title)
     118 +// .field("newcookies", logEntry.newCookies)
     119 +// .field("sentcookies", logEntry.sentCookies)
     120 +// .field("referrer", logEntry.referrerURL)
     121 +// .field("requestcontenttype", logEntry.requestContentType)
     122 +// .field("requestlength", logEntry.requestLength)
     123 +// .field("responselength", logEntry.responseLength)
     124 +// .field("requestbody", this.includeReqResp ? new String(logEntry.requestResponse.getRequest()) : "")
     125 +// .field("responsebody", this.includeReqResp ? new String(logEntry.requestResponse.getResponse()) : "")
     126 +// .endObject()
     127 +// );
     128 +// return requestBuilder.request();
     129 +// } catch (IOException e) {
     130 +// e.printStackTrace();
     131 +// }
     132 +// return null;
     133 +// }
     134 +//
     135 +// private void addToPending(LogEntry logEntry){
     136 +// if(!this.isEnabled) return;
     137 +// synchronized (pendingEntries) {
     138 +// pendingEntries.add(logEntry);
     139 +// }
     140 +// }
     141 +//
     142 +// private void indexPendingEntries(){
     143 +// if(!this.isEnabled || this.pendingEntries.size() == 0) return;
     144 +//
     145 +// BulkRequest httpBulkBuilder = new BulkRequest();
     146 +//
     147 +// ArrayList<LogEntry> entriesInBulk;
     148 +// synchronized (pendingEntries){
     149 +// entriesInBulk = (ArrayList<LogEntry>) pendingEntries.clone();
     150 +// pendingEntries.clear();
     151 +// }
     152 +//
     153 +// for (LogEntry logEntry : entriesInBulk) {
     154 +// IndexRequest request = buildIndexRequest(logEntry);
     155 +// if(request != null) {
     156 +// httpBulkBuilder.add(request);
     157 +// }else{
     158 +// //Could not buildPreferences index request. Ignore it?
     159 +// }
     160 +// }
     161 +//
     162 +// try {
     163 +// BulkResponse bulkResponse = httpClient.bulk(httpBulkBuilder, RequestOptions.DEFAULT);
     164 +// if(bulkResponse.hasFailures()){
     165 +// for (BulkItemResponse bulkItemResponse : bulkResponse.getItems()) {
     166 +// System.err.println(bulkItemResponse.getFailureMessage());
     167 +// }
     168 +// }
     169 +// } catch (IOException e) {
     170 +// e.printStackTrace();
     171 +// }
     172 +//
     173 +//// if(resp.hasFailures()){
     174 +//// for (BulkItemResponse bulkItemResponse : resp.getItems()) {
     175 +//// System.err.println(bulkItemResponse.getFailureMessage());
     176 +//// }
     177 +//// }
     178 +// }
     179 +//
     180 +// @Override
     181 +// public void onRequestAdded(int modelIndex, LogEntry logEntry, boolean hasResponse) {
     182 +// if(!this.isEnabled) return;
     183 +// if(hasResponse){
     184 +// addToPending(logEntry);
     185 +// }
     186 +// }
     187 +//
     188 +// @Override
     189 +// public void onResponseUpdated(int modelRow, LogEntry existingEntry) {
     190 +// if(!this.isEnabled) return;
     191 +// addToPending(existingEntry);
     192 +// }
     193 +//
     194 +// @Override
     195 +// public void onRequestRemoved(int modelIndex, LogEntry logEntry) {
     196 +//
     197 +// }
     198 +//
     199 +// @Override
     200 +// public void onLogsCleared() {
     201 +//
     202 +// }
    203 203  }
    204 204   
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/logger/FileLogger.java
    skipped 4 lines
    5 5  import com.nccgroup.loggerplusplus.*;
    6 6  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    7 7  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    8  -import com.nccgroup.loggerplusplus.logentry.LogEntryListener;
    9 8  import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
    10 9  import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumn;
    11 10  import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumnModel;
    skipped 12 lines
    24 23  /**
    25 24   * Created by corey on 21/08/17.
    26 25   */
    27  -public class FileLogger implements LogEntryListener {
    28  - private FileWriter autoSaveWriter;
    29  - private File autoSaveFile;
    30  - private final ExcelExporter exp;
    31  - private boolean autoLogIncludeRequests = false;
    32  - private boolean autoLogIncludeResponses = false;
    33  - 
    34  - public FileLogger(){
    35  - exp = new ExcelExporter();
    36  - }
    37  - 
    38  - public void saveLogs(boolean fullLogs){
    39  - try {
    40  - File csvFile = getSaveFile("logger++_table", false);
    41  - if (csvFile != null) {
    42  - exp.exportTable(csvFile, fullLogs, false, true);
    43  - }
    44  - 
    45  - } catch (IOException ex) {
    46  - LoggerPlusPlus.callbacks.printError(ex.getMessage());
    47  - }
    48  - }
    49  - 
    50  - public void autoLogItem(LogEntry entry, boolean includeRequests, boolean includeResponses) {
    51  - exp.exportItem(entry, includeRequests, includeResponses);
    52  - }
    53  - 
    54  - // source: https://community.oracle.com/thread/1357495?start=0&tstart=0
    55  - private File getSaveFile(String filename, boolean allowAppend) {
    56  - File csvFile = null;
    57  - JFileChooser chooser = null;
    58  - FileNameExtensionFilter filter = new FileNameExtensionFilter("Excel Format (CSV)", "csv");
    59  - chooser = new JFileChooser();
    60  - chooser.setDialogTitle("Saving Database");
    61  - chooser.setFileFilter(filter);
    62  - chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    63  - chooser.setSelectedFile(new File(filename + ".csv"));
    64  - chooser.setAcceptAllFileFilterUsed(false);
    65  - 
    66  - int val = chooser.showSaveDialog(null);
    67  - 
    68  - if (val == JFileChooser.APPROVE_OPTION) {
    69  - csvFile = fixExtension(chooser.getSelectedFile(), "csv");
    70  - if (csvFile == null) {
    71  - JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(BurpExtender.instance.getUiComponent()), "File Name Specified Not Supported",
    72  - "File Name Error", JOptionPane.ERROR_MESSAGE);
    73  - return getSaveFile(filename, allowAppend);
    74  - }
    75  - 
    76  - try {
    77  - if (csvFile.exists()) {
    78  - if (allowAppend && validHeader(csvFile, false)) {
    79  - csvFile = appendOrOverwrite(csvFile);
    80  - } else {
    81  - csvFile = checkOverwrite(csvFile);
    82  - }
    83  - } else {
    84  - csvFile.createNewFile();
    85  - }
    86  - } catch (IOException e) {
    87  - MoreHelp.showMessage("Could not create file. Do you have permissions for the folder?");
    88  - return null;
    89  - }
    90  - return csvFile;
    91  - }
    92  - 
    93  - return null;
    94  - }
    95  - 
    96  - //Check if header in file matches that of the columns we will be exporting.
    97  - private boolean validHeader(File csvFile, boolean isFullLog) {
    98  - BufferedReader reader;
    99  - try {
    100  - reader = new BufferedReader(new FileReader(csvFile));
    101  - } catch (FileNotFoundException e) {
    102  - return true;
    103  - }
    104  - try {
    105  - String thisHeader = getCSVHeader(LoggerPlusPlus.instance.getLogTable(), isFullLog);
    106  - String oldHeader = reader.readLine();
    107  - return oldHeader == null || oldHeader.equalsIgnoreCase(thisHeader);
    108  - } catch (IOException e) {
    109  - return true;
    110  - }
    111  - }
    112  - 
    113  - private File fixExtension(File file, String prefExt) {
    114  - String fileName = file.getName();
    115  - String dir = file.getParentFile().getAbsolutePath();
    116  - 
    117  - String ext = null;
    118  - 
    119  - try {
    120  - ext = fileName.substring(fileName.lastIndexOf("."));
    121  - } catch (StringIndexOutOfBoundsException e) {
    122  - ext = null;
    123  - }
    124  - if (ext != null && !ext.equalsIgnoreCase("." + prefExt)) {
    125  - return file;
    126  - }
    127  - 
    128  - String csvName;
    129  - if (ext == null || ext.length() == 0) {
    130  - csvName = fileName + "." + prefExt;
    131  - } else {
    132  - csvName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + prefExt;
    133  - }
    134  - 
    135  - File csvCert = new File(dir, csvName);
    136  - 
    137  - return csvCert;
    138  - }
    139  - 
    140  - private File checkOverwrite(File file) throws IOException {
    141  - int val = JOptionPane.showConfirmDialog(null, "Replace Existing File?", "File Exists",
    142  - JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
    143  - 
    144  - if (val == JOptionPane.NO_OPTION) {
    145  - return getSaveFile(file.getName(), false);
    146  - } else if (val == JOptionPane.CANCEL_OPTION) {
    147  - return null;
    148  - }
    149  - file.delete();
    150  - file.createNewFile();
    151  - return file;
    152  - }
    153  - 
    154  - private File appendOrOverwrite(File file) throws IOException {
    155  - Object[] options = {"Append",
    156  - "Overwrite", "Cancel"};
    157  - int val = JOptionPane.showOptionDialog(null,
    158  - "Append to, or overwrite the existing file?", "File Exists",
    159  - JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
    160  - if (val == JOptionPane.YES_OPTION) {
    161  - return file;
    162  - } else if (val == JOptionPane.NO_OPTION) {
    163  - file.delete();
    164  - file.createNewFile();
    165  - return file;
    166  - } else {
    167  - return null;
    168  - }
    169  - }
    170  - 
    171  - 
    172  - public void setAutoSave(boolean enabled) {
    173  - if (enabled) {
    174  - autoSaveFile = getSaveFile("logger++_auto", true);
    175  - if (autoSaveFile != null) {
    176  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_AUTO_SAVE, true);
    177  - try {
    178  - autoSaveWriter = new FileWriter(autoSaveFile, true);
    179  - int result = JOptionPane.showConfirmDialog(null, "Include REQUEST bodies in the logs?","Automatic Logging", JOptionPane.YES_OPTION);
    180  - autoLogIncludeRequests = result == JOptionPane.YES_OPTION;
    181  - 
    182  - result = JOptionPane.showConfirmDialog(null, "Include RESPONSE bodies in the logs?","Automatic Logging", JOptionPane.YES_OPTION);
    183  - autoLogIncludeResponses = result == JOptionPane.YES_OPTION;
    184  - if (autoSaveFile.length() == 0)
    185  - exp.addHeader(autoSaveWriter, autoLogIncludeRequests, autoLogIncludeResponses);
    186  - 
    187  - LoggerPlusPlus.instance.getLogProcessor().addLogListener(this);
    188  - 
    189  - } catch (IOException e) {
    190  - autoSaveFile = null;
    191  - enabled = false;
    192  - }
    193  - } else {
    194  - enabled = false;
    195  - }
    196  - } else {
    197  - autoSaveFile = null;
    198  - try{
    199  - autoSaveWriter.close();
    200  - } catch (Exception e) {}
    201  - autoSaveWriter = null;
    202  - LoggerPlusPlus.instance.getLogProcessor().removeLogListener(this);
    203  - }
    204  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_AUTO_SAVE, enabled);
    205  - LoggerPlusPlus.instance.getLoggerOptionsPanel().setAutoSaveBtn(enabled);
    206  - }
    207  - 
    208  - @Override
    209  - public void onRequestAdded(int modelIndex, final LogEntry logEntry, boolean hasResponse) {
    210  - if(!hasResponse) return;
    211  - Thread saveThread = new Thread(){
    212  - @Override
    213  - public void run() {
    214  - synchronized (autoSaveWriter){
    215  - autoLogItem(logEntry, autoLogIncludeRequests, autoLogIncludeResponses);
    216  - }
    217  - }
    218  - };
    219  - saveThread.start();
    220  - }
    221  - 
    222  - @Override
    223  - public void onResponseUpdated(int modelRow, final LogEntry existingEntry) {
    224  - Thread saveThread = new Thread(){
    225  - @Override
    226  - public void run() {
    227  - synchronized (autoSaveWriter){
    228  - autoLogItem(existingEntry, autoLogIncludeRequests, autoLogIncludeResponses);
    229  - }
    230  - }
    231  - };
    232  - saveThread.start();
    233  - }
    234  - 
    235  - @Override
    236  - public void onRequestRemoved(int modelIndex, LogEntry logEntry) {
    237  - 
    238  - }
    239  - 
    240  - @Override
    241  - public void onLogsCleared() {
    242  - 
    243  - }
    244  - 
    245  - // source: http://book.javanb.com/swing-hacks/swinghacks-chp-3-sect-6.html
    246  - public class ExcelExporter {
    247  - 
    248  - public void addHeader(FileWriter writer, boolean isFullLog) throws IOException {
    249  - writer.write(getCSVHeader(LoggerPlusPlus.instance.getLogTable(), isFullLog) + "\n");
    250  - }
    251  - 
    252  - public void addHeader(FileWriter writer, boolean includeRequest, boolean includeResponse) throws IOException {
    253  - writer.write(getCSVHeader(LoggerPlusPlus.instance.getLogTable(), includeRequest, includeResponse) + "\n");
    254  - }
    255  - 
    256  - public void exportTable(File file, boolean isFullLog, boolean append, boolean header) throws IOException {
    257  - FileWriter out = new FileWriter(file, append);
    258  - 
    259  - if (header) {
    260  - out.write(getCSVHeader(LoggerPlusPlus.instance.getLogTable(), isFullLog));
    261  - out.write("\n");
    262  - }
    263  - 
    264  - for (LogEntry item : LoggerPlusPlus.instance.getLogProcessor().getLogEntries()) {
    265  - out.write(entryToCSVString(item, isFullLog) + "\n");
    266  - }
    267  - 
    268  - out.close();
    269  - MoreHelp.showMessage("Log saved to " + file.getAbsolutePath());
    270  - }
    271  - 
    272  - public void exportItem(LogEntry logEntry, boolean includeRequests, boolean includeResponses) {
    273  - if(autoSaveWriter != null) {
    274  - try {
    275  - autoSaveWriter.write(entryToCSVString(logEntry, includeRequests, includeResponses));
    276  - autoSaveWriter.write("\n");
    277  - autoSaveWriter.flush();
    278  - } catch (Exception e) {
    279  - MoreHelp.showMessage("Could not save log. Automatic logging will be disabled.");
    280  - setAutoSave(false);
    281  - }
    282  - }else{
    283  - MoreHelp.showMessage("Could not save log. Automatic logging will be disabled.");
    284  - setAutoSave(false);
    285  - }
    286  - }
    287  - 
    288  - }
    289  - 
    290  - public static String getCSVHeader(LogTable table, boolean isFullLog) {
    291  - return getCSVHeader(table, isFullLog, isFullLog);
    292  - }
    293  - 
    294  - public static String getCSVHeader(LogTable table, boolean includeRequest, boolean includeResponse) {
    295  - StringBuilder result = new StringBuilder();
    296  - 
    297  - boolean firstDone = false;
    298  - ArrayList<LogTableColumn> columns = new ArrayList<>();
    299  - Enumeration<TableColumn> columnEnumeration = table.getColumnModel().getColumns();
    300  - while(columnEnumeration.hasMoreElements()){
    301  - columns.add((LogTableColumn) columnEnumeration.nextElement());
    302  - }
    303  - 
    304  - columns.remove(table.getColumnModel().getColumnByIdentifier(LogEntryField.NUMBER));
    305  - 
    306  - Collections.sort(columns);
    307  - for (LogTableColumn logTableColumn : columns) {
    308  - if(logTableColumn.isVisible()) {
    309  - if(firstDone) {
    310  - result.append(",");
    311  - }else{
    312  - firstDone = true;
    313  - }
    314  - result.append(logTableColumn.getName());
    315  - }
    316  - }
    317  - 
    318  - if(includeRequest) {
    319  - result.append(",");
    320  - result.append("Request");
    321  - }
    322  - if(includeResponse) {
    323  - result.append(",");
    324  - result.append("Response");
    325  - }
    326  - return result.toString();
    327  - }
    328  - 
    329  - 
    330  - public String entryToCSVString(LogEntry logEntry, boolean isFullLog) {
    331  - return entryToCSVString(logEntry, isFullLog, isFullLog);
    332  - }
    333  - 
    334  - private String sanitize(String string){
    335  - if(string == null) return null;
    336  - if(string.length() == 0) return "";
    337  - char first = string.toCharArray()[0];
    338  - switch (first){
    339  - case '=':
    340  - case '-':
    341  - case '+':
    342  - case '@': {
    343  - return "'" + string;
    344  - }
    345  - }
    346  - return string;
    347  - }
    348  - 
    349  - public String entryToCSVString(LogEntry logEntry, boolean includeRequests, boolean includeResponses) {
    350  - StringBuilder result = new StringBuilder();
    351  - 
    352  - LogTableColumnModel columnModel = LoggerPlusPlus.instance.getLogTable().getColumnModel();
    353  - ArrayList<LogTableColumn> columns = new ArrayList<>();
    354  - Enumeration<TableColumn> columnEnumeration = columnModel.getColumns();
    355  - while(columnEnumeration.hasMoreElements()){
    356  - columns.add((LogTableColumn) columnEnumeration.nextElement());
    357  - }
    358  - 
    359  - columns.remove(columnModel.getColumnByIdentifier(LogEntryField.NUMBER));
    360  - 
    361  - Collections.sort(columns);
    362  - boolean firstDone = false;
    363  - for (LogTableColumn logTableColumn : columns) {
    364  - if(logTableColumn.isVisible() && logTableColumn.getIdentifier() != LogEntryField.NUMBER){
    365  - if(firstDone){
    366  - result.append(",");
    367  - }else{
    368  - firstDone = true;
    369  - }
    370  - String columnValue = String.valueOf(logEntry.getValueByKey(logTableColumn.getIdentifier()));
    371  - 
    372  - result.append(StringEscapeUtils.escapeCsv(sanitize(columnValue)));
    373  - }
    374  - }
    375  - 
    376  - IHttpRequestResponse requestResponse = logEntry.getRequestResponse();
    377  - if(includeRequests) {
    378  - 
    379  - result.append(",");
    380  - if (requestResponse != null && requestResponse.getRequest() != null)
    381  - result.append(StringEscapeUtils.escapeCsv(sanitize(new String(requestResponse.getRequest()))));
    382  - }
    383  - if(includeResponses) {
    384  - result.append(",");
    385  - if(requestResponse != null && requestResponse.getResponse() != null)
    386  - result.append(StringEscapeUtils.escapeCsv(sanitize(new String(requestResponse.getResponse()))));
    387  - }
    388  - return result.toString();
    389  - }
     26 +public class FileLogger {
     27 + //TODO REIMPLEMENT
     28 +// private FileWriter autoSaveWriter;
     29 +// private File autoSaveFile;
     30 +// private final ExcelExporter exp;
     31 +// private boolean autoLogIncludeRequests = false;
     32 +// private boolean autoLogIncludeResponses = false;
     33 +//
     34 +// public FileLogger(){
     35 +// exp = new ExcelExporter();
     36 +// }
     37 +//
     38 +// public void saveLogs(boolean fullLogs){
     39 +// try {
     40 +// File csvFile = getSaveFile("logger++_table", false);
     41 +// if (csvFile != null) {
     42 +// exp.exportTable(csvFile, fullLogs, false, true);
     43 +// }
     44 +//
     45 +// } catch (IOException ex) {
     46 +// LoggerPlusPlus.callbacks.printError(ex.getMessage());
     47 +// }
     48 +// }
     49 +//
     50 +// public void autoLogItem(LogEntry entry, boolean includeRequests, boolean includeResponses) {
     51 +// exp.exportItem(entry, includeRequests, includeResponses);
     52 +// }
     53 +//
     54 +// // source: https://community.oracle.com/thread/1357495?start=0&tstart=0
     55 +// private File getSaveFile(String filename, boolean allowAppend) {
     56 +// File csvFile = null;
     57 +// JFileChooser chooser = null;
     58 +// FileNameExtensionFilter filter = new FileNameExtensionFilter("Excel Format (CSV)", "csv");
     59 +// chooser = new JFileChooser();
     60 +// chooser.setDialogTitle("Saving Database");
     61 +// chooser.setFileFilter(filter);
     62 +// chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
     63 +// chooser.setSelectedFile(new File(filename + ".csv"));
     64 +// chooser.setAcceptAllFileFilterUsed(false);
     65 +//
     66 +// int val = chooser.showSaveDialog(null);
     67 +//
     68 +// if (val == JFileChooser.APPROVE_OPTION) {
     69 +// csvFile = fixExtension(chooser.getSelectedFile(), "csv");
     70 +// if (csvFile == null) {
     71 +// JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(BurpExtender.instance.getUiComponent()), "File Name Specified Not Supported",
     72 +// "File Name Error", JOptionPane.ERROR_MESSAGE);
     73 +// return getSaveFile(filename, allowAppend);
     74 +// }
     75 +//
     76 +// try {
     77 +// if (csvFile.exists()) {
     78 +// if (allowAppend && validHeader(csvFile, false)) {
     79 +// csvFile = appendOrOverwrite(csvFile);
     80 +// } else {
     81 +// csvFile = checkOverwrite(csvFile);
     82 +// }
     83 +// } else {
     84 +// csvFile.createNewFile();
     85 +// }
     86 +// } catch (IOException e) {
     87 +// MoreHelp.showMessage("Could not create file. Do you have permissions for the folder?");
     88 +// return null;
     89 +// }
     90 +// return csvFile;
     91 +// }
     92 +//
     93 +// return null;
     94 +// }
     95 +//
     96 +// //Check if header in file matches that of the columns we will be exporting.
     97 +// private boolean validHeader(File csvFile, boolean isFullLog) {
     98 +// BufferedReader reader;
     99 +// try {
     100 +// reader = new BufferedReader(new FileReader(csvFile));
     101 +// } catch (FileNotFoundException e) {
     102 +// return true;
     103 +// }
     104 +// try {
     105 +// String thisHeader = getCSVHeader(LoggerPlusPlus.instance.getLogTable(), isFullLog);
     106 +// String oldHeader = reader.readLine();
     107 +// return oldHeader == null || oldHeader.equalsIgnoreCase(thisHeader);
     108 +// } catch (IOException e) {
     109 +// return true;
     110 +// }
     111 +// }
     112 +//
     113 +// private File fixExtension(File file, String prefExt) {
     114 +// String fileName = file.getName();
     115 +// String dir = file.getParentFile().getAbsolutePath();
     116 +//
     117 +// String ext = null;
     118 +//
     119 +// try {
     120 +// ext = fileName.substring(fileName.lastIndexOf("."));
     121 +// } catch (StringIndexOutOfBoundsException e) {
     122 +// ext = null;
     123 +// }
     124 +// if (ext != null && !ext.equalsIgnoreCase("." + prefExt)) {
     125 +// return file;
     126 +// }
     127 +//
     128 +// String csvName;
     129 +// if (ext == null || ext.length() == 0) {
     130 +// csvName = fileName + "." + prefExt;
     131 +// } else {
     132 +// csvName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + prefExt;
     133 +// }
     134 +//
     135 +// File csvCert = new File(dir, csvName);
     136 +//
     137 +// return csvCert;
     138 +// }
     139 +//
     140 +// private File checkOverwrite(File file) throws IOException {
     141 +// int val = JOptionPane.showConfirmDialog(null, "Replace Existing File?", "File Exists",
     142 +// JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
     143 +//
     144 +// if (val == JOptionPane.NO_OPTION) {
     145 +// return getSaveFile(file.getName(), false);
     146 +// } else if (val == JOptionPane.CANCEL_OPTION) {
     147 +// return null;
     148 +// }
     149 +// file.delete();
     150 +// file.createNewFile();
     151 +// return file;
     152 +// }
     153 +//
     154 +// private File appendOrOverwrite(File file) throws IOException {
     155 +// Object[] options = {"Append",
     156 +// "Overwrite", "Cancel"};
     157 +// int val = JOptionPane.showOptionDialog(null,
     158 +// "Append to, or overwrite the existing file?", "File Exists",
     159 +// JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
     160 +// if (val == JOptionPane.YES_OPTION) {
     161 +// return file;
     162 +// } else if (val == JOptionPane.NO_OPTION) {
     163 +// file.delete();
     164 +// file.createNewFile();
     165 +// return file;
     166 +// } else {
     167 +// return null;
     168 +// }
     169 +// }
     170 +//
     171 +//
     172 +// public void setAutoSave(boolean enabled) {
     173 +// if (enabled) {
     174 +// autoSaveFile = getSaveFile("logger++_auto", true);
     175 +// if (autoSaveFile != null) {
     176 +// LoggerPlusPlus.preferences.setSetting(Globals.PREF_AUTO_SAVE, true);
     177 +// try {
     178 +// autoSaveWriter = new FileWriter(autoSaveFile, true);
     179 +// int result = JOptionPane.showConfirmDialog(null, "Include REQUEST bodies in the logs?","Automatic Logging", JOptionPane.YES_OPTION);
     180 +// autoLogIncludeRequests = result == JOptionPane.YES_OPTION;
     181 +//
     182 +// result = JOptionPane.showConfirmDialog(null, "Include RESPONSE bodies in the logs?","Automatic Logging", JOptionPane.YES_OPTION);
     183 +// autoLogIncludeResponses = result == JOptionPane.YES_OPTION;
     184 +// if (autoSaveFile.length() == 0)
     185 +// exp.addHeader(autoSaveWriter, autoLogIncludeRequests, autoLogIncludeResponses);
     186 +//
     187 +// LoggerPlusPlus.instance.getLogProcessor().addLogListener(this);
     188 +//
     189 +// } catch (IOException e) {
     190 +// autoSaveFile = null;
     191 +// enabled = false;
     192 +// }
     193 +// } else {
     194 +// enabled = false;
     195 +// }
     196 +// } else {
     197 +// autoSaveFile = null;
     198 +// try{
     199 +// autoSaveWriter.close();
     200 +// } catch (Exception e) {}
     201 +// autoSaveWriter = null;
     202 +// LoggerPlusPlus.instance.getLogProcessor().removeLogListener(this);
     203 +// }
     204 +// LoggerPlusPlus.preferences.setSetting(Globals.PREF_AUTO_SAVE, enabled);
     205 +// LoggerPlusPlus.instance.getLoggerOptionsPanel().setAutoSaveBtn(enabled);
     206 +// }
     207 +//
     208 +// @Override
     209 +// public void onRequestAdded(int modelIndex, final LogEntry logEntry, boolean hasResponse) {
     210 +// if(!hasResponse) return;
     211 +// Thread saveThread = new Thread(){
     212 +// @Override
     213 +// public void run() {
     214 +// synchronized (autoSaveWriter){
     215 +// autoLogItem(logEntry, autoLogIncludeRequests, autoLogIncludeResponses);
     216 +// }
     217 +// }
     218 +// };
     219 +// saveThread.start();
     220 +// }
     221 +//
     222 +// @Override
     223 +// public void onResponseUpdated(int modelRow, final LogEntry existingEntry) {
     224 +// Thread saveThread = new Thread(){
     225 +// @Override
     226 +// public void run() {
     227 +// synchronized (autoSaveWriter){
     228 +// autoLogItem(existingEntry, autoLogIncludeRequests, autoLogIncludeResponses);
     229 +// }
     230 +// }
     231 +// };
     232 +// saveThread.start();
     233 +// }
     234 +//
     235 +// @Override
     236 +// public void onRequestRemoved(int modelIndex, LogEntry logEntry) {
     237 +//
     238 +// }
     239 +//
     240 +// @Override
     241 +// public void onLogsCleared() {
     242 +//
     243 +// }
     244 +//
     245 +// // source: http://book.javanb.com/swing-hacks/swinghacks-chp-3-sect-6.html
     246 +// public class ExcelExporter {
     247 +//
     248 +// public void addHeader(FileWriter writer, boolean isFullLog) throws IOException {
     249 +// writer.write(getCSVHeader(LoggerPlusPlus.instance.getLogTable(), isFullLog) + "\n");
     250 +// }
     251 +//
     252 +// public void addHeader(FileWriter writer, boolean includeRequest, boolean includeResponse) throws IOException {
     253 +// writer.write(getCSVHeader(LoggerPlusPlus.instance.getLogTable(), includeRequest, includeResponse) + "\n");
     254 +// }
     255 +//
     256 +// public void exportTable(File file, boolean isFullLog, boolean append, boolean header) throws IOException {
     257 +// FileWriter out = new FileWriter(file, append);
     258 +//
     259 +// if (header) {
     260 +// out.write(getCSVHeader(LoggerPlusPlus.instance.getLogTable(), isFullLog));
     261 +// out.write("\n");
     262 +// }
     263 +//
     264 +// for (LogEntry item : LoggerPlusPlus.instance.getLogProcessor().getLogEntries()) {
     265 +// out.write(entryToCSVString(item, isFullLog) + "\n");
     266 +// }
     267 +//
     268 +// out.close();
     269 +// MoreHelp.showMessage("Log saved to " + file.getAbsolutePath());
     270 +// }
     271 +//
     272 +// public void exportItem(LogEntry logEntry, boolean includeRequests, boolean includeResponses) {
     273 +// if(autoSaveWriter != null) {
     274 +// try {
     275 +// autoSaveWriter.write(entryToCSVString(logEntry, includeRequests, includeResponses));
     276 +// autoSaveWriter.write("\n");
     277 +// autoSaveWriter.flush();
     278 +// } catch (Exception e) {
     279 +// MoreHelp.showMessage("Could not save log. Automatic logging will be disabled.");
     280 +// setAutoSave(false);
     281 +// }
     282 +// }else{
     283 +// MoreHelp.showMessage("Could not save log. Automatic logging will be disabled.");
     284 +// setAutoSave(false);
     285 +// }
     286 +// }
     287 +//
     288 +// }
     289 +//
     290 +// public static String getCSVHeader(LogTable table, boolean isFullLog) {
     291 +// return getCSVHeader(table, isFullLog, isFullLog);
     292 +// }
     293 +//
     294 +// public static String getCSVHeader(LogTable table, boolean includeRequest, boolean includeResponse) {
     295 +// StringBuilder result = new StringBuilder();
     296 +//
     297 +// boolean firstDone = false;
     298 +// ArrayList<LogTableColumn> columns = new ArrayList<>();
     299 +// Enumeration<TableColumn> columnEnumeration = table.getColumnModel().getColumns();
     300 +// while(columnEnumeration.hasMoreElements()){
     301 +// columns.add((LogTableColumn) columnEnumeration.nextElement());
     302 +// }
     303 +//
     304 +// columns.remove(table.getColumnModel().getColumnByIdentifier(LogEntryField.NUMBER));
     305 +//
     306 +// Collections.sort(columns);
     307 +// for (LogTableColumn logTableColumn : columns) {
     308 +// if(logTableColumn.isVisible()) {
     309 +// if(firstDone) {
     310 +// result.append(",");
     311 +// }else{
     312 +// firstDone = true;
     313 +// }
     314 +// result.append(logTableColumn.getName());
     315 +// }
     316 +// }
     317 +//
     318 +// if(includeRequest) {
     319 +// result.append(",");
     320 +// result.append("Request");
     321 +// }
     322 +// if(includeResponse) {
     323 +// result.append(",");
     324 +// result.append("Response");
     325 +// }
     326 +// return result.toString();
     327 +// }
     328 +//
     329 +//
     330 +// public String entryToCSVString(LogEntry logEntry, boolean isFullLog) {
     331 +// return entryToCSVString(logEntry, isFullLog, isFullLog);
     332 +// }
     333 +//
     334 +// private String sanitize(String string){
     335 +// if(string == null) return null;
     336 +// if(string.length() == 0) return "";
     337 +// char first = string.toCharArray()[0];
     338 +// switch (first){
     339 +// case '=':
     340 +// case '-':
     341 +// case '+':
     342 +// case '@': {
     343 +// return "'" + string;
     344 +// }
     345 +// }
     346 +// return string;
     347 +// }
     348 +//
     349 +// public String entryToCSVString(LogEntry logEntry, boolean includeRequests, boolean includeResponses) {
     350 +// StringBuilder result = new StringBuilder();
     351 +//
     352 +// LogTableColumnModel columnModel = LoggerPlusPlus.instance.getLogTable().getColumnModel();
     353 +// ArrayList<LogTableColumn> columns = new ArrayList<>();
     354 +// Enumeration<TableColumn> columnEnumeration = columnModel.getColumns();
     355 +// while(columnEnumeration.hasMoreElements()){
     356 +// columns.add((LogTableColumn) columnEnumeration.nextElement());
     357 +// }
     358 +//
     359 +// columns.remove(columnModel.getColumnByIdentifier(LogEntryField.NUMBER));
     360 +//
     361 +// Collections.sort(columns);
     362 +// boolean firstDone = false;
     363 +// for (LogTableColumn logTableColumn : columns) {
     364 +// if(logTableColumn.isVisible() && logTableColumn.getIdentifier() != LogEntryField.NUMBER){
     365 +// if(firstDone){
     366 +// result.append(",");
     367 +// }else{
     368 +// firstDone = true;
     369 +// }
     370 +// String columnValue = String.valueOf(logEntry.getValueByKey(logTableColumn.getIdentifier()));
     371 +//
     372 +// result.append(StringEscapeUtils.escapeCsv(sanitize(columnValue)));
     373 +// }
     374 +// }
     375 +//
     376 +// IHttpRequestResponse requestResponse = logEntry.getRequestResponse();
     377 +// if(includeRequests) {
     378 +//
     379 +// result.append(",");
     380 +// if (requestResponse != null && requestResponse.getRequest() != null)
     381 +// result.append(StringEscapeUtils.escapeCsv(sanitize(new String(requestResponse.getRequest()))));
     382 +// }
     383 +// if(includeResponses) {
     384 +// result.append(",");
     385 +// if(requestResponse != null && requestResponse.getResponse() != null)
     386 +// result.append(StringEscapeUtils.escapeCsv(sanitize(new String(requestResponse.getResponse()))));
     387 +// }
     388 +// return result.toString();
     389 +// }
    390 390   
    391 391  }
    392 392   
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logging/LoggingController.java
     1 +package com.nccgroup.loggerplusplus.logging;
     2 + 
     3 +import burp.IBurpExtenderCallbacks;
     4 +import com.coreyd97.BurpExtenderUtilities.IGsonProvider;
     5 +import com.coreyd97.BurpExtenderUtilities.ILogProvider;
     6 +import com.coreyd97.BurpExtenderUtilities.Preferences;
     7 +import com.nccgroup.loggerplusplus.LoggerPlusPlus;
     8 +import com.nccgroup.loggerplusplus.util.Globals;
     9 + 
     10 +public class LoggingController implements ILogProvider {
     11 + 
     12 + private final LoggerPlusPlus loggerPlusPlus;
     13 + private final IGsonProvider gsonProvider;
     14 + private IBurpExtenderCallbacks callbacks;
     15 + 
     16 + public LoggingController(LoggerPlusPlus loggerPlusPlus){
     17 + this.loggerPlusPlus = loggerPlusPlus;
     18 + this.gsonProvider = loggerPlusPlus.getGsonProvider();
     19 + this.callbacks = LoggerPlusPlus.callbacks;
     20 + }
     21 + 
     22 + @Override
     23 + public void logOutput(String message) {
     24 + callbacks.printOutput(message);
     25 + 
     26 + Preferences preferences = loggerPlusPlus.getPreferencesController() != null ?
     27 + loggerPlusPlus.getPreferencesController().getPreferences() : null;
     28 + 
     29 + if(preferences == null) {
     30 + Boolean isDebug = gsonProvider.getGson().fromJson(callbacks.loadExtensionSetting(Globals.PREF_IS_DEBUG), Boolean.class);
     31 + if(isDebug != null && isDebug){
     32 + System.out.println(message);
     33 + }
     34 + }else{
     35 + if (preferences.getSetting(Globals.PREF_IS_DEBUG) != null
     36 + && (boolean) preferences.getSetting(Globals.PREF_IS_DEBUG)) {
     37 + System.out.println(message);
     38 + }
     39 + }
     40 + }
     41 + 
     42 + @Override
     43 + public void logError(String errorMessage) {
     44 + callbacks.printError(errorMessage);
     45 + 
     46 + Preferences preferences = loggerPlusPlus.getPreferencesController() != null ?
     47 + loggerPlusPlus.getPreferencesController().getPreferences() : null;
     48 + 
     49 + if(preferences == null) {
     50 + Boolean isDebug = gsonProvider.getGson().fromJson(callbacks.loadExtensionSetting(Globals.PREF_IS_DEBUG), Boolean.class);
     51 + if(isDebug != null && isDebug){
     52 + System.err.println(errorMessage);
     53 + }
     54 + }else{
     55 + if (preferences.getSetting(Globals.PREF_IS_DEBUG) != null
     56 + && (boolean) preferences.getSetting(Globals.PREF_IS_DEBUG)) {
     57 + System.err.println(errorMessage);
     58 + }
     59 + }
     60 + }
     61 +}
     62 + 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/LogViewController.java
     1 +package com.nccgroup.loggerplusplus.logview;
     2 + 
     3 +import com.coreyd97.BurpExtenderUtilities.Preferences;
     4 +import com.coreyd97.BurpExtenderUtilities.VariableViewPanel;
     5 +import com.nccgroup.loggerplusplus.LoggerPlusPlus;
     6 +import com.nccgroup.loggerplusplus.filter.logfilter.LogFilterController;
     7 +import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
     8 +import com.nccgroup.loggerplusplus.logview.entryviewer.RequestViewerController;
     9 +import com.nccgroup.loggerplusplus.logview.logtable.LogTableController;
     10 +import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
     11 + 
     12 +import static com.nccgroup.loggerplusplus.util.Globals.PREF_AUTO_IMPORT_PROXY_HISTORY;
     13 + 
     14 +public class LogViewController {
     15 + 
     16 + private final LoggerPlusPlus loggerPlusPlus;
     17 + private final FilterLibraryController filterLibraryController;
     18 + private final Preferences preferences;
     19 + private final LogFilterController logFilterController;
     20 + private final LogTableController logTableController;
     21 + private final RequestViewerController requestViewerController;
     22 + 
     23 + private final LogViewPanel logViewPanel;
     24 + 
     25 + public LogViewController(LoggerPlusPlus loggerPlusPlus, FilterLibraryController filterLibraryController){
     26 + this.loggerPlusPlus = loggerPlusPlus;
     27 + this.filterLibraryController = filterLibraryController;
     28 + this.preferences = loggerPlusPlus.getPreferencesController().getPreferences();
     29 + 
     30 + this.logTableController = new LogTableController(this, filterLibraryController);
     31 + this.logFilterController = new LogFilterController(this);
     32 + this.requestViewerController = new RequestViewerController(this, false, false);
     33 + 
     34 + //Build UI
     35 + this.logViewPanel = new LogViewPanel(this);
     36 + }
     37 + 
     38 + public void setPanelLayout(VariableViewPanel.View view){
     39 + this.logViewPanel.getTableViewerSplitPanel().setView(view);
     40 + }
     41 + 
     42 + public void setEntryViewerLayout(VariableViewPanel.View view){
     43 + this.logViewPanel.getRequestViewerPanel().getVariableViewPanel().setView(view);
     44 + }
     45 + 
     46 + public LoggerPlusPlus getLoggerPlusPlus() {
     47 + return loggerPlusPlus;
     48 + }
     49 + 
     50 + public LogViewPanel getLogViewPanel() {
     51 + return logViewPanel;
     52 + }
     53 + 
     54 + public LogFilterController getLogFilterController() {
     55 + return logFilterController;
     56 + }
     57 + 
     58 + public LogTableController getLogTableController() {
     59 + return logTableController;
     60 + }
     61 + 
     62 + public RequestViewerController getRequestViewerController() {
     63 + return requestViewerController;
     64 + }
     65 + 
     66 + public Preferences getPreferences() {
     67 + return preferences;
     68 + }
     69 +}
     70 + 
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/LogViewPanel.java
    skipped 1 lines
    2 2   
    3 3  import com.coreyd97.BurpExtenderUtilities.Alignment;
    4 4  import com.coreyd97.BurpExtenderUtilities.PanelBuilder;
    5  -import com.nccgroup.loggerplusplus.logentry.LogProcessor;
    6  -import com.nccgroup.loggerplusplus.LoggerPlusPlus;
     5 +import com.coreyd97.BurpExtenderUtilities.Preferences;
     6 +import com.coreyd97.BurpExtenderUtilities.VariableViewPanel;
     7 +import com.nccgroup.loggerplusplus.logview.entryviewer.RequestViewerPanel;
    7 8  import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
    8  -import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumnModel;
    9  -import com.nccgroup.loggerplusplus.userinterface.LogTableModel;
    10 9  import com.nccgroup.loggerplusplus.util.Globals;
    11 10   
    12 11  import javax.swing.*;
    13 12  import java.awt.*;
    14  -import java.awt.event.*;
     13 +import java.awt.event.MouseAdapter;
     14 +import java.awt.event.MouseEvent;
    15 15   
    16 16  /**
    17 17   * Created by corey on 24/08/17.
    18 18   */
    19 19  public class LogViewPanel extends JPanel {
    20 20   
    21  - final LogTable logTable;
    22  - final JScrollPane logTableScrollPane;
     21 + private final LogViewController controller;
     22 + private final Preferences preferences;
     23 + private final MainControlsPanel mainControlsPanel;
     24 + private final LogTable logTable;
     25 + private final JScrollPane logTableScrollPane;
     26 + private final RequestViewerPanel requestViewerPanel;
     27 + private final VariableViewPanel tableViewerSplitPanel;
    23 28   
    24  - public LogViewPanel(LogProcessor logProcessor){
    25  - this.setLayout(new BorderLayout());
     29 + public LogViewPanel(LogViewController controller){
     30 + this.controller = controller;
     31 + this.preferences = controller.getPreferences();
     32 + 
     33 + mainControlsPanel = new MainControlsPanel(controller.getLogFilterController());
     34 + 
     35 + logTable = controller.getLogTableController().getLogTable();
    26 36   
    27  - LogTableColumnModel columnModel = new LogTableColumnModel();
    28  - LogTableModel tableModel = new LogTableModel(logProcessor, columnModel);
    29  - logTable = new LogTable(tableModel, columnModel);
    30 37   logTableScrollPane = new JScrollPane(logTable,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
    31 38   ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);//View
    32 39   logTableScrollPane.addMouseWheelListener(mouseWheelEvent -> {
    33 40   JScrollBar scrollBar = logTableScrollPane.getVerticalScrollBar();
    34  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_AUTO_SCROLL,
     41 + preferences.setSetting(Globals.PREF_AUTO_SCROLL,
    35 42   scrollBar.getValue() + scrollBar.getHeight() >= scrollBar.getMaximum());
    36 43   });
    37 44   logTableScrollPane.getVerticalScrollBar().addMouseListener(new MouseAdapter() {
    38 45   @Override
    39 46   public void mouseReleased(MouseEvent mouseEvent) {
    40 47   JScrollBar scrollBar = logTableScrollPane.getVerticalScrollBar();
    41  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_AUTO_SCROLL,
     48 + preferences.setSetting(Globals.PREF_AUTO_SCROLL,
    42 49   scrollBar.getValue() + scrollBar.getHeight() >= scrollBar.getMaximum());
    43 50   }
    44 51   });
    45 52   
    46  - this.add(this.logTableScrollPane, BorderLayout.CENTER);
     53 + requestViewerPanel = controller.getRequestViewerController().getRequestViewerPanel();
     54 + 
     55 + tableViewerSplitPanel = new VariableViewPanel(controller.getPreferences(), Globals.PREF_LAYOUT,
     56 + logTableScrollPane, "Log Table",
     57 + requestViewerPanel, "Request/Response", VariableViewPanel.View.VERTICAL);
     58 + 
     59 + buildUI();
     60 + }
     61 + 
     62 + private void buildUI(){
     63 + this.removeAll();
     64 + this.setLayout(new BorderLayout());
     65 + 
     66 + PanelBuilder panelBuilder = new PanelBuilder();
     67 + JPanel panel = panelBuilder.build(new Component[][]{
     68 + new Component[]{mainControlsPanel},
     69 + new Component[]{tableViewerSplitPanel},
     70 + }, new int[][]{
     71 + new int[]{0},
     72 + new int[]{1}
     73 + }, Alignment.FILL, 1.0, 1.0);
     74 + 
     75 + this.add(panel, BorderLayout.CENTER);
     76 + }
     77 + 
     78 + public VariableViewPanel getTableViewerSplitPanel() {
     79 + return tableViewerSplitPanel;
     80 + }
     81 + 
     82 + public RequestViewerPanel getRequestViewerPanel() {
     83 + return requestViewerPanel;
    47 84   }
    48 85   
    49 86   public LogTable getLogTable() {
    skipped 8 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/MainControlsPanel.java src/main/java/com/nccgroup/loggerplusplus/logview/MainControlsPanel.java
    1  -package com.nccgroup.loggerplusplus.userinterface;
     1 +package com.nccgroup.loggerplusplus.logview;
    2 2   
    3 3  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    4 4  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilterController;
    5  -import com.nccgroup.loggerplusplus.userinterface.dialog.ColorFilterDialog;
     5 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterDialog;
    6 6   
    7 7  import javax.swing.*;
    8 8  import java.awt.*;
    skipped 27 lines
    36 36   
    37 37   final JButton clearLogsButton = new JButton("Clear Logs");
    38 38   clearLogsButton.addActionListener(actionEvent ->
    39  - LoggerPlusPlus.instance.getLogProcessor().clearEntries());
     39 + logFilterController.getLogViewController().getLogTableController().reset());
    40 40   
    41 41   gbc.gridx = 4;
    42 42   gbc.weightx = 0;
    skipped 6 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/MultipleLogEntryMenu.java
    skipped 2 lines
    3 3  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    4 4  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    5 5  import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
     6 +import com.nccgroup.loggerplusplus.logview.logtable.LogTableController;
    6 7   
    7 8  import javax.swing.*;
    8 9  import java.awt.datatransfer.Clipboard;
    skipped 7 lines
    16 17   */
    17 18  public class MultipleLogEntryMenu extends JPopupMenu {
    18 19   
    19  - public MultipleLogEntryMenu(final LogTable logTable, final List<LogEntry> selectedEntries){
     20 + public MultipleLogEntryMenu(final LogTableController logTableController, final List<LogEntry> selectedEntries){
     21 + final LogTable logTable = logTableController.getLogTable();
    20 22   final boolean isPro = LoggerPlusPlus.callbacks.getBurpVersion()[0].equals("Burp Suite Professional");
    21 23   
    22 24   this.add(new JMenuItem(selectedEntries.size() + " items"));
    skipped 133 lines
    156 158   //If we don't clear the selection, the table will select the next entry after row is deleted
    157 159   //This causes the request response viewer to change after each and slow the process.
    158 160   logTable.getSelectionModel().clearSelection();
    159  - LoggerPlusPlus.instance.getLogProcessor().removeLogEntries(selectedEntries);
    160  - 
     161 + logTable.getModel().removeLogEntries(selectedEntries);
    161 162   }
    162 163   });
    163 164   this.add(removeItem);
    skipped 21 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/RequestViewerController.java
    1  -package com.nccgroup.loggerplusplus.logview;
    2  - 
    3  -import burp.*;
    4  - 
    5  -public class RequestViewerController implements IMessageEditorController {
    6  - 
    7  - private IHttpRequestResponse currentItem;
    8  - private IMessageEditor requestEditor;
    9  - private IMessageEditor responseEditor;
    10  - 
    11  - public RequestViewerController(IBurpExtenderCallbacks callbacks, boolean requestEditable, boolean responseEditable){
    12  - requestEditor = callbacks.createMessageEditor(this, requestEditable);
    13  - responseEditor = callbacks.createMessageEditor(this, responseEditable);
    14  - }
    15  - 
    16  - public IHttpRequestResponse getDisplayedEntity() {
    17  - return this.currentItem;
    18  - }
    19  - 
    20  - public void setDisplayedEntity(IHttpRequestResponse requestResponse) {
    21  - if(requestResponse != null && requestResponse.equals(currentItem)) return;
    22  - 
    23  - this.currentItem = requestResponse;
    24  - if (requestResponse != null && requestResponse.getRequest() != null) {
    25  - requestEditor.setMessage(requestResponse.getRequest(), true);
    26  - }else{
    27  - requestEditor.setMessage(new byte[0], false);
    28  - }
    29  - 
    30  - if (requestResponse != null && requestResponse.getResponse() != null) {
    31  - responseEditor.setMessage(requestResponse.getResponse(), false);
    32  - }else {
    33  - responseEditor.setMessage(new byte[0], false);
    34  - }
    35  - }
    36  - 
    37  - public IMessageEditor getRequestEditor() {
    38  - return requestEditor;
    39  - }
    40  - 
    41  - public IMessageEditor getResponseEditor() {
    42  - return responseEditor;
    43  - }
    44  - 
    45  - @Override
    46  - public byte[] getRequest()
    47  - {
    48  - if(currentItem == null || currentItem.getRequest() == null)
    49  - return new byte[0];
    50  - else
    51  - return currentItem.getRequest();
    52  - }
    53  - 
    54  - @Override
    55  - public byte[] getResponse()
    56  - {
    57  - if(currentItem == null || currentItem.getResponse() == null)
    58  - return new byte[0];
    59  - else
    60  - return currentItem.getResponse();
    61  - }
    62  - 
    63  - @Override
    64  - public IHttpService getHttpService()
    65  - {
    66  - if(currentItem == null) return null;
    67  - return currentItem.getHttpService();
    68  - }
    69  -}
    70  - 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/SingleLogEntryMenu.java
    skipped 7 lines
    8 8  import com.nccgroup.loggerplusplus.filter.parser.ParseException;
    9 9  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    10 10  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    11  -import com.nccgroup.loggerplusplus.logentry.LogProcessor;
    12 11  import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
    13  -import com.nccgroup.loggerplusplus.userinterface.dialog.ColorFilterDialog;
     12 +import com.nccgroup.loggerplusplus.logview.logtable.LogTableController;
     13 +import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
     14 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterDialog;
    14 15  import com.nccgroup.loggerplusplus.util.Globals;
    15 16   
    16 17  import javax.swing.*;
    skipped 11 lines
    28 29   */
    29 30  public class SingleLogEntryMenu extends JPopupMenu {
    30 31   
    31  - public SingleLogEntryMenu(final LogTable logTable, final LogEntry entry, final LogEntryField selectedField){
     32 + public SingleLogEntryMenu(final LogTableController logTableController, final LogEntry entry, final LogEntryField selectedField){
     33 + final LogTable logTable = logTableController.getLogTable();
    32 34   final String columnName = selectedField.getFullLabel();
    33 35   final Object columnValue = entry.getValueByKey(selectedField);
    34 36   final String columnValueString;
    skipped 19 lines
    54 56   JMenuItem useAsFilter = new JMenuItem(new AbstractAction("Use " + columnName + " Value As LogFilter") {
    55 57   @Override
    56 58   public void actionPerformed(ActionEvent actionEvent) {
    57  - LoggerPlusPlus.instance.getLogFilterController().setFilter(columnName + "==" + columnValueString);
     59 + logTableController.getLogViewController().getLogFilterController().setFilter(columnName + "==" + columnValueString);
    58 60   }
    59 61   });
    60 62   this.add(useAsFilter);
    skipped 4 lines
    65 67   @Override
    66 68   public void actionPerformed(ActionEvent actionEvent) {
    67 69   String newFilter = logTable.getCurrentFilter().addConditionToFilter(LogicalOperator.AND, selectedField, BooleanOperator.EQUAL, columnValueString);
    68  - LoggerPlusPlus.instance.getLogFilterController().setFilter(newFilter);
     70 + logTableController.getLogViewController().getLogFilterController().setFilter(newFilter);
    69 71   }
    70 72   });
    71 73   JMenuItem orFilter = new JMenuItem(new AbstractAction(LogicalOperator.OR.getLabel()) {
    72 74   @Override
    73 75   public void actionPerformed(ActionEvent actionEvent) {
    74 76   String newFilter = logTable.getCurrentFilter().addConditionToFilter(LogicalOperator.OR, selectedField, BooleanOperator.EQUAL, columnValueString);
    75  - LoggerPlusPlus.instance.getLogFilterController().setFilter(newFilter);
     77 + logTableController.getLogViewController().getLogFilterController().setFilter(newFilter);
    76 78   }
    77 79   });
    78 80   addToCurrentFilter.add(andFilter);
    skipped 8 lines
    87 89   ColorFilter colorFilter = new ColorFilter();
    88 90   colorFilter.setFilter(new LogFilter(LoggerPlusPlus.instance.getLibraryController(),
    89 91   columnName + " == " + columnValueString));
    90  - HashMap<UUID, ColorFilter> colorFilters = LoggerPlusPlus.preferences.getSetting(PREF_COLOR_FILTERS);
    91  - colorFilters.put(colorFilter.getUUID(), colorFilter);
     92 + logTableController.getLogViewController().getLoggerPlusPlus().getLibraryController().addColorFilter(colorFilter);
    92 93   ColorFilterDialog colorFilterDialog = new ColorFilterDialog(LoggerPlusPlus.instance.getLibraryController());
    93 94   colorFilterDialog.setVisible(true);
    94 95   } catch (ParseException e1) {
    skipped 99 lines
    194 195   sendToComparer.add(comparerResponse);
    195 196   this.add(sendToComparer);
    196 197   
    197  - if((Boolean) LoggerPlusPlus.instance.getPreferences().getSetting(Globals.PREF_IS_DEBUG) && entry.requestResponse != null){
     198 + if((Boolean) logTableController.getPreferences().getSetting(Globals.PREF_IS_DEBUG) && entry.requestResponse != null){
    198 199   this.add(new JPopupMenu.Separator());
    199 200   JMenuItem reprocessItem = new JMenuItem(new AbstractAction("Reprocess Entry") {
    200 201   @Override
    skipped 12 lines
    213 214   JMenuItem removeItem = new JMenuItem(new AbstractAction("Remove Item") {
    214 215   @Override
    215 216   public void actionPerformed(ActionEvent actionEvent) {
    216  - LoggerPlusPlus.instance.getLogProcessor().removeLogEntry(entry);
     217 + logTable.getModel().removeLogEntry(entry);
    217 218   }
    218 219   });
    219 220   this.add(removeItem);
    skipped 3 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/entryviewer/RequestViewerController.java
     1 +package com.nccgroup.loggerplusplus.logview.entryviewer;
     2 + 
     3 +import burp.*;
     4 +import com.coreyd97.BurpExtenderUtilities.Preferences;
     5 +import com.nccgroup.loggerplusplus.LoggerPlusPlus;
     6 +import com.nccgroup.loggerplusplus.logview.LogViewController;
     7 + 
     8 +public class RequestViewerController implements IMessageEditorController {
     9 + 
     10 + private final LogViewController logViewController;
     11 + private final Preferences preferences;
     12 + private final IMessageEditor requestEditor;
     13 + private final IMessageEditor responseEditor;
     14 + private final RequestViewerPanel requestViewerPanel;
     15 + 
     16 + private IHttpRequestResponse currentItem;
     17 + 
     18 + public RequestViewerController(LogViewController logViewController, boolean requestEditable, boolean responseEditable){
     19 + this.logViewController = logViewController;
     20 + this.preferences = logViewController.getPreferences();
     21 + this.requestEditor = LoggerPlusPlus.callbacks.createMessageEditor(this, requestEditable);
     22 + this.responseEditor = LoggerPlusPlus.callbacks.createMessageEditor(this, responseEditable);
     23 + this.requestViewerPanel = new RequestViewerPanel(this);
     24 + }
     25 + 
     26 + public IHttpRequestResponse getDisplayedEntity() {
     27 + return this.currentItem;
     28 + }
     29 + 
     30 + public void setDisplayedEntity(IHttpRequestResponse requestResponse) {
     31 + if(requestResponse != null && requestResponse.equals(currentItem)) return;
     32 + 
     33 + this.currentItem = requestResponse;
     34 + if (requestResponse != null && requestResponse.getRequest() != null) {
     35 + requestEditor.setMessage(requestResponse.getRequest(), true);
     36 + }else{
     37 + requestEditor.setMessage(new byte[0], false);
     38 + }
     39 + 
     40 + if (requestResponse != null && requestResponse.getResponse() != null) {
     41 + responseEditor.setMessage(requestResponse.getResponse(), false);
     42 + }else {
     43 + responseEditor.setMessage(new byte[0], false);
     44 + }
     45 + }
     46 + 
     47 + public IMessageEditor getRequestEditor() {
     48 + return requestEditor;
     49 + }
     50 + 
     51 + public IMessageEditor getResponseEditor() {
     52 + return responseEditor;
     53 + }
     54 + 
     55 + public Preferences getPreferences() {
     56 + return preferences;
     57 + }
     58 + 
     59 + public RequestViewerPanel getRequestViewerPanel() {
     60 + return requestViewerPanel;
     61 + }
     62 + 
     63 + @Override
     64 + public byte[] getRequest()
     65 + {
     66 + if(currentItem == null || currentItem.getRequest() == null)
     67 + return new byte[0];
     68 + else
     69 + return currentItem.getRequest();
     70 + }
     71 + 
     72 + @Override
     73 + public byte[] getResponse()
     74 + {
     75 + if(currentItem == null || currentItem.getResponse() == null)
     76 + return new byte[0];
     77 + else
     78 + return currentItem.getResponse();
     79 + }
     80 + 
     81 + @Override
     82 + public IHttpService getHttpService()
     83 + {
     84 + if(currentItem == null) return null;
     85 + return currentItem.getHttpService();
     86 + }
     87 +}
     88 + 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/entryviewer/RequestViewerPanel.java
     1 +package com.nccgroup.loggerplusplus.logview.entryviewer;
     2 + 
     3 +import com.coreyd97.BurpExtenderUtilities.PopOutPanel;
     4 +import com.coreyd97.BurpExtenderUtilities.VariableViewPanel;
     5 +import com.nccgroup.loggerplusplus.util.Globals;
     6 + 
     7 +public class RequestViewerPanel extends PopOutPanel {
     8 + 
     9 + private final RequestViewerController controller;
     10 + private final VariableViewPanel variableViewPanel;
     11 + 
     12 + public RequestViewerPanel(RequestViewerController controller){
     13 + super();
     14 + this.controller = controller;
     15 + 
     16 + this.variableViewPanel = new VariableViewPanel(controller.getPreferences(), Globals.PREF_MESSAGE_VIEW_LAYOUT,
     17 + controller.getRequestEditor().getComponent(), "Request",
     18 + controller.getResponseEditor().getComponent(), "Response",
     19 + VariableViewPanel.View.HORIZONTAL);
     20 + 
     21 + this.setComponent(variableViewPanel);
     22 + this.setTitle("Request/Response Viewer");
     23 + //TODO set log view variable panel to Vertical when popped out
     24 + }
     25 + 
     26 + public VariableViewPanel getVariableViewPanel() {
     27 + return variableViewPanel;
     28 + }
     29 +}
     30 + 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/logtable/LogTable.java
    skipped 3 lines
    4 4  // extend JTable to handle cell selection and column move/resize
    5 5  //
    6 6   
    7  -import com.nccgroup.loggerplusplus.LoggerPlusPlus;
     7 +import com.coreyd97.BurpExtenderUtilities.Preferences;
    8 8  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    9  -import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilterListener;
    10 9  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
    11  -import com.nccgroup.loggerplusplus.filter.logfilter.LogFilterListener;
    12  -import com.nccgroup.loggerplusplus.filter.parser.ParseException;
    13 10  import com.nccgroup.loggerplusplus.logentry.LogEntry;
    14 11  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    15  -import com.nccgroup.loggerplusplus.logentry.LogEntryListener;
    16 12  import com.nccgroup.loggerplusplus.logview.MultipleLogEntryMenu;
    17 13  import com.nccgroup.loggerplusplus.logview.SingleLogEntryMenu;
    18  -import com.nccgroup.loggerplusplus.logview.LogTableFilterStatusListener;
    19  -import com.nccgroup.loggerplusplus.logview.RequestViewerController;
    20  -import com.nccgroup.loggerplusplus.userinterface.LogTableModel;
    21  -import com.nccgroup.loggerplusplus.userinterface.renderer.BooleanRenderer;
     14 +import com.nccgroup.loggerplusplus.logview.entryviewer.RequestViewerController;
     15 +import com.nccgroup.loggerplusplus.util.userinterface.renderer.BooleanRenderer;
    22 16  import com.nccgroup.loggerplusplus.util.Globals;
    23 17   
    24 18  import javax.swing.*;
    25 19  import javax.swing.event.RowSorterEvent;
     20 +import javax.swing.event.TableModelEvent;
     21 +import javax.swing.event.TableModelListener;
    26 22  import javax.swing.table.TableCellRenderer;
    27 23  import javax.swing.table.TableRowSorter;
    28 24  import java.awt.*;
    skipped 4 lines
    33 29  import java.util.stream.Collectors;
    34 30  import java.util.stream.IntStream;
    35 31   
    36  -public class LogTable extends JTable implements LogFilterListener, ColorFilterListener, LogEntryListener
     32 +public class LogTable extends JTable
    37 33  {
     34 + private final LogTableController controller;
     35 + private final Preferences preferences;
     36 + private final TableRowSorter<LogTableModel> sorter;
    38 37   
    39  - public LogTable(LogTableModel tableModel, LogTableColumnModel logTableColumnModel)
     38 + LogTable(LogTableController controller)
    40 39   {
    41  - super(tableModel, logTableColumnModel);
    42  - this.setTableHeader(new TableHeader(getColumnModel(),this)); // This was used to create tool tips
     40 + super(controller.getLogTableModel(), controller.getLogTableColumnModel());
     41 + this.controller = controller;
     42 + this.preferences = controller.getPreferences();
     43 + 
     44 + this.setTableHeader(controller.getTableHeader()); // This was used to create tool tips
    43 45   this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // to have horizontal scroll bar
    44 46   this.setRowHeight(20); // As we are not using Burp customised UI, we have to define the row height to make it more pretty
    45 47   this.setDefaultRenderer(Boolean.class, new BooleanRenderer()); //Fix grey checkbox background
    46 48   ((JComponent) this.getDefaultRenderer(Boolean.class)).setOpaque(true); // to remove the white background of the checkboxes!
    47 49   
    48  - this.setAutoCreateRowSorter(true);
    49  - ((DefaultRowSorter) this.getRowSorter()).setMaxSortKeys(1);
    50  - ((DefaultRowSorter) this.getRowSorter()).setSortsOnUpdates(true);
     50 + this.sorter = new TableRowSorter<>(this.getModel());
     51 + this.sorter.setMaxSortKeys(1);
     52 + this.sorter.setSortsOnUpdates(true);
     53 + this.setRowSorter(this.sorter);
    51 54   
    52  - this.getRowSorter().addRowSorterListener(rowSorterEvent -> {
     55 + this.sorter.addRowSorterListener(rowSorterEvent -> {
    53 56   if(rowSorterEvent.getType() != RowSorterEvent.Type.SORT_ORDER_CHANGED) return;
    54  - List<? extends RowSorter.SortKey> sortKeys = LogTable.this.getRowSorter().getSortKeys();
     57 + List<? extends RowSorter.SortKey> sortKeys = LogTable.this.sorter.getSortKeys();
    55 58   if(sortKeys == null || sortKeys.size() == 0){
    56  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_SORT_ORDER, null);
    57  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_SORT_COLUMN, null);
     59 + this.preferences.setSetting(Globals.PREF_SORT_ORDER, null);
     60 + this.preferences.setSetting(Globals.PREF_SORT_COLUMN, null);
    58 61   }else {
    59 62   RowSorter.SortKey sortKey = sortKeys.get(0);
    60  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_SORT_ORDER, sortKey.getSortOrder());
    61  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_SORT_COLUMN, sortKey.getColumn());
     63 + this.preferences.setSetting(Globals.PREF_SORT_ORDER, sortKey.getSortOrder());
     64 + this.preferences.setSetting(Globals.PREF_SORT_COLUMN, sortKey.getColumn());
    62 65   }
    63 66   });
    64 67   
    65  - Integer sortColumn = LoggerPlusPlus.preferences.getSetting(Globals.PREF_SORT_COLUMN);
    66  - SortOrder sortOrder = LoggerPlusPlus.preferences.getSetting(Globals.PREF_SORT_ORDER);
     68 + Integer sortColumn = this.preferences.getSetting(Globals.PREF_SORT_COLUMN);
     69 + SortOrder sortOrder = this.preferences.getSetting(Globals.PREF_SORT_ORDER);
    67 70   if(sortColumn >= 0 && sortOrder != SortOrder.UNSORTED){
    68  - this.getRowSorter().setSortKeys(Collections.singletonList(new RowSorter.SortKey(sortColumn, sortOrder)));
     71 + this.sorter.setSortKeys(Collections.singletonList(new RowSorter.SortKey(sortColumn, sortOrder)));
    69 72   }
    70 73   
    71 74   this.getSelectionModel().addListSelectionListener(e -> {
    72 75   if(e.getValueIsAdjusting()) return;
    73  - RequestViewerController controller = LoggerPlusPlus.instance.getRequestViewerController();
     76 + RequestViewerController requestViewerController = LogTable.this.controller.getLogViewController().getRequestViewerController();
    74 77   int selectedRow = getSelectedRow();
    75 78   if(selectedRow == -1){
    76  - controller.setDisplayedEntity(null);
     79 + requestViewerController.setDisplayedEntity(null);
    77 80   }else {
    78 81   // Use a relative instead of an absolute index (This prevents an issue when a filter is set)
    79 82   LogEntry logEntry = getModel().getData().get(convertRowIndexToModel(selectedRow));
    80 83   if (logEntry.requestResponse != null) {
    81  - controller.setDisplayedEntity(logEntry.requestResponse);
     84 + requestViewerController.setDisplayedEntity(logEntry.requestResponse);
    82 85   }
    83 86   }
    84 87   });
    skipped 1 lines
    86 89   this.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    87 90   
    88 91   registerListeners();
     92 + 
     93 + //TODO AUTOSCROLL ON ENTRY ADDED
     94 +// if (this.preferences.getSetting(Globals.PREF_AUTO_SCROLL)) {
     95 +// JScrollBar scrollBar = LoggerPlusPlus.instance.getLogScrollPanel().getVerticalScrollBar();
     96 +// scrollBar.setValue(scrollBar.getMaximum() + 100);
     97 +// }
    89 98   }
    90 99   
    91 100   @Override
    skipped 7 lines
    99 108   {
    100 109   LogEntry entry = null;
    101 110   Integer modelRow = null;
    102  - try{
    103  - modelRow = convertRowIndexToModel(row);
    104  - entry = this.getModel().getRow(modelRow);
    105  - }catch (NullPointerException ignored){
    106  - ignored.printStackTrace();
    107  - LoggerPlusPlus.instance.logError("NullPointerException caused by view->model index conversion.");
     111 + int attempts = 5;
     112 + while(entry == null && attempts > 0) {
     113 + try {
     114 + modelRow = convertRowIndexToModel(row);
     115 + entry = this.getModel().getRow(modelRow);
     116 + } catch (NullPointerException ignored) {
     117 +// ignored.printStackTrace();
     118 +// controller.getLogViewController().getLoggerPlusPlus().getLoggingController().logError("NullPointerException caused by view->model index conversion.");
     119 + attempts--;
     120 + }
    108 121   }
    109 122   
    110 123   if(entry == null){
    skipped 10 lines
    121 134   }else {
    122 135   if(entry.getMatchingColorFilters().size() != 0){
    123 136   ColorFilter colorFilter = null;
    124  - Map<UUID, ColorFilter> colorFilters = LoggerPlusPlus.preferences.getSetting(Globals.PREF_COLOR_FILTERS);
     137 + Map<UUID, ColorFilter> colorFilters = this.preferences.getSetting(Globals.PREF_COLOR_FILTERS);
    125 138   for (UUID uid : entry.getMatchingColorFilters()) {
    126 139   if(colorFilter == null || colorFilter.getPriority() > colorFilters.get(uid).getPriority()){
    127 140   colorFilter = colorFilters.get(uid);
    skipped 50 lines
    178 191   .getModelColumn(convertColumnIndexToModel(columnAtPoint(p))).getIdentifier();
    179 192   
    180 193   if (e.isPopupTrigger() && e.getComponent() instanceof JTable ) {
    181  - new SingleLogEntryMenu(LogTable.this, logEntry, logField).show(e.getComponent(), e.getX(), e.getY());
     194 + new SingleLogEntryMenu(controller, logEntry, logField).show(e.getComponent(), e.getX(), e.getY());
    182 195   }
    183 196   }else{
    184 197   List<LogEntry> selectedEntries = IntStream.of(LogTable.this.getSelectedRows())
    skipped 1 lines
    186 199   .collect(Collectors.toList());
    187 200   
    188 201   if (e.isPopupTrigger() && e.getComponent() instanceof JTable ) {
    189  - new MultipleLogEntryMenu(LogTable.this, selectedEntries).show(e.getComponent(), e.getX(), e.getY());
     202 + new MultipleLogEntryMenu(controller, selectedEntries).show(e.getComponent(), e.getX(), e.getY());
    190 203   }
    191 204   }
    192 205   }
    193 206   }
    194 207   });
    195 208   
    196  - LoggerPlusPlus.instance.getLibraryController().addColorFilterListener(this);
    197  - LoggerPlusPlus.instance.getLogProcessor().addLogListener(this);
     209 + getModel().addTableModelListener(tableModelEvent -> {
     210 + if(tableModelEvent.getType() == TableModelEvent.INSERT && (boolean) preferences.getSetting(Globals.PREF_AUTO_SCROLL)){
     211 + LogTable.this.scrollRectToVisible(getCellRect(tableModelEvent.getFirstRow(), tableModelEvent.getColumn(), true));
     212 + }
     213 + });
    198 214   }
    199 215   
    200 216   
    201 217   public LogFilter getCurrentFilter(){
    202  - return (LogFilter) ((TableRowSorter) this.getRowSorter()).getRowFilter();
     218 + return (LogFilter) this.sorter.getRowFilter();
    203 219   }
    204 220   
    205 221   public void setFilter(LogFilter filter){
    206  - ((DefaultRowSorter) this.getRowSorter()).setRowFilter(filter);
     222 + this.sorter.setRowFilter(filter);
    207 223   ((JScrollPane) this.getParent().getParent()).getVerticalScrollBar().setValue(0);
    208 224   }
    209 225   
    skipped 10 lines
    220 236   
    221 237   @Override
    222 238   public LogTableColumnModel getColumnModel(){ return (LogTableColumnModel) super.getColumnModel(); }
    223  - 
    224  - 
    225  - //FilterListeners
    226  - @Override
    227  - public void onFilterChange(final ColorFilter filter) {
    228  - createFilterTestingWorker(filter, filter.shouldRetest()).execute();
    229  - }
    230  - 
    231  - @Override
    232  - public void onFilterAdd(final ColorFilter filter) {
    233  - if(!filter.isEnabled() || filter.getFilter() == null) return;
    234  - createFilterTestingWorker(filter, false);
    235  - }
    236  - 
    237  - @Override
    238  - public void onFilterRemove(final ColorFilter filter) {
    239  - if(!filter.isEnabled() || filter.getFilter() == null) return;
    240  - new SwingWorker<Void, Integer>(){
    241  - @Override
    242  - protected Void doInBackground() throws Exception {
    243  - for (int i = 0; i< getModel().getData().size(); i++) {
    244  - boolean wasPresent = getModel().getRow(i).matchingColorFilters.remove(filter.getUUID());
    245  - if(wasPresent){
    246  - publish(i);
    247  - }
    248  - }
    249  - return null;
    250  - }
    251  - 
    252  - @Override
    253  - protected void process(List<Integer> rows) {
    254  - for (Integer row : rows) {
    255  - getModel().fireTableRowsUpdated(row, row);
    256  - }
    257  - }
    258  - }.execute();
    259  - }
    260  - 
    261  - private SwingWorker<Void, Integer> createFilterTestingWorker(final ColorFilter filter, boolean retestExisting){
    262  - return new SwingWorker<Void, Integer>(){
    263  - 
    264  - @Override
    265  - protected Void doInBackground() throws Exception {
    266  - for (int i = 0; i< getModel().getData().size(); i++) {
    267  - boolean colorResult = getModel().getRow(i).testColorFilter(filter, retestExisting);
    268  - if(colorResult || filter.isModified()){
    269  - publish(i);
    270  - }
    271  - }
    272  - 
    273  - return null;
    274  - }
    275  - 
    276  - @Override
    277  - protected void process(List<Integer> updatedRows) {
    278  - for (Integer row : updatedRows) {
    279  - getModel().fireTableRowsUpdated(row, row);
    280  - }
    281  - 
    282  - }
    283  - };
    284  - }
    285  - 
    286  - @Override
    287  - public void onFilterRemoveAll() {}
    288  - 
    289  - @Override
    290  - public synchronized void onRequestAdded(int modelIndex, LogEntry logEntry, boolean hasResponse) {
    291  - try {
    292  - getModel().fireTableRowsInserted(modelIndex, modelIndex);
    293  - 
    294  - if (LoggerPlusPlus.preferences.getSetting(Globals.PREF_AUTO_SCROLL)) {
    295  - JScrollBar scrollBar = LoggerPlusPlus.instance.getLogScrollPanel().getVerticalScrollBar();
    296  - scrollBar.setValue(scrollBar.getMaximum() + 100);
    297  - }
    298  - }catch (Exception e){
    299  - e.printStackTrace();
    300  - System.out.println(modelIndex);
    301  - System.out.println(logEntry);
    302  - //TODO Fix out of bounds exception here.
    303  - }
    304  - }
    305  - 
    306  - @Override
    307  - public void onResponseUpdated(int modelRow, LogEntry existingEntry) {
    308  - getModel().fireTableRowsUpdated(modelRow, modelRow);
    309  - }
    310  - 
    311  - @Override
    312  - public void onRequestRemoved(int modelIndex, LogEntry logEntry) {
    313  - try {
    314  - getModel().fireTableRowsDeleted(modelIndex, modelIndex);
    315  - }catch (Exception e){
    316  - e.printStackTrace();
    317  - }
    318  - }
    319  - 
    320  - @Override
    321  - public void onLogsCleared() {
    322  - getModel().fireTableDataChanged();
    323  - }
    324  - 
    325  - @Override
    326  - public void onFilterSet(LogFilter filter) {
    327  - this.setFilter(filter);
    328  - }
    329  - 
    330  - @Override
    331  - public void onFilterError(String invalidFilter, ParseException exception) {
    332  - this.setFilter(null);
    333  - }
    334  - 
    335  - @Override
    336  - public void onFilterCleared() {
    337  - this.setFilter(null);
    338  - }
    339 239  }
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/logtable/LogTableColumn.java
    skipped 18 lines
    19 19   
    20 20  import com.google.gson.*;
    21 21  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    22  -import com.nccgroup.loggerplusplus.userinterface.renderer.LeftTableCellRenderer;
     22 +import com.nccgroup.loggerplusplus.util.userinterface.renderer.LeftTableCellRenderer;
    23 23   
    24 24  import javax.swing.table.TableColumn;
    25 25  import java.lang.reflect.Type;
    skipped 173 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/logtable/LogTableColumnModel.java
    skipped 11 lines
    12 12   
    13 13  package com.nccgroup.loggerplusplus.logview.logtable;
    14 14   
     15 +import com.coreyd97.BurpExtenderUtilities.Preferences;
    15 16  import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    16 17  import com.nccgroup.loggerplusplus.util.Globals;
    17 18  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    skipped 7 lines
    25 26   
    26 27  public class LogTableColumnModel extends DefaultTableColumnModel {
    27 28   
     29 + private final LogTableController controller;
     30 + private final Preferences preferences;
    28 31   private final ArrayList<LogTableColumn> allColumns;
    29 32   
    30  - public LogTableColumnModel() {
     33 + public LogTableColumnModel(LogTableController controller) {
    31 34   super();
     35 + this.controller = controller;
     36 + this.preferences = controller.getPreferences();
    32 37   allColumns = new ArrayList<>();
    33 38   setup();
    34 39   }
    35 40   
    36 41   private void setup(){
    37  - ArrayList<LogTableColumn> columnList = LoggerPlusPlus.preferences.getSetting(Globals.PREF_LOG_TABLE_SETTINGS);
     42 + ArrayList<LogTableColumn> columnList = preferences.getSetting(Globals.PREF_LOG_TABLE_SETTINGS);
    38 43   
    39 44   // Sorting based on order number
    40 45   Collections.sort(columnList);
    skipped 54 lines
    95 100   }
    96 101   
    97 102   public void resetToDefaultVariables() {
    98  - LoggerPlusPlus.preferences.resetSetting(Globals.PREF_LOG_TABLE_SETTINGS);
     103 + preferences.resetSetting(Globals.PREF_LOG_TABLE_SETTINGS);
    99 104   List<TableColumn> columns = Collections.list(this.getColumns());
    100 105   for (TableColumn column : columns) {
    101 106   this.removeColumn(column);
    skipped 4 lines
    106 111   }
    107 112   
    108 113   public void saveLayout() {
    109  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_LOG_TABLE_SETTINGS, this.allColumns);
     114 + preferences.setSetting(Globals.PREF_LOG_TABLE_SETTINGS, this.allColumns);
    110 115   }
    111 116   
    112 117   @Override
    skipped 50 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/logtable/LogTableController.java
     1 +package com.nccgroup.loggerplusplus.logview.logtable;
     2 + 
     3 +import com.coreyd97.BurpExtenderUtilities.Preferences;
     4 +import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
     5 +import com.nccgroup.loggerplusplus.logview.LogViewController;
     6 +import com.nccgroup.loggerplusplus.util.Globals;
     7 + 
     8 +public class LogTableController {
     9 + 
     10 + private final LogViewController logViewController;
     11 + private final FilterLibraryController filterLibraryController;
     12 + private final Preferences preferences;
     13 + private final LogTableModel logTableModel;
     14 + private final LogTableColumnModel logTableColumnModel;
     15 + private final TableHeader tableHeader;
     16 + private final LogTable logTable;
     17 + 
     18 + public LogTableController(LogViewController logViewController, FilterLibraryController filterLibraryController){
     19 + this.logViewController = logViewController;
     20 + this.filterLibraryController = filterLibraryController;
     21 + this.preferences = logViewController.getPreferences();
     22 + 
     23 + this.logTableColumnModel = new LogTableColumnModel(this);
     24 + this.logTableModel = new LogTableModel(this, logTableColumnModel);
     25 + this.tableHeader = new TableHeader(this);
     26 + this.logTable = new LogTable(this);
     27 + 
     28 + this.filterLibraryController.addColorFilterListener(logTableModel);
     29 + }
     30 + 
     31 + public LogViewController getLogViewController() {
     32 + return logViewController;
     33 + }
     34 + 
     35 + public LogTableColumnModel getLogTableColumnModel() {
     36 + return logTableColumnModel;
     37 + }
     38 + 
     39 + public LogTableModel getLogTableModel() {
     40 + return logTableModel;
     41 + }
     42 + 
     43 + public LogTable getLogTable() {
     44 + return logTable;
     45 + }
     46 + 
     47 + public TableHeader getTableHeader() {
     48 + return tableHeader;
     49 + }
     50 + 
     51 + public Preferences getPreferences() {
     52 + return preferences;
     53 + }
     54 + 
     55 + public void reset(){
     56 + logTableModel.reset();
     57 + }
     58 + 
     59 + public int getMaximumEntries(){
     60 + return preferences.getSetting(Globals.PREF_MAXIMUM_ENTRIES);
     61 + }
     62 + 
     63 + public void reinitialize(){
     64 + //TODO Reinitialize table model
     65 + }
     66 +}
     67 + 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/logtable/LogTableModel.java
     1 +package com.nccgroup.loggerplusplus.logview.logtable;
     2 + 
     3 +import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
     4 +import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilterListener;
     5 +import com.nccgroup.loggerplusplus.logentry.LogEntry;
     6 +import com.nccgroup.loggerplusplus.logentry.LogEntryField;
     7 +import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
     8 + 
     9 +import javax.swing.*;
     10 +import javax.swing.table.AbstractTableModel;
     11 +import java.util.*;
     12 + 
     13 +/* Extending AbstractTableModel to design the logTable behaviour based on the array list */
     14 +public class LogTableModel extends AbstractTableModel implements ColorFilterListener {
     15 + 
     16 + private final LogTableController controller;
     17 + private final List<LogEntry> entries;
     18 + private LogTableColumnModel columnModel;
     19 + 
     20 + public LogTableModel(LogTableController controller, LogTableColumnModel columnModel){
     21 + this.controller = controller;
     22 + this.columnModel = columnModel;
     23 + this.entries = Collections.synchronizedList(new ArrayList<>());
     24 + }
     25 + 
     26 + @Override
     27 + public int getRowCount()
     28 + {
     29 + return entries.size();
     30 + }
     31 + 
     32 + @Override
     33 + public int getColumnCount()
     34 + {
     35 + return (this.columnModel != null) ? this.columnModel.getColumnCount() : 0;
     36 + }
     37 + 
     38 + @Override
     39 + public boolean isCellEditable(int rowModelIndex, int columnModelIndex) {
     40 + return !(this.columnModel.getModelColumn(columnModelIndex)).isReadOnly();
     41 + }
     42 + 
     43 + @Override
     44 + public void setValueAt(Object value, int rowModelIndex, int columnModelIndex) {
     45 + LogEntry logEntry = entries.get(rowModelIndex);
     46 + if(this.columnModel.getModelColumn(columnModelIndex).getIdentifier() == LogEntryField.COMMENT){
     47 + logEntry.comment = (String) value;
     48 + }
     49 + fireTableCellUpdated(rowModelIndex, this.columnModel.getViewIndex(columnModelIndex));
     50 + }
     51 + 
     52 + @Override
     53 + public Class<?> getColumnClass(int columnModelIndex) {
     54 + Object val = getValueAt(0, columnModelIndex);
     55 + return val == null ? String.class : val.getClass();
     56 + }
     57 + 
     58 + private int getMaxEntries(){
     59 + return this.controller.getMaximumEntries();
     60 + }
     61 + 
     62 + public void removeLogEntry(LogEntry logEntry){
     63 + removeLogEntries(Arrays.asList(logEntry));
     64 + }
     65 + 
     66 + public void removeLogEntries(List<LogEntry> logEntry){
     67 + synchronized (entries) {
     68 + for (LogEntry entry : logEntry) {
     69 + int index = entries.indexOf(entry);
     70 + removeEntryAtRow(index);
     71 + }
     72 + }
     73 + }
     74 + 
     75 + public synchronized void removeEntryAtRow(int row) {
     76 + entries.remove(row);
     77 + this.fireTableRowsDeleted(row, row);
     78 + }
     79 + 
     80 + public synchronized void addEntry(LogEntry logEntry){
     81 + int index = entries.size();
     82 + entries.add(logEntry);
     83 + this.fireTableRowsInserted(index, index);
     84 + 
     85 + int excess = Math.max(entries.size() - controller.getMaximumEntries(), 0);
     86 + for (int excessIndex = 0; excessIndex < excess; excessIndex++) {
     87 + removeEntryAtRow(0); //Always remove the oldest entry
     88 + }
     89 + }
     90 + 
     91 + public synchronized void updateEntry(LogEntry logEntry){
     92 + int index = entries.indexOf(logEntry);
     93 + fireTableRowsUpdated(index, index);
     94 + }
     95 + 
     96 + @Override
     97 + public Object getValueAt(int rowIndex, int colModelIndex)
     98 + {
     99 + if(rowIndex >= entries.size()) return null;
     100 + if(colModelIndex == 0){
     101 + return rowIndex+1;
     102 + }
     103 + 
     104 + LogTableColumn column = columnModel.getModelColumn(colModelIndex);
     105 + 
     106 + Object value = entries.get(rowIndex).getValueByKey(column.getIdentifier());
     107 + 
     108 + if(value instanceof Date){
     109 + return LogProcessor.LOGGER_DATE_FORMAT.format(value);
     110 + }
     111 + return value;
     112 + }
     113 + 
     114 + public List<LogEntry> getData() {
     115 + return this.entries;
     116 + }
     117 + 
     118 + public LogEntry getRow(int row) {
     119 + return this.entries.get(row);
     120 + }
     121 + 
     122 + public void reset() {
     123 + this.entries.clear();
     124 + this.fireTableDataChanged();
     125 + }
     126 + 
     127 + //FilterListeners
     128 + @Override
     129 + public void onFilterChange(final ColorFilter filter) {
     130 + createFilterTestingWorker(filter, filter.shouldRetest()).execute();
     131 + }
     132 + 
     133 + @Override
     134 + public void onFilterAdd(final ColorFilter filter) {
     135 + if(!filter.isEnabled() || filter.getFilter() == null) return;
     136 + createFilterTestingWorker(filter, false);
     137 + }
     138 + 
     139 + @Override
     140 + public void onFilterRemove(final ColorFilter filter) {
     141 + if(!filter.isEnabled() || filter.getFilter() == null) return;
     142 + new SwingWorker<Void, Integer>(){
     143 + @Override
     144 + protected Void doInBackground() {
     145 + for (int i = 0; i< entries.size(); i++) {
     146 + boolean wasPresent = entries.get(i).matchingColorFilters.remove(filter.getUUID());
     147 + if(wasPresent){
     148 + publish(i);
     149 + }
     150 + }
     151 + return null;
     152 + }
     153 + 
     154 + @Override
     155 + protected void process(List<Integer> rows) {
     156 + for (Integer row : rows) {
     157 + fireTableRowsUpdated(row, row);
     158 + }
     159 + }
     160 + }.execute();
     161 + }
     162 + 
     163 + private SwingWorker<Void, Integer> createFilterTestingWorker(final ColorFilter filter, boolean retestExisting){
     164 + return new SwingWorker<Void, Integer>(){
     165 + 
     166 + @Override
     167 + protected Void doInBackground() {
     168 + for (int i = 0; i< entries.size(); i++) {
     169 + boolean testResultChanged = entries.get(i).testColorFilter(filter, retestExisting);
     170 + if(testResultChanged){
     171 + publish(i);
     172 + }
     173 + }
     174 + 
     175 + return null;
     176 + }
     177 + 
     178 + @Override
     179 + protected void process(List<Integer> updatedRows) {
     180 + for (Integer row : updatedRows) {
     181 + fireTableRowsUpdated(row, row);
     182 + }
     183 + }
     184 + };
     185 + }
     186 +}
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logview/logtable/TableHeader.java
    1 1  package com.nccgroup.loggerplusplus.logview.logtable;
    2 2   
    3  -import com.nccgroup.loggerplusplus.userinterface.TableHeaderMenu;
    4  - 
    5 3  import javax.swing.*;
    6 4  import javax.swing.table.JTableHeader;
    7 5  import javax.swing.table.TableColumnModel;
    skipped 4 lines
    12 10  // This was used to create tool tips
    13 11  public class TableHeader extends JTableHeader {
    14 12   
    15  - private final LogTableColumnModel tableColumnModel;
    16 13  
    17  - TableHeader(TableColumnModel tcm, final LogTable logTable) {
    18  - super(tcm);
    19  - this.tableColumnModel = (LogTableColumnModel) tcm;
    20  - this.setTable(logTable);
     14 + TableHeader(LogTableController logTableController) {
     15 + super(logTableController.getLogTableColumnModel());
     16 + 
     17 + this.setTable(logTableController.getLogTable());
    21 18   
    22 19   this.addMouseListener(new MouseAdapter(){
    23 20   @Override
    skipped 2 lines
    26 23   if ( SwingUtilities.isRightMouseButton( e )){
    27 24   // get the coordinates of the mouse click
    28 25   Point p = e.getPoint();
    29  - int columnID = logTable.convertColumnIndexToModel(columnAtPoint(p));
    30  - LogTableColumn column = tableColumnModel.getModelColumn(columnID);
    31  - //TODO
    32  - TableHeaderMenu tblHeaderMenu = new TableHeaderMenu(logTable, column);
     26 + int columnID = getTable().convertColumnIndexToModel(columnAtPoint(p));
     27 + LogTableColumn column = ((LogTableColumnModel) getColumnModel()).getModelColumn(columnID);
     28 + 
     29 + TableHeaderMenu tblHeaderMenu = new TableHeaderMenu(logTableController, column);
    33 30   tblHeaderMenu.showMenu(e);
    34 31   }
    35 32   }
    skipped 26 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/TableHeaderMenu.java src/main/java/com/nccgroup/loggerplusplus/logview/logtable/TableHeaderMenu.java
    1  -package com.nccgroup.loggerplusplus.userinterface;
     1 +package com.nccgroup.loggerplusplus.logview.logtable;
    2 2   
    3 3  import com.nccgroup.loggerplusplus.logview.logtable.LogTable;
    4 4  import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumn;
    skipped 13 lines
    18 18   
    19 19  public class TableHeaderMenu extends JPopupMenu{
    20 20   
     21 + private final LogTableController logTableController;
    21 22   private final LogTable logTable;
    22 23   private final LogTableColumn columnObj;
    23 24   
    24  - public TableHeaderMenu(LogTable logTable, LogTableColumn columnObj)
     25 + public TableHeaderMenu(LogTableController logTableController, LogTableColumn columnObj)
    25 26   {
    26  - super();
    27  - this.logTable = logTable;
     27 + this.logTableController = logTableController;
     28 + this.logTable = logTableController.getLogTable();
    28 29   this.columnObj=columnObj;
    29 30   
    30 31   }
    skipped 135 lines
    166 167   public void saveAndReloadTableSettings(){
    167 168   //Stop automatically logging, prevents changing of csv format midway through
    168 169   //TODO constant csv format?
    169  - if((Boolean) LoggerPlusPlus.preferences.getSetting(Globals.PREF_AUTO_SAVE)){
    170  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_AUTO_SAVE, false);
    171  - LoggerPlusPlus.instance.getLoggerOptionsPanel().getFileLogger().setAutoSave(false);
     170 + if(logTableController.getPreferences().getSetting(Globals.PREF_AUTO_SAVE)){
     171 + logTableController.getPreferences().setSetting(Globals.PREF_AUTO_SAVE, false);
     172 +// logTableController.getFileLogger().setAutoSave(false); //TODO FIXME
    172 173   MoreHelp.showMessage("The logTable structure has been changed. Autosave was disabled to prevent invalid csv.");
    173 174   }
    174 175   logTable.saveTableChanges();
    skipped 9 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/EntryImportWorker.java src/main/java/com/nccgroup/loggerplusplus/logview/processor/EntryImportWorker.java
    1  -package com.nccgroup.loggerplusplus.logentry;
     1 +package com.nccgroup.loggerplusplus.logview.processor;
    2 2   
    3 3  import burp.IBurpExtenderCallbacks;
    4 4  import burp.IHttpRequestResponse;
     5 +import com.nccgroup.loggerplusplus.logentry.LogEntry;
    5 6   
    6 7  import javax.swing.*;
    7 8  import java.util.List;
    skipped 94 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/logentry/LogProcessor.java src/main/java/com/nccgroup/loggerplusplus/logview/processor/LogProcessor.java
    1  -package com.nccgroup.loggerplusplus.logentry;
     1 +package com.nccgroup.loggerplusplus.logview.processor;
    2 2   
    3 3  import burp.*;
    4 4  import com.coreyd97.BurpExtenderUtilities.Preferences;
    5 5  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    6 6  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
     7 +import com.nccgroup.loggerplusplus.logentry.LogEntry;
     8 +import com.nccgroup.loggerplusplus.logentry.LogManagerHelper;
     9 +import com.nccgroup.loggerplusplus.logentry.Status;
     10 +import com.nccgroup.loggerplusplus.logview.logtable.LogTableController;
    7 11  import com.nccgroup.loggerplusplus.util.NamedThreadFactory;
    8 12  import com.nccgroup.loggerplusplus.util.PausableThreadPoolExecutor;
    9 13   
    skipped 11 lines
    21 25   public static final SimpleDateFormat LOGGER_DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    22 26   public static final SimpleDateFormat SERVER_DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
    23 27   
     28 + private final LoggerPlusPlus loggerPlusPlus;
     29 + private final LogTableController logTableController;
    24 30   private final Preferences preferences;
    25  - private final List<LogEntry> logEntries;
    26 31   private final ConcurrentHashMap<Integer, UUID> proxyIdToUUIDMap;
    27 32   private final ConcurrentHashMap<UUID, LogEntry> entriesPendingProcessing;
    28 33   private final ConcurrentHashMap<UUID, Future<LogEntry>> entryProcessingFutures;
    29  - private final List<LogEntryListener> logEntryListeners;
    30 34   private final PausableThreadPoolExecutor entryProcessExecutor;
    31 35   private final PausableThreadPoolExecutor entryImportExecutor;
    32 36   private final ScheduledExecutorService cleanupExecutor;
    skipped 5 lines
    38 42   * TODO SQLite integration
    39 43   * TODO Capture requests modified after logging using request obtained from response objects.
    40 44   */
    41  - public LogProcessor(Preferences preferences){
    42  - this.preferences = preferences;
    43  - this.logEntries = Collections.synchronizedList(new ArrayList<>());
     45 + public LogProcessor(LoggerPlusPlus loggerPlusPlus, LogTableController logTableController){
     46 + this.loggerPlusPlus = loggerPlusPlus;
     47 + this.logTableController = logTableController;
     48 + this.preferences = this.loggerPlusPlus.getPreferencesController().getPreferences();
    44 49   
    45  - this.logEntryListeners = new ArrayList<>();
    46 50   this.proxyIdToUUIDMap = new ConcurrentHashMap<>();
    47 51   this.entriesPendingProcessing = new ConcurrentHashMap<>();
    48 52   this.entryProcessingFutures = new ConcurrentHashMap<>();
    skipped 5 lines
    54 58   //Create incomplete request cleanup thread so map doesn't get too big.
    55 59   this.cleanupExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("LPP-LogManager-Cleanup"));
    56 60   this.cleanupExecutor.scheduleAtFixedRate(new AbandonedRequestCleanupRunnable(),30000L, 30000L, TimeUnit.MILLISECONDS);
     61 + 
     62 + LoggerPlusPlus.callbacks.registerHttpListener(this);
     63 + LoggerPlusPlus.callbacks.registerProxyListener(this);
    57 64   }
    58 65   
    59 66   /**
    skipped 108 lines
    168 175   return null; //Ignored entry. Skip it.
    169 176   }else{
    170 177   //Ensure capacity and add the entry
    171  - AddEntryAndEnsureCapacitySwingWorker addEntryWorker = new AddEntryAndEnsureCapacitySwingWorker(logEntry);
    172  - addEntryWorker.execute();
    173  - //Don't actually care about the result, but wait here until its complete.
    174  - //Stops race condition if this and response update threads finish before AddEntry thread.
    175  - addEntryWorker.get();
     178 + logTableController.getLogTableModel().addEntry(logEntry);
    176 179   
    177  - if(result.getStatus() == LogEntry.Status.PROCESSED){
     180 + if(result.getStatus() == Status.PROCESSED){
    178 181   //If the entry was fully processed, remove it from the processing list.
    179 182   entryProcessingFutures.remove(logEntry.getIdentifier());
    180 183   }else{
    skipped 18 lines
    199 202   
    200 203   //If the status has been changed
    201 204   if (logEntry.getStatus() != logEntry.getPreviousStatus()) {
    202  - if (logEntry.getStatus() == LogEntry.Status.IGNORED) return null; //Don't care about entry
     205 + if (logEntry.getStatus() == Status.IGNORED) return null; //Don't care about entry
    203 206   
    204 207   //Check against color filters
    205 208   HashMap<UUID, ColorFilter> colorFilters = preferences.getSetting(PREF_COLOR_FILTERS);
    skipped 5 lines
    211 214   return logEntry;
    212 215   }
    213 216   
    214  - private RunnableFuture<Integer> createEntryUpdateRunnable(final Future<LogEntry> processingFuture,
     217 + private RunnableFuture<LogEntry> createEntryUpdateRunnable(final Future<LogEntry> processingFuture,
    215 218   final IHttpRequestResponse requestResponse,
    216 219   final Date arrivalTime){
    217  - return new SwingWorker<Integer, Void>(){
     220 + return new SwingWorker<LogEntry, Void>(){
    218 221   @Override
    219  - protected Integer doInBackground() throws Exception {
     222 + protected LogEntry doInBackground() throws Exception {
    220 223   //Block until initial processing is complete.
    221 224   LogEntry logEntry = processingFuture.get();
    222 225   if(logEntry == null){
    skipped 2 lines
    225 228   logEntry.addResponse(requestResponse, arrivalTime);
    226 229   processEntry(logEntry);
    227 230   
    228  - if(logEntry.getStatus() == LogEntry.Status.PROCESSED) {
     231 + if(logEntry.getStatus() == Status.PROCESSED) {
    229 232   //If the entry was fully processed, remove it from the processing list.
    230 233   entryProcessingFutures.remove(logEntry.getIdentifier());
    231 234   }
    232 235   
    233  - int index = logEntries.indexOf(logEntry);
    234  - return index;
     236 + return logEntry;
    235 237   }
    236 238   
    237 239   @Override
    238 240   protected void done() {
    239  - //TODO fireTableRowsUpdated - DIRECT TO TABLE
    240  - try {
    241  - Integer index = get();
    242  - if(index != null) {
    243  - for (LogEntryListener logEntryListener : logEntryListeners) {
    244  - logEntryListener.onResponseUpdated(index, processingFuture.get());
    245  - }
    246  - }
     241 + try{
     242 + LogEntry logEntry = get();
     243 + logTableController.getLogTableModel().updateEntry(logEntry);
    247 244   } catch (InterruptedException | ExecutionException e) {
    248 245   e.printStackTrace();
    249 246   }
    skipped 1 lines
    251 248   };
    252 249   }
    253 250   
    254  - public void removeLogEntry(LogEntry logEntry){
    255  - removeLogEntries(Arrays.asList(logEntry));
    256  - }
    257  - 
    258  - public void removeLogEntries(List<LogEntry> logEntry){
    259  - SwingUtilities.invokeLater(() -> {
    260  - synchronized (logEntries) {
    261  - for (LogEntry entry : logEntry) {
    262  - int index = logEntries.indexOf(entry);
    263  - logEntries.remove(index);
    264  - 
    265  - //TODO Tablemodel Fire Rows Deleted - DIRECT TO TABLE
    266  - for (LogEntryListener logEntryListener : logEntryListeners) {
    267  - logEntryListener.onRequestRemoved(index, entry);
    268  - }
    269  - }
    270  - }
    271  - });
    272  - }
    273  - 
    274 251   public EntryImportWorker.Builder createEntryImportBuilder(){
    275 252   return new EntryImportWorker.Builder(this);
    276 253   }
    skipped 1 lines
    278 255   public void importProxyHistory(){
    279 256   //TODO Fix time bug for imported results. Multithreading means results will likely end up mixed.
    280 257   //TODO Remove to more suitable UI class and show dialog
    281  - 
    282  - clearEntries(); //Clear existing entries
    283 258   
    284 259   //Build list of entries to import
    285 260   IHttpRequestResponse[] proxyHistory = LoggerPlusPlus.callbacks.getProxyHistory();
    skipped 9 lines
    295 270   importWorker.execute();
    296 271   }
    297 272   
    298  - public List<LogEntry> getLogEntries() {
    299  - return logEntries;
    300  - }
    301  - 
    302 273   private boolean isValidTool(int toolFlag){
    303 274   return ((Boolean) preferences.getSetting(PREF_LOG_GLOBAL) ||
    304 275   ((Boolean) preferences.getSetting(PREF_LOG_PROXY) && toolFlag== IBurpExtenderCallbacks.TOOL_PROXY) ||
    skipped 6 lines
    311 282   ((Boolean) preferences.getSetting(PREF_LOG_TARGET_TAB) && toolFlag== IBurpExtenderCallbacks.TOOL_TARGET));
    312 283   }
    313 284   
    314  - public void addLogListener(LogEntryListener listener) {
    315  - logEntryListeners.add(listener);
    316  - }
    317  - public void removeLogListener(LogEntryListener listener) {
    318  - logEntryListeners.remove(listener);
    319  - }
    320  - public List<LogEntryListener> getLogEntryListeners() {
    321  - return logEntryListeners;
    322  - }
    323  - 
    324  - public void clearEntries() {
    325  - this.logEntries.clear();
    326  - this.proxyIdToUUIDMap.clear();
    327  - 
    328  - for (LogEntryListener logEntryListener : logEntryListeners) {
    329  - logEntryListener.onLogsCleared();
    330  - }
    331  - }
    332  - 
    333 285   public void shutdown(){
    334 286   this.cleanupExecutor.shutdownNow();
    335 287   this.entryProcessExecutor.shutdownNow();
    336 288   this.entryImportExecutor.shutdownNow();
    337  - this.logEntryListeners.clear();
    338 289   }
    339 290   
    340 291   void addProcessedEntry(LogEntry logEntry){
    341  - new AddEntryAndEnsureCapacitySwingWorker(logEntry).execute();
     292 + logTableController.getLogTableModel().addEntry(logEntry);
    342 293   }
    343 294   
    344 295   PausableThreadPoolExecutor getEntryImportExecutor() {
    skipped 11 lines
    356 307   *
    357 308   *************************/
    358 309   
    359  - private class AddEntryAndEnsureCapacitySwingWorker extends SwingWorker<Integer, Integer> {
    360  - 
    361  - LogEntry entry;
    362  - 
    363  - AddEntryAndEnsureCapacitySwingWorker(LogEntry entry){
    364  - this.entry = entry;
    365  - }
    366  - 
    367  - @Override
    368  - protected Integer doInBackground() throws Exception {
    369  - synchronized (logEntries) {
    370  - int maxEntries = preferences.getSetting(PREF_MAXIMUM_ENTRIES);
    371  - int excessCount = Math.max(logEntries.size() + 1 - maxEntries, 0);
    372  - for (int entryIndex = 0; entryIndex < excessCount; entryIndex++) {
    373  - logEntries.remove(entryIndex);
    374  - publish(entryIndex);
    375  - }
    376  - 
    377  - int index = logEntries.size();
    378  - logEntries.add(entry);
    379  - return index;
    380  - }
    381  - }
    382  - 
    383  - @Override
    384  - protected void process(List<Integer> removedEntryIndices) {
    385  - for (Integer removedIndex : removedEntryIndices) {
    386  - //TODO Fire table rows deleted - DIRECT TO TABLE
    387  - for (LogEntryListener logEntryListener : logEntryListeners) {
    388  - logEntryListener.onRequestRemoved(removedIndex, null);
    389  - }
    390  - }
    391  - }
    392  - 
    393  - @Override
    394  - protected void done() {
    395  - try {
    396  - int index = get();
    397  - //TODO Fire table rows inserted - DIRECT TO TABLE
    398  - for (LogEntryListener logEntryListener : logEntryListeners) {
    399  - logEntryListener.onRequestAdded(index, entry, entry.status == LogEntry.Status.PROCESSED);
    400  - }
    401  - } catch (InterruptedException | ExecutionException e) {
    402  - e.printStackTrace();
    403  - }
    404  - }
    405  - }
    406  - 
    407  - 
    408 310   private class AbandonedRequestCleanupRunnable implements Runnable {
    409 311   
    410 312   @Override
    skipped 36 lines
    447 349   }
    448 350   
    449 351   if (removedUUIDs.size() > 0) {
    450  - LoggerPlusPlus.instance.logOutput("Cleaned Up " + removedUUIDs.size()
     352 + loggerPlusPlus.getLoggingController().logOutput("Cleaned Up " + removedUUIDs.size()
    451 353   + " proxy requests without a response after the specified timeout.");
    452 354   }
    453 355   }catch (Exception e){
    skipped 7 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/LoggerPreferenceFactory.java src/main/java/com/nccgroup/loggerplusplus/preferences/LoggerPreferenceFactory.java
    1  -package com.nccgroup.loggerplusplus;
     1 +package com.nccgroup.loggerplusplus.preferences;
    2 2   
    3 3  import burp.IBurpExtenderCallbacks;
    4 4  import com.coreyd97.BurpExtenderUtilities.IGsonProvider;
    skipped 81 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/preferences/PreferencesController.java
     1 +package com.nccgroup.loggerplusplus.preferences;
     2 + 
     3 +import com.coreyd97.BurpExtenderUtilities.IGsonProvider;
     4 +import com.coreyd97.BurpExtenderUtilities.Preferences;
     5 +import com.nccgroup.loggerplusplus.LoggerPlusPlus;
     6 +import com.nccgroup.loggerplusplus.logging.LoggingController;
     7 +import com.nccgroup.loggerplusplus.util.Globals;
     8 + 
     9 +import java.util.Arrays;
     10 +import java.util.HashSet;
     11 + 
     12 +public class PreferencesController {
     13 + private final LoggerPlusPlus loggerPlusPlus;
     14 + private final IGsonProvider gsonProvider;
     15 + private final Preferences preferences;
     16 + 
     17 + private final PreferencesPanel preferencesPanel;
     18 + 
     19 + public PreferencesController(LoggerPlusPlus loggerPlusPlus, LoggingController loggingController) {
     20 + this.loggerPlusPlus = loggerPlusPlus;
     21 + this.gsonProvider = loggerPlusPlus.getGsonProvider();
     22 + this.preferences = new LoggerPreferenceFactory(
     23 + gsonProvider,
     24 + loggingController,
     25 + LoggerPlusPlus.callbacks
     26 + ).buildPreferences();
     27 + 
     28 + 
     29 + Double lastVersion = preferences.getSetting(Globals.PREF_LAST_USED_VERSION);
     30 + preferences.resetSettings(new HashSet<>(Arrays.asList(Globals.VERSION_CHANGE_SETTINGS_TO_RESET)));
     31 + if(lastVersion > Globals.VERSION){
     32 + //If we had a newer version previously.
     33 + //reset all settings
     34 + preferences.resetSettings(preferences.getRegisteredSettings().keySet());
     35 + }else if(lastVersion < Globals.VERSION){
     36 + //Reset preferences which may cause issues.
     37 + preferences.resetSettings(new HashSet<>(Arrays.asList(Globals.VERSION_CHANGE_SETTINGS_TO_RESET)));
     38 + }
     39 + 
     40 + this.preferencesPanel = new PreferencesPanel(this);
     41 + }
     42 + 
     43 + public PreferencesPanel getPreferencesPanel() {
     44 + return preferencesPanel;
     45 + }
     46 + 
     47 + public LoggerPlusPlus getLoggerPlusPlus() {
     48 + return loggerPlusPlus;
     49 + }
     50 + 
     51 + public IGsonProvider getGsonProvider() {
     52 + return gsonProvider;
     53 + }
     54 + 
     55 + public Preferences getPreferences() {
     56 + return preferences;
     57 + }
     58 +}
     59 + 
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/LoggerOptionsPanel.java src/main/java/com/nccgroup/loggerplusplus/preferences/PreferencesPanel.java
    skipped 9 lines
    10 10  // Released under AGPL see LICENSE for more information
    11 11  //
    12 12   
    13  -package com.nccgroup.loggerplusplus.userinterface;
     13 +package com.nccgroup.loggerplusplus.preferences;
    14 14   
    15  -import burp.IBurpExtenderCallbacks;
    16 15  import burp.IHttpRequestResponse;
    17 16  import com.coreyd97.BurpExtenderUtilities.Alignment;
    18 17  import com.coreyd97.BurpExtenderUtilities.ComponentGroup;
    19 18  import com.coreyd97.BurpExtenderUtilities.PanelBuilder;
     19 +import com.coreyd97.BurpExtenderUtilities.Preferences;
    20 20  import com.google.gson.reflect.TypeToken;
    21  -import com.nccgroup.loggerplusplus.logentry.EntryImportWorker;
    22  -import com.nccgroup.loggerplusplus.logentry.LogEntry;
    23  -import com.nccgroup.loggerplusplus.logentry.LogProcessor;
    24  -import com.nccgroup.loggerplusplus.logentry.logger.FileLogger;
    25  -import com.nccgroup.loggerplusplus.util.MoreHelp;
    26  -import com.nccgroup.loggerplusplus.imports.*;
    27 21  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    28 22  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    29 23  import com.nccgroup.loggerplusplus.filter.savedfilter.SavedFilter;
     24 +import com.nccgroup.loggerplusplus.imports.LoggerImport;
     25 +import com.nccgroup.loggerplusplus.logentry.logger.FileLogger;
     26 +import com.nccgroup.loggerplusplus.util.Globals;
     27 +import com.nccgroup.loggerplusplus.util.MoreHelp;
    30 28   
    31 29  import javax.swing.*;
    32 30  import java.awt.*;
    skipped 4 lines
    37 35   
    38 36  import static com.nccgroup.loggerplusplus.util.Globals.*;
    39 37   
    40  -public class LoggerOptionsPanel extends JScrollPane{
     38 +public class PreferencesPanel extends JScrollPane{
     39 + 
     40 + private final PreferencesController preferencesController;
     41 + private final Preferences preferences;
    41 42   
    42 43   private final JToggleButton tglbtnIsEnabled;
    43 44   private JToggleButton btnAutoSaveLogs;
    skipped 5 lines
    49 50   /**
    50 51   * Create the panel.
    51 52   */
    52  - public LoggerOptionsPanel() {
    53  - PanelBuilder panelBuilder = new PanelBuilder(LoggerPlusPlus.preferences);
     53 + public PreferencesPanel(PreferencesController preferencesController) {
     54 + this.preferencesController = preferencesController;
     55 + this.preferences = preferencesController.getPreferences();
     56 + 
     57 + PanelBuilder panelBuilder = new PanelBuilder(this.preferences);
    54 58   this.fileLogger = new FileLogger();
    55 59   this.esValueChangeWarning.setForeground(Color.RED);
    56  - JPanel innerContainer = new JPanel(new GridBagLayout());
    57  - 
    58 60   
    59 61   ComponentGroup statusPanel = panelBuilder.createComponentGroup("Status");
    60  - tglbtnIsEnabled = statusPanel.addToggleButton("Logger++ is running", actionEvent -> {
     62 + tglbtnIsEnabled = statusPanel.addToggleButton(APP_NAME + " is running", actionEvent -> {
    61 63   JToggleButton thisButton = (JToggleButton) actionEvent.getSource();
    62 64   toggleEnabledButton(thisButton.isSelected());
    63 65   });
    64  - tglbtnIsEnabled.setSelected(LoggerPlusPlus.preferences.getSetting(PREF_ENABLED));
     66 + tglbtnIsEnabled.setSelected(preferences.getSetting(PREF_ENABLED));
    65 67   
    66 68   ComponentGroup logFromPanel = panelBuilder.createComponentGroup("Log From");
    67 69   logFromPanel.addPreferenceComponent(PREF_RESTRICT_TO_SCOPE, "In scope items only");
    skipped 44 lines
    112 114   importGroup.addButton("Import Burp Proxy History", actionEvent -> {
    113 115   
    114 116   int historySize = LoggerPlusPlus.callbacks.getProxyHistory().length;
    115  - int maxEntries = LoggerPlusPlus.preferences.getSetting(PREF_MAXIMUM_ENTRIES);
     117 + int maxEntries = preferences.getSetting(PREF_MAXIMUM_ENTRIES);
    116 118   String message = "Import " + historySize + " items from burp suite proxy history? This will clear the current entries." +
    117 119   "\nLarge imports may take a few minutes to process.";
    118 120   if(historySize > maxEntries) {
    skipped 4 lines
    123 125   message, new String[]{"Import", "Cancel"});
    124 126   
    125 127   if(result == JOptionPane.OK_OPTION) {
    126  - LoggerPlusPlus.instance.getLogProcessor().importProxyHistory();
     128 + preferencesController.getLoggerPlusPlus().getLogProcessor().importProxyHistory();
    127 129   }
    128 130   });
    129 131   
    skipped 9 lines
    139 141   
    140 142   ComponentGroup exportGroup = panelBuilder.createComponentGroup("Export");
    141 143   exportGroup.addButton("Save log table as CSV", actionEvent -> {
    142  - fileLogger.saveLogs(false);
     144 +// fileLogger.saveLogs(false);
    143 145   });
    144 146   exportGroup.addButton("Save full logs as CSV (slow)", actionEvent -> {
    145  - fileLogger.saveLogs(true);
     147 +// fileLogger.saveLogs(true);
    146 148   });
    147 149   btnAutoSaveLogs = exportGroup.addToggleButton("Autosave as CSV", actionEvent -> {
    148  - fileLogger.setAutoSave(!(boolean) LoggerPlusPlus.preferences.getSetting(PREF_AUTO_SAVE));
     150 +// fileLogger.setAutoSave(!(boolean) preferences.getSetting(PREF_AUTO_SAVE));
    149 151   });
    150 152   
    151 153   ComponentGroup elasticPanel = panelBuilder.createComponentGroup("Elastic Search");
    skipped 43 lines
    195 197   ComponentGroup savedFilterSharing = panelBuilder.createComponentGroup("Saved LogFilter Sharing");
    196 198   savedFilterSharing.addButton("Import Saved Filters", actionEvent -> {
    197 199   String json = MoreHelp.showLargeInputDialog("Import Saved Filters", null);
    198  - ArrayList<SavedFilter> importedFilters = LoggerPlusPlus.gsonProvider.getGson().fromJson(json,
     200 + ArrayList<SavedFilter> importedFilters = preferencesController.getGsonProvider().getGson().fromJson(json,
    199 201   new TypeToken<ArrayList<SavedFilter>>(){}.getType());
    200  - ArrayList<SavedFilter> savedFilters = LoggerPlusPlus.preferences.getSetting(PREF_SAVED_FILTERS);
     202 + ArrayList<SavedFilter> savedFilters = preferences.getSetting(PREF_SAVED_FILTERS);
    201 203   ArrayList<SavedFilter> savedFiltersClone = new ArrayList<>(savedFilters);
    202 204   for (SavedFilter importedFilter : importedFilters) {
    203 205   if(!savedFiltersClone.contains(importedFilter)) savedFiltersClone.add(importedFilter);
    204 206   }
    205  - LoggerPlusPlus.preferences.setSetting(PREF_SAVED_FILTERS, savedFiltersClone);
     207 + preferences.setSetting(PREF_SAVED_FILTERS, savedFiltersClone);
    206 208   });
    207 209   savedFilterSharing.addButton("Export Saved Filters", actionEvent -> {
    208  - ArrayList<SavedFilter> savedFilters = LoggerPlusPlus.preferences.getSetting(PREF_SAVED_FILTERS);
    209  - String jsonOutput = LoggerPlusPlus.gsonProvider.getGson().toJson(savedFilters);
     210 + ArrayList<SavedFilter> savedFilters = preferences.getSetting(PREF_SAVED_FILTERS);
     211 + String jsonOutput = preferencesController.getGsonProvider().getGson().toJson(savedFilters);
    210 212   MoreHelp.showLargeOutputDialog("Export Saved Filters", jsonOutput);
    211 213   });
    212 214   
    213 215   ComponentGroup colorFilterSharing = panelBuilder.createComponentGroup("Color LogFilter Sharing");
    214 216   colorFilterSharing.addButton("Import Color Filters", actionEvent -> {
    215 217   String json = MoreHelp.showLargeInputDialog("Import Color Filters", null);
    216  - Map<UUID, ColorFilter> colorFilterMap = LoggerPlusPlus.gsonProvider.getGson().fromJson(json,
     218 + Map<UUID, ColorFilter> colorFilterMap = preferencesController.getGsonProvider().getGson().fromJson(json,
    217 219   new TypeToken<Map<UUID, ColorFilter>>(){}.getType());
    218 220   for (ColorFilter colorFilter : colorFilterMap.values()) {
    219 221   LoggerPlusPlus.instance.getLibraryController().addColorFilter(colorFilter);
    220 222   }
    221 223   });
    222 224   colorFilterSharing.addButton("Export Color Filters", actionEvent -> {
    223  - HashMap<UUID,ColorFilter> colorFilters = LoggerPlusPlus.preferences.getSetting(PREF_COLOR_FILTERS);
    224  - String jsonOutput = LoggerPlusPlus.gsonProvider.getGson().toJson(colorFilters);
     225 + HashMap<UUID,ColorFilter> colorFilters = preferences.getSetting(PREF_COLOR_FILTERS);
     226 + String jsonOutput = preferencesController.getGsonProvider().getGson().toJson(colorFilters);
    225 227   MoreHelp.showLargeOutputDialog("Export Color Filters", jsonOutput);
    226 228   });
    227 229   
    skipped 1 lines
    229 231   resetPanel.addButton("Reset All Settings", actionEvent -> {
    230 232   int result = JOptionPane.showConfirmDialog(null, "Are you sure you wish to reset all settings? This includes the table layout!", "Warning", JOptionPane.YES_NO_OPTION);
    231 233   if(result == JOptionPane.YES_OPTION){
    232  - LoggerPlusPlus.preferences.resetSettings(LoggerPlusPlus.preferences.getRegisteredSettings().keySet());
    233  - LoggerPlusPlus.instance.getLogTable().getColumnModel().resetToDefaultVariables();
    234  - LoggerPlusPlus.instance.getLogTable().getModel().fireTableStructureChanged();
     234 + preferences.resetSettings(preferences.getRegisteredSettings().keySet());
     235 + preferencesController.getLoggerPlusPlus().getLogViewController().getLogTableController().reinitialize();
    235 236   }
    236 237   });
    237 238   resetPanel.addButton("Clear The Logs", actionEvent -> {
    238  - LoggerPlusPlus.instance.reset();
     239 + preferencesController.getLoggerPlusPlus().getLogViewController().getLogTableController().reset();
    239 240   });
    240 241   
    241 242   
    skipped 24 lines
    266 267   }
    267 268   
    268 269   private void toggleEnabledButton(boolean isSelected) {
    269  - tglbtnIsEnabled.setText((isSelected ? "Logger++ is running" : "Logger++ has been stopped"));
     270 + tglbtnIsEnabled.setText(APP_NAME + (isSelected ? " is running" : " has been stopped"));
    270 271   tglbtnIsEnabled.setSelected(isSelected);
    271  - LoggerPlusPlus.preferences.setSetting(PREF_ENABLED, isSelected);
     272 + preferences.setSetting(PREF_ENABLED, isSelected);
    272 273   }
    273 274   
    274 275   private void toggleEsEnabledButton(final boolean isSelected) {
    skipped 4 lines
    279 280   esEnabled.setText("Starting...");
    280 281   }
    281 282   try {
    282  - LoggerPlusPlus.instance.setEsEnabled(isSelected);
     283 +// LoggerPlusPlus.instance.setEsEnabled(isSelected);//TODO FIXME
    283 284   esEnabled.setText((isSelected ? "Enabled" : "Disabled"));
    284 285   esEnabled.setSelected(isSelected);
    285 286   if(isSelected) {
    skipped 24 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/LogTableModel.java
    1  -package com.nccgroup.loggerplusplus.userinterface;
    2  - 
    3  -import com.nccgroup.loggerplusplus.logentry.LogEntry;
    4  -import com.nccgroup.loggerplusplus.logentry.LogEntryField;
    5  -import com.nccgroup.loggerplusplus.logentry.LogProcessor;
    6  -import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumn;
    7  -import com.nccgroup.loggerplusplus.logview.logtable.LogTableColumnModel;
    8  - 
    9  -import javax.swing.table.AbstractTableModel;
    10  -import java.util.Date;
    11  -import java.util.List;
    12  - 
    13  -/* Extending AbstractTableModel to design the logTable behaviour based on the array list */
    14  -public class LogTableModel extends AbstractTableModel {
    15  - 
    16  - private final LogProcessor logProcessor;
    17  - private final List<LogEntry> entries;
    18  - private LogTableColumnModel columnModel;
    19  - 
    20  - public LogTableModel(LogProcessor logProcessor, LogTableColumnModel columnModel){
    21  - this.logProcessor = logProcessor;
    22  - this.entries = logProcessor.getLogEntries();
    23  - this.columnModel = columnModel;
    24  - }
    25  - 
    26  - @Override
    27  - public int getRowCount()
    28  - {
    29  - if(logProcessor == null) return 0;
    30  - if(entries==null) {
    31  - return 0;
    32  - }
    33  - 
    34  - return entries.size();
    35  - }
    36  - 
    37  - @Override
    38  - public int getColumnCount()
    39  - {
    40  - return (this.columnModel != null) ? this.columnModel.getColumnCount() : 0;
    41  - }
    42  - 
    43  - @Override
    44  - public boolean isCellEditable(int rowModelIndex, int columnModelIndex) {
    45  - return !(this.columnModel.getModelColumn(columnModelIndex)).isReadOnly();
    46  - }
    47  - 
    48  - @Override
    49  - public void setValueAt(Object value, int rowModelIndex, int columnModelIndex) {
    50  - LogEntry logEntry = entries.get(rowModelIndex);
    51  - if(this.columnModel.getModelColumn(columnModelIndex).getIdentifier() == LogEntryField.COMMENT){
    52  - logEntry.comment = (String) value;
    53  - }
    54  - fireTableCellUpdated(rowModelIndex, this.columnModel.getViewIndex(columnModelIndex));
    55  - }
    56  - 
    57  - @Override
    58  - public Class<?> getColumnClass(int columnModelIndex) {
    59  - Object val = getValueAt(0, columnModelIndex);
    60  - return val == null ? String.class : val.getClass();
    61  - }
    62  - 
    63  - public void removeRow(int row) {
    64  - entries.remove(row);
    65  - this.fireTableRowsDeleted(row, row);
    66  - }
    67  - 
    68  - @Override
    69  - public Object getValueAt(int rowIndex, int colModelIndex)
    70  - {
    71  - if(rowIndex >= entries.size()) return null;
    72  - if(colModelIndex == 0){
    73  - return rowIndex+1;
    74  - }
    75  - 
    76  - LogTableColumn column = columnModel.getModelColumn(colModelIndex);
    77  - 
    78  - Object value = entries.get(rowIndex).getValueByKey(column.getIdentifier());
    79  - 
    80  - if(value instanceof Date){
    81  - return LogProcessor.LOGGER_DATE_FORMAT.format(value);
    82  - }
    83  - return value;
    84  - }
    85  - 
    86  - public List<LogEntry> getData() {
    87  - return this.entries;
    88  - }
    89  - 
    90  - public LogEntry getRow(int row) {
    91  - if(this.entries.size() <= row) return null;
    92  - return this.entries.get(row);
    93  - }
    94  -}
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/Globals.java
    skipped 3 lines
    4 4  import static com.nccgroup.loggerplusplus.logentry.LogEntryField.*;
    5 5   
    6 6  public class Globals {
    7  - public static final String APP_NAME = "Burp Suite Logger++";
     7 + public static final String APP_NAME = "Logger++";
    8 8   public static final double VERSION = 3.14;
    9 9   public static final String AUTHOR = "Corey Arthur (@CoreyD97), Soroush Dalili (@irsdl) from NCC Group";
    10 10   public static final String COMPANY_LINK = "https://www.nccgroup.trust/";
    skipped 112 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/MoreHelp.java
    skipped 57 lines
    58 58   @Override
    59 59   public void run()
    60 60   {
    61  - JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(BurpExtender.instance.getUiComponent()), strMsg);
     61 + JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(LoggerPlusPlus.instance.getMainViewController().getUiComponent()), strMsg);
    62 62   }
    63 63   }).start();
    64 64  
    skipped 6 lines
    71 71   @Override
    72 72   public void run()
    73 73   {
    74  - JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(BurpExtender.instance.getUiComponent()), strMsg, "Warning", JOptionPane.WARNING_MESSAGE);
     74 + JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(LoggerPlusPlus.instance.getMainViewController().getUiComponent()), strMsg, "Warning", JOptionPane.WARNING_MESSAGE);
    75 75   }
    76 76   }).start();
    77 77  
    skipped 1 lines
    79 79  
    80 80   // Show a message to the user
    81 81   public static String showPlainInputMessage(final String strMessage, final String strTitle, final String defaultValue){
    82  - String output = (String)JOptionPane.showInputDialog(JOptionPane.getFrameForComponent(BurpExtender.instance.getUiComponent()),
     82 + String output = (String)JOptionPane.showInputDialog(JOptionPane.getFrameForComponent(LoggerPlusPlus.instance.getMainViewController().getUiComponent()),
    83 83   strMessage,strTitle,JOptionPane.PLAIN_MESSAGE, null, null, defaultValue);
    84 84   if(output==null){
    85 85   output = defaultValue;
    skipped 123 lines
    209 209   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    210 210   scrollPane.setPreferredSize(new Dimension((int) (screenSize.getWidth()/2.0), (int) (screenSize.getHeight()/2.0)));
    211 211   scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    212  - JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(BurpExtender.instance.getUiComponent()), scrollPane, title, JOptionPane.PLAIN_MESSAGE);
     212 + JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(LoggerPlusPlus.instance.getMainViewController().getUiComponent()), scrollPane, title, JOptionPane.PLAIN_MESSAGE);
    213 213   }
    214 214   
    215 215   public static String showLargeInputDialog(String title, String message){
    skipped 4 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/util/ColorEditor.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/ColorEditor.java
    1  -package com.nccgroup.loggerplusplus.util;
     1 +package com.nccgroup.loggerplusplus.util.userinterface;
    2 2   
    3 3  import javax.swing.*;
    4 4  import javax.swing.table.TableCellEditor;
    skipped 53 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/LoggerMenu.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/LoggerMenu.java
    1  -package com.nccgroup.loggerplusplus.userinterface;
     1 +package com.nccgroup.loggerplusplus.util.userinterface;
    2 2   
     3 +import com.coreyd97.BurpExtenderUtilities.Preferences;
    3 4  import com.coreyd97.BurpExtenderUtilities.VariableViewPanel;
    4  -import com.nccgroup.loggerplusplus.util.Globals;
    5 5  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    6  -import com.nccgroup.loggerplusplus.userinterface.dialog.ColorFilterDialog;
     6 +import com.nccgroup.loggerplusplus.util.Globals;
     7 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterDialog;
    7 8   
    8 9  import javax.swing.*;
    9 10  import java.awt.event.ActionEvent;
    skipped 3 lines
    13 14   */
    14 15  public class LoggerMenu extends javax.swing.JMenu {
    15 16   
    16  - public LoggerMenu(){
    17  - super(LoggerPlusPlus.instance.getTabCaption());
     17 + private final LoggerPlusPlus loggerPlusPlus;
     18 + private final Preferences preferences;
     19 + 
     20 + public LoggerMenu(LoggerPlusPlus loggerPlusPlus){
     21 + super(Globals.APP_NAME);
     22 + this.loggerPlusPlus = loggerPlusPlus;
     23 + this.preferences = loggerPlusPlus.getPreferencesController().getPreferences();
     24 + 
     25 + this.add(loggerPlusPlus.getMainViewController().getPopOutWrapper().getPopoutMenuItem());
     26 + this.add(loggerPlusPlus.getLogViewController().getLogViewPanel().getRequestViewerPanel().getPopoutMenuItem());
     27 + 
    18 28   JMenuItem colorFilters = new JMenuItem(new AbstractAction("Color Filters") {
    19 29   @Override
    20 30   public void actionPerformed(ActionEvent actionEvent) {
    skipped 3 lines
    24 34   this.add(colorFilters);
    25 35   
    26 36   JMenu viewMenu = new JMenu("View");
    27  - VariableViewPanel.View currentView = LoggerPlusPlus.preferences.getSetting(Globals.PREF_LAYOUT);
     37 + VariableViewPanel.View currentView = preferences.getSetting(Globals.PREF_LAYOUT);
    28 38   ButtonGroup bGroup = new ButtonGroup();
    29 39   JRadioButtonMenuItem viewMenuItem = new JRadioButtonMenuItem(new AbstractAction("Top/Bottom Split") {
    30 40   @Override
    31 41   public void actionPerformed(ActionEvent actionEvent) {
    32  - LoggerPlusPlus.instance.getLogSplitPanel().setView(VariableViewPanel.View.VERTICAL);
     42 + loggerPlusPlus.getLogViewController().setPanelLayout(VariableViewPanel.View.VERTICAL);
    33 43   }
    34 44   });
    35 45   viewMenuItem.setSelected(currentView == VariableViewPanel.View.VERTICAL);
    skipped 2 lines
    38 48   viewMenuItem = new JRadioButtonMenuItem(new AbstractAction("Left/Right Split") {
    39 49   @Override
    40 50   public void actionPerformed(ActionEvent actionEvent) {
    41  - LoggerPlusPlus.instance.getLogSplitPanel().setView(VariableViewPanel.View.HORIZONTAL);
     51 + loggerPlusPlus.getLogViewController().setPanelLayout(VariableViewPanel.View.HORIZONTAL);
    42 52   }
    43 53   });
    44 54   viewMenuItem.setSelected(currentView == VariableViewPanel.View.HORIZONTAL);
    skipped 2 lines
    47 57   viewMenuItem = new JRadioButtonMenuItem(new AbstractAction("Tabs") {
    48 58   @Override
    49 59   public void actionPerformed(ActionEvent actionEvent) {
    50  - LoggerPlusPlus.instance.getLogSplitPanel().setView(VariableViewPanel.View.TABS);
     60 + loggerPlusPlus.getLogViewController().setPanelLayout(VariableViewPanel.View.TABS);
    51 61   }
    52 62   });
    53 63   viewMenuItem.setSelected(currentView == VariableViewPanel.View.TABS);
    skipped 2 lines
    56 66   this.add(viewMenu);
    57 67   
    58 68   viewMenu = new JMenu("Request/Response View");
    59  - VariableViewPanel.View currentReqRespView = LoggerPlusPlus.preferences.getSetting(Globals.PREF_MESSAGE_VIEW_LAYOUT);
     69 + VariableViewPanel.View currentReqRespView = preferences.getSetting(Globals.PREF_MESSAGE_VIEW_LAYOUT);
    60 70   bGroup = new ButtonGroup();
    61 71   viewMenuItem = new JRadioButtonMenuItem(new AbstractAction("Top/Bottom Split") {
    62 72   @Override
    63 73   public void actionPerformed(ActionEvent actionEvent) {
    64  - LoggerPlusPlus.instance.getReqRespPanel().setView(VariableViewPanel.View.VERTICAL);
     74 + loggerPlusPlus.getLogViewController().setEntryViewerLayout(VariableViewPanel.View.VERTICAL);
    65 75   }
    66 76   });
    67 77   viewMenu.add(viewMenuItem);
    skipped 2 lines
    70 80   viewMenuItem = new JRadioButtonMenuItem(new AbstractAction("Left/Right Split") {
    71 81   @Override
    72 82   public void actionPerformed(ActionEvent actionEvent) {
    73  - LoggerPlusPlus.instance.getReqRespPanel().setView(VariableViewPanel.View.HORIZONTAL);
     83 + loggerPlusPlus.getLogViewController().setEntryViewerLayout(VariableViewPanel.View.HORIZONTAL);
    74 84   }
    75 85   });
    76 86   viewMenu.add(viewMenuItem);
    skipped 2 lines
    79 89   viewMenuItem = new JRadioButtonMenuItem(new AbstractAction("Tabs") {
    80 90   @Override
    81 91   public void actionPerformed(ActionEvent actionEvent) {
    82  - LoggerPlusPlus.instance.getReqRespPanel().setView(VariableViewPanel.View.TABS);
     92 + loggerPlusPlus.getLogViewController().setEntryViewerLayout(VariableViewPanel.View.TABS);
    83 93   }
    84 94   });
    85 95   viewMenu.add(viewMenuItem);
    skipped 2 lines
    88 98   this.add(viewMenu);
    89 99   
    90 100   JCheckBoxMenuItem debugOption = new JCheckBoxMenuItem("Debug");
    91  - if(LoggerPlusPlus.preferences.getSetting(Globals.PREF_IS_DEBUG) != null) {
    92  - debugOption.setSelected(LoggerPlusPlus.preferences.getSetting(Globals.PREF_IS_DEBUG));
     101 + if(preferences.getSetting(Globals.PREF_IS_DEBUG) != null) {
     102 + debugOption.setSelected(preferences.getSetting(Globals.PREF_IS_DEBUG));
    93 103   }
    94 104   debugOption.addActionListener((e) -> {
    95  - Boolean currentSetting = LoggerPlusPlus.preferences.getSetting(Globals.PREF_IS_DEBUG);
     105 + Boolean currentSetting = preferences.getSetting(Globals.PREF_IS_DEBUG);
    96 106   if(currentSetting == null) {
    97  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_IS_DEBUG, true);
     107 + preferences.setSetting(Globals.PREF_IS_DEBUG, true);
    98 108   }else{
    99  - LoggerPlusPlus.preferences.setSetting(Globals.PREF_IS_DEBUG, !currentSetting);
     109 + preferences.setSetting(Globals.PREF_IS_DEBUG, !currentSetting);
    100 110   }
    101 111   });
    102 112   this.add(debugOption);
    skipped 3 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/ScrollablePanel.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/ScrollablePanel.java
    1  -package com.nccgroup.loggerplusplus.userinterface;
     1 +package com.nccgroup.loggerplusplus.util.userinterface;
    2 2   
    3 3  import javax.swing.*;
    4 4  import java.awt.*;
    skipped 330 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/dialog/ColorFilterDialog.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/dialog/ColorFilterDialog.java
    1  -package com.nccgroup.loggerplusplus.userinterface.dialog;
     1 +package com.nccgroup.loggerplusplus.util.userinterface.dialog;
    2 2   
    3  -import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    4 3  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    5  -import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilterListener;
    6  -import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
    7  -import com.nccgroup.loggerplusplus.filter.parser.ParseException;
    8 4  import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
    9  -import com.nccgroup.loggerplusplus.util.Globals;
    10 5   
    11 6  import javax.swing.*;
    12 7  import java.awt.*;
    13 8  import java.awt.event.ActionEvent;
    14 9  import java.awt.event.ActionListener;
    15 10  import java.awt.event.WindowEvent;
    16  -import java.util.ArrayList;
    17  -import java.util.HashMap;
    18  -import java.util.Map;
    19  -import java.util.UUID;
    20 11   
    21 12  /**
    22 13   * Created by corey on 19/07/17.
    skipped 86 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/dialog/ColorFilterTable.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/dialog/ColorFilterTable.java
    1  -package com.nccgroup.loggerplusplus.userinterface.dialog;
     1 +package com.nccgroup.loggerplusplus.util.userinterface.dialog;
    2 2   
    3 3  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    4  -import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilterListener;
    5 4  import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
    6  -import com.nccgroup.loggerplusplus.userinterface.renderer.ButtonRenderer;
    7  -import com.nccgroup.loggerplusplus.userinterface.renderer.ColorRenderer;
    8  -import com.nccgroup.loggerplusplus.userinterface.renderer.FilterRenderer;
    9  -import com.nccgroup.loggerplusplus.util.ColorEditor;
     5 +import com.nccgroup.loggerplusplus.util.userinterface.renderer.ButtonRenderer;
     6 +import com.nccgroup.loggerplusplus.util.userinterface.renderer.ColorRenderer;
     7 +import com.nccgroup.loggerplusplus.util.userinterface.renderer.FilterRenderer;
     8 +import com.nccgroup.loggerplusplus.util.userinterface.ColorEditor;
    10 9   
    11 10  import javax.swing.*;
    12 11  import java.awt.*;
    13 12  import java.awt.event.MouseAdapter;
    14 13  import java.awt.event.MouseEvent;
    15  -import java.util.ArrayList;
    16  -import java.util.Map;
    17  -import java.util.UUID;
    18 14   
    19 15  /**
    20 16   * Created by corey on 19/07/17.
    skipped 67 lines
  • ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/dialog/ColorFilterTableModel.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/dialog/ColorFilterTableModel.java
    1  -package com.nccgroup.loggerplusplus.userinterface.dialog;
     1 +package com.nccgroup.loggerplusplus.util.userinterface.dialog;
    2 2   
    3 3  import com.nccgroup.loggerplusplus.LoggerPlusPlus;
    4 4  import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilter;
    5  -import com.nccgroup.loggerplusplus.filter.colorfilter.ColorFilterListener;
    6 5  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
    7 6  import com.nccgroup.loggerplusplus.filter.parser.ParseException;
    8 7  import com.nccgroup.loggerplusplus.filterlibrary.FilterLibraryController;
    skipped 177 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/renderer/BooleanRenderer.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/renderer/BooleanRenderer.java
    1  -package com.nccgroup.loggerplusplus.userinterface.renderer;
     1 +package com.nccgroup.loggerplusplus.util.userinterface.renderer;
    2 2   
    3 3  import javax.swing.*;
    4 4  import javax.swing.border.Border;
    skipped 38 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/renderer/ButtonRenderer.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/renderer/ButtonRenderer.java
    1  -package com.nccgroup.loggerplusplus.userinterface.renderer;
     1 +package com.nccgroup.loggerplusplus.util.userinterface.renderer;
    2 2   
    3 3  import javax.swing.*;
    4 4  import javax.swing.table.TableCellRenderer;
    skipped 12 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/renderer/ColorRenderer.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/renderer/ColorRenderer.java
    1  -package com.nccgroup.loggerplusplus.userinterface.renderer;
     1 +package com.nccgroup.loggerplusplus.util.userinterface.renderer;
    2 2   
    3 3  /*
    4 4   * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
    skipped 48 lines
  • ■ ■ ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/renderer/FilterRenderer.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/renderer/FilterRenderer.java
    1  -package com.nccgroup.loggerplusplus.userinterface.renderer;
     1 +package com.nccgroup.loggerplusplus.util.userinterface.renderer;
    2 2   
    3 3  import com.nccgroup.loggerplusplus.filter.logfilter.LogFilter;
    4  -import com.nccgroup.loggerplusplus.userinterface.dialog.ColorFilterTable;
    5  -import com.nccgroup.loggerplusplus.userinterface.dialog.ColorFilterTableModel;
     4 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterTable;
     5 +import com.nccgroup.loggerplusplus.util.userinterface.dialog.ColorFilterTableModel;
    6 6   
    7 7  import javax.swing.*;
    8 8  import javax.swing.table.DefaultTableCellRenderer;
    skipped 29 lines
  • ■ ■ ■ ■
    src/main/java/com/nccgroup/loggerplusplus/userinterface/renderer/LeftTableCellRenderer.java src/main/java/com/nccgroup/loggerplusplus/util/userinterface/renderer/LeftTableCellRenderer.java
    1  -package com.nccgroup.loggerplusplus.userinterface.renderer;
     1 +package com.nccgroup.loggerplusplus.util.userinterface.renderer;
    2 2   
    3 3  import javax.swing.*;
    4 4  import javax.swing.table.DefaultTableCellRenderer;
    skipped 10 lines
Please wait...
Page is in error, reload to recover