diff --git a/MTBackupAddressSignals.m b/MTBackupAddressSignals.m index e27344d358..f0b1732783 100644 --- a/MTBackupAddressSignals.m +++ b/MTBackupAddressSignals.m @@ -162,7 +162,7 @@ static NSData *base64_decode(NSString *str) { NSData *getConfigData = nil; MTRequestDatacenterAddressListParser responseParser = [currentContext.serialization requestDatacenterAddressWithData:&getConfigData]; - [request setPayload:getConfigData metadata:@"getConfig" responseParser:responseParser]; + [request setPayload:getConfigData metadata:@"getConfig" shortMetadata:@"getConfig" responseParser:responseParser]; __weak MTContext *weakCurrentContext = currentContext; return [[MTSignal alloc] initWithGenerator:^id(MTSubscriber *subscriber) { diff --git a/MTGzip.h b/MTGzip.h new file mode 100644 index 0000000000..3c255592ba --- /dev/null +++ b/MTGzip.h @@ -0,0 +1,11 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MTGzip : NSObject + ++ (NSData * _Nullable)decompress:(NSData *)data; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MTGzip.m b/MTGzip.m new file mode 100644 index 0000000000..34737816fa --- /dev/null +++ b/MTGzip.m @@ -0,0 +1,53 @@ +#import "MTGzip.h" + +#import + +@implementation MTGzip + ++ (NSData * _Nullable)decompress:(NSData *)data { + const int kMemoryChunkSize = 1024; + + NSUInteger length = [data length]; + int windowBits = 15 + 32; //Default + gzip header instead of zlib header + int retCode; + unsigned char output[kMemoryChunkSize]; + uInt gotBack; + NSMutableData *result; + z_stream stream; + + if ((length == 0) || (length > UINT_MAX)) //FIXME: Support 64 bit inputs + return nil; + + bzero(&stream, sizeof(z_stream)); + stream.avail_in = (uInt)length; + stream.next_in = (unsigned char*)[data bytes]; + + retCode = inflateInit2(&stream, windowBits); + if(retCode != Z_OK) + { + NSLog(@"%s: inflateInit2() failed with error %i", __PRETTY_FUNCTION__, retCode); + return nil; + } + + result = [NSMutableData dataWithCapacity:(length * 4)]; + do + { + stream.avail_out = kMemoryChunkSize; + stream.next_out = output; + retCode = inflate(&stream, Z_NO_FLUSH); + if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) + { + NSLog(@"%s: inflate() failed with error %i", __PRETTY_FUNCTION__, retCode); + inflateEnd(&stream); + return nil; + } + gotBack = kMemoryChunkSize - stream.avail_out; + if (gotBack > 0) + [result appendBytes:output length:gotBack]; + } while( retCode == Z_OK); + inflateEnd(&stream); + + return (retCode == Z_STREAM_END ? result : nil); +} + +@end diff --git a/MTProtoKit/MTDatacenterAuthMessageService.m b/MTProtoKit/MTDatacenterAuthMessageService.m index bdd432ff2b..9250845c65 100644 --- a/MTProtoKit/MTDatacenterAuthMessageService.m +++ b/MTProtoKit/MTDatacenterAuthMessageService.m @@ -240,7 +240,8 @@ typedef enum { [reqPqBuffer appendInt32:(int32_t)0x60469778]; [reqPqBuffer appendBytes:_nonce.bytes length:_nonce.length]; - MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqPqBuffer.data metadata:[NSString stringWithFormat:@"reqPq nonce:%@", _nonce] messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo]; + NSString *messageDescription = [NSString stringWithFormat:@"reqPq nonce:%@", _nonce]; + MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqPqBuffer.data metadata:messageDescription shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo]; return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId) { if (_stage == MTDatacenterAuthStagePQ && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil) @@ -263,7 +264,8 @@ typedef enum { [reqDhBuffer appendInt64:_dhPublicKeyFingerprint]; [reqDhBuffer appendTLBytes:_dhEncryptedData]; - MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqDhBuffer.data metadata:[NSString stringWithFormat:@"reqDh nonce:%@ serverNonce:%@ p:%@ q:%@ fingerprint:%llx", _nonce, _serverNonce, _dhP, _dhQ, _dhPublicKeyFingerprint] messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo]; + NSString *messageDescription = [NSString stringWithFormat:@"reqDh nonce:%@ serverNonce:%@ p:%@ q:%@ fingerprint:%llx", _nonce, _serverNonce, _dhP, _dhQ, _dhPublicKeyFingerprint]; + MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqDhBuffer.data metadata:messageDescription shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo]; return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId) { if (_stage == MTDatacenterAuthStageReqDH && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil) @@ -283,7 +285,7 @@ typedef enum { [setDhParamsBuffer appendBytes:_serverNonce.bytes length:_serverNonce.length]; [setDhParamsBuffer appendTLBytes:_encryptedClientData]; - MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:setDhParamsBuffer.data metadata:@"setDhParams" messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo]; + MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:setDhParamsBuffer.data metadata:@"setDhParams" shortMetadata:@"setDhParams" messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo]; return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId) { if (_stage == MTDatacenterAuthStageKeyVerification && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil) diff --git a/MTProtoKit/MTDatacenterTransferAuthAction.m b/MTProtoKit/MTDatacenterTransferAuthAction.m index db6e5af188..a650c2f752 100644 --- a/MTProtoKit/MTDatacenterTransferAuthAction.m +++ b/MTProtoKit/MTDatacenterTransferAuthAction.m @@ -96,7 +96,7 @@ NSData *exportAuthRequestData = nil; MTExportAuthorizationResponseParser responseParser = [[context.serialization exportAuthorization:(int32_t)_destinationDatacenterId data:&exportAuthRequestData] copy]; - [request setPayload:exportAuthRequestData metadata:@"exportAuthorization" responseParser:responseParser]; + [request setPayload:exportAuthRequestData metadata:@"exportAuthorization" shortMetadata:@"exportAuthorization" responseParser:responseParser]; __weak MTDatacenterTransferAuthAction *weakSelf = self; [request setCompleted:^(MTExportedAuthorizationData *result, __unused NSTimeInterval timestamp, id error) @@ -133,7 +133,7 @@ NSData *importAuthRequestData = [_context.serialization importAuthorization:dataId bytes:authData]; - [request setPayload:importAuthRequestData metadata:@"importAuthorization" responseParser:^id (NSData *data) + [request setPayload:importAuthRequestData metadata:@"importAuthorization" shortMetadata:@"importAuthorization" responseParser:^id (NSData *data) { return @true; }]; diff --git a/MTProtoKit/MTDiscoverDatacenterAddressAction.m b/MTProtoKit/MTDiscoverDatacenterAddressAction.m index f814760350..f22abb1502 100644 --- a/MTProtoKit/MTDiscoverDatacenterAddressAction.m +++ b/MTProtoKit/MTDiscoverDatacenterAddressAction.m @@ -103,7 +103,7 @@ NSData *getConfigData = nil; MTRequestDatacenterAddressListParser responseParser = [_context.serialization requestDatacenterAddressWithData:&getConfigData]; - [request setPayload:getConfigData metadata:@"getConfig" responseParser:responseParser]; + [request setPayload:getConfigData metadata:@"getConfig" shortMetadata:@"getConfig" responseParser:responseParser]; __weak MTDiscoverDatacenterAddressAction *weakSelf = self; [request setCompleted:^(MTDatacenterAddressListData *result, __unused NSTimeInterval completionTimestamp, id error) diff --git a/MTProtoKit/MTLogging.h b/MTProtoKit/MTLogging.h index c5f61f82b7..bf31305149 100644 --- a/MTProtoKit/MTLogging.h +++ b/MTProtoKit/MTLogging.h @@ -11,7 +11,9 @@ extern "C" { bool MTLogEnabled(); void MTLog(NSString *format, ...); +void MTShortLog(NSString *format, ...); void MTLogSetLoggingFunction(void (*function)(NSString *, va_list args)); +void MTLogSetShortLoggingFunction(void (*function)(NSString *, va_list args)); void MTLogSetEnabled(bool); #ifdef __cplusplus diff --git a/MTProtoKit/MTLogging.m b/MTProtoKit/MTLogging.m index 415a3281f0..18429455a4 100644 --- a/MTProtoKit/MTLogging.m +++ b/MTProtoKit/MTLogging.m @@ -3,6 +3,7 @@ #import "MTLogging.h" static void (*loggingFunction)(NSString *, va_list args) = NULL; +static void (*shortLoggingFunction)(NSString *, va_list args) = NULL; static bool MTLogEnabledValue = true; bool MTLogEnabled() { @@ -18,10 +19,23 @@ void MTLog(NSString *format, ...) { va_end(L); } +void MTShortLog(NSString *format, ...) { + va_list L; + va_start(L, format); + if (shortLoggingFunction != NULL) { + shortLoggingFunction(format, L); + } + va_end(L); +} + void MTLogSetLoggingFunction(void (*function)(NSString *, va_list args)) { loggingFunction = function; } +void MTLogSetShortLoggingFunction(void (*function)(NSString *, va_list args)) { + shortLoggingFunction = function; +} + void MTLogSetEnabled(bool enabled) { MTLogEnabledValue = enabled; } diff --git a/MTProtoKit/MTOutgoingMessage.h b/MTProtoKit/MTOutgoingMessage.h index a4bf94e894..159d08dc81 100644 --- a/MTProtoKit/MTOutgoingMessage.h +++ b/MTProtoKit/MTOutgoingMessage.h @@ -7,6 +7,7 @@ @property (nonatomic, strong, readonly) id internalId; @property (nonatomic, strong, readonly) NSData *data; @property (nonatomic, strong, readonly) id metadata; +@property (nonatomic, strong, readonly) id shortMetadata; @property (nonatomic, readonly) int64_t messageId; @property (nonatomic, readonly) int32_t messageSeqNo; @property (nonatomic) bool requiresConfirmation; @@ -16,7 +17,7 @@ @property (nonatomic, copy) id (^dynamicDecorator)(NSData *currentData, NSMutableDictionary *messageInternalIdToPreparedMessage); -- (instancetype)initWithData:(NSData *)data metadata:(id)metadata; -- (instancetype)initWithData:(NSData *)data metadata:(id)metadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo; +- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata; +- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo; @end diff --git a/MTProtoKit/MTOutgoingMessage.m b/MTProtoKit/MTOutgoingMessage.m index ab44d65b4a..e1dd14fd3e 100644 --- a/MTProtoKit/MTOutgoingMessage.m +++ b/MTProtoKit/MTOutgoingMessage.m @@ -46,12 +46,12 @@ @implementation MTOutgoingMessage -- (instancetype)initWithData:(NSData *)data metadata:(id)metadata +- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata { - return [self initWithData:data metadata:metadata messageId:0 messageSeqNo:0]; + return [self initWithData:data metadata:metadata shortMetadata:shortMetadata messageId:0 messageSeqNo:0]; } -- (instancetype)initWithData:(NSData *)data metadata:(id)metadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo +- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo { self = [super init]; if (self != nil) @@ -59,6 +59,7 @@ _internalId = [[MTOutgoingMessageInternalId alloc] init]; _data = data; _metadata = metadata; + _shortMetadata = shortMetadata; _messageId = messageId; _messageSeqNo = messageSeqNo; _requiresConfirmation = true; diff --git a/MTProtoKit/MTProto.m b/MTProtoKit/MTProto.m index 2001204442..9e71aaf174 100644 --- a/MTProtoKit/MTProto.m +++ b/MTProtoKit/MTProto.m @@ -196,6 +196,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p pause]", self, _context); } + MTShortLog(@"[MTProto#%p@%p pause]", self, _context); _mtState |= MTProtoStatePaused; @@ -214,6 +215,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p resume]", self, _context); } + MTShortLog(@"[MTProto#%p@%p resume]", self, _context); [self setMtState:_mtState & (~MTProtoStatePaused)]; @@ -338,12 +340,14 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p authInfoForDatacenterWithId:%d is nil]", self, _context, _datacenterId); } + MTShortLog(@"[MTProto#%p@%p authInfoForDatacenterWithId:%d is nil]", self, _context, _datacenterId); if ((_mtState & MTProtoStateAwaitingDatacenterAuthorization) == 0) { [self setMtState:_mtState | MTProtoStateAwaitingDatacenterAuthorization]; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p requesting authInfo for %d]", self, _context, _datacenterId); } + MTShortLog(@"[MTProto#%p@%p requesting authInfo for %d]", self, _context, _datacenterId); [_context authInfoForDatacenterWithIdRequired:_datacenterId isCdn:_cdn]; } }/* else if (!_useUnauthorizedMode && _useTempAuthKeys && [[_context authInfoForDatacenterWithId:_datacenterId] tempAuthKeyWithType:tempAuthKeyType] == nil) { @@ -377,6 +381,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p resetting session]", self, _context); } + MTShortLog(@"[MTProto#%p@%p resetting session]", self, _context); if (_authInfo.authKeyId != 0 && !self.cdn) { [_context scheduleSessionCleanupForAuthKeyId:_authInfo.authKeyId sessionInfo:_sessionInfo]; @@ -426,6 +431,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p begin time sync]", self, _context); } + MTShortLog(@"[MTProto#%p@%p begin time sync]", self, _context); MTTimeSyncMessageService *timeSyncService = [[MTTimeSyncMessageService alloc] init]; timeSyncService.delegate = self; @@ -458,6 +464,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p service tasks state: %d, resend: %s]", self, _context, _mtState, haveResendMessagesPending ? "yes" : "no"); } + MTShortLog(@"[MTProto#%p@%p service tasks state: %d, resend: %s]", self, _context, _mtState, haveResendMessagesPending ? "yes" : "no"); for (id messageService in _messageServices) { @@ -508,6 +515,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p service tasks state: %d, resend: %s]", self, _context, _mtState, "yes"); } + MTShortLog(@"[MTProto#%p@%p service tasks state: %d, resend: %s]", self, _context, _mtState, "yes"); for (id messageService in _messageServices) { @@ -560,6 +568,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p service tasks state: %d, resend: %s]", self, _context, _mtState, "no"); } + MTShortLog(@"[MTProto#%p@%p service tasks state: %d, resend: %s]", self, _context, _mtState, "no"); for (id messageService in _messageServices) { @@ -859,6 +868,11 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; return [[NSString alloc] initWithFormat:@"%@ (%" PRId64 "/%" PRId32 ")", message.metadata, message.messageId == 0 ? messageId : message.messageId, message.messageSeqNo == 0 ? message.messageSeqNo : messageSeqNo]; } +- (NSString *)outgoingShortMessageDescription:(MTOutgoingMessage *)message messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo +{ + return [[NSString alloc] initWithFormat:@"%@ (%" PRId64 "/%" PRId32 ")", message.shortMetadata, message.messageId == 0 ? messageId : message.messageId, message.messageSeqNo == 0 ? message.messageSeqNo : messageSeqNo]; +} + - (NSString *)incomingMessageDescription:(MTIncomingMessage *)message { return [[NSString alloc] initWithFormat:@"%@ (%" PRId64", %" PRId64"/%" PRId64")", message.body, message.messageId, message.authKeyId, message.sessionId]; @@ -938,7 +952,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; [msgsAckBuffer appendInt64:(int64_t)[nMessageId longLongValue]]; } - MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:msgsAckBuffer.data metadata:@"msgsAck"]; + MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:msgsAckBuffer.data metadata:@"msgsAck" shortMetadata:@"msgsAck"]; outgoingMessage.requiresConfirmation = false; [messageTransactions addObject:[[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(__unused NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId) @@ -1013,6 +1027,8 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; }*/ MTLog(@"[MTProto#%p@%p preparing %@]", self, _context, messageDescription); } + NSString *shortMessageDescription = [self outgoingShortMessageDescription:outgoingMessage messageId:messageId messageSeqNo:messageSeqNo]; + MTShortLog(@"[MTProto#%p@%p preparing %@]", self, _context, shortMessageDescription); if (!monotonityViolated || _useUnauthorizedMode) { @@ -1057,6 +1073,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p client message id monotonity violated]", self, _context); } + MTShortLog(@"[MTProto#%p@%p client message id monotonity violated]", self, _context); [self resetSessionInfo]; } @@ -1300,6 +1317,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p sending time fix ping (%" PRId64 "/%" PRId32 ", %" PRId64 ")]", self, _context, timeFixMessageId, timeFixSeqNo, _sessionInfo.sessionId); } + MTShortLog(@"[MTProto#%p@%p sending time fix ping (%" PRId64 "/%" PRId32 ", %" PRId64 ")]", self, _context, timeFixMessageId, timeFixSeqNo, _sessionInfo.sessionId); [decryptedOs writeInt64:[_authInfo authSaltForMessageId:timeFixMessageId]]; // salt [decryptedOs writeInt64:_sessionInfo.sessionId]; @@ -1425,6 +1443,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p sending temp key binding message (%" PRId64 "/%" PRId32 ") for %lld (%d)]", self, _context, bindingMessageId, bindingSeqNo, effectiveTempAuthKey.authKeyId, (int)tempAuthKeyType); } + MTShortLog(@"[MTProto#%p@%p sending temp key binding message (%" PRId64 "/%" PRId32 ") for %lld (%d)]", self, _context, bindingMessageId, bindingSeqNo, effectiveTempAuthKey.authKeyId, (int)tempAuthKeyType); [decryptedOs writeInt64:[_authInfo authSaltForMessageId:bindingMessageId]]; [decryptedOs writeInt64:_sessionInfo.sessionId]; @@ -1545,6 +1564,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (MTLogEnabled()) { MTLog(@" container (%" PRId64 ") of (%@), in %" PRId64 "", containerMessageId, idsString, sessionInfo.sessionId); } + MTShortLog(@" container (%" PRId64 ") of (%@), in %" PRId64 "", containerMessageId, idsString, sessionInfo.sessionId); } [decryptedOs writeInt64:salt]; @@ -2032,6 +2052,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p protocol error %" PRId32 "", self, _context, protocolErrorCode); } + MTShortLog(@"[MTProto#%p@%p protocol error %" PRId32 "", self, _context, protocolErrorCode); if (decodeResult != nil) decodeResult(transactionId, false); @@ -2083,6 +2104,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p received AUTH_KEY_PERM_EMPTY]", self, _context); } + MTShortLog(@"[MTProto#%p@%p received AUTH_KEY_PERM_EMPTY]", self, _context); [self handleMissingKey:scheme.address]; [self requestSecureTransportReset]; @@ -2095,6 +2117,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p incoming data parse error, header: %d:%@]", self, _context, (int)decryptedData.length, dumpHexString(decryptedData, 128)); } + MTShortLog(@"[MTProto#%p@%p incoming data parse error, header: %d:%@]", self, _context, (int)decryptedData.length, dumpHexString(decryptedData, 128)); [_context reportTransportSchemeFailureForDatacenterId:_datacenterId transportScheme:scheme]; [self transportTransactionsMayHaveFailed:transport transactionIds:@[transactionId]]; @@ -2116,6 +2139,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p couldn't decrypt incoming data]", self, _context); } + MTShortLog(@"[MTProto#%p@%p couldn't decrypt incoming data]", self, _context); if (decodeResult != nil) decodeResult(transactionId, false); @@ -2398,6 +2422,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p received duplicate message %" PRId64 "]", self, _context, incomingMessage.messageId); } + MTShortLog(@"[MTProto#%p@%p received duplicate message %" PRId64 "]", self, _context, incomingMessage.messageId); [_sessionInfo scheduleMessageConfirmation:incomingMessage.messageId size:incomingMessage.size]; if ([_sessionInfo scheduledMessageConfirmationsExceedSize:MTMaxUnacknowledgedMessageSize orCount:MTMaxUnacknowledgedMessageCount]) @@ -2529,6 +2554,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p detailed info %" PRId64 " is for %" PRId64 "", self, _context, incomingMessage.messageId, requestMessageId); } + MTShortLog(@"[MTProto#%p@%p detailed info %" PRId64 " is for %" PRId64 "", self, _context, incomingMessage.messageId, requestMessageId); for (id messageService in _messageServices) { @@ -2551,6 +2577,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p will request message %" PRId64 "", self, _context, detailedInfoMessage.responseMessageId); } + MTShortLog(@"[MTProto#%p@%p will request message %" PRId64 "", self, _context, detailedInfoMessage.responseMessageId); } else { @@ -2639,6 +2666,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { if (MTLogEnabled()) { MTLog(@"[MTProto#%p@%p bindTempAuthKey error %@]", self, _context, rpcError); } + MTShortLog(@"[MTProto#%p@%p bindTempAuthKey error %@]", self, _context, rpcError); [self requestTransportTransaction]; } diff --git a/MTProtoKit/MTProtoKit.h b/MTProtoKit/MTProtoKit.h index 5d906dfa37..673e3f08df 100644 --- a/MTProtoKit/MTProtoKit.h +++ b/MTProtoKit/MTProtoKit.h @@ -73,3 +73,4 @@ FOUNDATION_EXPORT const unsigned char MtProtoKitVersionString[]; #import #import #import +#import diff --git a/MTProtoKit/MTRequest.h b/MTProtoKit/MTRequest.h index d181a55abd..3cc58bf6ab 100644 --- a/MTProtoKit/MTRequest.h +++ b/MTProtoKit/MTRequest.h @@ -12,6 +12,7 @@ @property (nonatomic, strong, readonly) NSData *payload; @property (nonatomic, strong, readonly) id metadata; +@property (nonatomic, strong, readonly) id shortMetadata; @property (nonatomic, strong, readonly) id (^responseParser)(NSData *); @property (nonatomic, strong) NSArray *decorators; @@ -29,6 +30,6 @@ @property (nonatomic, copy) bool (^shouldContinueExecutionWithErrorContext)(MTRequestErrorContext *errorContext); @property (nonatomic, copy) bool (^shouldDependOnRequest)(MTRequest *anotherRequest); -- (void)setPayload:(NSData *)payload metadata:(id)metadata responseParser:(id (^)(NSData *))responseParser; +- (void)setPayload:(NSData *)payload metadata:(id)metadata shortMetadata:(id)shortMetadata responseParser:(id (^)(NSData *))responseParser; @end diff --git a/MTProtoKit/MTRequest.m b/MTProtoKit/MTRequest.m index 4dfead4bc5..bb7cd2d86e 100644 --- a/MTProtoKit/MTRequest.m +++ b/MTProtoKit/MTRequest.m @@ -59,10 +59,11 @@ return self; } -- (void)setPayload:(NSData *)payload metadata:(id)metadata responseParser:(id (^)(NSData *))responseParser +- (void)setPayload:(NSData *)payload metadata:(id)metadata shortMetadata:(id)shortMetadata responseParser:(id (^)(NSData *))responseParser { _payload = payload; _metadata = metadata; + _shortMetadata = shortMetadata; _responseParser = [responseParser copy]; } diff --git a/MTProtoKit/MTRequestMessageService.h b/MTProtoKit/MTRequestMessageService.h index cd39ffff27..9e896e513a 100644 --- a/MTProtoKit/MTRequestMessageService.h +++ b/MTProtoKit/MTRequestMessageService.h @@ -29,6 +29,8 @@ @property (nonatomic, strong) MTApiEnvironment *apiEnvironment; @property (nonatomic) bool forceBackgroundRequests; + +@property (nonatomic, copy) void (^didReceiveSoftAuthResetError)(void); - (instancetype)initWithContext:(MTContext *)context; diff --git a/MTProtoKit/MTRequestMessageService.m b/MTProtoKit/MTRequestMessageService.m index d526f728ee..fd3b68b1b1 100644 --- a/MTProtoKit/MTRequestMessageService.m +++ b/MTProtoKit/MTRequestMessageService.m @@ -276,7 +276,7 @@ MTRequest *request = [[MTRequest alloc] init]; __autoreleasing NSData *noopData = nil; MTRequestNoopParser responseParser = [[_context serialization] requestNoop:&noopData]; - [request setPayload:noopData metadata:@"noop" responseParser:responseParser]; + [request setPayload:noopData metadata:@"noop" shortMetadata:@"noop" responseParser:responseParser]; [request setCompleted:^(__unused id result, __unused NSTimeInterval timestamp, __unused id error) { }]; @@ -416,7 +416,7 @@ messageSeqNo = request.requestContext.messageSeqNo; } - MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:[self decorateRequestData:request initializeApi:requestsWillInitializeApi unresolvedDependencyOnRequestInternalId:&autoreleasingUnresolvedDependencyOnRequestInternalId] metadata:request.metadata messageId:messageId messageSeqNo:messageSeqNo]; + MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:[self decorateRequestData:request initializeApi:requestsWillInitializeApi unresolvedDependencyOnRequestInternalId:&autoreleasingUnresolvedDependencyOnRequestInternalId] metadata:request.metadata shortMetadata:request.shortMetadata messageId:messageId messageSeqNo:messageSeqNo]; outgoingMessage.needsQuickAck = request.acknowledgementReceived != nil; outgoingMessage.hasHighPriority = request.hasHighPriority; @@ -460,7 +460,8 @@ [dropAnswerBuffer appendInt32:(int32_t)0x58e4a740]; [dropAnswerBuffer appendInt64:dropContext.dropMessageId]; - MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:dropAnswerBuffer.data metadata:[NSString stringWithFormat:@"dropAnswer for %" PRId64, dropContext.dropMessageId] messageId:dropContext.messageId messageSeqNo:dropContext.messageSeqNo]; + NSString *messageDecription = [NSString stringWithFormat:@"dropAnswer for %" PRId64, dropContext.dropMessageId]; + MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:dropAnswerBuffer.data metadata:messageDecription shortMetadata:messageDecription messageId:dropContext.messageId messageSeqNo:dropContext.messageSeqNo]; outgoingMessage.requiresConfirmation = false; dropMessageIdToMessageInternalId[@(dropContext.dropMessageId)] = outgoingMessage.internalId; [messages addObject:outgoingMessage]; @@ -704,9 +705,11 @@ authInfo = [authInfo withUpdatedAuthKeyAttributes:authKeyAttributes]; [_context updateAuthInfoForDatacenterWithId:mtProto.datacenterId authInfo:authInfo]; }]; + } else if (rpcError.errorCode == 406) { + if (_didReceiveSoftAuthResetError) { + _didReceiveSoftAuthResetError(); + } } - -//#warning TODO other service errors } request.requestContext = nil; diff --git a/MTProtoKit/MTResendMessageService.m b/MTProtoKit/MTResendMessageService.m index 98090381da..ba3651d445 100644 --- a/MTProtoKit/MTResendMessageService.m +++ b/MTProtoKit/MTResendMessageService.m @@ -57,7 +57,7 @@ NSData *resentMessagesRequestData = resendRequestBuffer.data; - MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:resentMessagesRequestData metadata:@"resendMessages"]; + MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:resentMessagesRequestData metadata:@"resendMessages" shortMetadata:@"resendMessages"]; outgoingMessage.requiresConfirmation = false; return [[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId) diff --git a/MTProtoKit/MTTcpTransport.m b/MTProtoKit/MTTcpTransport.m index 5305f84379..c5a3d10cb3 100644 --- a/MTProtoKit/MTTcpTransport.m +++ b/MTProtoKit/MTTcpTransport.m @@ -620,7 +620,7 @@ static const NSTimeInterval MTTcpTransportSleepWatchdogTimeout = 60.0; [pingBuffer appendInt32:(int32_t)0x7abe77ec]; [pingBuffer appendInt64:randomId]; - MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:pingBuffer.data metadata:@"ping"]; + MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:pingBuffer.data metadata:@"ping" shortMetadata:@"ping"]; outgoingMessage.requiresConfirmation = false; __weak MTTcpTransport *weakSelf = self; diff --git a/MTProtoKit/MTTimeSyncMessageService.m b/MTProtoKit/MTTimeSyncMessageService.m index db7efd600b..a39efe07fb 100644 --- a/MTProtoKit/MTTimeSyncMessageService.m +++ b/MTProtoKit/MTTimeSyncMessageService.m @@ -59,7 +59,7 @@ [getFutureSaltsBuffer appendInt32:(int32_t)0xb921bd04]; [getFutureSaltsBuffer appendInt32:_futureSalts.count != 0 ? 1 : 32]; - MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:getFutureSaltsBuffer.data metadata:@"getFutureSalts"]; + MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:getFutureSaltsBuffer.data metadata:@"getFutureSalts" shortMetadata:@"getFutureSalts"]; return [[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId) { diff --git a/MtProtoKit.xcodeproj/project.pbxproj b/MtProtoKit.xcodeproj/project.pbxproj index 375d99ebba..38ea421192 100644 --- a/MtProtoKit.xcodeproj/project.pbxproj +++ b/MtProtoKit.xcodeproj/project.pbxproj @@ -28,6 +28,12 @@ D0119CCC20CAD65D00895300 /* PingFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = D0119CC820CAD65D00895300 /* PingFoundation.m */; }; D0119CCD20CAD65D00895300 /* PingFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = D0119CC820CAD65D00895300 /* PingFoundation.m */; }; D0119CCE20CAD65D00895300 /* PingFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = D0119CC820CAD65D00895300 /* PingFoundation.m */; }; + D015E018225CD19E00CB9E8A /* MTGzip.h in Headers */ = {isa = PBXBuildFile; fileRef = D015E016225CD19E00CB9E8A /* MTGzip.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D015E019225CD19E00CB9E8A /* MTGzip.h in Headers */ = {isa = PBXBuildFile; fileRef = D015E016225CD19E00CB9E8A /* MTGzip.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D015E01A225CD19E00CB9E8A /* MTGzip.h in Headers */ = {isa = PBXBuildFile; fileRef = D015E016225CD19E00CB9E8A /* MTGzip.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D015E01B225CD19E00CB9E8A /* MTGzip.m in Sources */ = {isa = PBXBuildFile; fileRef = D015E017225CD19E00CB9E8A /* MTGzip.m */; }; + D015E01C225CD19E00CB9E8A /* MTGzip.m in Sources */ = {isa = PBXBuildFile; fileRef = D015E017225CD19E00CB9E8A /* MTGzip.m */; }; + D015E01D225CD19E00CB9E8A /* MTGzip.m in Sources */ = {isa = PBXBuildFile; fileRef = D015E017225CD19E00CB9E8A /* MTGzip.m */; }; D0185E722089D265005E1A6C /* MTProxyConnectivity.h in Headers */ = {isa = PBXBuildFile; fileRef = D0185E702089D265005E1A6C /* MTProxyConnectivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0185E732089D265005E1A6C /* MTProxyConnectivity.h in Headers */ = {isa = PBXBuildFile; fileRef = D0185E702089D265005E1A6C /* MTProxyConnectivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0185E742089D265005E1A6C /* MTProxyConnectivity.h in Headers */ = {isa = PBXBuildFile; fileRef = D0185E702089D265005E1A6C /* MTProxyConnectivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -617,6 +623,8 @@ D0119CC020CAD34800895300 /* MTConnectionProbing.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTConnectionProbing.m; sourceTree = ""; }; D0119CC720CAD65D00895300 /* PingFoundation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PingFoundation.h; sourceTree = ""; }; D0119CC820CAD65D00895300 /* PingFoundation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PingFoundation.m; sourceTree = ""; }; + D015E016225CD19E00CB9E8A /* MTGzip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTGzip.h; sourceTree = ""; }; + D015E017225CD19E00CB9E8A /* MTGzip.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTGzip.m; sourceTree = ""; }; D0185E702089D265005E1A6C /* MTProxyConnectivity.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTProxyConnectivity.h; sourceTree = ""; }; D0185E712089D265005E1A6C /* MTProxyConnectivity.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTProxyConnectivity.m; sourceTree = ""; }; D020FAF81D994E3100F279AA /* MTHttpRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTHttpRequestOperation.h; path = MTProtoKit/MTHttpRequestOperation.h; sourceTree = ""; }; @@ -1085,6 +1093,8 @@ D0119CC820CAD65D00895300 /* PingFoundation.m */, D0338737223BC115007A2CE4 /* MTPKCS.h */, D0338738223BC115007A2CE4 /* MTPKCS.m */, + D015E016225CD19E00CB9E8A /* MTGzip.h */, + D015E017225CD19E00CB9E8A /* MTGzip.m */, ); name = Utils; sourceTree = ""; @@ -1523,6 +1533,7 @@ D0CD981F1D74B99400F41187 /* MTResPqMessage.h in Headers */, D0CD98E81D75C0BB00F41187 /* MTMessageService.h in Headers */, D0B0DF621DD7E7A3003BA12D /* MTBag.h in Headers */, + D015E019225CD19E00CB9E8A /* MTGzip.h in Headers */, D0CD98681D74B9E200F41187 /* MTContext.h in Headers */, D0CD985B1D74B9BF00F41187 /* MTSetClientDhParamsResponseMessage.h in Headers */, D0CD98741D74BA0100F41187 /* MTDiscoverDatacenterAddressAction.h in Headers */, @@ -1699,6 +1710,7 @@ D0D1A0421ADD983C007D9ED6 /* MTFutureSaltsMessage.h in Headers */, D0CB064B1ADC45B1005E298F /* MTRequest.h in Headers */, D010DB811D70B3B90012AD96 /* MTAes.h in Headers */, + D015E018225CD19E00CB9E8A /* MTGzip.h in Headers */, D0CB062C1ADC4575005E298F /* MTDatacenterAuthMessageService.h in Headers */, D0CB061C1ADC4541005E298F /* MTInternalId.h in Headers */, ); @@ -1723,6 +1735,7 @@ D0CD982D1D74B99500F41187 /* MTResPqMessage.h in Headers */, D0CD98E91D75C0BB00F41187 /* MTMessageService.h in Headers */, D0B0DF631DD7E7A4003BA12D /* MTBag.h in Headers */, + D015E01A225CD19E00CB9E8A /* MTGzip.h in Headers */, D0CD98691D74B9E300F41187 /* MTContext.h in Headers */, D0CD985F1D74B9BF00F41187 /* MTSetClientDhParamsResponseMessage.h in Headers */, D0CD98751D74BA0100F41187 /* MTDiscoverDatacenterAddressAction.h in Headers */, @@ -1910,16 +1923,16 @@ }; D079AB961AF39B8000076F59 = { CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0930; + LastSwiftMigration = 1010; }; D0CB05F61ADC4483005E298F = { CreatedOnToolsVersion = 6.3; - LastSwiftMigration = 0930; + LastSwiftMigration = 1010; ProvisioningStyle = Manual; }; D0D2250A1B4D817B0085E26D = { CreatedOnToolsVersion = 6.4; - LastSwiftMigration = 0930; + LastSwiftMigration = 1010; ProvisioningStyle = Manual; }; D0D225141B4D817B0085E26D = { @@ -2090,6 +2103,7 @@ D0CD988E1D74BA5900F41187 /* MTDatacenterAddress.m in Sources */, D0CD98521D74B9B700F41187 /* MTSetClientDhParamsResponseMessage.m in Sources */, D0C932271E095D6A0074F044 /* MTNetworkUsageCalculationInfo.m in Sources */, + D015E01C225CD19E00CB9E8A /* MTGzip.m in Sources */, D0CAF2CF1D75E25B0011F558 /* MTSignal.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2189,6 +2203,7 @@ D0D1A0631ADD983C007D9ED6 /* MTServerDhInnerDataMessage.m in Sources */, D0D1A0571ADD983C007D9ED6 /* MTNewSessionCreatedMessage.m in Sources */, D0C932261E095D6A0074F044 /* MTNetworkUsageCalculationInfo.m in Sources */, + D015E01B225CD19E00CB9E8A /* MTGzip.m in Sources */, D0CAF2CC1D75E24C0011F558 /* MTSignal.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2288,6 +2303,7 @@ D0CD98931D74BA5A00F41187 /* MTDatacenterAddress.m in Sources */, D0CD98571D74B9B700F41187 /* MTSetClientDhParamsResponseMessage.m in Sources */, D0C932281E095D6A0074F044 /* MTNetworkUsageCalculationInfo.m in Sources */, + D015E01D225CD19E00CB9E8A /* MTGzip.m in Sources */, D0CAF2D01D75E25B0011F558 /* MTSignal.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/MtProtoKitDynamic/MtProtoKitDynamic.h b/MtProtoKitDynamic/MtProtoKitDynamic.h index 1dc7d2f3ea..71b8db618f 100644 --- a/MtProtoKitDynamic/MtProtoKitDynamic.h +++ b/MtProtoKitDynamic/MtProtoKitDynamic.h @@ -75,3 +75,4 @@ FOUNDATION_EXPORT const unsigned char MtProtoKitDynamicVersionString[]; #import #import #import +#import diff --git a/MtProtoKitMac/MtProtoKitMac.h b/MtProtoKitMac/MtProtoKitMac.h index ab97ee1d2b..d3b518a1d9 100644 --- a/MtProtoKitMac/MtProtoKitMac.h +++ b/MtProtoKitMac/MtProtoKitMac.h @@ -74,3 +74,4 @@ FOUNDATION_EXPORT const unsigned char MtProtoKitMacVersionString[]; #import #import #import +#import