no message

This commit is contained in:
Peter 2018-04-24 20:03:43 +03:00
parent 0e8f3be0e4
commit cd0799da8a
9 changed files with 102 additions and 16 deletions

View File

@ -132,7 +132,7 @@
NSMutableDictionary *datacenterAddressOverrides = [[NSMutableDictionary alloc] init]; NSMutableDictionary *datacenterAddressOverrides = [[NSMutableDictionary alloc] init];
MTBackupDatacenterAddress *address = data.addressList[0]; MTBackupDatacenterAddress *address = data.addressList[0];
datacenterAddressOverrides[@(data.datacenterId)] = [[MTDatacenterAddress alloc] initWithIp:address.ip port:(uint16_t)address.port preferForMedia:false restrictToTcp:false cdn:false preferForProxy:false]; datacenterAddressOverrides[@(data.datacenterId)] = [[MTDatacenterAddress alloc] initWithIp:address.ip port:(uint16_t)address.port preferForMedia:false restrictToTcp:false cdn:false preferForProxy:false secret:nil];
apiEnvironment.datacenterAddressOverrides = datacenterAddressOverrides; apiEnvironment.datacenterAddressOverrides = datacenterAddressOverrides;
apiEnvironment.apiId = currentContext.apiEnvironment.apiId; apiEnvironment.apiId = currentContext.apiEnvironment.apiId;

View File

