mirror of
https://github.com/xweiba/location-spoofer.git
synced 2026-09-22 06:40:44 +08:00
- iOS 虚拟定位工具,基于本地 HTTP 代理 MITM 方案 - MapKit 原生地图体验,支持搜索、收藏、实时定位 - 完整的设置引导流程(证书安装、WiFi 代理配置、环境验证) - 支持 iOS 15+,SwiftUI 构建
47 lines
2.3 KiB
Swift
47 lines
2.3 KiB
Swift
import Foundation
|
|
|
|
final class CertificateAuthorityStore {
|
|
private let directory: URL
|
|
private let generator: () throws -> CertificateAuthority
|
|
private let certificateURL: URL
|
|
private let keyURL: URL
|
|
|
|
init(directory: URL = AppGroup.containerURL.appendingPathComponent("CertificateAuthority", isDirectory: true), generator: @escaping () throws -> CertificateAuthority = CoreBridge.generateCertificateAuthority) {
|
|
self.directory = directory
|
|
self.generator = generator
|
|
self.certificateURL = directory.appendingPathComponent("ca-cert.pem")
|
|
self.keyURL = directory.appendingPathComponent("ca-key.pem")
|
|
}
|
|
|
|
func ensure() throws -> CertificateAuthority {
|
|
if let current = try load() {
|
|
RuntimeLogger.debug("SHARED", "Certificate.store", "读取已有 CA 文件", details: ["directory": directory.path])
|
|
return current
|
|
}
|
|
RuntimeLogger.info("SHARED", "Certificate.store", "未找到 CA 文件,开始生成", details: ["directory": directory.path])
|
|
let authority = try generator()
|
|
try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
|
|
guard let certificateData = authority.certPEM.data(using: .utf8),
|
|
let keyData = authority.keyPEM.data(using: .utf8) else {
|
|
throw CocoaError(.fileWriteInapplicableStringEncoding)
|
|
}
|
|
try certificateData.write(to: certificateURL, options: .atomic)
|
|
try keyData.write(to: keyURL, options: .atomic)
|
|
applyCompleteProtection(to: certificateURL)
|
|
applyCompleteProtection(to: keyURL)
|
|
RuntimeLogger.info("SHARED", "Certificate.store", "CA 文件写入完成", details: ["directory": directory.path])
|
|
return authority
|
|
}
|
|
|
|
func load() throws -> CertificateAuthority? {
|
|
guard FileManager.default.fileExists(atPath: certificateURL.path), FileManager.default.fileExists(atPath: keyURL.path) else { return nil }
|
|
return CertificateAuthority(certPEM: try String(contentsOf: certificateURL, encoding: .utf8), keyPEM: try String(contentsOf: keyURL, encoding: .utf8))
|
|
}
|
|
|
|
private func applyCompleteProtection(to url: URL) {
|
|
#if os(iOS)
|
|
try? FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: url.path)
|
|
#endif
|
|
}
|
|
}
|