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.
Files changed (34) hide show
  1. package/README.md +319 -58
  2. package/android/build.gradle +23 -1
  3. package/android/src/main/java/com/usesslpinning/SslPinningFactory.kt +94 -0
  4. package/android/src/main/java/com/usesslpinning/UseSslPinningModuleImpl.kt +34 -0
  5. package/android/src/newarch/com/usesslpinning/UseSslPinningModule.kt +26 -0
  6. package/android/src/newarch/com/usesslpinning/UseSslPinningPackage.kt +36 -0
  7. package/android/src/oldarch/com/usesslpinning/UseSslPinningModule.kt +32 -0
  8. package/android/src/{main/java → oldarch}/com/usesslpinning/UseSslPinningPackage.kt +0 -1
  9. package/android/ssl-pinning-setup.gradle +148 -0
  10. package/expo-module.config.json +10 -0
  11. package/ios/SharedLogic.swift +247 -0
  12. package/ios/UseSslPinning.h +5 -0
  13. package/ios/{UseSslPinning.mm → UseSslPinningModule.mm} +9 -6
  14. package/ios/UseSslPinningModule.swift +65 -0
  15. package/lib/NativeUseSslPinning.d.ts +8 -0
  16. package/lib/NativeUseSslPinning.d.ts.map +1 -0
  17. package/lib/NativeUseSslPinning.js +4 -0
  18. package/lib/UseSslPinning.types.d.ts +17 -0
  19. package/lib/UseSslPinning.types.d.ts.map +1 -0
  20. package/lib/UseSslPinning.types.js +2 -0
  21. package/lib/index.d.ts +15 -0
  22. package/lib/index.d.ts.map +1 -0
  23. package/lib/index.js +58 -0
  24. package/package.json +82 -39
  25. package/react-native-ssl-manager.podspec +87 -38
  26. package/react-native.config.js +34 -0
  27. package/scripts/build.sh +52 -0
  28. package/src/NativeUseSslPinning.ts +9 -0
  29. package/src/UseSslPinning.types.ts +17 -0
  30. package/src/index.tsx +53 -33
  31. package/android/src/main/java/com/usesslpinning/UseSslPinningFactory.kt +0 -50
  32. package/android/src/main/java/com/usesslpinning/UseSslPinningModule.kt +0 -45
  33. package/ios/UseSslPinning-Bridging-Header.h +0 -2
  34. package/ios/UseSslPinning.swift +0 -169
@@ -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
- }