Update to new protocol (#23)
* new protobufs from libsignal-service-java@a1c93edc40e3ce201fa4e70339a3e6f4e197e319 * Makefile to build ObjC classes from *.proto * refactored some touched code to minimize duplication * removed unused protos * deleted some dead code * renamed method for clarity // FREEBIE
This commit is contained in:
parent
f3a91c2629
commit
1d0b645fc9
@ -35,7 +35,7 @@ PODS:
|
||||
- ProtocolBuffers (1.9.10)
|
||||
- Reachability (3.2)
|
||||
- SAMKeychain (1.5.0)
|
||||
- SignalServiceKit (0.0.8):
|
||||
- SignalServiceKit (0.1.0):
|
||||
- '25519'
|
||||
- AFNetworking
|
||||
- AxolotlKit
|
||||
@ -130,7 +130,7 @@ SPEC CHECKSUMS:
|
||||
ProtocolBuffers: d088180c10072b3d24a9939a6314b7b9bcc2340b
|
||||
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
|
||||
SAMKeychain: 1fc9ae02f576365395758b12888c84704eebc423
|
||||
SignalServiceKit: 9bdacbb1cb046836e9d601273fa4fad934ad3ecb
|
||||
SignalServiceKit: 84781a0e45a7eead501a3e35065a1b32dcbbe0ac
|
||||
SocketRocket: 3f77ec2104cc113add553f817ad90a77114f5d43
|
||||
SQLCipher: 4c768761421736a247ed6cf412d9045615d53dff
|
||||
TwistedOakCollapsingFutures: f359b90f203e9ab13dfb92c9ff41842a7fe1cd0c
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "SignalServiceKit"
|
||||
s.version = "0.0.8"
|
||||
s.version = "0.1.0"
|
||||
s.summary = "An Objective-C library for communicating with the Signal messaging service."
|
||||
|
||||
s.description = <<-DESC
|
||||
@ -37,9 +37,6 @@ An Objective-C library for communicating with the Signal messaging service.
|
||||
s.dependency 'AxolotlKit'
|
||||
s.dependency 'Mantle'
|
||||
s.dependency 'YapDatabase/SQLCipher'
|
||||
# NOTE: we're using a custom fork of SocketRocket to support our certificate
|
||||
# pinning policy.
|
||||
# see Example/TSKitiOSTestApp/Podfile for details
|
||||
s.dependency 'SocketRocket'
|
||||
s.dependency 'libPhoneNumber-iOS'
|
||||
s.dependency 'SAMKeychain'
|
||||
|
||||
9
protobuf/Makefile
Normal file
9
protobuf/Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
# Assumes you've installed protobug-objc
|
||||
# see: https://github.com/alexeyxo/protobuf-objc
|
||||
signal_service_proto:
|
||||
protoc --objc_out=../src/Messages/ \
|
||||
--plugin=/usr/local/bin/proto-gen-objc \
|
||||
--proto_path="${HOME}/src/WhisperSystems/protobuf-objc/src/compiler/" \
|
||||
--proto_path="${HOME}/src/WhisperSystems/protobuf-objc/src/compiler/google/protobuf/" \
|
||||
--proto_path='./' \
|
||||
OWSSignalServiceProtos.proto
|
||||
@ -1,7 +1,10 @@
|
||||
package textsecure;
|
||||
package signalservice;
|
||||
|
||||
option java_package = "org.whispersystems.textsecure.internal.push";
|
||||
option java_outer_classname = "TextSecureProtos";
|
||||
option java_package = "org.whispersystems.signalservice.internal.push";
|
||||
option java_outer_classname = "SignalServiceProtos";
|
||||
|
||||
import "objectivec-descriptor.proto";
|
||||
option (google.protobuf.objectivec_file_options).class_prefix = "OWSSignalServiceProtos";
|
||||
|
||||
message Envelope {
|
||||
enum Type {
|
||||
@ -62,10 +65,16 @@ message SyncMessage {
|
||||
optional Type type = 1;
|
||||
}
|
||||
|
||||
message Read {
|
||||
optional string sender = 1;
|
||||
optional uint64 timestamp = 2;
|
||||
}
|
||||
|
||||
optional Sent sent = 1;
|
||||
optional Contacts contacts = 2;
|
||||
optional Groups groups = 3;
|
||||
optional Request request = 4;
|
||||
repeated Read read = 5;
|
||||
}
|
||||
|
||||
message AttachmentPointer {
|
||||
@ -107,8 +116,9 @@ message GroupDetails {
|
||||
optional uint32 length = 2;
|
||||
}
|
||||
|
||||
optional bytes id = 1;
|
||||
optional string name = 2;
|
||||
repeated string members = 3;
|
||||
optional Avatar avatar = 4;
|
||||
optional bytes id = 1;
|
||||
optional string name = 2;
|
||||
repeated string members = 3;
|
||||
optional Avatar avatar = 4;
|
||||
optional bool active = 5 [default = true];
|
||||
}
|
||||
@ -1,165 +0,0 @@
|
||||
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
|
||||
#import "ProtocolBuffers.h"
|
||||
|
||||
// @@protoc_insertion_point(imports)
|
||||
|
||||
@class ProvisionEnvelope;
|
||||
@class ProvisionEnvelopeBuilder;
|
||||
@class ProvisionMessage;
|
||||
@class ProvisionMessageBuilder;
|
||||
#ifndef __has_feature
|
||||
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
|
||||
#endif // __has_feature
|
||||
|
||||
#ifndef NS_RETURNS_NOT_RETAINED
|
||||
#if __has_feature(attribute_ns_returns_not_retained)
|
||||
#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
|
||||
#else
|
||||
#define NS_RETURNS_NOT_RETAINED
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@interface ProvisioningRoot : NSObject {
|
||||
}
|
||||
+ (PBExtensionRegistry*) extensionRegistry;
|
||||
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
|
||||
@end
|
||||
|
||||
@interface ProvisionEnvelope : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasPublicKey_:1;
|
||||
BOOL hasBody_:1;
|
||||
NSData* publicKey;
|
||||
NSData* body;
|
||||
}
|
||||
- (BOOL) hasPublicKey;
|
||||
- (BOOL) hasBody;
|
||||
@property (readonly, strong) NSData* publicKey;
|
||||
@property (readonly, strong) NSData* body;
|
||||
|
||||
+ (ProvisionEnvelope*) defaultInstance;
|
||||
- (ProvisionEnvelope*) defaultInstance;
|
||||
|
||||
- (BOOL) isInitialized;
|
||||
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
|
||||
- (ProvisionEnvelopeBuilder*) builder;
|
||||
+ (ProvisionEnvelopeBuilder*) builder;
|
||||
+ (ProvisionEnvelopeBuilder*) builderWithPrototype:(ProvisionEnvelope*) prototype;
|
||||
- (ProvisionEnvelopeBuilder*) toBuilder;
|
||||
|
||||
+ (ProvisionEnvelope*) parseFromData:(NSData*) data;
|
||||
+ (ProvisionEnvelope*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (ProvisionEnvelope*) parseFromInputStream:(NSInputStream*) input;
|
||||
+ (ProvisionEnvelope*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (ProvisionEnvelope*) parseFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
+ (ProvisionEnvelope*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface ProvisionEnvelopeBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
ProvisionEnvelope* result;
|
||||
}
|
||||
|
||||
- (ProvisionEnvelope*) defaultInstance;
|
||||
|
||||
- (ProvisionEnvelopeBuilder*) clear;
|
||||
- (ProvisionEnvelopeBuilder*) clone;
|
||||
|
||||
- (ProvisionEnvelope*) build;
|
||||
- (ProvisionEnvelope*) buildPartial;
|
||||
|
||||
- (ProvisionEnvelopeBuilder*) mergeFrom:(ProvisionEnvelope*) other;
|
||||
- (ProvisionEnvelopeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
- (ProvisionEnvelopeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
|
||||
- (BOOL) hasPublicKey;
|
||||
- (NSData*) publicKey;
|
||||
- (ProvisionEnvelopeBuilder*) setPublicKey:(NSData*) value;
|
||||
- (ProvisionEnvelopeBuilder*) clearPublicKey;
|
||||
|
||||
- (BOOL) hasBody;
|
||||
- (NSData*) body;
|
||||
- (ProvisionEnvelopeBuilder*) setBody:(NSData*) value;
|
||||
- (ProvisionEnvelopeBuilder*) clearBody;
|
||||
@end
|
||||
|
||||
@interface ProvisionMessage : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasNumber_:1;
|
||||
BOOL hasProvisioningCode_:1;
|
||||
BOOL hasIdentityKeyPublic_:1;
|
||||
BOOL hasIdentityKeyPrivate_:1;
|
||||
NSString* number;
|
||||
NSString* provisioningCode;
|
||||
NSData* identityKeyPublic;
|
||||
NSData* identityKeyPrivate;
|
||||
}
|
||||
- (BOOL) hasIdentityKeyPublic;
|
||||
- (BOOL) hasIdentityKeyPrivate;
|
||||
- (BOOL) hasNumber;
|
||||
- (BOOL) hasProvisioningCode;
|
||||
@property (readonly, strong) NSData* identityKeyPublic;
|
||||
@property (readonly, strong) NSData* identityKeyPrivate;
|
||||
@property (readonly, strong) NSString* number;
|
||||
@property (readonly, strong) NSString* provisioningCode;
|
||||
|
||||
+ (ProvisionMessage*) defaultInstance;
|
||||
- (ProvisionMessage*) defaultInstance;
|
||||
|
||||
- (BOOL) isInitialized;
|
||||
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
|
||||
- (ProvisionMessageBuilder*) builder;
|
||||
+ (ProvisionMessageBuilder*) builder;
|
||||
+ (ProvisionMessageBuilder*) builderWithPrototype:(ProvisionMessage*) prototype;
|
||||
- (ProvisionMessageBuilder*) toBuilder;
|
||||
|
||||
+ (ProvisionMessage*) parseFromData:(NSData*) data;
|
||||
+ (ProvisionMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (ProvisionMessage*) parseFromInputStream:(NSInputStream*) input;
|
||||
+ (ProvisionMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (ProvisionMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
+ (ProvisionMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface ProvisionMessageBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
ProvisionMessage* result;
|
||||
}
|
||||
|
||||
- (ProvisionMessage*) defaultInstance;
|
||||
|
||||
- (ProvisionMessageBuilder*) clear;
|
||||
- (ProvisionMessageBuilder*) clone;
|
||||
|
||||
- (ProvisionMessage*) build;
|
||||
- (ProvisionMessage*) buildPartial;
|
||||
|
||||
- (ProvisionMessageBuilder*) mergeFrom:(ProvisionMessage*) other;
|
||||
- (ProvisionMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
- (ProvisionMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
|
||||
- (BOOL) hasIdentityKeyPublic;
|
||||
- (NSData*) identityKeyPublic;
|
||||
- (ProvisionMessageBuilder*) setIdentityKeyPublic:(NSData*) value;
|
||||
- (ProvisionMessageBuilder*) clearIdentityKeyPublic;
|
||||
|
||||
- (BOOL) hasIdentityKeyPrivate;
|
||||
- (NSData*) identityKeyPrivate;
|
||||
- (ProvisionMessageBuilder*) setIdentityKeyPrivate:(NSData*) value;
|
||||
- (ProvisionMessageBuilder*) clearIdentityKeyPrivate;
|
||||
|
||||
- (BOOL) hasNumber;
|
||||
- (NSString*) number;
|
||||
- (ProvisionMessageBuilder*) setNumber:(NSString*) value;
|
||||
- (ProvisionMessageBuilder*) clearNumber;
|
||||
|
||||
- (BOOL) hasProvisioningCode;
|
||||
- (NSString*) provisioningCode;
|
||||
- (ProvisionMessageBuilder*) setProvisioningCode:(NSString*) value;
|
||||
- (ProvisionMessageBuilder*) clearProvisioningCode;
|
||||
@end
|
||||
|
||||
|
||||
// @@protoc_insertion_point(global_scope)
|
||||
@ -1,608 +0,0 @@
|
||||
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
|
||||
#import "Provisioning.pb.h"
|
||||
// @@protoc_insertion_point(imports)
|
||||
|
||||
@implementation ProvisioningRoot
|
||||
static PBExtensionRegistry* extensionRegistry = nil;
|
||||
+ (PBExtensionRegistry*) extensionRegistry {
|
||||
return extensionRegistry;
|
||||
}
|
||||
|
||||
+ (void) initialize {
|
||||
if (self == [ProvisioningRoot class]) {
|
||||
PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry];
|
||||
[self registerAllExtensions:registry];
|
||||
extensionRegistry = registry;
|
||||
}
|
||||
}
|
||||
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry {
|
||||
}
|
||||
@end
|
||||
|
||||
@interface ProvisionEnvelope ()
|
||||
@property (strong) NSData* publicKey;
|
||||
@property (strong) NSData* body;
|
||||
@end
|
||||
|
||||
@implementation ProvisionEnvelope
|
||||
|
||||
- (BOOL) hasPublicKey {
|
||||
return !!hasPublicKey_;
|
||||
}
|
||||
- (void) setHasPublicKey:(BOOL) value_ {
|
||||
hasPublicKey_ = !!value_;
|
||||
}
|
||||
@synthesize publicKey;
|
||||
- (BOOL) hasBody {
|
||||
return !!hasBody_;
|
||||
}
|
||||
- (void) setHasBody:(BOOL) value_ {
|
||||
hasBody_ = !!value_;
|
||||
}
|
||||
@synthesize body;
|
||||
- (id) init {
|
||||
if ((self = [super init])) {
|
||||
self.publicKey = [NSData data];
|
||||
self.body = [NSData data];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
static ProvisionEnvelope* defaultProvisionEnvelopeInstance = nil;
|
||||
+ (void) initialize {
|
||||
if (self == [ProvisionEnvelope class]) {
|
||||
defaultProvisionEnvelopeInstance = [[ProvisionEnvelope alloc] init];
|
||||
}
|
||||
}
|
||||
+ (ProvisionEnvelope*) defaultInstance {
|
||||
return defaultProvisionEnvelopeInstance;
|
||||
}
|
||||
- (ProvisionEnvelope*) defaultInstance {
|
||||
return defaultProvisionEnvelopeInstance;
|
||||
}
|
||||
- (BOOL) isInitialized {
|
||||
return YES;
|
||||
}
|
||||
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
|
||||
if (self.hasPublicKey) {
|
||||
[output writeData:1 value:self.publicKey];
|
||||
}
|
||||
if (self.hasBody) {
|
||||
[output writeData:2 value:self.body];
|
||||
}
|
||||
[self.unknownFields writeToCodedOutputStream:output];
|
||||
}
|
||||
- (SInt32) serializedSize {
|
||||
__block SInt32 size_ = memoizedSerializedSize;
|
||||
if (size_ != -1) {
|
||||
return size_;
|
||||
}
|
||||
|
||||
size_ = 0;
|
||||
if (self.hasPublicKey) {
|
||||
size_ += computeDataSize(1, self.publicKey);
|
||||
}
|
||||
if (self.hasBody) {
|
||||
size_ += computeDataSize(2, self.body);
|
||||
}
|
||||
size_ += self.unknownFields.serializedSize;
|
||||
memoizedSerializedSize = size_;
|
||||
return size_;
|
||||
}
|
||||
+ (ProvisionEnvelope*) parseFromData:(NSData*) data {
|
||||
return (ProvisionEnvelope*)[[[ProvisionEnvelope builder] mergeFromData:data] build];
|
||||
}
|
||||
+ (ProvisionEnvelope*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
||||
return (ProvisionEnvelope*)[[[ProvisionEnvelope builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
|
||||
}
|
||||
+ (ProvisionEnvelope*) parseFromInputStream:(NSInputStream*) input {
|
||||
return (ProvisionEnvelope*)[[[ProvisionEnvelope builder] mergeFromInputStream:input] build];
|
||||
}
|
||||
+ (ProvisionEnvelope*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
||||
return (ProvisionEnvelope*)[[[ProvisionEnvelope builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
|
||||
}
|
||||
+ (ProvisionEnvelope*) parseFromCodedInputStream:(PBCodedInputStream*) input {
|
||||
return (ProvisionEnvelope*)[[[ProvisionEnvelope builder] mergeFromCodedInputStream:input] build];
|
||||
}
|
||||
+ (ProvisionEnvelope*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
||||
return (ProvisionEnvelope*)[[[ProvisionEnvelope builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
|
||||
}
|
||||
+ (ProvisionEnvelopeBuilder*) builder {
|
||||
return [[ProvisionEnvelopeBuilder alloc] init];
|
||||
}
|
||||
+ (ProvisionEnvelopeBuilder*) builderWithPrototype:(ProvisionEnvelope*) prototype {
|
||||
return [[ProvisionEnvelope builder] mergeFrom:prototype];
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) builder {
|
||||
return [ProvisionEnvelope builder];
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) toBuilder {
|
||||
return [ProvisionEnvelope builderWithPrototype:self];
|
||||
}
|
||||
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
|
||||
if (self.hasPublicKey) {
|
||||
[output appendFormat:@"%@%@: %@\n", indent, @"publicKey", self.publicKey];
|
||||
}
|
||||
if (self.hasBody) {
|
||||
[output appendFormat:@"%@%@: %@\n", indent, @"body", self.body];
|
||||
}
|
||||
[self.unknownFields writeDescriptionTo:output withIndent:indent];
|
||||
}
|
||||
- (BOOL) isEqual:(id)other {
|
||||
if (other == self) {
|
||||
return YES;
|
||||
}
|
||||
if (![other isKindOfClass:[ProvisionEnvelope class]]) {
|
||||
return NO;
|
||||
}
|
||||
ProvisionEnvelope *otherMessage = other;
|
||||
return
|
||||
self.hasPublicKey == otherMessage.hasPublicKey &&
|
||||
(!self.hasPublicKey || [self.publicKey isEqual:otherMessage.publicKey]) &&
|
||||
self.hasBody == otherMessage.hasBody &&
|
||||
(!self.hasBody || [self.body isEqual:otherMessage.body]) &&
|
||||
(self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
|
||||
}
|
||||
- (NSUInteger) hash {
|
||||
__block NSUInteger hashCode = 7;
|
||||
if (self.hasPublicKey) {
|
||||
hashCode = hashCode * 31 + [self.publicKey hash];
|
||||
}
|
||||
if (self.hasBody) {
|
||||
hashCode = hashCode * 31 + [self.body hash];
|
||||
}
|
||||
hashCode = hashCode * 31 + [self.unknownFields hash];
|
||||
return hashCode;
|
||||
}
|
||||
@end
|
||||
|
||||
@interface ProvisionEnvelopeBuilder()
|
||||
@property (strong) ProvisionEnvelope* result;
|
||||
@end
|
||||
|
||||
@implementation ProvisionEnvelopeBuilder
|
||||
@synthesize result;
|
||||
- (id) init {
|
||||
if ((self = [super init])) {
|
||||
self.result = [[ProvisionEnvelope alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
- (PBGeneratedMessage*) internalGetResult {
|
||||
return result;
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) clear {
|
||||
self.result = [[ProvisionEnvelope alloc] init];
|
||||
return self;
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) clone {
|
||||
return [ProvisionEnvelope builderWithPrototype:result];
|
||||
}
|
||||
- (ProvisionEnvelope*) defaultInstance {
|
||||
return [ProvisionEnvelope defaultInstance];
|
||||
}
|
||||
- (ProvisionEnvelope*) build {
|
||||
[self checkInitialized];
|
||||
return [self buildPartial];
|
||||
}
|
||||
- (ProvisionEnvelope*) buildPartial {
|
||||
ProvisionEnvelope* returnMe = result;
|
||||
self.result = nil;
|
||||
return returnMe;
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) mergeFrom:(ProvisionEnvelope*) other {
|
||||
if (other == [ProvisionEnvelope defaultInstance]) {
|
||||
return self;
|
||||
}
|
||||
if (other.hasPublicKey) {
|
||||
[self setPublicKey:other.publicKey];
|
||||
}
|
||||
if (other.hasBody) {
|
||||
[self setBody:other.body];
|
||||
}
|
||||
[self mergeUnknownFields:other.unknownFields];
|
||||
return self;
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
|
||||
return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
||||
PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
|
||||
while (YES) {
|
||||
SInt32 tag = [input readTag];
|
||||
switch (tag) {
|
||||
case 0:
|
||||
[self setUnknownFields:[unknownFields build]];
|
||||
return self;
|
||||
default: {
|
||||
if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
|
||||
[self setUnknownFields:[unknownFields build]];
|
||||
return self;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 10: {
|
||||
[self setPublicKey:[input readData]];
|
||||
break;
|
||||
}
|
||||
case 18: {
|
||||
[self setBody:[input readData]];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
- (BOOL) hasPublicKey {
|
||||
return result.hasPublicKey;
|
||||
}
|
||||
- (NSData*) publicKey {
|
||||
return result.publicKey;
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) setPublicKey:(NSData*) value {
|
||||
result.hasPublicKey = YES;
|
||||
result.publicKey = value;
|
||||
return self;
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) clearPublicKey {
|
||||
result.hasPublicKey = NO;
|
||||
result.publicKey = [NSData data];
|
||||
return self;
|
||||
}
|
||||
- (BOOL) hasBody {
|
||||
return result.hasBody;
|
||||
}
|
||||
- (NSData*) body {
|
||||
return result.body;
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) setBody:(NSData*) value {
|
||||
result.hasBody = YES;
|
||||
result.body = value;
|
||||
return self;
|
||||
}
|
||||
- (ProvisionEnvelopeBuilder*) clearBody {
|
||||
result.hasBody = NO;
|
||||
result.body = [NSData data];
|
||||
return self;
|
||||
}
|
||||
@end
|
||||
|
||||
@interface ProvisionMessage ()
|
||||
@property (strong) NSData* identityKeyPublic;
|
||||
@property (strong) NSData* identityKeyPrivate;
|
||||
@property (strong) NSString* number;
|
||||
@property (strong) NSString* provisioningCode;
|
||||
@end
|
||||
|
||||
@implementation ProvisionMessage
|
||||
|
||||
- (BOOL) hasIdentityKeyPublic {
|
||||
return !!hasIdentityKeyPublic_;
|
||||
}
|
||||
- (void) setHasIdentityKeyPublic:(BOOL) value_ {
|
||||
hasIdentityKeyPublic_ = !!value_;
|
||||
}
|
||||
@synthesize identityKeyPublic;
|
||||
- (BOOL) hasIdentityKeyPrivate {
|
||||
return !!hasIdentityKeyPrivate_;
|
||||
}
|
||||
- (void) setHasIdentityKeyPrivate:(BOOL) value_ {
|
||||
hasIdentityKeyPrivate_ = !!value_;
|
||||
}
|
||||
@synthesize identityKeyPrivate;
|
||||
- (BOOL) hasNumber {
|
||||
return !!hasNumber_;
|
||||
}
|
||||
- (void) setHasNumber:(BOOL) value_ {
|
||||
hasNumber_ = !!value_;
|
||||
}
|
||||
@synthesize number;
|
||||
- (BOOL) hasProvisioningCode {
|
||||
return !!hasProvisioningCode_;
|
||||
}
|
||||
- (void) setHasProvisioningCode:(BOOL) value_ {
|
||||
hasProvisioningCode_ = !!value_;
|
||||
}
|
||||
@synthesize provisioningCode;
|
||||
- (id) init {
|
||||
if ((self = [super init])) {
|
||||
self.identityKeyPublic = [NSData data];
|
||||
self.identityKeyPrivate = [NSData data];
|
||||
self.number = @"";
|
||||
self.provisioningCode = @"";
|
||||
}
|
||||
return self;
|
||||
}
|
||||
static ProvisionMessage* defaultProvisionMessageInstance = nil;
|
||||
+ (void) initialize {
|
||||
if (self == [ProvisionMessage class]) {
|
||||
defaultProvisionMessageInstance = [[ProvisionMessage alloc] init];
|
||||
}
|
||||
}
|
||||
+ (ProvisionMessage*) defaultInstance {
|
||||
return defaultProvisionMessageInstance;
|
||||
}
|
||||
- (ProvisionMessage*) defaultInstance {
|
||||
return defaultProvisionMessageInstance;
|
||||
}
|
||||
- (BOOL) isInitialized {
|
||||
return YES;
|
||||
}
|
||||
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
|
||||
if (self.hasIdentityKeyPublic) {
|
||||
[output writeData:1 value:self.identityKeyPublic];
|
||||
}
|
||||
if (self.hasIdentityKeyPrivate) {
|
||||
[output writeData:2 value:self.identityKeyPrivate];
|
||||
}
|
||||
if (self.hasNumber) {
|
||||
[output writeString:3 value:self.number];
|
||||
}
|
||||
if (self.hasProvisioningCode) {
|
||||
[output writeString:4 value:self.provisioningCode];
|
||||
}
|
||||
[self.unknownFields writeToCodedOutputStream:output];
|
||||
}
|
||||
- (SInt32) serializedSize {
|
||||
__block SInt32 size_ = memoizedSerializedSize;
|
||||
if (size_ != -1) {
|
||||
return size_;
|
||||
}
|
||||
|
||||
size_ = 0;
|
||||
if (self.hasIdentityKeyPublic) {
|
||||
size_ += computeDataSize(1, self.identityKeyPublic);
|
||||
}
|
||||
if (self.hasIdentityKeyPrivate) {
|
||||
size_ += computeDataSize(2, self.identityKeyPrivate);
|
||||
}
|
||||
if (self.hasNumber) {
|
||||
size_ += computeStringSize(3, self.number);
|
||||
}
|
||||
if (self.hasProvisioningCode) {
|
||||
size_ += computeStringSize(4, self.provisioningCode);
|
||||
}
|
||||
size_ += self.unknownFields.serializedSize;
|
||||
memoizedSerializedSize = size_;
|
||||
return size_;
|
||||
}
|
||||
+ (ProvisionMessage*) parseFromData:(NSData*) data {
|
||||
return (ProvisionMessage*)[[[ProvisionMessage builder] mergeFromData:data] build];
|
||||
}
|
||||
+ (ProvisionMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
||||
return (ProvisionMessage*)[[[ProvisionMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
|
||||
}
|
||||
+ (ProvisionMessage*) parseFromInputStream:(NSInputStream*) input {
|
||||
return (ProvisionMessage*)[[[ProvisionMessage builder] mergeFromInputStream:input] build];
|
||||
}
|
||||
+ (ProvisionMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
||||
return (ProvisionMessage*)[[[ProvisionMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
|
||||
}
|
||||
+ (ProvisionMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input {
|
||||
return (ProvisionMessage*)[[[ProvisionMessage builder] mergeFromCodedInputStream:input] build];
|
||||
}
|
||||
+ (ProvisionMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
||||
return (ProvisionMessage*)[[[ProvisionMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
|
||||
}
|
||||
+ (ProvisionMessageBuilder*) builder {
|
||||
return [[ProvisionMessageBuilder alloc] init];
|
||||
}
|
||||
+ (ProvisionMessageBuilder*) builderWithPrototype:(ProvisionMessage*) prototype {
|
||||
return [[ProvisionMessage builder] mergeFrom:prototype];
|
||||
}
|
||||
- (ProvisionMessageBuilder*) builder {
|
||||
return [ProvisionMessage builder];
|
||||
}
|
||||
- (ProvisionMessageBuilder*) toBuilder {
|
||||
return [ProvisionMessage builderWithPrototype:self];
|
||||
}
|
||||
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
|
||||
if (self.hasIdentityKeyPublic) {
|
||||
[output appendFormat:@"%@%@: %@\n", indent, @"identityKeyPublic", self.identityKeyPublic];
|
||||
}
|
||||
if (self.hasIdentityKeyPrivate) {
|
||||
[output appendFormat:@"%@%@: %@\n", indent, @"identityKeyPrivate", self.identityKeyPrivate];
|
||||
}
|
||||
if (self.hasNumber) {
|
||||
[output appendFormat:@"%@%@: %@\n", indent, @"number", self.number];
|
||||
}
|
||||
if (self.hasProvisioningCode) {
|
||||
[output appendFormat:@"%@%@: %@\n", indent, @"provisioningCode", self.provisioningCode];
|
||||
}
|
||||
[self.unknownFields writeDescriptionTo:output withIndent:indent];
|
||||
}
|
||||
- (BOOL) isEqual:(id)other {
|
||||
if (other == self) {
|
||||
return YES;
|
||||
}
|
||||
if (![other isKindOfClass:[ProvisionMessage class]]) {
|
||||
return NO;
|
||||
}
|
||||
ProvisionMessage *otherMessage = other;
|
||||
return
|
||||
self.hasIdentityKeyPublic == otherMessage.hasIdentityKeyPublic &&
|
||||
(!self.hasIdentityKeyPublic || [self.identityKeyPublic isEqual:otherMessage.identityKeyPublic]) &&
|
||||
self.hasIdentityKeyPrivate == otherMessage.hasIdentityKeyPrivate &&
|
||||
(!self.hasIdentityKeyPrivate || [self.identityKeyPrivate isEqual:otherMessage.identityKeyPrivate]) &&
|
||||
self.hasNumber == otherMessage.hasNumber &&
|
||||
(!self.hasNumber || [self.number isEqual:otherMessage.number]) &&
|
||||
self.hasProvisioningCode == otherMessage.hasProvisioningCode &&
|
||||
(!self.hasProvisioningCode || [self.provisioningCode isEqual:otherMessage.provisioningCode]) &&
|
||||
(self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
|
||||
}
|
||||
- (NSUInteger) hash {
|
||||
__block NSUInteger hashCode = 7;
|
||||
if (self.hasIdentityKeyPublic) {
|
||||
hashCode = hashCode * 31 + [self.identityKeyPublic hash];
|
||||
}
|
||||
if (self.hasIdentityKeyPrivate) {
|
||||
hashCode = hashCode * 31 + [self.identityKeyPrivate hash];
|
||||
}
|
||||
if (self.hasNumber) {
|
||||
hashCode = hashCode * 31 + [self.number hash];
|
||||
}
|
||||
if (self.hasProvisioningCode) {
|
||||
hashCode = hashCode * 31 + [self.provisioningCode hash];
|
||||
}
|
||||
hashCode = hashCode * 31 + [self.unknownFields hash];
|
||||
return hashCode;
|
||||
}
|
||||
@end
|
||||
|
||||
@interface ProvisionMessageBuilder()
|
||||
@property (strong) ProvisionMessage* result;
|
||||
@end
|
||||
|
||||
@implementation ProvisionMessageBuilder
|
||||
@synthesize result;
|
||||
- (id) init {
|
||||
if ((self = [super init])) {
|
||||
self.result = [[ProvisionMessage alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
- (PBGeneratedMessage*) internalGetResult {
|
||||
return result;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) clear {
|
||||
self.result = [[ProvisionMessage alloc] init];
|
||||
return self;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) clone {
|
||||
return [ProvisionMessage builderWithPrototype:result];
|
||||
}
|
||||
- (ProvisionMessage*) defaultInstance {
|
||||
return [ProvisionMessage defaultInstance];
|
||||
}
|
||||
- (ProvisionMessage*) build {
|
||||
[self checkInitialized];
|
||||
return [self buildPartial];
|
||||
}
|
||||
- (ProvisionMessage*) buildPartial {
|
||||
ProvisionMessage* returnMe = result;
|
||||
self.result = nil;
|
||||
return returnMe;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) mergeFrom:(ProvisionMessage*) other {
|
||||
if (other == [ProvisionMessage defaultInstance]) {
|
||||
return self;
|
||||
}
|
||||
if (other.hasIdentityKeyPublic) {
|
||||
[self setIdentityKeyPublic:other.identityKeyPublic];
|
||||
}
|
||||
if (other.hasIdentityKeyPrivate) {
|
||||
[self setIdentityKeyPrivate:other.identityKeyPrivate];
|
||||
}
|
||||
if (other.hasNumber) {
|
||||
[self setNumber:other.number];
|
||||
}
|
||||
if (other.hasProvisioningCode) {
|
||||
[self setProvisioningCode:other.provisioningCode];
|
||||
}
|
||||
[self mergeUnknownFields:other.unknownFields];
|
||||
return self;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
|
||||
return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
|
||||
}
|
||||
- (ProvisionMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
||||
PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
|
||||
while (YES) {
|
||||
SInt32 tag = [input readTag];
|
||||
switch (tag) {
|
||||
case 0:
|
||||
[self setUnknownFields:[unknownFields build]];
|
||||
return self;
|
||||
default: {
|
||||
if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
|
||||
[self setUnknownFields:[unknownFields build]];
|
||||
return self;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 10: {
|
||||
[self setIdentityKeyPublic:[input readData]];
|
||||
break;
|
||||
}
|
||||
case 18: {
|
||||
[self setIdentityKeyPrivate:[input readData]];
|
||||
break;
|
||||
}
|
||||
case 26: {
|
||||
[self setNumber:[input readString]];
|
||||
break;
|
||||
}
|
||||
case 34: {
|
||||
[self setProvisioningCode:[input readString]];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
- (BOOL) hasIdentityKeyPublic {
|
||||
return result.hasIdentityKeyPublic;
|
||||
}
|
||||
- (NSData*) identityKeyPublic {
|
||||
return result.identityKeyPublic;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) setIdentityKeyPublic:(NSData*) value {
|
||||
result.hasIdentityKeyPublic = YES;
|
||||
result.identityKeyPublic = value;
|
||||
return self;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) clearIdentityKeyPublic {
|
||||
result.hasIdentityKeyPublic = NO;
|
||||
result.identityKeyPublic = [NSData data];
|
||||
return self;
|
||||
}
|
||||
- (BOOL) hasIdentityKeyPrivate {
|
||||
return result.hasIdentityKeyPrivate;
|
||||
}
|
||||
- (NSData*) identityKeyPrivate {
|
||||
return result.identityKeyPrivate;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) setIdentityKeyPrivate:(NSData*) value {
|
||||
result.hasIdentityKeyPrivate = YES;
|
||||
result.identityKeyPrivate = value;
|
||||
return self;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) clearIdentityKeyPrivate {
|
||||
result.hasIdentityKeyPrivate = NO;
|
||||
result.identityKeyPrivate = [NSData data];
|
||||
return self;
|
||||
}
|
||||
- (BOOL) hasNumber {
|
||||
return result.hasNumber;
|
||||
}
|
||||
- (NSString*) number {
|
||||
return result.number;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) setNumber:(NSString*) value {
|
||||
result.hasNumber = YES;
|
||||
result.number = value;
|
||||
return self;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) clearNumber {
|
||||
result.hasNumber = NO;
|
||||
result.number = @"";
|
||||
return self;
|
||||
}
|
||||
- (BOOL) hasProvisioningCode {
|
||||
return result.hasProvisioningCode;
|
||||
}
|
||||
- (NSString*) provisioningCode {
|
||||
return result.provisioningCode;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) setProvisioningCode:(NSString*) value {
|
||||
result.hasProvisioningCode = YES;
|
||||
result.provisioningCode = value;
|
||||
return self;
|
||||
}
|
||||
- (ProvisionMessageBuilder*) clearProvisioningCode {
|
||||
result.hasProvisioningCode = NO;
|
||||
result.provisioningCode = @"";
|
||||
return self;
|
||||
}
|
||||
@end
|
||||
|
||||
|
||||
// @@protoc_insertion_point(global_scope)
|
||||
@ -1,16 +0,0 @@
|
||||
package textsecure;
|
||||
|
||||
option java_package = "org.whispersystems.textsecure.internal.push";
|
||||
option java_outer_classname = "ProvisioningProtos";
|
||||
|
||||
message ProvisionEnvelope {
|
||||
optional bytes publicKey = 1;
|
||||
optional bytes body = 2; // Encrypted ProvisionMessage
|
||||
}
|
||||
|
||||
message ProvisionMessage {
|
||||
optional bytes identityKeyPublic = 1;
|
||||
optional bytes identityKeyPrivate = 2;
|
||||
optional string number = 3;
|
||||
optional string provisioningCode = 4;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,264 +0,0 @@
|
||||
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
|
||||
#import "ProtocolBuffers.h"
|
||||
|
||||
// @@protoc_insertion_point(imports)
|
||||
|
||||
@class WebSocketMessage;
|
||||
@class WebSocketMessageBuilder;
|
||||
@class WebSocketRequestMessage;
|
||||
@class WebSocketRequestMessageBuilder;
|
||||
@class WebSocketResponseMessage;
|
||||
@class WebSocketResponseMessageBuilder;
|
||||
#ifndef __has_feature
|
||||
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
|
||||
#endif // __has_feature
|
||||
|
||||
#ifndef NS_RETURNS_NOT_RETAINED
|
||||
#if __has_feature(attribute_ns_returns_not_retained)
|
||||
#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
|
||||
#else
|
||||
#define NS_RETURNS_NOT_RETAINED
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
WebSocketMessageTypeUnknown = 0,
|
||||
WebSocketMessageTypeRequest = 1,
|
||||
WebSocketMessageTypeResponse = 2,
|
||||
} WebSocketMessageType;
|
||||
|
||||
BOOL WebSocketMessageTypeIsValidValue(WebSocketMessageType value);
|
||||
|
||||
|
||||
@interface WebSocketResourcesRoot : NSObject {
|
||||
}
|
||||
+ (PBExtensionRegistry*) extensionRegistry;
|
||||
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
|
||||
@end
|
||||
|
||||
@interface WebSocketRequestMessage : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasId_:1;
|
||||
BOOL hasVerb_:1;
|
||||
BOOL hasPath_:1;
|
||||
BOOL hasBody_:1;
|
||||
UInt64 id;
|
||||
NSString* verb;
|
||||
NSString* path;
|
||||
NSData* body;
|
||||
}
|
||||
- (BOOL) hasVerb;
|
||||
- (BOOL) hasPath;
|
||||
- (BOOL) hasBody;
|
||||
- (BOOL) hasId;
|
||||
@property (readonly, strong) NSString* verb;
|
||||
@property (readonly, strong) NSString* path;
|
||||
@property (readonly, strong) NSData* body;
|
||||
@property (readonly) UInt64 id;
|
||||
|
||||
+ (WebSocketRequestMessage*) defaultInstance;
|
||||
- (WebSocketRequestMessage*) defaultInstance;
|
||||
|
||||
- (BOOL) isInitialized;
|
||||
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
|
||||
- (WebSocketRequestMessageBuilder*) builder;
|
||||
+ (WebSocketRequestMessageBuilder*) builder;
|
||||
+ (WebSocketRequestMessageBuilder*) builderWithPrototype:(WebSocketRequestMessage*) prototype;
|
||||
- (WebSocketRequestMessageBuilder*) toBuilder;
|
||||
|
||||
+ (WebSocketRequestMessage*) parseFromData:(NSData*) data;
|
||||
+ (WebSocketRequestMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (WebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input;
|
||||
+ (WebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (WebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
+ (WebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface WebSocketRequestMessageBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
WebSocketRequestMessage* result;
|
||||
}
|
||||
|
||||
- (WebSocketRequestMessage*) defaultInstance;
|
||||
|
||||
- (WebSocketRequestMessageBuilder*) clear;
|
||||
- (WebSocketRequestMessageBuilder*) clone;
|
||||
|
||||
- (WebSocketRequestMessage*) build;
|
||||
- (WebSocketRequestMessage*) buildPartial;
|
||||
|
||||
- (WebSocketRequestMessageBuilder*) mergeFrom:(WebSocketRequestMessage*) other;
|
||||
- (WebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
- (WebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
|
||||
- (BOOL) hasVerb;
|
||||
- (NSString*) verb;
|
||||
- (WebSocketRequestMessageBuilder*) setVerb:(NSString*) value;
|
||||
- (WebSocketRequestMessageBuilder*) clearVerb;
|
||||
|
||||
- (BOOL) hasPath;
|
||||
- (NSString*) path;
|
||||
- (WebSocketRequestMessageBuilder*) setPath:(NSString*) value;
|
||||
- (WebSocketRequestMessageBuilder*) clearPath;
|
||||
|
||||
- (BOOL) hasBody;
|
||||
- (NSData*) body;
|
||||
- (WebSocketRequestMessageBuilder*) setBody:(NSData*) value;
|
||||
- (WebSocketRequestMessageBuilder*) clearBody;
|
||||
|
||||
- (BOOL) hasId;
|
||||
- (UInt64) id;
|
||||
- (WebSocketRequestMessageBuilder*) setId:(UInt64) value;
|
||||
- (WebSocketRequestMessageBuilder*) clearId;
|
||||
@end
|
||||
|
||||
@interface WebSocketResponseMessage : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasId_:1;
|
||||
BOOL hasMessage_:1;
|
||||
BOOL hasBody_:1;
|
||||
BOOL hasStatus_:1;
|
||||
UInt64 id;
|
||||
NSString* message;
|
||||
NSData* body;
|
||||
UInt32 status;
|
||||
}
|
||||
- (BOOL) hasId;
|
||||
- (BOOL) hasStatus;
|
||||
- (BOOL) hasMessage;
|
||||
- (BOOL) hasBody;
|
||||
@property (readonly) UInt64 id;
|
||||
@property (readonly) UInt32 status;
|
||||
@property (readonly, strong) NSString* message;
|
||||
@property (readonly, strong) NSData* body;
|
||||
|
||||
+ (WebSocketResponseMessage*) defaultInstance;
|
||||
- (WebSocketResponseMessage*) defaultInstance;
|
||||
|
||||
- (BOOL) isInitialized;
|
||||
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
|
||||
- (WebSocketResponseMessageBuilder*) builder;
|
||||
+ (WebSocketResponseMessageBuilder*) builder;
|
||||
+ (WebSocketResponseMessageBuilder*) builderWithPrototype:(WebSocketResponseMessage*) prototype;
|
||||
- (WebSocketResponseMessageBuilder*) toBuilder;
|
||||
|
||||
+ (WebSocketResponseMessage*) parseFromData:(NSData*) data;
|
||||
+ (WebSocketResponseMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (WebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input;
|
||||
+ (WebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (WebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
+ (WebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface WebSocketResponseMessageBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
WebSocketResponseMessage* result;
|
||||
}
|
||||
|
||||
- (WebSocketResponseMessage*) defaultInstance;
|
||||
|
||||
- (WebSocketResponseMessageBuilder*) clear;
|
||||
- (WebSocketResponseMessageBuilder*) clone;
|
||||
|
||||
- (WebSocketResponseMessage*) build;
|
||||
- (WebSocketResponseMessage*) buildPartial;
|
||||
|
||||
- (WebSocketResponseMessageBuilder*) mergeFrom:(WebSocketResponseMessage*) other;
|
||||
- (WebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
- (WebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
|
||||
- (BOOL) hasId;
|
||||
- (UInt64) id;
|
||||
- (WebSocketResponseMessageBuilder*) setId:(UInt64) value;
|
||||
- (WebSocketResponseMessageBuilder*) clearId;
|
||||
|
||||
- (BOOL) hasStatus;
|
||||
- (UInt32) status;
|
||||
- (WebSocketResponseMessageBuilder*) setStatus:(UInt32) value;
|
||||
- (WebSocketResponseMessageBuilder*) clearStatus;
|
||||
|
||||
- (BOOL) hasMessage;
|
||||
- (NSString*) message;
|
||||
- (WebSocketResponseMessageBuilder*) setMessage:(NSString*) value;
|
||||
- (WebSocketResponseMessageBuilder*) clearMessage;
|
||||
|
||||
- (BOOL) hasBody;
|
||||
- (NSData*) body;
|
||||
- (WebSocketResponseMessageBuilder*) setBody:(NSData*) value;
|
||||
- (WebSocketResponseMessageBuilder*) clearBody;
|
||||
@end
|
||||
|
||||
@interface WebSocketMessage : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasRequest_:1;
|
||||
BOOL hasResponse_:1;
|
||||
BOOL hasType_:1;
|
||||
WebSocketRequestMessage* request;
|
||||
WebSocketResponseMessage* response;
|
||||
WebSocketMessageType type;
|
||||
}
|
||||
- (BOOL) hasType;
|
||||
- (BOOL) hasRequest;
|
||||
- (BOOL) hasResponse;
|
||||
@property (readonly) WebSocketMessageType type;
|
||||
@property (readonly, strong) WebSocketRequestMessage* request;
|
||||
@property (readonly, strong) WebSocketResponseMessage* response;
|
||||
|
||||
+ (WebSocketMessage*) defaultInstance;
|
||||
- (WebSocketMessage*) defaultInstance;
|
||||
|
||||
- (BOOL) isInitialized;
|
||||
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
|
||||
- (WebSocketMessageBuilder*) builder;
|
||||
+ (WebSocketMessageBuilder*) builder;
|
||||
+ (WebSocketMessageBuilder*) builderWithPrototype:(WebSocketMessage*) prototype;
|
||||
- (WebSocketMessageBuilder*) toBuilder;
|
||||
|
||||
+ (WebSocketMessage*) parseFromData:(NSData*) data;
|
||||
+ (WebSocketMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (WebSocketMessage*) parseFromInputStream:(NSInputStream*) input;
|
||||
+ (WebSocketMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
+ (WebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
+ (WebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface WebSocketMessageBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
WebSocketMessage* result;
|
||||
}
|
||||
|
||||
- (WebSocketMessage*) defaultInstance;
|
||||
|
||||
- (WebSocketMessageBuilder*) clear;
|
||||
- (WebSocketMessageBuilder*) clone;
|
||||
|
||||
- (WebSocketMessage*) build;
|
||||
- (WebSocketMessage*) buildPartial;
|
||||
|
||||
- (WebSocketMessageBuilder*) mergeFrom:(WebSocketMessage*) other;
|
||||
- (WebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
|
||||
- (WebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
||||
|
||||
- (BOOL) hasType;
|
||||
- (WebSocketMessageType) type;
|
||||
- (WebSocketMessageBuilder*) setType:(WebSocketMessageType) value;
|
||||
- (WebSocketMessageBuilder*) clearType;
|
||||
|
||||
- (BOOL) hasRequest;
|
||||
- (WebSocketRequestMessage*) request;
|
||||
- (WebSocketMessageBuilder*) setRequest:(WebSocketRequestMessage*) value;
|
||||
- (WebSocketMessageBuilder*) setRequestBuilder:(WebSocketRequestMessageBuilder*) builderForValue;
|
||||
- (WebSocketMessageBuilder*) mergeRequest:(WebSocketRequestMessage*) value;
|
||||
- (WebSocketMessageBuilder*) clearRequest;
|
||||
|
||||
- (BOOL) hasResponse;
|
||||
- (WebSocketResponseMessage*) response;
|
||||
- (WebSocketMessageBuilder*) setResponse:(WebSocketResponseMessage*) value;
|
||||
- (WebSocketMessageBuilder*) setResponseBuilder:(WebSocketResponseMessageBuilder*) builderForValue;
|
||||
- (WebSocketMessageBuilder*) mergeResponse:(WebSocketResponseMessage*) value;
|
||||
- (WebSocketMessageBuilder*) clearResponse;
|
||||
@end
|
||||
|
||||
|
||||
// @@protoc_insertion_point(global_scope)
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,46 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) 2014-2015 Open WhisperSystems
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package textsecure;
|
||||
|
||||
option java_package = "org.whispersystems.textsecure.internal.websocket";
|
||||
option java_outer_classname = "WebSocketProtos";
|
||||
|
||||
message WebSocketRequestMessage {
|
||||
optional string verb = 1;
|
||||
optional string path = 2;
|
||||
optional bytes body = 3;
|
||||
optional uint64 id = 4;
|
||||
}
|
||||
|
||||
message WebSocketResponseMessage {
|
||||
optional uint64 id = 1;
|
||||
optional uint32 status = 2;
|
||||
optional string message = 3;
|
||||
optional bytes body = 4;
|
||||
}
|
||||
|
||||
message WebSocketMessage {
|
||||
enum Type {
|
||||
UNKNOWN = 0;
|
||||
REQUEST = 1;
|
||||
RESPONSE = 2;
|
||||
}
|
||||
|
||||
optional Type type = 1;
|
||||
optional WebSocketRequestMessage request = 2;
|
||||
optional WebSocketResponseMessage response = 3;
|
||||
}
|
||||
@ -5,6 +5,7 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@class TSInteraction;
|
||||
@class TSInvalidIdentityKeyReceivingErrorMessage;
|
||||
|
||||
/**
|
||||
* TSThread is the superclass of TSContactThread and TSGroupThread
|
||||
@ -42,6 +43,11 @@
|
||||
*/
|
||||
- (NSUInteger)numberOfInteractions;
|
||||
|
||||
/**
|
||||
* Get all messages in the thread we weren't able to decrypt
|
||||
*/
|
||||
- (NSArray<TSInvalidIdentityKeyReceivingErrorMessage *> *)receivedMessagesForInvalidKey:(NSData *)key;
|
||||
|
||||
/**
|
||||
* Returns whether or not the thread has unread messages.
|
||||
*
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
#import "TSDatabaseView.h"
|
||||
#import "TSIncomingMessage.h"
|
||||
#import "TSInteraction.h"
|
||||
#import "TSInvalidIdentityKeyReceivingErrorMessage.h"
|
||||
#import "TSOutgoingMessage.h"
|
||||
#import "TSStorageManager.h"
|
||||
|
||||
@ -105,6 +106,37 @@
|
||||
[interactionsByThread enumerateRowsInGroup:self.uniqueId usingBlock:interactionBlock];
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates all the threads interactions. Note this will explode if you try to create a transaction in the block.
|
||||
* If you need a transaction, use the sister method: `enumerateInteractionsWithTransaction:usingBlock`
|
||||
*/
|
||||
- (void)enumerateInteractionsUsingBlock:(void (^)(TSInteraction *interaction))block
|
||||
{
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
[self enumerateInteractionsWithTransaction:transaction
|
||||
usingBlock:^(
|
||||
TSInteraction *interaction, YapDatabaseReadTransaction *transaction) {
|
||||
|
||||
block(interaction);
|
||||
}];
|
||||
}];
|
||||
}
|
||||
|
||||
- (NSArray<TSInvalidIdentityKeyReceivingErrorMessage *> *)receivedMessagesForInvalidKey:(NSData *)key
|
||||
{
|
||||
NSMutableArray *errorMessages = [NSMutableArray new];
|
||||
[self enumerateInteractionsUsingBlock:^(TSInteraction *interaction) {
|
||||
if ([interaction isKindOfClass:[TSInvalidIdentityKeyReceivingErrorMessage class]]) {
|
||||
TSInvalidIdentityKeyReceivingErrorMessage *error = (TSInvalidIdentityKeyReceivingErrorMessage *)interaction;
|
||||
if ([[error newIdentityKey] isEqualToData:key]) {
|
||||
[errorMessages addObject:(TSInvalidIdentityKeyReceivingErrorMessage *)interaction];
|
||||
}
|
||||
}
|
||||
}];
|
||||
|
||||
return [errorMessages copy];
|
||||
}
|
||||
|
||||
- (NSUInteger)numberOfInteractions
|
||||
{
|
||||
__block NSUInteger count;
|
||||
|
||||
@ -11,15 +11,16 @@
|
||||
#import "SignalRecipient.h"
|
||||
#import "TSThread.h"
|
||||
|
||||
@class IncomingPushMessageSignal;
|
||||
@class OWSSignalServiceProtosEnvelope;
|
||||
|
||||
@interface TSContactThread : TSThread
|
||||
|
||||
+ (instancetype)getOrCreateThreadWithContactId:(NSString *)contactId
|
||||
transaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
|
||||
+ (instancetype)getOrCreateThreadWithContactId:(NSString *)contactId
|
||||
transaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
pushSignal:(IncomingPushMessageSignal *)pushSignal;
|
||||
envelope:(OWSSignalServiceProtosEnvelope *)envelope;
|
||||
|
||||
- (NSString *)contactIdentifier;
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
|
||||
#import "TSContactThread.h"
|
||||
#import "ContactsUpdater.h"
|
||||
#import "IncomingPushMessageSignal.pb.h"
|
||||
#import "OWSSignalServiceProtos.pb.h"
|
||||
#import "TextSecureKitEnv.h"
|
||||
#import <YapDatabase/YapDatabaseTransaction.h>
|
||||
|
||||
@ -21,12 +21,13 @@
|
||||
|
||||
+ (instancetype)getOrCreateThreadWithContactId:(NSString *)contactId
|
||||
transaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
pushSignal:(IncomingPushMessageSignal *)pushSignal {
|
||||
envelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
{
|
||||
SignalRecipient *recipient =
|
||||
[SignalRecipient recipientWithTextSecureIdentifier:contactId withTransaction:transaction];
|
||||
|
||||
if (!recipient) {
|
||||
NSString *relay = pushSignal.hasRelay && ![pushSignal.relay isEqualToString:@""] ? pushSignal.relay : nil;
|
||||
NSString *relay = envelope.hasRelay && ![envelope.relay isEqualToString:@""] ? envelope.relay : nil;
|
||||
recipient = [[SignalRecipient alloc] initWithTextSecureIdentifier:contactId relay:relay supportsVoice:YES];
|
||||
|
||||
[[ContactsUpdater sharedUpdater] lookupIdentifier:contactId
|
||||
|
||||
@ -1,402 +0,0 @@
|
||||
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
|
||||
#import <ProtocolBuffers/ProtocolBuffers.h>
|
||||
|
||||
// @@protoc_insertion_point(imports)
|
||||
|
||||
@class IncomingPushMessageSignal;
|
||||
@class IncomingPushMessageSignalBuilder;
|
||||
@class PushMessageContent;
|
||||
@class PushMessageContentAttachmentPointer;
|
||||
@class PushMessageContentAttachmentPointerBuilder;
|
||||
@class PushMessageContentBuilder;
|
||||
@class PushMessageContentGroupContext;
|
||||
@class PushMessageContentGroupContextBuilder;
|
||||
#ifndef __has_feature
|
||||
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
|
||||
#endif // __has_feature
|
||||
|
||||
#ifndef NS_RETURNS_NOT_RETAINED
|
||||
#if __has_feature(attribute_ns_returns_not_retained)
|
||||
#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
|
||||
#else
|
||||
#define NS_RETURNS_NOT_RETAINED
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
IncomingPushMessageSignalTypeUnknown = 0,
|
||||
IncomingPushMessageSignalTypeCiphertext = 1,
|
||||
IncomingPushMessageSignalTypeKeyExchange = 2,
|
||||
IncomingPushMessageSignalTypePrekeyBundle = 3,
|
||||
IncomingPushMessageSignalTypePlaintext = 4,
|
||||
IncomingPushMessageSignalTypeReceipt = 5,
|
||||
} IncomingPushMessageSignalType;
|
||||
|
||||
BOOL IncomingPushMessageSignalTypeIsValidValue(IncomingPushMessageSignalType value);
|
||||
|
||||
typedef enum {
|
||||
PushMessageContentFlagsEndSession = 1,
|
||||
} PushMessageContentFlags;
|
||||
|
||||
BOOL PushMessageContentFlagsIsValidValue(PushMessageContentFlags value);
|
||||
|
||||
typedef enum {
|
||||
PushMessageContentGroupContextTypeUnknown = 0,
|
||||
PushMessageContentGroupContextTypeUpdate = 1,
|
||||
PushMessageContentGroupContextTypeDeliver = 2,
|
||||
PushMessageContentGroupContextTypeQuit = 3,
|
||||
} PushMessageContentGroupContextType;
|
||||
|
||||
BOOL PushMessageContentGroupContextTypeIsValidValue(PushMessageContentGroupContextType value);
|
||||
|
||||
|
||||
@interface IncomingPushMessageSignalRoot : NSObject {
|
||||
}
|
||||
+ (PBExtensionRegistry *)extensionRegistry;
|
||||
+ (void)registerAllExtensions:(PBMutableExtensionRegistry *)registry;
|
||||
@end
|
||||
|
||||
@interface IncomingPushMessageSignal : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasTimestamp_ : 1;
|
||||
BOOL hasSource_ : 1;
|
||||
BOOL hasRelay_ : 1;
|
||||
BOOL hasMessage_ : 1;
|
||||
BOOL hasSourceDevice_ : 1;
|
||||
BOOL hasType_ : 1;
|
||||
UInt64 timestamp;
|
||||
NSString *source;
|
||||
NSString *relay;
|
||||
NSData *message;
|
||||
UInt32 sourceDevice;
|
||||
IncomingPushMessageSignalType type;
|
||||
}
|
||||
- (BOOL)hasType;
|
||||
- (BOOL)hasSource;
|
||||
- (BOOL)hasSourceDevice;
|
||||
- (BOOL)hasRelay;
|
||||
- (BOOL)hasTimestamp;
|
||||
- (BOOL)hasMessage;
|
||||
@property (readonly) IncomingPushMessageSignalType type;
|
||||
@property (readonly, strong) NSString *source;
|
||||
@property (readonly) UInt32 sourceDevice;
|
||||
@property (readonly, strong) NSString *relay;
|
||||
@property (readonly) UInt64 timestamp;
|
||||
@property (readonly, strong) NSData *message;
|
||||
|
||||
+ (IncomingPushMessageSignal *)defaultInstance;
|
||||
- (IncomingPushMessageSignal *)defaultInstance;
|
||||
|
||||
- (BOOL)isInitialized;
|
||||
- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output;
|
||||
- (IncomingPushMessageSignalBuilder *)builder;
|
||||
+ (IncomingPushMessageSignalBuilder *)builder;
|
||||
+ (IncomingPushMessageSignalBuilder *)builderWithPrototype:(IncomingPushMessageSignal *)prototype;
|
||||
- (IncomingPushMessageSignalBuilder *)toBuilder;
|
||||
|
||||
+ (IncomingPushMessageSignal *)parseFromData:(NSData *)data;
|
||||
+ (IncomingPushMessageSignal *)parseFromData:(NSData *)data extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
+ (IncomingPushMessageSignal *)parseFromInputStream:(NSInputStream *)input;
|
||||
+ (IncomingPushMessageSignal *)parseFromInputStream:(NSInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
+ (IncomingPushMessageSignal *)parseFromCodedInputStream:(PBCodedInputStream *)input;
|
||||
+ (IncomingPushMessageSignal *)parseFromCodedInputStream:(PBCodedInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface IncomingPushMessageSignalBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
IncomingPushMessageSignal *result;
|
||||
}
|
||||
|
||||
- (IncomingPushMessageSignal *)defaultInstance;
|
||||
|
||||
- (IncomingPushMessageSignalBuilder *)clear;
|
||||
- (IncomingPushMessageSignalBuilder *)clone;
|
||||
|
||||
- (IncomingPushMessageSignal *)build;
|
||||
- (IncomingPushMessageSignal *)buildPartial;
|
||||
|
||||
- (IncomingPushMessageSignalBuilder *)mergeFrom:(IncomingPushMessageSignal *)other;
|
||||
- (IncomingPushMessageSignalBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input;
|
||||
- (IncomingPushMessageSignalBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
|
||||
- (BOOL)hasType;
|
||||
- (IncomingPushMessageSignalType)type;
|
||||
- (IncomingPushMessageSignalBuilder *)setType:(IncomingPushMessageSignalType)value;
|
||||
- (IncomingPushMessageSignalBuilder *)clearType;
|
||||
|
||||
- (BOOL)hasSource;
|
||||
- (NSString *)source;
|
||||
- (IncomingPushMessageSignalBuilder *)setSource:(NSString *)value;
|
||||
- (IncomingPushMessageSignalBuilder *)clearSource;
|
||||
|
||||
- (BOOL)hasSourceDevice;
|
||||
- (UInt32)sourceDevice;
|
||||
- (IncomingPushMessageSignalBuilder *)setSourceDevice:(UInt32)value;
|
||||
- (IncomingPushMessageSignalBuilder *)clearSourceDevice;
|
||||
|
||||
- (BOOL)hasRelay;
|
||||
- (NSString *)relay;
|
||||
- (IncomingPushMessageSignalBuilder *)setRelay:(NSString *)value;
|
||||
- (IncomingPushMessageSignalBuilder *)clearRelay;
|
||||
|
||||
- (BOOL)hasTimestamp;
|
||||
- (UInt64)timestamp;
|
||||
- (IncomingPushMessageSignalBuilder *)setTimestamp:(UInt64)value;
|
||||
- (IncomingPushMessageSignalBuilder *)clearTimestamp;
|
||||
|
||||
- (BOOL)hasMessage;
|
||||
- (NSData *)message;
|
||||
- (IncomingPushMessageSignalBuilder *)setMessage:(NSData *)value;
|
||||
- (IncomingPushMessageSignalBuilder *)clearMessage;
|
||||
@end
|
||||
|
||||
@interface PushMessageContent : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasBody_ : 1;
|
||||
BOOL hasGroup_ : 1;
|
||||
BOOL hasFlags_ : 1;
|
||||
NSString *body;
|
||||
PushMessageContentGroupContext *group;
|
||||
UInt32 flags;
|
||||
NSMutableArray *attachmentsArray;
|
||||
}
|
||||
- (BOOL)hasBody;
|
||||
- (BOOL)hasGroup;
|
||||
- (BOOL)hasFlags;
|
||||
@property (readonly, strong) NSString *body;
|
||||
@property (readonly, strong) NSArray *attachments;
|
||||
@property (readonly, strong) PushMessageContentGroupContext *group;
|
||||
@property (readonly) UInt32 flags;
|
||||
- (PushMessageContentAttachmentPointer *)attachmentsAtIndex:(NSUInteger)index;
|
||||
|
||||
+ (PushMessageContent *)defaultInstance;
|
||||
- (PushMessageContent *)defaultInstance;
|
||||
|
||||
- (BOOL)isInitialized;
|
||||
- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output;
|
||||
- (PushMessageContentBuilder *)builder;
|
||||
+ (PushMessageContentBuilder *)builder;
|
||||
+ (PushMessageContentBuilder *)builderWithPrototype:(PushMessageContent *)prototype;
|
||||
- (PushMessageContentBuilder *)toBuilder;
|
||||
|
||||
+ (PushMessageContent *)parseFromData:(NSData *)data;
|
||||
+ (PushMessageContent *)parseFromData:(NSData *)data extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
+ (PushMessageContent *)parseFromInputStream:(NSInputStream *)input;
|
||||
+ (PushMessageContent *)parseFromInputStream:(NSInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
+ (PushMessageContent *)parseFromCodedInputStream:(PBCodedInputStream *)input;
|
||||
+ (PushMessageContent *)parseFromCodedInputStream:(PBCodedInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface PushMessageContentAttachmentPointer : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasId_ : 1;
|
||||
BOOL hasContentType_ : 1;
|
||||
BOOL hasKey_ : 1;
|
||||
UInt64 id;
|
||||
NSString *contentType;
|
||||
NSData *key;
|
||||
}
|
||||
- (BOOL)hasId;
|
||||
- (BOOL)hasContentType;
|
||||
- (BOOL)hasKey;
|
||||
@property (readonly) UInt64 id;
|
||||
@property (readonly, strong) NSString *contentType;
|
||||
@property (readonly, strong) NSData *key;
|
||||
|
||||
+ (PushMessageContentAttachmentPointer *)defaultInstance;
|
||||
- (PushMessageContentAttachmentPointer *)defaultInstance;
|
||||
|
||||
- (BOOL)isInitialized;
|
||||
- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)builder;
|
||||
+ (PushMessageContentAttachmentPointerBuilder *)builder;
|
||||
+ (PushMessageContentAttachmentPointerBuilder *)builderWithPrototype:(PushMessageContentAttachmentPointer *)prototype;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)toBuilder;
|
||||
|
||||
+ (PushMessageContentAttachmentPointer *)parseFromData:(NSData *)data;
|
||||
+ (PushMessageContentAttachmentPointer *)parseFromData:(NSData *)data
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
+ (PushMessageContentAttachmentPointer *)parseFromInputStream:(NSInputStream *)input;
|
||||
+ (PushMessageContentAttachmentPointer *)parseFromInputStream:(NSInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
+ (PushMessageContentAttachmentPointer *)parseFromCodedInputStream:(PBCodedInputStream *)input;
|
||||
+ (PushMessageContentAttachmentPointer *)parseFromCodedInputStream:(PBCodedInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface PushMessageContentAttachmentPointerBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
PushMessageContentAttachmentPointer *result;
|
||||
}
|
||||
|
||||
- (PushMessageContentAttachmentPointer *)defaultInstance;
|
||||
|
||||
- (PushMessageContentAttachmentPointerBuilder *)clear;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)clone;
|
||||
|
||||
- (PushMessageContentAttachmentPointer *)build;
|
||||
- (PushMessageContentAttachmentPointer *)buildPartial;
|
||||
|
||||
- (PushMessageContentAttachmentPointerBuilder *)mergeFrom:(PushMessageContentAttachmentPointer *)other;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
|
||||
- (BOOL)hasId;
|
||||
- (UInt64)id;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)setId:(UInt64)value;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)clearId;
|
||||
|
||||
- (BOOL)hasContentType;
|
||||
- (NSString *)contentType;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)setContentType:(NSString *)value;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)clearContentType;
|
||||
|
||||
- (BOOL)hasKey;
|
||||
- (NSData *)key;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)setKey:(NSData *)value;
|
||||
- (PushMessageContentAttachmentPointerBuilder *)clearKey;
|
||||
@end
|
||||
|
||||
@interface PushMessageContentGroupContext : PBGeneratedMessage {
|
||||
@private
|
||||
BOOL hasName_ : 1;
|
||||
BOOL hasAvatar_ : 1;
|
||||
BOOL hasId_ : 1;
|
||||
BOOL hasType_ : 1;
|
||||
NSString *name;
|
||||
PushMessageContentAttachmentPointer *avatar;
|
||||
NSData *id;
|
||||
PushMessageContentGroupContextType type;
|
||||
NSMutableArray *membersArray;
|
||||
}
|
||||
- (BOOL)hasId;
|
||||
- (BOOL)hasType;
|
||||
- (BOOL)hasName;
|
||||
- (BOOL)hasAvatar;
|
||||
@property (readonly, strong) NSData *id;
|
||||
@property (readonly) PushMessageContentGroupContextType type;
|
||||
@property (readonly, strong) NSString *name;
|
||||
@property (readonly, strong) PushMessageContentAttachmentPointer *avatar;
|
||||
- (NSArray *)members;
|
||||
- (NSString *)membersAtIndex:(NSUInteger)index;
|
||||
|
||||
+ (PushMessageContentGroupContext *)defaultInstance;
|
||||
- (PushMessageContentGroupContext *)defaultInstance;
|
||||
|
||||
- (BOOL)isInitialized;
|
||||
- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output;
|
||||
- (PushMessageContentGroupContextBuilder *)builder;
|
||||
+ (PushMessageContentGroupContextBuilder *)builder;
|
||||
+ (PushMessageContentGroupContextBuilder *)builderWithPrototype:(PushMessageContentGroupContext *)prototype;
|
||||
- (PushMessageContentGroupContextBuilder *)toBuilder;
|
||||
|
||||
+ (PushMessageContentGroupContext *)parseFromData:(NSData *)data;
|
||||
+ (PushMessageContentGroupContext *)parseFromData:(NSData *)data
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
+ (PushMessageContentGroupContext *)parseFromInputStream:(NSInputStream *)input;
|
||||
+ (PushMessageContentGroupContext *)parseFromInputStream:(NSInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
+ (PushMessageContentGroupContext *)parseFromCodedInputStream:(PBCodedInputStream *)input;
|
||||
+ (PushMessageContentGroupContext *)parseFromCodedInputStream:(PBCodedInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
@end
|
||||
|
||||
@interface PushMessageContentGroupContextBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
PushMessageContentGroupContext *result;
|
||||
}
|
||||
|
||||
- (PushMessageContentGroupContext *)defaultInstance;
|
||||
|
||||
- (PushMessageContentGroupContextBuilder *)clear;
|
||||
- (PushMessageContentGroupContextBuilder *)clone;
|
||||
|
||||
- (PushMessageContentGroupContext *)build;
|
||||
- (PushMessageContentGroupContext *)buildPartial;
|
||||
|
||||
- (PushMessageContentGroupContextBuilder *)mergeFrom:(PushMessageContentGroupContext *)other;
|
||||
- (PushMessageContentGroupContextBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input;
|
||||
- (PushMessageContentGroupContextBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
|
||||
- (BOOL)hasId;
|
||||
- (NSData *)id;
|
||||
- (PushMessageContentGroupContextBuilder *)setId:(NSData *)value;
|
||||
- (PushMessageContentGroupContextBuilder *)clearId;
|
||||
|
||||
- (BOOL)hasType;
|
||||
- (PushMessageContentGroupContextType)type;
|
||||
- (PushMessageContentGroupContextBuilder *)setType:(PushMessageContentGroupContextType)value;
|
||||
- (PushMessageContentGroupContextBuilder *)clearType;
|
||||
|
||||
- (BOOL)hasName;
|
||||
- (NSString *)name;
|
||||
- (PushMessageContentGroupContextBuilder *)setName:(NSString *)value;
|
||||
- (PushMessageContentGroupContextBuilder *)clearName;
|
||||
|
||||
- (NSMutableArray *)members;
|
||||
- (NSString *)membersAtIndex:(NSUInteger)index;
|
||||
- (PushMessageContentGroupContextBuilder *)addMembers:(NSString *)value;
|
||||
- (PushMessageContentGroupContextBuilder *)setMembersArray:(NSArray *)array;
|
||||
- (PushMessageContentGroupContextBuilder *)clearMembers;
|
||||
|
||||
- (BOOL)hasAvatar;
|
||||
- (PushMessageContentAttachmentPointer *)avatar;
|
||||
- (PushMessageContentGroupContextBuilder *)setAvatar:(PushMessageContentAttachmentPointer *)value;
|
||||
- (PushMessageContentGroupContextBuilder *)setAvatarBuilder:
|
||||
(PushMessageContentAttachmentPointerBuilder *)builderForValue;
|
||||
- (PushMessageContentGroupContextBuilder *)mergeAvatar:(PushMessageContentAttachmentPointer *)value;
|
||||
- (PushMessageContentGroupContextBuilder *)clearAvatar;
|
||||
@end
|
||||
|
||||
@interface PushMessageContentBuilder : PBGeneratedMessageBuilder {
|
||||
@private
|
||||
PushMessageContent *result;
|
||||
}
|
||||
|
||||
- (PushMessageContent *)defaultInstance;
|
||||
|
||||
- (PushMessageContentBuilder *)clear;
|
||||
- (PushMessageContentBuilder *)clone;
|
||||
|
||||
- (PushMessageContent *)build;
|
||||
- (PushMessageContent *)buildPartial;
|
||||
|
||||
- (PushMessageContentBuilder *)mergeFrom:(PushMessageContent *)other;
|
||||
- (PushMessageContentBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input;
|
||||
- (PushMessageContentBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input
|
||||
extensionRegistry:(PBExtensionRegistry *)extensionRegistry;
|
||||
|
||||
- (BOOL)hasBody;
|
||||
- (NSString *)body;
|
||||
- (PushMessageContentBuilder *)setBody:(NSString *)value;
|
||||
- (PushMessageContentBuilder *)clearBody;
|
||||
|
||||
- (NSMutableArray *)attachments;
|
||||
- (PushMessageContentAttachmentPointer *)attachmentsAtIndex:(NSUInteger)index;
|
||||
- (PushMessageContentBuilder *)addAttachments:(PushMessageContentAttachmentPointer *)value;
|
||||
- (PushMessageContentBuilder *)setAttachmentsArray:(NSArray *)array;
|
||||
- (PushMessageContentBuilder *)clearAttachments;
|
||||
|
||||
- (BOOL)hasGroup;
|
||||
- (PushMessageContentGroupContext *)group;
|
||||
- (PushMessageContentBuilder *)setGroup:(PushMessageContentGroupContext *)value;
|
||||
- (PushMessageContentBuilder *)setGroupBuilder:(PushMessageContentGroupContextBuilder *)builderForValue;
|
||||
- (PushMessageContentBuilder *)mergeGroup:(PushMessageContentGroupContext *)value;
|
||||
- (PushMessageContentBuilder *)clearGroup;
|
||||
|
||||
- (BOOL)hasFlags;
|
||||
- (UInt32)flags;
|
||||
- (PushMessageContentBuilder *)setFlags:(UInt32)value;
|
||||
- (PushMessageContentBuilder *)clearFlags;
|
||||
@end
|
||||
|
||||
|
||||
// @@protoc_insertion_point(global_scope)
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,12 +1,7 @@
|
||||
//
|
||||
// TSErrorMessage.h
|
||||
// TextSecureKit
|
||||
//
|
||||
// Created by Frederic Jacobs on 12/11/14.
|
||||
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import "IncomingPushMessageSignal.pb.h"
|
||||
#import "OWSSignalServiceProtos.pb.h"
|
||||
#import "TSMessage.h"
|
||||
|
||||
@interface TSErrorMessage : TSMessage
|
||||
@ -15,22 +10,23 @@ typedef NS_ENUM(int32_t, TSErrorMessageType) {
|
||||
TSErrorMessageNoSession,
|
||||
TSErrorMessageWrongTrustedIdentityKey,
|
||||
TSErrorMessageInvalidKeyException,
|
||||
TSErrorMessageMissingKeyId,
|
||||
TSErrorMessageMissingKeyId, // unused
|
||||
TSErrorMessageInvalidMessage,
|
||||
TSErrorMessageDuplicateMessage,
|
||||
TSErrorMessageInvalidVersion,
|
||||
};
|
||||
|
||||
+ (instancetype)corruptedMessageWithSignal:(IncomingPushMessageSignal *)preKeyMessage
|
||||
+ (instancetype)corruptedMessageWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
|
||||
+ (instancetype)invalidVersionWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
|
||||
+ (instancetype)invalidKeyExceptionWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
|
||||
+ (instancetype)missingSessionWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
+ (instancetype)invalidVersionWithSignal:(IncomingPushMessageSignal *)preKeyMessage
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
+ (instancetype)missingKeyIdWithSignal:(IncomingPushMessageSignal *)preKeyMessage
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
+ (instancetype)invalidKeyExceptionWithSignal:(IncomingPushMessageSignal *)preKeyMessage
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
+ (instancetype)missingSessionWithSignal:(IncomingPushMessageSignal *)preKeyMessage
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
|
||||
@property (nonatomic, readonly) TSErrorMessageType errorType;
|
||||
|
||||
|
||||
@ -31,21 +31,20 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithSignal:(IncomingPushMessageSignal *)signal
|
||||
transaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
failedMessageType:(TSErrorMessageType)errorMessageType {
|
||||
- (instancetype)initWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
failedMessageType:(TSErrorMessageType)errorMessageType
|
||||
{
|
||||
TSContactThread *contactThread =
|
||||
[TSContactThread getOrCreateThreadWithContactId:signal.source transaction:transaction];
|
||||
[TSContactThread getOrCreateThreadWithContactId:envelope.source transaction:transaction];
|
||||
|
||||
return [self initWithTimestamp:signal.timestamp inThread:contactThread failedMessageType:errorMessageType];
|
||||
return [self initWithTimestamp:envelope.timestamp inThread:contactThread failedMessageType:errorMessageType];
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
switch (_errorType) {
|
||||
case TSErrorMessageNoSession:
|
||||
return NSLocalizedString(@"ERROR_MESSAGE_NO_SESSION", @"");
|
||||
case TSErrorMessageMissingKeyId:
|
||||
return NSLocalizedString(@"ERROR_MESSAGE_MISSING_KEY", @"");
|
||||
case TSErrorMessageInvalidMessage:
|
||||
return NSLocalizedString(@"ERROR_MESSAGE_INVALID_MESSAGE", @"");
|
||||
case TSErrorMessageInvalidVersion:
|
||||
@ -62,31 +61,35 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ (instancetype)corruptedMessageWithSignal:(IncomingPushMessageSignal *)signal
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction {
|
||||
return [[self alloc] initWithSignal:signal transaction:transaction failedMessageType:TSErrorMessageInvalidMessage];
|
||||
+ (instancetype)corruptedMessageWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
return [[self alloc] initWithEnvelope:envelope
|
||||
withTransaction:transaction
|
||||
failedMessageType:TSErrorMessageInvalidMessage];
|
||||
}
|
||||
|
||||
+ (instancetype)invalidVersionWithSignal:(IncomingPushMessageSignal *)signal
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction {
|
||||
return [[self alloc] initWithSignal:signal transaction:transaction failedMessageType:TSErrorMessageInvalidVersion];
|
||||
+ (instancetype)invalidVersionWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
return [[self alloc] initWithEnvelope:envelope
|
||||
withTransaction:transaction
|
||||
failedMessageType:TSErrorMessageInvalidVersion];
|
||||
}
|
||||
|
||||
+ (instancetype)missingKeyIdWithSignal:(IncomingPushMessageSignal *)signal
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction {
|
||||
return [[self alloc] initWithSignal:signal transaction:transaction failedMessageType:TSErrorMessageMissingKeyId];
|
||||
+ (instancetype)invalidKeyExceptionWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
return [[self alloc] initWithEnvelope:envelope
|
||||
withTransaction:transaction
|
||||
failedMessageType:TSErrorMessageInvalidKeyException];
|
||||
}
|
||||
|
||||
+ (instancetype)invalidKeyExceptionWithSignal:(IncomingPushMessageSignal *)signal
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction {
|
||||
return [[self alloc] initWithSignal:signal
|
||||
transaction:transaction
|
||||
failedMessageType:TSErrorMessageInvalidKeyException];
|
||||
}
|
||||
|
||||
+ (instancetype)missingSessionWithSignal:(IncomingPushMessageSignal *)signal
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction {
|
||||
return [[self alloc] initWithSignal:signal transaction:transaction failedMessageType:TSErrorMessageNoSession];
|
||||
+ (instancetype)missingSessionWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
return
|
||||
[[self alloc] initWithEnvelope:envelope withTransaction:transaction failedMessageType:TSErrorMessageNoSession];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
inThread:(TSThread *)thread
|
||||
failedMessageType:(TSErrorMessageType)errorMessageType NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
@property NSData *pushSignal;
|
||||
@property NSData *envelopeData;
|
||||
|
||||
@property NSDictionary *pendingOutgoingMessage;
|
||||
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread;
|
||||
|
||||
@property (nonatomic, readonly) NSString *uniqueThreadId;
|
||||
@property (nonatomic, readonly) TSThread *thread;
|
||||
@property (nonatomic, readonly) uint64_t timestamp;
|
||||
|
||||
- (NSDate *)date;
|
||||
|
||||
@ -8,17 +8,6 @@
|
||||
|
||||
@implementation TSInteraction
|
||||
|
||||
- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread {
|
||||
self = [super initWithUniqueId:nil];
|
||||
|
||||
if (self) {
|
||||
_timestamp = timestamp;
|
||||
_uniqueThreadId = thread.uniqueId;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)interactionForTimestamp:(uint64_t)timestamp
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction {
|
||||
__block int counter = 0;
|
||||
@ -28,14 +17,14 @@
|
||||
enumerateMessagesWithTimestamp:timestamp
|
||||
withBlock:^(NSString *collection, NSString *key, BOOL *stop) {
|
||||
|
||||
if (counter != 0) {
|
||||
DDLogWarn(@"The database contains two colliding timestamps at: %lld.", timestamp);
|
||||
return;
|
||||
}
|
||||
if (counter != 0) {
|
||||
DDLogWarn(@"The database contains two colliding timestamps at: %lld.", timestamp);
|
||||
return;
|
||||
}
|
||||
|
||||
interaction = [TSInteraction fetchObjectWithUniqueID:key transaction:transaction];
|
||||
interaction = [TSInteraction fetchObjectWithUniqueID:key transaction:transaction];
|
||||
|
||||
counter++;
|
||||
counter++;
|
||||
}
|
||||
usingTransaction:transaction];
|
||||
|
||||
@ -46,6 +35,25 @@
|
||||
return @"TSInteraction";
|
||||
}
|
||||
|
||||
- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread
|
||||
{
|
||||
self = [super initWithUniqueId:nil];
|
||||
|
||||
if (!self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
_timestamp = timestamp;
|
||||
_uniqueThreadId = thread.uniqueId;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (TSThread *)thread
|
||||
{
|
||||
return [TSThread fetchObjectWithUniqueID:self.uniqueThreadId];
|
||||
}
|
||||
|
||||
#pragma mark Date operations
|
||||
|
||||
- (uint64_t)millisecondsTimestamp {
|
||||
|
||||
@ -11,6 +11,6 @@
|
||||
@interface TSInvalidIdentityKeyErrorMessage : TSErrorMessage
|
||||
|
||||
- (void)acceptNewIdentityKey;
|
||||
- (NSString *)newIdentityKey;
|
||||
- (NSString *)newIdentityFingerprint;
|
||||
|
||||
@end
|
||||
|
||||
@ -13,7 +13,8 @@
|
||||
- (void)acceptNewIdentityKey {
|
||||
NSAssert(NO, @"Method needs to be implemented in subclasses of TSInvalidIdentityKeyErrorMessage.");
|
||||
}
|
||||
- (NSString *)newIdentityKey {
|
||||
- (NSString *)newIdentityFingerprint
|
||||
{
|
||||
NSAssert(NO, @"Method needs to be implemented in subclasses of TSInvalidIdentityKeyErrorMessage.");
|
||||
return nil;
|
||||
}
|
||||
|
||||
@ -10,7 +10,8 @@
|
||||
|
||||
@interface TSInvalidIdentityKeyReceivingErrorMessage : TSInvalidIdentityKeyErrorMessage
|
||||
|
||||
+ (instancetype)untrustedKeyWithSignal:(IncomingPushMessageSignal *)preKeyMessage
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
+ (instancetype)untrustedKeyWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
|
||||
- (NSData *)newIdentityKey;
|
||||
|
||||
@end
|
||||
|
||||
@ -14,96 +14,103 @@
|
||||
#import <YapDatabase/YapDatabaseTransaction.h>
|
||||
#import <YapDatabase/YapDatabaseView.h>
|
||||
|
||||
@implementation TSInvalidIdentityKeyReceivingErrorMessage
|
||||
@implementation TSInvalidIdentityKeyReceivingErrorMessage {
|
||||
// Not using a property declaration in order to exclude from DB serialization
|
||||
OWSSignalServiceProtosEnvelope *_envelope;
|
||||
}
|
||||
|
||||
@synthesize envelopeData = _envelopeData;
|
||||
|
||||
+ (instancetype)untrustedKeyWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
TSContactThread *contactThread =
|
||||
[TSContactThread getOrCreateThreadWithContactId:envelope.source transaction:transaction];
|
||||
TSInvalidIdentityKeyReceivingErrorMessage *errorMessage =
|
||||
[[self alloc] initForUnknownIdentityKeyWithTimestamp:envelope.timestamp
|
||||
inThread:contactThread
|
||||
incomingEnvelopeData:envelope.data];
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
- (instancetype)initForUnknownIdentityKeyWithTimestamp:(uint64_t)timestamp
|
||||
inThread:(TSThread *)thread
|
||||
incomingPushSignal:(NSData *)signal {
|
||||
incomingEnvelopeData:(NSData *)envelopeData
|
||||
{
|
||||
self = [self initWithTimestamp:timestamp inThread:thread failedMessageType:TSErrorMessageWrongTrustedIdentityKey];
|
||||
|
||||
if (self) {
|
||||
self.pushSignal = signal;
|
||||
if (!self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
_envelopeData = envelopeData;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)untrustedKeyWithSignal:(IncomingPushMessageSignal *)preKeyMessage
|
||||
withTransaction:(YapDatabaseReadWriteTransaction *)transaction {
|
||||
TSContactThread *contactThread =
|
||||
[TSContactThread getOrCreateThreadWithContactId:preKeyMessage.source transaction:transaction];
|
||||
TSInvalidIdentityKeyReceivingErrorMessage *errorMessage =
|
||||
[[self alloc] initForUnknownIdentityKeyWithTimestamp:preKeyMessage.timestamp
|
||||
inThread:contactThread
|
||||
incomingPushSignal:preKeyMessage.data];
|
||||
return errorMessage;
|
||||
- (OWSSignalServiceProtosEnvelope *)envelope
|
||||
{
|
||||
if (!_envelope) {
|
||||
_envelope = [OWSSignalServiceProtosEnvelope parseFromData:self.envelopeData];
|
||||
}
|
||||
return _envelope;
|
||||
}
|
||||
|
||||
- (void)acceptNewIdentityKey {
|
||||
if (self.errorType != TSErrorMessageWrongTrustedIdentityKey || !self.pushSignal) {
|
||||
|
||||
- (void)acceptNewIdentityKey
|
||||
{
|
||||
if (self.errorType != TSErrorMessageWrongTrustedIdentityKey) {
|
||||
DDLogError(@"Refusing to accept identity key for anything but a Key error.");
|
||||
return;
|
||||
}
|
||||
|
||||
TSStorageManager *storage = [TSStorageManager sharedManager];
|
||||
IncomingPushMessageSignal *signal = [IncomingPushMessageSignal parseFromData:self.pushSignal];
|
||||
PreKeyWhisperMessage *message = [[PreKeyWhisperMessage alloc] initWithData:signal.message];
|
||||
NSData *newKey = [message.identityKey removeKeyType];
|
||||
NSData *newKey = [self newIdentityKey];
|
||||
if (!newKey) {
|
||||
DDLogError(@"Couldn't extract identity key to accept");
|
||||
return;
|
||||
}
|
||||
|
||||
[storage saveRemoteIdentity:newKey recipientId:signal.source];
|
||||
|
||||
[[TSMessagesManager sharedManager] handleMessageSignal:signal];
|
||||
|
||||
__block NSMutableSet *messagesToDecrypt = [NSMutableSet set];
|
||||
|
||||
[[TSStorageManager sharedManager]
|
||||
.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
[[transaction ext:TSMessageDatabaseViewExtensionName]
|
||||
enumerateKeysAndObjectsInGroup:self.uniqueThreadId
|
||||
withOptions:NSEnumerationReverse
|
||||
usingBlock:^(
|
||||
NSString *collection, NSString *key, id object, NSUInteger index, BOOL *stop) {
|
||||
TSInteraction *interaction = (TSInteraction *)object;
|
||||
|
||||
DDLogVerbose(@"Interaction type: %@", interaction.debugDescription);
|
||||
|
||||
if ([interaction isKindOfClass:[TSInvalidIdentityKeyErrorMessage class]]) {
|
||||
TSInvalidIdentityKeyErrorMessage *invalidKeyMessage =
|
||||
(TSInvalidIdentityKeyReceivingErrorMessage *)interaction;
|
||||
IncomingPushMessageSignal *invalidMessageSignal =
|
||||
[IncomingPushMessageSignal parseFromData:invalidKeyMessage.pushSignal];
|
||||
PreKeyWhisperMessage *pkwm =
|
||||
[[PreKeyWhisperMessage alloc] initWithData:invalidMessageSignal.message];
|
||||
NSData *newKeyCandidate = [pkwm.identityKey removeKeyType];
|
||||
|
||||
if ([newKeyCandidate isEqualToData:newKey]) {
|
||||
[messagesToDecrypt addObject:invalidKeyMessage];
|
||||
}
|
||||
}
|
||||
}];
|
||||
}];
|
||||
[[TSStorageManager sharedManager] saveRemoteIdentity:newKey recipientId:self.envelope.source];
|
||||
|
||||
// Decrypt this and any old messages for the newly accepted key
|
||||
NSArray<TSInvalidIdentityKeyReceivingErrorMessage *> *messagesToDecrypt =
|
||||
[self.thread receivedMessagesForInvalidKey:newKey];
|
||||
|
||||
for (TSInvalidIdentityKeyReceivingErrorMessage *errorMessage in messagesToDecrypt) {
|
||||
[[TSMessagesManager sharedManager]
|
||||
handleMessageSignal:[IncomingPushMessageSignal parseFromData:errorMessage.pushSignal]];
|
||||
[[TSMessagesManager sharedManager] handleReceivedEnvelope:errorMessage.envelope];
|
||||
|
||||
[[TSStorageManager sharedManager]
|
||||
.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
[errorMessage removeWithTransaction:transaction];
|
||||
}];
|
||||
// Here we remove the existing error message because handleReceivedEnvelope will either
|
||||
// 1.) succeed and create a new successful message in the thread or...
|
||||
// 2.) fail and create a new identical error message in the thread.
|
||||
[errorMessage remove];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)newIdentityKey {
|
||||
if (!self.pushSignal) {
|
||||
return @"";
|
||||
- (NSData *)newIdentityKey
|
||||
{
|
||||
if (!self.envelope) {
|
||||
DDLogError(@"Error message had no envelope data to extract key from");
|
||||
return nil;
|
||||
}
|
||||
|
||||
IncomingPushMessageSignal *signal = [IncomingPushMessageSignal parseFromData:self.pushSignal];
|
||||
PreKeyWhisperMessage *message = [[PreKeyWhisperMessage alloc] initWithData:signal.message];
|
||||
NSData *identityKey = [message.identityKey removeKeyType];
|
||||
if (self.envelope.type != OWSSignalServiceProtosEnvelopeTypePrekeyBundle) {
|
||||
DDLogError(@"Refusing to attempt key extraction from an envelope which isn't a prekey bundle");
|
||||
return nil;
|
||||
}
|
||||
|
||||
return [TSFingerprintGenerator getFingerprintForDisplay:identityKey];
|
||||
// DEPRECATED - Remove after all clients have been upgraded.
|
||||
NSData *pkwmData = self.envelope.hasContent ? self.envelope.content : self.envelope.legacyMessage;
|
||||
if (!pkwmData) {
|
||||
DDLogError(@"Ignoring acceptNewIdentityKey for empty message");
|
||||
return nil;
|
||||
}
|
||||
|
||||
PreKeyWhisperMessage *message = [[PreKeyWhisperMessage alloc] initWithData:pkwmData];
|
||||
return [message.identityKey removeKeyType];
|
||||
}
|
||||
|
||||
- (NSString *)newIdentityFingerprint
|
||||
{
|
||||
return [TSFingerprintGenerator getFingerprintForDisplay:[self newIdentityKey]];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@ -95,7 +95,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)newIdentityKey {
|
||||
- (NSString *)newIdentityFingerprint
|
||||
{
|
||||
NSData *identityKey = [self newKey];
|
||||
|
||||
return [TSFingerprintGenerator getFingerprintForDisplay:identityKey];
|
||||
|
||||
1234
src/Messages/OWSSignalServiceProtos.pb.h
Normal file
1234
src/Messages/OWSSignalServiceProtos.pb.h
Normal file
File diff suppressed because it is too large
Load Diff
5213
src/Messages/OWSSignalServiceProtos.pb.m
Normal file
5213
src/Messages/OWSSignalServiceProtos.pb.m
Normal file
File diff suppressed because it is too large
Load Diff
@ -14,7 +14,8 @@
|
||||
|
||||
@interface TSMessagesManager (attachments)
|
||||
|
||||
- (void)handleReceivedMediaMessage:(IncomingPushMessageSignal *)message withContent:(PushMessageContent *)content;
|
||||
- (void)handleReceivedMediaWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
dataMessage:(OWSSignalServiceProtosDataMessage *)message;
|
||||
|
||||
- (void)sendAttachment:(NSData *)attachmentData
|
||||
contentType:(NSString *)contentType
|
||||
|
||||
@ -31,63 +31,67 @@ dispatch_queue_t attachmentsQueue() {
|
||||
|
||||
@implementation TSMessagesManager (attachments)
|
||||
|
||||
- (void)handleReceivedMediaMessage:(IncomingPushMessageSignal *)message withContent:(PushMessageContent *)content {
|
||||
NSArray *attachmentsToRetrieve =
|
||||
(content.group != nil && (content.group.type == PushMessageContentGroupContextTypeUpdate))
|
||||
? [NSArray arrayWithObject:content.group.avatar]
|
||||
: content.attachments;
|
||||
- (void)handleReceivedMediaWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
dataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
|
||||
{
|
||||
// TODO extract group avatar handling rather than checking message type multiple times and forking logic.
|
||||
|
||||
NSArray *attachmentsToRetrieve
|
||||
= (dataMessage.hasGroup && (dataMessage.group.type == OWSSignalServiceProtosGroupContextTypeUpdate))
|
||||
? [NSArray arrayWithObject:dataMessage.group.avatar]
|
||||
: dataMessage.attachments;
|
||||
|
||||
NSMutableArray *retrievedAttachments = [NSMutableArray array];
|
||||
__block BOOL shouldProcessMessage = YES;
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
for (PushMessageContentAttachmentPointer *pointer in attachmentsToRetrieve) {
|
||||
TSAttachmentPointer *attachmentPointer =
|
||||
(content.group != nil && (content.group.type == PushMessageContentGroupContextTypeUpdate))
|
||||
? [[TSAttachmentPointer alloc] initWithIdentifier:pointer.id
|
||||
key:pointer.key
|
||||
contentType:pointer.contentType
|
||||
relay:message.relay
|
||||
avatarOfGroupId:content.group.id]
|
||||
: [[TSAttachmentPointer alloc] initWithIdentifier:pointer.id
|
||||
key:pointer.key
|
||||
contentType:pointer.contentType
|
||||
relay:message.relay];
|
||||
for (OWSSignalServiceProtosAttachmentPointer *pointer in attachmentsToRetrieve) {
|
||||
TSAttachmentPointer *attachmentPointer
|
||||
= (dataMessage.hasGroup && (dataMessage.group.type == OWSSignalServiceProtosGroupContextTypeUpdate))
|
||||
? [[TSAttachmentPointer alloc] initWithIdentifier:pointer.id
|
||||
key:pointer.key
|
||||
contentType:pointer.contentType
|
||||
relay:envelope.relay
|
||||
avatarOfGroupId:dataMessage.group.id]
|
||||
: [[TSAttachmentPointer alloc] initWithIdentifier:pointer.id
|
||||
key:pointer.key
|
||||
contentType:pointer.contentType
|
||||
relay:envelope.relay];
|
||||
|
||||
if ([MIMETypeUtil isSupportedMIMEType:attachmentPointer.contentType]) {
|
||||
[attachmentPointer saveWithTransaction:transaction];
|
||||
[retrievedAttachments addObject:attachmentPointer.uniqueId];
|
||||
shouldProcessMessage = YES;
|
||||
} else {
|
||||
TSThread *thread =
|
||||
[TSContactThread getOrCreateThreadWithContactId:message.source transaction:transaction];
|
||||
TSInfoMessage *infoMessage =
|
||||
[[TSInfoMessage alloc] initWithTimestamp:message.timestamp
|
||||
inThread:thread
|
||||
messageType:TSInfoMessageTypeUnsupportedMessage];
|
||||
[infoMessage saveWithTransaction:transaction];
|
||||
shouldProcessMessage = NO;
|
||||
}
|
||||
}
|
||||
if ([MIMETypeUtil isSupportedMIMEType:attachmentPointer.contentType]) {
|
||||
[attachmentPointer saveWithTransaction:transaction];
|
||||
[retrievedAttachments addObject:attachmentPointer.uniqueId];
|
||||
shouldProcessMessage = YES;
|
||||
} else {
|
||||
TSThread *thread =
|
||||
[TSContactThread getOrCreateThreadWithContactId:envelope.source transaction:transaction];
|
||||
TSInfoMessage *infoMessage =
|
||||
[[TSInfoMessage alloc] initWithTimestamp:envelope.timestamp
|
||||
inThread:thread
|
||||
messageType:TSInfoMessageTypeUnsupportedMessage];
|
||||
[infoMessage saveWithTransaction:transaction];
|
||||
shouldProcessMessage = NO;
|
||||
}
|
||||
}
|
||||
}];
|
||||
|
||||
if (shouldProcessMessage) {
|
||||
[self
|
||||
handleReceivedMessage:message
|
||||
withContent:content
|
||||
attachmentIds:retrievedAttachments
|
||||
completionBlock:^(NSString *messageIdentifier) {
|
||||
for (NSString *pointerId in retrievedAttachments) {
|
||||
dispatch_async(attachmentsQueue(), ^{
|
||||
__block TSAttachmentPointer *pointer;
|
||||
[self handleReceivedEnvelope:envelope
|
||||
withDataMessage:dataMessage
|
||||
attachmentIds:retrievedAttachments
|
||||
completionBlock:^(NSString *messageIdentifier) {
|
||||
for (NSString *pointerId in retrievedAttachments) {
|
||||
dispatch_async(attachmentsQueue(), ^{
|
||||
__block TSAttachmentPointer *pointer;
|
||||
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
pointer = [TSAttachmentPointer fetchObjectWithUniqueID:pointerId transaction:transaction];
|
||||
}];
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
pointer = [TSAttachmentPointer fetchObjectWithUniqueID:pointerId
|
||||
transaction:transaction];
|
||||
}];
|
||||
|
||||
[self retrieveAttachment:pointer messageId:messageIdentifier];
|
||||
});
|
||||
}
|
||||
}];
|
||||
[self retrieveAttachment:pointer messageId:messageIdentifier];
|
||||
});
|
||||
}
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -511,16 +511,16 @@ dispatch_queue_t sendingQueue() {
|
||||
|
||||
|
||||
- (NSData *)plainTextForMessage:(TSOutgoingMessage *)message inThread:(TSThread *)thread {
|
||||
PushMessageContentBuilder *builder = [PushMessageContentBuilder new];
|
||||
OWSSignalServiceProtosDataMessageBuilder *builder = [OWSSignalServiceProtosDataMessageBuilder new];
|
||||
[builder setBody:message.body];
|
||||
BOOL processAttachments = YES;
|
||||
if ([thread isKindOfClass:[TSGroupThread class]]) {
|
||||
TSGroupThread *gThread = (TSGroupThread *)thread;
|
||||
PushMessageContentGroupContextBuilder *groupBuilder = [PushMessageContentGroupContextBuilder new];
|
||||
OWSSignalServiceProtosGroupContextBuilder *groupBuilder = [OWSSignalServiceProtosGroupContextBuilder new];
|
||||
|
||||
switch (message.groupMetaMessage) {
|
||||
case TSGroupMessageQuit:
|
||||
[groupBuilder setType:PushMessageContentGroupContextTypeQuit];
|
||||
[groupBuilder setType:OWSSignalServiceProtosGroupContextTypeQuit];
|
||||
break;
|
||||
case TSGroupMessageUpdate:
|
||||
case TSGroupMessageNew: {
|
||||
@ -528,8 +528,8 @@ dispatch_queue_t sendingQueue() {
|
||||
id dbObject = [TSAttachmentStream fetchObjectWithUniqueID:message.attachmentIds[0]];
|
||||
if ([dbObject isKindOfClass:[TSAttachmentStream class]]) {
|
||||
TSAttachmentStream *attachment = (TSAttachmentStream *)dbObject;
|
||||
PushMessageContentAttachmentPointerBuilder *attachmentbuilder =
|
||||
[PushMessageContentAttachmentPointerBuilder new];
|
||||
OWSSignalServiceProtosAttachmentPointerBuilder *attachmentbuilder =
|
||||
[OWSSignalServiceProtosAttachmentPointerBuilder new];
|
||||
[attachmentbuilder setId:[attachment.identifier unsignedLongLongValue]];
|
||||
[attachmentbuilder setContentType:attachment.contentType];
|
||||
[attachmentbuilder setKey:attachment.encryptionKey];
|
||||
@ -539,11 +539,11 @@ dispatch_queue_t sendingQueue() {
|
||||
}
|
||||
[groupBuilder setMembersArray:gThread.groupModel.groupMemberIds];
|
||||
[groupBuilder setName:gThread.groupModel.groupName];
|
||||
[groupBuilder setType:PushMessageContentGroupContextTypeUpdate];
|
||||
[groupBuilder setType:OWSSignalServiceProtosGroupContextTypeUpdate];
|
||||
break;
|
||||
}
|
||||
default:
|
||||
[groupBuilder setType:PushMessageContentGroupContextTypeDeliver];
|
||||
[groupBuilder setType:OWSSignalServiceProtosGroupContextTypeDeliver];
|
||||
break;
|
||||
}
|
||||
[groupBuilder setId:gThread.groupModel.groupId];
|
||||
@ -557,8 +557,8 @@ dispatch_queue_t sendingQueue() {
|
||||
if ([dbObject isKindOfClass:[TSAttachmentStream class]]) {
|
||||
TSAttachmentStream *attachment = (TSAttachmentStream *)dbObject;
|
||||
|
||||
PushMessageContentAttachmentPointerBuilder *attachmentbuilder =
|
||||
[PushMessageContentAttachmentPointerBuilder new];
|
||||
OWSSignalServiceProtosAttachmentPointerBuilder *attachmentbuilder =
|
||||
[OWSSignalServiceProtosAttachmentPointerBuilder new];
|
||||
[attachmentbuilder setId:[attachment.identifier unsignedLongLongValue]];
|
||||
[attachmentbuilder setContentType:attachment.contentType];
|
||||
[attachmentbuilder setKey:attachment.encryptionKey];
|
||||
|
||||
@ -1,13 +1,14 @@
|
||||
// Created by Frederic Jacobs on 11/11/14.
|
||||
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
|
||||
|
||||
#import "IncomingPushMessageSignal.pb.h"
|
||||
#import "TSIncomingMessage.h"
|
||||
#import "TSInvalidIdentityKeySendingErrorMessage.h"
|
||||
#import "TSOutgoingMessage.h"
|
||||
|
||||
@class TSCall;
|
||||
@class YapDatabaseConnection;
|
||||
@class OWSSignalServiceProtosEnvelope;
|
||||
@class OWSSignalServiceProtosDataMessage;
|
||||
|
||||
@interface TSMessagesManager : NSObject
|
||||
|
||||
@ -15,18 +16,16 @@
|
||||
|
||||
@property (readonly) YapDatabaseConnection *dbConnection;
|
||||
|
||||
- (void)handleMessageSignal:(IncomingPushMessageSignal *)messageSignal;
|
||||
- (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope;
|
||||
|
||||
- (void)processException:(NSException *)exception
|
||||
outgoingMessage:(TSOutgoingMessage *)message
|
||||
inThread:(TSThread *)thread;
|
||||
- (void)handleReceivedMessage:(IncomingPushMessageSignal *)message
|
||||
withContent:(PushMessageContent *)content
|
||||
attachmentIds:(NSArray<NSString *> *)attachmentIds;
|
||||
- (void)handleReceivedMessage:(IncomingPushMessageSignal *)message
|
||||
withContent:(PushMessageContent *)content
|
||||
attachmentIds:(NSArray<NSString *> *)attachmentIds
|
||||
completionBlock:(void (^)(NSString *messageIdentifier))completionBlock;
|
||||
|
||||
- (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
|
||||
attachmentIds:(NSArray<NSString *> *)attachmentIds
|
||||
completionBlock:(void (^)(NSString *messageIdentifier))completionBlock;
|
||||
|
||||
- (void)handleSendToMyself:(TSOutgoingMessage *)outgoingMessage;
|
||||
|
||||
|
||||
@ -43,33 +43,31 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)handleMessageSignal:(IncomingPushMessageSignal *)messageSignal {
|
||||
- (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
{
|
||||
@try {
|
||||
switch (messageSignal.type) {
|
||||
case IncomingPushMessageSignalTypeCiphertext:
|
||||
[self handleSecureMessage:messageSignal];
|
||||
switch (envelope.type) {
|
||||
case OWSSignalServiceProtosEnvelopeTypeCiphertext:
|
||||
[self handleSecureMessage:envelope];
|
||||
break;
|
||||
|
||||
case IncomingPushMessageSignalTypePrekeyBundle:
|
||||
[self handlePreKeyBundle:messageSignal];
|
||||
case OWSSignalServiceProtosEnvelopeTypePrekeyBundle:
|
||||
[self handlePreKeyBundle:envelope];
|
||||
break;
|
||||
case OWSSignalServiceProtosEnvelopeTypeReceipt:
|
||||
DDLogInfo(@"Received a delivery receipt");
|
||||
[self handleDeliveryReceipt:envelope];
|
||||
break;
|
||||
|
||||
// Other messages are just dismissed for now.
|
||||
|
||||
case IncomingPushMessageSignalTypeKeyExchange:
|
||||
case OWSSignalServiceProtosEnvelopeTypeKeyExchange:
|
||||
DDLogWarn(@"Received Key Exchange Message, not supported");
|
||||
break;
|
||||
case IncomingPushMessageSignalTypePlaintext:
|
||||
DDLogWarn(@"Received a plaintext message");
|
||||
break;
|
||||
case IncomingPushMessageSignalTypeReceipt:
|
||||
DDLogInfo(@"Received a delivery receipt");
|
||||
[self handleDeliveryReceipt:messageSignal];
|
||||
break;
|
||||
case IncomingPushMessageSignalTypeUnknown:
|
||||
case OWSSignalServiceProtosEnvelopeTypeUnknown:
|
||||
DDLogWarn(@"Received an unknown message type");
|
||||
break;
|
||||
default:
|
||||
DDLogWarn(@"Received unhandled envelope type: %d", envelope.type);
|
||||
break;
|
||||
}
|
||||
} @catch (NSException *exception) {
|
||||
@ -77,38 +75,46 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)handleDeliveryReceipt:(IncomingPushMessageSignal *)signal {
|
||||
- (void)handleDeliveryReceipt:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
{
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
TSInteraction *interaction = [TSInteraction interactionForTimestamp:signal.timestamp withTransaction:transaction];
|
||||
if ([interaction isKindOfClass:[TSOutgoingMessage class]]) {
|
||||
TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)interaction;
|
||||
outgoingMessage.messageState = TSOutgoingMessageStateDelivered;
|
||||
TSInteraction *interaction =
|
||||
[TSInteraction interactionForTimestamp:envelope.timestamp withTransaction:transaction];
|
||||
if ([interaction isKindOfClass:[TSOutgoingMessage class]]) {
|
||||
TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)interaction;
|
||||
outgoingMessage.messageState = TSOutgoingMessageStateDelivered;
|
||||
|
||||
[outgoingMessage saveWithTransaction:transaction];
|
||||
}
|
||||
[outgoingMessage saveWithTransaction:transaction];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)handleSecureMessage:(IncomingPushMessageSignal *)secureMessage {
|
||||
- (void)handleSecureMessage:(OWSSignalServiceProtosEnvelope *)messageEnvelope
|
||||
{
|
||||
@synchronized(self) {
|
||||
TSStorageManager *storageManager = [TSStorageManager sharedManager];
|
||||
NSString *recipientId = secureMessage.source;
|
||||
int deviceId = (int)secureMessage.sourceDevice;
|
||||
NSString *recipientId = messageEnvelope.source;
|
||||
int deviceId = messageEnvelope.sourceDevice;
|
||||
|
||||
if (![storageManager containsSession:recipientId deviceId:deviceId]) {
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
TSErrorMessage *errorMessage =
|
||||
[TSErrorMessage missingSessionWithSignal:secureMessage withTransaction:transaction];
|
||||
[errorMessage saveWithTransaction:transaction];
|
||||
TSErrorMessage *errorMessage =
|
||||
[TSErrorMessage missingSessionWithEnvelope:messageEnvelope withTransaction:transaction];
|
||||
[errorMessage saveWithTransaction:transaction];
|
||||
}];
|
||||
return;
|
||||
}
|
||||
|
||||
PushMessageContent *content;
|
||||
// DEPRECATED - Remove after all clients have been upgraded.
|
||||
NSData *encryptedData = messageEnvelope.hasContent ? messageEnvelope.content : messageEnvelope.legacyMessage;
|
||||
if (!encryptedData) {
|
||||
DDLogError(@"Skipping message envelope which had no encrypted data");
|
||||
return;
|
||||
}
|
||||
|
||||
NSData *plaintextData;
|
||||
@try {
|
||||
WhisperMessage *message = [[WhisperMessage alloc] initWithData:secureMessage.message];
|
||||
|
||||
WhisperMessage *message = [[WhisperMessage alloc] initWithData:encryptedData];
|
||||
SessionCipher *cipher = [[SessionCipher alloc] initWithSessionStore:storageManager
|
||||
preKeyStore:storageManager
|
||||
signedPreKeyStore:storageManager
|
||||
@ -116,29 +122,46 @@
|
||||
recipientId:recipientId
|
||||
deviceId:deviceId];
|
||||
|
||||
NSData *plaintext = [[cipher decrypt:message] removePadding];
|
||||
|
||||
content = [PushMessageContent parseFromData:plaintext];
|
||||
plaintextData = [[cipher decrypt:message] removePadding];
|
||||
} @catch (NSException *exception) {
|
||||
[self processException:exception pushSignal:secureMessage];
|
||||
[self processException:exception envelope:messageEnvelope];
|
||||
return;
|
||||
}
|
||||
|
||||
[self handleIncomingMessage:secureMessage withPushContent:content];
|
||||
OWSSignalServiceProtosDataMessage *dataMessage;
|
||||
if (messageEnvelope.hasContent) { // New style content payload
|
||||
OWSSignalServiceProtosContent *content = [OWSSignalServiceProtosContent parseFromData:plaintextData];
|
||||
dataMessage = content.dataMessage;
|
||||
} else if (messageEnvelope.hasLegacyMessage) { // DEPRECATED - Remove after all clients have been upgraded.
|
||||
dataMessage = [OWSSignalServiceProtosDataMessage parseFromData:plaintextData];
|
||||
}
|
||||
|
||||
if (!dataMessage) {
|
||||
DDLogWarn(@"Ignoring content that has no dataMessage.");
|
||||
return;
|
||||
}
|
||||
|
||||
[self handleIncomingEnvelope:messageEnvelope withDataMessage:dataMessage];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)handlePreKeyBundle:(IncomingPushMessageSignal *)preKeyMessage {
|
||||
- (void)handlePreKeyBundle:(OWSSignalServiceProtosEnvelope *)preKeyEnvelope
|
||||
{
|
||||
@synchronized(self) {
|
||||
TSStorageManager *storageManager = [TSStorageManager sharedManager];
|
||||
NSString *recipientId = preKeyMessage.source;
|
||||
int deviceId = (int)preKeyMessage.sourceDevice;
|
||||
NSString *recipientId = preKeyEnvelope.source;
|
||||
int deviceId = preKeyEnvelope.sourceDevice;
|
||||
|
||||
PushMessageContent *content;
|
||||
// DEPRECATED - Remove after all clients have been upgraded.
|
||||
NSData *encryptedData = preKeyEnvelope.hasContent ? preKeyEnvelope.content : preKeyEnvelope.legacyMessage;
|
||||
if (!encryptedData) {
|
||||
DDLogError(@"Skipping message envelope which had no encrypted data");
|
||||
return;
|
||||
}
|
||||
|
||||
NSData *plaintextData;
|
||||
@try {
|
||||
PreKeyWhisperMessage *message = [[PreKeyWhisperMessage alloc] initWithData:preKeyMessage.message];
|
||||
|
||||
PreKeyWhisperMessage *message = [[PreKeyWhisperMessage alloc] initWithData:encryptedData];
|
||||
SessionCipher *cipher = [[SessionCipher alloc] initWithSessionStore:storageManager
|
||||
preKeyStore:storageManager
|
||||
signedPreKeyStore:storageManager
|
||||
@ -146,27 +169,42 @@
|
||||
recipientId:recipientId
|
||||
deviceId:deviceId];
|
||||
|
||||
NSData *plaintext = [[cipher decrypt:message] removePadding];
|
||||
|
||||
content = [PushMessageContent parseFromData:plaintext];
|
||||
plaintextData = [[cipher decrypt:message] removePadding];
|
||||
} @catch (NSException *exception) {
|
||||
[self processException:exception pushSignal:preKeyMessage];
|
||||
[self processException:exception envelope:preKeyEnvelope];
|
||||
return;
|
||||
}
|
||||
|
||||
[self handleIncomingMessage:preKeyMessage withPushContent:content];
|
||||
OWSSignalServiceProtosDataMessage *dataMessage;
|
||||
if (preKeyEnvelope.hasContent) {
|
||||
OWSSignalServiceProtosContent *content = [OWSSignalServiceProtosContent parseFromData:plaintextData];
|
||||
if (content.hasDataMessage) {
|
||||
dataMessage = content.dataMessage;
|
||||
}
|
||||
} else if (preKeyEnvelope.hasLegacyMessage) {
|
||||
// DEPRECATED - Remove after all clients have been upgraded.
|
||||
dataMessage = [OWSSignalServiceProtosDataMessage parseFromData:plaintextData];
|
||||
}
|
||||
|
||||
if (!dataMessage) {
|
||||
DDLogError(@"unable to ascertain decrypted dataMessage from preKeyEnvelope");
|
||||
return;
|
||||
}
|
||||
|
||||
[self handleIncomingEnvelope:preKeyEnvelope withDataMessage:dataMessage];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)handleIncomingMessage:(IncomingPushMessageSignal *)incomingMessage withPushContent:(PushMessageContent *)content
|
||||
- (void)handleIncomingEnvelope:(OWSSignalServiceProtosEnvelope *)incomingEnvelope
|
||||
withDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
|
||||
{
|
||||
if (content.hasGroup) {
|
||||
if (dataMessage.hasGroup) {
|
||||
__block BOOL ignoreMessage = NO;
|
||||
[self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
|
||||
TSGroupModel *emptyModelToFillOutId =
|
||||
[[TSGroupModel alloc] initWithTitle:nil memberIds:nil image:nil groupId:content.group.id];
|
||||
[[TSGroupModel alloc] initWithTitle:nil memberIds:nil image:nil groupId:dataMessage.group.id];
|
||||
TSGroupThread *gThread = [TSGroupThread threadWithGroupModel:emptyModelToFillOutId transaction:transaction];
|
||||
if (gThread == nil && content.group.type != PushMessageContentGroupContextTypeUpdate) {
|
||||
if (gThread == nil && dataMessage.group.type != OWSSignalServiceProtosGroupContextTypeUpdate) {
|
||||
ignoreMessage = YES;
|
||||
}
|
||||
}];
|
||||
@ -176,38 +214,43 @@
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((content.flags & PushMessageContentFlagsEndSession) != 0) {
|
||||
if ((dataMessage.flags & OWSSignalServiceProtosDataMessageFlagsEndSession) != 0) {
|
||||
DDLogVerbose(@"Received end session message...");
|
||||
[self handleEndSessionMessage:incomingMessage withContent:content];
|
||||
} else if (content.attachments.count > 0 ||
|
||||
(content.hasGroup && content.group.type == PushMessageContentGroupContextTypeUpdate &&
|
||||
content.group.hasAvatar)) {
|
||||
[self handleEndSessionMessageWithEnvelope:incomingEnvelope dataMessage:dataMessage];
|
||||
} else if (dataMessage.attachments.count > 0
|
||||
|| (dataMessage.hasGroup && dataMessage.group.type == OWSSignalServiceProtosGroupContextTypeUpdate
|
||||
&& dataMessage.group.avatar)) {
|
||||
|
||||
DDLogVerbose(@"Received push media message (attachment) or group with an avatar...");
|
||||
[self handleReceivedMediaMessage:incomingMessage withContent:content];
|
||||
[self handleReceivedMediaWithEnvelope:incomingEnvelope dataMessage:dataMessage];
|
||||
} else {
|
||||
DDLogVerbose(@"Received individual push text message...");
|
||||
[self handleReceivedTextMessage:incomingMessage withContent:content];
|
||||
[self handleReceivedTextMessageWithEnvelope:incomingEnvelope dataMessage:dataMessage];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)handleEndSessionMessage:(IncomingPushMessageSignal *)message withContent:(PushMessageContent *)content {
|
||||
- (void)handleEndSessionMessageWithEnvelope:(OWSSignalServiceProtosEnvelope *)endSessionEnvelope
|
||||
dataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
|
||||
{
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:message.source transaction:transaction];
|
||||
uint64_t timeStamp = message.timestamp;
|
||||
TSContactThread *thread =
|
||||
[TSContactThread getOrCreateThreadWithContactId:endSessionEnvelope.source transaction:transaction];
|
||||
uint64_t timeStamp = endSessionEnvelope.timestamp;
|
||||
|
||||
if (thread) {
|
||||
[[[TSInfoMessage alloc] initWithTimestamp:timeStamp
|
||||
inThread:thread
|
||||
messageType:TSInfoMessageTypeSessionDidEnd] saveWithTransaction:transaction];
|
||||
}
|
||||
if (thread) {
|
||||
[[[TSInfoMessage alloc] initWithTimestamp:timeStamp
|
||||
inThread:thread
|
||||
messageType:TSInfoMessageTypeSessionDidEnd] saveWithTransaction:transaction];
|
||||
}
|
||||
}];
|
||||
|
||||
[[TSStorageManager sharedManager] deleteAllSessionsForContact:message.source];
|
||||
[[TSStorageManager sharedManager] deleteAllSessionsForContact:endSessionEnvelope.source];
|
||||
}
|
||||
|
||||
- (void)handleReceivedTextMessage:(IncomingPushMessageSignal *)message withContent:(PushMessageContent *)content
|
||||
- (void)handleReceivedTextMessageWithEnvelope:(OWSSignalServiceProtosEnvelope *)textMessageEnvelope
|
||||
dataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
|
||||
{
|
||||
[self handleReceivedMessage:message withContent:content attachmentIds:content.attachments];
|
||||
[self handleReceivedEnvelope:textMessageEnvelope withDataMessage:dataMessage attachmentIds:@[] completionBlock:nil];
|
||||
}
|
||||
|
||||
- (void)handleSendToMyself:(TSOutgoingMessage *)outgoingMessage
|
||||
@ -224,35 +267,28 @@
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)handleReceivedMessage:(IncomingPushMessageSignal *)message
|
||||
withContent:(PushMessageContent *)content
|
||||
attachmentIds:(NSArray<NSString *> *)attachmentIds
|
||||
- (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
withDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage
|
||||
attachmentIds:(NSArray<NSString *> *)attachmentIds
|
||||
completionBlock:(void (^)(NSString *messageIdentifier))completionBlock
|
||||
{
|
||||
[self handleReceivedMessage:message withContent:content attachmentIds:attachmentIds completionBlock:nil];
|
||||
}
|
||||
|
||||
- (void)handleReceivedMessage:(IncomingPushMessageSignal *)message
|
||||
withContent:(PushMessageContent *)content
|
||||
attachmentIds:(NSArray<NSString *> *)attachmentIds
|
||||
completionBlock:(void (^)(NSString *messageIdentifier))completionBlock
|
||||
{
|
||||
uint64_t timeStamp = message.timestamp;
|
||||
NSString *body = content.body;
|
||||
NSData *groupId = content.hasGroup ? content.group.id : nil;
|
||||
uint64_t timeStamp = envelope.timestamp;
|
||||
NSString *body = dataMessage.body;
|
||||
NSData *groupId = dataMessage.hasGroup ? dataMessage.group.id : nil;
|
||||
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
TSIncomingMessage *incomingMessage;
|
||||
TSThread *thread;
|
||||
if (groupId) {
|
||||
TSGroupModel *model =
|
||||
[[TSGroupModel alloc] initWithTitle:content.group.name
|
||||
memberIds:[[[NSSet setWithArray:content.group.members] allObjects] mutableCopy]
|
||||
image:nil
|
||||
groupId:content.group.id];
|
||||
NSMutableArray *uniqueMemberIds = [[[NSSet setWithArray:dataMessage.group.members] allObjects] mutableCopy];
|
||||
TSGroupModel *model = [[TSGroupModel alloc] initWithTitle:dataMessage.group.name
|
||||
memberIds:uniqueMemberIds
|
||||
image:nil
|
||||
groupId:dataMessage.group.id];
|
||||
TSGroupThread *gThread = [TSGroupThread getOrCreateThreadWithGroupModel:model transaction:transaction];
|
||||
[gThread saveWithTransaction:transaction];
|
||||
|
||||
if (content.group.type == PushMessageContentGroupContextTypeUpdate) {
|
||||
if (dataMessage.group.type == OWSSignalServiceProtosGroupContextTypeUpdate) {
|
||||
if ([attachmentIds count] == 1) {
|
||||
NSString *avatarId = attachmentIds[0];
|
||||
TSAttachment *avatar = [TSAttachment fetchObjectWithUniqueID:avatarId];
|
||||
@ -273,18 +309,18 @@
|
||||
inThread:gThread
|
||||
messageType:TSInfoMessageTypeGroupUpdate
|
||||
customMessage:updateGroupInfo] saveWithTransaction:transaction];
|
||||
} else if (content.group.type == PushMessageContentGroupContextTypeQuit) {
|
||||
} else if (dataMessage.group.type == OWSSignalServiceProtosGroupContextTypeQuit) {
|
||||
NSString *nameString =
|
||||
[[TextSecureKitEnv sharedEnv].contactsManager nameStringForPhoneIdentifier:message.source];
|
||||
[[TextSecureKitEnv sharedEnv].contactsManager nameStringForPhoneIdentifier:envelope.source];
|
||||
|
||||
if (!nameString) {
|
||||
nameString = message.source;
|
||||
nameString = envelope.source;
|
||||
}
|
||||
|
||||
NSString *updateGroupInfo =
|
||||
[NSString stringWithFormat:NSLocalizedString(@"GROUP_MEMBER_LEFT", @""), nameString];
|
||||
NSMutableArray *newGroupMembers = [NSMutableArray arrayWithArray:gThread.groupModel.groupMemberIds];
|
||||
[newGroupMembers removeObject:message.source];
|
||||
[newGroupMembers removeObject:envelope.source];
|
||||
gThread.groupModel.groupMemberIds = newGroupMembers;
|
||||
|
||||
[gThread saveWithTransaction:transaction];
|
||||
@ -295,7 +331,7 @@
|
||||
} else {
|
||||
incomingMessage = [[TSIncomingMessage alloc] initWithTimestamp:timeStamp
|
||||
inThread:gThread
|
||||
authorId:message.source
|
||||
authorId:envelope.source
|
||||
messageBody:body
|
||||
attachmentIds:attachmentIds];
|
||||
[incomingMessage saveWithTransaction:transaction];
|
||||
@ -303,9 +339,9 @@
|
||||
|
||||
thread = gThread;
|
||||
} else {
|
||||
TSContactThread *cThread = [TSContactThread getOrCreateThreadWithContactId:message.source
|
||||
TSContactThread *cThread = [TSContactThread getOrCreateThreadWithContactId:envelope.source
|
||||
transaction:transaction
|
||||
pushSignal:message];
|
||||
envelope:envelope];
|
||||
|
||||
incomingMessage = [[TSIncomingMessage alloc] initWithTimestamp:timeStamp
|
||||
inThread:cThread
|
||||
@ -324,7 +360,7 @@
|
||||
TSGroupThread *gThread = (TSGroupThread *)thread;
|
||||
TSIncomingMessage *textMessage = [[TSIncomingMessage alloc] initWithTimestamp:textMessageTimestamp
|
||||
inThread:gThread
|
||||
authorId:message.source
|
||||
authorId:envelope.source
|
||||
messageBody:body
|
||||
attachmentIds:nil];
|
||||
[textMessage saveWithTransaction:transaction];
|
||||
@ -356,27 +392,28 @@
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)processException:(NSException *)exception pushSignal:(IncomingPushMessageSignal *)signal {
|
||||
- (void)processException:(NSException *)exception envelope:(OWSSignalServiceProtosEnvelope *)envelope
|
||||
{
|
||||
DDLogError(@"Got exception: %@ of type: %@", exception.description, exception.name);
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
TSErrorMessage *errorMessage;
|
||||
|
||||
if ([exception.name isEqualToString:NoSessionException]) {
|
||||
errorMessage = [TSErrorMessage missingSessionWithSignal:signal withTransaction:transaction];
|
||||
errorMessage = [TSErrorMessage missingSessionWithEnvelope:envelope withTransaction:transaction];
|
||||
} else if ([exception.name isEqualToString:InvalidKeyException]) {
|
||||
errorMessage = [TSErrorMessage invalidKeyExceptionWithSignal:signal withTransaction:transaction];
|
||||
errorMessage = [TSErrorMessage invalidKeyExceptionWithEnvelope:envelope withTransaction:transaction];
|
||||
} else if ([exception.name isEqualToString:InvalidKeyIdException]) {
|
||||
errorMessage = [TSErrorMessage invalidKeyExceptionWithSignal:signal withTransaction:transaction];
|
||||
errorMessage = [TSErrorMessage invalidKeyExceptionWithEnvelope:envelope withTransaction:transaction];
|
||||
} else if ([exception.name isEqualToString:DuplicateMessageException]) {
|
||||
// Duplicate messages are dismissed
|
||||
return;
|
||||
} else if ([exception.name isEqualToString:InvalidVersionException]) {
|
||||
errorMessage = [TSErrorMessage invalidVersionWithSignal:signal withTransaction:transaction];
|
||||
errorMessage = [TSErrorMessage invalidVersionWithEnvelope:envelope withTransaction:transaction];
|
||||
} else if ([exception.name isEqualToString:UntrustedIdentityKeyException]) {
|
||||
errorMessage =
|
||||
[TSInvalidIdentityKeyReceivingErrorMessage untrustedKeyWithSignal:signal withTransaction:transaction];
|
||||
[TSInvalidIdentityKeyReceivingErrorMessage untrustedKeyWithEnvelope:envelope withTransaction:transaction];
|
||||
} else {
|
||||
errorMessage = [TSErrorMessage corruptedMessageWithSignal:signal withTransaction:transaction];
|
||||
errorMessage = [TSErrorMessage corruptedMessageWithEnvelope:envelope withTransaction:transaction];
|
||||
}
|
||||
|
||||
[errorMessage saveWithTransaction:transaction];
|
||||
|
||||
@ -167,9 +167,9 @@ NSString *const SocketConnectingNotification = @"SocketConnectingNotification";
|
||||
return;
|
||||
}
|
||||
|
||||
IncomingPushMessageSignal *messageSignal = [IncomingPushMessageSignal parseFromData:decryptedPayload];
|
||||
OWSSignalServiceProtosEnvelope *envelope = [OWSSignalServiceProtosEnvelope parseFromData:decryptedPayload];
|
||||
|
||||
[[TSMessagesManager sharedManager] handleMessageSignal:messageSignal];
|
||||
[[TSMessagesManager sharedManager] handleReceivedEnvelope:envelope];
|
||||
} else {
|
||||
DDLogWarn(@"Unsupported WebSocket Request");
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user