1{"version":3,"file":"Permissions.js","names":["USES_PERMISSION","withPermissions","config","permissions","Array","isArray","filter","Boolean","android","Set","concat","withAndroidManifest","modResults","setAndroidPermissions","withBlockedPermissions","resolvedPermissions","prefixAndroidPermissionsIfNecessary","permission","includes","ensureToolsAvailable","addBlockedPermissions","withInternalBlockedPermissions","blockedPermissions","length","androidManifest","manifest","ensureBlockedPermission","manifestPermissions","e","$","push","map","getAndroidPermissions","providedPermissions","permissionsToAdd","hasOwnProperty","forEach","isPermissionAlreadyRequested","addPermissionToManifest","some","removePermissions","permissionNames","targetNames","ensurePermissionNameFormat","nextPermissions","attribute","value","name","addPermission","permissionName","usesPermissions","ensurePermissions","getPermissions","results","targetName","ensurePermission","com","split","pop","toUpperCase","join","permissionObject"],"sources":["../../src/android/Permissions.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport { AndroidManifest, ensureToolsAvailable, ManifestUsesPermission } from './Manifest';\n\nconst USES_PERMISSION = 'uses-permission';\n\nexport const withPermissions: ConfigPlugin<string[] | void> = (config, permissions) => {\n  if (Array.isArray(permissions)) {\n    permissions = permissions.filter(Boolean);\n    if (!config.android) config.android = {};\n    if (!config.android.permissions) config.android.permissions = [];\n    config.android.permissions = [\n      // @ts-ignore\n      ...new Set(config.android.permissions.concat(permissions)),\n    ];\n  }\n  return withAndroidManifest(config, async (config) => {\n    config.modResults = await setAndroidPermissions(config, config.modResults);\n    return config;\n  });\n};\n\n/** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */\nexport const withBlockedPermissions: ConfigPlugin<string[] | string> = (config, permissions) => {\n  const resolvedPermissions = prefixAndroidPermissionsIfNecessary(\n    (Array.isArray(permissions) ? permissions : [permissions]).filter(Boolean)\n  );\n\n  if (config?.android?.permissions && Array.isArray(config.android.permissions)) {\n    // Remove any static config permissions\n    config.android.permissions = prefixAndroidPermissionsIfNecessary(\n      config.android.permissions\n    ).filter((permission) => !resolvedPermissions.includes(permission));\n  }\n\n  return withAndroidManifest(config, async (config) => {\n    config.modResults = ensureToolsAvailable(config.modResults);\n    config.modResults = addBlockedPermissions(config.modResults, resolvedPermissions);\n    return config;\n  });\n};\n\nexport const withInternalBlockedPermissions: ConfigPlugin = (config) => {\n  // Only add permissions if the user defined the property and added some values\n  // this ensures we don't add the `tools:*` namespace extraneously.\n  if (config.android?.blockedPermissions?.length) {\n    return withBlockedPermissions(config, config.android.blockedPermissions);\n  }\n\n  return config;\n};\n\nexport function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]) {\n  if (!Array.isArray(androidManifest.manifest['uses-permission'])) {\n    androidManifest.manifest['uses-permission'] = [];\n  }\n\n  for (const permission of prefixAndroidPermissionsIfNecessary(permissions)) {\n    androidManifest.manifest['uses-permission'] = ensureBlockedPermission(\n      androidManifest.manifest['uses-permission'],\n      permission\n    );\n  }\n\n  return androidManifest;\n}\n\n/**\n * Filter any existing permissions matching the provided permission name, then add a\n * restricted permission to overwrite any extra permissions that may be added in a\n * third-party package's AndroidManifest.xml.\n *\n * @param manifestPermissions manifest `uses-permissions` array.\n * @param permission `android:name` of the permission to restrict\n * @returns\n */\nfunction ensureBlockedPermission(\n  manifestPermissions: ManifestUsesPermission[],\n  permission: string\n) {\n  // Remove permission if it currently exists\n  manifestPermissions = manifestPermissions.filter((e) => e.$['android:name'] !== permission);\n\n  // Add a permission with tools:node to overwrite any existing permission and ensure it's removed upon building.\n  manifestPermissions.push({\n    $: { 'android:name': permission, 'tools:node': 'remove' },\n  });\n  return manifestPermissions;\n}\n\nfunction prefixAndroidPermissionsIfNecessary(permissions: string[]): string[] {\n  return permissions.map((permission) => {\n    if (!permission.includes('.')) {\n      return `android.permission.${permission}`;\n    }\n    return permission;\n  });\n}\n\nexport function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[] {\n  return config.android?.permissions ?? [];\n}\n\nexport function setAndroidPermissions(\n  config: Pick<ExpoConfig, 'android'>,\n  androidManifest: AndroidManifest\n) {\n  const permissions = getAndroidPermissions(config);\n  const providedPermissions = prefixAndroidPermissionsIfNecessary(permissions);\n  const permissionsToAdd = [...providedPermissions];\n\n  if (!androidManifest.manifest.hasOwnProperty('uses-permission')) {\n    androidManifest.manifest['uses-permission'] = [];\n  }\n  // manifest.manifest['uses-permission'] = [];\n\n  const manifestPermissions = androidManifest.manifest['uses-permission'] ?? [];\n\n  permissionsToAdd.forEach((permission) => {\n    if (!isPermissionAlreadyRequested(permission, manifestPermissions)) {\n      addPermissionToManifest(permission, manifestPermissions);\n    }\n  });\n\n  return androidManifest;\n}\n\nexport function isPermissionAlreadyRequested(\n  permission: string,\n  manifestPermissions: ManifestUsesPermission[]\n): boolean {\n  return manifestPermissions.some((e) => e.$['android:name'] === permission);\n}\n\nexport function addPermissionToManifest(\n  permission: string,\n  manifestPermissions: ManifestUsesPermission[]\n) {\n  manifestPermissions.push({ $: { 'android:name': permission } });\n  return manifestPermissions;\n}\n\nexport function removePermissions(androidManifest: AndroidManifest, permissionNames?: string[]) {\n  const targetNames = permissionNames ? permissionNames.map(ensurePermissionNameFormat) : null;\n  const permissions = androidManifest.manifest[USES_PERMISSION] || [];\n  const nextPermissions = [];\n  for (const attribute of permissions) {\n    if (targetNames) {\n      // @ts-ignore: name isn't part of the type\n      const value = attribute.$['android:name'] || attribute.$.name;\n      if (!targetNames.includes(value)) {\n        nextPermissions.push(attribute);\n      }\n    }\n  }\n\n  androidManifest.manifest[USES_PERMISSION] = nextPermissions;\n}\n\nexport function addPermission(androidManifest: AndroidManifest, permissionName: string): void {\n  const usesPermissions: ManifestUsesPermission[] = androidManifest.manifest[USES_PERMISSION] || [];\n  usesPermissions.push({\n    $: { 'android:name': permissionName },\n  });\n  androidManifest.manifest[USES_PERMISSION] = usesPermissions;\n}\n\nexport function ensurePermissions(\n  androidManifest: AndroidManifest,\n  permissionNames: string[]\n): { [permission: string]: boolean } {\n  const permissions = getPermissions(androidManifest);\n\n  const results: { [permission: string]: boolean } = {};\n  for (const permissionName of permissionNames) {\n    const targetName = ensurePermissionNameFormat(permissionName);\n    if (!permissions.includes(targetName)) {\n      addPermission(androidManifest, targetName);\n      results[permissionName] = true;\n    } else {\n      results[permissionName] = false;\n    }\n  }\n  return results;\n}\n\nexport function ensurePermission(\n  androidManifest: AndroidManifest,\n  permissionName: string\n): boolean {\n  const permissions = getPermissions(androidManifest);\n  const targetName = ensurePermissionNameFormat(permissionName);\n\n  if (!permissions.includes(targetName)) {\n    addPermission(androidManifest, targetName);\n    return true;\n  }\n  return false;\n}\n\nexport function ensurePermissionNameFormat(permissionName: string): string {\n  if (permissionName.includes('.')) {\n    const com = permissionName.split('.');\n    const name = com.pop() as string;\n    return [...com, name.toUpperCase()].join('.');\n  } else {\n    // If shorthand form like `WRITE_CONTACTS` is provided, expand it to `android.permission.WRITE_CONTACTS`.\n    return ensurePermissionNameFormat(`android.permission.${permissionName}`);\n  }\n}\n\nexport function getPermissions(androidManifest: AndroidManifest): string[] {\n  const usesPermissions: { [key: string]: any }[] = androidManifest.manifest[USES_PERMISSION] || [];\n  const permissions = usesPermissions.map((permissionObject) => {\n    return permissionObject.$['android:name'] || permissionObject.$.name;\n  });\n  return permissions;\n}\n"],"mappings":"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"}