예제 #1
0
        public async Task <IActionResult> IndexConfirmationPost(SignUpConfirmationViewModel model)
        {
            // Ensure default shell, We cannot sign-up from tenants
            if (!_shellSettings.IsDefaultShell())
            {
                return(Unauthorized());
            }

            // Validate
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            if (string.IsNullOrEmpty(model.SessionId))
            {
                throw new ArgumentNullException(nameof(model.SessionId));
            }

            if (string.IsNullOrEmpty(model.SecurityToken))
            {
                throw new ArgumentNullException(nameof(model.SecurityToken));
            }

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            // Get the sign-up
            var signUp = await _signUpStore.GetBySessionIdAsync(model.SessionId);

            // Ensure we found the sign-up
            if (signUp == null)
            {
                return(NotFound());
            }

            // Validate token
            var validToken = signUp.SecurityToken.Equals(model.SecurityToken, StringComparison.OrdinalIgnoreCase);

            if (validToken)
            {
                // Reset security token & mark email as confirmed
                signUp.SecurityToken  = string.Empty;
                signUp.EmailConfirmed = true;
                await _signUpStore.UpdateAsync(signUp);

                // Redirect to sign-up confirmation
                return(RedirectToAction(nameof(SetUp), new RouteValueDictionary()
                {
                    ["sessionId"] = signUp.SessionId
                }));
            }

            // The confirmation code is incorrect
            ViewData.ModelState.AddModelError(string.Empty, "The confirmation code is incorrect. Please try again!");
            return(await IndexConfirmation(signUp.SessionId));
        }
예제 #2
0
        public async Task <ICommandResult <Models.SignUp> > CreateAsync(Models.SignUp model)
        {
            var result = new CommandResult <Models.SignUp>();

            // Validate
            if (model.Id > 0)
            {
                return(result.Failed(new CommandError($"{nameof(model.Id)} cannot be greater than zero when creating a sign-up")));
            }

            if (string.IsNullOrEmpty(model.Email))
            {
                return(result.Failed("An email address is required!"));
            }

            // Do we have an email
            if (!string.IsNullOrEmpty(model.Email))
            {
                // Validate email
                var validationResult = await _signUpValidator.ValidateEmailAsync(model.Email);

                if (!validationResult.Succeeded)
                {
                    return(result.Failed(validationResult.Errors.ToArray()));
                }
            }

            // Do we have a company name?
            if (!string.IsNullOrEmpty(model.CompanyName))
            {
                // Validate company name
                var validationResult = await _signUpValidator.ValidateCompanyNameAsync(model.CompanyName);

                if (!validationResult.Succeeded)
                {
                    return(result.Failed(validationResult.Errors.ToArray()));
                }

                // Create company name alias
                model.CompanyNameAlias = _aliasCreator.Create(model.CompanyName);
            }

            // Create security token
            if (string.IsNullOrEmpty(model.SecurityToken))
            {
                // Build simple security token
                model.SecurityToken = _keyGenerator.GenerateKey(o =>
                {
                    o.OnlyDigits = true;
                    o.MaxLength  = 6;
                });
            }

            // Invoke SignUpCreating subscriptions
            foreach (var handler in _broker.Pub <Models.SignUp>(this, "SignUpCreating"))
            {
                model = await handler.Invoke(new Message <Models.SignUp>(model, this));
            }

            var signUp = await _signUpStore.CreateAsync(model);

            if (signUp != null)
            {
                // Set unique session id, using primary key to ensure uniqueness
                if (string.IsNullOrEmpty(signUp.SessionId))
                {
                    // Set sessionId
                    signUp.SessionId = _keyGenerator.GenerateKey(o =>
                    {
                        o.OnlyDigits       = false;
                        o.UniqueIdentifier = signUp.Id.ToString();
                        o.MaxLength        = 150;
                    });

                    // Persist sessionId
                    var updatedSignUp = await _signUpStore.UpdateAsync(signUp);

                    if (updatedSignUp != null)
                    {
                        // Invoke SignUpCreated subscriptions
                        foreach (var handler in _broker.Pub <Models.SignUp>(this, "SignUpCreated"))
                        {
                            updatedSignUp = await handler.Invoke(new Message <Models.SignUp>(updatedSignUp, this));
                        }

                        // Return success
                        return(result.Success(updatedSignUp));
                    }
                }
            }

            return(result.Failed(new CommandError("An unknown error occurred whilst attempting to create a sign-up")));
        }