diff --git a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/api.pb.swift b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/api.pb.swift index 243231ce..98ffd7b2 100644 --- a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/api.pb.swift +++ b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/api.pb.swift @@ -457,10 +457,10 @@ public struct Api_MWResponse { set {response = .respGeneratePersona(newValue)} } - public var respPostEncryption: Api_PostEncrypedResp { + public var respPostEncryption: Api_PostEncryptedResp { get { if case .respPostEncryption(let v)? = response {return v} - return Api_PostEncrypedResp() + return Api_PostEncryptedResp() } set {response = .respPostEncryption(newValue)} } @@ -486,7 +486,7 @@ public struct Api_MWResponse { case respGetStoredKeyExportType(Api_GetKeyStoreSupportExportTypeResp) case respGenerateMnemonic(Api_GenerateMnemonicResp) case respGeneratePersona(Api_PersonaGenerationResp) - case respPostEncryption(Api_PostEncrypedResp) + case respPostEncryption(Api_PostEncryptedResp) #if !swift(>=4.1) public static func ==(lhs: Api_MWResponse.OneOf_Response, rhs: Api_MWResponse.OneOf_Response) -> Bool { @@ -1264,7 +1264,7 @@ extension Api_MWResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement } }() case 26: try { - var v: Api_PostEncrypedResp? + var v: Api_PostEncryptedResp? var hadOneofValue = false if let current = self.response { hadOneofValue = true diff --git a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/base.pb.swift b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/base.pb.swift index c4d5d167..9afd38fb 100644 --- a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/base.pb.swift +++ b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/base.pb.swift @@ -325,6 +325,75 @@ extension Api_EncryptOption.Version: CaseIterable { #endif // swift(>=4.2) +public struct Api_JWK { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var crv: String = String() + + public var ext: Bool = false + + public var x: String = String() + + public var y: String = String() + + public var keyOps: [String] = [] + + public var kty: String = String() + + public var d: String { + get {return _d ?? String()} + set {_d = newValue} + } + /// Returns true if `d` has been explicitly set. + public var hasD: Bool {return self._d != nil} + /// Clears the value of `d`. Subsequent reads from it will return its default value. + public mutating func clearD() {self._d = nil} + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _d: String? = nil +} + +public struct Api_AesJWK { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var alg: String = String() + + public var ext: Bool = false + + public var k: String = String() + + public var keyOps: [String] = [] + + public var kty: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_E2EEncryptParam { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var localKeyData: Data = Data() + + public var target: Dictionary = [:] + + public var authorPrivateKey: Data = Data() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + #if swift(>=5.5) && canImport(_Concurrency) extension Api_Coin: @unchecked Sendable {} extension Api_StoredKeyType: @unchecked Sendable {} @@ -335,6 +404,9 @@ extension Api_StoredKeyInfo: @unchecked Sendable {} extension Api_StoredKeyAccountInfo: @unchecked Sendable {} extension Api_EncryptOption: @unchecked Sendable {} extension Api_EncryptOption.Version: @unchecked Sendable {} +extension Api_JWK: @unchecked Sendable {} +extension Api_AesJWK: @unchecked Sendable {} +extension Api_E2EEncryptParam: @unchecked Sendable {} #endif // swift(>=5.5) && canImport(_Concurrency) // MARK: - Code below here is support for the SwiftProtobuf runtime. @@ -523,3 +595,175 @@ extension Api_EncryptOption.Version: SwiftProtobuf._ProtoNameProviding { 1: .same(proto: "V38"), ] } + +extension Api_JWK: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".JWK" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "crv"), + 3: .same(proto: "ext"), + 4: .same(proto: "x"), + 5: .same(proto: "y"), + 6: .standard(proto: "key_ops"), + 7: .same(proto: "kty"), + 8: .same(proto: "d"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.crv) }() + case 3: try { try decoder.decodeSingularBoolField(value: &self.ext) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.x) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.y) }() + case 6: try { try decoder.decodeRepeatedStringField(value: &self.keyOps) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.kty) }() + case 8: try { try decoder.decodeSingularStringField(value: &self._d) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if !self.crv.isEmpty { + try visitor.visitSingularStringField(value: self.crv, fieldNumber: 1) + } + if self.ext != false { + try visitor.visitSingularBoolField(value: self.ext, fieldNumber: 3) + } + if !self.x.isEmpty { + try visitor.visitSingularStringField(value: self.x, fieldNumber: 4) + } + if !self.y.isEmpty { + try visitor.visitSingularStringField(value: self.y, fieldNumber: 5) + } + if !self.keyOps.isEmpty { + try visitor.visitRepeatedStringField(value: self.keyOps, fieldNumber: 6) + } + if !self.kty.isEmpty { + try visitor.visitSingularStringField(value: self.kty, fieldNumber: 7) + } + try { if let v = self._d { + try visitor.visitSingularStringField(value: v, fieldNumber: 8) + } }() + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_JWK, rhs: Api_JWK) -> Bool { + if lhs.crv != rhs.crv {return false} + if lhs.ext != rhs.ext {return false} + if lhs.x != rhs.x {return false} + if lhs.y != rhs.y {return false} + if lhs.keyOps != rhs.keyOps {return false} + if lhs.kty != rhs.kty {return false} + if lhs._d != rhs._d {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_AesJWK: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".AesJWK" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "alg"), + 2: .same(proto: "ext"), + 3: .same(proto: "k"), + 4: .standard(proto: "key_ops"), + 5: .same(proto: "kty"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.alg) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.ext) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.k) }() + case 4: try { try decoder.decodeRepeatedStringField(value: &self.keyOps) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.kty) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.alg.isEmpty { + try visitor.visitSingularStringField(value: self.alg, fieldNumber: 1) + } + if self.ext != false { + try visitor.visitSingularBoolField(value: self.ext, fieldNumber: 2) + } + if !self.k.isEmpty { + try visitor.visitSingularStringField(value: self.k, fieldNumber: 3) + } + if !self.keyOps.isEmpty { + try visitor.visitRepeatedStringField(value: self.keyOps, fieldNumber: 4) + } + if !self.kty.isEmpty { + try visitor.visitSingularStringField(value: self.kty, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_AesJWK, rhs: Api_AesJWK) -> Bool { + if lhs.alg != rhs.alg {return false} + if lhs.ext != rhs.ext {return false} + if lhs.k != rhs.k {return false} + if lhs.keyOps != rhs.keyOps {return false} + if lhs.kty != rhs.kty {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_E2EEncryptParam: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".E2EEncryptParam" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "localKeyData"), + 2: .same(proto: "target"), + 3: .same(proto: "authorPrivateKey"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.localKeyData) }() + case 2: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: &self.target) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.authorPrivateKey) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.localKeyData.isEmpty { + try visitor.visitSingularBytesField(value: self.localKeyData, fieldNumber: 1) + } + if !self.target.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: self.target, fieldNumber: 2) + } + if !self.authorPrivateKey.isEmpty { + try visitor.visitSingularBytesField(value: self.authorPrivateKey, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_E2EEncryptParam, rhs: Api_E2EEncryptParam) -> Bool { + if lhs.localKeyData != rhs.localKeyData {return false} + if lhs.target != rhs.target {return false} + if lhs.authorPrivateKey != rhs.authorPrivateKey {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} diff --git a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/persona.pb.swift b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/persona.pb.swift index 129ca7b4..16af898c 100644 --- a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/persona.pb.swift +++ b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/persona.pb.swift @@ -60,8 +60,8 @@ public struct Api_PersonaGenerationResp { set {_uniqueStorage()._identifier = newValue} } - public var privateKey: Api_JWKResp { - get {return _storage._privateKey ?? Api_JWKResp()} + public var privateKey: Api_JWK { + get {return _storage._privateKey ?? Api_JWK()} set {_uniqueStorage()._privateKey = newValue} } /// Returns true if `privateKey` has been explicitly set. @@ -69,8 +69,8 @@ public struct Api_PersonaGenerationResp { /// Clears the value of `privateKey`. Subsequent reads from it will return its default value. public mutating func clearPrivateKey() {_uniqueStorage()._privateKey = nil} - public var publicKey: Api_JWKResp { - get {return _storage._publicKey ?? Api_JWKResp()} + public var publicKey: Api_JWK { + get {return _storage._publicKey ?? Api_JWK()} set {_uniqueStorage()._publicKey = newValue} } /// Returns true if `publicKey` has been explicitly set. @@ -78,8 +78,8 @@ public struct Api_PersonaGenerationResp { /// Clears the value of `publicKey`. Subsequent reads from it will return its default value. public mutating func clearPublicKey() {_uniqueStorage()._publicKey = nil} - public var localKey: Api_AesJWKResp { - get {return _storage._localKey ?? Api_AesJWKResp()} + public var localKey: Api_AesJWK { + get {return _storage._localKey ?? Api_AesJWK()} set {_uniqueStorage()._localKey = newValue} } /// Returns true if `localKey` has been explicitly set. @@ -103,64 +103,9 @@ public struct Api_PersonaGenerationResp { fileprivate var _storage = _StorageClass.defaultInstance } -public struct Api_JWKResp { - // SwiftProtobuf.Message conformance is added in an extension below. See the - // `Message` and `Message+*Additions` files in the SwiftProtobuf library for - // methods supported on all messages. - - public var crv: String = String() - - public var ext: Bool = false - - public var x: String = String() - - public var y: String = String() - - public var keyOps: [String] = [] - - public var kty: String = String() - - public var d: String { - get {return _d ?? String()} - set {_d = newValue} - } - /// Returns true if `d` has been explicitly set. - public var hasD: Bool {return self._d != nil} - /// Clears the value of `d`. Subsequent reads from it will return its default value. - public mutating func clearD() {self._d = nil} - - public var unknownFields = SwiftProtobuf.UnknownStorage() - - public init() {} - - fileprivate var _d: String? = nil -} - -public struct Api_AesJWKResp { - // SwiftProtobuf.Message conformance is added in an extension below. See the - // `Message` and `Message+*Additions` files in the SwiftProtobuf library for - // methods supported on all messages. - - public var alg: String = String() - - public var ext: Bool = false - - public var k: String = String() - - public var keyOps: [String] = [] - - public var kty: String = String() - - public var unknownFields = SwiftProtobuf.UnknownStorage() - - public init() {} -} - #if swift(>=5.5) && canImport(_Concurrency) extension Api_PersonaGenerationParam: @unchecked Sendable {} extension Api_PersonaGenerationResp: @unchecked Sendable {} -extension Api_JWKResp: @unchecked Sendable {} -extension Api_AesJWKResp: @unchecked Sendable {} #endif // swift(>=5.5) && canImport(_Concurrency) // MARK: - Code below here is support for the SwiftProtobuf runtime. @@ -239,9 +184,9 @@ extension Api_PersonaGenerationResp: SwiftProtobuf.Message, SwiftProtobuf._Messa fileprivate class _StorageClass { var _identifier: String = String() - var _privateKey: Api_JWKResp? = nil - var _publicKey: Api_JWKResp? = nil - var _localKey: Api_AesJWKResp? = nil + var _privateKey: Api_JWK? = nil + var _publicKey: Api_JWK? = nil + var _localKey: Api_AesJWK? = nil var _option: Api_EncryptOption? = nil static let defaultInstance = _StorageClass() @@ -326,131 +271,3 @@ extension Api_PersonaGenerationResp: SwiftProtobuf.Message, SwiftProtobuf._Messa return true } } - -extension Api_JWKResp: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".JWKResp" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .same(proto: "crv"), - 3: .same(proto: "ext"), - 4: .same(proto: "x"), - 5: .same(proto: "y"), - 6: .standard(proto: "key_ops"), - 7: .same(proto: "kty"), - 8: .same(proto: "d"), - ] - - public mutating func decodeMessage(decoder: inout D) throws { - while let fieldNumber = try decoder.nextFieldNumber() { - // The use of inline closures is to circumvent an issue where the compiler - // allocates stack space for every case branch when no optimizations are - // enabled. https://github.com/apple/swift-protobuf/issues/1034 - switch fieldNumber { - case 1: try { try decoder.decodeSingularStringField(value: &self.crv) }() - case 3: try { try decoder.decodeSingularBoolField(value: &self.ext) }() - case 4: try { try decoder.decodeSingularStringField(value: &self.x) }() - case 5: try { try decoder.decodeSingularStringField(value: &self.y) }() - case 6: try { try decoder.decodeRepeatedStringField(value: &self.keyOps) }() - case 7: try { try decoder.decodeSingularStringField(value: &self.kty) }() - case 8: try { try decoder.decodeSingularStringField(value: &self._d) }() - default: break - } - } - } - - public func traverse(visitor: inout V) throws { - // The use of inline closures is to circumvent an issue where the compiler - // allocates stack space for every if/case branch local when no optimizations - // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and - // https://github.com/apple/swift-protobuf/issues/1182 - if !self.crv.isEmpty { - try visitor.visitSingularStringField(value: self.crv, fieldNumber: 1) - } - if self.ext != false { - try visitor.visitSingularBoolField(value: self.ext, fieldNumber: 3) - } - if !self.x.isEmpty { - try visitor.visitSingularStringField(value: self.x, fieldNumber: 4) - } - if !self.y.isEmpty { - try visitor.visitSingularStringField(value: self.y, fieldNumber: 5) - } - if !self.keyOps.isEmpty { - try visitor.visitRepeatedStringField(value: self.keyOps, fieldNumber: 6) - } - if !self.kty.isEmpty { - try visitor.visitSingularStringField(value: self.kty, fieldNumber: 7) - } - try { if let v = self._d { - try visitor.visitSingularStringField(value: v, fieldNumber: 8) - } }() - try unknownFields.traverse(visitor: &visitor) - } - - public static func ==(lhs: Api_JWKResp, rhs: Api_JWKResp) -> Bool { - if lhs.crv != rhs.crv {return false} - if lhs.ext != rhs.ext {return false} - if lhs.x != rhs.x {return false} - if lhs.y != rhs.y {return false} - if lhs.keyOps != rhs.keyOps {return false} - if lhs.kty != rhs.kty {return false} - if lhs._d != rhs._d {return false} - if lhs.unknownFields != rhs.unknownFields {return false} - return true - } -} - -extension Api_AesJWKResp: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".AesJWKResp" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .same(proto: "alg"), - 2: .same(proto: "ext"), - 3: .same(proto: "k"), - 4: .standard(proto: "key_ops"), - 5: .same(proto: "kty"), - ] - - public mutating func decodeMessage(decoder: inout D) throws { - while let fieldNumber = try decoder.nextFieldNumber() { - // The use of inline closures is to circumvent an issue where the compiler - // allocates stack space for every case branch when no optimizations are - // enabled. https://github.com/apple/swift-protobuf/issues/1034 - switch fieldNumber { - case 1: try { try decoder.decodeSingularStringField(value: &self.alg) }() - case 2: try { try decoder.decodeSingularBoolField(value: &self.ext) }() - case 3: try { try decoder.decodeSingularStringField(value: &self.k) }() - case 4: try { try decoder.decodeRepeatedStringField(value: &self.keyOps) }() - case 5: try { try decoder.decodeSingularStringField(value: &self.kty) }() - default: break - } - } - } - - public func traverse(visitor: inout V) throws { - if !self.alg.isEmpty { - try visitor.visitSingularStringField(value: self.alg, fieldNumber: 1) - } - if self.ext != false { - try visitor.visitSingularBoolField(value: self.ext, fieldNumber: 2) - } - if !self.k.isEmpty { - try visitor.visitSingularStringField(value: self.k, fieldNumber: 3) - } - if !self.keyOps.isEmpty { - try visitor.visitRepeatedStringField(value: self.keyOps, fieldNumber: 4) - } - if !self.kty.isEmpty { - try visitor.visitSingularStringField(value: self.kty, fieldNumber: 5) - } - try unknownFields.traverse(visitor: &visitor) - } - - public static func ==(lhs: Api_AesJWKResp, rhs: Api_AesJWKResp) -> Bool { - if lhs.alg != rhs.alg {return false} - if lhs.ext != rhs.ext {return false} - if lhs.k != rhs.k {return false} - if lhs.keyOps != rhs.keyOps {return false} - if lhs.kty != rhs.kty {return false} - if lhs.unknownFields != rhs.unknownFields {return false} - return true - } -} diff --git a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/post-encryption.pb.swift b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/post-encryption.pb.swift index 098920e4..e7f83d79 100644 --- a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/post-encryption.pb.swift +++ b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/ProtobufGeneration/post-encryption.pb.swift @@ -69,16 +69,13 @@ public struct Api_PostEncryptionParam { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + public var version: Api_EncryptOption.Version = .v37 + + public var isPlublic: Bool = false + public var content: String = String() - public var network: String { - get {return _network ?? String()} - set {_network = newValue} - } - /// Returns true if `network` has been explicitly set. - public var hasNetwork: Bool {return self._network != nil} - /// Clears the value of `network`. Subsequent reads from it will return its default value. - public mutating func clearNetwork() {self._network = nil} + public var network: String = String() public var authorPublicKeyData: Data { get {return _authorPublicKeyData ?? Data()} @@ -107,25 +104,71 @@ public struct Api_PostEncryptionParam { /// Clears the value of `authorPublicKeyAlgr`. Subsequent reads from it will return its default value. public mutating func clearAuthorPublicKeyAlgr() {self._authorPublicKeyAlgr = nil} - public var version: Api_EncryptOption.Version = .v37 + public var param: Api_E2EEncryptParam { + get {return _param ?? Api_E2EEncryptParam()} + set {_param = newValue} + } + /// Returns true if `param` has been explicitly set. + public var hasParam: Bool {return self._param != nil} + /// Clears the value of `param`. Subsequent reads from it will return its default value. + public mutating func clearParam() {self._param = nil} public var unknownFields = SwiftProtobuf.UnknownStorage() public init() {} - fileprivate var _network: String? = nil fileprivate var _authorPublicKeyData: Data? = nil fileprivate var _authorUserID: String? = nil fileprivate var _authorPublicKeyAlgr: Api_PublicKeyAlgorithm? = nil + fileprivate var _param: Api_E2EEncryptParam? = nil +} + +public struct Api_E2EEncryptionResult { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var iv: Data { + get {return _iv ?? Data()} + set {_iv = newValue} + } + /// Returns true if `iv` has been explicitly set. + public var hasIv: Bool {return self._iv != nil} + /// Clears the value of `iv`. Subsequent reads from it will return its default value. + public mutating func clearIv() {self._iv = nil} + + public var encryptedPostKeyData: Data = Data() + + public var ephemeralPublicKeyData: Data { + get {return _ephemeralPublicKeyData ?? Data()} + set {_ephemeralPublicKeyData = newValue} + } + /// Returns true if `ephemeralPublicKeyData` has been explicitly set. + public var hasEphemeralPublicKeyData: Bool {return self._ephemeralPublicKeyData != nil} + /// Clears the value of `ephemeralPublicKeyData`. Subsequent reads from it will return its default value. + public mutating func clearEphemeralPublicKeyData() {self._ephemeralPublicKeyData = nil} + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _iv: Data? = nil + fileprivate var _ephemeralPublicKeyData: Data? = nil } -public struct Api_PostEncrypedResp { +public struct Api_PostEncryptedResp { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. public var content: String = String() + public var postIdentifier: String = String() + + public var postKey: Data = Data() + + public var results: Dictionary = [:] + public var unknownFields = SwiftProtobuf.UnknownStorage() public init() {} @@ -134,7 +177,8 @@ public struct Api_PostEncrypedResp { #if swift(>=5.5) && canImport(_Concurrency) extension Api_PublicKeyAlgorithm: @unchecked Sendable {} extension Api_PostEncryptionParam: @unchecked Sendable {} -extension Api_PostEncrypedResp: @unchecked Sendable {} +extension Api_E2EEncryptionResult: @unchecked Sendable {} +extension Api_PostEncryptedResp: @unchecked Sendable {} #endif // swift(>=5.5) && canImport(_Concurrency) // MARK: - Code below here is support for the SwiftProtobuf runtime. @@ -152,12 +196,14 @@ extension Api_PublicKeyAlgorithm: SwiftProtobuf._ProtoNameProviding { extension Api_PostEncryptionParam: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { public static let protoMessageName: String = _protobuf_package + ".PostEncryptionParam" public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .same(proto: "content"), - 2: .same(proto: "network"), - 3: .same(proto: "authorPublicKeyData"), - 4: .same(proto: "authorUserId"), - 5: .same(proto: "authorPublicKeyAlgr"), - 6: .same(proto: "version"), + 1: .same(proto: "version"), + 2: .same(proto: "isPlublic"), + 3: .same(proto: "content"), + 4: .same(proto: "network"), + 5: .same(proto: "authorPublicKeyData"), + 6: .same(proto: "authorUserId"), + 7: .same(proto: "authorPublicKeyAlgr"), + 8: .same(proto: "param"), ] public mutating func decodeMessage(decoder: inout D) throws { @@ -166,12 +212,14 @@ extension Api_PostEncryptionParam: SwiftProtobuf.Message, SwiftProtobuf._Message // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularStringField(value: &self.content) }() - case 2: try { try decoder.decodeSingularStringField(value: &self._network) }() - case 3: try { try decoder.decodeSingularBytesField(value: &self._authorPublicKeyData) }() - case 4: try { try decoder.decodeSingularStringField(value: &self._authorUserID) }() - case 5: try { try decoder.decodeSingularEnumField(value: &self._authorPublicKeyAlgr) }() - case 6: try { try decoder.decodeSingularEnumField(value: &self.version) }() + case 1: try { try decoder.decodeSingularEnumField(value: &self.version) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.isPlublic) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.content) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.network) }() + case 5: try { try decoder.decodeSingularBytesField(value: &self._authorPublicKeyData) }() + case 6: try { try decoder.decodeSingularStringField(value: &self._authorUserID) }() + case 7: try { try decoder.decodeSingularEnumField(value: &self._authorPublicKeyAlgr) }() + case 8: try { try decoder.decodeSingularMessageField(value: &self._param) }() default: break } } @@ -182,43 +230,102 @@ extension Api_PostEncryptionParam: SwiftProtobuf.Message, SwiftProtobuf._Message // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and // https://github.com/apple/swift-protobuf/issues/1182 + if self.version != .v37 { + try visitor.visitSingularEnumField(value: self.version, fieldNumber: 1) + } + if self.isPlublic != false { + try visitor.visitSingularBoolField(value: self.isPlublic, fieldNumber: 2) + } if !self.content.isEmpty { - try visitor.visitSingularStringField(value: self.content, fieldNumber: 1) + try visitor.visitSingularStringField(value: self.content, fieldNumber: 3) + } + if !self.network.isEmpty { + try visitor.visitSingularStringField(value: self.network, fieldNumber: 4) } - try { if let v = self._network { - try visitor.visitSingularStringField(value: v, fieldNumber: 2) - } }() try { if let v = self._authorPublicKeyData { - try visitor.visitSingularBytesField(value: v, fieldNumber: 3) + try visitor.visitSingularBytesField(value: v, fieldNumber: 5) } }() try { if let v = self._authorUserID { - try visitor.visitSingularStringField(value: v, fieldNumber: 4) + try visitor.visitSingularStringField(value: v, fieldNumber: 6) } }() try { if let v = self._authorPublicKeyAlgr { - try visitor.visitSingularEnumField(value: v, fieldNumber: 5) + try visitor.visitSingularEnumField(value: v, fieldNumber: 7) + } }() + try { if let v = self._param { + try visitor.visitSingularMessageField(value: v, fieldNumber: 8) } }() - if self.version != .v37 { - try visitor.visitSingularEnumField(value: self.version, fieldNumber: 6) - } try unknownFields.traverse(visitor: &visitor) } public static func ==(lhs: Api_PostEncryptionParam, rhs: Api_PostEncryptionParam) -> Bool { + if lhs.version != rhs.version {return false} + if lhs.isPlublic != rhs.isPlublic {return false} if lhs.content != rhs.content {return false} - if lhs._network != rhs._network {return false} + if lhs.network != rhs.network {return false} if lhs._authorPublicKeyData != rhs._authorPublicKeyData {return false} if lhs._authorUserID != rhs._authorUserID {return false} if lhs._authorPublicKeyAlgr != rhs._authorPublicKeyAlgr {return false} - if lhs.version != rhs.version {return false} + if lhs._param != rhs._param {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_E2EEncryptionResult: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".E2EEncryptionResult" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "iv"), + 2: .same(proto: "encryptedPostKeyData"), + 3: .same(proto: "ephemeralPublicKeyData"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self._iv) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.encryptedPostKeyData) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self._ephemeralPublicKeyData) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + try { if let v = self._iv { + try visitor.visitSingularBytesField(value: v, fieldNumber: 1) + } }() + if !self.encryptedPostKeyData.isEmpty { + try visitor.visitSingularBytesField(value: self.encryptedPostKeyData, fieldNumber: 2) + } + try { if let v = self._ephemeralPublicKeyData { + try visitor.visitSingularBytesField(value: v, fieldNumber: 3) + } }() + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_E2EEncryptionResult, rhs: Api_E2EEncryptionResult) -> Bool { + if lhs._iv != rhs._iv {return false} + if lhs.encryptedPostKeyData != rhs.encryptedPostKeyData {return false} + if lhs._ephemeralPublicKeyData != rhs._ephemeralPublicKeyData {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } -extension Api_PostEncrypedResp: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".PostEncrypedResp" +extension Api_PostEncryptedResp: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".PostEncryptedResp" public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "content"), + 2: .same(proto: "postIdentifier"), + 3: .same(proto: "postKey"), + 4: .same(proto: "results"), ] public mutating func decodeMessage(decoder: inout D) throws { @@ -228,6 +335,9 @@ extension Api_PostEncrypedResp: SwiftProtobuf.Message, SwiftProtobuf._MessageImp // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { case 1: try { try decoder.decodeSingularStringField(value: &self.content) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.postIdentifier) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.postKey) }() + case 4: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &self.results) }() default: break } } @@ -237,11 +347,23 @@ extension Api_PostEncrypedResp: SwiftProtobuf.Message, SwiftProtobuf._MessageImp if !self.content.isEmpty { try visitor.visitSingularStringField(value: self.content, fieldNumber: 1) } + if !self.postIdentifier.isEmpty { + try visitor.visitSingularStringField(value: self.postIdentifier, fieldNumber: 2) + } + if !self.postKey.isEmpty { + try visitor.visitSingularBytesField(value: self.postKey, fieldNumber: 3) + } + if !self.results.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: self.results, fieldNumber: 4) + } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_PostEncrypedResp, rhs: Api_PostEncrypedResp) -> Bool { + public static func ==(lhs: Api_PostEncryptedResp, rhs: Api_PostEncryptedResp) -> Bool { if lhs.content != rhs.content {return false} + if lhs.postIdentifier != rhs.postIdentifier {return false} + if lhs.postKey != rhs.postKey {return false} + if lhs.results != rhs.results {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } diff --git a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/libs/libmask_wallet_core_mobile.a b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/libs/libmask_wallet_core_mobile.a index 1107a516..5d06dded 100644 Binary files a/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/libs/libmask_wallet_core_mobile.a and b/DevelopmentPod/MaskWalletCore/MaskWalletCore/Classes/libs/libmask_wallet_core_mobile.a differ diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/git-info.json b/DevelopmentPod/MaskbookPlugin/maskbook/git-info.json index 0f43c266..5a2f7742 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/git-info.json +++ b/DevelopmentPod/MaskbookPlugin/maskbook/git-info.json @@ -1,9 +1,9 @@ { - "BUILD_DATE": "2022-06-01T07:53:01.847Z", - "VERSION": "v1.29.12-2348-g181e22679", + "BUILD_DATE": "2022-06-10T07:35:16.065Z", + "VERSION": "v1.29.12-2350-g43c1c2a66", "TAG_NAME": "v2.5.0", - "COMMIT_HASH": "181e22679", - "COMMIT_DATE": "2022-06-01T07:46:29.000Z", + "COMMIT_HASH": "43c1c2a66", + "COMMIT_DATE": "2022-06-10T07:28:19.000Z", "REMOTE_URL": "git@github.com:DimensionDev/Maskbook.git", "BRANCH_NAME": "feat/mobile", "DIRTY": false, diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/5161.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/5161.js index 635e5685..3fbbba20 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/5161.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/5161.js @@ -22500,12 +22500,12 @@ const buildInfoMarkdown = `## Build info - target: ${"safari"} - build: ${"stable"} - architecture: ${"app"} -- BUILD_DATE: ${"2022-06-01T07:52:48.068Z"} -- VERSION: ${"v1.29.12-2348-g181e22679"} +- BUILD_DATE: ${"2022-06-10T07:34:58.455Z"} +- VERSION: ${"v1.29.12-2350-g43c1c2a66"} ## Git (${ true ? '*' : 0}): -${"181e22679"} (${"feat/mobile"}) on tag "${"v2.5.0"}" +${"43c1c2a66"} (${"feat/mobile"}) on tag "${"v2.5.0"}" ${"git@github.com:DimensionDev/Maskbook.git"?.toLowerCase()?.includes('DimensionDev') ? '' : "git@github.com:DimensionDev/Maskbook.git"}`; // EXTERNAL MODULE: ./src/social-network/index.ts @@ -36543,7 +36543,7 @@ var utils = __webpack_require__(75460); function getEnvConstants(key) { try { const map = { - WEB3_CONSTANTS_RPC: "{\"RPC\":{\"Mainnet\":[\"https://damp-holy-water.quiknode.pro/d5bcb6c5e265afd11fecb0d52275afa961487a29/\",\"https://mainnet.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\",\"https://throbbing-blue-bird.quiknode.io/73e66978-1a45-4f91-97f3-25d59b51a00e/YScEAjYfzZqNphokjzn-Zt3sZsOd0Nav5sauA3j03se0LOseR8PQFyBfINzhYStWrg44VfLLfCFE34FR2CA_kQ==/\"],\"Ropsten\":[\"https://ropsten.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Rinkeby\":[\"https://rinkeby.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Kovan\":[\"https://kovan.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Gorli\":[\"https://goerli.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"BSC\":[\"https://bsc-dataseed.binance.org/\"],\"BSCT\":[\"https://data-seed-prebsc-1-s1.binance.org:8545/\"],\"Matic\":[\"https://polygon-mainnet.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\"],\"Mumbai\":[\"https://polygon-mumbai.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\"],\"Arbitrum\":[\"https://arb1.arbitrum.io/rpc\"],\"Arbitrum_Rinkeby\":[\"https://rinkeby.arbitrum.io/rpc\"],\"xDai\":[\"https://rpc.gnosischain.com\"],\"Avalanche\":[\"https://api.avax.network/ext/bc/C/rpc\"],\"Avalanche_Fuji\":[\"https://api.avax-test.network/ext/bc/C/rpc\"],\"Celo\":[\"https://forno.celo.org\"],\"Fantom\":[\"https://rpc.ftm.tools/\"],\"Aurora\":[\"https://mainnet.aurora.dev\"],\"Aurora_Testnet\":[\"https://testnet.aurora.dev\"],\"Conflux\":[\"https://evm.confluxrpc.com\"],\"Harmony\":[\"https://api.harmony.one\"],\"Harmony_Test\":[\"https://api.s0.b.hmny.io\"]},\"RPC_WEIGHTS\":{\"Mainnet\":[0,1,1,2],\"Ropsten\":[0,0,0,0],\"Rinkeby\":[0,0,0,0],\"Kovan\":[0,0,0,0],\"Gorli\":[0,0,0,0],\"BSC\":[0,0,0,0],\"BSCT\":[0,0,0,0],\"Matic\":[0,0,0,0],\"Mumbai\":[0,0,0,0],\"Arbitrum\":[0,0,0,0],\"Arbitrum_Rinkeby\":[0,0,0,0],\"xDai\":[0,0,0,0],\"Avalanche\":[0,0,0,0],\"Avalanche_Fuji\":[0,0,0,0],\"Celo\":[0,0,0,0],\"Fantom\":[0,0,0,0],\"Aurora\":[0,0,0,0],\"Aurora_Testnet\":[0,0,0,0],\"Conflux\":[0,0,0,0],\"Harmony\":[0,0,0,0],\"Harmony_Test\":[0,0,0,0]}}" + WEB3_CONSTANTS_RPC: "{\"RPC_URLS\":{\"Mainnet\":[\"https://damp-holy-water.quiknode.pro/d5bcb6c5e265afd11fecb0d52275afa961487a29/\",\"https://mainnet.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\",\"https://throbbing-blue-bird.quiknode.io/73e66978-1a45-4f91-97f3-25d59b51a00e/YScEAjYfzZqNphokjzn-Zt3sZsOd0Nav5sauA3j03se0LOseR8PQFyBfINzhYStWrg44VfLLfCFE34FR2CA_kQ==/\"],\"Ropsten\":[\"https://ropsten.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Rinkeby\":[\"https://rinkeby.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Kovan\":[\"https://kovan.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Gorli\":[\"https://goerli.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"BSC\":[\"https://bsc-dataseed.binance.org/\"],\"BSCT\":[\"https://data-seed-prebsc-1-s1.binance.org:8545/\"],\"Matic\":[\"https://polygon-mainnet.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\"],\"Mumbai\":[\"https://polygon-mumbai.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\"],\"Arbitrum\":[\"https://arb1.arbitrum.io/rpc\"],\"Arbitrum_Rinkeby\":[\"https://rinkeby.arbitrum.io/rpc\"],\"xDai\":[\"https://rpc.gnosischain.com\"],\"Avalanche\":[\"https://api.avax.network/ext/bc/C/rpc\"],\"Avalanche_Fuji\":[\"https://api.avax-test.network/ext/bc/C/rpc\"],\"Celo\":[\"https://forno.celo.org\"],\"Fantom\":[\"https://rpc.ftm.tools/\"],\"Aurora\":[\"https://mainnet.aurora.dev\"],\"Aurora_Testnet\":[\"https://testnet.aurora.dev\"],\"Conflux\":[\"https://evm.confluxrpc.com\"],\"Harmony\":[\"https://api.harmony.one\"],\"Harmony_Test\":[\"https://api.s0.b.hmny.io\"]},\"RPC\":{\"Mainnet\":[\"https://damp-holy-water.quiknode.pro/d5bcb6c5e265afd11fecb0d52275afa961487a29/\",\"https://mainnet.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\",\"https://throbbing-blue-bird.quiknode.io/73e66978-1a45-4f91-97f3-25d59b51a00e/YScEAjYfzZqNphokjzn-Zt3sZsOd0Nav5sauA3j03se0LOseR8PQFyBfINzhYStWrg44VfLLfCFE34FR2CA_kQ==/\"],\"Ropsten\":[\"https://ropsten.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Rinkeby\":[\"https://rinkeby.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Kovan\":[\"https://kovan.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"Gorli\":[\"https://goerli.infura.io/v3/11f8b6b36f4a408e85d8a4e52d31edc5\"],\"BSC\":[\"https://bsc-dataseed.binance.org/\"],\"BSCT\":[\"https://data-seed-prebsc-1-s1.binance.org:8545/\"],\"Matic\":[\"https://polygon-mainnet.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\"],\"Mumbai\":[\"https://polygon-mumbai.infura.io/v3/50676f4e9b9d4780a34fc8a503ff7f4f\"],\"Arbitrum\":[\"https://arb1.arbitrum.io/rpc\"],\"Arbitrum_Rinkeby\":[\"https://rinkeby.arbitrum.io/rpc\"],\"xDai\":[\"https://rpc.gnosischain.com\"],\"Avalanche\":[\"https://api.avax.network/ext/bc/C/rpc\"],\"Avalanche_Fuji\":[\"https://api.avax-test.network/ext/bc/C/rpc\"],\"Celo\":[\"https://forno.celo.org\"],\"Fantom\":[\"https://rpc.ftm.tools/\"],\"Aurora\":[\"https://mainnet.aurora.dev\"],\"Aurora_Testnet\":[\"https://testnet.aurora.dev\"],\"Conflux\":[\"https://evm.confluxrpc.com\"],\"Harmony\":[\"https://api.harmony.one\"],\"Harmony_Test\":[\"https://api.s0.b.hmny.io\"]},\"RPC_WEIGHTS\":{\"Mainnet\":[0,1,1,2],\"Ropsten\":[0,0,0,0],\"Rinkeby\":[0,0,0,0],\"Kovan\":[0,0,0,0],\"Gorli\":[0,0,0,0],\"BSC\":[0,0,0,0],\"BSCT\":[0,0,0,0],\"Matic\":[0,0,0,0],\"Mumbai\":[0,0,0,0],\"Arbitrum\":[0,0,0,0],\"Arbitrum_Rinkeby\":[0,0,0,0],\"xDai\":[0,0,0,0],\"Avalanche\":[0,0,0,0],\"Avalanche_Fuji\":[0,0,0,0],\"Celo\":[0,0,0,0],\"Fantom\":[0,0,0,0],\"Aurora\":[0,0,0,0],\"Aurora_Testnet\":[0,0,0,0],\"Conflux\":[0,0,0,0],\"Harmony\":[0,0,0,0],\"Harmony_Test\":[0,0,0,0]}}" }; return map[key] ?? ''; } catch { diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/background.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/background.js index 9f830636..c9b7861d 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/background.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/background.js @@ -889,7 +889,7 @@ if (true) { * but webpack will do constant folding */ // @ts-ignore // eslint-disable-next-line no-useless-concat - __webpack_require__.e(/* import() */ 8699).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI ), { ...options, channel: new iOSWebkitChannel() @@ -1885,11 +1885,11 @@ if (false) {} ;// CONCATENATED MODULE: ./background/tasks/NotCancellable/PrintBuildFlags.ts console.log('Build info', { NODE_ENV: "production", - VERSION: "v1.29.12-2348-g181e22679", + VERSION: "v1.29.12-2350-g43c1c2a66", TAG_NAME: "v2.5.0", - COMMIT_HASH: "181e22679", - COMMIT_DATE: "2022-06-01T07:46:29.000Z", - BUILD_DATE: "2022-06-01T07:52:48.068Z", + COMMIT_HASH: "43c1c2a66", + COMMIT_DATE: "2022-06-10T07:28:19.000Z", + BUILD_DATE: "2022-06-10T07:34:58.455Z", REMOTE_URL: "git@github.com:DimensionDev/Maskbook.git", BRANCH_NAME: "feat/mobile", DIRTY: false, @@ -2164,7 +2164,7 @@ const log = { requestReplay: "production" === 'development' }; const Services = { - Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(7691), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) + Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(5449), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) , 'Crypto'), Identity: add(()=>Promise.all(/* import() */[__webpack_require__.e(2698), __webpack_require__.e(3294), __webpack_require__.e(6739), __webpack_require__.e(4227), __webpack_require__.e(4544), __webpack_require__.e(5737), __webpack_require__.e(3883), __webpack_require__.e(6045), __webpack_require__.e(1077), __webpack_require__.e(8117), __webpack_require__.e(2943), __webpack_require__.e(5756), __webpack_require__.e(8492), __webpack_require__.e(7765), __webpack_require__.e(1305), __webpack_require__.e(5891), __webpack_require__.e(8936), __webpack_require__.e(6265), __webpack_require__.e(1246), __webpack_require__.e(7141), __webpack_require__.e(708), __webpack_require__.e(9447), __webpack_require__.e(7764), __webpack_require__.e(4859), __webpack_require__.e(8563), __webpack_require__.e(1064), __webpack_require__.e(7025)]).then(__webpack_require__.bind(__webpack_require__, 17865)) , 'Identity'), @@ -2182,7 +2182,7 @@ const Services = { , 'ThirdPartyPlugin') }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Services); -const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(7691), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) +const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) , 'ServicesWithProgress', true); if (false) {} /** diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.1064.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.1064.js index d5e6fda5..91fdb5f3 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.1064.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.1064.js @@ -833,6 +833,129 @@ function relationRecordOutDB(x) { } // #endregion +/***/ }), + +/***/ 96182: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Ns": () => (/* binding */ createDBAccessWithAsyncUpgrade), +/* harmony export */ "Z_": () => (/* binding */ createDBAccess), +/* harmony export */ "_X": () => (/* binding */ createTransaction) +/* harmony export */ }); +/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(85646); +/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62481); + + +const iOSFix = true ? __webpack_require__.e(/* import() */ 426).then(__webpack_require__.bind(__webpack_require__, 40426)).then(({ default: ready })=>ready() +) : 0; +function createDBAccess(opener) { + let db = undefined; + if (true) { + // iOS bug: indexedDB dies randomly + _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); + setInterval(clean, /** 1 min */ 1000 * 60); + } + function clean() { + if (db) { + db.close(); + db.addEventListener('close', ()=>db = undefined + , { + once: true + }); + } + db = undefined; + } + return async ()=>{ + await iOSFix; + (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); + if (db) { + try { + // try if the db still open + const t = db.transaction([ + db.objectStoreNames[0] + ], 'readonly', {}); + t.commit(); + return db; + } catch { + clean(); + } + } + db = await opener(); + db.addEventListener('close', clean, { + once: true + }); + db.addEventListener('error', clean, { + once: true + }); + return db; + }; +} +function createDBAccessWithAsyncUpgrade(firstVersionThatRequiresAsyncUpgrade, latestVersion, opener, asyncUpgradePrepare) { + let db = undefined; + if (true) { + // iOS bug: indexedDB dies randomly + _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); + setInterval(clean, /** 1 min */ 1000 * 60); + } + function clean() { + if (db) { + db.close(); + db.addEventListener('close', ()=>pendingOpen = db = undefined + , { + once: true + }); + } + pendingOpen = db = undefined; + } + let pendingOpen; + async function open() { + await iOSFix; + (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); + if (db?.version === latestVersion) return db; + let currentVersion = firstVersionThatRequiresAsyncUpgrade; + let lastVersionData = undefined; + while(currentVersion < latestVersion){ + try { + db = await opener(currentVersion, lastVersionData); + // if the open success, the stored version is small or eq than currentTryOpenVersion + // let's call the prepare function to do all the async jobs + lastVersionData = await asyncUpgradePrepare(db); + } catch (error) { + if (currentVersion >= latestVersion) throw error; + // if the stored database version is bigger than the currentTryOpenVersion + // It will fail and we just move to next version + } + currentVersion += 1; + db?.close(); + db = undefined; + } + db = await opener(currentVersion, lastVersionData); + db.addEventListener('close', (e)=>db = undefined + , { + once: true + }); + if (!db) throw new Error('Invalid state'); + return db; + } + return ()=>{ + // Share a Promise to prevent async upgrade for multiple times + if (pendingOpen) return pendingOpen; + const promise = pendingOpen = open(); + promise.catch(()=>pendingOpen = undefined + ); + return promise; + }; +} +function createTransaction(db, mode) { + // It must be a high order function to infer the type of UsedStoreName correctly. + return (...storeNames)=>{ + return db.transaction(storeNames, mode); + }; +} + + /***/ }) }]); \ No newline at end of file diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.1314.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.1314.js index ce40d1d0..258e1a2d 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.1314.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.1314.js @@ -60,7 +60,7 @@ if (true) { * but webpack will do constant folding */ // @ts-ignore // eslint-disable-next-line no-useless-concat - __webpack_require__.e(/* import() */ 8699).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI ), { ...options, channel: new iOSWebkitChannel() diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.2159.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.2159.js index 78a63370..f214d5de 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.2159.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.2159.js @@ -325,7 +325,7 @@ if (true) { * but webpack will do constant folding */ // @ts-ignore // eslint-disable-next-line no-useless-concat - __webpack_require__.e(/* import() */ 8699).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI ), { ...options, channel: new iOSWebkitChannel() diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.3020.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.3020.js index 88ce4855..aa81ef28 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.3020.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.3020.js @@ -452,7 +452,7 @@ if (true) { * but webpack will do constant folding */ // @ts-ignore // eslint-disable-next-line no-useless-concat - __webpack_require__.e(/* import() */ 8699).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI ), { ...options, channel: new iOSWebkitChannel() diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5114.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5114.js index 782293e0..7d71d5fa 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5114.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5114.js @@ -1,6 +1,454 @@ "use strict"; (globalThis["webpackChunk_masknet_extension"] = globalThis["webpackChunk_masknet_extension"] || []).push([[5114],{ +/***/ 57605: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "h": () => (/* binding */ savePostKeyToDB) +/* harmony export */ }); +/* harmony import */ var _utils_pure__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86880); +/* harmony import */ var _utils_openDB__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(96182); +/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51876); + + + +async function savePostKeyToDB(id, key, extraInfo) { + const jwk = await (0,_utils_pure__WEBPACK_IMPORTED_MODULE_0__/* .CryptoKeyToJsonWebKey */ .iV)(key); + { + const t = (0,_utils_openDB__WEBPACK_IMPORTED_MODULE_1__/* .createTransaction */ ._X)(await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .PostDBAccess */ .Nz)(), 'readwrite')('post'); + const post = await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .queryPostDB */ .q3)(id, t); + if (!post) { + await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .createPostDB */ .$v)({ + identifier: id, + postCryptoKey: jwk, + foundAt: new Date(), + ...extraInfo + }, t); + } else { + await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .updatePostDB */ .rr)({ + ...post, + postCryptoKey: jwk + }, 'override', t); + } + } +} + + +/***/ }), + +/***/ 51876: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "$v": () => (/* binding */ createPostDB), +/* harmony export */ "Nz": () => (/* binding */ PostDBAccess), +/* harmony export */ "hZ": () => (/* binding */ queryPostsDB), +/* harmony export */ "q3": () => (/* binding */ queryPostDB), +/* harmony export */ "rr": () => (/* binding */ updatePostDB), +/* harmony export */ "xN": () => (/* binding */ queryPostPagedDB) +/* harmony export */ }); +/* harmony import */ var _shared_native_rpc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(30246); + + +const { createPostDB , updatePostDB , queryPostDB , queryPostsDB , queryPostPagedDB , PostDBAccess } = new Proxy({}, { + get (_, key) { + return async function(...args) { + if (_shared_native_rpc__WEBPACK_IMPORTED_MODULE_0__/* .hasNativeAPI */ ._) { + return __webpack_require__.e(/* import() */ 3922).then(__webpack_require__.bind(__webpack_require__, 43922)).then((x)=>x[key](...args) + ); + } + return Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(8905)]).then(__webpack_require__.bind(__webpack_require__, 98905)).then((x)=>x[key](...args) + ); + }; + } +}); + + +/***/ }), + +/***/ 96182: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Ns": () => (/* binding */ createDBAccessWithAsyncUpgrade), +/* harmony export */ "Z_": () => (/* binding */ createDBAccess), +/* harmony export */ "_X": () => (/* binding */ createTransaction) +/* harmony export */ }); +/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(85646); +/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62481); + + +const iOSFix = true ? __webpack_require__.e(/* import() */ 426).then(__webpack_require__.bind(__webpack_require__, 40426)).then(({ default: ready })=>ready() +) : 0; +function createDBAccess(opener) { + let db = undefined; + if (true) { + // iOS bug: indexedDB dies randomly + _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); + setInterval(clean, /** 1 min */ 1000 * 60); + } + function clean() { + if (db) { + db.close(); + db.addEventListener('close', ()=>db = undefined + , { + once: true + }); + } + db = undefined; + } + return async ()=>{ + await iOSFix; + (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); + if (db) { + try { + // try if the db still open + const t = db.transaction([ + db.objectStoreNames[0] + ], 'readonly', {}); + t.commit(); + return db; + } catch { + clean(); + } + } + db = await opener(); + db.addEventListener('close', clean, { + once: true + }); + db.addEventListener('error', clean, { + once: true + }); + return db; + }; +} +function createDBAccessWithAsyncUpgrade(firstVersionThatRequiresAsyncUpgrade, latestVersion, opener, asyncUpgradePrepare) { + let db = undefined; + if (true) { + // iOS bug: indexedDB dies randomly + _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); + setInterval(clean, /** 1 min */ 1000 * 60); + } + function clean() { + if (db) { + db.close(); + db.addEventListener('close', ()=>pendingOpen = db = undefined + , { + once: true + }); + } + pendingOpen = db = undefined; + } + let pendingOpen; + async function open() { + await iOSFix; + (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); + if (db?.version === latestVersion) return db; + let currentVersion = firstVersionThatRequiresAsyncUpgrade; + let lastVersionData = undefined; + while(currentVersion < latestVersion){ + try { + db = await opener(currentVersion, lastVersionData); + // if the open success, the stored version is small or eq than currentTryOpenVersion + // let's call the prepare function to do all the async jobs + lastVersionData = await asyncUpgradePrepare(db); + } catch (error) { + if (currentVersion >= latestVersion) throw error; + // if the stored database version is bigger than the currentTryOpenVersion + // It will fail and we just move to next version + } + currentVersion += 1; + db?.close(); + db = undefined; + } + db = await opener(currentVersion, lastVersionData); + db.addEventListener('close', (e)=>db = undefined + , { + once: true + }); + if (!db) throw new Error('Invalid state'); + return db; + } + return ()=>{ + // Share a Promise to prevent async upgrade for multiple times + if (pendingOpen) return pendingOpen; + const promise = pendingOpen = open(); + promise.catch(()=>pendingOpen = undefined + ); + return promise; + }; +} +function createTransaction(db, mode) { + // It must be a high order function to infer the type of UsedStoreName correctly. + return (...storeNames)=>{ + return db.transaction(storeNames, mode); + }; +} + + +/***/ }), + +/***/ 57691: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "D": () => (/* binding */ decryptionWithSocialNetworkDecoding), +/* harmony export */ "E": () => (/* binding */ getPostKeyCache) +/* harmony export */ }); +/* harmony import */ var _dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(28807); +/* harmony import */ var _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(52222); +/* harmony import */ var _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(78144); +/* harmony import */ var lodash_unified__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(21122); +/* harmony import */ var _database_persona_db__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(60562); +/* harmony import */ var _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(16426); +/* harmony import */ var _database_post__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51876); +/* harmony import */ var _database_post_helper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(57605); +/* harmony import */ var _network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(25449); + + + + + + + + + +const downloadImage = (url)=>fetch(url).then((x)=>x.arrayBuffer() + ) +; +/** + * + * @param encoded If the encoded content is a text, it should only contain 1 payload. Extra payload will be ignored. + * @param context + */ async function* decryptionWithSocialNetworkDecoding(encoded, context) { + let decoded; + if (encoded.type === 'text') { + decoded = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .socialNetworkDecoder */ .FW)(context.currentSocialNetwork, encoded.text)[0]; + } else { + if (!context.authorHint || context.authorHint.isUnknown) { + return yield new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.UnrecognizedAuthor */ .OF.UnrecognizedAuthor, undefined); + } + const result = await (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .steganographyDecodeImage */ .oX)(encoded.image, { + pass: context.authorHint.toText(), + downloadImage + }); + decoded = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .socialNetworkDecoder */ .FW)(context.currentSocialNetwork, result)[0]; + } + if (!decoded) return yield new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.NoPayloadFound */ .OF.NoPayloadFound, undefined); + yield* decryption(decoded, context); +} +const inMemoryCache = new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .IdentifierMap */ .qD(new Map(), _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .PostIVIdentifier */ .bb); +async function* decryption(payload, context) { + const parse = await (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .parsePayload */ .WZ)(payload); + if (parse.err) return null; + const { currentSocialNetwork , postURL } = context; + let { currentProfile , authorHint } = context; + if (currentProfile?.isUnknown) currentProfile = null; + if (authorHint?.isUnknown) authorHint = null; + // #region Identify the PostIdentifier + const iv1 = parse.val.encryption.unwrapOr(null)?.iv.unwrapOr(null); + { + if (!iv1) return null; + // iv is required to identify the post and it also used in comment encryption. + const info = { + type: _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptProgressKind.Info */ .Pj.Info, + iv: iv1, + version: parse.val.version + }; + if (parse.val.encryption.ok) { + const val = parse.val.encryption.val; + info.publicShared = val.type === 'public'; + if (val.type === 'E2E' && val.ownersAESKeyEncrypted.ok) info.ownersKeyEncrypted = val.ownersAESKeyEncrypted.val; + } + yield info; + } + const id = new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .PostIVIdentifier */ .bb((0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnumToProfileDomain */ .VC)(currentSocialNetwork), (0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__/* .encodeArrayBuffer */ .ll)(iv1.buffer)); + // #endregion + if (inMemoryCache.has(id)) { + const p = { + type: _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptProgressKind.Success */ .Pj.Success, + content: inMemoryCache.get(id) + }; + return void (yield p); + } + // #region store author public key into the database + try { + const id = parse.unwrap().author.unwrap().unwrap(); + const cacheKey = id.toText(); + if (!hasStoredAuthorPublicKey.has(cacheKey)) { + storeAuthorPublicKey(id, authorHint, parse.unwrap().authorPublicKey.unwrap().unwrap()).catch(lodash_unified__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .Z); + hasStoredAuthorPublicKey.add(cacheKey); + } + } catch {} + // #endregion + const progress = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .decrypt */ .pe)({ + message: parse.val, + onDecrypted (message) { + inMemoryCache.set(id, message); + } + }, { + getPostKeyCache: getPostKeyCache.bind(null, id), + setPostKeyCache: (key)=>{ + return (0,_database_post_helper__WEBPACK_IMPORTED_MODULE_6__/* .savePostKeyToDB */ .h)(id, key, { + // public post will not call this function. + // and recipients only will be set when posting/appending recipients. + recipients: new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .IdentifierMap */ .qD(new Map()), + postBy: authorHint || parse.safeUnwrap().author.unwrapOr(null)?.unwrapOr(null) || _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .ProfileIdentifier.unknown */ .WO.unknown, + url: postURL + }); + }, + hasLocalKeyOf: _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .hasLocalKeyOf */ .wf, + decryptByLocalKey: _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .decryptByLocalKey */ .MM, + async deriveAESKey (pub) { + return Array.from((await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .deriveAESByECDH */ .Si)(pub)).values()); + }, + queryAuthorPublicKey (author, signal) { + return (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(author || authorHint); + }, + // TODO: get a gun instance + async *queryPostKey_version37 () { + throw new Error('TODO'); + }, + async *queryPostKey_version38 (iv, signal) { + const author = await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(context.currentProfile); + if (!author) throw new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.CurrentProfileDoesNotConnectedToPersona */ .OF.CurrentProfileDoesNotConnectedToPersona, undefined); + yield* (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version39Or38 */ .ab)(-38, iv, author, getNetworkHint(context.currentSocialNetwork), signal || new AbortController().signal); + }, + async *queryPostKey_version39 (iv, signal) { + const author = await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(context.currentProfile); + if (!author) throw new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.CurrentProfileDoesNotConnectedToPersona */ .OF.CurrentProfileDoesNotConnectedToPersona, undefined); + yield* (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version39Or38 */ .ab)(-39, iv, author, getNetworkHint(context.currentSocialNetwork), signal || new AbortController().signal); + }, + async queryPostKey_version40 (iv) { + if (!currentProfile) return null; + return (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version40 */ .Kl)(iv, currentProfile.userId); + } + }); + yield* progress; + return null; +} +function getNetworkHint(x) { + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Facebook */ .Gq.Facebook) return ''; + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Twitter */ .Gq.Twitter) return 'twitter-'; + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Minds */ .Gq.Minds) return 'minds-'; + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Instagram */ .Gq.Instagram) return 'instagram-'; + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Unknown */ .Gq.Unknown) throw new TypeError('[@masknet/encryption] Current SNS network is not correctly configured.'); + (0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__/* .unreachable */ .t1)(x); +} +/** @internal */ async function getPostKeyCache(id) { + const post = await (0,_database_post__WEBPACK_IMPORTED_MODULE_5__/* .queryPostDB */ .q3)(id); + if (!post?.postCryptoKey) return null; + const k = await crypto.subtle.importKey('jwk', post.postCryptoKey, { + name: 'AES-GCM', + length: 256 + }, true, [ + 'decrypt', + ]); + return k; +} +const hasStoredAuthorPublicKey = new Set(); +async function storeAuthorPublicKey(payloadAuthor, postAuthor, pub) { + if (!payloadAuthor.equals(postAuthor)) { + // ! Author detected is not equal to AuthorHint. + // ! Skip store the public key because it might be a security problem. + return; + } + if (pub.algr !== _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .EC_KeyCurveEnum.secp256k1 */ .qx.secp256k1) { + throw new Error('TODO: support other curves'); + } + // if privateKey, we should possibly not recreate it + const profile = await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryProfileDB */ .IW)(payloadAuthor); + const persona = profile?.linkedPersona ? await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryPersonaDB */ .Hm)(profile.linkedPersona) : undefined; + if (persona?.privateKey) return; + const key = await crypto.subtle.exportKey('jwk', pub.key); + const otherPersona = await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryPersonaDB */ .Hm)((0,_masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .ECKeyIdentifierFromJsonWebKey */ .CH)(key)); + if (otherPersona?.privateKey) return; + return (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .createProfileWithPersona */ .lr)(payloadAuthor, { + connectionConfirmState: 'confirmed' + }, { + publicKey: await crypto.subtle.exportKey('jwk', pub.key) + }); +} + + +/***/ }), + +/***/ 30246: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "_": () => (/* binding */ hasNativeAPI), + "Nz": () => (/* binding */ nativeAPI) +}); + +// UNUSED EXPORTS: sharedNativeAPI + +// EXTERNAL MODULE: ../../node_modules/.pnpm/async-call-rpc@6.0.2/node_modules/async-call-rpc/out/full.mjs +var full = __webpack_require__(19245); +;// CONCATENATED MODULE: ./shared/native-rpc/iOS.channel.ts +// cspell:disable-next-line +const key = 'maskbookjsonrpc'; +class iOSWebkitChannel { + on(cb) { + this.listener.add(cb); + return ()=>void this.listener.delete(cb) + ; + } + send(data) { + globalThis.webkit.messageHandlers[key].postMessage(data); + } + constructor(){ + this.listener = new Set(); + document.addEventListener(key, (e)=>{ + const detail = e.detail; + for (const f of this.listener){ + try { + f(detail); + } catch {} + } + }); + } +} + +;// CONCATENATED MODULE: ./shared/native-rpc/index.ts + + + +// This module won't be used in Web. Let it not effecting HMR. +if (false) {} +const hasNativeAPI = "app" === 'app'; +let nativeAPI = undefined; +let sharedNativeAPI = (/* unused pure expression or super */ null && (undefined)); +if (true) { + const options = { + key: 'native', + parameterStructures: 'by-name' + }; + if (true) { + const api = sharedNativeAPI = (0,full/* AsyncCall */.LE)(/** + * Typescript will not add the file to the project dependency tree + * but webpack will do constant folding + */ // @ts-ignore + // eslint-disable-next-line no-useless-concat + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + ), { + ...options, + channel: new iOSWebkitChannel() + }); + nativeAPI = { + type: 'iOS', + api + }; + } else {} +} + + +/***/ }), + /***/ 45114: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7691.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5449.js similarity index 62% rename from DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7691.js rename to DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5449.js index 9b57e45f..5b093867 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7691.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5449.js @@ -1,5 +1,5 @@ "use strict"; -(globalThis["webpackChunk_masknet_extension"] = globalThis["webpackChunk_masknet_extension"] || []).push([[7691,6880],{ +(globalThis["webpackChunk_masknet_extension"] = globalThis["webpackChunk_masknet_extension"] || []).push([[5449,6880],{ /***/ 37313: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { @@ -549,195 +549,6 @@ function abort() { } -/***/ }), - -/***/ 57605: -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "h": () => (/* binding */ savePostKeyToDB) -/* harmony export */ }); -/* harmony import */ var _utils_pure__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86880); -/* harmony import */ var _utils_openDB__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(96182); -/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51876); - - - -async function savePostKeyToDB(id, key, extraInfo) { - const jwk = await (0,_utils_pure__WEBPACK_IMPORTED_MODULE_0__/* .CryptoKeyToJsonWebKey */ .iV)(key); - { - const t = (0,_utils_openDB__WEBPACK_IMPORTED_MODULE_1__/* .createTransaction */ ._X)(await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .PostDBAccess */ .Nz)(), 'readwrite')('post'); - const post = await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .queryPostDB */ .q3)(id, t); - if (!post) { - await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .createPostDB */ .$v)({ - identifier: id, - postCryptoKey: jwk, - foundAt: new Date(), - ...extraInfo - }, t); - } else { - await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .updatePostDB */ .rr)({ - ...post, - postCryptoKey: jwk - }, 'override', t); - } - } -} - - -/***/ }), - -/***/ 51876: -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "$v": () => (/* binding */ createPostDB), -/* harmony export */ "Nz": () => (/* binding */ PostDBAccess), -/* harmony export */ "hZ": () => (/* binding */ queryPostsDB), -/* harmony export */ "q3": () => (/* binding */ queryPostDB), -/* harmony export */ "rr": () => (/* binding */ updatePostDB), -/* harmony export */ "xN": () => (/* binding */ queryPostPagedDB) -/* harmony export */ }); -/* harmony import */ var _shared_native_rpc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(30246); - - -const { createPostDB , updatePostDB , queryPostDB , queryPostsDB , queryPostPagedDB , PostDBAccess } = new Proxy({}, { - get (_, key) { - return async function(...args) { - if (_shared_native_rpc__WEBPACK_IMPORTED_MODULE_0__/* .hasNativeAPI */ ._) { - return __webpack_require__.e(/* import() */ 3922).then(__webpack_require__.bind(__webpack_require__, 43922)).then((x)=>x[key](...args) - ); - } - return Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(8905)]).then(__webpack_require__.bind(__webpack_require__, 98905)).then((x)=>x[key](...args) - ); - }; - } -}); - - -/***/ }), - -/***/ 96182: -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Ns": () => (/* binding */ createDBAccessWithAsyncUpgrade), -/* harmony export */ "Z_": () => (/* binding */ createDBAccess), -/* harmony export */ "_X": () => (/* binding */ createTransaction) -/* harmony export */ }); -/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(85646); -/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62481); - - -const iOSFix = true ? __webpack_require__.e(/* import() */ 426).then(__webpack_require__.bind(__webpack_require__, 40426)).then(({ default: ready })=>ready() -) : 0; -function createDBAccess(opener) { - let db = undefined; - if (true) { - // iOS bug: indexedDB dies randomly - _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); - setInterval(clean, /** 1 min */ 1000 * 60); - } - function clean() { - if (db) { - db.close(); - db.addEventListener('close', ()=>db = undefined - , { - once: true - }); - } - db = undefined; - } - return async ()=>{ - await iOSFix; - (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); - if (db) { - try { - // try if the db still open - const t = db.transaction([ - db.objectStoreNames[0] - ], 'readonly', {}); - t.commit(); - return db; - } catch { - clean(); - } - } - db = await opener(); - db.addEventListener('close', clean, { - once: true - }); - db.addEventListener('error', clean, { - once: true - }); - return db; - }; -} -function createDBAccessWithAsyncUpgrade(firstVersionThatRequiresAsyncUpgrade, latestVersion, opener, asyncUpgradePrepare) { - let db = undefined; - if (true) { - // iOS bug: indexedDB dies randomly - _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); - setInterval(clean, /** 1 min */ 1000 * 60); - } - function clean() { - if (db) { - db.close(); - db.addEventListener('close', ()=>pendingOpen = db = undefined - , { - once: true - }); - } - pendingOpen = db = undefined; - } - let pendingOpen; - async function open() { - await iOSFix; - (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); - if (db?.version === latestVersion) return db; - let currentVersion = firstVersionThatRequiresAsyncUpgrade; - let lastVersionData = undefined; - while(currentVersion < latestVersion){ - try { - db = await opener(currentVersion, lastVersionData); - // if the open success, the stored version is small or eq than currentTryOpenVersion - // let's call the prepare function to do all the async jobs - lastVersionData = await asyncUpgradePrepare(db); - } catch (error) { - if (currentVersion >= latestVersion) throw error; - // if the stored database version is bigger than the currentTryOpenVersion - // It will fail and we just move to next version - } - currentVersion += 1; - db?.close(); - db = undefined; - } - db = await opener(currentVersion, lastVersionData); - db.addEventListener('close', (e)=>db = undefined - , { - once: true - }); - if (!db) throw new Error('Invalid state'); - return db; - } - return ()=>{ - // Share a Promise to prevent async upgrade for multiple times - if (pendingOpen) return pendingOpen; - const promise = pendingOpen = open(); - promise.catch(()=>pendingOpen = undefined - ); - return promise; - }; -} -function createTransaction(db, mode) { - // It must be a high order function to infer the type of UsedStoreName correctly. - return (...storeNames)=>{ - return db.transaction(storeNames, mode); - }; -} - - /***/ }), /***/ 25449: @@ -921,265 +732,6 @@ var Version38Or39; const { GUN_queryPostKey_version39Or38 , publishPostAESKey_version39Or38 } = Version38Or39; -/***/ }), - -/***/ 57691: -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "D": () => (/* binding */ decryptionWithSocialNetworkDecoding), -/* harmony export */ "E": () => (/* binding */ getPostKeyCache) -/* harmony export */ }); -/* harmony import */ var _dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(28807); -/* harmony import */ var _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(52222); -/* harmony import */ var _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(78144); -/* harmony import */ var lodash_unified__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(21122); -/* harmony import */ var _database_persona_db__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(60562); -/* harmony import */ var _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(16426); -/* harmony import */ var _database_post__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51876); -/* harmony import */ var _database_post_helper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(57605); -/* harmony import */ var _network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(25449); - - - - - - - - - -const downloadImage = (url)=>fetch(url).then((x)=>x.arrayBuffer() - ) -; -/** - * - * @param encoded If the encoded content is a text, it should only contain 1 payload. Extra payload will be ignored. - * @param context - */ async function* decryptionWithSocialNetworkDecoding(encoded, context) { - let decoded; - if (encoded.type === 'text') { - decoded = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .socialNetworkDecoder */ .FW)(context.currentSocialNetwork, encoded.text)[0]; - } else { - if (!context.authorHint || context.authorHint.isUnknown) { - return yield new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.UnrecognizedAuthor */ .OF.UnrecognizedAuthor, undefined); - } - const result = await (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .steganographyDecodeImage */ .oX)(encoded.image, { - pass: context.authorHint.toText(), - downloadImage - }); - decoded = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .socialNetworkDecoder */ .FW)(context.currentSocialNetwork, result)[0]; - } - if (!decoded) return yield new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.NoPayloadFound */ .OF.NoPayloadFound, undefined); - yield* decryption(decoded, context); -} -const inMemoryCache = new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .IdentifierMap */ .qD(new Map(), _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .PostIVIdentifier */ .bb); -async function* decryption(payload, context) { - const parse = await (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .parsePayload */ .WZ)(payload); - if (parse.err) return null; - const { currentSocialNetwork , postURL } = context; - let { currentProfile , authorHint } = context; - if (currentProfile?.isUnknown) currentProfile = null; - if (authorHint?.isUnknown) authorHint = null; - // #region Identify the PostIdentifier - const iv1 = parse.val.encryption.unwrapOr(null)?.iv.unwrapOr(null); - { - if (!iv1) return null; - // iv is required to identify the post and it also used in comment encryption. - const info = { - type: _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptProgressKind.Info */ .Pj.Info, - iv: iv1, - version: parse.val.version - }; - if (parse.val.encryption.ok) { - const val = parse.val.encryption.val; - info.publicShared = val.type === 'public'; - if (val.type === 'E2E' && val.ownersAESKeyEncrypted.ok) info.ownersKeyEncrypted = val.ownersAESKeyEncrypted.val; - } - yield info; - } - const id = new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .PostIVIdentifier */ .bb((0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnumToProfileDomain */ .VC)(currentSocialNetwork), (0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__/* .encodeArrayBuffer */ .ll)(iv1.buffer)); - // #endregion - if (inMemoryCache.has(id)) { - const p = { - type: _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptProgressKind.Success */ .Pj.Success, - content: inMemoryCache.get(id) - }; - return void (yield p); - } - // #region store author public key into the database - try { - const id = parse.unwrap().author.unwrap().unwrap(); - const cacheKey = id.toText(); - if (!hasStoredAuthorPublicKey.has(cacheKey)) { - storeAuthorPublicKey(id, authorHint, parse.unwrap().authorPublicKey.unwrap().unwrap()).catch(lodash_unified__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .Z); - hasStoredAuthorPublicKey.add(cacheKey); - } - } catch {} - // #endregion - const progress = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .decrypt */ .pe)({ - message: parse.val, - onDecrypted (message) { - inMemoryCache.set(id, message); - } - }, { - getPostKeyCache: getPostKeyCache.bind(null, id), - setPostKeyCache: (key)=>{ - return (0,_database_post_helper__WEBPACK_IMPORTED_MODULE_6__/* .savePostKeyToDB */ .h)(id, key, { - // public post will not call this function. - // and recipients only will be set when posting/appending recipients. - recipients: new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .IdentifierMap */ .qD(new Map()), - postBy: authorHint || parse.safeUnwrap().author.unwrapOr(null)?.unwrapOr(null) || _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .ProfileIdentifier.unknown */ .WO.unknown, - url: postURL - }); - }, - hasLocalKeyOf: _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .hasLocalKeyOf */ .wf, - decryptByLocalKey: _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .decryptByLocalKey */ .MM, - async deriveAESKey (pub) { - return Array.from((await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .deriveAESByECDH */ .Si)(pub)).values()); - }, - queryAuthorPublicKey (author, signal) { - return (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(author || authorHint); - }, - // TODO: get a gun instance - async *queryPostKey_version37 () { - throw new Error('TODO'); - }, - async *queryPostKey_version38 (iv, signal) { - const author = await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(context.currentProfile); - if (!author) throw new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.CurrentProfileDoesNotConnectedToPersona */ .OF.CurrentProfileDoesNotConnectedToPersona, undefined); - yield* (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version39Or38 */ .ab)(-38, iv, author, getNetworkHint(context.currentSocialNetwork), signal || new AbortController().signal); - }, - async *queryPostKey_version39 (iv, signal) { - const author = await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(context.currentProfile); - if (!author) throw new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.CurrentProfileDoesNotConnectedToPersona */ .OF.CurrentProfileDoesNotConnectedToPersona, undefined); - yield* (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version39Or38 */ .ab)(-39, iv, author, getNetworkHint(context.currentSocialNetwork), signal || new AbortController().signal); - }, - async queryPostKey_version40 (iv) { - if (!currentProfile) return null; - return (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version40 */ .Kl)(iv, currentProfile.userId); - } - }); - yield* progress; - return null; -} -function getNetworkHint(x) { - if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Facebook */ .Gq.Facebook) return ''; - if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Twitter */ .Gq.Twitter) return 'twitter-'; - if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Minds */ .Gq.Minds) return 'minds-'; - if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Instagram */ .Gq.Instagram) return 'instagram-'; - if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Unknown */ .Gq.Unknown) throw new TypeError('[@masknet/encryption] Current SNS network is not correctly configured.'); - (0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__/* .unreachable */ .t1)(x); -} -/** @internal */ async function getPostKeyCache(id) { - const post = await (0,_database_post__WEBPACK_IMPORTED_MODULE_5__/* .queryPostDB */ .q3)(id); - if (!post?.postCryptoKey) return null; - const k = await crypto.subtle.importKey('jwk', post.postCryptoKey, { - name: 'AES-GCM', - length: 256 - }, true, [ - 'decrypt', - ]); - return k; -} -const hasStoredAuthorPublicKey = new Set(); -async function storeAuthorPublicKey(payloadAuthor, postAuthor, pub) { - if (!payloadAuthor.equals(postAuthor)) { - // ! Author detected is not equal to AuthorHint. - // ! Skip store the public key because it might be a security problem. - return; - } - if (pub.algr !== _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .EC_KeyCurveEnum.secp256k1 */ .qx.secp256k1) { - throw new Error('TODO: support other curves'); - } - // if privateKey, we should possibly not recreate it - const profile = await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryProfileDB */ .IW)(payloadAuthor); - const persona = profile?.linkedPersona ? await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryPersonaDB */ .Hm)(profile.linkedPersona) : undefined; - if (persona?.privateKey) return; - const key = await crypto.subtle.exportKey('jwk', pub.key); - const otherPersona = await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryPersonaDB */ .Hm)((0,_masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .ECKeyIdentifierFromJsonWebKey */ .CH)(key)); - if (otherPersona?.privateKey) return; - return (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .createProfileWithPersona */ .lr)(payloadAuthor, { - connectionConfirmState: 'confirmed' - }, { - publicKey: await crypto.subtle.exportKey('jwk', pub.key) - }); -} - - -/***/ }), - -/***/ 30246: -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - "_": () => (/* binding */ hasNativeAPI), - "Nz": () => (/* binding */ nativeAPI) -}); - -// UNUSED EXPORTS: sharedNativeAPI - -// EXTERNAL MODULE: ../../node_modules/.pnpm/async-call-rpc@6.0.2/node_modules/async-call-rpc/out/full.mjs -var full = __webpack_require__(19245); -;// CONCATENATED MODULE: ./shared/native-rpc/iOS.channel.ts -// cspell:disable-next-line -const key = 'maskbookjsonrpc'; -class iOSWebkitChannel { - on(cb) { - this.listener.add(cb); - return ()=>void this.listener.delete(cb) - ; - } - send(data) { - globalThis.webkit.messageHandlers[key].postMessage(data); - } - constructor(){ - this.listener = new Set(); - document.addEventListener(key, (e)=>{ - const detail = e.detail; - for (const f of this.listener){ - try { - f(detail); - } catch {} - } - }); - } -} - -;// CONCATENATED MODULE: ./shared/native-rpc/index.ts - - - -// This module won't be used in Web. Let it not effecting HMR. -if (false) {} -const hasNativeAPI = "app" === 'app'; -let nativeAPI = undefined; -let sharedNativeAPI = (/* unused pure expression or super */ null && (undefined)); -if (true) { - const options = { - key: 'native', - parameterStructures: 'by-name' - }; - if (true) { - const api = sharedNativeAPI = (0,full/* AsyncCall */.LE)(/** - * Typescript will not add the file to the project dependency tree - * but webpack will do constant folding - */ // @ts-ignore - // eslint-disable-next-line no-useless-concat - __webpack_require__.e(/* import() */ 8699).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI - ), { - ...options, - channel: new iOSWebkitChannel() - }); - nativeAPI = { - type: 'iOS', - api - }; - } else {} -} - - /***/ }), /***/ 86880: diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5689.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5689.js index d966ec9e..8c7bae9b 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5689.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.5689.js @@ -208,7 +208,7 @@ if (true) { * but webpack will do constant folding */ // @ts-ignore // eslint-disable-next-line no-useless-concat - __webpack_require__.e(/* import() */ 8699).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI ), { ...options, channel: new iOSWebkitChannel() diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.6164.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.6164.js index 7057f807..57458d4b 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.6164.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.6164.js @@ -425,7 +425,7 @@ const FooterLine = /*#__PURE__*/ (0,react.memo)(()=>{ if ( true && !event.metaKey) { (0,src/* openWindow */.xw)(`${links/* DOWNLOAD_LINK_STABLE_PREFIX */.kP}/v${version}`); } else { - (0,src/* openWindow */.xw)(`${links/* DOWNLOAD_LINK_UNSTABLE_PREFIX */.Xe}/${"181e22679"}`); + (0,src/* openWindow */.xw)(`${links/* DOWNLOAD_LINK_UNSTABLE_PREFIX */.Xe}/${"43c1c2a66"}`); } }; return /*#__PURE__*/ (0,jsx_runtime.jsxs)(jsx_runtime.Fragment, { @@ -450,7 +450,7 @@ const FooterLine = /*#__PURE__*/ (0,react.memo)(()=>{ }), /*#__PURE__*/ (0,jsx_runtime.jsx)(FooterLinkButton, { onClick: openVersionLink, - title: "v1.29.12-2348-g181e22679", + title: "v1.29.12-2350-g43c1c2a66", children: /*#__PURE__*/ (0,jsx_runtime.jsx)(Version, {}) }), /*#__PURE__*/ (0,jsx_runtime.jsx)(FooterLinkExternal, { diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.664.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.664.js index 2efb5603..5dd616b3 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.664.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.664.js @@ -680,7 +680,7 @@ if (true) { * but webpack will do constant folding */ // @ts-ignore // eslint-disable-next-line no-useless-concat - __webpack_require__.e(/* import() */ 8699).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI ), { ...options, channel: new iOSWebkitChannel() diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7025.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7025.js index e4b5ef6b..14868882 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7025.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7025.js @@ -1,5 +1,5 @@ "use strict"; -(globalThis["webpackChunk_masknet_extension"] = globalThis["webpackChunk_masknet_extension"] || []).push([[7025,3615],{ +(globalThis["webpackChunk_masknet_extension"] = globalThis["webpackChunk_masknet_extension"] || []).push([[7025],{ /***/ 27440: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -418,129 +418,6 @@ const { createPostDB , updatePostDB , queryPostDB , queryPostsDB , queryPostPage }); -/***/ }), - -/***/ 96182: -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Ns": () => (/* binding */ createDBAccessWithAsyncUpgrade), -/* harmony export */ "Z_": () => (/* binding */ createDBAccess), -/* harmony export */ "_X": () => (/* binding */ createTransaction) -/* harmony export */ }); -/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(85646); -/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62481); - - -const iOSFix = true ? __webpack_require__.e(/* import() */ 426).then(__webpack_require__.bind(__webpack_require__, 40426)).then(({ default: ready })=>ready() -) : 0; -function createDBAccess(opener) { - let db = undefined; - if (true) { - // iOS bug: indexedDB dies randomly - _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); - setInterval(clean, /** 1 min */ 1000 * 60); - } - function clean() { - if (db) { - db.close(); - db.addEventListener('close', ()=>db = undefined - , { - once: true - }); - } - db = undefined; - } - return async ()=>{ - await iOSFix; - (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); - if (db) { - try { - // try if the db still open - const t = db.transaction([ - db.objectStoreNames[0] - ], 'readonly', {}); - t.commit(); - return db; - } catch { - clean(); - } - } - db = await opener(); - db.addEventListener('close', clean, { - once: true - }); - db.addEventListener('error', clean, { - once: true - }); - return db; - }; -} -function createDBAccessWithAsyncUpgrade(firstVersionThatRequiresAsyncUpgrade, latestVersion, opener, asyncUpgradePrepare) { - let db = undefined; - if (true) { - // iOS bug: indexedDB dies randomly - _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); - setInterval(clean, /** 1 min */ 1000 * 60); - } - function clean() { - if (db) { - db.close(); - db.addEventListener('close', ()=>pendingOpen = db = undefined - , { - once: true - }); - } - pendingOpen = db = undefined; - } - let pendingOpen; - async function open() { - await iOSFix; - (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); - if (db?.version === latestVersion) return db; - let currentVersion = firstVersionThatRequiresAsyncUpgrade; - let lastVersionData = undefined; - while(currentVersion < latestVersion){ - try { - db = await opener(currentVersion, lastVersionData); - // if the open success, the stored version is small or eq than currentTryOpenVersion - // let's call the prepare function to do all the async jobs - lastVersionData = await asyncUpgradePrepare(db); - } catch (error) { - if (currentVersion >= latestVersion) throw error; - // if the stored database version is bigger than the currentTryOpenVersion - // It will fail and we just move to next version - } - currentVersion += 1; - db?.close(); - db = undefined; - } - db = await opener(currentVersion, lastVersionData); - db.addEventListener('close', (e)=>db = undefined - , { - once: true - }); - if (!db) throw new Error('Invalid state'); - return db; - } - return ()=>{ - // Share a Promise to prevent async upgrade for multiple times - if (pendingOpen) return pendingOpen; - const promise = pendingOpen = open(); - promise.catch(()=>pendingOpen = undefined - ); - return promise; - }; -} -function createTransaction(db, mode) { - // It must be a high order function to infer the type of UsedStoreName correctly. - return (...storeNames)=>{ - return db.transaction(storeNames, mode); - }; -} - - /***/ }), /***/ 6739: diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7075.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7075.js index 2832fa86..097deb72 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7075.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.7075.js @@ -113,6 +113,454 @@ function scheduleAvatarMetaUpdate(id1, meta1) { } +/***/ }), + +/***/ 57605: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "h": () => (/* binding */ savePostKeyToDB) +/* harmony export */ }); +/* harmony import */ var _utils_pure__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86880); +/* harmony import */ var _utils_openDB__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(96182); +/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51876); + + + +async function savePostKeyToDB(id, key, extraInfo) { + const jwk = await (0,_utils_pure__WEBPACK_IMPORTED_MODULE_0__/* .CryptoKeyToJsonWebKey */ .iV)(key); + { + const t = (0,_utils_openDB__WEBPACK_IMPORTED_MODULE_1__/* .createTransaction */ ._X)(await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .PostDBAccess */ .Nz)(), 'readwrite')('post'); + const post = await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .queryPostDB */ .q3)(id, t); + if (!post) { + await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .createPostDB */ .$v)({ + identifier: id, + postCryptoKey: jwk, + foundAt: new Date(), + ...extraInfo + }, t); + } else { + await (0,_index__WEBPACK_IMPORTED_MODULE_2__/* .updatePostDB */ .rr)({ + ...post, + postCryptoKey: jwk + }, 'override', t); + } + } +} + + +/***/ }), + +/***/ 51876: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "$v": () => (/* binding */ createPostDB), +/* harmony export */ "Nz": () => (/* binding */ PostDBAccess), +/* harmony export */ "hZ": () => (/* binding */ queryPostsDB), +/* harmony export */ "q3": () => (/* binding */ queryPostDB), +/* harmony export */ "rr": () => (/* binding */ updatePostDB), +/* harmony export */ "xN": () => (/* binding */ queryPostPagedDB) +/* harmony export */ }); +/* harmony import */ var _shared_native_rpc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(30246); + + +const { createPostDB , updatePostDB , queryPostDB , queryPostsDB , queryPostPagedDB , PostDBAccess } = new Proxy({}, { + get (_, key) { + return async function(...args) { + if (_shared_native_rpc__WEBPACK_IMPORTED_MODULE_0__/* .hasNativeAPI */ ._) { + return __webpack_require__.e(/* import() */ 3922).then(__webpack_require__.bind(__webpack_require__, 43922)).then((x)=>x[key](...args) + ); + } + return Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(8905)]).then(__webpack_require__.bind(__webpack_require__, 98905)).then((x)=>x[key](...args) + ); + }; + } +}); + + +/***/ }), + +/***/ 96182: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Ns": () => (/* binding */ createDBAccessWithAsyncUpgrade), +/* harmony export */ "Z_": () => (/* binding */ createDBAccess), +/* harmony export */ "_X": () => (/* binding */ createTransaction) +/* harmony export */ }); +/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(85646); +/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62481); + + +const iOSFix = true ? __webpack_require__.e(/* import() */ 426).then(__webpack_require__.bind(__webpack_require__, 40426)).then(({ default: ready })=>ready() +) : 0; +function createDBAccess(opener) { + let db = undefined; + if (true) { + // iOS bug: indexedDB dies randomly + _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); + setInterval(clean, /** 1 min */ 1000 * 60); + } + function clean() { + if (db) { + db.close(); + db.addEventListener('close', ()=>db = undefined + , { + once: true + }); + } + db = undefined; + } + return async ()=>{ + await iOSFix; + (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); + if (db) { + try { + // try if the db still open + const t = db.transaction([ + db.objectStoreNames[0] + ], 'readonly', {}); + t.commit(); + return db; + } catch { + clean(); + } + } + db = await opener(); + db.addEventListener('close', clean, { + once: true + }); + db.addEventListener('error', clean, { + once: true + }); + return db; + }; +} +function createDBAccessWithAsyncUpgrade(firstVersionThatRequiresAsyncUpgrade, latestVersion, opener, asyncUpgradePrepare) { + let db = undefined; + if (true) { + // iOS bug: indexedDB dies randomly + _shared__WEBPACK_IMPORTED_MODULE_0__/* .MaskMessages.events.mobile_app_suspended.on */ .ql.events.mobile_app_suspended.on(clean); + setInterval(clean, /** 1 min */ 1000 * 60); + } + function clean() { + if (db) { + db.close(); + db.addEventListener('close', ()=>pendingOpen = db = undefined + , { + once: true + }); + } + pendingOpen = db = undefined; + } + let pendingOpen; + async function open() { + await iOSFix; + (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.assertEnvironment)(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_1__.Environment.ManifestBackground); + if (db?.version === latestVersion) return db; + let currentVersion = firstVersionThatRequiresAsyncUpgrade; + let lastVersionData = undefined; + while(currentVersion < latestVersion){ + try { + db = await opener(currentVersion, lastVersionData); + // if the open success, the stored version is small or eq than currentTryOpenVersion + // let's call the prepare function to do all the async jobs + lastVersionData = await asyncUpgradePrepare(db); + } catch (error) { + if (currentVersion >= latestVersion) throw error; + // if the stored database version is bigger than the currentTryOpenVersion + // It will fail and we just move to next version + } + currentVersion += 1; + db?.close(); + db = undefined; + } + db = await opener(currentVersion, lastVersionData); + db.addEventListener('close', (e)=>db = undefined + , { + once: true + }); + if (!db) throw new Error('Invalid state'); + return db; + } + return ()=>{ + // Share a Promise to prevent async upgrade for multiple times + if (pendingOpen) return pendingOpen; + const promise = pendingOpen = open(); + promise.catch(()=>pendingOpen = undefined + ); + return promise; + }; +} +function createTransaction(db, mode) { + // It must be a high order function to infer the type of UsedStoreName correctly. + return (...storeNames)=>{ + return db.transaction(storeNames, mode); + }; +} + + +/***/ }), + +/***/ 57691: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "D": () => (/* binding */ decryptionWithSocialNetworkDecoding), +/* harmony export */ "E": () => (/* binding */ getPostKeyCache) +/* harmony export */ }); +/* harmony import */ var _dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(28807); +/* harmony import */ var _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(52222); +/* harmony import */ var _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(78144); +/* harmony import */ var lodash_unified__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(21122); +/* harmony import */ var _database_persona_db__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(60562); +/* harmony import */ var _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(16426); +/* harmony import */ var _database_post__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51876); +/* harmony import */ var _database_post_helper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(57605); +/* harmony import */ var _network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(25449); + + + + + + + + + +const downloadImage = (url)=>fetch(url).then((x)=>x.arrayBuffer() + ) +; +/** + * + * @param encoded If the encoded content is a text, it should only contain 1 payload. Extra payload will be ignored. + * @param context + */ async function* decryptionWithSocialNetworkDecoding(encoded, context) { + let decoded; + if (encoded.type === 'text') { + decoded = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .socialNetworkDecoder */ .FW)(context.currentSocialNetwork, encoded.text)[0]; + } else { + if (!context.authorHint || context.authorHint.isUnknown) { + return yield new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.UnrecognizedAuthor */ .OF.UnrecognizedAuthor, undefined); + } + const result = await (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .steganographyDecodeImage */ .oX)(encoded.image, { + pass: context.authorHint.toText(), + downloadImage + }); + decoded = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .socialNetworkDecoder */ .FW)(context.currentSocialNetwork, result)[0]; + } + if (!decoded) return yield new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.NoPayloadFound */ .OF.NoPayloadFound, undefined); + yield* decryption(decoded, context); +} +const inMemoryCache = new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .IdentifierMap */ .qD(new Map(), _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .PostIVIdentifier */ .bb); +async function* decryption(payload, context) { + const parse = await (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .parsePayload */ .WZ)(payload); + if (parse.err) return null; + const { currentSocialNetwork , postURL } = context; + let { currentProfile , authorHint } = context; + if (currentProfile?.isUnknown) currentProfile = null; + if (authorHint?.isUnknown) authorHint = null; + // #region Identify the PostIdentifier + const iv1 = parse.val.encryption.unwrapOr(null)?.iv.unwrapOr(null); + { + if (!iv1) return null; + // iv is required to identify the post and it also used in comment encryption. + const info = { + type: _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptProgressKind.Info */ .Pj.Info, + iv: iv1, + version: parse.val.version + }; + if (parse.val.encryption.ok) { + const val = parse.val.encryption.val; + info.publicShared = val.type === 'public'; + if (val.type === 'E2E' && val.ownersAESKeyEncrypted.ok) info.ownersKeyEncrypted = val.ownersAESKeyEncrypted.val; + } + yield info; + } + const id = new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .PostIVIdentifier */ .bb((0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnumToProfileDomain */ .VC)(currentSocialNetwork), (0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__/* .encodeArrayBuffer */ .ll)(iv1.buffer)); + // #endregion + if (inMemoryCache.has(id)) { + const p = { + type: _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptProgressKind.Success */ .Pj.Success, + content: inMemoryCache.get(id) + }; + return void (yield p); + } + // #region store author public key into the database + try { + const id = parse.unwrap().author.unwrap().unwrap(); + const cacheKey = id.toText(); + if (!hasStoredAuthorPublicKey.has(cacheKey)) { + storeAuthorPublicKey(id, authorHint, parse.unwrap().authorPublicKey.unwrap().unwrap()).catch(lodash_unified__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .Z); + hasStoredAuthorPublicKey.add(cacheKey); + } + } catch {} + // #endregion + const progress = (0,_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .decrypt */ .pe)({ + message: parse.val, + onDecrypted (message) { + inMemoryCache.set(id, message); + } + }, { + getPostKeyCache: getPostKeyCache.bind(null, id), + setPostKeyCache: (key)=>{ + return (0,_database_post_helper__WEBPACK_IMPORTED_MODULE_6__/* .savePostKeyToDB */ .h)(id, key, { + // public post will not call this function. + // and recipients only will be set when posting/appending recipients. + recipients: new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .IdentifierMap */ .qD(new Map()), + postBy: authorHint || parse.safeUnwrap().author.unwrapOr(null)?.unwrapOr(null) || _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .ProfileIdentifier.unknown */ .WO.unknown, + url: postURL + }); + }, + hasLocalKeyOf: _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .hasLocalKeyOf */ .wf, + decryptByLocalKey: _database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .decryptByLocalKey */ .MM, + async deriveAESKey (pub) { + return Array.from((await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .deriveAESByECDH */ .Si)(pub)).values()); + }, + queryAuthorPublicKey (author, signal) { + return (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(author || authorHint); + }, + // TODO: get a gun instance + async *queryPostKey_version37 () { + throw new Error('TODO'); + }, + async *queryPostKey_version38 (iv, signal) { + const author = await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(context.currentProfile); + if (!author) throw new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.CurrentProfileDoesNotConnectedToPersona */ .OF.CurrentProfileDoesNotConnectedToPersona, undefined); + yield* (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version39Or38 */ .ab)(-38, iv, author, getNetworkHint(context.currentSocialNetwork), signal || new AbortController().signal); + }, + async *queryPostKey_version39 (iv, signal) { + const author = await (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .queryPublicKey */ .M_)(context.currentProfile); + if (!author) throw new _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptError */ .G6(_masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .DecryptErrorReasons.CurrentProfileDoesNotConnectedToPersona */ .OF.CurrentProfileDoesNotConnectedToPersona, undefined); + yield* (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version39Or38 */ .ab)(-39, iv, author, getNetworkHint(context.currentSocialNetwork), signal || new AbortController().signal); + }, + async queryPostKey_version40 (iv) { + if (!currentProfile) return null; + return (0,_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_7__/* .GUN_queryPostKey_version40 */ .Kl)(iv, currentProfile.userId); + } + }); + yield* progress; + return null; +} +function getNetworkHint(x) { + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Facebook */ .Gq.Facebook) return ''; + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Twitter */ .Gq.Twitter) return 'twitter-'; + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Minds */ .Gq.Minds) return 'minds-'; + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Instagram */ .Gq.Instagram) return 'instagram-'; + if (x === _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .SocialNetworkEnum.Unknown */ .Gq.Unknown) throw new TypeError('[@masknet/encryption] Current SNS network is not correctly configured.'); + (0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_0__/* .unreachable */ .t1)(x); +} +/** @internal */ async function getPostKeyCache(id) { + const post = await (0,_database_post__WEBPACK_IMPORTED_MODULE_5__/* .queryPostDB */ .q3)(id); + if (!post?.postCryptoKey) return null; + const k = await crypto.subtle.importKey('jwk', post.postCryptoKey, { + name: 'AES-GCM', + length: 256 + }, true, [ + 'decrypt', + ]); + return k; +} +const hasStoredAuthorPublicKey = new Set(); +async function storeAuthorPublicKey(payloadAuthor, postAuthor, pub) { + if (!payloadAuthor.equals(postAuthor)) { + // ! Author detected is not equal to AuthorHint. + // ! Skip store the public key because it might be a security problem. + return; + } + if (pub.algr !== _masknet_encryption__WEBPACK_IMPORTED_MODULE_1__/* .EC_KeyCurveEnum.secp256k1 */ .qx.secp256k1) { + throw new Error('TODO: support other curves'); + } + // if privateKey, we should possibly not recreate it + const profile = await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryProfileDB */ .IW)(payloadAuthor); + const persona = profile?.linkedPersona ? await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryPersonaDB */ .Hm)(profile.linkedPersona) : undefined; + if (persona?.privateKey) return; + const key = await crypto.subtle.exportKey('jwk', pub.key); + const otherPersona = await (0,_database_persona_db__WEBPACK_IMPORTED_MODULE_3__/* .queryPersonaDB */ .Hm)((0,_masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .ECKeyIdentifierFromJsonWebKey */ .CH)(key)); + if (otherPersona?.privateKey) return; + return (0,_database_persona_helper__WEBPACK_IMPORTED_MODULE_4__/* .createProfileWithPersona */ .lr)(payloadAuthor, { + connectionConfirmState: 'confirmed' + }, { + publicKey: await crypto.subtle.exportKey('jwk', pub.key) + }); +} + + +/***/ }), + +/***/ 30246: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "_": () => (/* binding */ hasNativeAPI), + "Nz": () => (/* binding */ nativeAPI) +}); + +// UNUSED EXPORTS: sharedNativeAPI + +// EXTERNAL MODULE: ../../node_modules/.pnpm/async-call-rpc@6.0.2/node_modules/async-call-rpc/out/full.mjs +var full = __webpack_require__(19245); +;// CONCATENATED MODULE: ./shared/native-rpc/iOS.channel.ts +// cspell:disable-next-line +const key = 'maskbookjsonrpc'; +class iOSWebkitChannel { + on(cb) { + this.listener.add(cb); + return ()=>void this.listener.delete(cb) + ; + } + send(data) { + globalThis.webkit.messageHandlers[key].postMessage(data); + } + constructor(){ + this.listener = new Set(); + document.addEventListener(key, (e)=>{ + const detail = e.detail; + for (const f of this.listener){ + try { + f(detail); + } catch {} + } + }); + } +} + +;// CONCATENATED MODULE: ./shared/native-rpc/index.ts + + + +// This module won't be used in Web. Let it not effecting HMR. +if (false) {} +const hasNativeAPI = "app" === 'app'; +let nativeAPI = undefined; +let sharedNativeAPI = (/* unused pure expression or super */ null && (undefined)); +if (true) { + const options = { + key: 'native', + parameterStructures: 'by-name' + }; + if (true) { + const api = sharedNativeAPI = (0,full/* AsyncCall */.LE)(/** + * Typescript will not add the file to the project dependency tree + * but webpack will do constant folding + */ // @ts-ignore + // eslint-disable-next-line no-useless-concat + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + ), { + ...options, + channel: new iOSWebkitChannel() + }); + nativeAPI = { + type: 'iOS', + api + }; + } else {} +} + + /***/ }), /***/ 80614: diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.8563.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.8563.js index be350f7c..e5293fdb 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.8563.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.8563.js @@ -5712,7 +5712,7 @@ if (true) { * but webpack will do constant folding */ // @ts-ignore // eslint-disable-next-line no-useless-concat - __webpack_require__.e(/* import() */ 8699).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI + Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(8699)]).then(__webpack_require__.bind(__webpack_require__, 98699)).then((x)=>x.MaskNetworkAPI ), { ...options, channel: new iOSWebkitChannel() diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.8699.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.8699.js index 1286af0a..ef296b00 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.8699.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/chunk.8699.js @@ -552,16 +552,18 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var json_stable_stringify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92304); /* harmony import */ var json_stable_stringify__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(json_stable_stringify__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _dimensiondev_kit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(28807); -/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(85646); -/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(85646); +/* harmony import */ var _dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(78144); /* harmony import */ var _social_network_define__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(57601); /* harmony import */ var _settings_settings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(80917); /* harmony import */ var _extension_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5027); /* harmony import */ var _masknet_plugin_wallet__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(19841); /* harmony import */ var _plugins_Wallet_messages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(84797); -/* harmony import */ var _masknet_web3_shared_evm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(65506); +/* harmony import */ var _masknet_web3_shared_evm__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(65506); /* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(32196); +/* harmony import */ var _background_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(25449); + @@ -831,7 +833,7 @@ const MaskNetworkAPI = { wallet_updateEthereumAccount: async ({ account })=>{ await _plugins_Wallet_messages__WEBPACK_IMPORTED_MODULE_7__/* .WalletRPC.updateAccount */ .V.updateAccount({ account, - providerType: _masknet_web3_shared_evm__WEBPACK_IMPORTED_MODULE_9__/* .ProviderType.MaskWallet */ .lP.MaskWallet + providerType: _masknet_web3_shared_evm__WEBPACK_IMPORTED_MODULE_10__/* .ProviderType.MaskWallet */ .lP.MaskWallet }); _masknet_plugin_wallet__WEBPACK_IMPORTED_MODULE_6__/* .WalletMessages.events.walletsUpdated.sendToAll */ .R$.events.walletsUpdated.sendToAll(); }, @@ -890,11 +892,28 @@ const MaskNetworkAPI = { }) ) }; + }, + publish_e2eResult_to_gun: async ({ postIV , networkHint , e2eResult })=>{ + const postIVData = new Uint8Array((0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_1__/* .decodeArrayBuffer */ .xe)(postIV)); + const receiverKeys = new _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .IdentifierMap */ .qD(new Map(), _masknet_shared_base__WEBPACK_IMPORTED_MODULE_2__/* .ProfileIdentifier */ .WO); + for (const result of e2eResult){ + const identifier = stringToProfileIdentifier(result.target); + const key = { + encryptedPostKey: new Uint8Array((0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_1__/* .decodeArrayBuffer */ .xe)(result.encryptedPostKey)), + ivToBePublished: new Uint8Array((0,_dimensiondev_kit__WEBPACK_IMPORTED_MODULE_1__/* .decodeArrayBuffer */ .xe)(result.ivToBePublished)), + target: identifier + }; + const fullfilledResult = { + value: key + }; + receiverKeys.set(identifier, fullfilledResult); + } + await (0,_background_network_gun_encryption_queryPostKey__WEBPACK_IMPORTED_MODULE_9__/* .publishPostAESKey_version39Or38 */ .U4)(-38, postIVData, networkHint, receiverKeys); } }; function wrapWithAssert(env, f) { return (...args)=>{ - (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_10__.assertEnvironment)(env); + (0,_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_11__.assertEnvironment)(env); return f(...args); }; } @@ -903,9 +922,9 @@ try { const key = _key; const f = MaskNetworkAPI[key]; if (key.startsWith('SNSAdaptor_')) { - MaskNetworkAPI[key] = wrapWithAssert(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_10__.Environment.ContentScript, f); + MaskNetworkAPI[key] = wrapWithAssert(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_11__.Environment.ContentScript, f); } else { - MaskNetworkAPI[key] = wrapWithAssert(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_10__.Environment.ManifestBackground, f); + MaskNetworkAPI[key] = wrapWithAssert(_dimensiondev_holoflows_kit__WEBPACK_IMPORTED_MODULE_11__.Environment.ManifestBackground, f); } } } catch {} diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/contentScript.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/contentScript.js index 21836b2d..3e28c66b 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/contentScript.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/contentScript.js @@ -1531,7 +1531,7 @@ const log = { requestReplay: "production" === 'development' }; const Services = { - Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(7691), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) + Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(5449), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) , 'Crypto'), Identity: add(()=>Promise.all(/* import() */[__webpack_require__.e(2698), __webpack_require__.e(3294), __webpack_require__.e(6739), __webpack_require__.e(4227), __webpack_require__.e(4544), __webpack_require__.e(5737), __webpack_require__.e(3883), __webpack_require__.e(6045), __webpack_require__.e(1077), __webpack_require__.e(8117), __webpack_require__.e(2943), __webpack_require__.e(5756), __webpack_require__.e(8492), __webpack_require__.e(7765), __webpack_require__.e(1305), __webpack_require__.e(5891), __webpack_require__.e(8936), __webpack_require__.e(6265), __webpack_require__.e(1246), __webpack_require__.e(7141), __webpack_require__.e(708), __webpack_require__.e(9447), __webpack_require__.e(7764), __webpack_require__.e(4859), __webpack_require__.e(8563), __webpack_require__.e(1064), __webpack_require__.e(7025)]).then(__webpack_require__.bind(__webpack_require__, 17865)) , 'Identity'), @@ -1549,7 +1549,7 @@ const Services = { , 'ThirdPartyPlugin') }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Services); -const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(7691), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) +const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) , 'ServicesWithProgress', true); if (false) {} /** diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/dashboard.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/dashboard.js index b2a3d015..38b2fc7a 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/dashboard.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/dashboard.js @@ -341,7 +341,7 @@ const log = { requestReplay: "production" === 'development' }; const Services = { - Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(7691), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) + Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(5449), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) , 'Crypto'), Identity: add(()=>Promise.all(/* import() */[__webpack_require__.e(2698), __webpack_require__.e(3294), __webpack_require__.e(6739), __webpack_require__.e(4227), __webpack_require__.e(4544), __webpack_require__.e(5737), __webpack_require__.e(3883), __webpack_require__.e(6045), __webpack_require__.e(1077), __webpack_require__.e(8117), __webpack_require__.e(2943), __webpack_require__.e(5756), __webpack_require__.e(8492), __webpack_require__.e(7765), __webpack_require__.e(1305), __webpack_require__.e(5891), __webpack_require__.e(8936), __webpack_require__.e(6265), __webpack_require__.e(1246), __webpack_require__.e(7141), __webpack_require__.e(708), __webpack_require__.e(9447), __webpack_require__.e(7764), __webpack_require__.e(4859), __webpack_require__.e(8563), __webpack_require__.e(1064), __webpack_require__.e(7025)]).then(__webpack_require__.bind(__webpack_require__, 17865)) , 'Identity'), @@ -359,7 +359,7 @@ const Services = { , 'ThirdPartyPlugin') }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Services); -const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(7691), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) +const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) , 'ServicesWithProgress', true); if (false) {} /** diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/debug.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/debug.js index 15f99579..8eee2115 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/debug.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/debug.js @@ -747,11 +747,11 @@ const body = `\ ## Environment User Agent: ${navigator.userAgent} -Version: ${"v1.29.12-2348-g181e22679"} +Version: ${"v1.29.12-2350-g43c1c2a66"} Tag Name: ${"v2.5.0"} -Build Date: ${"2022-06-01T07:52:48.068Z"} -Commit Hash: ${"181e22679"} -Commit Date: ${"2022-06-01T07:46:29.000Z"} +Build Date: ${"2022-06-10T07:34:58.455Z"} +Commit Hash: ${"43c1c2a66"} +Commit Date: ${"2022-06-10T07:28:19.000Z"} Remote URL: ${"git@github.com:DimensionDev/Maskbook.git"} Branch Name: ${"feat/mobile"} @@ -782,11 +782,11 @@ var src = __webpack_require__(53242); const DEBUG_INFO = { 'User Agent': navigator.userAgent, - 'Mask Version': "v1.29.12-2348-g181e22679", + 'Mask Version': "v1.29.12-2350-g43c1c2a66", 'Build Date': process.env.channel_DATE, 'Tag Name': "v2.5.0", - 'Commit Hash': "181e22679", - 'Commit Date': "2022-06-01T07:46:29.000Z", + 'Commit Hash': "43c1c2a66", + 'Commit Date': "2022-06-10T07:28:19.000Z", 'Remote URL': "git@github.com:DimensionDev/Maskbook.git", 'Branch Name': "feat/mobile", Dirty: false, @@ -993,11 +993,11 @@ async function backupAll() { const payload = { buildInfo: { 'user-agent': navigator.userAgent, - version: "v1.29.12-2348-g181e22679", - 'build-date': "2022-06-01T07:52:48.068Z", + version: "v1.29.12-2350-g43c1c2a66", + 'build-date': "2022-06-10T07:34:58.455Z", 'tag-name': "v2.5.0", - 'commit-hash': "181e22679", - 'commit-date': "2022-06-01T07:46:29.000Z", + 'commit-hash': "43c1c2a66", + 'commit-date': "2022-06-10T07:28:19.000Z", 'remote-url': "git@github.com:DimensionDev/Maskbook.git", 'branch-name': "feat/mobile", dirty: false, @@ -1057,7 +1057,7 @@ const log = { requestReplay: "production" === 'development' }; const Services = { - Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(7691), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) + Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(5449), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) , 'Crypto'), Identity: add(()=>Promise.all(/* import() */[__webpack_require__.e(2698), __webpack_require__.e(3294), __webpack_require__.e(6739), __webpack_require__.e(4227), __webpack_require__.e(4544), __webpack_require__.e(5737), __webpack_require__.e(3883), __webpack_require__.e(6045), __webpack_require__.e(1077), __webpack_require__.e(8117), __webpack_require__.e(2943), __webpack_require__.e(5756), __webpack_require__.e(8492), __webpack_require__.e(7765), __webpack_require__.e(1305), __webpack_require__.e(5891), __webpack_require__.e(8936), __webpack_require__.e(6265), __webpack_require__.e(1246), __webpack_require__.e(7141), __webpack_require__.e(708), __webpack_require__.e(9447), __webpack_require__.e(7764), __webpack_require__.e(4859), __webpack_require__.e(8563), __webpack_require__.e(1064), __webpack_require__.e(7025)]).then(__webpack_require__.bind(__webpack_require__, 17865)) , 'Identity'), @@ -1075,7 +1075,7 @@ const Services = { , 'ThirdPartyPlugin') }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Services); -const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(7691), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) +const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) , 'ServicesWithProgress', true); if (false) {} /** diff --git a/DevelopmentPod/MaskbookPlugin/maskbook/js/popups.js b/DevelopmentPod/MaskbookPlugin/maskbook/js/popups.js index 7014da87..ba066c0b 100644 --- a/DevelopmentPod/MaskbookPlugin/maskbook/js/popups.js +++ b/DevelopmentPod/MaskbookPlugin/maskbook/js/popups.js @@ -1461,7 +1461,7 @@ const log = { requestReplay: "production" === 'development' }; const Services = { - Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(7691), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) + Crypto: add(()=>Promise.all(/* import() */[__webpack_require__.e(6739), __webpack_require__.e(2943), __webpack_require__.e(5449), __webpack_require__.e(7075)]).then(__webpack_require__.bind(__webpack_require__, 67075)) , 'Crypto'), Identity: add(()=>Promise.all(/* import() */[__webpack_require__.e(2698), __webpack_require__.e(3294), __webpack_require__.e(6739), __webpack_require__.e(4227), __webpack_require__.e(4544), __webpack_require__.e(5737), __webpack_require__.e(3883), __webpack_require__.e(6045), __webpack_require__.e(1077), __webpack_require__.e(8117), __webpack_require__.e(2943), __webpack_require__.e(5756), __webpack_require__.e(8492), __webpack_require__.e(7765), __webpack_require__.e(1305), __webpack_require__.e(5891), __webpack_require__.e(8936), __webpack_require__.e(6265), __webpack_require__.e(1246), __webpack_require__.e(7141), __webpack_require__.e(708), __webpack_require__.e(9447), __webpack_require__.e(7764), __webpack_require__.e(4859), __webpack_require__.e(8563), __webpack_require__.e(1064), __webpack_require__.e(7025)]).then(__webpack_require__.bind(__webpack_require__, 17865)) , 'Identity'), @@ -1479,7 +1479,7 @@ const Services = { , 'ThirdPartyPlugin') }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Services); -const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(7691), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) +const ServicesWithProgress = add(()=>Promise.all(/* import() */[__webpack_require__.e(5449), __webpack_require__.e(5114)]).then(__webpack_require__.bind(__webpack_require__, 45114)) , 'ServicesWithProgress', true); if (false) {} /** diff --git a/Localization/app.json b/Localization/app.json index e648b602..f400f936 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -892,6 +892,14 @@ "Everyone": "Everyone can see", "only_me": "Only me", "special_contacts": "Special Contacts can see" + }, + "compose_type": { + "title": "Who can see your post?", + "everyone": "Everyone", + "everyone_content": "Every twitter user can see.", + "only_me": "Only me", + "only_me_content": "Only I can see it.", + "special_contacts": "Specific Contacts" } }, "chain": { diff --git a/Maskbook.xcodeproj/project.pbxproj b/Maskbook.xcodeproj/project.pbxproj index bc849e44..6c275b25 100644 --- a/Maskbook.xcodeproj/project.pbxproj +++ b/Maskbook.xcodeproj/project.pbxproj @@ -627,6 +627,7 @@ 2DEDDEA82761ED7000D37A76 /* WalletConnectSession+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DEDDEA62761ED7000D37A76 /* WalletConnectSession+CoreDataClass.swift */; }; 2DEDDEA92761ED7000D37A76 /* WalletConnectSession+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DEDDEA72761ED7000D37A76 /* WalletConnectSession+CoreDataProperties.swift */; }; 2DEDDEAB2761EE7900D37A76 /* MaskClientMeta.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DEDDEAA2761EE7900D37A76 /* MaskClientMeta.swift */; }; + 41046E41285313C20052ECDA /* MaskWebMessage+Encryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41046E40285313C20052ECDA /* MaskWebMessage+Encryption.swift */; }; 4156689327A53BA70051E0E7 /* ShareLinkGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4156689227A53BA70051E0E7 /* ShareLinkGenerator.swift */; }; 4156689527A68B770051E0E7 /* JsonWebKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4156689427A68B770051E0E7 /* JsonWebKey.swift */; }; 4168635327F434AE00F12DB2 /* BackupPreviewGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4168635227F434AE00F12DB2 /* BackupPreviewGenerator.swift */; }; @@ -1463,6 +1464,7 @@ 2DEDDEA72761ED7000D37A76 /* WalletConnectSession+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WalletConnectSession+CoreDataProperties.swift"; sourceTree = ""; }; 2DEDDEAA2761EE7900D37A76 /* MaskClientMeta.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaskClientMeta.swift; sourceTree = ""; }; 38EDB00BEE146CBE1A4FD713 /* Pods-MaskbookTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MaskbookTests.release.xcconfig"; path = "Target Support Files/Pods-MaskbookTests/Pods-MaskbookTests.release.xcconfig"; sourceTree = ""; }; + 41046E40285313C20052ECDA /* MaskWebMessage+Encryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MaskWebMessage+Encryption.swift"; sourceTree = ""; }; 4156689227A53BA70051E0E7 /* ShareLinkGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareLinkGenerator.swift; sourceTree = ""; }; 4156689427A68B770051E0E7 /* JsonWebKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JsonWebKey.swift; sourceTree = ""; }; 4168635227F434AE00F12DB2 /* BackupPreviewGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupPreviewGenerator.swift; sourceTree = ""; }; @@ -2786,6 +2788,7 @@ 2AF8834E271EE9300004565A /* MaskWebMessage+Wallet.swift */, 2AF8834F271EE9300004565A /* MaskWebMessage+Persona.swift */, 0F5810902733CDFB0040B4EC /* MaskWebMessage+IndexDB.swift */, + 41046E40285313C20052ECDA /* MaskWebMessage+Encryption.swift */, ); path = MaskWebMessage; sourceTree = ""; @@ -4586,6 +4589,7 @@ 5D2893E427D5DD0A0013FCB6 /* PersonaCollectionCell.swift in Sources */, 2AD31E6F282D367700CB3D49 /* String+Hex.swift in Sources */, 2AF88502271EE9310004565A /* PersonasActionViewModel.swift in Sources */, + 41046E41285313C20052ECDA /* MaskWebMessage+Encryption.swift in Sources */, 2AF88552271EE9310004565A /* SendTransactionConfirmViewModel.swift in Sources */, 5D554EC8279FE58D00D40848 /* OpenRedPackageViewModel.swift in Sources */, 1FEE1E9B277D8FDD00697F81 /* DappError.swift in Sources */, diff --git a/Maskbook/Extension/MaskWalletCore/Api_JWKResp.swift b/Maskbook/Extension/MaskWalletCore/Api_JWKResp.swift index 997457bc..0ff27d44 100644 --- a/Maskbook/Extension/MaskWalletCore/Api_JWKResp.swift +++ b/Maskbook/Extension/MaskWalletCore/Api_JWKResp.swift @@ -10,7 +10,7 @@ import Foundation import MaskWalletCore import SwiftyJSON -extension Api_JWKResp { +extension Api_JWK { var jsonString: String? { var json = JSON() json["crv"] = JSON(rawValue: crv) ?? [] @@ -23,7 +23,7 @@ extension Api_JWKResp { } } -extension Api_AesJWKResp { +extension Api_AesJWK { var jsonString: String? { var json = JSON() json["alg"] = JSON(rawValue: alg) ?? [] diff --git a/Maskbook/Generated/Assets.swift b/Maskbook/Generated/Assets.swift index 95246c7c..f8b5cf6a 100644 --- a/Maskbook/Generated/Assets.swift +++ b/Maskbook/Generated/Assets.swift @@ -530,6 +530,7 @@ internal enum Asset { internal static let pluginArrow = ImageAsset(name: "Plugins/pluginArrow") internal static let quickSwap = ImageAsset(name: "Plugins/quickSwap") internal static let selected = ColorAsset(name: "Plugins/selected") + internal static let selectedArrow = ImageAsset(name: "Plugins/selectedArrow") internal static let setting = ImageAsset(name: "Plugins/setting") internal static let settingColor = ColorAsset(name: "Plugins/settingColor") internal static let snapshot = ImageAsset(name: "Plugins/snapshot") diff --git a/Maskbook/Resources/Assets.xcassets/Plugins/selectedArrow.imageset/Contents.json b/Maskbook/Resources/Assets.xcassets/Plugins/selectedArrow.imageset/Contents.json new file mode 100644 index 00000000..d8ce94d9 --- /dev/null +++ b/Maskbook/Resources/Assets.xcassets/Plugins/selectedArrow.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Right 9.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Maskbook/Resources/Assets.xcassets/Plugins/selectedArrow.imageset/Right 9.pdf b/Maskbook/Resources/Assets.xcassets/Plugins/selectedArrow.imageset/Right 9.pdf new file mode 100644 index 00000000..8afe1713 Binary files /dev/null and b/Maskbook/Resources/Assets.xcassets/Plugins/selectedArrow.imageset/Right 9.pdf differ diff --git a/Maskbook/Resources/en.lproj/Localizable.strings b/Maskbook/Resources/en.lproj/Localizable.strings index 2e783255..f07d6f5c 100644 --- a/Maskbook/Resources/en.lproj/Localizable.strings +++ b/Maskbook/Resources/en.lproj/Localizable.strings @@ -757,4 +757,4 @@ to scan the QR Code"; "Tab.Labs" = "Labs"; "Tab.Personas" = "Persona"; "Tab.Setting" = "Setting"; -"Tab.Wallet" = "Wallet"; \ No newline at end of file +"Tab.Wallet" = "Wallet"; diff --git a/Maskbook/Scene/App/Labs/Controller/LabsViewController.swift b/Maskbook/Scene/App/Labs/Controller/LabsViewController.swift index cb046d45..e98b230b 100644 --- a/Maskbook/Scene/App/Labs/Controller/LabsViewController.swift +++ b/Maskbook/Scene/App/Labs/Controller/LabsViewController.swift @@ -46,7 +46,6 @@ final class LabsViewController: BaseViewController { scene: .luckyDrop(source: .lab, callback: nil), transition: .modal(animated: true) ) - case .fileService: self.coordinator.present( scene: .fileService, diff --git a/Maskbook/Scene/Compose/MessageComposeView.swift b/Maskbook/Scene/Compose/MessageComposeView.swift index 3c6141b0..1ca809e6 100644 --- a/Maskbook/Scene/Compose/MessageComposeView.swift +++ b/Maskbook/Scene/Compose/MessageComposeView.swift @@ -130,7 +130,7 @@ struct MessageComposeView: View { .font(FontStyles.rh7.font) .foregroundColor(Asset.Colors.Twitter.blue.asColor()) }.onTapGesture { - + viewModel.selectContactButtonClick() } } diff --git a/Maskbook/Scene/Compose/MessageComposeViewModel.swift b/Maskbook/Scene/Compose/MessageComposeViewModel.swift index a1f1bc1b..8a8843d8 100644 --- a/Maskbook/Scene/Compose/MessageComposeViewModel.swift +++ b/Maskbook/Scene/Compose/MessageComposeViewModel.swift @@ -3,6 +3,10 @@ import BigInt import Combine import SwiftUI import web3swift +import MaskWalletCore +import CoreDataStack +import WebExtension_Shim + final class MessageComposeViewModel: ObservableObject { private var disposeBag = Set() @@ -73,6 +77,11 @@ final class MessageComposeViewModel: ObservableObject { print("message compose \(plugin) add did clicked") } } + func selectContactButtonClick() { + let viewModel = SelectContactViewModel() + viewModel.selectedContactType = recipient + mainCoordinator.present(scene: .composeSelectContact(viewModel: viewModel, delegate: self), transition: .panModel(animated: true)) + } } extension MessageComposeViewModel { @@ -83,26 +92,63 @@ extension MessageComposeViewModel { } func encryptContent() { + let isPublic = recipient == .everyone var authorKeyData: Data? = nil + var authorPrivateKeyData: Data? + var localKey: Data? + var e2eParam: WalletCoreHelper.EncryptPostE2EParam? if let personaRecord = personaManager.currentPersona.value { let persona = Persona(fromRecord: personaRecord) authorKeyData = persona?.publicKey?.getRawData() + authorPrivateKeyData = Data(base64URLEncoded: personaRecord.dKeyInPrivateKey) + if let validLocalKey = persona?.localKey?.k { + localKey = Data(base64URLEncoded: validLocalKey) + } } - let socialPlatform = personaManager.currentProfile.value?.socialPlatform - let authorId = personaManager.currentProfile.value?.identifier + let socialPlatform = personaManager.currentProfile.value?.socialPlatform ?? .twitter + let authorId: String? = personaManager.currentProfile.value?.identifier .flatMap { $0.clip(first: "person:".count) } + let authorName = authorId?.components(separatedBy: "/").last + if !isPublic { + guard let authorPrivateKeyData = authorPrivateKeyData, + let localKey = localKey else { + // TODO: Error handling + return + } + var target = [String: Data]() + if case let .specialContacts(personaRecords) = recipient { + personaRecords.forEach { + let publicKeyData = Persona(fromRecord: $0)?.publicKey?.getRawData() + let profile = $0.linkedProfiles?.first(where: { _ in + true + }) as? ProfileRecord + let identifier = profile?.identifier + if let publicKeyData = publicKeyData, + let identifier = identifier { + target[identifier] = publicKeyData + } + } + } + e2eParam = WalletCoreHelper.EncryptPostE2EParam(localKey: localKey, target: target, authorPrivateKey: authorPrivateKeyData) + } - guard let encrtypedMessage = try? WalletCoreHelper.encryptPost( + guard let encryptionResult = try? WalletCoreHelper.encryptPost( + isPublic: isPublic, content: message, - authorID: authorId, + authorID: authorName, authorKeyData: authorKeyData, - socialPlatForm: socialPlatform, - metas: pluginContents).get() else { + socialPlatform: socialPlatform, + metas: pluginContents, + e2eParam: e2eParam + ).get() else { // TODO: Error handling return } - let finalPostText = getShareText(encrtypedMessage: encrtypedMessage) + let finalPostText = getShareText(encrtypedMessage: encryptionResult.output) + if !isPublic { + publishE2EResult(encryptionResult, platform: socialPlatform) + } log.debug("\(finalPostText)", source: "share") // past final text to twitter compose @@ -113,6 +159,48 @@ extension MessageComposeViewModel { } } + private func publishE2EResult(_ result: WalletCoreHelper.EncryptionResult, + platform: ProfileSocialPlatform) { + guard let postIVOrigin = result.postIdentifier.components(separatedBy: "/").last else { + return + } + let base64PostIV = postIVOrigin.replacingOccurrences(of: "|", with: "/") +// guard let postIVData = Data(base64Encoded: base64PostIV) else { +// return +// } + let networkHint = platform.url + typealias MWE2eResult = WebExtension.Encryption.PublishE2EResultMessage.Payload.EncryptionResultE2E + var e2eResult = [MWE2eResult]() + + for (identifier, v) in result.e2eResult { + let encryptPostKey = v.encryptedPostKeyData.base64EncodedString() + let ivToBePublished = v.iv?.base64EncodedString() ?? "" + let result = MWE2eResult(target: identifier, encryptedPostKey: encryptPostKey, ivToBePublished: ivToBePublished) + e2eResult.append(result) + } + let request = WebExtension.Encryption.PublishE2EResultMessage.withPayload { + .init(postIV: base64PostIV, + networkHint: networkHint, + e2eResult: e2eResult) + } + request + .eraseToAnyPublisher() + .sink { completion in + switch completion { + case let .failure(error): + log.debug("set current identifier error \(String(describing: error))", source: "persona") + + case .finished: + log.debug("set current identifier finished", source: "persona") + } + } receiveValue: { result in + if let error = result.error { + log.debug("set current identifier error \(String(describing: error.message))", source: "persona") + } + } + .store(in: &disposeBag) + } + private func getShareText(encrtypedMessage: String) -> String { let socialPlatform = personaManager.currentProfile.value?.socialPlatform let twitterAccount = L10n.Plugins.Luckydrop.twitterAccount @@ -141,10 +229,10 @@ extension MessageComposeViewModel { } extension MessageComposeViewModel { - enum Recipient: String, Equatable, CaseIterable { + enum Recipient: Equatable, CaseIterable { case everyone case onlyMe - case specialContacts + case specialContacts([PersonaRecord]) var title: String { switch self { @@ -161,6 +249,10 @@ extension MessageComposeViewModel { case .specialContacts: return Asset.Images.Scene.Compose.specialContacts.name } } + + static var allCases: [MessageComposeViewModel.Recipient] { + [.everyone, .onlyMe, .specialContacts([])] + } } } @@ -178,3 +270,10 @@ extension String { return String(subs) } } + +extension MessageComposeViewModel: SelectComposeContactTypeDelegate { + func returnContactType(type: MessageComposeViewModel.Recipient){ + recipient = type + } +} + diff --git a/Maskbook/Scene/Maskbook/MessageRelay/MaskWebMessage/MaskWebMessage+Encryption.swift b/Maskbook/Scene/Maskbook/MessageRelay/MaskWebMessage/MaskWebMessage+Encryption.swift new file mode 100644 index 00000000..4dfa426e --- /dev/null +++ b/Maskbook/Scene/Maskbook/MessageRelay/MaskWebMessage/MaskWebMessage+Encryption.swift @@ -0,0 +1,30 @@ +// +// MaskWebMessage+Encryption.swift +// Maskbook +// +// Created by Brad Gao on 2022/6/10. +// Copyright © 2022 dimension. All rights reserved. +// + +import Foundation +import WebExtension_Shim + +extension WebExtension.Encryption { + struct PublishE2EResultMessage: MWEMessage { + static let method: String = "publish_e2eResult_to_gun" + + struct Payload: Codable { + struct EncryptionResultE2E: Codable { + let target: String + let encryptedPostKey: String + /** This is used in v38. */ + let ivToBePublished: String + } + + let postIV: String + let networkHint: String + let e2eResult: [EncryptionResultE2E] + } + var payload: Payload? + } +} diff --git a/Maskbook/Scene/Maskbook/MessageRelay/MaskWebMessage/MaskWebMessage.swift b/Maskbook/Scene/Maskbook/MessageRelay/MaskWebMessage/MaskWebMessage.swift index e1cc9be0..9489ab46 100644 --- a/Maskbook/Scene/Maskbook/MessageRelay/MaskWebMessage/MaskWebMessage.swift +++ b/Maskbook/Scene/Maskbook/MessageRelay/MaskWebMessage/MaskWebMessage.swift @@ -75,6 +75,7 @@ extension WebExtension { enum Profile {} enum SNSAdaptor { } enum Wallet { } + enum Encryption { } } struct MaskWebMessageResult: Codable { diff --git a/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaTableViewCell.swift b/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaTableViewCell.swift index 863e5ca4..7190911b 100644 --- a/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaTableViewCell.swift +++ b/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaTableViewCell.swift @@ -6,14 +6,13 @@ // Copyright © 2022 dimension. All rights reserved. // +import CoreDataStack import UIKit import UStack class SearchPersonaTableViewCell: UITableViewCell { - - lazy var photoImageView: UIImageView = { - let imageView = UIImageView() - imageView.contentMode = .scaleAspectFit + lazy var photoImageView: AvatarView = { + let imageView = AvatarView(title: "") imageView.applyRadius(radius: 19) NSLayoutConstraint.activate([ imageView.heightAnchor.constraint(equalToConstant: 38), @@ -39,7 +38,6 @@ class SearchPersonaTableViewCell: UITableViewCell { lazy var checkImageView: UIImageView = { let image = Asset.Icon.Cell.cellUncheck.image let view = UIImageView(image: image) - view.isHidden = true view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ view.widthAnchor.constraint(equalToConstant: 24), @@ -48,17 +46,17 @@ class SearchPersonaTableViewCell: UITableViewCell { return view }() - - private lazy var vStackView = VStackView(spacing: 2) { titleLabel contentLabel } - private lazy var hStackView = HStackView { + private lazy var hStackView = HStackView(alignment: .center) { photoImageView - checkImageView + Spacer(width: 8) vStackView + Spacer(width: 10) + checkImageView } override func awakeFromNib() { @@ -71,6 +69,7 @@ class SearchPersonaTableViewCell: UITableViewCell { setupUI() } + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -97,4 +96,19 @@ class SearchPersonaTableViewCell: UITableViewCell { hStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor) ]) } + + func update(model: PersonaRecord,selectedProfile:[PersonaRecord]){ + let profileRecord = model.linkedProfiles?.first(where: { _ in + true + }) as? ProfileRecord + titleLabel.text = profileRecord?.socialID + photoImageView.setNetworkURL(url: profileRecord?.avatar) + contentLabel.text = model.identifier?.split(separator: "/").last.flatMap({ String($0) }) + + if selectedProfile.contains(model) { + checkImageView.image = Asset.Icon.Cell.cellTwitterCheck.image + } else { + checkImageView.image = Asset.Icon.Cell.cellUncheck.image + } + } } diff --git a/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaViewController.swift b/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaViewController.swift index 2e6d4de2..df6b29c4 100644 --- a/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaViewController.swift +++ b/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaViewController.swift @@ -9,21 +9,28 @@ import UIKit import Combine +import CoreDataStack import Foundation import PanModal import UIKit import UStack +protocol SearchContactsDelegate { + func returnContacts(contacts: [PersonaRecord]?) +} + class SearchPersonaViewController: UIViewController { - var viewModel: SelectContactViewModel - + var viewModel: SearchPersonaViewModel + private var disposeBag = Set() static let rowHeight: CGFloat = 72 + var delegate: SearchContactsDelegate? - init(viewModel: SelectContactViewModel) { - self.viewModel = viewModel + init() { + self.viewModel = SearchPersonaViewModel() super.init(nibName: nil, bundle: nil) } + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -34,7 +41,7 @@ class SearchPersonaViewController: UIViewController { label.textColor = Asset.Colors.Text.dark.color label.textAlignment = .center label.translatesAutoresizingMaskIntoConstraints = false - + label.text = "Specific Contacts" return label }() @@ -42,6 +49,10 @@ class SearchPersonaViewController: UIViewController { let button = UIButton(type: .custom) button.setImage(Asset.Icon.Arrows.left.image, for: .normal) button.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + button.widthAnchor.constraint(equalToConstant: 24), + button.heightAnchor.constraint(equalToConstant: 24) + ]) return button }() @@ -54,7 +65,7 @@ class SearchPersonaViewController: UIViewController { return button }() - private lazy var headStackView = HStackView() { + private lazy var headStackView = HStackView { backButton titleLabel doneButton @@ -73,13 +84,13 @@ class SearchPersonaViewController: UIViewController { let button = UIButton(type: .custom) button.setTitleColor(Asset.Colors.Twitter.blue.color, for: .normal) button.titleLabel?.font = FontStyles.MH5 - //l10 + // l10 button.setTitle("Select All", for: .normal) button.translatesAutoresizingMaskIntoConstraints = false return button }() - private lazy var infoStackView = HStackView() { + private lazy var infoStackView = HStackView { contactAmountLabel selectAllButton } @@ -111,7 +122,7 @@ class SearchPersonaViewController: UIViewController { lazy var tableView: UITableView = { let view = UITableView() - view.backgroundColor = Asset.Colors.Background.normal.color + view.backgroundColor = Asset.Colors.Background.dark.color view.estimatedRowHeight = SearchPersonaViewController.rowHeight view.rowHeight = SearchPersonaViewController.rowHeight view.tableFooterView = UIView() @@ -124,7 +135,8 @@ class SearchPersonaViewController: UIViewController { return view }() - lazy var backStackView = VStackView() { + lazy var backStackView = VStackView { + Spacer(height: 40) headStackView Spacer(height: 20) searchTextField @@ -137,36 +149,90 @@ class SearchPersonaViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupUI() + buildSubscriptions() } private func setupUI() { - view.backgroundColor = Asset.Colors.Background.normal.color + view.backgroundColor = Asset.Colors.Background.dark.color + backStackView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(backStackView) NSLayoutConstraint.activate([ backStackView.topAnchor.constraint(equalTo: view.topAnchor), backStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: LayoutConstraints.leading), - backStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: LayoutConstraints.trailing), - backStackView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + backStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -LayoutConstraints.trailing), + backStackView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } + + private func buildSubscriptions() { + searchTextField.textPublisher() + .receive(on: DispatchQueue.main) + .sink { [weak self] searchText in + self?.viewModel.searchString.value = searchText + self?.tableView.reloadData() + }.store(in: &disposeBag) + + backButton + .gesture() + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + guard let self = self else { return } + self.dismiss(animated: true) + } + .store(in: &disposeBag) + + selectAllButton + .gesture() + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + guard let self = self else { return } + self.viewModel.selectedProfile.value.removeAll() + self.viewModel.selectedProfile.value = self.viewModel.profileRecordsSubject.value + self.tableView.reloadData() + } + .store(in: &disposeBag) + + doneButton + .gesture() + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.delegate?.returnContacts(contacts: self?.viewModel.selectedProfile.value) + self?.dismiss(animated: true) + } + .store(in: &disposeBag) + + viewModel.dataSource + .receive(on: DispatchQueue.main) + .sink { [weak self] profileRecords in + self?.contactAmountLabel.text = "\(profileRecords.count) contacts" + }.store(in: &disposeBag) + } } extension SearchPersonaViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if let profileRecord = viewModel.dataSource.value[safeIndex: indexPath.row] { + if viewModel.selectedProfile.value.contains(profileRecord) { + viewModel.selectedProfile.value = viewModel.selectedProfile.value.filter { $0 != profileRecord } + } else { + viewModel.selectedProfile.value.append(profileRecord) + } + } tableView.reloadData() - dismiss(animated: true) } } extension SearchPersonaViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return viewModel.titles.count + return viewModel.dataSource.value.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell: SearchPersonaTableViewCell = tableView.dequeCell(at: indexPath) - + if let profileRecord = viewModel.dataSource.value[safeIndex: indexPath.row] { + cell.update(model: profileRecord, selectedProfile: viewModel.selectedProfile.value) + } return cell } // swiftlint:enable force_cast @@ -178,6 +244,6 @@ extension SearchPersonaViewController: PanModalPresentable { } var longFormHeight: PanModalHeight { - .contentHeight(SearchPersonaViewController.rowHeight * CGFloat(viewModel.titles.count) + 150) + .maxHeight } } diff --git a/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaViewModel.swift b/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaViewModel.swift index 4622af51..ad6b4726 100644 --- a/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaViewModel.swift +++ b/Maskbook/Scene/Wallet/WalletSend/SearchPersona/SearchPersonaViewModel.swift @@ -6,30 +6,74 @@ // Copyright © 2022 dimension. All rights reserved. // -import UIKit -import CoreDataStack import Combine +import CoreData +import CoreDataStack +import Foundation +import UIKit +class SearchPersonaViewModel { + private var disposeBag = Set() -class personaContact{ - var contactInfo: ProfileRecord - var isSelected: Bool - init(contactInfo: ProfileRecord, isSelected: Bool) { - self.contactInfo = contactInfo - self.isSelected = isSelected + @InjectedProvider(\.personaManager) + private var personaManager + + var profileRecordsSubject = CurrentValueSubject<[PersonaRecord], Never>([]) + + private var profileRecordPublisher: FetchedResultsPublisher? + private static func profileRecordPublisher(identifiers: [String]) -> FetchedResultsPublisher { + let fetchResultController: NSFetchedResultsController = { + let controller = NSFetchedResultsController( + fetchRequest: ProfileRepository.queryProfilesFetchRequest(identifiers: identifiers), + managedObjectContext: AppContext.shared.coreDataStack.persistentContainer.viewContext, + sectionNameKeyPath: nil, + cacheName: nil + ) + return controller + }() + return FetchedResultsPublisher(fetchResultController: fetchResultController) } -} + var dataSource = CurrentValueSubject<[PersonaRecord], Never>([]) + var selectedProfile = CurrentValueSubject<[PersonaRecord], Never>([]) + var searchString = CurrentValueSubject("") -class SearchPersonaViewModel: NSObject { + init() { + personaManager + .currentPersona + .receive(on: DispatchQueue.main) + .flatMap { [weak self] personaRecord -> FetchedResultsPublisher in + var profileIdentifiers = [String]() + if let personaIdentifier = personaRecord?.identifier { + let relations = RelationRepository.queryRelations(personaIdentifier: personaIdentifier) + profileIdentifiers = relations.compactMap(\.profileIdentifier) + } + let publisher = SearchPersonaViewModel.profileRecordPublisher(identifiers: profileIdentifiers) + self?.profileRecordPublisher = publisher + return publisher + } + .sink(receiveValue: {[weak self] profiles in + self?.profileRecordsSubject.value = profiles.compactMap{ $0.linkedPersona }.filter { $0 != self?.personaManager.currentPersona.value } + }) + .store(in: &disposeBag) - public var contactList: CurrentValueSubject<[personaContact], Never> = CurrentValueSubject([]) - - override init() { - - let squares = PersonaManager.shared.currentProfiles.value.map { - personaContact(contactInfo: $0, isSelected: false) - } - self.contactList.send(squares) + Publishers.CombineLatest(searchString, profileRecordsSubject) + .sink { [weak self] _ in + guard let self = self else { return } + self.dataSource.value = self.profileRecordsSubject.value + .filter { [weak self] profile in + guard let text = self?.searchString.value else { return true } + if text.isEmpty { + return true + } + let isIdContains = profile.identifier?.containsIgnoreCase(string: text) + if let nickname = profile.nickname { + return nickname.containsIgnoreCase(string: text) || (isIdContains != nil) + } + return isIdContains ?? false + } + } + .store(in: &disposeBag) + searchString.value = "" } } diff --git a/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactTableViewCell.swift b/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactTableViewCell.swift index 8711d1dc..03e7f818 100644 --- a/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactTableViewCell.swift +++ b/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactTableViewCell.swift @@ -10,14 +10,13 @@ import UIKit import UStack class SelectContactTableViewCell: UITableViewCell { - lazy var bgView: UIView = { let view = UIView() view.backgroundColor = Asset.Colors.Background.normal.color view.layer.cornerRadius = 12 view.clipsToBounds = true view.layer.borderColor = Asset.Colors.Background.normal.color.cgColor - view.layer.borderWidth = 1 + view.layer.borderWidth = 0.5 return view }() @@ -38,7 +37,6 @@ class SelectContactTableViewCell: UITableViewCell { lazy var checkImageView: UIImageView = { let image = Asset.Icon.Cell.cellUncheck.image let view = UIImageView(image: image) - view.isHidden = true view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ view.widthAnchor.constraint(equalToConstant: 24), @@ -49,22 +47,26 @@ class SelectContactTableViewCell: UITableViewCell { lazy var arrowImageView: UIImageView = { let imageView = UIImageView() - imageView.contentMode = .scaleAspectFit - imageView.image = Asset.Icon.Arrows.celllRight.image + imageView.image = Asset.Plugins.selectedArrow.image + NSLayoutConstraint.activate([ + imageView.widthAnchor.constraint(equalToConstant: 12), + imageView.heightAnchor.constraint(equalToConstant: 12) + ]) return imageView }() - private lazy var vStackView = VStackView(spacing: 2) { + private lazy var vStackView = VStackView { titleLabel contentLabel } - private lazy var hStackView = HStackView { + private lazy var hStackView = HStackView(alignment: .center) { Spacer(width: 14) checkImageView + Spacer(width: 10) vStackView - Spacer(width: 8) arrowImageView + Spacer(width: 14) } override func awakeFromNib() { @@ -78,6 +80,7 @@ class SelectContactTableViewCell: UITableViewCell { setupUI() } + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -92,11 +95,11 @@ class SelectContactTableViewCell: UITableViewCell { // Configure the view for the selected state } - func update(index :Int, selected: Bool, viewModel: SelectContactViewModel){ + func update(index: Int, selected: Bool, viewModel: SelectContactViewModel) { titleLabel.text = viewModel.titles[index] contentLabel.text = viewModel.content[index] checkImageView.image = selected ? Asset.Icon.Cell.cellTwitterCheck.image : Asset.Icon.Cell.cellUncheck.image - bgView.layer.borderColor = selected ? Asset.Colors.Twitter.blue.color.cgColor :Asset.Colors.Twitter.second.color.cgColor + bgView.layer.borderColor = selected ? Asset.Colors.Twitter.blue.color.cgColor : Asset.Colors.Twitter.second.color.cgColor arrowImageView.isHidden = viewModel.cellTypes[index] == .normal } diff --git a/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactViewController.swift b/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactViewController.swift index 37d6724a..ceca54e0 100644 --- a/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactViewController.swift +++ b/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactViewController.swift @@ -9,29 +9,41 @@ import UIKit import Combine +import CoreDataStack import Foundation import PanModal import UIKit +protocol SelectComposeContactTypeDelegate{ + func returnContactType(type: MessageComposeViewModel.Recipient) +} + class SelectContactViewController: UIViewController { var viewModel: SelectContactViewModel - - static let rowHeight: CGFloat = 72 - - init(viewModel: SelectContactViewModel) { + var delegate: SelectComposeContactTypeDelegate? + + @InjectedProvider(\.mainCoordinator) + private var mainCoordinator + + static let rowHeight: CGFloat = 90 + + init(viewModel: SelectContactViewModel, delegate: SelectComposeContactTypeDelegate) { self.viewModel = viewModel + self.delegate = delegate super.init(nibName: nil, bundle: nil) } - + + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + lazy var titleLabel: UILabel = { let label = UILabel() label.font = FontStyles.BH4 label.textColor = Asset.Colors.Text.dark.color label.textAlignment = .center + label.text = "Who can see your post?" return label }() @@ -47,28 +59,27 @@ class SelectContactViewController: UIViewController { view.register(SelectContactTableViewCell.self, forCellReuseIdentifier: String(describing: SelectContactTableViewCell.self)) return view }() - + override func viewDidLoad() { super.viewDidLoad() setupUI() } - + private func setupUI() { view.backgroundColor = Asset.Colors.Background.normal.color view.addSubview(titleLabel) view.addSubview(tableView) - + titleLabel.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ - titleLabel.topAnchor.constraint(equalTo: view.topAnchor), + titleLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 40), titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor), titleLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor) ]) - tableView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ - tableView.topAnchor.constraint(equalTo: titleLabel.bottomAnchor), + tableView.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 10), tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor), tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor) @@ -78,8 +89,14 @@ class SelectContactViewController: UIViewController { extension SelectContactViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.reloadData() - dismiss(animated: true) + let contactType = viewModel.contactTypes[safeIndex: indexPath.row] + + if case .specialContacts = contactType { + mainCoordinator.present(scene: .composeSelectPersona(viewController: self), transition: .panModel(animated: true)) + } else { + self.delegate?.returnContactType(type: contactType ?? .everyone) + dismiss(animated: true) + } } } @@ -90,7 +107,8 @@ extension SelectContactViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell: SelectContactTableViewCell = tableView.dequeCell(at: indexPath) - cell.update(index: indexPath.row, selected: viewModel.selectedIndex == indexPath.row, viewModel: viewModel) + let selectedIndex = viewModel.contactTypes.firstIndex(of: viewModel.selectedContactType) ?? 0 + cell.update(index: indexPath.row, selected: selectedIndex == indexPath.row, viewModel: viewModel) return cell } // swiftlint:enable force_cast @@ -100,8 +118,15 @@ extension SelectContactViewController: PanModalPresentable { var panScrollable: UIScrollView? { nil } - + var longFormHeight: PanModalHeight { .contentHeight(SelectContactViewController.rowHeight * CGFloat(viewModel.titles.count) + 58) } } + +extension SelectContactViewController:SearchContactsDelegate { + func returnContacts(contacts:[PersonaRecord]?){ + self.delegate?.returnContactType(type: .specialContacts(contacts ?? [])) + dismissMainTabBarController() + } +} diff --git a/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactViewModel.swift b/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactViewModel.swift index 550039cb..7f817a6a 100644 --- a/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactViewModel.swift +++ b/Maskbook/Scene/Wallet/WalletSend/SelectPersona/SelectContactViewModel.swift @@ -9,19 +9,21 @@ import UIKit extension SelectContactViewModel { - enum cellType { + enum CellType { case normal case clickable } } class SelectContactViewModel: NSObject { - var titles: [String] = [] - var content: [String] = [] - var cellTypes: [cellType] = [.normal,.normal,.clickable] - var selectedIndex: Int = 0 - + //l10n + let titles: [String] = ["Everyone","Only me","Specific Contacts"] + let content: [String] = ["Every twitter user can see.","Only I can see it.",""] + let cellTypes: [CellType] = [.normal,.normal,.clickable] + let contactTypes: [MessageComposeViewModel.Recipient] = [.everyone, .onlyMe, .specialContacts([])] + var selectedContactType: MessageComposeViewModel.Recipient = .everyone + func select(index: Int) { - selectedIndex = index + selectedContactType = contactTypes[index] } } diff --git a/Maskbook/Supporting Files/Coordinator.swift b/Maskbook/Supporting Files/Coordinator.swift index 636d0529..45d5c4e4 100644 --- a/Maskbook/Supporting Files/Coordinator.swift +++ b/Maskbook/Supporting Files/Coordinator.swift @@ -213,13 +213,14 @@ class Coordinator { case luckyDropCreatePersona(callback: (@MainActor () -> Void)?) case luckyDropCreateProfile case luckDropSelectProfile(callback: (@MainActor () -> Void)?) + case messageCompose(PluginMeta? = nil) + case composeSelectContact(viewModel: SelectContactViewModel, delegate: MessageComposeViewModel) + case composeSelectPersona(viewController: SelectContactViewController) case fileService case fileServiceOptions case fileServiceLocalFileSource(selectFileHandler: FileServiceSelectFileHandler) case fileServiceDetail(FileServiceUploadingItem) case fileServiceFAQ - case messageCompose(PluginMeta? = nil) - case composeSelectContact(viewModel: SelectContactViewModel) case debug } @@ -853,8 +854,13 @@ extension Coordinator { case .debug: return UIHostingController(rootView: DebugView()) - case let .composeSelectContact(selectContactViewModel): - return SelectContactViewController(viewModel: selectContactViewModel) + case let .composeSelectContact(selectContactViewModel, delegate): + return SelectContactViewController(viewModel: selectContactViewModel, delegate: delegate) + + case let .composeSelectPersona(viewController): + let searchPersonaVc = SearchPersonaViewController() + searchPersonaVc.delegate = viewController + return searchPersonaVc case .fileService: let nav = NavigationController(rootViewController: FileServiceViewController()) diff --git a/Maskbook/Wallet/WalletCore/WalletCoreHelper.swift b/Maskbook/Wallet/WalletCore/WalletCoreHelper.swift index 5da423fe..87f1e9c0 100644 --- a/Maskbook/Wallet/WalletCore/WalletCoreHelper.swift +++ b/Maskbook/Wallet/WalletCore/WalletCoreHelper.swift @@ -606,6 +606,23 @@ extension WalletCoreHelper { return } } + + struct EncryptPostE2EParam { + let localKey: Data + let target: [String: Data] + let authorPrivateKey: Data + } + + struct EncryptionResult { + struct E2EEncryptionResult { + let encryptedPostKeyData: Data + let iv: Data? + } + let output: String + let postIdentifier: String + let postKey: Data + let e2eResult: [String: E2EEncryptionResult] + } /// Encrypt plugin metas and text content /// - Parameters: @@ -617,13 +634,15 @@ extension WalletCoreHelper { /// - version: api version /// - Returns: encrypted content class func encryptPost( + isPublic: Bool, content: String, authorID: String?, authorKeyData: Data?, - socialPlatForm: ProfileSocialPlatform?, + socialPlatform: ProfileSocialPlatform, metas: [PluginMeta], + e2eParam: EncryptPostE2EParam?, version: EncryptionVersion = .v38 - ) -> Result { + ) -> Result { if version == .v37 { return .failure(WalletCoreError.requestParamError) } @@ -642,13 +661,7 @@ extension WalletCoreHelper { return .failure(WalletCoreError.requestParamError) } - let needTwitterEncoder: Bool = { - guard let platform = socialPlatForm else { - return false - } - - return platform == .twitter - }() + let needTwitterEncoder = socialPlatform == .twitter log.debug("encryptingMessage: \(encryptingMessage)", source: "share") @@ -671,15 +684,33 @@ extension WalletCoreHelper { param.authorUserID = id } - if let network = socialPlatForm { - param.network = network.url + param.network = socialPlatform.url + + param.isPlublic = isPublic + if let e2eParam = e2eParam { + var e2eMCParam = Api_E2EEncryptParam() + e2eMCParam.localKeyData = e2eParam.localKey + e2eMCParam.target = e2eParam.target + e2eMCParam.authorPrivateKey = e2eParam.authorPrivateKey + + param.param = e2eMCParam } } , map: { response in - needTwitterEncoder + let output = needTwitterEncoder ? Self.twitterEncode(content: response.respPostEncryption.content) : response.respPostEncryption.content + let postIdentifier = response.respPostEncryption.postIdentifier + let postKey = response.respPostEncryption.postKey + let e2eResult = response.respPostEncryption.results.mapValues { e2eResult in + return EncryptionResult.E2EEncryptionResult(encryptedPostKeyData: e2eResult.encryptedPostKeyData, + iv: e2eResult.iv) + } + return EncryptionResult(output: output, + postIdentifier: postIdentifier, + postKey: postKey, + e2eResult: e2eResult) } ) }