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
@@ -121,7 +121,8 @@ public class UnauthorizedAccount {
switch sentCode {
case .sentCodePaymentRequired:
break
case let .sentCode(_, type, phoneCodeHash, nextType, codeTimeout):
case let .sentCode(sentCodeData):
let (type, phoneCodeHash, nextType, codeTimeout) = (sentCodeData.type, sentCodeData.phoneCodeHash, sentCodeData.nextType, sentCodeData.timeout)
let _ = postbox.transaction({ transaction in
var parsedNextType: AuthorizationCodeNextType?
if let nextType = nextType {
@@ -131,20 +132,22 @@ public class UnauthorizedAccount {
transaction.setState(UnauthorizedAccountState(isTestingEnvironment: testingEnvironment, masterDatacenterId: masterDatacenterId, contents: .confirmationCodeEntry(number: phoneNumber, type: SentAuthorizationCodeType(apiType: type), hash: phoneCodeHash, timeout: codeTimeout, nextType: parsedNextType, syncContacts: syncContacts, previousCodeEntry: nil, usePrevious: false)))
}
}).start()
case let .sentCodeSuccess(authorization):
case let .sentCodeSuccess(sentCodeSuccessData):
let authorization = sentCodeSuccessData.authorization
switch authorization {
case let .authorization(_, _, _, futureAuthToken, user):
case let .authorization(authorizationData):
let (futureAuthToken, apiUser) = (authorizationData.futureAuthToken, authorizationData.user)
let _ = postbox.transaction({ [weak self] transaction in
var syncContacts = true
if let state = transaction.getState() as? UnauthorizedAccountState, case let .payment(_, _, _, _, _, syncContactsValue) = state.contents {
syncContacts = syncContactsValue
}
if let futureAuthToken = futureAuthToken {
storeFutureLoginToken(accountManager: accountManager, token: futureAuthToken.makeData())
}
let user = TelegramUser(user: user)
let user = TelegramUser(user: apiUser)
var isSupportUser = false
if let phone = user.phone, phone.hasPrefix("42"), phone.count <= 5 {
isSupportUser = true
@@ -159,7 +162,8 @@ public class UnauthorizedAccount {
return .loggedIn
}
}).start()
case let .authorizationSignUpRequired(_, termsOfService):
case let .authorizationSignUpRequired(authorizationSignUpRequiredData):
let termsOfService = authorizationSignUpRequiredData.termsOfService
let _ = postbox.transaction({ [weak self] transaction in
if let self {
if let state = transaction.getState() as? UnauthorizedAccountState, case let .payment(number, codeHash, _, _, _, syncContacts) = state.contents {
@@ -364,7 +368,8 @@ public enum TwoStepPasswordDerivation {
switch apiAlgo {
case .passwordKdfAlgoUnknown:
self = .unknown
case let .passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(salt1, salt2, g, p):
case let .passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPowData):
let (salt1, salt2, g, p) = (passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPowData.salt1, passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPowData.salt2, passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPowData.g, passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPowData.p)
self = .sha256_sha256_PBKDF2_HMAC_sha512_sha256_srp(salt1: salt1.makeData(), salt2: salt2.makeData(), iterations: 100000, g: g, p: p.makeData())
}
}
@@ -375,7 +380,7 @@ public enum TwoStepPasswordDerivation {
return .passwordKdfAlgoUnknown
case let .sha256_sha256_PBKDF2_HMAC_sha512_sha256_srp(salt1, salt2, iterations, g, p):
precondition(iterations == 100000)
return .passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(salt1: Buffer(data: salt1), salt2: Buffer(data: salt2), g: g, p: Buffer(data: p))
return .passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(.init(salt1: Buffer(data: salt1), salt2: Buffer(data: salt2), g: g, p: Buffer(data: p)))
}
}
}
@@ -389,9 +394,11 @@ public enum TwoStepSecurePasswordDerivation {
switch apiAlgo {
case .securePasswordKdfAlgoUnknown:
self = .unknown
case let .securePasswordKdfAlgoPBKDF2HMACSHA512iter100000(salt):
case let .securePasswordKdfAlgoPBKDF2HMACSHA512iter100000(securePasswordKdfAlgoPBKDF2HMACSHA512iter100000Data):
let (salt) = (securePasswordKdfAlgoPBKDF2HMACSHA512iter100000Data.salt)
self = .PBKDF2_HMAC_sha512(salt: salt.makeData(), iterations: 100000)
case let .securePasswordKdfAlgoSHA512(salt):
case let .securePasswordKdfAlgoSHA512(securePasswordKdfAlgoSHA512Data):
let (salt) = (securePasswordKdfAlgoSHA512Data.salt)
self = .sha512(salt: salt.makeData())
}
}
@@ -402,9 +409,9 @@ public enum TwoStepSecurePasswordDerivation {
return .securePasswordKdfAlgoUnknown
case let .PBKDF2_HMAC_sha512(salt, iterations):
precondition(iterations == 100000)
return .securePasswordKdfAlgoPBKDF2HMACSHA512iter100000(salt: Buffer(data: salt))
return .securePasswordKdfAlgoPBKDF2HMACSHA512iter100000(.init(salt: Buffer(data: salt)))
case let .sha512(salt):
return .securePasswordKdfAlgoSHA512(salt: Buffer(data: salt))
return .securePasswordKdfAlgoSHA512(.init(salt: Buffer(data: salt)))
}
}
}
@@ -432,7 +439,8 @@ func _internal_twoStepAuthData(_ network: Network) -> Signal<TwoStepAuthData, MT
return network.request(Api.functions.account.getPassword())
|> map { config -> TwoStepAuthData in
switch config {
case let .password(flags, currentAlgo, srpB, srpId, hint, emailUnconfirmedPattern, newAlgo, newSecureAlgo, secureRandom, pendingResetDate, loginEmailPattern):
case let .password(passwordData):
let (flags, currentAlgo, srpB, srpId, hint, emailUnconfirmedPattern, newAlgo, newSecureAlgo, secureRandom, pendingResetDate, loginEmailPattern) = (passwordData.flags, passwordData.currentAlgo, passwordData.srpB, passwordData.srpId, passwordData.hint, passwordData.emailUnconfirmedPattern, passwordData.newAlgo, passwordData.newSecureAlgo, passwordData.secureRandom, passwordData.pendingResetDate, passwordData.loginEmailPattern)
let hasRecovery = (flags & (1 << 0)) != 0
let hasSecureValues = (flags & (1 << 1)) != 0
@@ -497,7 +505,8 @@ public final class TelegramPasskey: Equatable {
extension TelegramPasskey {
convenience init(apiPasskey: Api.Passkey) {
switch apiPasskey {
case let .passkey(_, id, name, date, softwareEmojiId, lastUsageDate):
case let .passkey(passkeyData):
let (id, name, date, softwareEmojiId, lastUsageDate) = (passkeyData.id, passkeyData.name, passkeyData.date, passkeyData.softwareEmojiId, passkeyData.lastUsageDate)
self.init(id: id, name: name, date: date, emojiId: softwareEmojiId, lastUsageDate: lastUsageDate)
}
}
@@ -514,7 +523,8 @@ func _internal_passkeysData(network: Network) -> Signal<[TelegramPasskey], NoErr
return []
}
switch passkeys {
case let .passkeys(passkeys):
case let .passkeys(passkeysData):
let passkeys = passkeysData.passkeys
return passkeys.map { passkey in
return TelegramPasskey(apiPasskey: passkey)
}
@@ -533,9 +543,11 @@ func _internal_requestPasskeyRegistration(network: Network) -> Signal<String?, N
return nil
}
switch options {
case let .passkeyRegistrationOptions(options):
case let .passkeyRegistrationOptions(passkeyRegistrationOptionsData):
let options = passkeyRegistrationOptionsData.options
switch options {
case let .dataJSON(data):
case let .dataJSON(dataJSONData):
let data = dataJSONData.data
return data
}
}
@@ -543,7 +555,7 @@ func _internal_requestPasskeyRegistration(network: Network) -> Signal<String?, N
}
func _internal_requestCreatePasskey(network: Network, id: String, clientData: String, attestationObject: Data) -> Signal<TelegramPasskey?, NoError> {
return network.request(Api.functions.account.registerPasskey(credential: .inputPasskeyCredentialPublicKey(id: id, rawId: id, response: .inputPasskeyResponseRegister(clientData: .dataJSON(data: clientData), attestationData: Buffer(data: attestationObject)))))
return network.request(Api.functions.account.registerPasskey(credential: .inputPasskeyCredentialPublicKey(.init(id: id, rawId: id, response: .inputPasskeyResponseRegister(.init(clientData: .dataJSON(.init(data: clientData)), attestationData: Buffer(data: attestationObject)))))))
|> map(Optional.init)
|> `catch` { _ -> Signal<Api.Passkey?, NoError> in
return .single(nil)
@@ -575,9 +587,11 @@ func _internal_requestPasskeyLoginData(network: Network, apiId: Int32, apiHash:
return nil
}
switch result {
case let .passkeyLoginOptions(options):
case let .passkeyLoginOptions(passkeyLoginOptionsData):
let options = passkeyLoginOptionsData.options
switch options {
case let .dataJSON(data):
case let .dataJSON(dataJSONData):
let data = dataJSONData.data
return data
}
}
@@ -864,7 +878,7 @@ func verifyPassword(_ account: UnauthorizedAccount, password: String) -> Signal<
let kdfResult = passwordKDF(encryptionProvider: account.network.encryptionProvider, password: password, derivation: currentPasswordDerivation, srpSessionData: srpSessionData)
if let kdfResult = kdfResult {
return account.network.request(Api.functions.auth.checkPassword(password: .inputCheckPasswordSRP(srpId: kdfResult.id, A: Buffer(data: kdfResult.A), M1: Buffer(data: kdfResult.M1))), automaticFloodWait: false)
return account.network.request(Api.functions.auth.checkPassword(password: .inputCheckPasswordSRP(.init(srpId: kdfResult.id, A: Buffer(data: kdfResult.A), M1: Buffer(data: kdfResult.M1)))), automaticFloodWait: false)
} else {
return .fail(MTRpcError(errorCode: 400, errorDescription: "KDF_ERROR"))
}
@@ -1523,7 +1537,7 @@ public class Account {
return .complete()
} else {
return network.request(Api.functions.help.saveAppLog(events: events.map { event -> Api.InputAppEvent in
return .inputAppEvent(time: event.0, type: "", peer: 0, data: .jsonString(value: event.1))
return .inputAppEvent(.init(time: event.0, type: "", peer: 0, data: .jsonString(.init(value: event.1))))
}))
|> ignoreValues
|> `catch` { _ -> Signal<Never, NoError> in
@@ -508,7 +508,8 @@ struct AccountMutableState {
for chat in chats {
switch chat {
case let .channel(_, _, _, _, _, _, _, _, _, _, _, _, participantsCount, _, _, _, _, _, _, _, _, _, _):
case let .channel(channelData):
let participantsCount = channelData.participantsCount
if let participantsCount = participantsCount {
self.addOperation(.UpdateCachedPeerData(chat.peerId, { current in
var previous: CachedChannelData
@@ -572,7 +573,8 @@ struct AccountMutableState {
var presences: [PeerId: Api.UserStatus] = [:]
for user in users {
switch user {
case let .user(_, _, id, _, _, _, _, _, _, status, _, _, _, _, _, _, _, _, _, _, _, _):
case let .user(userData):
let (id, status) = (userData.id, userData.status)
if let status = status {
presences[PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))] = status
}
@@ -215,6 +215,8 @@ private var declaredEncodables: Void = {
declareEncodable(AuthSessionInfoAttribute.self, f: { AuthSessionInfoAttribute(decoder: $0) })
declareEncodable(TranslationMessageAttribute.self, f: { TranslationMessageAttribute(decoder: $0) })
declareEncodable(TranslationMessageAttribute.Additional.self, f: { TranslationMessageAttribute.Additional(decoder: $0) })
// MARK: Swiftgram
declareEncodable(QuickTranslationMessageAttribute.self, f: { QuickTranslationMessageAttribute(decoder: $0) })
declareEncodable(SynchronizeAutosaveItemOperation.self, f: { SynchronizeAutosaveItemOperation(decoder: $0) })
declareEncodable(TelegramMediaStory.self, f: { TelegramMediaStory(decoder: $0) })
declareEncodable(SynchronizeViewStoriesOperation.self, f: { SynchronizeViewStoriesOperation(decoder: $0) })
@@ -502,7 +504,8 @@ private func cleanupAccount(networkArguments: NetworkInitializationArguments, ac
}
|> mapToSignal { result -> Signal<Void, NoError> in
switch result {
case let .loggedOut(_, futureAuthToken):
case let .loggedOut(loggedOutData):
let futureAuthToken = loggedOutData.futureAuthToken
if let futureAuthToken = futureAuthToken {
storeFutureLoginToken(accountManager: accountManager, token: futureAuthToken.makeData())
}