Remove deprecated MTInputStream methods

This commit is contained in:
isaac 2026-04-21 21:10:33 +04:00
parent 2516f0005d
commit 4464802051
13 changed files with 149 additions and 245 deletions

View file

@ -4,11 +4,8 @@
@interface NSInputStream (TL)
- (int32_t)readInt32;
- (int32_t)readInt32:(bool *)failed __attribute__((nonnull(1)));
- (int64_t)readInt64;
- (int64_t)readInt64:(bool *)failed __attribute__((nonnull(1)));
- (double)readDouble;
- (double)readDouble:(bool *)failed __attribute__((nonnull(1)));
- (NSData *)readData:(int)length;
- (NSData *)readData:(int)length failed:(bool *)failed __attribute__((nonnull(2)));

View file

@ -22,27 +22,6 @@ static inline int roundUpInput(int numToRound, int multiple)
@implementation NSInputStream (TL)
- (int32_t)readInt32
{
int32_t value = 0;
if ([self read:(uint8_t *)&value maxLength:4] != 4)
{
TGLegacyLog(@"***** Couldn't read int32");
@throw [[NSException alloc] initWithName:@"NSInputStream+TLException" reason:@"readInt32 end of stream" userInfo:@{}];
}
#if __BYTE_ORDER == __LITTLE_ENDIAN
#elif __BYTE_ORDER == __BIG_ENDIAN
# error "Big endian is not implemented"
#else
# error "Unknown byte order"
#endif
return value;
}
- (int32_t)readInt32:(bool *)failed
{
int32_t value = 0;

View file

@ -34,8 +34,15 @@
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t length = [is readInt32];
NSData *data = [is readData:length];
bool readingError = false;
int32_t length = [is readInt32:&readingError];
if (readingError) {
return nil;
}
NSData *data = [is readData:length failed:&readingError];
if (readingError) {
return nil;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"

View file

@ -36,8 +36,15 @@
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t length = [is readInt32];
NSData *data = [is readData:length];
bool readingError = false;
int32_t length = [is readInt32:&readingError];
if (readingError) {
return nil;
}
NSData *data = [is readData:length failed:&readingError];
if (readingError) {
return nil;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return [NSKeyedUnarchiver unarchiveObjectWithData:data];

View file

@ -48,8 +48,15 @@
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t length = [is readInt32];
NSData *data = [is readData:length];
bool readingError = false;
int32_t length = [is readInt32:&readingError];
if (readingError) {
return nil;
}
NSData *data = [is readData:length failed:&readingError];
if (readingError) {
return nil;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return [NSKeyedUnarchiver unarchiveObjectWithData:data];

View file

@ -87,8 +87,15 @@
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t length = [is readInt32];
NSData *data = [is readData:length];
bool readingError = false;
int32_t length = [is readInt32:&readingError];
if (readingError) {
return nil;
}
NSData *data = [is readData:length failed:&readingError];
if (readingError) {
return nil;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return [NSKeyedUnarchiver unarchiveObjectWithData:data];

View file

@ -54,8 +54,15 @@
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t length = [is readInt32];
NSData *data = [is readData:length];
bool readingError = false;
int32_t length = [is readInt32:&readingError];
if (readingError) {
return nil;
}
NSData *data = [is readData:length failed:&readingError];
if (readingError) {
return nil;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return [NSKeyedUnarchiver unarchiveObjectWithData:data];

View file

@ -64,8 +64,15 @@
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t length = [is readInt32];
NSData *data = [is readData:length];
bool readingError = false;
int32_t length = [is readInt32:&readingError];
if (readingError) {
return nil;
}
NSData *data = [is readData:length failed:&readingError];
if (readingError) {
return nil;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return [NSKeyedUnarchiver unarchiveObjectWithData:data];

View file

@ -36,8 +36,15 @@
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t length = [is readInt32];
NSData *data = [is readData:length];
bool readingError = false;
int32_t length = [is readInt32:&readingError];
if (readingError) {
return nil;
}
NSData *data = [is readData:length failed:&readingError];
if (readingError) {
return nil;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return [NSKeyedUnarchiver unarchiveObjectWithData:data];

View file

@ -157,8 +157,15 @@
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t length = [is readInt32];
NSData *data = [is readData:length];
bool readingError = false;
int32_t length = [is readInt32:&readingError];
if (readingError) {
return nil;
}
NSData *data = [is readData:length failed:&readingError];
if (readingError) {
return nil;
}
@try {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"

View file

@ -9,17 +9,12 @@
- (int32_t)readInt32;
- (int32_t)readInt32:(bool *)failed __attribute__((nonnull(1)));
- (int64_t)readInt64;
- (int64_t)readInt64:(bool *)failed __attribute__((nonnull(1)));
- (double)readDouble;
- (double)readDouble:(bool *)failed __attribute__((nonnull(1)));
- (NSData *)readData:(int)length;
- (NSData *)readData:(int)length failed:(bool *)failed __attribute__((nonnull(2)));
- (NSMutableData *)readMutableData:(NSUInteger)length;
- (NSMutableData *)readMutableData:(NSUInteger)length failed:(bool *)failed __attribute__((nonnull(2)));
- (NSString *)readString;
- (NSString *)readString:(bool *)failed __attribute__((nonnull(1)));
- (NSData *)readBytes;
- (NSData *)readBytes:(bool *)failed __attribute__((nonnull(1)));
@end

View file

@ -96,27 +96,6 @@ static inline int roundUpInput(int numToRound, int multiple)
return value;
}
- (int64_t)readInt64
{
int64_t value = 0;
if ([_wrappedInputStream read:(uint8_t *)&value maxLength:8] != 8)
{
if (MTLogEnabled()) {
MTLog(@"***** Couldn't read int64");
}
}
#if __BYTE_ORDER == __LITTLE_ENDIAN
#elif __BYTE_ORDER == __BIG_ENDIAN
# error "Big endian is not implemented"
#else
# error "Unknown byte order"
#endif
return value;
}
- (int64_t)readInt64:(bool *)failed
{
int64_t value = 0;
@ -178,20 +157,6 @@ static inline int roundUpInput(int numToRound, int multiple)
return value;
}
- (NSData *)readData:(int)length
{
uint8_t *bytes = (uint8_t *)malloc(length);
NSInteger readLen = [_wrappedInputStream read:bytes maxLength:length];
if (readLen != length)
{
if (MTLogEnabled()) {
MTLog(@"***** Couldn't read %d bytes", length);
}
}
NSData *data = [[NSData alloc] initWithBytesNoCopy:bytes length:length freeWhenDone:true];
return data;
}
- (NSData *)readData:(int)length failed:(bool *)failed
{
uint8_t *bytes = (uint8_t *)malloc(length);
@ -206,20 +171,6 @@ static inline int roundUpInput(int numToRound, int multiple)
return data;
}
- (NSMutableData *)readMutableData:(NSUInteger)length
{
uint8_t *bytes = (uint8_t *)malloc(length);
NSInteger readLen = [_wrappedInputStream read:bytes maxLength:length];
if (readLen != length)
{
if (MTLogEnabled()) {
MTLog(@"***** Couldn't read %d bytes", length);
}
}
NSMutableData *data = [[NSMutableData alloc] initWithBytesNoCopy:bytes length:length freeWhenDone:true];
return data;
}
- (NSMutableData *)readMutableData:(NSUInteger)length failed:(bool *)failed
{
uint8_t *bytes = (uint8_t *)malloc(length);
@ -234,60 +185,6 @@ static inline int roundUpInput(int numToRound, int multiple)
return data;
}
- (NSString *)readString
{
uint8_t tmp = 0;
[_wrappedInputStream read:&tmp maxLength:1];
int paddingBytes = 0;
int32_t length = tmp;
if (length == 254)
{
length = 0;
[_wrappedInputStream read:((uint8_t *)&length) + 1 maxLength:3];
length >>= 8;
#if __BYTE_ORDER == __LITTLE_ENDIAN
#elif __BYTE_ORDER == __BIG_ENDIAN
# error "Big endian is not implemented"
#else
# error "Unknown byte order"
#endif
paddingBytes = roundUpInput(length, 4) - length;
}
else
{
paddingBytes = roundUpInput(length + 1, 4) - (length + 1);
}
NSString *string = nil;
if (length > 0)
{
uint8_t *bytes = (uint8_t *)malloc(length);
NSInteger readLen = [_wrappedInputStream read:bytes maxLength:length];
if (readLen != length)
{
if (MTLogEnabled()) {
MTLog(@"***** Couldn't read %d bytes", length);
}
}
string = [[NSString alloc] initWithBytesNoCopy:bytes length:length encoding:NSUTF8StringEncoding freeWhenDone:true];
}
else
{
string = @"";
}
for (int i = 0; i < paddingBytes; i++)
[_wrappedInputStream read:&tmp maxLength:1];
return string;
}
- (NSString *)readString:(bool *)failed
{
uint8_t tmp = 0;
@ -342,44 +239,6 @@ static inline int roundUpInput(int numToRound, int multiple)
return string;
}
- (NSData *)readBytes
{
uint8_t tmp = 0;
[_wrappedInputStream read:&tmp maxLength:1];
int paddingBytes = 0;
int32_t length = tmp;
if (length == 254)
{
length = 0;
[_wrappedInputStream read:((uint8_t *)&length) + 1 maxLength:3];
length >>= 8;
paddingBytes = roundUpInput(length, 4) - length;
}
else
{
paddingBytes = roundUpInput(length + 1, 4) - (length + 1);
}
uint8_t *bytes = (uint8_t *)malloc(length);
NSInteger readLen = [_wrappedInputStream read:bytes maxLength:length];
if (readLen != length)
{
if (MTLogEnabled()) {
MTLog(@"***** Couldn't read %d bytes", length);
}
}
NSData *result = [NSData dataWithBytesNoCopy:bytes length:length freeWhenDone:true];
for (int i = 0; i < paddingBytes; i++)
[_wrappedInputStream read:&tmp maxLength:1];
return result;
}
- (NSData *)readBytes:(bool *)failed
{
uint8_t tmp = 0;

View file

@ -1800,17 +1800,30 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
MTInputStream *is = [[MTInputStream alloc] initWithData:data];
int64_t keyId = [is readInt64];
bool readingError = false;
int64_t keyId = [is readInt64:&readingError];
if (readingError) {
return;
}
if (keyId == authKey.authKeyId)
{
NSData *messageKey = [is readData:16];
NSData *messageKey = [is readData:16 failed:&readingError];
if (readingError) {
return;
}
MTMessageEncryptionKey *encryptionKey = [MTMessageEncryptionKey messageEncryptionKeyV2ForAuthKey:effectiveAuthKey.authKey messageKey:messageKey toClient:true];
if (data.length <= 24) {
return;
}
NSMutableData *encryptedMessageData = [is readMutableData:(data.length - 24)];
NSMutableData *encryptedMessageData = [is readMutableData:(data.length - 24) failed:&readingError];
if (readingError) {
return;
}
while (encryptedMessageData.length % 16 != 0) {
[encryptedMessageData setLength:encryptedMessageData.length - 1];
}
@ -1819,47 +1832,36 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
NSData *decryptedData = MTAesDecrypt(encryptedMessageData, encryptionKey.key, encryptionKey.iv);
MTInputStream *messageIs = [[MTInputStream alloc] initWithData:decryptedData];
[messageIs readInt64];
[messageIs readInt64];
[messageIs readInt64];
[messageIs readInt32];
[messageIs readInt32];
bool stop = false;
if (!stop) {
[messageIs readInt64:&stop];
}
if (!stop) {
[messageIs readInt64:&stop];
}
if (!stop) {
[messageIs readInt64:&stop];
}
if (!stop) {
[messageIs readInt32:&stop];
}
if (!stop) {
[messageIs readInt32:&stop];
}
int64_t reqMsgId = 0;
/*if (true)
{*/
while (!stop && reqMsgId == 0)
{
int32_t signature = [messageIs readInt32:&stop];
while (!stop && reqMsgId == 0) {
int32_t signature = [messageIs readInt32:&stop];
if (!stop) {
[self findReqMsgId:messageIs signature:signature reqMsgId:&reqMsgId failed:&stop];
}
/*}
else
{
int32_t signature = [messageIs readInt32];
if (signature == (int)0xf35c6d01)
reqMsgId = [messageIs readInt64];
else if (signature == (int)0x73f1f8dc)
{
int count = [messageIs readInt32];
if (count != 0)
{
[messageIs readInt64];
[messageIs readInt32];
[messageIs readInt32];
signature = [messageIs readInt32];
if (signature == (int)0xf35c6d01)
reqMsgId = [messageIs readInt64];
}
}
}*/
}
if (reqMsgId != 0)
if (reqMsgId != 0) {
completion(token, @(reqMsgId));
}
}
}
}];
@ -2306,38 +2308,48 @@ static bool isDataEqualToDataConstTime(NSData *data1, NSData *data2) {
if (_useUnauthorizedMode)
{
int64_t authKeyId = [is readInt64];
bool readingError = false;
int64_t authKeyId = [is readInt64:&readingError];
if (readingError) {
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
if (authKeyId != 0)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
embeddedMessageId = [is readInt64:&readError];
if (readError)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
topMessageSize = [is readInt32:&readError];
if (readError || topMessageSize < 4)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
if (dataMessageId != 0)
if (dataMessageId != 0) {
*dataMessageId = embeddedMessageId;
}
}
else
{
embeddedSalt = [is readInt64:&readError];
if (readError)
{
if (readError) {
if (parseError != NULL)
*parseError = true;
return nil;
@ -2346,39 +2358,44 @@ static bool isDataEqualToDataConstTime(NSData *data1, NSData *data2) {
embeddedSessionId = [is readInt64:&readError];
if (readError)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
if (embeddedSessionId != _sessionInfo.sessionId)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
embeddedMessageId = [is readInt64:&readError];
if (readError)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
embeddedSeqNo = [is readInt32:&readError];
if (readError)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
[is readInt32:&readError];
if (readError)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
}
@ -2388,31 +2405,33 @@ static bool isDataEqualToDataConstTime(NSData *data1, NSData *data2) {
while (true)
{
NSInteger readBytes = [[is wrappedInputStream] read:buffer maxLength:128];
if (readBytes <= 0)
if (readBytes <= 0) {
break;
}
[topMessageData appendBytes:buffer length:readBytes];
}
id topObject = [self parseMessage:topMessageData];
if (topObject == nil)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
NSMutableArray *messages = [[NSMutableArray alloc] init];
NSTimeInterval timestamp = embeddedMessageId / 4294967296.0;
if ([topObject isKindOfClass:[MTMsgContainerMessage class]])
{
if ([topObject isKindOfClass:[MTMsgContainerMessage class]]) {
for (MTMessage *subMessage in ((MTMsgContainerMessage *)topObject).messages)
{
id subObject = [self parseMessage:subMessage.data];
if (subObject == nil)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
@ -2421,15 +2440,14 @@ static bool isDataEqualToDataConstTime(NSData *data1, NSData *data2) {
int32_t subMessageLength = (int32_t)subMessage.data.length;
[messages addObject:[[MTIncomingMessage alloc] initWithMessageId:subMessageId seqNo:subMessageSeqNo authKeyId:embeddedAuthKeyId sessionId:embeddedSessionId salt:embeddedSalt timestamp:timestamp size:subMessageLength body:subObject]];
}
}
else if ([topObject isKindOfClass:[MTMessage class]])
{
} else if ([topObject isKindOfClass:[MTMessage class]]) {
MTMessage *message = topObject;
id subObject = [self parseMessage:message.data];
if (subObject == nil)
{
if (parseError != NULL)
if (parseError != NULL) {
*parseError = true;
}
return nil;
}
@ -2437,9 +2455,9 @@ static bool isDataEqualToDataConstTime(NSData *data1, NSData *data2) {
int32_t subMessageSeqNo = message.seqNo;
int32_t subMessageLength = (int32_t)message.data.length;
[messages addObject:[[MTIncomingMessage alloc] initWithMessageId:subMessageId seqNo:subMessageSeqNo authKeyId:embeddedAuthKeyId sessionId:embeddedSessionId salt:embeddedSalt timestamp:timestamp size:subMessageLength body:subObject]];
}
else
} else {
[messages addObject:[[MTIncomingMessage alloc] initWithMessageId:embeddedMessageId seqNo:embeddedSeqNo authKeyId:embeddedAuthKeyId sessionId:embeddedSessionId salt:embeddedSalt timestamp:timestamp size:topMessageSize body:topObject]];
}
return messages;
}