Ejemplo n.º 1
0
        public async Task SetAutoJoin(SynthbotUser user, bool opt)
        {
            await _dbSignal.WaitAsync();

            try
            {
                _db.Users.Attach(user);
                user.AutoJoin = opt;
                await _db.SaveChangesAsync();
            }
            finally
            {
                _dbSignal.Release();
            }
        }
Ejemplo n.º 2
0
        public async Task SetDefaultDevice(SynthbotUser user, string defaultDevice)
        {
            await _dbSignal.WaitAsync();

            try
            {
                _db.Users.Attach(user);
                user.DefaultSpotifyDevice = defaultDevice;
                await _db.SaveChangesAsync();
            }
            finally
            {
                _dbSignal.Release();
            }
        }
Ejemplo n.º 3
0
        public async Task SetPlaybackSession(SynthbotUser user, PlaybackSession session)
        {
            await _dbSignal.WaitAsync();

            try
            {
                _db.Users.Attach(user);
                user.ActivePlaybackSession = session;
                await _db.SaveChangesAsync();
            }
            finally
            {
                _dbSignal.Release();
            }
        }
Ejemplo n.º 4
0
        public async Task RemovePlaybackSession(SynthbotUser user)
        {
            await _dbSignal.WaitAsync();

            try
            {
                _db.Users.Attach(user);
                user.ActivePlaybackSession   = null;
                user.ActivePlaybackSessionId = null;
                await _db.SaveChangesAsync();
            }
            finally
            {
                _dbSignal.Release();
            }
        }
Ejemplo n.º 5
0
        // TODO Verify if this method is actually needed. If Login can only be external and can only come from Discord, this should never be hit
        public async Task <IActionResult> OnPostConfirmationAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            // Get the information about the user from the external login provider
            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                ErrorMessage = "Error loading external login information during confirmation.";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }

            if (ModelState.IsValid)
            {
                var user = new SynthbotUser {
                    UserName = Input.Email, Email = Input.Email
                };
                var result = await _userManager.CreateAsync(user);

                if (result.Succeeded)
                {
                    result = await _userManager.AddLoginAsync(user, info);

                    await _signInManager.UpdateExternalAuthenticationTokensAsync(info);

                    if (result.Succeeded)
                    {
                        await _signInManager.SignInAsync(user, isPersistent : false);

                        _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
                        return(LocalRedirect(returnUrl));
                    }
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            LoginProvider = info.LoginProvider;
            ReturnUrl     = returnUrl;
            return(Page());
        }
Ejemplo n.º 6
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            if (ModelState.IsValid)
            {
                var user = new SynthbotUser {
                    UserName = Input.Email, Email = Input.Email
                };
                var result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { userId = user.Id, code = code },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                                                      $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                    await _signInManager.SignInAsync(user, isPersistent : false);

                    return(LocalRedirect(returnUrl));
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }
Ejemplo n.º 7
0
        public async Task <IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            if (remoteError != null)
            {
                ErrorMessage = $"Error from external provider: {remoteError}";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }
            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                ErrorMessage = "Error loading external login information.";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }

            // Sign in the user with this external login provider if the user already has a login.
            var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false, bypassTwoFactor : true);

            if (result.Succeeded)
            {
                await _signInManager.UpdateExternalAuthenticationTokensAsync(info);

                _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);

                // Update referral token
                var user = await _userManager.FindByLoginAsync(info.LoginProvider, info.ProviderKey);

                var referralToken = await _db.ReferralTokenReceipts.FindAsync(info.Principal.GetClaimValueFromType("ReferralTokenId"));

                if (referralToken != null)
                {
                    referralToken.SynthbotUserId = user.Id;
                    referralToken.Claimed        = true;
                    referralToken.ClaimedTS      = DateTime.UtcNow;
                    referralToken = await SendSignalRAuthReply(referralToken, AuthReplyMethod.Reauthenticated);

                    _db.ReferralTokenReceipts.Update(referralToken);
                    await _db.SaveChangesAsync();
                }

                return(LocalRedirect(returnUrl));
            }
            if (result.IsLockedOut)
            {
                return(RedirectToPage("./Lockout"));
            }
            else
            {
                // ReferralTokenId
                if (info.Principal.GetClaimFromType("ReferralTokenId") != null)
                {
                    // Get the referral token
                    var referralToken = await _db.ReferralTokenReceipts.FindAsync(info.Principal.GetClaimValueFromType("ReferralTokenId"));

                    // Create new user
                    var user = new SynthbotUser
                    {
                        UserName      = info.Principal.FindFirstValue(ClaimTypes.Email),
                        Email         = info.Principal.FindFirstValue(ClaimTypes.Email),
                        DiscordUserId = referralToken.ReferralUserId
                    };

                    var createResult = await _userManager.CreateAsync(user);

                    if (createResult.Succeeded)
                    {
                        // Update referral token receipt to show it's been claimed
                        referralToken.SynthbotUserId = (await _userManager.FindByEmailAsync(user.Email)).Id;
                        referralToken.Claimed        = true;
                        referralToken.ClaimedTS      = DateTime.UtcNow;

                        referralToken = await SendSignalRAuthReply(referralToken, AuthReplyMethod.InitialRegistration);

                        _db.ReferralTokenReceipts.Update(referralToken);
                        await _db.SaveChangesAsync();

                        // Add the external login provider information
                        var addLoginResult = await _userManager.AddLoginAsync(user, info);

                        await _signInManager.UpdateExternalAuthenticationTokensAsync(info);

                        if (addLoginResult.Succeeded)
                        {
                            await _signInManager.SignInAsync(user, isPersistent : false);

                            _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);

                            var discordUser = await _db.DiscordUsers
                                              .FirstOrDefaultAsync(u => u.DiscordUserId == user.DiscordUserId);

                            discordUser.UserStatus = DiscordUserStatus.RegisteredWithoutNotify;


                            await _db.SaveChangesAsync();

                            return(LocalRedirect(returnUrl));
                        }
                    }
                    foreach (var error in createResult.Errors)
                    {
                        ModelState.AddModelError(string.Empty, error.Description);
                    }
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Discord ID was missing. Ensure you logged in via the Discord PM Link");
                }

                ReturnUrl     = returnUrl;
                LoginProvider = info.LoginProvider;
                return(Page());
            }
        }
Ejemplo n.º 8
0
 public Task <SpotifyUserToken> GetTokenAsync(SynthbotUser user) => GetTokenAsync(user.Id);