@ -212,7 +212,7 @@ typedef struct {
for (MTDatacenterAddress *address in bestAddressList) { for (MTDatacenterAddress *address in bestAddressList) {
MTTransportScheme *tcpTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTTcpTransport class] address:address media:media]; MTTransportScheme *tcpTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTTcpTransport class] address:address media:media];
MTTransportScheme *httpTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTHttpTransport class] address:address media:media]; //MTTransportScheme *httpTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTHttpTransport class] address:address media:media];
if ([self isIpv6:address.ip]) if ([self isIpv6:address.ip])
{ {
@ -235,7 +235,7 @@ typedef struct {
for (NSNumber *nPort in alternatePorts) { for (NSNumber *nPort in alternatePorts) {
NSSet *ipsWithPort = tcpIpsByPort[nPort]; NSSet *ipsWithPort = tcpIpsByPort[nPort];
if (![ipsWithPort containsObject:address.ip]) { if (![ipsWithPort containsObject:address.ip]) {
MTDatacenterAddress *portAddress = [[MTDatacenterAddress alloc] initWithIp:address.ip port:[nPort intValue] preferForMedia:address.preferForMedia restrictToTcp:address.restrictToTcp cdn:address.cdn preferForProxy:address.preferForProxy]; MTDatacenterAddress *portAddress = [[MTDatacenterAddress alloc] initWithIp:address.ip port:[nPort intValue] preferForMedia:address.preferForMedia restrictToTcp:address.restrictToTcp cdn:address.cdn preferForProxy:address.preferForProxy secret:address.secret];
MTTransportScheme *tcpPortTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTTcpTransport class] address:portAddress media:media]; MTTransportScheme *tcpPortTransportScheme = [[MTTransportScheme alloc] initWithTransportClass:[MTTcpTransport class] address:portAddress media:media];
MTSignal *tcpConnectionWithTimeout = [[[self tcpConnectionWithContext:context datacenterId:0 address:portAddress] then:[MTSignal single:tcpPortTransportScheme]] timeout:5.0 onQueue:[MTQueue concurrentDefaultQueue] orSignal:[MTSignal fail:nil]]; MTSignal *tcpConnectionWithTimeout = [[[self tcpConnectionWithContext:context datacenterId:0 address:portAddress] then:[MTSignal single:tcpPortTransportScheme]] timeout:5.0 onQueue:[MTQueue concurrentDefaultQueue] orSignal:[MTSignal fail:nil]];
MTSignal *signal = [tcpConnectionWithTimeout catch:^MTSignal *(__unused id error) { MTSignal *signal = [tcpConnectionWithTimeout catch:^MTSignal *(__unused id error) {
@ -246,7 +246,7 @@ typedef struct {
} }
} }
if (!address.restrictToTcp && !isProxy) { /*if (!address.restrictToTcp && !isProxy) {
MTSignal *signal = [[[[self httpConnectionWithAddress:address] then:[MTSignal single:httpTransportScheme]] timeout:5.0 onQueue:[MTQueue concurrentDefaultQueue] orSignal:[MTSignal fail:nil]] catch:^MTSignal *(__unused id error) MTSignal *signal = [[[[self httpConnectionWithAddress:address] then:[MTSignal single:httpTransportScheme]] timeout:5.0 onQueue:[MTQueue concurrentDefaultQueue] orSignal:[MTSignal fail:nil]] catch:^MTSignal *(__unused id error)
{ {
return [MTSignal complete]; return [MTSignal complete];
@ -262,7 +262,7 @@ typedef struct {
return [MTSignal complete]; return [MTSignal complete];
}]]; }]];
} }
} }*/
} }
MTSignal *repeatDelaySignal = [[MTSignal complete] delay:1.0 onQueue:[MTQueue concurrentDefaultQueue]]; MTSignal *repeatDelaySignal = [[MTSignal complete] delay:1.0 onQueue:[MTQueue concurrentDefaultQueue]];

View File

@ -14,8 +14,9 @@
@property (nonatomic, readonly) uint16_t port; @property (nonatomic, readonly) uint16_t port;
@property (nonatomic, strong, readonly) NSString *username; @property (nonatomic, strong, readonly) NSString *username;
@property (nonatomic, strong, readonly) NSString *password; @property (nonatomic, strong, readonly) NSString *password;
@property (nonatomic, strong, readonly) NSData *secret;
- (instancetype)initWithIp:(NSString *)ip port:(uint16_t)port username:(NSString *)username password:(NSString *)password; - (instancetype)initWithIp:(NSString *)ip port:(uint16_t)port username:(NSString *)username password:(NSString *)password secret:(NSData *)secret;
@end @end

View File

@ -132,13 +132,14 @@ typedef enum {
@implementation MTSocksProxySettings @implementation MTSocksProxySettings
- (instancetype)initWithIp:(NSString *)ip port:(uint16_t)port username:(NSString *)username password:(NSString *)password { - (instancetype)initWithIp:(NSString *)ip port:(uint16_t)port username:(NSString *)username password:(NSString *)password secret:(NSData *)secret {
self = [super init]; self = [super init];
if (self != nil) { if (self != nil) {
_ip = ip; _ip = ip;
_port = port; _port = port;
_username = username; _username = username;
_password = password; _password = password;
_secret = secret;
} }
return self; return self;
} }
@ -160,6 +161,9 @@ typedef enum {
if ((other->_password != nil) != (_password != nil) || (_password != nil && ![_password isEqual:other->_password])) { if ((other->_password != nil) != (_password != nil) || (_password != nil && ![_password isEqual:other->_password])) {
return false; return false;
} }
if ((other->_secret != nil) != (_secret != nil) || (_secret != nil && ![_secret isEqual:other->_secret])) {
return false;
}
return true; return true;
} }

View File

@ -26,6 +26,7 @@
#import <libkern/OSAtomic.h> #import <libkern/OSAtomic.h>
#import "MTDiscoverConnectionSignals.h" #import "MTDiscoverConnectionSignals.h"
#import "MTHttpTransport.h"
#if defined(MtProtoKitDynamicFramework) #if defined(MtProtoKitDynamicFramework)
# import <MTProtoKitDynamic/MTDisposable.h> # import <MTProtoKitDynamic/MTDisposable.h>
@ -753,6 +754,10 @@
} }
} }
if (candidate.transportClass == [MTHttpTransport class]) {
candidate = nil;
}
if (candidate != nil) { if (candidate != nil) {
result = candidate; result = candidate;
} else { } else {

View File

@ -17,8 +17,9 @@
@property (nonatomic, readonly) bool restrictToTcp; @property (nonatomic, readonly) bool restrictToTcp;
@property (nonatomic, readonly) bool cdn; @property (nonatomic, readonly) bool cdn;
@property (nonatomic, readonly) bool preferForProxy; @property (nonatomic, readonly) bool preferForProxy;
@property (nonatomic, readonly) NSData *secret;
- (instancetype)initWithIp:(NSString *)ip port:(uint16_t)port preferForMedia:(bool)preferForMedia restrictToTcp:(bool)restrictToTcp cdn:(bool)cdn preferForProxy:(bool)preferForProxy; - (instancetype)initWithIp:(NSString *)ip port:(uint16_t)port preferForMedia:(bool)preferForMedia restrictToTcp:(bool)restrictToTcp cdn:(bool)cdn preferForProxy:(bool)preferForProxy secret:(NSData *)secret;
- (BOOL)isEqualToAddress:(MTDatacenterAddress *)other; - (BOOL)isEqualToAddress:(MTDatacenterAddress *)other;
- (BOOL)isIpv6; - (BOOL)isIpv6;

View File

@ -13,7 +13,7 @@
@implementation MTDatacenterAddress @implementation MTDatacenterAddress
- (instancetype)initWithIp:(NSString *)ip port:(uint16_t)port preferForMedia:(bool)preferForMedia restrictToTcp:(bool)restrictToTcp cdn:(bool)cdn preferForProxy:(bool)preferForProxy - (instancetype)initWithIp:(NSString *)ip port:(uint16_t)port preferForMedia:(bool)preferForMedia restrictToTcp:(bool)restrictToTcp cdn:(bool)cdn preferForProxy:(bool)preferForProxy secret:(NSData *)secret
{ {
self = [super init]; self = [super init];
if (self != nil) if (self != nil)
@ -24,6 +24,7 @@
_restrictToTcp = restrictToTcp; _restrictToTcp = restrictToTcp;
_cdn = cdn; _cdn = cdn;
_preferForProxy = preferForProxy; _preferForProxy = preferForProxy;
_secret = secret;
} }
return self; return self;
} }
@ -40,6 +41,7 @@
_restrictToTcp = [aDecoder decodeBoolForKey:@"restrictToTcp"]; _restrictToTcp = [aDecoder decodeBoolForKey:@"restrictToTcp"];
_cdn = [aDecoder decodeBoolForKey:@"cdn"]; _cdn = [aDecoder decodeBoolForKey:@"cdn"];
_preferForProxy = [aDecoder decodeBoolForKey:@"preferForProxy"]; _preferForProxy = [aDecoder decodeBoolForKey:@"preferForProxy"];
_secret = [aDecoder decodeObjectForKey:@"secret"];
} }
return self; return self;
} }
@ -53,6 +55,7 @@
[aCoder encodeBool:_restrictToTcp forKey:@"restrictToTcp"]; [aCoder encodeBool:_restrictToTcp forKey:@"restrictToTcp"];
[aCoder encodeBool:_cdn forKey:@"cdn"]; [aCoder encodeBool:_cdn forKey:@"cdn"];
[aCoder encodeBool:_preferForProxy forKey:@"preferForProxy"]; [aCoder encodeBool:_preferForProxy forKey:@"preferForProxy"];
[aCoder encodeObject:_secret forKey:@"secret"];
} }
- (BOOL)isEqual:(id)object - (BOOL)isEqual:(id)object
@ -89,6 +92,14 @@
return false; return false;
} }
if ((_secret != nil) && (other->_secret != nil)) {
if (![_secret isEqualToData:other->_secret]) {
return false;
}
} else if ((_secret != nil) != (other->_secret != nil)) {
return false;
}
return true; return true;
} }
@ -105,7 +116,7 @@
- (NSString *)description - (NSString *)description
{ {
return [[NSString alloc] initWithFormat:@"%@:%d (media: %@, cdn: %@, static: %@)", _ip == nil ? _host : _ip, (int)_port, _preferForMedia ? @"yes" : @"no", _cdn ? @"yes" : @"no", _preferForProxy ? @"yes" : @"no"]; return [[NSString alloc] initWithFormat:@"%@:%d (media: %@, cdn: %@, static: %@, secret: %@)", _ip == nil ? _host : _ip, (int)_port, _preferForMedia ? @"yes" : @"no", _cdn ? @"yes" : @"no", _preferForProxy ? @"yes" : @"no", _secret];
} }
@end @end

