From 32519969726a52535a447a129199671768ca456c Mon Sep 17 00:00:00 2001 From: Volodymyr Buberenko Date: Wed, 26 Feb 2020 11:46:54 +0200 Subject: [PATCH 1/3] Add UI for TLS info --- .../TransactionOverviewFragment.kt | 4 ++ .../chucker_fragment_transaction_overview.xml | 44 ++++++++++++++++++- library/src/main/res/values/strings.xml | 2 + 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt index 76432dfe5..3e0667575 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt @@ -21,6 +21,8 @@ internal class TransactionOverviewFragment : Fragment() { private lateinit var status: TextView private lateinit var response: TextView private lateinit var ssl: TextView + private lateinit var tlsVersion: TextView + private lateinit var cipherSuiteVersion: TextView private lateinit var requestTime: TextView private lateinit var responseTime: TextView private lateinit var duration: TextView @@ -48,6 +50,8 @@ internal class TransactionOverviewFragment : Fragment() { status = it.findViewById(R.id.chuckerTransactionOverviewStatus) response = it.findViewById(R.id.chuckerTransactionOverviewResponse) ssl = it.findViewById(R.id.chuckerTransactionOverviewSsl) + tlsVersion = it.findViewById(R.id.chuckerTransactionOverviewTlsVersion) + cipherSuiteVersion = it.findViewById(R.id.chuckerTransactionOverviewTlsChipherSuite) requestTime = it.findViewById(R.id.chuckerTransactionOverviewRequestTime) responseTime = it.findViewById(R.id.chuckerTransactionOverviewResponseTime) duration = it.findViewById(R.id.chuckerTransactionOverviewDuration) diff --git a/library/src/main/res/layout/chucker_fragment_transaction_overview.xml b/library/src/main/res/layout/chucker_fragment_transaction_overview.xml index 460067ed7..f93cfbb6f 100644 --- a/library/src/main/res/layout/chucker_fragment_transaction_overview.xml +++ b/library/src/main/res/layout/chucker_fragment_transaction_overview.xml @@ -118,6 +118,7 @@ style="@style/Chucker.TextAppearance.Label" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/chucker_base_grid" android:text="@string/chucker_ssl" app:layout_constraintEnd_toStartOf="@id/chuckerTransactionOverviewGuideline" app:layout_constraintStart_toStartOf="parent" @@ -126,6 +127,7 @@ + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/chuckerTransactionOverviewTlsChipherSuite" /> Protocol Status SSL + TLS version + Cipher Suite Request time Response time Duration From df2d14f6fc5cc0a9d5ed803608663f4555a3f0f3 Mon Sep 17 00:00:00 2001 From: Volodymyr Buberenko Date: Wed, 26 Feb 2020 12:13:35 +0200 Subject: [PATCH 2/3] Implement logic for retrieving TLS info --- .../chucker/api/ChuckerInterceptor.kt | 5 +++ .../internal/data/entity/HttpTransaction.kt | 8 ++++- .../TransactionOverviewFragment.kt | 16 +++++++-- .../chucker_fragment_transaction_overview.xml | 34 +++++++++++++++---- 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt b/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt index a466e43b3..4aa3b3bd9 100755 --- a/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt +++ b/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt @@ -123,6 +123,11 @@ class ChuckerInterceptor @JvmOverloads constructor( responseCode = response.code() responseMessage = response.message() + response.handshake()?.let { handshake -> + responseTlsVersion = handshake.tlsVersion().javaName() + responseCipherSuite = handshake.cipherSuite().javaName() + } + responseContentType = response.contentType responseContentLength = response.contentLenght diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt index 9c6d96897..78d2e53de 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt @@ -33,6 +33,8 @@ internal class HttpTransaction( @ColumnInfo(name = "host") var host: String?, @ColumnInfo(name = "path") var path: String?, @ColumnInfo(name = "scheme") var scheme: String?, + @ColumnInfo(name = "responseTlsVersion") var responseTlsVersion: String?, + @ColumnInfo(name = "responseCipherSuite") var responseCipherSuite: String?, @ColumnInfo(name = "requestContentLength") var requestContentLength: Long?, @ColumnInfo(name = "requestContentType") var requestContentType: String?, @ColumnInfo(name = "requestHeaders") var requestHeaders: String?, @@ -60,6 +62,8 @@ internal class HttpTransaction( host = null, path = null, scheme = null, + responseTlsVersion = null, + responseCipherSuite = null, requestContentLength = null, requestContentType = null, requestHeaders = null, @@ -243,6 +247,8 @@ internal class HttpTransaction( (host == other.host) && (path == other.path) && (scheme == other.scheme) && + (responseTlsVersion == other.responseTlsVersion) && + (responseCipherSuite == other.responseCipherSuite) && (requestContentLength == other.requestContentLength) && (requestContentType == other.requestContentType) && (requestHeaders == other.requestHeaders) && @@ -256,6 +262,6 @@ internal class HttpTransaction( (responseHeaders == other.responseHeaders) && (responseBody == other.responseBody) && (isResponseBodyPlainText == other.isResponseBodyPlainText) && - responseImageData?.contentEquals(other.responseImageData ?: byteArrayOf()) != false + (responseImageData?.contentEquals(other.responseImageData ?: byteArrayOf()) != false) } } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt index 3e0667575..2eeaeae55 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt @@ -7,6 +7,7 @@ import android.view.MenuInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.constraintlayout.widget.Group import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -21,7 +22,9 @@ internal class TransactionOverviewFragment : Fragment() { private lateinit var status: TextView private lateinit var response: TextView private lateinit var ssl: TextView + private lateinit var tlsVersionGroup: Group private lateinit var tlsVersion: TextView + private lateinit var cipherSuiteGroup: Group private lateinit var cipherSuiteVersion: TextView private lateinit var requestTime: TextView private lateinit var responseTime: TextView @@ -50,8 +53,10 @@ internal class TransactionOverviewFragment : Fragment() { status = it.findViewById(R.id.chuckerTransactionOverviewStatus) response = it.findViewById(R.id.chuckerTransactionOverviewResponse) ssl = it.findViewById(R.id.chuckerTransactionOverviewSsl) - tlsVersion = it.findViewById(R.id.chuckerTransactionOverviewTlsVersion) - cipherSuiteVersion = it.findViewById(R.id.chuckerTransactionOverviewTlsChipherSuite) + tlsVersionGroup = it.findViewById(R.id.chuckerTransactionOverviewTlsGroup) + tlsVersion = it.findViewById(R.id.chuckerTransactionOverviewTlsVersionValue) + cipherSuiteGroup = it.findViewById(R.id.chuckerTransactionOverviewCipherSuiteGroup) + cipherSuiteVersion = it.findViewById(R.id.chuckerTransactionOverviewTlsChipherSuiteValue) requestTime = it.findViewById(R.id.chuckerTransactionOverviewRequestTime) responseTime = it.findViewById(R.id.chuckerTransactionOverviewResponseTime) duration = it.findViewById(R.id.chuckerTransactionOverviewDuration) @@ -84,6 +89,13 @@ internal class TransactionOverviewFragment : Fragment() { status.text = transaction?.status?.toString() response.text = transaction?.responseSummaryText ssl.setText(if (transaction?.isSsl == true) R.string.chucker_yes else R.string.chucker_no) + if (transaction?.isSsl == true) { + tlsVersionGroup.visibility = View.VISIBLE + tlsVersion.text = transaction.responseTlsVersion + + cipherSuiteGroup.visibility = View.VISIBLE + cipherSuiteVersion.text = transaction.responseCipherSuite + } requestTime.text = transaction?.requestDateString responseTime.text = transaction?.responseDateString duration.text = transaction?.durationString diff --git a/library/src/main/res/layout/chucker_fragment_transaction_overview.xml b/library/src/main/res/layout/chucker_fragment_transaction_overview.xml index f93cfbb6f..cae2d9542 100644 --- a/library/src/main/res/layout/chucker_fragment_transaction_overview.xml +++ b/library/src/main/res/layout/chucker_fragment_transaction_overview.xml @@ -136,6 +136,7 @@ tools:text="Yes" /> + + + app:layout_constraintTop_toBottomOf="@id/chuckerTransactionOverviewTlsVersion" + tools:visibility="visible" /> + tools:text="TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" + tools:visibility="visible" /> + + + app:layout_constraintTop_toBottomOf="@id/chuckerTransactionOverviewTlsChipherSuiteValue" /> Date: Thu, 27 Feb 2020 23:43:46 +0200 Subject: [PATCH 3/3] Address code review feedback --- .../chuckerteam/chucker/internal/data/room/ChuckerDatabase.kt | 2 +- .../internal/ui/transaction/TransactionOverviewFragment.kt | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/room/ChuckerDatabase.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/room/ChuckerDatabase.kt index 527cce661..3bf54e52d 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/room/ChuckerDatabase.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/room/ChuckerDatabase.kt @@ -7,7 +7,7 @@ import androidx.room.RoomDatabase import com.chuckerteam.chucker.internal.data.entity.HttpTransaction import com.chuckerteam.chucker.internal.data.entity.RecordedThrowable -@Database(entities = [RecordedThrowable::class, HttpTransaction::class], version = 2, exportSchema = false) +@Database(entities = [RecordedThrowable::class, HttpTransaction::class], version = 3, exportSchema = false) internal abstract class ChuckerDatabase : RoomDatabase() { abstract fun throwableDao(): RecordedThrowableDao diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt index 2eeaeae55..358140283 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionOverviewFragment.kt @@ -88,13 +88,15 @@ internal class TransactionOverviewFragment : Fragment() { protocol.text = transaction?.protocol status.text = transaction?.status?.toString() response.text = transaction?.responseSummaryText - ssl.setText(if (transaction?.isSsl == true) R.string.chucker_yes else R.string.chucker_no) if (transaction?.isSsl == true) { + ssl.setText(R.string.chucker_yes) tlsVersionGroup.visibility = View.VISIBLE tlsVersion.text = transaction.responseTlsVersion cipherSuiteGroup.visibility = View.VISIBLE cipherSuiteVersion.text = transaction.responseCipherSuite + } else { + ssl.setText(R.string.chucker_no) } requestTime.text = transaction?.requestDateString responseTime.text = transaction?.responseDateString