Backup address fix

This commit is contained in:
Isaac 2024-05-02 21:55:30 +04:00
parent be5bec8680
commit 87a0240c8b
2 changed files with 27 additions and 12 deletions

View File

@ -1,6 +1,7 @@
#import <MtProtoKit/MTBackupAddressSignals.h> #import <MtProtoKit/MTBackupAddressSignals.h>
#import <MtProtoKit/MTSignal.h> #import <MtProtoKit/MTSignal.h>
#import <MtProtoKit/MTAtomic.h>
#import <MtProtoKit/MTQueue.h> #import <MtProtoKit/MTQueue.h>
#import <MtProtoKit/MTHttpRequestOperation.h> #import <MtProtoKit/MTHttpRequestOperation.h>
#import <MtProtoKit/MTEncryption.h> #import <MtProtoKit/MTEncryption.h>
@ -276,6 +277,15 @@ static NSString *makeRandomPadding() {
return [[MTSignal mergeSignals:signals] take:1]; return [[MTSignal mergeSignals:signals] take:1];
} }
MTAtomic *sharedFetchConfigKeychains() {
static MTAtomic *value = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
value = [[MTAtomic alloc] initWithValue:[[NSMutableDictionary alloc] init]];
});
return value;
}
+ (MTSignal *)fetchConfigFromAddress:(MTBackupDatacenterAddress *)address currentContext:(MTContext *)currentContext mainDatacenterId:(NSInteger)mainDatacenterId { + (MTSignal *)fetchConfigFromAddress:(MTBackupDatacenterAddress *)address currentContext:(MTContext *)currentContext mainDatacenterId:(NSInteger)mainDatacenterId {
MTApiEnvironment *apiEnvironment = [currentContext.apiEnvironment copy]; MTApiEnvironment *apiEnvironment = [currentContext.apiEnvironment copy];
@ -299,17 +309,17 @@ static NSString *makeRandomPadding() {
NSInteger authTokenMasterDatacenterId = 0; NSInteger authTokenMasterDatacenterId = 0;
NSNumber *requiredAuthToken = nil; NSNumber *requiredAuthToken = nil;
bool allowUnboundEphemeralKeys = true; bool allowUnboundEphemeralKeys = true;
if (address.datacenterId != 0) { NSString *keychainKey = [NSString stringWithFormat:@"%d:%@:%d", (int)address.datacenterId, address.ip, (int)address.port];
authTokenMasterDatacenterId = mainDatacenterId; MTTemporaryKeychain *tempKeychain = [sharedFetchConfigKeychains() with:^(NSMutableDictionary *dict) {
requiredAuthToken = @(address.datacenterId); if (dict[keychainKey] != nil) {
MTTemporaryKeychain *tempKeychain = [[MTTemporaryKeychain alloc] init]; return (MTTemporaryKeychain *)dict[keychainKey];
[MTContext copyAuthInfoFrom:currentContext.keychain toTempKeychain:tempKeychain];
context.keychain = tempKeychain;
allowUnboundEphemeralKeys = false;
} else { } else {
MTTemporaryKeychain *tempKeychain = [[MTTemporaryKeychain alloc] init]; MTTemporaryKeychain *keychain = [[MTTemporaryKeychain alloc] init];
context.keychain = tempKeychain; dict[keychainKey] = keychain;
return keychain;
} }
}];
context.keychain = tempKeychain;
MTProto *mtProto = [[MTProto alloc] initWithContext:context datacenterId:address.datacenterId usageCalculationInfo:nil requiredAuthToken:requiredAuthToken authTokenMasterDatacenterId:authTokenMasterDatacenterId]; MTProto *mtProto = [[MTProto alloc] initWithContext:context datacenterId:address.datacenterId usageCalculationInfo:nil requiredAuthToken:requiredAuthToken authTokenMasterDatacenterId:authTokenMasterDatacenterId];
mtProto.useTempAuthKeys = true; mtProto.useTempAuthKeys = true;

View File

@ -979,14 +979,16 @@ static void copyKeychainDictionaryKey(NSString * _Nonnull group, NSString * _Non
[[MTContext contextQueue] dispatchOnQueue:^ [[MTContext contextQueue] dispatchOnQueue:^
{ {
MTDatacenterAddress *overrideAddress = _apiEnvironment.datacenterAddressOverrides[@(datacenterId)]; MTDatacenterAddress *overrideAddress = _apiEnvironment.datacenterAddressOverrides[@(datacenterId)];
bool isAddressOverride = false;
if (overrideAddress != nil) { if (overrideAddress != nil) {
isAddressOverride = true;
[results addObject:[[MTTransportScheme alloc] initWithTransportClass:[MTTcpTransport class] address:overrideAddress media:false]]; [results addObject:[[MTTransportScheme alloc] initWithTransportClass:[MTTcpTransport class] address:overrideAddress media:false]];
} else { } else {
[results addObjectsFromArray:[self _allTransportSchemesForDatacenterWithId:datacenterId]]; [results addObjectsFromArray:[self _allTransportSchemesForDatacenterWithId:datacenterId]];
} }
MTDatacenterAddressSet *addressSet = [self addressSetForDatacenterWithId:datacenterId]; MTDatacenterAddressSet *addressSet = [self addressSetForDatacenterWithId:datacenterId];
if (addressSet != nil) { if (addressSet != nil && !isAddressOverride) {
MTTransportScheme *manualScheme = _datacenterManuallySelectedSchemeById[[[MTTransportSchemeKey alloc] initWithDatacenterId:datacenterId isProxy:isProxy isMedia:media]]; MTTransportScheme *manualScheme = _datacenterManuallySelectedSchemeById[[[MTTransportSchemeKey alloc] initWithDatacenterId:datacenterId isProxy:isProxy isMedia:media]];
if (manualScheme != nil) { if (manualScheme != nil) {
bool addressValid = false; bool addressValid = false;
@ -1351,6 +1353,9 @@ static void copyKeychainDictionaryKey(NSString * _Nonnull group, NSString * _Non
if (_apiEnvironment.networkSettings == nil || _apiEnvironment.networkSettings.reducedBackupDiscoveryTimeout) { if (_apiEnvironment.networkSettings == nil || _apiEnvironment.networkSettings.reducedBackupDiscoveryTimeout) {
delay = 5.0; delay = 5.0;
} }
#if DEBUG
delay = 1.0;
#endif
[self _beginBackupAddressDiscoveryWithDelay:delay]; [self _beginBackupAddressDiscoveryWithDelay:delay];
}]; }];
} }