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:
Michael Kirk 2016-08-22 16:09:58 -04:00 committed by GitHub
parent f3a91c2629
commit 1d0b645fc9
36 changed files with 6883 additions and 10146 deletions

View File

@ -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

View File

@ -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
View 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

View File

@ -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];
}

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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.
*

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -14,7 +14,7 @@
inThread:(TSThread *)thread
failedMessageType:(TSErrorMessageType)errorMessageType NS_DESIGNATED_INITIALIZER;
@property NSData *pushSignal;
@property NSData *envelopeData;
@property NSDictionary *pendingOutgoingMessage;

View File

@ -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;

View File

@ -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 {

View File

@ -11,6 +11,6 @@
@interface TSInvalidIdentityKeyErrorMessage : TSErrorMessage
- (void)acceptNewIdentityKey;
- (NSString *)newIdentityKey;
- (NSString *)newIdentityFingerprint;
@end

View File

@ -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;
}

View File

@ -10,7 +10,8 @@
@interface TSInvalidIdentityKeyReceivingErrorMessage : TSInvalidIdentityKeyErrorMessage
+ (instancetype)untrustedKeyWithSignal:(IncomingPushMessageSignal *)preKeyMessage
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
+ (instancetype)untrustedKeyWithEnvelope:(OWSSignalServiceProtosEnvelope *)envelope
withTransaction:(YapDatabaseReadWriteTransaction *)transaction;
- (NSData *)newIdentityKey;
@end

View File

@ -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

View File

@ -95,7 +95,8 @@
}
}
- (NSString *)newIdentityKey {
- (NSString *)newIdentityFingerprint
{
NSData *identityKey = [self newKey];
return [TSFingerprintGenerator getFingerprintForDisplay:identityKey];

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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];
});
}
}];
}
}

View File

@ -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];

View File

@ -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;

View File

@ -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];

View File

@ -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");
}