View File

@ -355,6 +355,9 @@
if (requestTransactionForLongPolling) if (requestTransactionForLongPolling)
[self setDelegateNeedsTransaction]; [self setDelegateNeedsTransaction];
if ([delegate respondsToSelector:@selector(transportConnectionProblemsStatusChanged:hasConnectionProblems:isProbablyHttp:)])
[delegate transportConnectionProblemsStatusChanged:self hasConnectionProblems:true isProbablyHttp:false];
}]; }];
} }

View File

@ -24,10 +24,13 @@
#import "MTDatacenterAddress.h" #import "MTDatacenterAddress.h"
#import "MTAes.h" #import "MTAes.h"
#import "MTEncryption.h"
#import "MTDNS.h" #import "MTDNS.h"
#import "MTSignal.h" #import "MTSignal.h"
#define MT_TCPO25 0
MTInternalIdClass(MTTcpConnection) MTInternalIdClass(MTTcpConnection)
struct socks5_ident_req struct socks5_ident_req
@ -110,6 +113,8 @@ struct ctr_state {
GCDAsyncSocket *_socket; GCDAsyncSocket *_socket;
bool _closed; bool _closed;
int32_t _datacenterTag;
uint8_t _quickAckByte; uint8_t _quickAckByte;
MTTimer *_responseTimeoutTimer; MTTimer *_responseTimeoutTimer;
@ -134,6 +139,10 @@ struct ctr_state {
NSString *_socksUsername; NSString *_socksUsername;
NSString *_socksPassword; NSString *_socksPassword;
NSString *_mtpIp;
int32_t _mtpPort;
NSData *_mtpSecret;
MTMetaDisposable *_resolveDisposable; MTMetaDisposable *_resolveDisposable;
} }
@ -176,13 +185,25 @@ struct ctr_state {
} }
if (context.apiEnvironment.socksProxySettings != nil) { if (context.apiEnvironment.socksProxySettings != nil) {
_socksIp = context.apiEnvironment.socksProxySettings.ip; if (context.apiEnvironment.socksProxySettings.secret != nil) {
_socksPort = context.apiEnvironment.socksProxySettings.port; _mtpIp = context.apiEnvironment.socksProxySettings.ip;
_socksUsername = context.apiEnvironment.socksProxySettings.username; _mtpPort = context.apiEnvironment.socksProxySettings.port;
_socksPassword = context.apiEnvironment.socksProxySettings.password; _mtpSecret = context.apiEnvironment.socksProxySettings.secret;
} else {
_socksIp = context.apiEnvironment.socksProxySettings.ip;
_socksPort = context.apiEnvironment.socksProxySettings.port;
_socksUsername = context.apiEnvironment.socksProxySettings.username;
_socksPassword = context.apiEnvironment.socksProxySettings.password;
}
} }
_resolveDisposable = [[MTMetaDisposable alloc] init]; _resolveDisposable = [[MTMetaDisposable alloc] init];
if (address.preferForMedia) {
_datacenterTag = -(int32_t)datacenterId;
} else {
_datacenterTag = (int32_t)datacenterId;
}
} }
return self; return self;
} }
@ -238,6 +259,8 @@ struct ctr_state {
} else { } else {
MTLog(@"[MTTcpConnection#%x connecting to %@:%d via %@:%d using %@:%@]", (int)self, _address.ip, (int)_address.port, _socksIp, (int)_socksPort, _socksUsername, _socksPassword); MTLog(@"[MTTcpConnection#%x connecting to %@:%d via %@:%d using %@:%@]", (int)self, _address.ip, (int)_address.port, _socksIp, (int)_socksPort, _socksUsername, _socksPassword);
} }
} else if (_mtpIp != nil) {
MTLog(@"[MTTcpConnection#%x connecting to %@:%d via mtp://%@:%d:%@]", (int)self, _address.ip, (int)_address.port, _mtpIp, (int)_mtpPort, _mtpSecret);
} else { } else {
MTLog(@"[MTTcpConnection#%x connecting to %@:%d]", (int)self, _address.ip, (int)_address.port); MTLog(@"[MTTcpConnection#%x connecting to %@:%d]", (int)self, _address.ip, (int)_address.port);
} }
@ -263,6 +286,23 @@ struct ctr_state {
} else { } else {
resolveSignal = [MTSignal single:_socksIp]; resolveSignal = [MTSignal single:_socksIp];
} }
} else if (_mtpIp != nil) {
port = _mtpPort;
bool isHostname = true;
struct in_addr ip4;
struct in6_addr ip6;
if (inet_aton(_mtpIp.UTF8String, &ip4) != 0) {
isHostname = false;
} else if (inet_pton(AF_INET6, _mtpIp.UTF8String, &ip6) != 0) {
isHostname = false;
}
if (isHostname) {
resolveSignal = [MTDNS resolveHostname:_mtpIp];
} else {
resolveSignal = [MTSignal single:_mtpIp];
}
} }
__weak MTTcpConnection *weakSelf = self; __weak MTTcpConnection *weakSelf = self;
@ -388,14 +428,35 @@ struct ctr_state {
if (useEncryption) { if (useEncryption) {
int32_t controlVersion = 0xefefefef; int32_t controlVersion = 0xefefefef;
memcpy(controlBytes + 56, &controlVersion, 4); memcpy(controlBytes + 56, &controlVersion, 4);
int32_t datacenterTag = _datacenterTag;
memcpy(controlBytes + 60, &datacenterTag, 4);
uint8_t controlBytesReversed[64]; uint8_t controlBytesReversed[64];
for (int i = 0; i < 64; i++) { for (int i = 0; i < 64; i++) {
controlBytesReversed[i] = controlBytes[64 - 1 - i]; controlBytesReversed[i] = controlBytes[64 - 1 - i];
} }
_outgoingAesCtr = [[MTAesCtr alloc] initWithKey:controlBytes + 8 keyLength:32 iv:controlBytes + 8 + 32 decrypt:false]; NSData *aesKey = [[NSData alloc] initWithBytes:controlBytes + 8 length:32];
_incomingAesCtr = [[MTAesCtr alloc] initWithKey:controlBytesReversed + 8 keyLength:32 iv:controlBytesReversed + 8 + 32 decrypt:false]; NSData *aesIv = [[NSData alloc] initWithBytes:controlBytes + 8 + 32 length:16];
NSData *incomingAesKey = [[NSData alloc] initWithBytes:controlBytesReversed + 8 length:32];
NSData *incomingAesIv = [[NSData alloc] initWithBytes:controlBytesReversed + 8 + 32 length:16];
#if MT_TCPO25
if (_mtpSecret != nil || _address.secret != nil) {
NSMutableData *aesKeyData = [[NSMutableData alloc] init];
[aesKeyData appendData:aesKey];
if (_mtpSecret != nil) {
[aesKeyData appendData:_mtpSecret];
} else if (_address.secret != nil) {
[aesKeyData appendData:_address.secret];
}
NSData *aesKeyHash = MTSha256(aesKeyData);
aesKey = [aesKeyHash subdataWithRange:NSMakeRange(0, 32)];
}
#endif
_outgoingAesCtr = [[MTAesCtr alloc] initWithKey:aesKey.bytes keyLength:32 iv:aesIv.bytes decrypt:false];
_incomingAesCtr = [[MTAesCtr alloc] initWithKey:incomingAesKey.bytes keyLength:32 iv:incomingAesIv.bytes decrypt:false];
uint8_t encryptedControlBytes[64]; uint8_t encryptedControlBytes[64];
[_outgoingAesCtr encryptIn:controlBytes out:encryptedControlBytes len:64]; [_outgoingAesCtr encryptIn:controlBytes out:encryptedControlBytes len:64];