Signal-iOS/SignalServiceKit/src/groups/NewGroupSeed.swift
2021-03-25 09:24:27 -03:00

77 lines
2.6 KiB
Swift

//
// Copyright (c) 2021 Open Whisper Systems. All rights reserved.
//
import Foundation
// This seed can be used to pre-generate the key group
// state before the group is created. This allows us
// to preview the correct conversation color, etc. in
// the "new group" view.
@objc
public class NewGroupSeed: NSObject {
@objc
public let groupIdV1: Data
@objc
public let groupIdV2: Data?
@objc
public let groupSecretParamsData: Data?
@objc
public override convenience init() {
self.init(groupIdV1: nil)
}
private init(groupIdV1: Data? = nil) {
if let groupIdV1 = groupIdV1 {
self.groupIdV1 = groupIdV1
} else {
self.groupIdV1 = TSGroupModel.generateRandomV1GroupId()
}
let groupsV2 = Self.groupsV2
let groupSecretParamsData = try! groupsV2.generateGroupSecretParamsData()
self.groupSecretParamsData = groupSecretParamsData
groupIdV2 = try! groupsV2.groupId(forGroupSecretParamsData: groupSecretParamsData)
}
// During the v1->v2 transition period, we don't know whether
// a new group will be v1 or v2 until we make it. So we guess.
// This is only used for color previews so it's okay to be
// inaccurate.
@objc
public var possibleGroupId: Data {
if let groupIdV2 = groupIdV2 {
return groupIdV2
}
return groupIdV1
}
@objc
public var possibleConversationColorName: ConversationColorName {
return TSGroupThread.defaultConversationColorName(forGroupId: possibleGroupId)
}
public var deriveNewGroupSeedForRetry: NewGroupSeed {
// If group creation fails, we generate a new seed before retrying.
// We want to re-use the same group id for v1 but generate a new
// group id / group secret params for v2.
//
// v1 group creation can fail after having informed some of the members
// and/or inserting the group into the local database.
// In this case, it's important that retries use the same group id.
// Otherwise members may see multiple groups created.
//
// v2 group creation will never fail after having informed some of the
// members and/or inserting the group into the local database.
// However, v2 group creation can fail before or after the group is
// created on the service. (Re-)trying to create the group on the
// service a second time using the same group id/secrets params will
// fail, so it's best to generate a new group id / group secret params
// for v2.
NewGroupSeed(groupIdV1: groupIdV1)
}
}