From 4d665013f007ac733ed35271fe018cceb819d523 Mon Sep 17 00:00:00 2001 From: Marco Rodolfi Date: Wed, 22 Jan 2025 20:08:20 +0100 Subject: [PATCH] [android] Trust android local CA store for self signed certificates --- app.json | 3 +- plugins/network_security_config.xml | 9 ++++++ plugins/withTrustLocalCerts.js | 44 +++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 plugins/network_security_config.xml create mode 100644 plugins/withTrustLocalCerts.js diff --git a/app.json b/app.json index fc2c4505..972f4035 100644 --- a/app.json +++ b/app.json @@ -112,7 +112,8 @@ ], ["react-native-bottom-tabs"], ["./plugins/withChangeNativeAndroidTextToWhite.js"], - ["./plugins/withGoogleCastActivity.js"] + ["./plugins/withGoogleCastActivity.js"], + ["./plugins/withTrustLocalCerts.js"] ], "experiments": { "typedRoutes": true diff --git a/plugins/network_security_config.xml b/plugins/network_security_config.xml new file mode 100644 index 00000000..7448506a --- /dev/null +++ b/plugins/network_security_config.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/plugins/withTrustLocalCerts.js b/plugins/withTrustLocalCerts.js new file mode 100644 index 00000000..13b326af --- /dev/null +++ b/plugins/withTrustLocalCerts.js @@ -0,0 +1,44 @@ +const { AndroidConfig, withAndroidManifest } = require("@expo/config-plugins"); +const { Paths } = require("@expo/config-plugins/build/android"); +const path = require("path"); +const fs = require("fs"); +const fsPromises = fs.promises; + +const { getMainApplicationOrThrow } = AndroidConfig.Manifest; + +const withTrustLocalCerts = (config) => { + return withAndroidManifest(config, async (config) => { + config.modResults = await setCustomConfigAsync(config, config.modResults); + return config; + }); +}; + +async function setCustomConfigAsync(config, androidManifest) { + const src_file_path = path.join(__dirname, "network_security_config.xml"); + const res_file_path = path.join( + await Paths.getResourceFolderAsync(config.modRequest.projectRoot), + "xml", + "network_security_config.xml" + ); + + const res_dir = path.resolve(res_file_path, ".."); + + if (!fs.existsSync(res_dir)) { + await fsPromises.mkdir(res_dir); + } + + try { + await fsPromises.copyFile(src_file_path, res_file_path); + } catch (e) { + throw new Error( + `Failed to copy network security config file from ${src_file_path} to ${res_file_path}: ${e.message}` + ); + } + const mainApplication = getMainApplicationOrThrow(androidManifest); + mainApplication.$["android:networkSecurityConfig"] = + "@xml/network_security_config"; + + return androidManifest; +} + +module.exports = withTrustLocalCerts;