From 6eae02884368d6c5abb1c336369f7838588a35a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig=20Bj=C3=B8rlykke?= Date: Thu, 19 May 2016 12:09:33 +0200 Subject: [PATCH] Qt: Add Decode as Quoted-Printable in Show Packet Bytes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I4697b979702e4df83b1ec85b9a3619409c0b366c Reviewed-on: https://code.wireshark.org/review/15500 Reviewed-by: Stig Bjørlykke --- ui/qt/show_packet_bytes_dialog.cpp | 31 ++++++++++++++++++++++++++++++ ui/qt/show_packet_bytes_dialog.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/ui/qt/show_packet_bytes_dialog.cpp b/ui/qt/show_packet_bytes_dialog.cpp index a759fa133c..5bba737e7b 100644 --- a/ui/qt/show_packet_bytes_dialog.cpp +++ b/ui/qt/show_packet_bytes_dialog.cpp @@ -69,6 +69,7 @@ ShowPacketBytesDialog::ShowPacketBytesDialog(QWidget &parent, CaptureFile &cf) : ui->cbDecodeAs->addItem(tr("None"), DecodeAsNone); ui->cbDecodeAs->addItem(tr("Base64"), DecodeAsBASE64); ui->cbDecodeAs->addItem(tr("Compressed"), DecodeAsCompressed); + ui->cbDecodeAs->addItem(tr("Quoted-Printable"), DecodeAsQuotedPrintable); ui->cbDecodeAs->addItem(tr("ROT13"), DecodeAsROT13); ui->cbDecodeAs->blockSignals(false); @@ -455,6 +456,31 @@ void ShowPacketBytesDialog::symbolizeBuffer(QByteArray &ba) ba.replace((char)0x7f, symbol); // DEL } +QByteArray ShowPacketBytesDialog::decodeQuotedPrintable(const guint8 *bytes, int length) +{ + QByteArray ba; + + for (int i = 0; i < length; i++) { + if (bytes[i] == '=' && i + 1 < length) { + if (bytes[i+1] == '\n') { + i++; // Soft line break LF + } else if (bytes[i+1] == '\r' && i + 2 < length && bytes[i+2] == '\n') { + i += 2; // Soft line break CRLF + } else if (g_ascii_isxdigit(bytes[i+1]) && i + 2 < length && g_ascii_isxdigit(bytes[i+2])) { + ba.append(QByteArray::fromHex(QByteArray((const char *)&bytes[i+1], 2))); + i += 2; // Valid Quoted-Printable sequence + } else { + // Illegal Quoted-Printable, just add byte + ba.append(bytes[i]); + } + } else { + ba.append(bytes[i]); + } + } + + return ba; +} + void ShowPacketBytesDialog::rot13(QByteArray &ba) { for (int i = 0; i < ba.length(); i++) { @@ -499,6 +525,11 @@ void ShowPacketBytesDialog::updateFieldBytes(bool initialization) break; } + case DecodeAsQuotedPrintable: + bytes = tvb_get_ptr(finfo_->ds_tvb, start, -1); + field_bytes_ = decodeQuotedPrintable(bytes, length); + break; + case DecodeAsROT13: bytes = tvb_get_ptr(finfo_->ds_tvb, start, -1); field_bytes_ = QByteArray((const char *)bytes, length); diff --git a/ui/qt/show_packet_bytes_dialog.h b/ui/qt/show_packet_bytes_dialog.h index 906a2d8bb8..c1bb67c584 100644 --- a/ui/qt/show_packet_bytes_dialog.h +++ b/ui/qt/show_packet_bytes_dialog.h @@ -79,6 +79,7 @@ private: DecodeAsNone, DecodeAsBASE64, DecodeAsCompressed, + DecodeAsQuotedPrintable, DecodeAsROT13 }; enum ShowAsType { @@ -101,6 +102,7 @@ private: void updateHintLabel(); void sanitizeBuffer(QByteArray &ba, bool handle_CR); void symbolizeBuffer(QByteArray &ba); + QByteArray decodeQuotedPrintable(const guint8 *bytes, int length); void rot13(QByteArray &ba); void updateFieldBytes(bool initialization = false); void updatePacketBytes();