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;
|