@dailephd/my-dev-kit-lab 0.4.0 → 0.4.2

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.
Files changed (158) hide show
  1. package/README.md +269 -47
  2. package/dist/scripts/audits/runAudit.js +28 -1
  3. package/dist/scripts/security/validate.js +38 -5
  4. package/dist/src/audits/core/auditConfig.js +16 -1
  5. package/dist/src/audits/core/auditRunner.js +6 -2
  6. package/dist/src/audits/report/auditReportModel.js +7 -0
  7. package/dist/src/audits/report/renderAuditJsonReport.js +1 -0
  8. package/dist/src/audits/report/renderAuditTextReport.js +37 -0
  9. package/dist/src/audits/security/androidAuditIntegration.js +145 -0
  10. package/dist/src/audits/security/mapAndroidSecurityFindingToAuditIssue.js +116 -0
  11. package/dist/src/audits/security/mapSecurityFindingToAuditIssue.js +15 -5
  12. package/dist/src/audits/security/securityAuditAdapter.js +20 -2
  13. package/dist/src/audits/security/securityAuditTypes.js +37 -0
  14. package/dist/src/mobile/android/advancedSecurity/backupConfiguration/analyzeBackupConfiguration.js +300 -0
  15. package/dist/src/mobile/android/advancedSecurity/backupConfiguration/checkResult.js +41 -0
  16. package/dist/src/mobile/android/advancedSecurity/backupConfiguration/index.js +8 -0
  17. package/dist/src/mobile/android/advancedSecurity/backupConfiguration/manifestEvidence.js +102 -0
  18. package/dist/src/mobile/android/advancedSecurity/backupConfiguration/parseBackupRules.js +110 -0
  19. package/dist/src/mobile/android/advancedSecurity/backupConfiguration/types.js +27 -0
  20. package/dist/src/mobile/android/advancedSecurity/candidateEvidence.js +50 -0
  21. package/dist/src/mobile/android/advancedSecurity/clipboard/analyzeClipboardSecurity.js +166 -0
  22. package/dist/src/mobile/android/advancedSecurity/clipboard/checkResult.js +74 -0
  23. package/dist/src/mobile/android/advancedSecurity/clipboard/collectClipboardEvidence.js +82 -0
  24. package/dist/src/mobile/android/advancedSecurity/clipboard/index.js +1 -0
  25. package/dist/src/mobile/android/advancedSecurity/clipboard/types.js +1 -0
  26. package/dist/src/mobile/android/advancedSecurity/externalTools/androidLint/checkResult.js +255 -0
  27. package/dist/src/mobile/android/advancedSecurity/externalTools/androidLint/index.js +1 -0
  28. package/dist/src/mobile/android/advancedSecurity/externalTools/androidLint/parseLintSarif.js +37 -0
  29. package/dist/src/mobile/android/advancedSecurity/externalTools/androidLint/parseLintXml.js +36 -0
  30. package/dist/src/mobile/android/advancedSecurity/externalTools/artifacts.js +95 -0
  31. package/dist/src/mobile/android/advancedSecurity/externalTools/boundedOutput.js +33 -0
  32. package/dist/src/mobile/android/advancedSecurity/externalTools/dependencyCheck/checkResult.js +173 -0
  33. package/dist/src/mobile/android/advancedSecurity/externalTools/dependencyCheck/command.js +33 -0
  34. package/dist/src/mobile/android/advancedSecurity/externalTools/dependencyCheck/index.js +1 -0
  35. package/dist/src/mobile/android/advancedSecurity/externalTools/dependencyCheck/parseDependencyCheckJson.js +133 -0
  36. package/dist/src/mobile/android/advancedSecurity/externalTools/discoverExecutable.js +13 -0
  37. package/dist/src/mobile/android/advancedSecurity/externalTools/index.js +8 -0
  38. package/dist/src/mobile/android/advancedSecurity/externalTools/minimalEnvironment.js +26 -0
  39. package/dist/src/mobile/android/advancedSecurity/externalTools/mutation.js +77 -0
  40. package/dist/src/mobile/android/advancedSecurity/externalTools/osv/checkResult.js +161 -0
  41. package/dist/src/mobile/android/advancedSecurity/externalTools/osv/command.js +25 -0
  42. package/dist/src/mobile/android/advancedSecurity/externalTools/osv/index.js +1 -0
  43. package/dist/src/mobile/android/advancedSecurity/externalTools/osv/parseOsvJson.js +136 -0
  44. package/dist/src/mobile/android/advancedSecurity/externalTools/runBoundedExternalTool.js +51 -0
  45. package/dist/src/mobile/android/advancedSecurity/externalTools/runRequestedAndroidExternalTools.js +54 -0
  46. package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/checkResult.js +170 -0
  47. package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/command.js +28 -0
  48. package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/index.js +2 -0
  49. package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/parseSemgrepJson.js +141 -0
  50. package/dist/src/mobile/android/advancedSecurity/externalTools/semgrep/rules.js +105 -0
  51. package/dist/src/mobile/android/advancedSecurity/externalTools/types.js +107 -0
  52. package/dist/src/mobile/android/advancedSecurity/fileProvider/checkResult.js +188 -0
  53. package/dist/src/mobile/android/advancedSecurity/fileProvider/index.js +1 -0
  54. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/analyzeFirebaseGoogleServices.js +197 -0
  55. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/checkResult.js +77 -0
  56. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/collectFirebaseServiceEvidence.js +193 -0
  57. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/discoverFirebaseArtifacts.js +128 -0
  58. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/index.js +1 -0
  59. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/parseDatabaseRules.js +55 -0
  60. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/parseFirebaseConfig.js +75 -0
  61. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/parseFirestoreStorageRules.js +88 -0
  62. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/parseGoogleServicesConfig.js +55 -0
  63. package/dist/src/mobile/android/advancedSecurity/firebaseGoogle/types.js +6 -0
  64. package/dist/src/mobile/android/advancedSecurity/networkSecurity/analyzeNetworkSecurity.js +394 -0
  65. package/dist/src/mobile/android/advancedSecurity/networkSecurity/checkResult.js +47 -0
  66. package/dist/src/mobile/android/advancedSecurity/networkSecurity/deriveEffectiveNetworkPolicy.js +52 -0
  67. package/dist/src/mobile/android/advancedSecurity/networkSecurity/index.js +14 -0
  68. package/dist/src/mobile/android/advancedSecurity/networkSecurity/manifestEvidence.js +109 -0
  69. package/dist/src/mobile/android/advancedSecurity/networkSecurity/parseNetworkSecurityConfig.js +186 -0
  70. package/dist/src/mobile/android/advancedSecurity/networkSecurity/types.js +1 -0
  71. package/dist/src/mobile/android/advancedSecurity/ordering.js +44 -0
  72. package/dist/src/mobile/android/advancedSecurity/redaction.js +54 -0
  73. package/dist/src/mobile/android/advancedSecurity/releaseConfiguration/analyzeReleaseConfiguration.js +221 -0
  74. package/dist/src/mobile/android/advancedSecurity/releaseConfiguration/checkResult.js +39 -0
  75. package/dist/src/mobile/android/advancedSecurity/releaseConfiguration/index.js +7 -0
  76. package/dist/src/mobile/android/advancedSecurity/releaseConfiguration/manifestEvidence.js +19 -0
  77. package/dist/src/mobile/android/advancedSecurity/resourceReference.js +69 -0
  78. package/dist/src/mobile/android/advancedSecurity/resourceResolution.js +118 -0
  79. package/dist/src/mobile/android/advancedSecurity/ruleIds.js +141 -0
  80. package/dist/src/mobile/android/advancedSecurity/secretCandidates/analyzeSecretCandidates.js +116 -0
  81. package/dist/src/mobile/android/advancedSecurity/secretCandidates/checkResult.js +80 -0
  82. package/dist/src/mobile/android/advancedSecurity/secretCandidates/discoverSecretSourceFiles.js +152 -0
  83. package/dist/src/mobile/android/advancedSecurity/secretCandidates/index.js +9 -0
  84. package/dist/src/mobile/android/advancedSecurity/secretCandidates/matchSecretCandidates.js +136 -0
  85. package/dist/src/mobile/android/advancedSecurity/secretCandidates/suppressValue.js +61 -0
  86. package/dist/src/mobile/android/advancedSecurity/secretCandidates/types.js +11 -0
  87. package/dist/src/mobile/android/advancedSecurity/sensitiveCategories.js +34 -0
  88. package/dist/src/mobile/android/advancedSecurity/sensitiveData/classifyDirectExpression.js +99 -0
  89. package/dist/src/mobile/android/advancedSecurity/sensitiveData/classifySensitiveIdentifier.js +111 -0
  90. package/dist/src/mobile/android/advancedSecurity/sensitiveData/index.js +3 -0
  91. package/dist/src/mobile/android/advancedSecurity/sensitiveData/localSourceContext.js +90 -0
  92. package/dist/src/mobile/android/advancedSecurity/sensitiveData/splitArguments.js +59 -0
  93. package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/analyzeSensitiveLogging.js +117 -0
  94. package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/checkResult.js +74 -0
  95. package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/collectLoggingEvidence.js +87 -0
  96. package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/index.js +1 -0
  97. package/dist/src/mobile/android/advancedSecurity/sensitiveLogging/types.js +1 -0
  98. package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/analyzeSensitiveStorage.js +182 -0
  99. package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/checkResult.js +74 -0
  100. package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/collectStorageEvidence.js +109 -0
  101. package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/index.js +1 -0
  102. package/dist/src/mobile/android/advancedSecurity/sensitiveStorage/types.js +4 -0
  103. package/dist/src/mobile/android/advancedSecurity/signingConfiguration/analyzeSigningConfiguration.js +270 -0
  104. package/dist/src/mobile/android/advancedSecurity/signingConfiguration/checkResult.js +119 -0
  105. package/dist/src/mobile/android/advancedSecurity/signingConfiguration/discoverKeystoreCandidates.js +55 -0
  106. package/dist/src/mobile/android/advancedSecurity/signingConfiguration/extractSigningConfigurations.js +81 -0
  107. package/dist/src/mobile/android/advancedSecurity/signingConfiguration/index.js +8 -0
  108. package/dist/src/mobile/android/advancedSecurity/signingConfiguration/types.js +20 -0
  109. package/dist/src/mobile/android/advancedSecurity/sourceLocation.js +15 -0
  110. package/dist/src/mobile/android/advancedSecurity/webview/checkResult.js +210 -0
  111. package/dist/src/mobile/android/advancedSecurity/webview/index.js +1 -0
  112. package/dist/src/mobile/android/gradle/moduleMetadataExtractor.js +123 -17
  113. package/dist/src/mobile/android/manifest/parseAndroidManifest.js +27 -4
  114. package/dist/src/mobile/android/manifest/xml/parseXml.js +25 -9
  115. package/dist/src/mobile/android/report/model.js +32 -1
  116. package/dist/src/mobile/android/report/renderAndroidReport.js +63 -0
  117. package/dist/src/mobile/android/validate/validateAndroidTarget.js +146 -3
  118. package/dist/src/mobile/android/validation/checkResult.js +7 -0
  119. package/dist/src/securityValidation/commandRunner.js +10 -1
  120. package/dist/src/securityValidation/validate/cliOptions.js +46 -0
  121. package/package.json +1 -1
  122. package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/debug/res/xml/ambiguous_backup_rules.xml +4 -0
  123. package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/ambiguous_backup_rules.xml +4 -0
  124. package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/backup_rules.xml +5 -0
  125. package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/broad_backup_rules.xml +4 -0
  126. package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/data_extraction_rules.xml +10 -0
  127. package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-a/src/main/res/xml/unsupported_domain_rules.xml +4 -0
  128. package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-b/src/main/res/xml/malformed_backup_rules.xml +4 -0
  129. package/tests/fixtures/android/advanced-security-fixtures/backup-configuration/module-b/src/main/res/xml/unsupported_root.xml +4 -0
  130. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/debug/res/xml/ambiguous_config.xml +4 -0
  131. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/ambiguous_config.xml +4 -0
  132. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/base_cleartext_false.xml +8 -0
  133. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/broad_and_duplicate_domains.xml +8 -0
  134. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/empty_domain.xml +6 -0
  135. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/malformed_pin.xml +11 -0
  136. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-a/src/main/res/xml/network_security_config.xml +26 -0
  137. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-b/src/main/res/xml/malformed_network_security_config.xml +6 -0
  138. package/tests/fixtures/android/advanced-security-fixtures/network-security/module-b/src/main/res/xml/unsupported_root.xml +4 -0
  139. package/tests/fixtures/android/advanced-security-fixtures/release-configuration/groovy-release-debuggable-dynamic.gradle +7 -0
  140. package/tests/fixtures/android/advanced-security-fixtures/release-configuration/groovy-release-debuggable-false.gradle +9 -0
  141. package/tests/fixtures/android/advanced-security-fixtures/release-configuration/groovy-release-debuggable-true.gradle +13 -0
  142. package/tests/fixtures/android/advanced-security-fixtures/release-configuration/kotlin-release-debuggable-false.gradle.kts +7 -0
  143. package/tests/fixtures/android/advanced-security-fixtures/release-configuration/kotlin-release-debuggable-true.gradle.kts +10 -0
  144. package/tests/fixtures/android/advanced-security-fixtures/release-configuration/missing-release-build-type.gradle.kts +7 -0
  145. package/tests/fixtures/android/advanced-security-fixtures/resource-resolution/module-a/src/debug/res/xml/network_security_config.xml +8 -0
  146. package/tests/fixtures/android/advanced-security-fixtures/resource-resolution/module-a/src/main/res/xml/backup_rules.xml +4 -0
  147. package/tests/fixtures/android/advanced-security-fixtures/resource-resolution/module-a/src/main/res/xml/network_security_config.xml +8 -0
  148. package/tests/fixtures/android/advanced-security-fixtures/resource-resolution/module-b/src/main/res/xml/malformed_network_security_config.xml +7 -0
  149. package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/SampleActivity.java +8 -0
  150. package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/SampleActivity.kt +9 -0
  151. package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/build.gradle +11 -0
  152. package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/build.gradle.kts +11 -0
  153. package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/google-services.json +16 -0
  154. package/tests/fixtures/android/advanced-security-fixtures/secret-candidates/local.properties +3 -0
  155. package/tests/fixtures/android/advanced-security-fixtures/secret-candidates-bounds/module/binary.properties +0 -0
  156. package/tests/fixtures/android/advanced-security-fixtures/secret-candidates-bounds/module/oversized.json +1 -0
  157. package/tests/fixtures/android/advanced-security-fixtures/signing-configuration/app/fake-release-keystore.jks +1 -0
  158. package/tests/fixtures/android/advanced-security-fixtures/signing-configuration/build/generated-fake.keystore +1 -0
