@dailephd/my-dev-kit-lab 0.3.4 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -287
- package/dist/scripts/security/validate.js +210 -70
- package/dist/src/audits/codeRot/detectors/architectureDriftDetector.js +5 -2
- package/dist/src/audits/codeRot/detectors/securityValidationAssumptionRotDetector.js +5 -2
- package/dist/src/mobile/android/advancedSecurity/backupConfiguration/analyzeBackupConfiguration.js +300 -0
- package/dist/src/mobile/android/advancedSecurity/backupConfiguration/checkResult.js +41 -0
- package/dist/src/mobile/android/advancedSecurity/backupConfiguration/index.js +8 -0
- package/dist/src/mobile/android/advancedSecurity/backupConfiguration/manifestEvidence.js +102 -0
- package/dist/src/mobile/android/advancedSecurity/backupConfiguration/parseBackupRules.js +110 -0
- package/dist/src/mobile/android/advancedSecurity/backupConfiguration/types.js +27 -0
- package/dist/src/mobile/android/advancedSecurity/candidateEvidence.js +50 -0
- package/dist/src/mobile/android/advancedSecurity/clipboard/analyzeClipboardSecurity.js +166 -0
- package/dist/src/mobile/android/advancedSecurity/clipboard/checkResult.js +74 -0
- package/dist/src/mobile/android/advancedSecurity/clipboard/collectClipboardEvidence.js +82 -0
- package/dist/src/mobile/android/advancedSecurity/clipboard/index.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/clipboard/types.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/androidLint/checkResult.js +255 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/androidLint/index.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/androidLint/parseLintSarif.js +37 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/androidLint/parseLintXml.js +36 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/artifacts.js +95 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/boundedOutput.js +33 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/dependencyCheck/checkResult.js +173 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/dependencyCheck/command.js +33 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/dependencyCheck/index.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/dependencyCheck/parseDependencyCheckJson.js +133 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/discoverExecutable.js +13 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/index.js +8 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/minimalEnvironment.js +26 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/mutation.js +77 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/osv/checkResult.js +161 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/osv/command.js +25 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/osv/index.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/osv/parseOsvJson.js +136 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/runBoundedExternalTool.js +51 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/runRequestedAndroidExternalTools.js +54 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/checkResult.js +170 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/command.js +28 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/index.js +2 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/parseSemgrepJson.js +141 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/rules.js +105 -0
- package/dist/src/mobile/android/advancedSecurity/externalTools/types.js +107 -0
- package/dist/src/mobile/android/advancedSecurity/fileProvider/checkResult.js +188 -0
- package/dist/src/mobile/android/advancedSecurity/fileProvider/index.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/analyzeFirebaseGoogleServices.js +197 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/checkResult.js +77 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/collectFirebaseServiceEvidence.js +193 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/discoverFirebaseArtifacts.js +128 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/index.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/parseDatabaseRules.js +55 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/parseFirebaseConfig.js +75 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/parseFirestoreStorageRules.js +88 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/parseGoogleServicesConfig.js +55 -0
- package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/types.js +6 -0
- package/dist/src/mobile/android/advancedSecurity/networkSecurity/analyzeNetworkSecurity.js +394 -0
- package/dist/src/mobile/android/advancedSecurity/networkSecurity/checkResult.js +47 -0
- package/dist/src/mobile/android/advancedSecurity/networkSecurity/deriveEffectiveNetworkPolicy.js +52 -0
- package/dist/src/mobile/android/advancedSecurity/networkSecurity/index.js +14 -0
- package/dist/src/mobile/android/advancedSecurity/networkSecurity/manifestEvidence.js +109 -0
- package/dist/src/mobile/android/advancedSecurity/networkSecurity/parseNetworkSecurityConfig.js +186 -0
- package/dist/src/mobile/android/advancedSecurity/networkSecurity/types.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/ordering.js +44 -0
- package/dist/src/mobile/android/advancedSecurity/redaction.js +54 -0
- package/dist/src/mobile/android/advancedSecurity/releaseConfiguration/analyzeReleaseConfiguration.js +221 -0
- package/dist/src/mobile/android/advancedSecurity/releaseConfiguration/checkResult.js +39 -0
- package/dist/src/mobile/android/advancedSecurity/releaseConfiguration/index.js +7 -0
- package/dist/src/mobile/android/advancedSecurity/releaseConfiguration/manifestEvidence.js +19 -0
- package/dist/src/mobile/android/advancedSecurity/resourceReference.js +69 -0
- package/dist/src/mobile/android/advancedSecurity/resourceResolution.js +118 -0
- package/dist/src/mobile/android/advancedSecurity/ruleIds.js +141 -0
- package/dist/src/mobile/android/advancedSecurity/secretCandidates/analyzeSecretCandidates.js +116 -0
- package/dist/src/mobile/android/advancedSecurity/secretCandidates/checkResult.js +80 -0
- package/dist/src/mobile/android/advancedSecurity/secretCandidates/discoverSecretSourceFiles.js +152 -0
- package/dist/src/mobile/android/advancedSecurity/secretCandidates/index.js +9 -0
- package/dist/src/mobile/android/advancedSecurity/secretCandidates/matchSecretCandidates.js +136 -0
- package/dist/src/mobile/android/advancedSecurity/secretCandidates/suppressValue.js +61 -0
- package/dist/src/mobile/android/advancedSecurity/secretCandidates/types.js +11 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveCategories.js +34 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveData/classifyDirectExpression.js +99 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveData/classifySensitiveIdentifier.js +111 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveData/index.js +3 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveData/localSourceContext.js +90 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveData/splitArguments.js +59 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/analyzeSensitiveLogging.js +117 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/checkResult.js +74 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/collectLoggingEvidence.js +87 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/index.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/types.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/analyzeSensitiveStorage.js +182 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/checkResult.js +74 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/collectStorageEvidence.js +109 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/index.js +1 -0
- package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/types.js +4 -0
- package/dist/src/mobile/android/advancedSecurity/signingConfiguration/analyzeSigningConfiguration.js +270 -0
- package/dist/src/mobile/android/advancedSecurity/signingConfiguration/checkResult.js +119 -0
- package/dist/src/mobile/android/advancedSecurity/signingConfiguration/discoverKeystoreCandidates.js +55 -0
- package/dist/src/mobile/android/advancedSecurity/signingConfiguration/extractSigningConfigurations.js +81 -0
- package/dist/src/mobile/android/advancedSecurity/signingConfiguration/index.js +8 -0
- package/dist/src/mobile/android/advancedSecurity/signingConfiguration/types.js +20 -0
- package/dist/src/mobile/android/advancedSecurity/sourceLocation.js +15 -0
- package/dist/src/mobile/android/advancedSecurity/webview/checkResult.js +210 -0
- package/dist/src/mobile/android/advancedSecurity/webview/index.js +1 -0
- package/dist/src/mobile/android/audit/androidFinding.js +68 -0
- package/dist/src/mobile/android/audit/checkResultBuilder.js +97 -0
- package/dist/src/mobile/android/audit/deepLinkAudit.js +183 -0
- package/dist/src/mobile/android/audit/exportedComponentAudit.js +183 -0
- package/dist/src/mobile/android/audit/intentFilterAudit.js +128 -0
- package/dist/src/mobile/android/audit/permissionAudit.js +142 -0
- package/dist/src/mobile/android/detect/androidTargetDetection.js +18 -0
- package/dist/src/mobile/android/detect/buildFileEvidence.js +36 -0
- package/dist/src/mobile/android/detect/classify.js +150 -0
- package/dist/src/mobile/android/detect/detectAndroidProject.js +252 -0
- package/dist/src/mobile/android/detect/settingsModules.js +60 -0
- package/dist/src/mobile/android/detect/sourceEvidence.js +92 -0
- package/dist/src/mobile/android/detect/traversal.js +79 -0
- package/dist/src/mobile/android/detect/versionCatalogEvidence.js +37 -0
- package/dist/src/mobile/android/detection.js +28 -0
- package/dist/src/mobile/android/gradle/gradleMetadataCheckResult.js +120 -0
- package/dist/src/mobile/android/gradle/moduleMetadataExtractor.js +243 -0
- package/dist/src/mobile/android/gradle/pluginVersionExtractor.js +40 -0
- package/dist/src/mobile/android/gradle/readAndroidGradleMetadata.js +210 -0
- package/dist/src/mobile/android/gradle/releaseMetadataSummary.js +64 -0
- package/dist/src/mobile/android/gradle/settingsMetadata.js +20 -0
- package/dist/src/mobile/android/gradle/types.js +1 -0
- package/dist/src/mobile/android/gradle/validate/executor.js +9 -0
- package/dist/src/mobile/android/gradle/validate/operationCheckResult.js +99 -0
- package/dist/src/mobile/android/gradle/validate/operations.js +68 -0
- package/dist/src/mobile/android/gradle/validate/planner.js +49 -0
- package/dist/src/mobile/android/gradle/validate/runOptionalGradleValidation.js +113 -0
- package/dist/src/mobile/android/gradle/validate/targetMutation.js +45 -0
- package/dist/src/mobile/android/gradle/validate/taskListParser.js +24 -0
- package/dist/src/mobile/android/gradle/versionCatalogMetadata.js +94 -0
- package/dist/src/mobile/android/gradle/wrapperMetadata.js +32 -0
- package/dist/src/mobile/android/manifest/parseAndroidManifest.js +364 -0
- package/dist/src/mobile/android/manifest/types.js +29 -0
- package/dist/src/mobile/android/manifest/xml/parseXml.js +329 -0
- package/dist/src/mobile/android/profile.js +29 -0
- package/dist/src/mobile/android/report/model.js +135 -0
- package/dist/src/mobile/android/report/renderAndroidReport.js +286 -0
- package/dist/src/mobile/android/report/writeAndroidReportFiles.js +23 -0
- package/dist/src/mobile/android/targetMetadata.js +27 -0
- package/dist/src/mobile/android/validate/androidVerdict.js +248 -0
- package/dist/src/mobile/android/validate/detectionAndImmutabilityCheckResults.js +177 -0
- package/dist/src/mobile/android/validate/playReadinessChecklist.js +145 -0
- package/dist/src/mobile/android/validate/validateAndroidTarget.js +315 -0
- package/dist/src/mobile/android/validation/checkResult.js +58 -0
- package/dist/src/mobile/android/validation/result.js +25 -0
- package/dist/src/mobile/index.js +42 -0
- package/dist/src/mobile/types.js +27 -0
- package/dist/src/securityValidation/attackScenarios/attackProfile.js +2 -0
- package/dist/src/securityValidation/attackScenarios/profiles/androidProfile.js +20 -0
- package/dist/src/securityValidation/commandRunner.js +10 -1
- package/dist/src/securityValidation/validate/cliOptions.js +92 -2
- package/package.json +2 -1
- package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/debug/res/xml/ambiguous_backup_rules.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/ambiguous_backup_rules.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/backup_rules.xml +5 -0
- package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/broad_backup_rules.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/data_extraction_rules.xml +10 -0
- package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/unsupported_domain_rules.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-b/src/main/res/xml/malformed_backup_rules.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-b/src/main/res/xml/unsupported_root.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/debug/res/xml/ambiguous_config.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/ambiguous_config.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/base_cleartext_false.xml +8 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/broad_and_duplicate_domains.xml +8 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/empty_domain.xml +6 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/malformed_pin.xml +11 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/network_security_config.xml +26 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-b/src/main/res/xml/malformed_network_security_config.xml +6 -0
- package/tests/fixtures/android/advanced-security-fixtures/network-security/module-b/src/main/res/xml/unsupported_root.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/release-configuration/groovy-release-debuggable-dynamic.gradle +7 -0
- package/tests/fixtures/android/advanced-security-fixtures/release-configuration/groovy-release-debuggable-false.gradle +9 -0
- package/tests/fixtures/android/advanced-security-fixtures/release-configuration/groovy-release-debuggable-true.gradle +13 -0
- package/tests/fixtures/android/advanced-security-fixtures/release-configuration/kotlin-release-debuggable-false.gradle.kts +7 -0
- package/tests/fixtures/android/advanced-security-fixtures/release-configuration/kotlin-release-debuggable-true.gradle.kts +10 -0
- package/tests/fixtures/android/advanced-security-fixtures/release-configuration/missing-release-build-type.gradle.kts +7 -0
- package/tests/fixtures/android/advanced-security-fixtures/resource-resolution/module-a/src/debug/res/xml/network_security_config.xml +8 -0
- package/tests/fixtures/android/advanced-security-fixtures/resource-resolution/module-a/src/main/res/xml/backup_rules.xml +4 -0
- package/tests/fixtures/android/advanced-security-fixtures/resource-resolution/module-a/src/main/res/xml/network_security_config.xml +8 -0
- package/tests/fixtures/android/advanced-security-fixtures/resource-resolution/module-b/src/main/res/xml/malformed_network_security_config.xml +7 -0
- package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/SampleActivity.java +8 -0
- package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/SampleActivity.kt +9 -0
- package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/build.gradle +11 -0
- package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/build.gradle.kts +11 -0
- package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/google-services.json +16 -0
- package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/local.properties +3 -0
- package/tests/fixtures/android/advanced-security-fixtures/secret-candidates-bounds/module/binary.properties +0 -0
- package/tests/fixtures/android/advanced-security-fixtures/secret-candidates-bounds/module/oversized.json +1 -0
- package/tests/fixtures/android/advanced-security-fixtures/signing-configuration/app/fake-release-keystore.jks +1 -0
- package/tests/fixtures/android/advanced-security-fixtures/signing-configuration/build/generated-fake.keystore +1 -0
- package/tests/fixtures/android/compose-app/app/build.gradle.kts +21 -0
- package/tests/fixtures/android/compose-app/app/src/main/AndroidManifest.xml +22 -0
- package/tests/fixtures/android/compose-app/app/src/main/java/com/example/composeapp/MainActivity.kt +11 -0
- package/tests/fixtures/android/compose-app/build.gradle.kts +4 -0
- package/tests/fixtures/android/compose-app/gradle/wrapper/gradle-wrapper.properties +4 -0
- package/tests/fixtures/android/compose-app/settings.gradle.kts +2 -0
- package/tests/fixtures/android/gradle-metadata-fixtures/catalog-only-plugin/build.gradle.kts +3 -0
- package/tests/fixtures/android/gradle-metadata-fixtures/catalog-only-plugin/gradle/libs.versions.toml +5 -0
- package/tests/fixtures/android/gradle-metadata-fixtures/comment-safety.gradle.kts +21 -0
- package/tests/fixtures/android/gradle-metadata-fixtures/dynamic-values.gradle.kts +17 -0
- package/tests/fixtures/android/gradle-metadata-fixtures/groovy-literal.gradle +23 -0
- package/tests/fixtures/android/gradle-metadata-fixtures/wrapper-malformed.properties +4 -0
- package/tests/fixtures/android/gradle-metadata-fixtures/wrapper-missing-url.properties +3 -0
- package/tests/fixtures/android/gradle-metadata-fixtures/wrapper-with-checksum.properties +5 -0
- package/tests/fixtures/android/java-app/app/build.gradle +16 -0
- package/tests/fixtures/android/java-app/app/src/main/AndroidManifest.xml +19 -0
- package/tests/fixtures/android/java-app/app/src/main/java/com/example/javaapp/MainActivity.java +4 -0
- package/tests/fixtures/android/java-app/build.gradle +3 -0
- package/tests/fixtures/android/java-app/gradle/wrapper/gradle-wrapper.properties +4 -0
- package/tests/fixtures/android/java-app/settings.gradle +2 -0
- package/tests/fixtures/android/library/build.gradle.kts +3 -0
- package/tests/fixtures/android/library/gradle/wrapper/gradle-wrapper.properties +4 -0
- package/tests/fixtures/android/library/mylibrary/build.gradle.kts +13 -0
- package/tests/fixtures/android/library/mylibrary/src/main/AndroidManifest.xml +2 -0
- package/tests/fixtures/android/library/settings.gradle.kts +2 -0
- package/tests/fixtures/android/manifest-audit-fixtures/incomplete-intent-filter.xml +14 -0
- package/tests/fixtures/android/manifest-audit-fixtures/malformed-exported.xml +10 -0
- package/tests/fixtures/android/manifest-audit-fixtures/malformed.xml +5 -0
- package/tests/fixtures/android/manifest-audit-fixtures/missing-application.xml +7 -0
- package/tests/fixtures/android/manifest-audit-fixtures/missing-component-name.xml +11 -0
- package/tests/fixtures/android/manifest-audit-fixtures/permission-coverage.xml +29 -0
- package/tests/fixtures/android/manifest-audit-fixtures/risky-components.xml +62 -0
- package/tests/fixtures/android/manifest-audit-fixtures/risky-deep-links.xml +45 -0
- package/tests/fixtures/android/manifest-audit-fixtures/unresolved-placeholder.xml +14 -0
- package/tests/fixtures/android/manifest-audit-fixtures/unusual-namespace-prefix.xml +11 -0
- package/tests/fixtures/android/multi-module/app/build.gradle.kts +22 -0
- package/tests/fixtures/android/multi-module/app/src/androidTest/java/com/example/multimodule/app/ExampleInstrumentedTest.kt +3 -0
- package/tests/fixtures/android/multi-module/app/src/main/AndroidManifest.xml +11 -0
- package/tests/fixtures/android/multi-module/app/src/test/java/com/example/multimodule/app/ExampleUnitTest.kt +3 -0
- package/tests/fixtures/android/multi-module/build.gradle.kts +5 -0
- package/tests/fixtures/android/multi-module/core/build.gradle.kts +14 -0
- package/tests/fixtures/android/multi-module/core/src/main/AndroidManifest.xml +2 -0
- package/tests/fixtures/android/multi-module/feature-login/build.gradle.kts +18 -0
- package/tests/fixtures/android/multi-module/feature-login/src/main/AndroidManifest.xml +2 -0
- package/tests/fixtures/android/multi-module/gradle/libs.versions.toml +8 -0
- package/tests/fixtures/android/multi-module/gradle/wrapper/gradle-wrapper.properties +4 -0
- package/tests/fixtures/android/multi-module/settings.gradle.kts +4 -0
- package/tests/fixtures/android/non-android-gradle/build.gradle.kts +3 -0
- package/tests/fixtures/android/non-android-gradle/core/build.gradle.kts +3 -0
- package/tests/fixtures/android/non-android-gradle/core/src/main/java/com/example/core/Core.java +4 -0
- package/tests/fixtures/android/non-android-gradle/gradle/wrapper/gradle-wrapper.properties +4 -0
- package/tests/fixtures/android/non-android-gradle/settings.gradle.kts +2 -0
- package/tests/fixtures/android/partial/app/build.gradle.kts +7 -0
- package/tests/fixtures/android/partial/settings.gradle.kts +2 -0
- package/tests/fixtures/android/xml-view-app/app/build.gradle.kts +17 -0
- package/tests/fixtures/android/xml-view-app/app/src/main/AndroidManifest.xml +31 -0
- package/tests/fixtures/android/xml-view-app/app/src/main/kotlin/com/example/xmlviewapp/MainActivity.kt +7 -0
- package/tests/fixtures/android/xml-view-app/app/src/main/res/layout/activity_main.xml +4 -0
- package/tests/fixtures/android/xml-view-app/build.gradle.kts +4 -0
- package/tests/fixtures/android/xml-view-app/gradle/wrapper/gradle-wrapper.properties +4 -0
- package/tests/fixtures/android/xml-view-app/settings.gradle.kts +2 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ANDROID_ADVANCED_CHECK_CATEGORIES } from "../advancedSecurity/ruleIds.js";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// v0.4.0 Batch 1 — Android check-result and skip-representation contracts.
|
|
4
|
+
//
|
|
5
|
+
// Reuses SecurityFinding and CommandExecutionResult from the existing
|
|
6
|
+
// security-validation types rather than duplicating a finding/command-result
|
|
7
|
+
// schema. Android needs a wider status vocabulary than SecurityCheckStatus
|
|
8
|
+
// ("passed"/"failed"/"skipped"/"warning") because static Android checks can
|
|
9
|
+
// be genuinely inconclusive or unsupported on a given project, and
|
|
10
|
+
// command-backed checks can error out before producing a verdict-relevant
|
|
11
|
+
// result — none of those outcomes may ever be normalized as "passed".
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export const ANDROID_CHECK_STATUSES = [
|
|
14
|
+
"passed",
|
|
15
|
+
"failed",
|
|
16
|
+
"skipped",
|
|
17
|
+
"inconclusive",
|
|
18
|
+
"unsupported",
|
|
19
|
+
"not-run",
|
|
20
|
+
"error",
|
|
21
|
+
];
|
|
22
|
+
// Statuses that must never be treated as a passing result by a verdict
|
|
23
|
+
// calculator. Defined once here so later batches share one source of truth.
|
|
24
|
+
export const ANDROID_NON_PASSING_STATUSES = [
|
|
25
|
+
"failed",
|
|
26
|
+
"skipped",
|
|
27
|
+
"inconclusive",
|
|
28
|
+
"unsupported",
|
|
29
|
+
"not-run",
|
|
30
|
+
"error",
|
|
31
|
+
];
|
|
32
|
+
// v0.4.0 Batch 3 — added "android-intent-filters" (additive) so the intent-
|
|
33
|
+
// filter audit has its own category distinct from "android-components",
|
|
34
|
+
// which covers exported-component evidence generally.
|
|
35
|
+
// v0.4.0 Batch 5 — added "android-target-immutability" (additive) for the
|
|
36
|
+
// required target mutation/immutability check (agents.txt Batch 5 section
|
|
37
|
+
// 10.1).
|
|
38
|
+
// v0.4.1 Batch 1 — added the advanced-security check-category families
|
|
39
|
+
// (network/backup/release/secrets/signing/webview/file-provider/sensitive-
|
|
40
|
+
// storage/sensitive-logging/clipboard/firebase/optional-tool) required by
|
|
41
|
+
// later v0.4.1 batches. These categories are additive only: no check in this
|
|
42
|
+
// batch is registered against them yet (see advancedSecurity/ruleIds.ts).
|
|
43
|
+
export const ANDROID_CHECK_CATEGORIES = [
|
|
44
|
+
"android-detection",
|
|
45
|
+
"android-manifest",
|
|
46
|
+
"android-gradle",
|
|
47
|
+
"android-permissions",
|
|
48
|
+
"android-components",
|
|
49
|
+
"android-intent-filters",
|
|
50
|
+
"android-deep-links",
|
|
51
|
+
"android-release-metadata",
|
|
52
|
+
"android-play-readiness",
|
|
53
|
+
"android-target-immutability",
|
|
54
|
+
...ANDROID_ADVANCED_CHECK_CATEGORIES,
|
|
55
|
+
];
|
|
56
|
+
export function isPassingAndroidStatus(status) {
|
|
57
|
+
return status === "passed";
|
|
58
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// v0.4.0 Batch 1 — Android validation result contract.
|
|
3
|
+
// v0.4.0 Batch 5 — narrow additive inherited-contract corrections needed to
|
|
4
|
+
// carry a real verdict and rich release/Play-readiness data (see agents.txt
|
|
5
|
+
// Batch 5 section 6.6):
|
|
6
|
+
// - `verdict` widened from the single placeholder literal to
|
|
7
|
+
// `AndroidVerdictValue` (ReleaseVerdict | "not-calculated"), reusing the
|
|
8
|
+
// existing security-validation ReleaseVerdict vocabulary instead of
|
|
9
|
+
// inventing a second one (Batch 1's own comment anticipated this: "this
|
|
10
|
+
// type grows without being a breaking change — the placeholder value
|
|
11
|
+
// remains valid"). Every existing "not-calculated" literal stays valid.
|
|
12
|
+
// - `releaseMetadataSummary`/`playReadinessSummary` (the Batch 1 {available,
|
|
13
|
+
// note} placeholders) are UNCHANGED in shape — existing object literals
|
|
14
|
+
// using them remain valid — with new sibling fields `releaseMetadata`/
|
|
15
|
+
// `playReadiness` added for the actual structured data, avoiding a
|
|
16
|
+
// breaking retype of the original fields.
|
|
17
|
+
// - `verdictReasons` and `targetMutationEvidence` are new optional fields.
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
export const ANDROID_VALIDATION_SCHEMA_VERSION = "android-validation-v1";
|
|
20
|
+
export const ANDROID_VALIDATION_ARTIFACT_TYPE = "android-validation-result";
|
|
21
|
+
// A single placeholder value: this batch and detection/manifest/gradle
|
|
22
|
+
// batches must never assert release readiness. A concrete verdict policy is
|
|
23
|
+
// introduced by a later batch, at which point this type grows without being
|
|
24
|
+
// a breaking change (the placeholder value remains valid).
|
|
25
|
+
export const ANDROID_VERDICT_NOT_CALCULATED = "not-calculated";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export { MOBILE_PLATFORMS, MOBILE_CONFIDENCE_LEVELS, MOBILE_VALIDATION_CAPABILITIES } from "./types.js";
|
|
2
|
+
export { ANDROID_PLATFORM, ANDROID_PROFILE_ID, createAndroidProfile, isAndroidProfile } from "./android/profile.js";
|
|
3
|
+
export { ANDROID_PROJECT_KINDS, ANDROID_UI_TOOLKITS } from "./android/detection.js";
|
|
4
|
+
export { detectAndroidProject } from "./android/detect/detectAndroidProject.js";
|
|
5
|
+
export { detectAndroidTarget } from "./android/detect/androidTargetDetection.js";
|
|
6
|
+
export { parseDeclaredModules } from "./android/detect/settingsModules.js";
|
|
7
|
+
export { extractBuildFileEvidence } from "./android/detect/buildFileEvidence.js";
|
|
8
|
+
export { extractVersionCatalogEvidence } from "./android/detect/versionCatalogEvidence.js";
|
|
9
|
+
export { classifyModule, classifyModuleUiToolkit, combineProjectKind, combineProjectUiToolkit, combineProjectConfidence, } from "./android/detect/classify.js";
|
|
10
|
+
export { createAndroidTargetMetadata } from "./android/targetMetadata.js";
|
|
11
|
+
export { parseAndroidManifestSource, parseAndroidManifestFile, parseAllAndroidManifests, } from "./android/manifest/parseAndroidManifest.js";
|
|
12
|
+
export { parseXmlDocument, findChildren, getAttribute, ANDROID_NAMESPACE_URI } from "./android/manifest/xml/parseXml.js";
|
|
13
|
+
export { parseWrapperProperties } from "./android/gradle/wrapperMetadata.js";
|
|
14
|
+
export { parseVersionCatalog, resolveCatalogVersion, accessorSuffixToCatalogAlias } from "./android/gradle/versionCatalogMetadata.js";
|
|
15
|
+
export { extractModuleGradleMetadata } from "./android/gradle/moduleMetadataExtractor.js";
|
|
16
|
+
export { resolvePluginVersion } from "./android/gradle/pluginVersionExtractor.js";
|
|
17
|
+
export { parseSettingsMetadata } from "./android/gradle/settingsMetadata.js";
|
|
18
|
+
export { readAndroidGradleMetadata } from "./android/gradle/readAndroidGradleMetadata.js";
|
|
19
|
+
export { buildAndroidGradleMetadataCheckResult } from "./android/gradle/gradleMetadataCheckResult.js";
|
|
20
|
+
export { buildAndroidReleaseMetadataSummary } from "./android/gradle/releaseMetadataSummary.js";
|
|
21
|
+
export { ALLOWLISTED_OPERATION_IDS, isAllowlistedOperationId, GRADLE_OPERATIONS } from "./android/gradle/validate/operations.js";
|
|
22
|
+
export { buildGradleCommandPlan } from "./android/gradle/validate/planner.js";
|
|
23
|
+
export { createRealGradleCommandExecutor } from "./android/gradle/validate/executor.js";
|
|
24
|
+
export { parseGradleTaskNames, isGradleTaskAvailable } from "./android/gradle/validate/taskListParser.js";
|
|
25
|
+
export { buildTargetMutationReport, isExpectedAndroidGeneratedPath, captureTargetSnapshot } from "./android/gradle/validate/targetMutation.js";
|
|
26
|
+
export { buildGradleOperationCheckResult } from "./android/gradle/validate/operationCheckResult.js";
|
|
27
|
+
export { runOptionalGradleValidation } from "./android/gradle/validate/runOptionalGradleValidation.js";
|
|
28
|
+
export { ANDROID_CHECK_STATUSES, ANDROID_NON_PASSING_STATUSES, ANDROID_CHECK_CATEGORIES, isPassingAndroidStatus, } from "./android/validation/checkResult.js";
|
|
29
|
+
export { ANDROID_VALIDATION_SCHEMA_VERSION, ANDROID_VALIDATION_ARTIFACT_TYPE, ANDROID_VERDICT_NOT_CALCULATED, } from "./android/validation/result.js";
|
|
30
|
+
export { toAndroidReportModel, serializeAndroidReportModel } from "./android/report/model.js";
|
|
31
|
+
export { renderAndroidTextReport } from "./android/report/renderAndroidReport.js";
|
|
32
|
+
export { writeAndroidReportFiles } from "./android/report/writeAndroidReportFiles.js";
|
|
33
|
+
export { makeAndroidFinding } from "./android/audit/androidFinding.js";
|
|
34
|
+
export { buildAndroidManifestCheckResult } from "./android/audit/checkResultBuilder.js";
|
|
35
|
+
export { auditAndroidPermissions } from "./android/audit/permissionAudit.js";
|
|
36
|
+
export { auditAndroidExportedComponents } from "./android/audit/exportedComponentAudit.js";
|
|
37
|
+
export { auditAndroidIntentFilters } from "./android/audit/intentFilterAudit.js";
|
|
38
|
+
export { auditAndroidDeepLinks } from "./android/audit/deepLinkAudit.js";
|
|
39
|
+
export { ANDROID_PLAY_READINESS_ITEM_STATUSES, buildAndroidPlayReadinessChecklist } from "./android/validate/playReadinessChecklist.js";
|
|
40
|
+
export { calculateAndroidVerdict, androidVerdictToHumanLabel } from "./android/validate/androidVerdict.js";
|
|
41
|
+
export { buildAndroidDetectionCheckResult, buildAndroidManifestParsingCheckResult, buildAndroidTargetImmutabilityCheckResult, } from "./android/validate/detectionAndImmutabilityCheckResults.js";
|
|
42
|
+
export { validateAndroidTarget } from "./android/validate/validateAndroidTarget.js";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Shared mobile-platform contracts for my-dev-kit-lab's mobile/Android
|
|
2
|
+
// validation substrate (v0.4.0 Batch 1).
|
|
3
|
+
//
|
|
4
|
+
// Android is the only implemented platform. Additional platform ids may be
|
|
5
|
+
// added to MOBILE_PLATFORMS in a future version once real detection and
|
|
6
|
+
// validation exist for them — this file must never claim support for a
|
|
7
|
+
// platform that has no implementation behind it.
|
|
8
|
+
export const MOBILE_PLATFORMS = ["android"];
|
|
9
|
+
// Confidence in a detection/classification/evidence claim. "unknown" is used
|
|
10
|
+
// when confidence itself could not be determined (distinct from "low", which
|
|
11
|
+
// asserts a deliberately weak but present signal).
|
|
12
|
+
export const MOBILE_CONFIDENCE_LEVELS = ["unknown", "low", "medium", "high"];
|
|
13
|
+
// Validation capabilities a profile can declare support for. This batch only
|
|
14
|
+
// defines the vocabulary; no capability is exercised until its owning batch
|
|
15
|
+
// implements it. Capabilities are declarative metadata, not proof of
|
|
16
|
+
// execution — a profile listing a capability does not mean a check ran.
|
|
17
|
+
export const MOBILE_VALIDATION_CAPABILITIES = [
|
|
18
|
+
"static-detection",
|
|
19
|
+
"manifest-analysis",
|
|
20
|
+
"gradle-metadata",
|
|
21
|
+
"gradle-task-execution",
|
|
22
|
+
"permission-audit",
|
|
23
|
+
"component-audit",
|
|
24
|
+
"deep-link-audit",
|
|
25
|
+
"release-metadata-summary",
|
|
26
|
+
"play-readiness-checklist",
|
|
27
|
+
];
|
|
@@ -2,10 +2,12 @@ import { SECURITY_PROFILE_IDS } from "../validate/cliOptions.js";
|
|
|
2
2
|
import { NODE_CLI_PACKAGE_PROFILE } from "./profiles/nodeCliPackageProfile.js";
|
|
3
3
|
import { LOCAL_TOOL_PROFILE } from "./profiles/localToolProfile.js";
|
|
4
4
|
import { NPM_PACKAGE_PROFILE } from "./profiles/npmPackageProfile.js";
|
|
5
|
+
import { ANDROID_PROFILE } from "./profiles/androidProfile.js";
|
|
5
6
|
const PROFILE_REGISTRY = {
|
|
6
7
|
"node-cli-package": NODE_CLI_PACKAGE_PROFILE,
|
|
7
8
|
"local-tool": LOCAL_TOOL_PROFILE,
|
|
8
9
|
"npm-package": NPM_PACKAGE_PROFILE,
|
|
10
|
+
android: ANDROID_PROFILE,
|
|
9
11
|
};
|
|
10
12
|
// Resolves a profile id to its definition. Throws a clean, descriptive Error
|
|
11
13
|
// for unknown ids (mirrors Batch 1's --profile validation error style).
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// v0.4.0 Batch 5 — registry placeholder for the "android" profile.
|
|
3
|
+
//
|
|
4
|
+
// Unlike the other three profiles, "android" does NOT route through the
|
|
5
|
+
// classic check-group/attack-scenario pipeline that this definition
|
|
6
|
+
// describes (src/mobile/android/validate/validateAndroidTarget.ts is an
|
|
7
|
+
// entirely separate orchestrator — see agents.txt Batch 5 section 6.1). This
|
|
8
|
+
// entry exists only so SECURITY_PROFILE_IDS including "android" satisfies
|
|
9
|
+
// PROFILE_REGISTRY's Record<SecurityProfileId, AttackProfileDefinition> type;
|
|
10
|
+
// its check-id lists are deliberately empty so nothing here ever appears to
|
|
11
|
+
// select or gate a classic check group for the Android path.
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export const ANDROID_PROFILE = {
|
|
14
|
+
id: "android",
|
|
15
|
+
label: "Android",
|
|
16
|
+
description: "Profile for an Android Gradle project, validated through a dedicated Android orchestrator (detection, manifest audits, Gradle metadata, optional Gradle operations) rather than the classic check-group/attack-scenario pipeline this definition otherwise describes.",
|
|
17
|
+
defaultCheckIds: [],
|
|
18
|
+
applicableCheckIds: [],
|
|
19
|
+
scenarioGroups: [],
|
|
20
|
+
};
|
|
@@ -8,11 +8,19 @@ export function resolveNpmCommand() {
|
|
|
8
8
|
// Runs a security check command with an argument array (no shell interpolation).
|
|
9
9
|
// npm audit returns exit code 1 on vulnerabilities; that is not treated as a
|
|
10
10
|
// spawn failure here — the caller inspects the output and exit code separately.
|
|
11
|
+
//
|
|
12
|
+
// `env` is optional and additive (v0.4.1 Batch 7): omitted, it defaults to
|
|
13
|
+
// `process.env` exactly as before this option existed, so every pre-existing
|
|
14
|
+
// caller is unaffected. A caller that supplies a minimized environment (e.g.
|
|
15
|
+
// the Batch 7 external-tool adapters, which must not propagate arbitrary
|
|
16
|
+
// caller credentials to a spawned child process) gets that environment used
|
|
17
|
+
// for both PATH resolution and the actual spawn.
|
|
11
18
|
export async function runSecurityCommand(options) {
|
|
12
19
|
const started = Date.now();
|
|
20
|
+
const env = options.env ?? process.env;
|
|
13
21
|
const resolved = resolveCommand(options.command, {
|
|
14
22
|
cwd: options.cwd,
|
|
15
|
-
env
|
|
23
|
+
env,
|
|
16
24
|
allowPowerShellShim: false,
|
|
17
25
|
});
|
|
18
26
|
const command = resolved.command;
|
|
@@ -48,6 +56,7 @@ export async function runSecurityCommand(options) {
|
|
|
48
56
|
cwd: options.cwd,
|
|
49
57
|
shell: false,
|
|
50
58
|
stdio: ["ignore", "pipe", "pipe"],
|
|
59
|
+
env,
|
|
51
60
|
});
|
|
52
61
|
}
|
|
53
62
|
catch (spawnErr) {
|
|
@@ -35,7 +35,15 @@ export const PLANNED_SECURITY_CHECK_IDS = [
|
|
|
35
35
|
"network",
|
|
36
36
|
];
|
|
37
37
|
export const DEFAULT_SECURITY_CHECKS = IMPLEMENTED_SECURITY_CHECK_IDS;
|
|
38
|
-
|
|
38
|
+
// v0.4.0 Batch 5 — "android" added additively. Unlike the other three
|
|
39
|
+
// profiles (which select --checks defaults for the classic
|
|
40
|
+
// check-group/attack-scenario pipeline), "android" routes to an entirely
|
|
41
|
+
// separate orchestrator (src/mobile/android/validate/validateAndroidTarget.ts)
|
|
42
|
+
// because the Android check/finding/status vocabulary established in
|
|
43
|
+
// Batches 1-4 does not fit SecurityCheckId/SecurityCheckResult — seeagents.txt
|
|
44
|
+
// Batch 5 section 6.1-6.2. The CLI still exposes it through the same
|
|
45
|
+
// --profile flag on the same security:validate command (no second CLI).
|
|
46
|
+
export const SECURITY_PROFILE_IDS = ["node-cli-package", "local-tool", "npm-package", "android"];
|
|
39
47
|
export const DEFAULT_SECURITY_PROFILE = "node-cli-package";
|
|
40
48
|
export const SECURITY_OUTPUT_FORMATS = ["text", "json"];
|
|
41
49
|
export const DEFAULT_SECURITY_OUTPUT_FORMATS = ["text", "json"];
|
|
@@ -52,14 +60,41 @@ const FLAGS_WITH_VALUE = {
|
|
|
52
60
|
"--profile": "profile",
|
|
53
61
|
"--format": "format",
|
|
54
62
|
"--fail-on": "failOn",
|
|
63
|
+
"--android-gradle-operations": "androidGradleOperations",
|
|
64
|
+
"--android-external-tools": "androidExternalTools",
|
|
65
|
+
"--android-external-network": "androidExternalNetwork",
|
|
55
66
|
};
|
|
67
|
+
// v0.4.0 Batch 5 — the exact allowlisted optional Gradle operation ids
|
|
68
|
+
// (agents.txt Batch 5 section 7.3). Deliberately re-declared here rather than
|
|
69
|
+
// imported from src/mobile/android/gradle/validate/operations.ts: this keeps
|
|
70
|
+
// the foundational CLI-parsing module free of a new securityValidation ->
|
|
71
|
+
// mobile dependency direction for five short string literals. Both lists
|
|
72
|
+
// must stay in sync; a regression test in tests/security/ asserts they do.
|
|
73
|
+
export const ANDROID_GRADLE_OPERATION_IDS = ["wrapper-version", "tasks", "assemble-debug", "unit-test-debug", "lint-debug"];
|
|
74
|
+
// v0.4.1 Batch 8 — the exact allowlisted external-tool ids (agents.txt Batch
|
|
75
|
+
// 8 section 10.1). Deliberately re-declared here for the same reason
|
|
76
|
+
// ANDROID_GRADLE_OPERATION_IDS is re-declared above: this module stays free
|
|
77
|
+
// of a securityValidation -> mobile import for four short string literals.
|
|
78
|
+
// Both lists must stay in sync; a regression test asserts they do.
|
|
79
|
+
export const ANDROID_EXTERNAL_TOOL_CLI_IDS = ["semgrep", "osv", "android-lint", "dependency-check"];
|
|
80
|
+
export const ANDROID_EXTERNAL_NETWORK_POLICIES = ["deny", "allow-requested"];
|
|
81
|
+
export const DEFAULT_ANDROID_EXTERNAL_NETWORK_POLICY = "deny";
|
|
56
82
|
export function parseSecurityValidateArgs(argv) {
|
|
57
83
|
const result = {};
|
|
58
84
|
for (let i = 0; i < argv.length; i++) {
|
|
59
85
|
const arg = argv[i];
|
|
60
86
|
const key = FLAGS_WITH_VALUE[arg];
|
|
61
|
-
if (!key)
|
|
87
|
+
if (!key) {
|
|
88
|
+
// Keep the conventional argument separator harmless while rejecting
|
|
89
|
+
// misspelled or unsupported top-level options before any validation
|
|
90
|
+
// configuration, target resolution, or report work begins.
|
|
91
|
+
if (arg === "--")
|
|
92
|
+
continue;
|
|
93
|
+
if (arg.startsWith("-")) {
|
|
94
|
+
throw new Error(`Unknown option: ${arg}.`);
|
|
95
|
+
}
|
|
62
96
|
continue;
|
|
97
|
+
}
|
|
63
98
|
if (i + 1 >= argv.length) {
|
|
64
99
|
throw new Error(`Missing value for ${arg}. Expected a value after ${arg}.`);
|
|
65
100
|
}
|
|
@@ -73,6 +108,9 @@ export function normalizeSecurityValidateConfig(raw, toolRoot) {
|
|
|
73
108
|
const formats = parseFormatOption(raw.format);
|
|
74
109
|
const failOn = parseFailOnOption(raw.failOn);
|
|
75
110
|
const out = raw.out !== undefined ? resolveOutDir(raw.out) : path.join(toolRoot, "reports", "security");
|
|
111
|
+
const androidGradleOperationIds = parseAndroidGradleOperationsOption(raw.androidGradleOperations, profile.value);
|
|
112
|
+
const androidExternalToolIds = parseAndroidExternalToolsOption(raw.androidExternalTools, profile.value);
|
|
113
|
+
const androidExternalNetworkPolicy = parseAndroidExternalNetworkOption(raw.androidExternalNetwork, profile.value);
|
|
76
114
|
return {
|
|
77
115
|
target: raw.target,
|
|
78
116
|
out,
|
|
@@ -88,8 +126,60 @@ export function normalizeSecurityValidateConfig(raw, toolRoot) {
|
|
|
88
126
|
formatsWereDefault: formats.wasDefault,
|
|
89
127
|
failOnThreshold: failOn.value,
|
|
90
128
|
failOnWasDefault: failOn.wasDefault,
|
|
129
|
+
androidGradleOperationIds,
|
|
130
|
+
androidExternalToolIds,
|
|
131
|
+
androidExternalNetworkPolicy,
|
|
91
132
|
};
|
|
92
133
|
}
|
|
134
|
+
// Parses --android-gradle-operations. Absent by default (empty array — zero
|
|
135
|
+
// Gradle execution). Rejects unknown operation ids and non-"android"-profile
|
|
136
|
+
// usage before any validation work begins (agents.txt Batch 5 section 7.3).
|
|
137
|
+
function parseAndroidGradleOperationsOption(raw, profile) {
|
|
138
|
+
if (raw === undefined)
|
|
139
|
+
return [];
|
|
140
|
+
if (profile !== "android") {
|
|
141
|
+
throw new Error(`--android-gradle-operations requires --profile android (got --profile ${profile}).`);
|
|
142
|
+
}
|
|
143
|
+
const parts = splitAndNormalizeList(raw, "--android-gradle-operations");
|
|
144
|
+
const invalid = parts.filter((p) => !ANDROID_GRADLE_OPERATION_IDS.includes(p));
|
|
145
|
+
if (invalid.length > 0) {
|
|
146
|
+
throw new Error(`Invalid --android-gradle-operations value(s): ${invalid.join(", ")}. Valid values are: ${ANDROID_GRADLE_OPERATION_IDS.join(", ")}.`);
|
|
147
|
+
}
|
|
148
|
+
const unique = new Set(parts);
|
|
149
|
+
return ANDROID_GRADLE_OPERATION_IDS.filter((id) => unique.has(id));
|
|
150
|
+
}
|
|
151
|
+
// Parses --android-external-tools. Absent by default (empty array — zero
|
|
152
|
+
// external-tool execution). Rejects unknown tool ids and non-"android"-
|
|
153
|
+
// profile usage before any validation work begins (agents.txt Batch 8
|
|
154
|
+
// section 10.1) — same shape as parseAndroidGradleOperationsOption.
|
|
155
|
+
function parseAndroidExternalToolsOption(raw, profile) {
|
|
156
|
+
if (raw === undefined)
|
|
157
|
+
return [];
|
|
158
|
+
if (profile !== "android") {
|
|
159
|
+
throw new Error(`--android-external-tools requires --profile android (got --profile ${profile}).`);
|
|
160
|
+
}
|
|
161
|
+
const parts = splitAndNormalizeList(raw, "--android-external-tools");
|
|
162
|
+
const invalid = parts.filter((p) => !ANDROID_EXTERNAL_TOOL_CLI_IDS.includes(p));
|
|
163
|
+
if (invalid.length > 0) {
|
|
164
|
+
throw new Error(`Invalid --android-external-tools value(s): ${invalid.join(", ")}. Valid values are: ${ANDROID_EXTERNAL_TOOL_CLI_IDS.join(", ")}.`);
|
|
165
|
+
}
|
|
166
|
+
const unique = new Set(parts);
|
|
167
|
+
return ANDROID_EXTERNAL_TOOL_CLI_IDS.filter((id) => unique.has(id));
|
|
168
|
+
}
|
|
169
|
+
// Parses --android-external-network. Defaults to "deny" (agents.txt Batch 8
|
|
170
|
+
// section 10.2) — network is never authorized unless explicitly requested.
|
|
171
|
+
function parseAndroidExternalNetworkOption(raw, profile) {
|
|
172
|
+
if (raw === undefined)
|
|
173
|
+
return DEFAULT_ANDROID_EXTERNAL_NETWORK_POLICY;
|
|
174
|
+
if (profile !== "android") {
|
|
175
|
+
throw new Error(`--android-external-network requires --profile android (got --profile ${profile}).`);
|
|
176
|
+
}
|
|
177
|
+
const value = raw.trim();
|
|
178
|
+
if (!ANDROID_EXTERNAL_NETWORK_POLICIES.includes(value)) {
|
|
179
|
+
throw new Error(`Invalid --android-external-network value: "${raw}". Valid values are: ${ANDROID_EXTERNAL_NETWORK_POLICIES.join(", ")}.`);
|
|
180
|
+
}
|
|
181
|
+
return value;
|
|
182
|
+
}
|
|
93
183
|
// ---------------------------------------------------------------------------
|
|
94
184
|
// v0.2.2 Batch 5 — profile-aware default checks
|
|
95
185
|
// ---------------------------------------------------------------------------
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dailephd/my-dev-kit-lab",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Evidence, benchmark, and evaluation companion for my-dev-kit.",
|
|
6
6
|
"bin": {
|
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
"test:plots": "vitest run tests/plots tests/commands/generateExperimentPlotsCommand.spec.ts",
|
|
72
72
|
"test:visualization-demos": "vitest run tests/visualizationDemos tests/commands/runVisualizationDemosCommand.spec.ts",
|
|
73
73
|
"verify:benchmarks": "tsx scripts/verify-benchmarks.ts",
|
|
74
|
+
"docs:check": "node scripts/check-docs.mjs",
|
|
74
75
|
"verify": "npm run build && npm run test && npm run test:benchmarks && npm run test:report && npm run test:screenshot && npm run test:evaluation && npm run test:agents && npm run test:experiments && npm run test:plots && npm run test:visualization-demos && npm run test:gallery && npm run test:demo && npm run test:integration && npm run test:e2e && npm run verify:benchmarks",
|
|
75
76
|
"security:deps": "tsx scripts/security/runDependencyChecks.ts",
|
|
76
77
|
"security:package": "tsx scripts/security/runPackageChecks.ts",
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<data-extraction-rules>
|
|
3
|
+
<cloud-backup disableIfNoEncryptionCapabilities="true">
|
|
4
|
+
<include domain="sharedpref" path="." />
|
|
5
|
+
<exclude domain="database" path="fake-secrets.db" />
|
|
6
|
+
</cloud-backup>
|
|
7
|
+
<device-transfer>
|
|
8
|
+
<include domain="root" path="." />
|
|
9
|
+
</device-transfer>
|
|
10
|
+
</data-extraction-rules>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<network-security-config>
|
|
3
|
+
<domain-config>
|
|
4
|
+
<domain>example.org</domain>
|
|
5
|
+
<pin-set expiration="not-a-date">
|
|
6
|
+
<pin>MISSING_DIGEST_ATTRIBUTE_FAKE_PIN=</pin>
|
|
7
|
+
<pin digest="SHA-1">UNSUPPORTED_DIGEST_FAKE_PIN=</pin>
|
|
8
|
+
<pin digest="SHA-256"></pin>
|
|
9
|
+
</pin-set>
|
|
10
|
+
</domain-config>
|
|
11
|
+
</network-security-config>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<network-security-config>
|
|
3
|
+
<base-config cleartextTrafficPermitted="true">
|
|
4
|
+
<trust-anchors>
|
|
5
|
+
<certificates src="system" />
|
|
6
|
+
<certificates src="user" />
|
|
7
|
+
</trust-anchors>
|
|
8
|
+
</base-config>
|
|
9
|
+
<domain-config cleartextTrafficPermitted="true">
|
|
10
|
+
<domain includeSubdomains="true">example.com</domain>
|
|
11
|
+
<pin-set expiration="2030-01-01">
|
|
12
|
+
<pin digest="SHA-256">FAKEPINHASHFAKEPINHASHFAKEPINHASHFAKEPINHASH=</pin>
|
|
13
|
+
</pin-set>
|
|
14
|
+
<domain-config>
|
|
15
|
+
<domain includeSubdomains="false">nested.example.com</domain>
|
|
16
|
+
<trust-anchors>
|
|
17
|
+
<certificates src="@raw/my_custom_ca" />
|
|
18
|
+
</trust-anchors>
|
|
19
|
+
</domain-config>
|
|
20
|
+
</domain-config>
|
|
21
|
+
<debug-overrides>
|
|
22
|
+
<trust-anchors>
|
|
23
|
+
<certificates src="user" overridePins="true" />
|
|
24
|
+
</trust-anchors>
|
|
25
|
+
</debug-overrides>
|
|
26
|
+
</network-security-config>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<network-security-config>
|
|
3
|
+
<base-config cleartextTrafficPermitted="false">
|
|
4
|
+
<trust-anchors>
|
|
5
|
+
<certificates src="system" />
|
|
6
|
+
</trust-anchors>
|
|
7
|
+
<!-- missing closing tag for base-config and network-security-config on purpose -->
|