mirror of
https://github.com/Finb/Bark.git
synced 2025-12-08 21:36:01 +00:00
复制加密推送发送脚本示例
This commit is contained in:
parent
27faf3e75b
commit
4c7727ff00
@ -11,7 +11,7 @@ import UIKit
|
||||
|
||||
class CryptoSettingController: BaseViewController<CryptoSettingViewModel> {
|
||||
let algorithmFeild = DropBoxView(values: ["AES128", "AES192", "AES256"])
|
||||
let modeFeild = DropBoxView(values: ["CBC", "ECB", "GCM"])
|
||||
let modeFeild = DropBoxView(values: ["CBC", "ECB"])
|
||||
let paddingField = DropBoxView(values: ["pkcs7"])
|
||||
|
||||
let keyTextField: BorderTextField = {
|
||||
@ -149,7 +149,6 @@ class CryptoSettingController: BaseViewController<CryptoSettingViewModel> {
|
||||
make.top.equalTo(ivLabel.snp.bottom).offset(5)
|
||||
}
|
||||
|
||||
|
||||
copyButton.snp.makeConstraints { make in
|
||||
make.left.equalTo(ivTextField)
|
||||
make.right.equalTo(ivTextField)
|
||||
@ -202,25 +201,42 @@ class CryptoSettingController: BaseViewController<CryptoSettingViewModel> {
|
||||
.asDriver(onErrorDriveWith: .empty())
|
||||
))
|
||||
|
||||
output.algorithmList
|
||||
.map { $0.map { $0.rawValue }}
|
||||
.drive(self.algorithmFeild.rx.values)
|
||||
.disposed(by: rx.disposeBag)
|
||||
output.initial.drive(onNext: { [weak self] val in
|
||||
self?.algorithmFeild.values = val.algorithmList.map { $0.rawValue }
|
||||
self?.modeFeild.values = val.modeList
|
||||
self?.paddingField.values = val.paddingList
|
||||
if let fields = val.initialFields {
|
||||
self?.algorithmFeild.currentValue = fields.algorithm
|
||||
self?.modeFeild.currentValue = fields.mode
|
||||
self?.paddingField.currentValue = fields.padding
|
||||
self?.keyTextField.text = fields.key
|
||||
self?.ivTextField.text = fields.iv
|
||||
}
|
||||
}).disposed(by: rx.disposeBag)
|
||||
|
||||
output.modeList
|
||||
output.modeListChanged
|
||||
.drive(self.modeFeild.rx.values)
|
||||
.disposed(by: rx.disposeBag)
|
||||
|
||||
output.paddingList
|
||||
output.paddingListChanged
|
||||
.drive(self.paddingField.rx.values)
|
||||
.disposed(by: rx.disposeBag)
|
||||
|
||||
output.keyLenght.drive(onNext: { [weak self] keyLenght in
|
||||
|
||||
output.keyLenghtChanged.drive(onNext: { [weak self] keyLenght in
|
||||
self?.keyTextField.placeholder = String(format: NSLocalizedString("enterKey"), keyLenght)
|
||||
}).disposed(by: rx.disposeBag)
|
||||
|
||||
|
||||
output.showSnackbar.drive(onNext: { text in
|
||||
HUDError(text)
|
||||
}).disposed(by: rx.disposeBag)
|
||||
|
||||
output.done.drive(onNext: { [weak self] in
|
||||
self?.navigationController?.dismiss(animated: true)
|
||||
}).disposed(by: rx.disposeBag)
|
||||
|
||||
output.copy.drive(onNext: { text in
|
||||
UIPasteboard.general.string = text
|
||||
HUDSuccess(NSLocalizedString("Copy"))
|
||||
}).disposed(by: rx.disposeBag)
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,22 +19,27 @@ class CryptoSettingViewModel: ViewModel, ViewModelType {
|
||||
}
|
||||
|
||||
struct Output {
|
||||
let algorithmList: Driver<[Algorithm]>
|
||||
let modeList: Driver<[String]>
|
||||
let paddingList: Driver<[String]>
|
||||
let keyLenght: Driver<Int>
|
||||
var showSnackbar: Driver<String>
|
||||
let initial: Driver<(algorithmList: [Algorithm], modeList: [String], paddingList: [String], initialFields: CryptoSettingFields?)>
|
||||
let modeListChanged: Driver<[String]>
|
||||
let paddingListChanged: Driver<[String]>
|
||||
let keyLenghtChanged: Driver<Int>
|
||||
let showSnackbar: Driver<String>
|
||||
let done: Driver<Void>
|
||||
let copy: Driver<String>
|
||||
}
|
||||
|
||||
struct Dependencies {
|
||||
let settingFieldRelay: BehaviorRelay<CryptoSettingFields?>
|
||||
let deviceKey: Driver<String>
|
||||
}
|
||||
|
||||
private let dependencies: Dependencies
|
||||
|
||||
init(dependencies: Dependencies =
|
||||
Dependencies(
|
||||
settingFieldRelay: CryptoSettingRelay.shared.fields
|
||||
settingFieldRelay: CryptoSettingRelay.shared.fields,
|
||||
// Key 好像没有对应的事件流,先“just”,懒得写了
|
||||
deviceKey: Driver.just(ServerManager.shared.currentServer.key)
|
||||
)
|
||||
) {
|
||||
self.dependencies = dependencies
|
||||
@ -49,13 +54,18 @@ class CryptoSettingViewModel: ViewModel, ViewModelType {
|
||||
.compactMap { Algorithm(rawValue: $0) }
|
||||
.map { $0.modes }
|
||||
|
||||
let keyLenght = input
|
||||
.algorithmChanged
|
||||
.compactMap { Algorithm(rawValue: $0) }
|
||||
.map { $0.keyLenght }
|
||||
let keyLenght =
|
||||
Driver.merge([
|
||||
Driver.just(dependencies.settingFieldRelay.value)
|
||||
.compactMap { $0 }
|
||||
.compactMap { Algorithm(rawValue: $0.algorithm)?.keyLenght },
|
||||
input
|
||||
.algorithmChanged
|
||||
.compactMap { Algorithm(rawValue: $0)?.keyLenght },
|
||||
])
|
||||
|
||||
// 保存配置
|
||||
input.done
|
||||
let done = input.done
|
||||
.filter { fields in
|
||||
do {
|
||||
_ = try AESCryptoModel(cryptoFields: fields)
|
||||
@ -65,17 +75,65 @@ class CryptoSettingViewModel: ViewModel, ViewModelType {
|
||||
showSnackbar.accept(error.rawString())
|
||||
return false
|
||||
}
|
||||
}.drive(onNext: { [weak self] fields in
|
||||
// 保存设置
|
||||
self?.dependencies.settingFieldRelay.accept(fields)
|
||||
}).disposed(by: rx.disposeBag)
|
||||
}
|
||||
done.drive(onNext: { [weak self] fields in
|
||||
// 保存设置
|
||||
self?.dependencies.settingFieldRelay.accept(fields)
|
||||
}).disposed(by: rx.disposeBag)
|
||||
|
||||
let copyScript = input.copyScript
|
||||
.filter { [weak self] fields in
|
||||
do {
|
||||
_ = try AESCryptoModel(cryptoFields: fields)
|
||||
// 保存配置
|
||||
self?.dependencies.settingFieldRelay.accept(fields)
|
||||
return true
|
||||
}
|
||||
catch {
|
||||
showSnackbar.accept(error.rawString())
|
||||
return false
|
||||
}
|
||||
}
|
||||
let copy = Driver.combineLatest(copyScript, dependencies.deviceKey)
|
||||
.map { fields, deviceKey in
|
||||
return
|
||||
"""
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# bark key
|
||||
deviceKey='\(deviceKey)'
|
||||
# push payload
|
||||
json='{"body": "test"}'
|
||||
|
||||
# must be 16 bytes long
|
||||
key='\(fields.key ?? "")'
|
||||
iv='\(fields.iv ?? "")'
|
||||
|
||||
# openssl requires Hex encoding of manual keys and IVs, not ASCII encoding.
|
||||
key=$(printf $key | xxd -ps -c 200)
|
||||
iv=$(printf $iv | xxd -ps -c 200)
|
||||
|
||||
ciphertext=$(echo -n $json | openssl enc -aes-\(fields.algorithm.suffix(3))-\(fields.mode.lowercased()) -K $key -iv $iv | base64)
|
||||
echo $ciphertext
|
||||
# curl --data-urlencode "ciphertext=$ciphertext" https://api.day.app/$deviceKey
|
||||
"""
|
||||
}
|
||||
|
||||
return Output(
|
||||
algorithmList: Driver.just([Algorithm.aes128, Algorithm.aes192, Algorithm.aes256]),
|
||||
modeList: Driver.merge(Driver.just(["CBC", "ECB", "GCM"]), modeList),
|
||||
paddingList: Driver.just(["pkcs7"]),
|
||||
keyLenght: Driver.merge(Driver.just(16), keyLenght),
|
||||
showSnackbar: showSnackbar.asDriver(onErrorDriveWith: .empty())
|
||||
initial: Driver.just((
|
||||
algorithmList: [Algorithm.aes128, Algorithm.aes192, Algorithm.aes256],
|
||||
modeList: ["CBC", "ECB"],
|
||||
paddingList: ["okcs7"],
|
||||
initialFields: dependencies.settingFieldRelay.value
|
||||
)),
|
||||
modeListChanged: modeList,
|
||||
paddingListChanged: Driver.just(["pkcs7"]),
|
||||
keyLenghtChanged: keyLenght,
|
||||
showSnackbar: showSnackbar.asDriver(onErrorDriveWith: .empty()),
|
||||
done: done.map { _ in () },
|
||||
copy: copy
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,7 +17,7 @@ enum Algorithm: String {
|
||||
var modes: [String] {
|
||||
switch self {
|
||||
case .aes128, .aes192, .aes256:
|
||||
return ["CBC", "ECB", "GCM"]
|
||||
return ["CBC", "ECB"]
|
||||
}
|
||||
}
|
||||
|
||||
@ -66,7 +66,7 @@ struct AESCryptoModel {
|
||||
}
|
||||
|
||||
var iv = ""
|
||||
if ["CBC", "GCM"].contains(cryptoFields.mode) {
|
||||
if ["CBC"].contains(cryptoFields.mode) {
|
||||
if let ivField = cryptoFields.iv, ivField.count == 16 {
|
||||
iv = ivField
|
||||
}
|
||||
@ -81,8 +81,6 @@ struct AESCryptoModel {
|
||||
mode = CBC(iv: iv.bytes)
|
||||
case "ECB":
|
||||
mode = ECB()
|
||||
case "GCM":
|
||||
mode = GCM(iv: iv.bytes)
|
||||
default:
|
||||
throw "Invalid Mode"
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user