enable to send the group sync message

pull/104/head
Ryan ZHAO 5 years ago
parent 50d446f90f
commit 1a156c604a

@ -166,6 +166,7 @@ final class DeviceLinkingModal : Modal, DeviceLinkingSessionDelegate {
ThreadUtil.enqueue(linkingAuthorizationMessage) ThreadUtil.enqueue(linkingAuthorizationMessage)
SSKEnvironment.shared.messageSender.send(linkingAuthorizationMessage, success: { SSKEnvironment.shared.messageSender.send(linkingAuthorizationMessage, success: {
let _ = SSKEnvironment.shared.syncManager.syncAllContacts() let _ = SSKEnvironment.shared.syncManager.syncAllContacts()
_ = SSKEnvironment.shared.syncManager.syncAllGroups()
}) { _ in }) { _ in
print("[Loki] Failed to send device link authorization message.") print("[Loki] Failed to send device link authorization message.")
} }

@ -16,6 +16,7 @@
#import <SignalServiceKit/OWSPrimaryStorage.h> #import <SignalServiceKit/OWSPrimaryStorage.h>
#import <SignalServiceKit/OWSSyncConfigurationMessage.h> #import <SignalServiceKit/OWSSyncConfigurationMessage.h>
#import <SignalServiceKit/OWSSyncContactsMessage.h> #import <SignalServiceKit/OWSSyncContactsMessage.h>
#import <SignalServiceKit/OWSSyncGroupsMessage.h>
#import <SignalServiceKit/SSKEnvironment.h> #import <SignalServiceKit/SSKEnvironment.h>
#import <SignalServiceKit/SignalAccount.h> #import <SignalServiceKit/SignalAccount.h>
#import <SignalServiceKit/SignalServiceKit-Swift.h> #import <SignalServiceKit/SignalServiceKit-Swift.h>
@ -303,6 +304,24 @@ NSString *const kSyncManagerLastContactSyncKey = @"kTSStorageManagerOWSSyncManag
return promise; return promise;
} }
- (AnyPromise *)syncAllGroups
{
OWSSyncGroupsMessage *syncGroupsMessage = [[OWSSyncGroupsMessage alloc] init];
AnyPromise *promise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) {
[self.messageSender sendMessage:syncGroupsMessage
success:^{
OWSLogInfo(@"Successfully sent groups sync message.");
resolve(@(1));
}
failure:^(NSError *error) {
OWSLogError(@"Failed to send groups sync message with error: %@.", error);
resolve(error);
}];
}];
[promise retainUntilComplete];
return promise;
}
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