@@ -1,3 +1,4 @@
1
+ import { ANDROID_ADVANCED_CHECK_CATEGORIES } from "../advancedSecurity/ruleIds.js";
1
2
  // ---------------------------------------------------------------------------
2
3
  // v0.4.0 Batch 1 — Android check-result and skip-representation contracts.
3
4
  //
@@ -34,6 +35,11 @@ export const ANDROID_NON_PASSING_STATUSES = [
34
35
  // v0.4.0 Batch 5 — added "android-target-immutability" (additive) for the
35
36
  // required target mutation/immutability check (agents.txt Batch 5 section
36
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).
37
43
  export const ANDROID_CHECK_CATEGORIES = [
38
44
  "android-detection",
39
45
  "android-manifest",
@@ -45,6 +51,7 @@ export const ANDROID_CHECK_CATEGORIES = [
45
51
  "android-release-metadata",
46
52
  "android-play-readiness",
47
53
  "android-target-immutability",
54
+ ...ANDROID_ADVANCED_CHECK_CATEGORIES,
48
55
  ];
49
56
  export function isPassingAndroidStatus(status) {
50
57
  return status === "passed";
@@ -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: process.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) {
@@ -61,6 +61,8 @@ const FLAGS_WITH_VALUE = {
61
61
  "--format": "format",
62
62
  "--fail-on": "failOn",
63
63
  "--android-gradle-operations": "androidGradleOperations",
64
+ "--android-external-tools": "androidExternalTools",
65
+ "--android-external-network": "androidExternalNetwork",
64
66
  };
65
67
  // v0.4.0 Batch 5 — the exact allowlisted optional Gradle operation ids
66
68
  // (agents.txt Batch 5 section 7.3). Deliberately re-declared here rather than
@@ -69,6 +71,14 @@ const FLAGS_WITH_VALUE = {
69
71
  // mobile dependency direction for five short string literals. Both lists
70
72
  // must stay in sync; a regression test in tests/security/ asserts they do.
71
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";
72
82
  export function parseSecurityValidateArgs(argv) {
73
83
  const result = {};
74
84
  for (let i = 0; i < argv.length; i++) {
@@ -99,6 +109,8 @@ export function normalizeSecurityValidateConfig(raw, toolRoot) {
99
109
  const failOn = parseFailOnOption(raw.failOn);
100
110
  const out = raw.out !== undefined ? resolveOutDir(raw.out) : path.join(toolRoot, "reports", "security");
101
111
  const androidGradleOperationIds = parseAndroidGradleOperationsOption(raw.androidGradleOperations, profile.value);
112
+ const androidExternalToolIds = parseAndroidExternalToolsOption(raw.androidExternalTools, profile.value);
113
+ const androidExternalNetworkPolicy = parseAndroidExternalNetworkOption(raw.androidExternalNetwork, profile.value);
102
114
  return {
103
115
  target: raw.target,
104
116
  out,
@@ -115,6 +127,8 @@ export function normalizeSecurityValidateConfig(raw, toolRoot) {
115
127
  failOnThreshold: failOn.value,
116
128
  failOnWasDefault: failOn.wasDefault,
117
129
  androidGradleOperationIds,
130
+ androidExternalToolIds,
131
+ androidExternalNetworkPolicy,
118
132
  };
119
133
  }
120
134
  // Parses --android-gradle-operations. Absent by default (empty array — zero
@@ -134,6 +148,38 @@ function parseAndroidGradleOperationsOption(raw, profile) {
134
148
  const unique = new Set(parts);
135
149
  return ANDROID_GRADLE_OPERATION_IDS.filter((id) => unique.has(id));
136
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
+ }
137
183
  // ---------------------------------------------------------------------------
138
184
  // v0.2.2 Batch 5 — profile-aware default checks
139
185
  // ---------------------------------------------------------------------------
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dailephd/my-dev-kit-lab",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "type": "module",
5
5
  "description": "Evidence, benchmark, and evaluation companion for my-dev-kit.",
6
6
  "bin": {
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <full-backup-content>
3
+ <include domain="sharedpref" path="." />
4
+ </full-backup-content>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <full-backup-content>
3
+ <exclude domain="database" path="fake.db" />
4
+ </full-backup-content>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <full-backup-content>
3
+ <include domain="sharedpref" path="." />
4
+ <exclude domain="database" path="fake-cache.db" />
5
+ </full-backup-content>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <full-backup-content>
3
+ <include domain="root" path="." />
4
+ </full-backup-content>
@@ -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,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <full-backup-content>
3
+ <include domain="not-a-real-domain" path="." />
4
+ </full-backup-content>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <full-backup-content>
3
+ <include domain="sharedpref" path="." />
4
+ <!-- missing closing tag on purpose -->
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources>
3
+ <string name="not_backup_rules">true</string>
4
+ </resources>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <network-security-config>
3
+ <base-config cleartextTrafficPermitted="true" />
4
+ </network-security-config>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <network-security-config>
3
+ <base-config cleartextTrafficPermitted="false" />
4
+ </network-security-config>
@@ -0,0 +1,8 @@
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
+ </base-config>
8
+ </network-security-config>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <network-security-config>
3
+ <domain-config>
4
+ <domain>ab</domain>
5
+ <domain>Example.COM.</domain>
6
+ <domain>example.com</domain>
7
+ </domain-config>
8
+ </network-security-config>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <network-security-config>
3
+ <domain-config>
4
+ <domain includeSubdomains="true"></domain>
5
+ </domain-config>
6
+ </network-security-config>
@@ -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,6 @@
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
+ <!-- missing closing tags on purpose -->
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources>
3
+ <string name="not_a_network_security_config">true</string>
4
+ </resources>
@@ -0,0 +1,7 @@
1
+ android {
2
+ buildTypes {
3
+ release {
4
+ debuggable rootProject.ext.fakeIsDebugFlag
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,9 @@
1
+ android {
2
+ buildTypes {
3
+ release {
4
+ debuggable false
5
+ minifyEnabled true
6
+ shrinkResources true
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,13 @@
1
+ android {
2
+ buildTypes {
3
+ release {
4
+ debuggable true
5
+ minifyEnabled true
6
+ shrinkResources true
7
+ signingConfig signingConfigs.release
8
+ }
9
+ debug {
10
+ debuggable true
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,7 @@
1
+ android {
2
+ buildTypes {
3
+ getByName("release") {
4
+ isDebuggable = false
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,10 @@
1
+ android {
2
+ buildTypes {
3
+ getByName("release") {
4
+ isDebuggable = true
5
+ isMinifyEnabled = true
6
+ isShrinkResources = true
7
+ signingConfig = signingConfigs.getByName("release")
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,7 @@
1
+ android {
2
+ buildTypes {
3
+ debug {
4
+ isDebuggable = true
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <network-security-config>
3
+ <debug-overrides>
4
+ <trust-anchors>
5
+ <certificates src="user" />
6
+ </trust-anchors>
7
+ </debug-overrides>
8
+ </network-security-config>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <full-backup-content>
3
+ <exclude domain="sharedpref" path="fake-secrets.xml" />
4
+ </full-backup-content>
@@ -0,0 +1,8 @@
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
+ </base-config>
8
+ </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 -->
@@ -0,0 +1,8 @@
1
+ package com.example.fixtures;
2
+
3
+ // Fixture only — every value below is fake and unmistakably not a real
4
+ // credential. Used by later v0.4.1 secret-candidate scanner batches.
5
+ public class SampleActivity {
6
+ private static final String SECRET_TOKEN = "FAKE-DUMMY-TOKEN-0000000000000000";
7
+ private static final String DB_PASSWORD = "test-fake-db-password";
8
+ }
@@ -0,0 +1,9 @@
1
+ package com.example.fixtures
2
+
3
+ // Fixture only — every value below is fake and unmistakably not a real
4
+ // credential. Used by later v0.4.1 secret-candidate scanner batches.
5
+ class SampleActivity {
6
+ private val apiToken = "FAKE_TOKEN_1234567890ABCDEFGHIJ"
7
+ private val password = "changeme-fake-password"
8
+ private val placeholderSecret = "your-api-key-here"
9
+ }
@@ -0,0 +1,11 @@
1
+ // Fixture only — every value below is fake. Gradle Groovy DSL candidate.
2
+ android {
3
+ signingConfigs {
4
+ release {
5
+ storeFile file("fake-release-keystore.jks")
6
+ storePassword "FAKE-KEYSTORE-PASSWORD-0000"
7
+ keyAlias "fake-release-key"
8
+ keyPassword "FAKE-KEY-PASSWORD-0000"
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ // Fixture only — every value below is fake. Gradle Kotlin DSL candidate.
2
+ android {
3
+ signingConfigs {
4
+ create("release") {
5
+ storeFile = file("fake-release-keystore.jks")
6
+ storePassword = "FAKE-KEYSTORE-PASSWORD-0000"
7
+ keyAlias = "fake-release-key"
8
+ keyPassword = "FAKE-KEY-PASSWORD-0000"
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "project_info": {
3
+ "project_number": "000000000000",
4
+ "project_id": "fake-fixture-project",
5
+ "storage_bucket": "fake-fixture-project.appspot.com"
6
+ },
7
+ "client": [
8
+ {
9
+ "client_info": {
10
+ "mobilesdk_app_id": "1:000000000000:android:0000000000000000000000",
11
+ "android_client_info": { "package_name": "com.example.fixtures" }
12
+ },
13
+ "api_key": [{ "current_key": "FAKE-FIREBASE-WEB-API-KEY-0000000000" }]
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,3 @@
1
+ # Fixture only — every value below is fake.
2
+ sdk.dir=/fake/path/to/android/sdk
3
+ fake.api.key=FAKE-LOCAL-PROPERTIES-KEY-0000000000