public async Task <CacheItem> ExecuteAsync(JwtContainer jwtContainer, CacheItem relatedItem) { var userData = _jwtService.GetDataFromJwt <UserProfileData>(jwtContainer.Jwt).Data; await _recoveryHandler.RemoveConnectionsAsync(userData.PublicKey); // TODO: remove? classic flow if (!_coreConfiguration.OverwriteFields) { userData.Profile = null; } // TODO: code duplication var recoveryToken = !string.IsNullOrEmpty(userData.RecoveryData) ? Guid.NewGuid().ToString("N") : null; await _recoveryHandler.OnRecoverAsync(userData.DID, new OwnIdConnection { PublicKey = userData.PublicKey, RecoveryToken = recoveryToken, RecoveryData = userData.RecoveryData, AuthType = relatedItem.AuthCookieType == CookieType.Passcode ? ConnectionAuthType.Passcode : ConnectionAuthType.Basic }); return(await _cacheItemRepository.UpdateAsync(relatedItem.Context, item => { item.RecoveryToken = recoveryToken; item.RecoveryData = userData.RecoveryData; item.FinishFlow(relatedItem.DID, userData.PublicKey); })); }
public async Task <CacheItem> ExecuteAsync(JwtContainer input, CacheItem relatedItem) { var userData = _jwtService.GetDataFromJwt <UserIdentitiesData>(input.Jwt).Data; if (relatedItem.ChallengeType == ChallengeType.Link && relatedItem.DID != userData.DID) { throw new CommandValidationException($"Wrong user for linking {userData.DID}"); } var userExists = await _userHandlerAdapter.IsUserExistsAsync(userData.PublicKey); if (userExists) { throw new OwnIdException(ErrorType.UserAlreadyExists); } // preventing data substitution userData.DID = relatedItem.DID; // TODO: code duplication var recoveryToken = !string.IsNullOrEmpty(userData.RecoveryData) ? Guid.NewGuid().ToString("N") : null; var connection = new OwnIdConnection { PublicKey = userData.PublicKey, RecoveryToken = recoveryToken, RecoveryData = userData.RecoveryData, AuthType = relatedItem.AuthCookieType switch { CookieType.Fido2 => ConnectionAuthType.Fido2, CookieType.Passcode => ConnectionAuthType.Passcode, _ => ConnectionAuthType.Basic } }; await _linkHandler.OnLinkAsync(userData.DID, connection); return(await _cacheItemRepository.UpdateAsync(relatedItem.Context, item => { item.RecoveryToken = recoveryToken; item.RecoveryData = userData.RecoveryData; item.FinishFlow(userData.DID, userData.PublicKey); })); }