@ -319,6 +319,7 @@ message SyncMessage {
message Groups { message Groups {
optional AttachmentPointer blob = 1; optional AttachmentPointer blob = 1;
optional bytes data = 101; // Loki
} }
message Blocked { message Blocked {
@ -399,7 +400,7 @@ message GroupContext {
optional string name = 3; optional string name = 3;
repeated string members = 4; repeated string members = 4;
optional AttachmentPointer avatar = 5; optional AttachmentPointer avatar = 5;
repeated string admins = 6; repeated string admins = 6; // Loki
} }
message ContactDetails { message ContactDetails {
@ -435,6 +436,7 @@ message GroupDetails {
optional uint32 expireTimer = 6; optional uint32 expireTimer = 6;
optional string color = 7; optional string color = 7;
optional bool blocked = 8; optional bool blocked = 8;
repeated string admins = 9; // Loki
} }
// Internal - DO NOT SEND // Internal - DO NOT SEND

@ -26,6 +26,7 @@ NS_ASSUME_NONNULL_BEGIN
[groupBuilder setName:group.groupName]; [groupBuilder setName:group.groupName];
[groupBuilder setMembers:group.groupMemberIds]; [groupBuilder setMembers:group.groupMemberIds];
[groupBuilder setColor:groupThread.conversationColorName]; [groupBuilder setColor:groupThread.conversationColorName];
[groupBuilder setAdmins:group.groupAdminIds];
if ([OWSBlockingManager.sharedManager isGroupIdBlocked:group.groupId]) { if ([OWSBlockingManager.sharedManager isGroupIdBlocked:group.groupId]) {
[groupBuilder setBlocked:YES]; [groupBuilder setBlocked:YES];

@ -11,6 +11,7 @@
#import "TSGroupThread.h" #import "TSGroupThread.h"
#import <SignalCoreKit/NSDate+OWS.h> #import <SignalCoreKit/NSDate+OWS.h>
#import <SignalServiceKit/SignalServiceKit-Swift.h> #import <SignalServiceKit/SignalServiceKit-Swift.h>
#import "OWSPrimaryStorage.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@ -28,22 +29,32 @@ NS_ASSUME_NONNULL_BEGIN
- (nullable SSKProtoSyncMessageBuilder *)syncMessageBuilder - (nullable SSKProtoSyncMessageBuilder *)syncMessageBuilder
{ {
if (self.attachmentIds.count != 1) { NSError *error;
OWSLogError(@"expected sync groups message to have exactly one attachment, but found %lu", if (self.attachmentIds.count > 1) {
(unsigned long)self.attachmentIds.count); OWSLogError(@"Expected sync group message to have one or zero attachments, but found %lu.", (unsigned long)self.attachmentIds.count);
} }
SSKProtoAttachmentPointer *_Nullable attachmentProto = SSKProtoSyncMessageGroupsBuilder *groupsBuilder;
[TSAttachmentStream buildProtoForAttachmentId:self.attachmentIds.firstObject]; if (self.attachmentIds.count == 0) {
if (!attachmentProto) { SSKProtoAttachmentPointerBuilder *attachmentProtoBuilder = [SSKProtoAttachmentPointer builderWithId:0];
OWSFailDebug(@"could not build protobuf."); SSKProtoAttachmentPointer *attachmentProto = [attachmentProtoBuilder buildAndReturnError:&error];
groupsBuilder = [SSKProtoSyncMessageGroups builder];
[groupsBuilder setBlob:attachmentProto];
__block NSData *data;
[OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
data = [self buildPlainTextAttachmentDataWithTransaction:transaction];
}];
[groupsBuilder setData:data];
} else {
SSKProtoAttachmentPointer *attachmentProto = [TSAttachmentStream buildProtoForAttachmentId:self.attachmentIds.firstObject];
if (attachmentProto == nil) {
OWSFailDebug(@"Couldn't build protobuf.");
return nil; return nil;
} }
groupsBuilder = [SSKProtoSyncMessageGroups builder];
SSKProtoSyncMessageGroupsBuilder *groupsBuilder = [SSKProtoSyncMessageGroups builder];
[groupsBuilder setBlob:attachmentProto]; [groupsBuilder setBlob:attachmentProto];
}
NSError *error;
SSKProtoSyncMessageGroups *_Nullable groupsProto = [groupsBuilder buildAndReturnError:&error]; SSKProtoSyncMessageGroups *_Nullable groupsProto = [groupsBuilder buildAndReturnError:&error];
if (error || !groupsProto) { if (error || !groupsProto) {
OWSFailDebug(@"could not build protobuf: %@", error); OWSFailDebug(@"could not build protobuf: %@", error);
@ -68,7 +79,7 @@ NS_ASSUME_NONNULL_BEGIN
[TSGroupThread [TSGroupThread
enumerateCollectionObjectsWithTransaction:transaction enumerateCollectionObjectsWithTransaction:transaction
usingBlock:^(id obj, BOOL *stop) { usingBlock:^(id obj, BOOL *stop) {
if (![obj isKindOfClass:[TSGroupThread class]]) { if (![obj isKindOfClass:[TSGroupThread class]] || ((TSGroupThread *)obj).groupModel.groupType != closedGroup) {
if (![obj isKindOfClass:[TSContactThread class]]) { if (![obj isKindOfClass:[TSContactThread class]]) {
OWSLogWarn( OWSLogWarn(
@"Ignoring non group thread in thread collection: %@", obj); @"Ignoring non group thread in thread collection: %@", obj);

@ -1074,7 +1074,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.identityManager throws_processIncomingSyncMessage:syncMessage.verified transaction:transaction]; [self.identityManager throws_processIncomingSyncMessage:syncMessage.verified transaction:transaction];
} else if (syncMessage.contacts != nil) { } else if (syncMessage.contacts != nil) {
if (wasSentByMasterDevice && syncMessage.contacts.data.length > 0) { if (wasSentByMasterDevice && syncMessage.contacts.data.length > 0) {
NSLog(@"[Loki] Received contact sync message."); OWSLogInfo(@"[Loki] Received contact sync message.");
NSData *data = syncMessage.contacts.data; NSData *data = syncMessage.contacts.data;
ContactParser *parser = [[ContactParser alloc] initWithData:data]; ContactParser *parser = [[ContactParser alloc] initWithData:data];
NSArray<NSString *> *hexEncodedPublicKeys = [parser parseHexEncodedPublicKeys]; NSArray<NSString *> *hexEncodedPublicKeys = [parser parseHexEncodedPublicKeys];
@ -1102,6 +1102,12 @@ NS_ASSUME_NONNULL_BEGIN
} }
} }
} }
} else if (syncMessage.groups != nil) {
if (wasSentByMasterDevice && syncMessage.groups.data.length > 0) {
OWSLogInfo(@"[Loki] Received group sync message.");
NSData *data = syncMessage.groups.data;
// TODO: decode the data and handle the group info
}
} else { } else {
OWSLogWarn(@"Ignoring unsupported sync message."); OWSLogWarn(@"Ignoring unsupported sync message.");
} }

@ -4551,6 +4551,9 @@ extension SSKProtoSyncMessageContacts.SSKProtoSyncMessageContactsBuilder {
if let _value = blob { if let _value = blob {
builder.setBlob(_value) builder.setBlob(_value)
} }
if let _value = data {
builder.setData(_value)
}
return builder return builder
} }
@ -4564,6 +4567,10 @@ extension SSKProtoSyncMessageContacts.SSKProtoSyncMessageContactsBuilder {
proto.blob = valueParam.proto proto.blob = valueParam.proto
} }
@objc public func setData(_ valueParam: Data) {
proto.data = valueParam
}
@objc public func build() throws -> SSKProtoSyncMessageGroups { @objc public func build() throws -> SSKProtoSyncMessageGroups {
return try SSKProtoSyncMessageGroups.parseProto(proto) return try SSKProtoSyncMessageGroups.parseProto(proto)
} }
@ -4577,6 +4584,16 @@ extension SSKProtoSyncMessageContacts.SSKProtoSyncMessageContactsBuilder {
@objc public let blob: SSKProtoAttachmentPointer? @objc public let blob: SSKProtoAttachmentPointer?
@objc public var data: Data? {
guard proto.hasData else {
return nil
}
return proto.data
}
@objc public var hasData: Bool {
return proto.hasData
}
private init(proto: SignalServiceProtos_SyncMessage.Groups, private init(proto: SignalServiceProtos_SyncMessage.Groups,
blob: SSKProtoAttachmentPointer?) { blob: SSKProtoAttachmentPointer?) {
self.proto = proto self.proto = proto
@ -6344,6 +6361,16 @@ extension SSKProtoGroupDetailsAvatar.SSKProtoGroupDetailsAvatarBuilder {
proto.members = wrappedItems proto.members = wrappedItems
} }
@objc public func addAdmins(_ valueParam: String) {
var items = proto.admins
items.append(valueParam)
proto.admins = items
}
@objc public func setAdmins(_ wrappedItems: [String]) {
proto.admins = wrappedItems
}
@objc public func setAvatar(_ valueParam: SSKProtoGroupDetailsAvatar) { @objc public func setAvatar(_ valueParam: SSKProtoGroupDetailsAvatar) {
proto.avatar = valueParam.proto proto.avatar = valueParam.proto
} }
@ -6393,6 +6420,10 @@ extension SSKProtoGroupDetailsAvatar.SSKProtoGroupDetailsAvatarBuilder {
return proto.members return proto.members
} }
@objc public var admins: [String] {
return proto.admins
}
@objc public var active: Bool { @objc public var active: Bool {
return proto.active return proto.active
} }

@ -1946,6 +1946,16 @@ struct SignalServiceProtos_SyncMessage {
/// Clears the value of `blob`. Subsequent reads from it will return its default value. /// Clears the value of `blob`. Subsequent reads from it will return its default value.
mutating func clearBlob() {_uniqueStorage()._blob = nil} mutating func clearBlob() {_uniqueStorage()._blob = nil}
/// Loki
var data: Data {
get {return _storage._data ?? SwiftProtobuf.Internal.emptyData}
set {_uniqueStorage()._data = newValue}
}
/// Returns true if `data` has been explicitly set.
var hasData: Bool {return _storage._data != nil}
/// Clears the value of `data`. Subsequent reads from it will return its default value.
mutating func clearData() {_uniqueStorage()._data = nil}
var unknownFields = SwiftProtobuf.UnknownStorage() var unknownFields = SwiftProtobuf.UnknownStorage()
init() {} init() {}
@ -2535,6 +2545,12 @@ struct SignalServiceProtos_GroupDetails {
set {_uniqueStorage()._members = newValue} set {_uniqueStorage()._members = newValue}
} }
///Loki
var admins: [String] {
get {return _storage._admins}
set {_uniqueStorage()._admins = newValue}
}
var avatar: SignalServiceProtos_GroupDetails.Avatar { var avatar: SignalServiceProtos_GroupDetails.Avatar {
get {return _storage._avatar ?? SignalServiceProtos_GroupDetails.Avatar()} get {return _storage._avatar ?? SignalServiceProtos_GroupDetails.Avatar()}
set {_uniqueStorage()._avatar = newValue} set {_uniqueStorage()._avatar = newValue}
@ -4627,10 +4643,12 @@ extension SignalServiceProtos_SyncMessage.Groups: SwiftProtobuf.Message, SwiftPr
static let protoMessageName: String = SignalServiceProtos_SyncMessage.protoMessageName + ".Groups" static let protoMessageName: String = SignalServiceProtos_SyncMessage.protoMessageName + ".Groups"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "blob"), 1: .same(proto: "blob"),
101: .same(proto: "data"),
] ]
fileprivate class _StorageClass { fileprivate class _StorageClass {
var _blob: SignalServiceProtos_AttachmentPointer? = nil var _blob: SignalServiceProtos_AttachmentPointer? = nil
var _data: Data? = nil
static let defaultInstance = _StorageClass() static let defaultInstance = _StorageClass()
@ -4638,6 +4656,7 @@ extension SignalServiceProtos_SyncMessage.Groups: SwiftProtobuf.Message, SwiftPr
init(copying source: _StorageClass) { init(copying source: _StorageClass) {
_blob = source._blob _blob = source._blob
_data = source._data
} }
} }
@ -4654,6 +4673,7 @@ extension SignalServiceProtos_SyncMessage.Groups: SwiftProtobuf.Message, SwiftPr
while let fieldNumber = try decoder.nextFieldNumber() { while let fieldNumber = try decoder.nextFieldNumber() {
switch fieldNumber { switch fieldNumber {
case 1: try decoder.decodeSingularMessageField(value: &_storage._blob) case 1: try decoder.decodeSingularMessageField(value: &_storage._blob)
case 101: try decoder.decodeSingularBytesField(value: &_storage._data)
default: break default: break
} }
} }
@ -4665,6 +4685,9 @@ extension SignalServiceProtos_SyncMessage.Groups: SwiftProtobuf.Message, SwiftPr
if let v = _storage._blob { if let v = _storage._blob {
try visitor.visitSingularMessageField(value: v, fieldNumber: 1) try visitor.visitSingularMessageField(value: v, fieldNumber: 1)
} }
if let v = _storage._data {
try visitor.visitSingularBytesField(value: v, fieldNumber: 101)
}
} }
try unknownFields.traverse(visitor: &visitor) try unknownFields.traverse(visitor: &visitor)
} }
@ -4675,6 +4698,7 @@ extension SignalServiceProtos_SyncMessage.Groups: SwiftProtobuf.Message, SwiftPr
let _storage = _args.0 let _storage = _args.0
let rhs_storage = _args.1 let rhs_storage = _args.1
if _storage._blob != rhs_storage._blob {return false} if _storage._blob != rhs_storage._blob {return false}
if _storage._data != rhs_storage._data {return false}
return true return true
} }
if !storagesAreEqual {return false} if !storagesAreEqual {return false}
@ -5223,6 +5247,7 @@ extension SignalServiceProtos_GroupDetails: SwiftProtobuf.Message, SwiftProtobuf
6: .same(proto: "expireTimer"), 6: .same(proto: "expireTimer"),
7: .same(proto: "color"), 7: .same(proto: "color"),
8: .same(proto: "blocked"), 8: .same(proto: "blocked"),
9: .same(proto: "admins"),
] ]
fileprivate class _StorageClass { fileprivate class _StorageClass {
@ -5234,6 +5259,7 @@ extension SignalServiceProtos_GroupDetails: SwiftProtobuf.Message, SwiftProtobuf
var _expireTimer: UInt32? = nil var _expireTimer: UInt32? = nil
var _color: String? = nil var _color: String? = nil
var _blocked: Bool? = nil var _blocked: Bool? = nil
var _admins: [String] = []
static let defaultInstance = _StorageClass() static let defaultInstance = _StorageClass()
@ -5248,6 +5274,7 @@ extension SignalServiceProtos_GroupDetails: SwiftProtobuf.Message, SwiftProtobuf
_expireTimer = source._expireTimer _expireTimer = source._expireTimer
_color = source._color _color = source._color
_blocked = source._blocked _blocked = source._blocked
_admins = source._admins
} }
} }
@ -5271,6 +5298,7 @@ extension SignalServiceProtos_GroupDetails: SwiftProtobuf.Message, SwiftProtobuf
case 6: try decoder.decodeSingularUInt32Field(value: &_storage._expireTimer) case 6: try decoder.decodeSingularUInt32Field(value: &_storage._expireTimer)
case 7: try decoder.decodeSingularStringField(value: &_storage._color) case 7: try decoder.decodeSingularStringField(value: &_storage._color)
case 8: try decoder.decodeSingularBoolField(value: &_storage._blocked) case 8: try decoder.decodeSingularBoolField(value: &_storage._blocked)
case 9: try decoder.decodeRepeatedStringField(value: &_storage._admins)
default: break default: break
} }
} }
@ -5303,6 +5331,9 @@ extension SignalServiceProtos_GroupDetails: SwiftProtobuf.Message, SwiftProtobuf
if let v = _storage._blocked { if let v = _storage._blocked {
try visitor.visitSingularBoolField(value: v, fieldNumber: 8) try visitor.visitSingularBoolField(value: v, fieldNumber: 8)
} }
if !_storage._admins.isEmpty {
try visitor.visitRepeatedStringField(value: _storage._admins, fieldNumber: 9)
}
} }
try unknownFields.traverse(visitor: &visitor) try unknownFields.traverse(visitor: &visitor)
} }
@ -5320,6 +5351,7 @@ extension SignalServiceProtos_GroupDetails: SwiftProtobuf.Message, SwiftProtobuf
if _storage._expireTimer != rhs_storage._expireTimer {return false} if _storage._expireTimer != rhs_storage._expireTimer {return false}
if _storage._color != rhs_storage._color {return false} if _storage._color != rhs_storage._color {return false}
if _storage._blocked != rhs_storage._blocked {return false} if _storage._blocked != rhs_storage._blocked {return false}
if _storage._admins != rhs_storage._admins {return false}
return true return true
} }
if !storagesAreEqual {return false} if !storagesAreEqual {return false}

@ -9,6 +9,12 @@ import PromiseKit
@objc @objc
public class OWSMockSyncManager: NSObject, OWSSyncManagerProtocol { public class OWSMockSyncManager: NSObject, OWSSyncManagerProtocol {
public func syncAllGroups() -> AnyPromise {
Logger.info("")
return AnyPromise()
}
@objc public func sendConfigurationSyncMessage() { @objc public func sendConfigurationSyncMessage() {
Logger.info("") Logger.info("")

@ -20,6 +20,8 @@ NS_ASSUME_NONNULL_BEGIN
- (AnyPromise *)syncContactsForSignalAccounts:(NSArray<SignalAccount *> *)signalAccounts __attribute__((warn_unused_result)); - (AnyPromise *)syncContactsForSignalAccounts:(NSArray<SignalAccount *> *)signalAccounts __attribute__((warn_unused_result));
- (AnyPromise *)syncAllGroups __attribute__((warn_unused_result));
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

Loading…
Cancel
Save