react-native-ssl-manager 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +319 -58
- package/android/build.gradle +23 -1
- package/android/src/main/java/com/usesslpinning/SslPinningFactory.kt +94 -0
- package/android/src/main/java/com/usesslpinning/UseSslPinningModuleImpl.kt +34 -0
- package/android/src/newarch/com/usesslpinning/UseSslPinningModule.kt +26 -0
- package/android/src/newarch/com/usesslpinning/UseSslPinningPackage.kt +36 -0
- package/android/src/oldarch/com/usesslpinning/UseSslPinningModule.kt +32 -0
- package/android/src/{main/java → oldarch}/com/usesslpinning/UseSslPinningPackage.kt +0 -1
- package/android/ssl-pinning-setup.gradle +148 -0
- package/expo-module.config.json +10 -0
- package/ios/SharedLogic.swift +247 -0
- package/ios/UseSslPinning.h +5 -0
- package/ios/{UseSslPinning.mm → UseSslPinningModule.mm} +9 -6
- package/ios/UseSslPinningModule.swift +65 -0
- package/lib/NativeUseSslPinning.d.ts +8 -0
- package/lib/NativeUseSslPinning.d.ts.map +1 -0
- package/lib/NativeUseSslPinning.js +4 -0
- package/lib/UseSslPinning.types.d.ts +17 -0
- package/lib/UseSslPinning.types.d.ts.map +1 -0
- package/lib/UseSslPinning.types.js +2 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +58 -0
- package/package.json +82 -39
- package/react-native-ssl-manager.podspec +87 -38
- package/react-native.config.js +34 -0
- package/scripts/build.sh +52 -0
- package/src/NativeUseSslPinning.ts +9 -0
- package/src/UseSslPinning.types.ts +17 -0
- package/src/index.tsx +53 -33
- package/android/src/main/java/com/usesslpinning/UseSslPinningFactory.kt +0 -50
- package/android/src/main/java/com/usesslpinning/UseSslPinningModule.kt +0 -45
- package/ios/UseSslPinning-Bridging-Header.h +0 -2
- package/ios/UseSslPinning.swift +0 -169
package/ios/UseSslPinning.swift
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import Foundation
|
|
2
|
-
import TrustKit
|
|
3
|
-
import TrustKit.TSKPinningValidator
|
|
4
|
-
import TrustKit.TSKPinningValidatorCallback
|
|
5
|
-
|
|
6
|
-
// Add SSLPinningError enum definition
|
|
7
|
-
enum SSLPinningError: Error {
|
|
8
|
-
case invalidConfiguration
|
|
9
|
-
case invalidPinConfiguration(domain: String)
|
|
10
|
-
|
|
11
|
-
var message: String {
|
|
12
|
-
switch self {
|
|
13
|
-
case .invalidConfiguration:
|
|
14
|
-
return "Invalid SSL pinning configuration format"
|
|
15
|
-
case .invalidPinConfiguration(let domain):
|
|
16
|
-
return "Invalid pin configuration for domain: \(domain)"
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
@objc(UseSslPinning)
|
|
22
|
-
class UseSslPinning: NSObject {
|
|
23
|
-
private static var sharedTrustKit: TrustKit?
|
|
24
|
-
private let userDefaults = UserDefaults.standard
|
|
25
|
-
private let useSSLPinningKey = "useSSLPinning"
|
|
26
|
-
|
|
27
|
-
private func cleanJsonString(_ jsonString: String) -> String {
|
|
28
|
-
var cleaned = jsonString
|
|
29
|
-
.replacingOccurrences(of: "\n", with: "")
|
|
30
|
-
.replacingOccurrences(of: "| ", with: "")
|
|
31
|
-
.replacingOccurrences(of: "\\ ", with: "")
|
|
32
|
-
.replacingOccurrences(of: "\\\"", with: "\"")
|
|
33
|
-
|
|
34
|
-
// Remove any remaining backslashes before quotes
|
|
35
|
-
cleaned = cleaned.replacingOccurrences(of: "\\(?!\")", with: "")
|
|
36
|
-
|
|
37
|
-
// Clean up any double spaces
|
|
38
|
-
cleaned = cleaned.replacingOccurrences(of: " ", with: " ")
|
|
39
|
-
|
|
40
|
-
NSLog("Original JSON: %@", jsonString)
|
|
41
|
-
NSLog("Cleaned JSON: %@", cleaned)
|
|
42
|
-
|
|
43
|
-
return cleaned
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
private func validateAndCleanPins(_ pins: [String], for domain: String) throws -> [String] {
|
|
47
|
-
return try pins.map { pin -> String in
|
|
48
|
-
var cleanPin = pin.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
49
|
-
|
|
50
|
-
// Verify pin format
|
|
51
|
-
guard cleanPin.starts(with: "sha256/") else {
|
|
52
|
-
NSLog("Invalid pin format (missing sha256/): %@", cleanPin)
|
|
53
|
-
throw SSLPinningError.invalidPinConfiguration(domain: domain)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Remove sha256/ prefix for TrustKit
|
|
57
|
-
cleanPin = cleanPin.replacingOccurrences(of: "sha256/", with: "")
|
|
58
|
-
|
|
59
|
-
// Verify base64 format
|
|
60
|
-
guard cleanPin.range(of: "^[A-Za-z0-9+/=]+$", options: .regularExpression) != nil else {
|
|
61
|
-
NSLog("Invalid pin format (not base64): %@", cleanPin)
|
|
62
|
-
throw SSLPinningError.invalidPinConfiguration(domain: domain)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return cleanPin
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
@objc
|
|
70
|
-
func initializeSslPinning(_ configJsonString: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
|
|
71
|
-
// Check if SSL pinning is enabled
|
|
72
|
-
let isSSLPinningEnabled = userDefaults.bool(forKey: useSSLPinningKey)
|
|
73
|
-
|
|
74
|
-
if isSSLPinningEnabled {
|
|
75
|
-
do {
|
|
76
|
-
// Parse JSON configuration
|
|
77
|
-
guard let jsonData = configJsonString.data(using: .utf8),
|
|
78
|
-
let config = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any],
|
|
79
|
-
let sha256Keys = config["sha256Keys"] as? [String: [String]] else {
|
|
80
|
-
throw SSLPinningError.invalidConfiguration
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Build pinned domains configuration
|
|
84
|
-
var pinnedDomains: [String: Any] = [:]
|
|
85
|
-
|
|
86
|
-
// Process each domain and its pins from JSON
|
|
87
|
-
for (domain, pins) in sha256Keys {
|
|
88
|
-
let cleanedPins = try pins.map { pin -> String in
|
|
89
|
-
// Validate and clean the pin
|
|
90
|
-
var cleanPin = pin.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
91
|
-
|
|
92
|
-
// Verify pin format
|
|
93
|
-
guard cleanPin.starts(with: "sha256/") else {
|
|
94
|
-
NSLog("Invalid pin format for domain %@: %@", domain, cleanPin)
|
|
95
|
-
throw SSLPinningError.invalidPinConfiguration(domain: domain)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Remove sha256/ prefix for TrustKit
|
|
99
|
-
cleanPin = cleanPin.replacingOccurrences(of: "sha256/", with: "")
|
|
100
|
-
|
|
101
|
-
return cleanPin
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
pinnedDomains[domain] = [
|
|
105
|
-
kTSKIncludeSubdomains: true,
|
|
106
|
-
kTSKEnforcePinning: true,
|
|
107
|
-
kTSKDisableDefaultReportUri: true,
|
|
108
|
-
kTSKPublicKeyHashes: cleanedPins
|
|
109
|
-
]
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
let trustKitConfig: [String: Any] = [
|
|
113
|
-
kTSKSwizzleNetworkDelegates: true,
|
|
114
|
-
kTSKPinnedDomains: pinnedDomains
|
|
115
|
-
]
|
|
116
|
-
|
|
117
|
-
DispatchQueue.main.async {
|
|
118
|
-
// Initialize TrustKit with the configuration
|
|
119
|
-
TrustKit.initSharedInstance(withConfiguration: trustKitConfig)
|
|
120
|
-
|
|
121
|
-
// Set up validation callback
|
|
122
|
-
TrustKit.sharedInstance().pinningValidatorCallback = { result, notedHostname, policy in
|
|
123
|
-
switch result.finalTrustDecision {
|
|
124
|
-
case .shouldBlockConnection:
|
|
125
|
-
NSLog("⛔️ SSL Pinning failed for domain: %@", notedHostname)
|
|
126
|
-
NSLog("Policy details: %@", policy)
|
|
127
|
-
case .shouldAllowConnection:
|
|
128
|
-
NSLog("✅ SSL Pinning succeeded for domain: %@", notedHostname)
|
|
129
|
-
default:
|
|
130
|
-
NSLog("⚠️ Unexpected SSL Pinning result for domain: %@", notedHostname)
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
NSLog("✅ TrustKit initialized with config: %@", trustKitConfig)
|
|
135
|
-
resolve([
|
|
136
|
-
"message": "SSL Pinning initialized successfully",
|
|
137
|
-
"domains": Array(pinnedDomains.keys)
|
|
138
|
-
])
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
} catch let error as SSLPinningError {
|
|
142
|
-
NSLog("❌ SSL Pinning Error: %@", error.message)
|
|
143
|
-
reject("SSL_PINNING_ERROR", error.message, error)
|
|
144
|
-
} catch {
|
|
145
|
-
NSLog("❌ Unexpected Error: %@", error.localizedDescription)
|
|
146
|
-
reject("SSL_PINNING_ERROR", "Unexpected error during SSL pinning initialization", error)
|
|
147
|
-
}
|
|
148
|
-
} else {
|
|
149
|
-
NSLog("⚠️ SSL Pinning is disabled",isSSLPinningEnabled)
|
|
150
|
-
resolve([
|
|
151
|
-
"message": "SSL Pinning is disabled",
|
|
152
|
-
"domains": [],
|
|
153
|
-
"isSSLPinningEnabled": isSSLPinningEnabled
|
|
154
|
-
])
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
@objc
|
|
159
|
-
func setUseSSLPinning(_ usePinning: Bool) {
|
|
160
|
-
userDefaults.set(usePinning, forKey: useSSLPinningKey)
|
|
161
|
-
userDefaults.synchronize()
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
@objc
|
|
165
|
-
func getUseSSLPinning(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
|
|
166
|
-
let usePinning = userDefaults.bool(forKey: useSSLPinningKey)
|
|
167
|
-
resolve(usePinning)
|
|
168
|
-
}
|
|
169
|
-
}
|