import { NativeModules, Platform, Alert } from 'react-native'; import DocumentPicker from 'react-native-document-picker'; import * as FileSystem from 'expo-file-system'; import { extractHostname } from './server'; import UserPreferences from '../lib/userPreferences'; import I18n from '../i18n'; const { SSLPinning } = NativeModules; const RCSSLPinning = Platform.select({ ios: { pickCertificate: () => new Promise(async(resolve, reject) => { try { const res = await DocumentPicker.pick({ type: ['com.rsa.pkcs-12'] }); const { uri, name } = res; Alert.prompt( I18n.t('Certificate_password'), I18n.t('Whats_the_password_for_your_certificate'), [ { text: 'OK', onPress: async(password) => { try { const certificatePath = `${ FileSystem.documentDirectory }/${ name }`; await FileSystem.copyAsync({ from: uri, to: certificatePath }); const certificate = { path: certificatePath.replace('file://', ''), // file:// isn't allowed by obj-C password }; await UserPreferences.setMapAsync(name, certificate); resolve(name); } catch (e) { reject(e); } } } ], 'secure-text' ); } catch (e) { reject(e); } }), setCertificate: async(alias, server) => { if (alias) { const certificate = await UserPreferences.getMapAsync(alias); await UserPreferences.setMapAsync(extractHostname(server), certificate); } } }, android: { pickCertificate: () => SSLPinning?.pickCertificate(), setCertificate: alias => SSLPinning?.setCertificate(alias) } }); export default RCSSLPinning;