scan, privacy answers and credentials from a second game's first release (lessons 35-37): review-prompt needs rating context, not a bare "rate"; account signals skip import lines and module paths, config-only accounts say "from config"; accounts.inApp without deletion code stays a medium 5.1.1(v) finding; privacy-manifest --propose builds NSPrivacyCollectedDataTypes from appPrivacy.types and check warns on an empty list; appPrivacy.types is authoritative in the App Privacy sheet (unlisted = not collected), ad / support / AR types default to not collected without tracking or ad SDKs; Play advertising ID from SDKs, the AD_ID permission, app-ads.txt or the flag, never from a Device ID alone; scan.ignore[].evidence and warnings for entries that match nothing; empty credentials template, placeholder values count as missing (check, doctor)
This commit is contained in:
parent
86cd79dd45
commit
1366e7e231
34 changed files with 881 additions and 71 deletions
41
tests/fixtures/scan/capacitor-game/storebound.config.ts
vendored
Normal file
41
tests/fixtures/scan/capacitor-game/storebound.config.ts
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
// Fixture config (made up, example.com placeholders only).
|
||||
export default {
|
||||
app: {
|
||||
name: 'Example Farm',
|
||||
profile: 'game',
|
||||
privacyPolicyUrl: 'https://example.com/privacy',
|
||||
supportUrl: 'https://example.com/support',
|
||||
website: 'https://example.com',
|
||||
contactEmail: 'support@example.com',
|
||||
},
|
||||
accounts: { enabled: true, deletionUrl: 'https://example.com/delete-account', inApp: 'Settings > Delete account' },
|
||||
reviewAccess: { signInRequired: false, instructions: 'No sign-in needed.' },
|
||||
languages: [{ id: 'en', play: 'en-US', apple: 'en-US' }],
|
||||
play: { packageName: 'org.example.farmgame', accountType: 'organization', targetAges: ['13-15', '16-17', '18+'] },
|
||||
apple: { bundleId: 'org.example.farmgame', usesNonExemptEncryption: false },
|
||||
appPrivacy: {
|
||||
tracking: false,
|
||||
types: {
|
||||
USER_ID: { collected: true, linked: true, tracking: false, purposes: ['APP_FUNCTIONALITY'] },
|
||||
DEVICE_ID: { collected: true, linked: false, tracking: false, purposes: ['APP_FUNCTIONALITY', 'ANALYTICS'] },
|
||||
GAMEPLAY_CONTENT: { collected: true, linked: true, tracking: false, purposes: ['APP_FUNCTIONALITY'] },
|
||||
PRODUCT_INTERACTION: { collected: true, linked: false, tracking: false, purposes: ['ANALYTICS'] },
|
||||
CRASH_DATA: { collected: true, linked: false, tracking: false, purposes: ['APP_FUNCTIONALITY'] },
|
||||
},
|
||||
},
|
||||
dataSafety: {
|
||||
collectsData: true,
|
||||
encryptedInTransit: true,
|
||||
data: {
|
||||
PSL_USER_ACCOUNT: { shared: false, collect: ['account', 'functionality'] },
|
||||
PSL_DEVICE_ID: { shared: false, collect: ['functionality', 'analytics'] },
|
||||
PSL_OTHER_APP_ACTIVITY: { shared: false, collect: ['analytics'] },
|
||||
PSL_CRASH_LOGS: { shared: false, collect: ['analytics'] },
|
||||
},
|
||||
},
|
||||
scan: {
|
||||
ignore: [
|
||||
{ rule: 'privacy-labels', evidence: 'src/no-such-file.ts', reason: 'stale entry: matches nothing' },
|
||||
],
|
||||
},
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue