From 6d0bff144c35c9f2c73f34065e972b3f48a34241 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sat, 23 Jul 2022 03:15:29 +0530 Subject: Begin cleaning up Detekt warnings (#2027) --- detekt-baselines/app.xml | 35 ----------------------------------- detekt-baselines/autofill-parser.xml | 21 --------------------- detekt-baselines/coroutine-utils.xml | 5 +++-- 3 files changed, 3 insertions(+), 58 deletions(-) (limited to 'detekt-baselines') diff --git a/detekt-baselines/app.xml b/detekt-baselines/app.xml index be37b720..a82c325e 100644 --- a/detekt-baselines/app.xml +++ b/detekt-baselines/app.xml @@ -35,59 +35,28 @@ LongMethod:RepositorySettings.kt$RepositorySettings$override fun provideSettings(builder: PreferenceScreen.Builder) LoopWithTooManyJumpStatements:AutofillMatcher.kt$AutofillMatcher.Companion$for ((key, value) in prefs.all) { if (!key.startsWith(PREFERENCE_PREFIX_MATCHES)) continue // We know that preferences starting with `PREFERENCE_PREFIX_MATCHES` were // created with `putStringSet`. @Suppress("UNCHECKED_CAST") val oldMatches = value as? Set<String> if (oldMatches == null) { logcat(WARN) { "Failed to read matches for $key" } continue } // Delete all matches for file locations that are going to be overwritten, then // transfer matches over to the files at their new locations. val newMatches = oldMatches .asSequence() .minus(deletePathList) .minus(oldNewPathMap.values) .map { match -> val newPath = oldNewPathMap[match] ?: return@map match logcat { "Updating match for $key: $match --> $newPath" } newPath } .toSet() if (newMatches != oldMatches) prefs.edit { putStringSet(key, newMatches) } } LoopWithTooManyJumpStatements:ErrorMessages.kt$ErrorMessages$while (cause.cause != null) { if (cause is GitException) break val nextCause = cause.cause!! if (nextCause is RemoteException) break cause = nextCause } - MagicNumber:Api30AutofillResponseBuilder.kt$Api30AutofillResponseBuilder$30 - MagicNumber:AutofillDecryptActivity.kt$AutofillDecryptActivity$26 - MagicNumber:AutofillDecryptActivity.kt$AutofillDecryptActivity.Companion$31 - MagicNumber:AutofillFilterView.kt$AutofillFilterView$26 - MagicNumber:AutofillFilterView.kt$AutofillFilterView.Companion$31 - MagicNumber:AutofillPreferences.kt$DirectoryStructure$26 - MagicNumber:AutofillPublisherChangedActivity.kt$AutofillPublisherChangedActivity$26 - MagicNumber:AutofillPublisherChangedActivity.kt$AutofillPublisherChangedActivity.Companion$31 - MagicNumber:AutofillResponseBuilder.kt$AutofillResponseBuilder$26 - MagicNumber:AutofillResponseBuilder.kt$AutofillResponseBuilder$28 - MagicNumber:AutofillResponseBuilder.kt$AutofillResponseBuilder.Companion$28 - MagicNumber:AutofillSaveActivity.kt$AutofillSaveActivity$26 - MagicNumber:AutofillSettings.kt$AutofillSettings$26 - MagicNumber:AutofillViewUtils.kt$30 - MagicNumber:AutofillViewUtils.kt$31 - MagicNumber:BasePgpActivity.kt$BasePgpActivity$26 MagicNumber:BasePgpActivity.kt$BasePgpActivity$45 MagicNumber:ClipboardService.kt$ClipboardService$1000 MagicNumber:ClipboardService.kt$ClipboardService$1000L - MagicNumber:ClipboardService.kt$ClipboardService$23 - MagicNumber:ClipboardService.kt$ClipboardService$24 - MagicNumber:ClipboardService.kt$ClipboardService$26 - MagicNumber:ClipboardService.kt$ClipboardService$31 MagicNumber:ClipboardService.kt$ClipboardService$45 MagicNumber:ClipboardService.kt$ClipboardService$500 MagicNumber:DicewareModule.kt$DicewareModule$6 MagicNumber:DicewarePasswordGeneratorDialogFragment.kt$DicewarePasswordGeneratorDialogFragment$5 MagicNumber:Extensions.kt$1000 - MagicNumber:GeneralSettings.kt$GeneralSettings$25 MagicNumber:GitConfigActivity.kt$GitConfigActivity$0.5f MagicNumber:GitConfigActivity.kt$GitConfigActivity$500 MagicNumber:GitConfigActivity.kt$GitConfigActivity$8 MagicNumber:GitLogAdapter.kt$8 MagicNumber:GitServerConfigActivity.kt$GitServerConfigActivity$500 MagicNumber:LaunchActivity.kt$LaunchActivity$500L - MagicNumber:OreoAutofillService.kt$OreoAutofillService$26 - MagicNumber:OreoAutofillService.kt$OreoAutofillService$28 - MagicNumber:OreoAutofillService.kt$OreoAutofillService$30 - MagicNumber:PasswordCreationActivity.kt$PasswordCreationActivity$28 MagicNumber:PasswordExportService.kt$PasswordExportService$1024 - MagicNumber:PasswordExportService.kt$PasswordExportService$26 MagicNumber:PasswordGeneratorDialogFragment.kt$PasswordGeneratorDialogFragment$20 MagicNumber:PasswordItemRecyclerAdapter.kt$PasswordItemRecyclerAdapter.PasswordItemViewHolder$0.7f - MagicNumber:ProxySelectorActivity.kt$ProxySelectorActivity$29 MagicNumber:ProxySelectorActivity.kt$ProxySelectorActivity$500 - MagicNumber:RepositorySettings.kt$RepositorySettings$25 - MagicNumber:ShortcutHandler.kt$ShortcutHandler$25 - MagicNumber:ShortcutHandler.kt$ShortcutHandler$26 MagicNumber:SshKey.kt$SshKey$100_000 MagicNumber:SshKey.kt$SshKey$15 MagicNumber:SshKey.kt$SshKey$30 MagicNumber:SshKey.kt$SshKey.Algorithm.Ecdsa$256 - MagicNumber:SshKey.kt$SshKey.Algorithm.Ecdsa$28 MagicNumber:SshKey.kt$SshKey.Algorithm.Rsa$3072 MagicNumber:SshjSessionFactory.kt$SshjSession$22 MagicNumber:UriTotpFinder.kt$UriTotpFinder$30 @@ -124,9 +93,7 @@ ThrowsCount:GitCommandExecutor.kt$GitCommandExecutor$suspend fun execute(): Result<Unit, Throwable> ThrowsCount:SshKey.kt$SshKey$fun import(uri: Uri) TooManyFunctions:PasswordStore.kt$PasswordStore : BaseGitActivity - TooManyFunctions:SearchableRepositoryViewModel.kt$SearchableRepositoryViewModel : AndroidViewModel TooManyFunctions:SshjConfig.kt$AbstractLogger : Logger - TooManyFunctions:SshjConfig.kt$LogcatLoggerFactory$LogcatLogger : AbstractLogger TopLevelPropertyNaming:AutofillMatcher.kt$private const val PREFERENCES_AUTOFILL_APP_MATCHES = "oreo_autofill_app_matches" TopLevelPropertyNaming:AutofillMatcher.kt$private const val PREFERENCES_AUTOFILL_WEB_MATCHES = "oreo_autofill_web_matches" TopLevelPropertyNaming:Extensions.kt$/** The default OpenPGP provider for the app */ const val OPENPGP_PROVIDER = "org.sufficientlysecure.keychain" @@ -134,8 +101,6 @@ TopLevelPropertyNaming:SshKey.kt$private const val ANDROIDX_SECURITY_KEYSET_PREF_NAME = "androidx_sshkey_keyset_prefs" TopLevelPropertyNaming:SshKey.kt$private const val KEYSTORE_ALIAS = "sshkey" TopLevelPropertyNaming:SshKey.kt$private const val PROVIDER_ANDROID_KEY_STORE = "AndroidKeyStore" - UnusedPrivateMember:PasswordStore.kt$PasswordStore$private val directorySelectAction = registerForActivityResult(StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { checkLocalRepository() } } - UnusedPrivateMember:PasswordStore.kt$PasswordStore$private val storagePermissionRequest = registerForActivityResult(RequestPermission()) { granted -> if (granted) checkLocalRepository() } UseCheckOrError:CredentialFinder.kt$CredentialFinder$throw IllegalStateException("Only SshKey and Password connection mode ask for passwords") UseCheckOrError:FragmentViewBindingDelegate.kt$FragmentViewBindingDelegate$throw IllegalStateException( "Should not attempt to get bindings when Fragment views are destroyed." ) UseCheckOrError:GitOperation.kt$GitOperation$throw IllegalStateException("Biometric authentication failures should be ignored") diff --git a/detekt-baselines/autofill-parser.xml b/detekt-baselines/autofill-parser.xml index a7726c93..83f3316f 100644 --- a/detekt-baselines/autofill-parser.xml +++ b/detekt-baselines/autofill-parser.xml @@ -11,30 +11,9 @@ LoopWithTooManyJumpStatements:AutofillStrategyDsl.kt$PairOfFieldsMatcher$for ((i, tieBreaker) in tieBreakers.withIndex()) { val new = current.filter { tieBreaker(it, alreadyMatched) } if (new.isEmpty()) { logcat { "Tie breaker #${i + 1}: Didn't match any pair of fields; skipping" } continue } // and return if the available options have been narrowed to a single field. if (new.size == 1) { logcat { "Tie breaker #${i + 1}: Success" } current = new break } logcat { "Tie breaker #${i + 1}: Matched ${new.size} pairs of fields; continuing" } current = new } LoopWithTooManyJumpStatements:AutofillStrategyDsl.kt$SingleFieldMatcher$for ((i, tieBreaker) in tieBreakers.withIndex()) { // Successively filter matched fields via tie breakers... val new = current.filter { tieBreaker(it, alreadyMatched) } // skipping those tie breakers that are not satisfied for any remaining field... if (new.isEmpty()) { logcat { "Tie breaker #${i + 1}: Didn't match any field; skipping" } continue } // and return if the available options have been narrowed to a single field. if (new.size == 1) { logcat { "Tie breaker #${i + 1}: Success" } current = new break } logcat { "Tie breaker #${i + 1}: Matched ${new.size} fields; continuing" } current = new } LoopWithTooManyJumpStatements:ByteArray.kt$while (true) { val byte0 = if (expectDot) { expectDot = false '.'.code.toByte() } else { labels[currentLabelIndex][currentLabelByteIndex] and BITMASK } val byte1 = this[start + publicSuffixByteIndex] and BITMASK // Compare the bytes. Note that the file stores UTF-8 encoded bytes, so we must compare // the // unsigned bytes. compareResult = (byte0.toUByte() - byte1.toUByte()).toInt() if (compareResult != 0) { break } publicSuffixByteIndex++ currentLabelByteIndex++ if (publicSuffixByteIndex == publicSuffixLength) { break } if (labels[currentLabelIndex].size == currentLabelByteIndex) { // We've exhausted our current label. Either there are more labels to compare, in // which // case we expect a dot as the next character. Otherwise, we've checked all our // labels. if (currentLabelIndex == labels.size - 1) { break } else { currentLabelIndex++ currentLabelByteIndex = -1 expectDot = true } } } - MagicNumber:AutofillFormParser.kt$AutofillFormParser$26 - MagicNumber:AutofillFormParser.kt$FillableForm$26 - MagicNumber:AutofillHelper.kt$26 - MagicNumber:AutofillHelper.kt$28 - MagicNumber:AutofillHelper.kt$FixedSaveCallback$26 - MagicNumber:AutofillHelper.kt$FixedSaveCallback$28 MagicNumber:AutofillHelper.kt$FixedSaveCallback$29 - MagicNumber:AutofillScenario.kt$26 MagicNumber:AutofillScenario.kt$4 MagicNumber:AutofillScenario.kt$5 - MagicNumber:AutofillScenario.kt$AutofillScenario$26 - MagicNumber:AutofillScenario.kt$ClassifiedAutofillScenario$26 - MagicNumber:AutofillScenario.kt$GenericAutofillScenario$26 - MagicNumber:AutofillStrategyDsl.kt$26 - MagicNumber:AutofillStrategyDsl.kt$AutofillRule$26 - MagicNumber:AutofillStrategyDsl.kt$AutofillStrategy$26 - MagicNumber:AutofillStrategyDsl.kt$FieldMatcher$26 - MagicNumber:AutofillStrategyDsl.kt$PairOfFieldsMatcher$26 - MagicNumber:AutofillStrategyDsl.kt$SingleFieldMatcher$26 - MagicNumber:FeatureAndTrustDetection.kt$26 - MagicNumber:FeatureAndTrustDetection.kt$28 - MagicNumber:FormField.kt$FormField$26 - MagicNumber:FormField.kt$FormField.Companion$26 - MagicNumber:PublicSuffixListCache.kt$29 MaxLineLength:FeatureAndTrustDetection.kt$/* In order to add a new browser, do the following: 1. Obtain the .apk from a trusted source. For example, download it from the Play Store on your phone and use adb pull to get it onto your computer. We will assume that it is called browser.apk. 2. Run aapt dump badging browser.apk | grep package: | grep -Eo " name='[a-zA-Z0-9_\.]*" | cut -c8- to obtain the package name (actually, the application ID) of the app in the .apk. 3. Run apksigner verify --print-certs browser.apk | grep "#1 certificate SHA-256" | grep -Eo "[a-f0-9]{64}" | tr -d '\n' | xxd -r -p | base64 to calculate the hash of browser.apk's first signing certificate. Note: This will only work if the apk has a single signing certificate. Apps with multiple signers are very rare, so there is probably no need to add them. Refer to computeCertificatesHash to learn how the hash would be computed in this case. 4. Verify the package name and the hash, for example by asking other people to repeat the steps above. 5. Add an entry with the browser apps's package name and the hash to TRUSTED_BROWSER_CERTIFICATE_HASH. 6. Optionally, try adding the browser's package name to BROWSERS_WITH_SAVE_SUPPORT and check whether a save request to Password Store is triggered when you submit a registration form. 7. Optionally, try adding the browser's package name to BROWSERS_WITH_MULTI_ORIGIN_SUPPORT and check whether it correctly distinguishes web origins even if iframes are present on the page. You can use https://fabianhenneke.github.io/Android-Password-Store/ as a test form. */ MaxLineLength:FormField.kt$FormField$"\"$hint\", \"$fieldId\"${if (isFocused) ", focused" else ""}${if (isVisible) ", visible" else ""}, $webOrigin, $htmlAttributesDebug, $autofillHints" ReturnCount:AutofillFormParser.kt$AutofillFormParser$private fun determineFormOrigin(context: Context): FormOrigin? diff --git a/detekt-baselines/coroutine-utils.xml b/detekt-baselines/coroutine-utils.xml index 1d920d34..6d7bc820 100644 --- a/detekt-baselines/coroutine-utils.xml +++ b/detekt-baselines/coroutine-utils.xml @@ -1,8 +1,9 @@ - + + TooGenericExceptionCaught:RunSuspendCatching.kt$e: Throwable + - InstanceOfCheckForException:RunSuspendCatching.kt$e is CancellationException TooGenericExceptionCaught:RunSuspendCatching.kt$e: Throwable -- cgit v1.2.3