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);
            }));
        }
コード例 #2
0
        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);
            }));
        }