65 lines
1.7 KiB
JavaScript
65 lines
1.7 KiB
JavaScript
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;
|