summaryrefslogtreecommitdiffstats
path: root/ui/qt/endpoint_dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ui/qt/endpoint_dialog.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/ui/qt/endpoint_dialog.cpp b/ui/qt/endpoint_dialog.cpp
new file mode 100644
index 0000000..38a30be
--- /dev/null
+++ b/ui/qt/endpoint_dialog.cpp
@@ -0,0 +1,156 @@
+/* endpoint_dialog.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "endpoint_dialog.h"
+
+#include <epan/maxmind_db.h>
+
+#include <epan/prefs.h>
+#include <epan/to_str.h>
+
+#include "ui/recent.h"
+
+#include "wsutil/filesystem.h"
+#include "wsutil/file_util.h"
+#include "wsutil/pint.h"
+#include "wsutil/str_util.h"
+#include <wsutil/utf8_entities.h>
+
+#include <ui/qt/utils/qt_ui_utils.h>
+#include <ui/qt/utils/variant_pointer.h>
+#include <ui/qt/widgets/wireshark_file_dialog.h>
+#include <ui/qt/widgets/traffic_tab.h>
+#include <ui/qt/widgets/traffic_types_list.h>
+#include "main_application.h"
+
+#include <QCheckBox>
+#include <QDesktopServices>
+#include <QDialogButtonBox>
+#include <QMessageBox>
+#include <QPushButton>
+#include <QUrl>
+#include <QTemporaryFile>
+#include <QTreeView>
+#include <QSortFilterProxyModel>
+
+typedef enum
+{
+ ENDP_COLUMN_ADDR,
+ ENDP_COLUMN_PORT,
+ ENDP_COLUMN_PACKETS,
+ ENDP_COLUMN_BYTES,
+ ENDP_COLUMN_PKT_AB,
+ ENDP_COLUMN_BYTES_AB,
+ ENDP_COLUMN_PKT_BA,
+ ENDP_COLUMN_BYTES_BA,
+ ENDP_NUM_COLUMNS,
+ ENDP_COLUMN_GEO_COUNTRY = ENDP_NUM_COLUMNS,
+ ENDP_COLUMN_GEO_CITY,
+ ENDP_COLUMN_GEO_AS_NUM,
+ ENDP_COLUMN_GEO_AS_ORG,
+ ENDP_NUM_GEO_COLUMNS
+} endpoint_column_type_e;
+
+static const QString table_name_ = QObject::tr("Endpoint");
+
+static ATapDataModel * createModel(int protoId, QString filter)
+{
+ return new EndpointDataModel(protoId, filter);
+}
+
+EndpointDialog::EndpointDialog(QWidget &parent, CaptureFile &cf) :
+ TrafficTableDialog(parent, cf, table_name_)
+{
+ trafficList()->setProtocolInfo(table_name_, &(recent.endpoint_tabs));
+
+ trafficTab()->setProtocolInfo(table_name_, trafficList(), &(recent.endpoint_tabs_columns), &createModel);
+ trafficTab()->setFilter(cf.displayFilter());
+
+ connect(trafficTab(), &TrafficTab::filterAction, this, &EndpointDialog::filterAction);
+ connect(trafficTab()->tabBar(), &QTabBar::currentChanged, this, &EndpointDialog::tabChanged);
+ connect(trafficTab(), &TrafficTab::tabDataChanged, this, &EndpointDialog::tabChanged);
+
+#ifdef HAVE_MAXMINDDB
+ map_bt_ = buttonBox()->addButton(tr("Map"), QDialogButtonBox::ActionRole);
+ map_bt_->setToolTip(tr("Draw IPv4 or IPv6 endpoints on a map."));
+
+ QMenu *map_menu_ = new QMenu(map_bt_);
+ QAction *action;
+ action = map_menu_->addAction(tr("Open in browser"));
+ connect(action, &QAction::triggered, this, &EndpointDialog::openMap);
+ action = map_menu_->addAction(tr("Save As…"));
+ connect(action, &QAction::triggered, this, &EndpointDialog::saveMap);
+ map_bt_->setMenu(map_menu_);
+#endif
+
+ updateWidgets();
+}
+
+void EndpointDialog::captureFileClosing()
+{
+ trafficTab()->disableTap();
+ displayFilterCheckBox()->setEnabled(false);
+ TrafficTableDialog::captureFileClosing();
+}
+
+void EndpointDialog::tabChanged(int idx)
+{
+#ifdef HAVE_MAXMINDDB
+ if (idx == trafficTab()->currentIndex())
+ {
+ bool geoIp = trafficTab()->hasGeoIPData(idx);
+ map_bt_->setEnabled(geoIp);
+ }
+#else
+ Q_UNUSED(idx);
+#endif
+
+ TrafficTableDialog::currentTabChanged();
+}
+
+#ifdef HAVE_MAXMINDDB
+void EndpointDialog::openMap()
+{
+ QUrl map_file = trafficTab()->createGeoIPMap(false);
+ if (!map_file.isEmpty()) {
+ QDesktopServices::openUrl(map_file);
+ }
+}
+
+void EndpointDialog::saveMap()
+{
+ QString destination_file =
+ WiresharkFileDialog::getSaveFileName(this, tr("Save Endpoints Map"),
+ "ipmap.html",
+ "HTML files (*.html);;GeoJSON files (*.json)");
+ if (destination_file.isEmpty()) {
+ return;
+ }
+ QUrl map_file = trafficTab()->createGeoIPMap(destination_file.endsWith(".json"));
+ if (!map_file.isEmpty()) {
+ QString source_file = map_file.toLocalFile();
+ QFile::remove(destination_file);
+ if (!QFile::rename(source_file, destination_file)) {
+ QMessageBox::warning(this, tr("Map file error"),
+ tr("Failed to save map file %1.").arg(destination_file));
+ QFile::remove(source_file);
+ }
+ }
+}
+#endif
+
+void EndpointDialog::on_buttonBox_helpRequested()
+{
+ mainApp->helpTopicAction(HELP_STATS_ENDPOINTS_DIALOG);
+}
+
+void init_endpoint_table(struct register_ct* ct, const char *filter)
+{
+ mainApp->emitStatCommandSignal("Endpoints", filter, GINT_TO_POINTER(get_conversation_proto_id(ct)));
+}