diff --git a/app/build.gradle b/app/build.gradle
index 65ef2c93f..91c5cf6ca 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -210,6 +210,7 @@ dependencies {
exclude group: 'org.ogce', module: 'xpp3' // Android comes with its own XmlPullParser
})
implementation 'org.conscrypt:conscrypt-android:2.5.3'
+ implementation 'com.github.blikoon:QRCodeScanner:0.1.2'
implementation "androidx.camera:camera-core:${androidxCameraVersion}"
implementation "androidx.camera:camera-camera2:${androidxCameraVersion}"
diff --git a/app/src/main/java/com/nextcloud/talk/account/BrowserLoginActivity.kt b/app/src/main/java/com/nextcloud/talk/account/BrowserLoginActivity.kt
index dd7807c8c..73c3f36bd 100644
--- a/app/src/main/java/com/nextcloud/talk/account/BrowserLoginActivity.kt
+++ b/app/src/main/java/com/nextcloud/talk/account/BrowserLoginActivity.kt
@@ -16,6 +16,7 @@ import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import androidx.activity.OnBackPressedCallback
+import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.net.toUri
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
@@ -23,6 +24,7 @@ import androidx.work.OneTimeWorkRequest
import androidx.work.WorkInfo
import androidx.work.WorkManager
import autodagger.AutoInjector
+import com.blikoon.qrcodescanner.QrCodeActivity
import com.google.android.material.snackbar.Snackbar
import com.google.gson.JsonParser
import com.nextcloud.talk.R
@@ -55,6 +57,7 @@ import okhttp3.RequestBody
import org.json.JSONException
import org.json.JSONObject
import java.io.IOException
+import java.net.URLDecoder
import java.util.concurrent.Executors
import java.util.concurrent.ScheduledExecutorService
import java.util.concurrent.TimeUnit
@@ -113,7 +116,6 @@ class BrowserLoginActivity : BaseActivity() {
initViews()
onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
handleIntent()
- anonymouslyPostLoginRequest()
lifecycle.addObserver(lifecycleEventObserver)
}
@@ -129,6 +131,13 @@ class BrowserLoginActivity : BaseActivity() {
if (extras.containsKey(BundleKeys.KEY_PASSWORD)) {
password = extras.getString(BundleKeys.KEY_PASSWORD)
}
+
+ if (extras.containsKey(BundleKeys.KEY_FROM_QR)) {
+ val intent = Intent(this, QrCodeActivity::class.java)
+ qrScanResultLauncher.launch(intent)
+ } else {
+ anonymouslyPostLoginRequest()
+ }
}
private fun initViews() {
@@ -141,6 +150,29 @@ class BrowserLoginActivity : BaseActivity() {
}
}
+ private val qrScanResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
+ if (result.resultCode == RESULT_OK) {
+ val data = result.data
+
+ if (data == null) {
+ return@registerForActivityResult
+ }
+
+ val resultData = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult")
+
+ if (resultData == null || !resultData.startsWith("nc")) {
+ Snackbar.make(binding.root, getString(R.string.qr_code_error), Snackbar.LENGTH_SHORT).show()
+ return@registerForActivityResult
+ }
+
+ try {
+ parseLoginDataUrl(resultData)
+ } catch (e: IllegalArgumentException) {
+ Log.e(TAG, "Error in scanning QR Code: $e")
+ }
+ }
+ }
+
private fun anonymouslyPostLoginRequest() {
CoroutineScope(Dispatchers.IO).launch {
val url = "$baseUrl/index.php/login/v2"
@@ -236,6 +268,44 @@ class BrowserLoginActivity : BaseActivity() {
}
}
+ /**
+ * QR returns a URI of format `nc://login/server:xxx&user:xxx&password:xxx`
+ * with the variables not always been in the provided order
+ *
+ * @throws IllegalArgumentException
+ */
+ fun parseLoginDataUrl(dataString: String) {
+ if (!dataString.startsWith(PREFIX)) {
+ throw IllegalArgumentException("Invalid login URL detected" )
+ }
+
+ val data = dataString.removePrefix(PREFIX)
+ val values = data.split('&')
+
+ if(values.size !in 1..3) {
+ throw IllegalArgumentException("Illegal number of login URL elements detected: ${values.size}")
+ }
+
+ val loginData = LoginData()
+
+ values.forEach { value ->
+ when {
+ value.startsWith(USER_KEY) -> {
+ loginData.username = URLDecoder.decode(value.removePrefix(USER_KEY), "UTF-8")
+ }
+ value.startsWith(PASS_KEY) -> {
+ loginData.token = URLDecoder.decode(value.removePrefix(PASS_KEY), "UTF-8")
+ }
+ value.startsWith(SERVER_KEY) -> {
+ loginData.serverUrl = URLDecoder.decode(value.removePrefix(SERVER_KEY), "UTF-8")
+ baseUrl = loginData.serverUrl
+ }
+ }
+ }
+
+ parseAndLogin(loginData)
+ }
+
private fun completeLoginFlow(response: String, status: Int) {
try {
val jsonObject = JSONObject(response)
@@ -357,5 +427,9 @@ class BrowserLoginActivity : BaseActivity() {
private val TAG = BrowserLoginActivity::class.java.simpleName
private const val INTERVAL = 30L
private const val HTTP_OK = 200
+ private const val USER_KEY = "user:"
+ private const val SERVER_KEY = "server:"
+ private const val PASS_KEY = "password:"
+ private const val PREFIX = "nc://login/"
}
}
diff --git a/app/src/main/java/com/nextcloud/talk/account/ServerSelectionActivity.kt b/app/src/main/java/com/nextcloud/talk/account/ServerSelectionActivity.kt
index 6bad02263..6f24ae024 100644
--- a/app/src/main/java/com/nextcloud/talk/account/ServerSelectionActivity.kt
+++ b/app/src/main/java/com/nextcloud/talk/account/ServerSelectionActivity.kt
@@ -8,6 +8,7 @@
*/
package com.nextcloud.talk.account
+import android.Manifest
import android.accounts.Account
import android.annotation.SuppressLint
import android.content.Intent
@@ -21,8 +22,11 @@ import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
+import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.net.toUri
+import androidx.core.os.bundleOf
import autodagger.AutoInjector
+import com.github.dhaval2404.imagepicker.util.PermissionUtil
import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.api.NcApi
@@ -120,6 +124,8 @@ class ServerSelectionActivity : BaseActivity() {
}
binding.certTextView.setOnClickListener { onCertClick() }
+ binding.scanQr.setOnClickListener { onScan() }
+
if (ApplicationWideMessageHolder.getInstance().messageType != null) {
if (ApplicationWideMessageHolder.getInstance().messageType
== ApplicationWideMessageHolder.MessageType.SERVER_WITHOUT_TALK
@@ -390,6 +396,30 @@ class ServerSelectionActivity : BaseActivity() {
}
}
+ private val requestCameraPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
+ if (isGranted) {
+ // Permission was granted
+ startQRScanner()
+ }
+ }
+
+ fun onScan() {
+ if (PermissionUtil.isPermissionGranted(this, Manifest.permission.CAMERA)) {
+ startQRScanner()
+ } else {
+ requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA)
+ }
+ }
+
+ private fun startQRScanner() {
+ val intent = Intent(this, BrowserLoginActivity::class.java)
+ val bundle = bundleOf().apply {
+ putBoolean(BundleKeys.KEY_FROM_QR, true)
+ }
+ intent.putExtras(bundle)
+ startActivity(intent)
+ }
+
public override fun onDestroy() {
super.onDestroy()
dispose()
diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt
index 1d4d61023..cce659c74 100644
--- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt
+++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt
@@ -82,4 +82,5 @@ object BundleKeys {
const val KEY_CHAT_URL: String = "KEY_CHAT_URL"
const val KEY_SCROLL_TO_NOTIFICATION_CATEGORY: String = "KEY_SCROLL_TO_NOTIFICATION_CATEGORY"
const val KEY_FOCUS_INPUT: String = "KEY_FOCUS_INPUT"
+ const val KEY_FROM_QR: String = "KEY_FROM_QR"
}
diff --git a/app/src/main/res/drawable/outline_qr_code_24.xml b/app/src/main/res/drawable/outline_qr_code_24.xml
new file mode 100644
index 000000000..6686eb48e
--- /dev/null
+++ b/app/src/main/res/drawable/outline_qr_code_24.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_server_selection.xml b/app/src/main/res/layout/activity_server_selection.xml
index 955ae1dbd..41d76fb2c 100644
--- a/app/src/main/res/layout/activity_server_selection.xml
+++ b/app/src/main/res/layout/activity_server_selection.xml
@@ -152,6 +152,16 @@
tools:text="@string/nc_server_unsupported" />
+
+
Open Notes
Cancel Login
Please continue the login process in the browser
+ Scan QR Code
+ QR code could not be read
diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys
index 371714bfe..93e4a93a5 100644
--- a/gradle/verification-keyring.keys
+++ b/gradle/verification-keyring.keys
@@ -307,6 +307,50 @@ CqZ5vSc=
=B+Kr
-----END PGP PUBLIC KEY BLOCK-----
+pub 893A028475557671
+uid Gradle Inc.
+
+sub 5E9AEEBA28836032
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+WzZKkqBVoahM3qqyoKOy7mfpt1hB4gEq
+=E5AV
+-----END PGP PUBLIC KEY BLOCK-----
+
pub 8CD7D660AE857DAD
uid Emarc Magtanong
@@ -377,8 +421,6 @@ HdZk2xusuOEx27cIovRPHwvLcgY+4u3j
-----END PGP PUBLIC KEY BLOCK-----
pub 928B20E9AD5298CC
-uid Jakarta Contexts and Dependency Injection
-
sub 0AA3E5C3D232E79B
-----BEGIN PGP PUBLIC KEY BLOCK-----
@@ -393,44 +435,42 @@ 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
-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
-s5E5s0wc
-=+V3C
+uQINBF04lVoBEACtqdBnYt5lBPIl4V5Gy3k/hcw9lpkmsCrUZ7CqeUHDg+6ud4PE
+NKt0dmbSzq7/a06bKbEWEOg1o2ttP19FM6b0gMh1tT6JEGVnou2uvixo4GLoqKxb
++EmAzsZ42jMKy6kpXncIxr2nAsEjCkZQrV9IDntTToYppVl4r9aiuvCsG8/8werj
+w1SiTXbkX+44jt5WjZr86aNa+RVM4+VKdOx4kvWgFBz4zZcQnAdG6oc+skhXPZRg
+0AcQA67mJfhVt4ZqzKaQ1AIxAzzcdeWh/NEFmCVXB+9mArfMBGd0/MeiFLapBZCt
+fPdIxQqEWiCtmOsRrD8lwjmjr+MN9gEAKXFhY+L6Z2wvR1GbTP9XFRFTBTHIq8aJ
+gKxL+TRO9EvUZP6wiOZ0QE699X2vp7qkZwrSdzjuxQJGkUTG6hM6UgklZX0vk0a3
+mcW7q1BGKjjQn8aoYchlWUBv0fUJsnvwM0XQ9KArcgkUVooQZOeBIZpchyddaV2e
+DgvI6Dis215/yC7UYVaDztX9Z6PDGzY333rVtj5ydg05GDsnwcSy5oykjMqwuP5f
+twXYcNztx3bDPLkgM5IVPJ0AlUJK2bOpgrGgoOWeBVd09nnDQyzcHNV85mBYCski
+z6oIpO+5PO+rEqx90Odm66pI6xac2UkHEQpZ3THsdUTEMizcNkh2TxYpNQARAQAB
+iQRyBBgBCAAmFiEEasvVBz3y2Dd1kWgEkosg6a1SmMwFAl04lVoCGwIFCQlmAYAC
+QAkQkosg6a1SmMzBdCAEGQEIAB0WIQRAIe7q/13oQE3NCicKo+XD0jLnmwUCXTiV
+WgAKCRAKo+XD0jLnm3OaD/0Spupd4HMZQk++rMze7iricF/wvDNeRFdu422UMEjL
+cxB0OuF8hG1iPjSDLyq98x1yAyzO76vztF0UiwenvNtx12Ifj9S1SDY1CB6Xo+T+
+0wohW3COl4SD/LfMPloMUrs2VOi/yGOGKuZRMx42hDlY2TbLeJG8AiKiFHJ5u9Nq
+EjXQ6/q7jowcW1S7Y/OeH70EnIst6xfFtlQCw8yd1AAUPsKNHNtw9VMu6avQzqwu
++r7Nif+nxL9qHHGDPMmkDZ+7K2g4xY8CutNNUpA8yUzBbitLR4pGWe799Ks7BAXb
+CSUfJXF1EKP6G1E4dnIB+F04y2vFhIGRfPQ3esJo6qXk/vOPgJEPz8H90ST86I94
+MRdL8hVN+OWDBX1y/86JFNxjcIkxTq8SfO8aGGplC3irpr33piO9h386Q7dz+jsw
+ofN82KgqQ56eq+Ci//o8CyQbgJCaGN4NyXI5ABdByhCBg51kjABryNXWf5OBXPiv
+4vz2aI9NSLUBw8gWtfVTAWcev7ZcF9nkSGGiWrzEUhaww4NJvHEqwBNB/BNXvYax
+BJoW9U03ijeTLHGnjFyNaHdZRGYAHZ71JJg4XUQFO0QA70Uk8KrIBn9FFaJG3yEo
+iKiUu8A6W0bYoyI0c7OZV4oOKdwzTXQXRSD0qtsZYxQgrAnk7vzpC5770xVK6MYR
+Gwx4D/wJ/Dzy1pCXbCKGdZbfXakC2PbOBTy+QdDRhAS0YAToPjaMAMMlS0xWCJ30
+lFfmqTJwVv6xlsjgzEnb3GPoZlTPgMdIE4wOg/vsg3b+p8Q9iBBviqFVHXKWAo27
+MfuOku1mxM8Wp6qFxX1RFJ1iw/ktY7QPbhgdnBglXE9uGQVnO7mgG9dOmKLsqyI2
+dARcQvhyAnKe7zmPlC0M552MjiNOS+Ky7F82PwCIuAX1zt+8m5iZnf6SwJHSGR5B
+QDkmC+db4movIUQH4LfoUxMjKRoAWBzMH2r+VAF9GH+71oSQvTLzA//06sNsOjED
+M8BnsluWGbkMXrZGKE8AJqeruKe9sfVoWKJf+PBdXcHcbaazzQgEj4BF63aXwd4k
+hw2bl+e3l1NtnjzL32tSQqJFMmiALiBMiFQzwczuUjVDSwBdaaEd+6nL2RZIjYgW
+4SCJ3zNhT2Ku0S9b2Bi0c4L2F8xDRVj54fWIjeeDWnpdpO2jdQGwy9G029UwAgKr
+1mCFhVa8TZ+kr+SRBaVdq51VWLFYLPxKcm27Sabt5EfiJbcwFizs46n2FNqa/clt
+OpzcrQwKT0OktzhoPSJ4xlCM5i5/g3uQw/cAMtbChNxSRsz40APEbrMCv7TMVTAJ
+yOYoDoAxroErhnWqc250vsYhlgtz6LPeFWKjK2GA/bORObNMHA==
+=Y1uz
-----END PGP PUBLIC KEY BLOCK-----
pub 928FBF39003C0425
@@ -1357,8 +1397,6 @@ IprKXtD8103BdNqrPJev2azwqWwxFpN83tEPbK4SwWPgk1nSELXZZ5ClcDgqatg+
-----END PGP PUBLIC KEY BLOCK-----
pub B943F5CB616566CD
-uid Marcel Schnelle
-
sub D73B23600E60600B
-----BEGIN PGP PUBLIC KEY BLOCK-----
@@ -1373,34 +1411,35 @@ DkeVPkS9/VxmwAi03Ti7B+hBQqrXyvPL/g6xSuoHYmTNhRfPFN/oD0csh+Ayxgrp
OpM1FZ0/+ahyt/jbqSPiW895vuuHaA/GQFJP1+7G74L4WsR7ZziMcRnz8pUBzQCA
5yrVcD9+abN2tIAXNftJhQeZdyIxoTe2mty8MJfSi0VKHML+bWpkYLMkCoJ8jngM
pVf3loLKHeJAh+KndiEyrCedNU/nash1Kr/EvXTrfyA/R+q6SCxt7bgIiwARAQAB
-tChNYXJjZWwgU2NobmVsbGUgPG1hcmNlbHNjaG5lbGxlQGFvbC5jb20+uQINBGAc
-6SABEAC/CnL5cqk5N9NocvTEWue7bOx4YTVnj36+QNcm3WNd9G8Ab0ku0Zr+PNrI
-7IhX3A+OAx4GaLNLehp5DncPa8CpSrCf8Lx/Dzd7SSB0gnlM3hSvCGODhkQXjIzj
-KUc1OB12GX7UvpgrQvFJckWLtiauBVHe+UBlXtgKL6cBYLnhHoqzbxjirX+Ilp3d
-4SAk/4kjuK0J98BHzYpOMtJBHDpt7u2D0CNE7+b6yaw/0aex876O3/fF0ETv2vgs
-jcSe04jKKBuFFDIh2g71GFHHo9cw0n756YT4KUvNdhWtuSjxqHWQLvNmz69xCPp6
-D/xealPWvdPShfpwTo8FGut+QtGmPmtMqCbsEM+J9S2tHusN2D4iyTZDMlnuI+1i
-GpkP9SAFpM5f2GaBMEdpOJ7qZAyG6WSsw9CDEzti8JUiTklHJeZ9gyNGIB0KetMI
-dejWPtntvFdbd+uUH6ZSkTrKb788iYkiNppUK8azP3m0lvsJJMSuUoATBu1urLkd
-UZFyJVYVSGjkRNvQk/WhB8Yt7kQtijIyrxB9xg1moY7vwtB3GEq8fY1NDgO0MLCg
-b7PnuXI5wqERj7ro+o5yc84ZhOgblujHKMHoKb7hnlbEkfYguWgj2LRshqlPKqts
-F7hu+PmsGVfMwFzDP8HUJrKnfvxmupV2sp5zzJyVteMD8JruCwARAQABiQI2BBgB
-CAAgFiEEzg4bxEOAlXnYcY9PuUP1y2FlZs0FAmAc6SACGwwACgkQuUP1y2FlZs2b
-Ww/9Fg3O7opa/uRnk5oqEA51dZhCzydxgt5zJGqxGuFBH7g09QsqCDgfb+GWT7Vu
-TXS11TYeOqN9YO/papeltPsxWuRopnI3imvakkDW3JqQqkyL4O+Q/0Hj0wmVh+Yk
-nwl9FEatdPu8q1QdNxxjyBhr0ai640aQWDLp/BWVG2J2bSIATzIK5e+WW1CFJrV4
-fjz7H+gF/HLGWYDJKsdjwgO2pNd/6GWRUkvF4OD+XKUG4MGfqLX5yZa882+Emsss
-65OTdu8qLHYNQ1Yv2oxvh4+H0CEWSDWOcv0Egw2Ku8PbmLDHWb3ddRlK7HhTxKRO
-VYim+YOvodOEiFYWqrx1jMhH1GC7XWu8LonsHQVxSG+iLL2UNoIeOcD6MeFDXYMA
-6P/ZijBkbnu7KUPaNZxOuQbFzmchrAlWaBoJcbMQtoAFZOz0qWs8cFd729RcOvT1
-wGiOaBLmR1xbXcJxhofUCwbma1ode2+ye1DXIIeE7/OVVGURYrVrVbRxrK+M/k8L
-3H0318GUweeuj0MZ+chxDFLWIE1eXPkzMF0GgGFKkIJMX2eKp1xyhxj+28qijxe7
-YFVBK8LEuyWUMU+oxIojZEr4Wa28AYvqs32UtRyjT1kbm67mav752UPGTs2AQo9R
-vCeonVI7Q1CkIHt8u7eMgzfEkaiPLZlI0l0RpfT4pnNieqg=
-=mH9D
+uQINBGAc6SABEAC/CnL5cqk5N9NocvTEWue7bOx4YTVnj36+QNcm3WNd9G8Ab0ku
+0Zr+PNrI7IhX3A+OAx4GaLNLehp5DncPa8CpSrCf8Lx/Dzd7SSB0gnlM3hSvCGOD
+hkQXjIzjKUc1OB12GX7UvpgrQvFJckWLtiauBVHe+UBlXtgKL6cBYLnhHoqzbxji
+rX+Ilp3d4SAk/4kjuK0J98BHzYpOMtJBHDpt7u2D0CNE7+b6yaw/0aex876O3/fF
+0ETv2vgsjcSe04jKKBuFFDIh2g71GFHHo9cw0n756YT4KUvNdhWtuSjxqHWQLvNm
+z69xCPp6D/xealPWvdPShfpwTo8FGut+QtGmPmtMqCbsEM+J9S2tHusN2D4iyTZD
+MlnuI+1iGpkP9SAFpM5f2GaBMEdpOJ7qZAyG6WSsw9CDEzti8JUiTklHJeZ9gyNG
+IB0KetMIdejWPtntvFdbd+uUH6ZSkTrKb788iYkiNppUK8azP3m0lvsJJMSuUoAT
+Bu1urLkdUZFyJVYVSGjkRNvQk/WhB8Yt7kQtijIyrxB9xg1moY7vwtB3GEq8fY1N
+DgO0MLCgb7PnuXI5wqERj7ro+o5yc84ZhOgblujHKMHoKb7hnlbEkfYguWgj2LRs
+hqlPKqtsF7hu+PmsGVfMwFzDP8HUJrKnfvxmupV2sp5zzJyVteMD8JruCwARAQAB
+iQI2BBgBCAAgFiEEzg4bxEOAlXnYcY9PuUP1y2FlZs0FAmAc6SACGwwACgkQuUP1
+y2FlZs2bWw/9Fg3O7opa/uRnk5oqEA51dZhCzydxgt5zJGqxGuFBH7g09QsqCDgf
+b+GWT7VuTXS11TYeOqN9YO/papeltPsxWuRopnI3imvakkDW3JqQqkyL4O+Q/0Hj
+0wmVh+Yknwl9FEatdPu8q1QdNxxjyBhr0ai640aQWDLp/BWVG2J2bSIATzIK5e+W
+W1CFJrV4fjz7H+gF/HLGWYDJKsdjwgO2pNd/6GWRUkvF4OD+XKUG4MGfqLX5yZa8
+82+Emsss65OTdu8qLHYNQ1Yv2oxvh4+H0CEWSDWOcv0Egw2Ku8PbmLDHWb3ddRlK
+7HhTxKROVYim+YOvodOEiFYWqrx1jMhH1GC7XWu8LonsHQVxSG+iLL2UNoIeOcD6
+MeFDXYMA6P/ZijBkbnu7KUPaNZxOuQbFzmchrAlWaBoJcbMQtoAFZOz0qWs8cFd7
+29RcOvT1wGiOaBLmR1xbXcJxhofUCwbma1ode2+ye1DXIIeE7/OVVGURYrVrVbRx
+rK+M/k8L3H0318GUweeuj0MZ+chxDFLWIE1eXPkzMF0GgGFKkIJMX2eKp1xyhxj+
+28qijxe7YFVBK8LEuyWUMU+oxIojZEr4Wa28AYvqs32UtRyjT1kbm67mav752UPG
+Ts2AQo9RvCeonVI7Q1CkIHt8u7eMgzfEkaiPLZlI0l0RpfT4pnNieqg=
+=bif8
-----END PGP PUBLIC KEY BLOCK-----
pub BAC30622339994C4
+uid Chris Povirk
+
sub FC9BDC25FB378008
-----BEGIN PGP PUBLIC KEY BLOCK-----
@@ -1409,20 +1448,21 @@ Gyoc9ZmChrhLoim7z4ILqmNo8eegknepQ3dGdUij4NVIhR+m+8irayTbsNHvo3UG
9y7eM5tTSjyNYkyk5fAVuT7OhzIzMA+qtc3GRVxNYRKnaHajt+pOSqr+uoDtMG3n
6eAMHCAnhgh5Nd+dCFcNT+syl3zCwolA1wrzGxxOaif+xi5wwXjmF/lAt4PDIuDT
etA2/AqPM4zAC0BtC0iqVgVypjFV3EAexm/g0LNMiG/M/krzwjPq5gf1DY/57jU0
-02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG5AQ0EWUwTFgEIANmMpV3N
-K8aLrLgQTyh5++det8C3D3T5tkEdljHOuN31/qdKNge8H6uKH8zXRZsj5pd8adpW
-kD4TzIMvzIwzizsGw34O9hf1E2XPoDqvQr39p1sovX3PeDvRJY/7JFNt9DsphVc3
-xWQfNkC7JdMPa6JRiFHd3ynfbQ+wplf4tfaDVn1JXAWp0NSGgMtXfn5i19hHQWjm
-RNAKNQLdVn8UczI8XdVM7bS4giDpQMukSyjsjgAo466iRK2+8f8BwIRe1JRvF37B
-dnbvTg/dzoi1/E4ukwVJD6YE2LlDwzdGno9KxPlRsuY3nnheVgjbrGJ2XKRJkIk8
-7cMGh41VKw6L4usAEQEAAYkBHwQYAQIACQUCWUwTFgIbDAAKCRC6wwYiM5mUxEiH
-CACQViGOHi0BoZ78ZJz6L48YNMx8fSdSv3YJ83Ih1n5DWCJgrDV5S3/edYinkoVI
-0Lusy3MdftRg6OWaYOuOTf6MYcddO/mY363jiMByf9Uh3Dqq4sKqVLRnZbAqgD1o
-dRoj2NkEQfgEH/H4JRVrxquzAKoWwJh3MhY+kajYJRJyWfc1/Bm3Bj1tcMGlGeIQ
-fgWheeMg3kxrxJ9TXPqVi6VVPaPKIU5i8l46S+Wg3uvMs8vC3XzOIvhY6cwguJv9
-UkjZwGDSI952wLqnREMy0gFZ+OAB0qJpYM3nDEekWZP38G80kojnN61tZjRThu9I
-i8/b+PwSW+nW3EpQZdLqZtOU
-=2H2i
+02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG0IUNocmlzIFBvdmlyayA8
+Y3Bvdmlya0Bnb29nbGUuY29tPrkBDQRZTBMWAQgA2YylXc0rxousuBBPKHn75163
+wLcPdPm2QR2WMc643fX+p0o2B7wfq4ofzNdFmyPml3xp2laQPhPMgy/MjDOLOwbD
+fg72F/UTZc+gOq9Cvf2nWyi9fc94O9Elj/skU230OymFVzfFZB82QLsl0w9rolGI
+Ud3fKd9tD7CmV/i19oNWfUlcBanQ1IaAy1d+fmLX2EdBaOZE0Ao1At1WfxRzMjxd
+1UzttLiCIOlAy6RLKOyOACjjrqJErb7x/wHAhF7UlG8XfsF2du9OD93OiLX8Ti6T
+BUkPpgTYuUPDN0aej0rE+VGy5jeeeF5WCNusYnZcpEmQiTztwwaHjVUrDovi6wAR
+AQABiQEfBBgBAgAJBQJZTBMWAhsMAAoJELrDBiIzmZTESIcIAJBWIY4eLQGhnvxk
+nPovjxg0zHx9J1K/dgnzciHWfkNYImCsNXlLf951iKeShUjQu6zLcx1+1GDo5Zpg
+645N/oxhx107+ZjfreOIwHJ/1SHcOqriwqpUtGdlsCqAPWh1GiPY2QRB+AQf8fgl
+FWvGq7MAqhbAmHcyFj6RqNglEnJZ9zX8GbcGPW1wwaUZ4hB+BaF54yDeTGvEn1Nc
++pWLpVU9o8ohTmLyXjpL5aDe68yzy8LdfM4i+FjpzCC4m/1SSNnAYNIj3nbAuqdE
+QzLSAVn44AHSomlgzecMR6RZk/fwbzSSiOc3rW1mNFOG70iLz9v4/BJb6dbcSlBl
+0upm05Q=
+=Gf3Y
-----END PGP PUBLIC KEY BLOCK-----
pub BCF4173966770193
@@ -1451,15 +1491,18 @@ IaddzrPZPmaZ8CtzzyB7+JdSNItBB2Sp
-----END PGP PUBLIC KEY BLOCK-----
pub BDD2A76422470515
+uid Dave Brosius
+
sub 0C77E993AC36C97C
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEaDypvxYJKwYBBAHaRw8BAQdAv3OEFRIQWBhSii0M3S9P3eGlZLalGY9smzBQ
-C0aiVXW4OARoPKm/EgorBgEEAZdVAQUBAQdA2THBTS3MqZPdTuKmc7QkAvlvwmJa
-WEQsXXqkjQdEwD4DAQgHiH4EGBYKACYWIQSu/rh4kM398rwIxKq90qdkIkcFFQUC
-aDypvwIbDAUJBaOagAAKCRC90qdkIkcFFfyUAPsGJcpKQP2/sQe+XN69rVZMFXhk
-dYg0U9EhpY/7GHDpHQD+J5Uy2s3USLxeyIylXUFWtxqOocB+vZhvH3Yhmjhwmgw=
-=zAHg
+C0aiVXW0J0RhdmUgQnJvc2l1cyA8ZGJyb3NpdXNAbWViaWdmYXRndXkuY29tPrg4
+BGg8qb8SCisGAQQBl1UBBQEBB0DZMcFNLcypk91O4qZztCQC+W/CYlpYRCxdeqSN
+B0TAPgMBCAeIfgQYFgoAJhYhBK7+uHiQzf3yvAjEqr3Sp2QiRwUVBQJoPKm/AhsM
+BQkFo5qAAAoJEL3Sp2QiRwUV/JQA+wYlykpA/b+xB75c3r2tVkwVeGR1iDRT0SGl
+j/sYcOkdAP4nlTLazdRIvF7IjKVdQVa3Go6hwH69mG8fdiGaOHCaDA==
+=wcNA
-----END PGP PUBLIC KEY BLOCK-----
pub BEDE11EAF1164480
@@ -5049,34 +5092,6 @@ vzqZL9WH1qfOB26bczhzqYBdpE3HRRqvOaFo2o7Rm9biGIJ/QqTk9C0xcI1/5BNv
=tT4f
-----END PGP PUBLIC KEY BLOCK-----
-pub 479D601F3A7B5C1A
-uid AJ Alt
-
-sub 868FF6CCEF26A83C
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-mQENBF5CDMYBCADC1/aWU6ZbGZEphRbmjUPNfqh3N5goSnDCou97mmQ9Uq8iBuKS
-UXJnGSOHudXK56f+Drx5lGZdLAzveZdqaqb1o3yLFO3PJxwj3Ulhab3O3uTG2eR0
-2Xo7GKjRW13kEfphJrfVIaQq/TiyIG8IQ1dbm9Vuzc5NLDIeC4jxYD2S3hUqCLGQ
-BiZAEH9un2cPax+hiT+9MGzdfQwdVrSQ9aEA9mtMhEGsk80XtxXJnd+hw2va6l5s
-lSErmH5nMtyKh/n9uo/ap1CfPl98n5VUI8dDtUfWVrqRrkyHgdX+MII0t0nABV5X
-rJLneg4dVy5Yw/+FVbLWB1Ta21reyytcIYQXABEBAAG0J0FKIEFsdCA8YWphbHRA
-dXNlcnMubm9yZXBseS5naXRodWIuY29tPrkBDQReQgzGAQgA1oQHEM6wP40xPfpa
-YBBRAWVoEj/CbAV6BooApSqQkV0cocM9wK905az2FmlKn4WTZyNwiA2eHjHlevsI
-jKuHJWhSDVhulcKDi0cD6wTcjctcDWm7M3tvaICbieZQXPH7lju5Ct80kBo5ojdJ
-oXGD72kVhSuiF8vOrAOiLOXP8+bpCpY4+LZ4qt3XjSnrkZq+h/vcy9crwuzuFlSL
-wMRltOvfirrK/CSQZZtqG2PbT30CWFQ61DLo4DkXeNG1fKpnOaDAMaCedt+pNCAQ
-1Vdzy1vT9b85LtOH/CmhumjM3S6x/VWwWZVBXi2xVLFCkm3LlWioSvVs6Na0Vvaq
-0WDsbwARAQABiQE2BBgBCAAgFiEEA8EjA4wgqunihshXR51gHzp7XBoFAl5CDMYC
-GwwACgkQR51gHzp7XBpoYQgAjnYuxyXaFSbCc2EFWDrBA8+OnlbSgJ3etaIOoLQH
-+Czv6+wLYc9snZDBm+IvbzEi3tXfi1TKcRI5ii9wDkti0KcVFrR2tpuXDLWYIF92
-cSC7VyBiyT/aZpm0zX8qP8tjRZvy7mewbnoit1R6ea5UifSLvO0bHqNoswfgv90s
-rnuUYMY8tv1sSo4j0f0zre/k4QT8sCTeMDsLsviMIvy1Wls1IPRo1SW1euGGGvCo
-bxgke8Dw5QgumudwPqehOZVOkIbuddgcur55ZFFeitMOqdRoXkrGod9v6hYY1Jz8
-W/Y2tzZmWsedFIc4ahuAeZG6cH6Ac8prHrQEz6lSbZ0flg==
-=td3S
------END PGP PUBLIC KEY BLOCK-----
-
pub 4B1E11D5A4B91E89
uid Adam Cozzette
@@ -6270,8 +6285,6 @@ c8LNGrDaCFdXnOdlNV/zT9VvBk/RkV+Tl/Lk4g==
-----END PGP PUBLIC KEY BLOCK-----
pub 7905DE25C78AD456
-uid Protobuf Release
-
sub DBC5123E2E98FEFE
-----BEGIN PGP PUBLIC KEY BLOCK-----
@@ -6283,26 +6296,25 @@ Uul7vR3iNRXtbnS31qIgCYWAoX6w0xHf6KUeIPWV21ZIUu5cg6kQr/sPt/OQuGS2
nKk+InYtopDi6d7AUh8WI2TP7qAMIoRkhAeDEQ99DiopwFNPA/7M4g99AQfFSmp3
acPCdeXXAZeDAqoFGFKTlqzg3FLWpGkubI/iXyHkpQfOXv4MtYuPGVNheBXGcWbf
XPjbkFYjkGIN2Wx4i7yf43hMCk6ArhswfgCcgoORI+DCVdm7ORID1PjIU2Z71EA2
-qDdFwdoOdEV42YUAEQEAAbQsUHJvdG9idWYgUmVsZWFzZSA8cHJvdG9idWZAZ29v
-Z2xlZ3JvdXBzLmNvbT65AY0EZKxkKwEMAK4LeTj1dr8F9E98Up6y4AKHY0Zbeb5v
-c/TzsJX6UCudzygYTbQnEcrPIcJ5TJV5leniAlxnqUz/qJxmpBtGCNH63c9+iJNh
-VqJEZh9dbupqQn+mqtBvsPABbHU+C46TLebmOK4R99zgtxVlSYabJubuG2Mqnq96
-mutBUWKI3iY5j0JAMLY1DJesAGwAWP8gvUZHhd4LJN3iikNSTWyUE0Hnwm2VKFq4
-cxI/6qaCpztfuSD1y0JplSfmKRd+ecLSqhDvlMZkwigUpjCvF7iSaPvpxWdkFabS
-frMeIjwbGU/fLV8ilwtPPb57X6Nrk9NIUdVa6ZbxiuIErIcp3JfgfUfy7wxcI/Uj
-Mq1I50NOwizLVprZbmKv1P88bACmdon612pnDhhs84phJmA7fzQ/jAqF1JQ4Crdz
-L+6g56Kkx1VlN3dSmPjuycjTzykuNwZ/Fi0Lj9Czg4LVp6peSsPWS+lp9h9tOSzt
-lQev+GXiQKZTYt8JxvBPOkm0hd5M30BDbwARAQABiQG8BBgBCgAmFiEEGlXwka0o
-wH+DH6RNeQXeJceK1FYFAmSsZCsCGwwFCQPCZwAACgkQeQXeJceK1FbX9wwAmLBK
-Q8JljEwk0KqYxawrusWXwaH+1I83urf/WsOJYEkKoiQObsFGTuaolyln6ZHyF+gt
-uKeWtlbvG6aXqv9XXcsVQG7NMGdEAy6DTNj77uBAXMWTxVpD09iVeepvWSiz7r7M
-gzJfluNgGDOGKpkxxIjS8NnOAsK9uquyvBQa97I+YniarTkpnVWpgSR/7V3HHf6Q
-2aCKL3ihdK2uIS4dIrFi+mVCt2zDad8U8N7S2Gv2VO/vBF+hIFCV788hLH9HeX3f
-70E99X57hrVCh0MeColOIV1zwK8GLeV7bpr6x11x5cjiv27xky95WteyH5w9w/Xq
-Tu0NQ5YyKX/0PUYVX3mLs59H7Wys6ANygWJs59JT4KSwb3pIEV7gWSwp3mWkstlF
-m4Tq/d+gVF64ItrHylZg0WpHPv1s+dH6/tWcsBnkgR/OS33PkijQgvMW4imQNRxg
-ymOZIduHXX1X+KzlRZTXvv4tSFnIQ0mWY1ySiOJQJS2WABVwFpFc8rECm6eN
-=z4dc
+qDdFwdoOdEV42YUAEQEAAbkBjQRkrGQrAQwArgt5OPV2vwX0T3xSnrLgAodjRlt5
+vm9z9POwlfpQK53PKBhNtCcRys8hwnlMlXmV6eICXGepTP+onGakG0YI0frdz36I
+k2FWokRmH11u6mpCf6aq0G+w8AFsdT4LjpMt5uY4rhH33OC3FWVJhpsm5u4bYyqe
+r3qa60FRYojeJjmPQkAwtjUMl6wAbABY/yC9RkeF3gsk3eKKQ1JNbJQTQefCbZUo
+WrhzEj/qpoKnO1+5IPXLQmmVJ+YpF355wtKqEO+UxmTCKBSmMK8XuJJo++nFZ2QV
+ptJ+sx4iPBsZT98tXyKXC089vntfo2uT00hR1VrplvGK4gSshyncl+B9R/LvDFwj
+9SMyrUjnQ07CLMtWmtluYq/U/zxsAKZ2ifrXamcOGGzzimEmYDt/ND+MCoXUlDgK
+t3Mv7qDnoqTHVWU3d1KY+O7JyNPPKS43Bn8WLQuP0LODgtWnql5Kw9ZL6Wn2H205
+LO2VB6/4ZeJAplNi3wnG8E86SbSF3kzfQENvABEBAAGJAbwEGAEKACYWIQQaVfCR
+rSjAf4MfpE15Bd4lx4rUVgUCZKxkKwIbDAUJA8JnAAAKCRB5Bd4lx4rUVtf3DACY
+sEpDwmWMTCTQqpjFrCu6xZfBof7Ujze6t/9aw4lgSQqiJA5uwUZO5qiXKWfpkfIX
+6C24p5a2Vu8bppeq/1ddyxVAbs0wZ0QDLoNM2Pvu4EBcxZPFWkPT2JV56m9ZKLPu
+vsyDMl+W42AYM4YqmTHEiNLw2c4Cwr26q7K8FBr3sj5ieJqtOSmdVamBJH/tXccd
+/pDZoIoveKF0ra4hLh0isWL6ZUK3bMNp3xTw3tLYa/ZU7+8EX6EgUJXvzyEsf0d5
+fd/vQT31fnuGtUKHQx4KiU4hXXPArwYt5XtumvrHXXHlyOK/bvGTL3la17IfnD3D
+9epO7Q1DljIpf/Q9RhVfeYuzn0ftbKzoA3KBYmzn0lPgpLBvekgRXuBZLCneZaSy
+2UWbhOr936BUXrgi2sfKVmDRakc+/Wz50fr+1ZywGeSBH85Lfc+SKNCC8xbiKZA1
+HGDKY5kh24ddfVf4rOVFlNe+/i1IWchDSZZjXJKI4lAlLZYAFXAWkVzysQKbp40=
+=UiVm
-----END PGP PUBLIC KEY BLOCK-----
pub 793FD5751A0F0780
@@ -6361,6 +6373,50 @@ cJR4YXWx
=IK4j
-----END PGP PUBLIC KEY BLOCK-----
+pub 79B3F4FD617DDBAD
+uid Suresh Marru (IU Email)
+
+sub 30B0DD8C5845C0DF
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+bj0frksnOTPQBk4=
+=9sMZ
+-----END PGP PUBLIC KEY BLOCK-----
+
pub 79E193516BE7998F
sub 9F7335D63326E7F9
-----BEGIN PGP PUBLIC KEY BLOCK-----
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 9ac623538..fbe238c2e 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -14,9 +14,12 @@
+
+
+
@@ -11803,6 +11806,14 @@
+
+
+
+
+
+
+
+
@@ -14222,6 +14233,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+