Update Ghostgram features

This commit is contained in:
ichmagmaus 812
2026-03-07 18:15:32 +01:00
parent 1a3303b059
commit 24a7ec39d9
902 changed files with 148295 additions and 62348 deletions
@@ -10,7 +10,8 @@ func validatedEncryptionConfig(postbox: Postbox, network: Network) -> Signal<Sec
|> retryRequest
|> mapToSignal { result -> Signal<SecretChatEncryptionConfig, NoError> in
switch result {
case let .dhConfig(g, p, version, _):
case let .dhConfig(dhConfigData):
let (g, p, version) = (dhConfigData.g, dhConfigData.p, dhConfigData.version)
if !MTCheckIsSafeG(UInt32(g)) {
Logger.shared.log("SecretChatEncryptionConfig", "Invalid g")
return .complete()
@@ -26,7 +27,7 @@ func validatedEncryptionConfig(postbox: Postbox, network: Network) -> Signal<Sec
return .never()
}
return .single(SecretChatEncryptionConfig(g: g, p: MemoryBuffer(p), version: version))
case .dhConfigNotModified(_):
case .dhConfigNotModified:
assertionFailure()
return .never()
}
@@ -6,7 +6,8 @@ import TelegramApi
extension SecretChatFileReference {
convenience init?(_ file: Api.EncryptedFile) {
switch file {
case let .encryptedFile(id, accessHash, size, dcId, keyFingerprint):
case let .encryptedFile(encryptedFileData):
let (id, accessHash, size, dcId, keyFingerprint) = (encryptedFileData.id, encryptedFileData.accessHash, encryptedFileData.size, encryptedFileData.dcId, encryptedFileData.keyFingerprint)
self.init(id: id, accessHash: accessHash, size: size, datacenterId: dcId, keyFingerprint: keyFingerprint)
case .encryptedFileEmpty:
return nil
@@ -15,9 +15,11 @@ private func keyFingerprintFromBytes(_ bytes: Buffer) -> Int64 {
extension SecretChatIncomingEncryptedOperation {
convenience init(message: Api.EncryptedMessage) {
switch message {
case let .encryptedMessage(randomId, chatId, date, bytes, file):
case let .encryptedMessage(encryptedMessageData):
let (randomId, chatId, date, bytes, file) = (encryptedMessageData.randomId, encryptedMessageData.chatId, encryptedMessageData.date, encryptedMessageData.bytes, encryptedMessageData.file)
self.init(peerId: PeerId(namespace: Namespaces.Peer.SecretChat, id: PeerId.Id._internalFromInt64Value(Int64(chatId))), globallyUniqueId: randomId, timestamp: date, type: .message, keyFingerprint: keyFingerprintFromBytes(bytes), contents: MemoryBuffer(bytes), mediaFileReference: SecretChatFileReference(file))
case let .encryptedMessageService(randomId, chatId, date, bytes):
case let .encryptedMessageService(encryptedMessageServiceData):
let (randomId, chatId, date, bytes) = (encryptedMessageServiceData.randomId, encryptedMessageServiceData.chatId, encryptedMessageServiceData.date, encryptedMessageServiceData.bytes)
self.init(peerId: PeerId(namespace: Namespaces.Peer.SecretChat, id: PeerId.Id._internalFromInt64Value(Int64(chatId))), globallyUniqueId: randomId, timestamp: date, type: .service, keyFingerprint: keyFingerprintFromBytes(bytes), contents: MemoryBuffer(bytes), mediaFileReference: nil)
}
}
@@ -6,11 +6,14 @@ import TelegramApi
extension SecretChatOutgoingFileReference {
init?(_ apiFile: Api.InputEncryptedFile) {
switch apiFile {
case let .inputEncryptedFile(id, accessHash):
case let .inputEncryptedFile(inputEncryptedFileData):
let (id, accessHash) = (inputEncryptedFileData.id, inputEncryptedFileData.accessHash)
self = .remote(id: id, accessHash: accessHash)
case let .inputEncryptedFileBigUploaded(id, parts, keyFingerprint):
case let .inputEncryptedFileBigUploaded(inputEncryptedFileBigUploadedData):
let (id, parts, keyFingerprint) = (inputEncryptedFileBigUploadedData.id, inputEncryptedFileBigUploadedData.parts, inputEncryptedFileBigUploadedData.keyFingerprint)
self = .uploadedLarge(id: id, partCount: parts, keyFingerprint: keyFingerprint)
case let .inputEncryptedFileUploaded(id, parts, md5Checksum, keyFingerprint):
case let .inputEncryptedFileUploaded(inputEncryptedFileUploadedData):
let (id, parts, md5Checksum, keyFingerprint) = (inputEncryptedFileUploadedData.id, inputEncryptedFileUploadedData.parts, inputEncryptedFileUploadedData.md5Checksum, inputEncryptedFileUploadedData.keyFingerprint)
self = .uploadedRegular(id: id, partCount: parts, md5Digest: md5Checksum, keyFingerprint: keyFingerprint)
case .inputEncryptedFileEmpty:
return nil
@@ -20,11 +23,11 @@ extension SecretChatOutgoingFileReference {
var apiInputFile: Api.InputEncryptedFile {
switch self {
case let .remote(id, accessHash):
return .inputEncryptedFile(id: id, accessHash: accessHash)
return .inputEncryptedFile(.init(id: id, accessHash: accessHash))
case let .uploadedRegular(id, partCount, md5Digest, keyFingerprint):
return .inputEncryptedFileUploaded(id: id, parts: partCount, md5Checksum: md5Digest, keyFingerprint: keyFingerprint)
return .inputEncryptedFileUploaded(.init(id: id, parts: partCount, md5Checksum: md5Digest, keyFingerprint: keyFingerprint))
case let .uploadedLarge(id, partCount, keyFingerprint):
return .inputEncryptedFileBigUploaded(id: id, parts: partCount, keyFingerprint: keyFingerprint)
return .inputEncryptedFileBigUploaded(.init(id: id, parts: partCount, keyFingerprint: keyFingerprint))
}
}
}
@@ -26,6 +26,11 @@ func _internal_setSecretChatMessageAutoremoveTimeoutInteractively(transaction: T
}
func _internal_addSecretChatMessageScreenshot(account: Account, peerId: PeerId) -> Signal<Void, NoError> {
// MISC: Bypass screenshot notifications in secret chats when enabled
if MiscSettingsManager.shared.shouldBypassScreenshotProtection {
return .complete()
}
return account.postbox.transaction { transaction -> Void in
if let _ = transaction.getPeer(peerId) as? TelegramSecretChat, let state = transaction.getPeerChatState(peerId) as? SecretChatState {
switch state.embeddedState {
@@ -17,7 +17,8 @@ func updateSecretChat(encryptionProvider: EncryptionProvider, accountPeerId: Pee
let settings = transaction.getPreferencesEntry(key: PreferencesKeys.secretChatSettings)?.get(SecretChatSettings.self) ?? SecretChatSettings.defaultSettings
assert((currentPeer == nil) == (currentState == nil))
switch chat {
case let .encryptedChat(_, _, _, adminId, _, gAOrB, _):
case let .encryptedChat(encryptedChatData):
let (adminId, gAOrB) = (encryptedChatData.adminId, encryptedChatData.gAOrB)
if let currentPeer = currentPeer, let currentState = currentState, adminId == accountPeerId.id._internalGetInt64Value() {
if case let .handshake(handshakeState) = currentState.embeddedState, case let .requested(_, p, a) = handshakeState {
let pData = p.makeData()
@@ -67,7 +68,8 @@ func updateSecretChat(encryptionProvider: EncryptionProvider, accountPeerId: Pee
} else {
Logger.shared.log("State", "got encryptedChat, but peer or state don't exist or account is not creator")
}
case let .encryptedChatDiscarded(flags, _):
case let .encryptedChatDiscarded(encryptedChatDiscardedData):
let flags = encryptedChatDiscardedData.flags
if let currentPeer = currentPeer, let currentState = currentState {
let isRemoved = (flags & (1 << 0)) != 0
@@ -86,9 +88,10 @@ func updateSecretChat(encryptionProvider: EncryptionProvider, accountPeerId: Pee
} else {
Logger.shared.log("State", "got encryptedChatDiscarded, but peer doesn't exist")
}
case .encryptedChatEmpty(_):
case .encryptedChatEmpty:
break
case let .encryptedChatRequested(_, folderId, _, accessHash, date, adminId, participantId, gA):
case let .encryptedChatRequested(encryptedChatRequestedData):
let (folderId, accessHash, date, adminId, participantId, gA) = (encryptedChatRequestedData.folderId, encryptedChatRequestedData.accessHash, encryptedChatRequestedData.date, encryptedChatRequestedData.adminId, encryptedChatRequestedData.participantId, encryptedChatRequestedData.gA)
if currentPeer == nil && participantId == accountPeerId.id._internalGetInt64Value() {
if settings.acceptOnThisDevice {
let state = SecretChatState(role: .participant, embeddedState: .handshake(.accepting), keychain: SecretChatKeychain(keys: []), keyFingerprint: nil, messageAutoremoveTimeout: nil)
@@ -122,7 +125,8 @@ func updateSecretChat(encryptionProvider: EncryptionProvider, accountPeerId: Pee
} else {
Logger.shared.log("State", "got encryptedChatRequested, but peer already exists or this account is creator")
}
case let .encryptedChatWaiting(_, accessHash, date, adminId, participantId):
case let .encryptedChatWaiting(encryptedChatWaitingData):
let (accessHash, date, adminId, participantId) = (encryptedChatWaitingData.accessHash, encryptedChatWaitingData.date, encryptedChatWaitingData.adminId, encryptedChatWaitingData.participantId)
if let requestData = requestData, currentPeer == nil && adminId == accountPeerId.id._internalGetInt64Value() {
let state = SecretChatState(role: .creator, embeddedState: .handshake(.requested(g: requestData.g, p: requestData.p, a: requestData.a)), keychain: SecretChatKeychain(keys: []), keyFingerprint: nil, messageAutoremoveTimeout: nil)
let peer = TelegramSecretChat(id: chat.peerId, creationDate: date, regularPeerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(participantId)), accessHash: accessHash, role: state.role, embeddedState: state.embeddedState.peerState, messageAutoremoveTimeout: nil)