1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-03 09:57:46 +01:00
Telegram/Telegraph/TGTwoStepSetPaswordSignal.m
2015-10-01 19:19:52 +03:00

127 lines
5.1 KiB
Objective-C

#import "TGTwoStepSetPaswordSignal.h"
#import "TGTwoStepConfig.h"
#import "TGTelegramNetworking.h"
#import "TL/TLMetaScheme.h"
#import <MTProtoKit/MTEncryption.h>
#import "TGTwoStepConfigSignal.h"
#import "TLaccount_PasswordInputSettings_manual.h"
@implementation TGTwoStepSetPaswordSignal
+ (SSignal *)setPasswordWithCurrentSalt:(NSData *)currentSalt currentPassword:(NSString *)currentPassword nextSalt:(NSData *)nextSalt nextPassword:(NSString *)nextPassword nextHint:(NSString *)nextHint email:(NSString *)email
{
TLRPCaccount_updatePasswordSettings$account_updatePasswordSettings *updatePasswordSettings = [[TLRPCaccount_updatePasswordSettings$account_updatePasswordSettings alloc] init];
NSData *currentPasswordHash = [NSData data];
if (currentSalt != nil)
{
NSMutableData *data = [[NSMutableData alloc] init];
[data appendData:currentSalt];
[data appendData:[currentPassword dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:currentSalt];
currentPasswordHash = MTSha256(data);
}
updatePasswordSettings.current_password_hash = currentPasswordHash;
if (nextPassword.length == 0)
{
NSData *newPasswordHash = [NSData data];
NSData *newPasswordSalt = [NSData data];
TLaccount_PasswordInputSettings_manual *inputSettings = [[TLaccount_PasswordInputSettings_manual alloc] init];
if (currentSalt.length == 0)
inputSettings.flags = 2;
else
inputSettings.flags = 1 | 2;
inputSettings.n_newSalt = newPasswordSalt;
inputSettings.n_newPasswordHash = newPasswordHash;
inputSettings.hint = @"";
inputSettings.email = @"";
updatePasswordSettings.n_new_settings = inputSettings;
}
else
{
NSData *newPasswordHash = [NSData data];
NSData *newPasswordSalt = nextSalt;
if (nextSalt != nil)
{
NSMutableData *salt = [[NSMutableData alloc] initWithData:nextSalt];
uint8_t bytes[32];
arc4random_buf(bytes, 32);
[salt appendBytes:bytes length:32];
newPasswordSalt = salt;
NSMutableData *data = [[NSMutableData alloc] init];
[data appendData:newPasswordSalt];
[data appendData:[nextPassword dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:newPasswordSalt];
newPasswordHash = MTSha256(data);
}
TLaccount_PasswordInputSettings_manual *inputSettings = [[TLaccount_PasswordInputSettings_manual alloc] init];
inputSettings.flags = 1 | (email == nil ? 0 : 2);
inputSettings.n_newSalt = newPasswordSalt;
inputSettings.n_newPasswordHash = newPasswordHash;
inputSettings.hint = nextHint;
inputSettings.email = email;
updatePasswordSettings.n_new_settings = inputSettings;
}
return [[[[TGTelegramNetworking instance] requestSignal:updatePasswordSettings requestClass:TGRequestClassFailOnFloodErrors] mapToSignal:^SSignal *(__unused id result)
{
return [TGTwoStepConfigSignal twoStepConfig];
}] catch:^SSignal *(id error)
{
NSString *errorText = [[TGTelegramNetworking instance] extractNetworkErrorType:error];
if ([errorText isEqualToString:@"EMAIL_UNCONFIRMED"])
return [TGTwoStepConfigSignal twoStepConfig];
else if ([errorText hasPrefix:@"FLOOD_WAIT"])
return [SSignal fail:errorText];
return [SSignal fail:error];
}];
}
+ (SSignal *)setRecoveryEmail:(NSData *)currentSalt currentPassword:(NSString *)currentPassword recoveryEmail:(NSString *)recoveryEmail
{
TLRPCaccount_updatePasswordSettings$account_updatePasswordSettings *updatePasswordSettings = [[TLRPCaccount_updatePasswordSettings$account_updatePasswordSettings alloc] init];
NSData *currentPasswordHash = [NSData data];
if (currentSalt != nil)
{
NSMutableData *data = [[NSMutableData alloc] init];
[data appendData:currentSalt];
[data appendData:[currentPassword dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:currentSalt];
currentPasswordHash = MTSha256(data);
}
updatePasswordSettings.current_password_hash = currentPasswordHash;
TLaccount_PasswordInputSettings_manual *inputSettings = [[TLaccount_PasswordInputSettings_manual alloc] init];
inputSettings.flags = 2;
inputSettings.email = recoveryEmail;
updatePasswordSettings.n_new_settings = inputSettings;
return [[[[TGTelegramNetworking instance] requestSignal:updatePasswordSettings requestClass:TGRequestClassFailOnFloodErrors] mapToSignal:^SSignal *(__unused id result)
{
return [TGTwoStepConfigSignal twoStepConfig];
}] catch:^SSignal *(id error)
{
NSString *errorText = [[TGTelegramNetworking instance] extractNetworkErrorType:error];
if ([errorText isEqualToString:@"EMAIL_UNCONFIRMED"])
return [TGTwoStepConfigSignal twoStepConfig];
else if ([errorText hasPrefix:@"FLOOD_WAIT"])
return [SSignal fail:errorText];
return [SSignal fail:error];
}];
}
@end