예제 #1
0
        public JwtAuthController()
        {
            Get("/api/v1/login", _ => {
                var errors = ValidationProcessor.Process(Request, new IValidatorRule[] {
                    new MinLength("email", 4),
                    new MinLength("password", 4)
                }, true);
                if (errors.Count > 0)
                {
                    return(HttpResponse.Errors(errors));
                }

                var email = GetRequestStr("email").Replace(" ", "");

                var password = GetRequestStr("password");

                var user = UserRepository.FindByEmail(email);

                if (user == null)
                {
                    return(HttpResponse.Error(HttpStatusCode.NotFound, "User not found"));
                }

                if (Encryptor.Encrypt(password) != user.password)
                {
                    return(HttpResponse.Error(
                               new HttpError(HttpStatusCode.Unauthorized, "Your email / password combination is incorrect")
                               ));
                }

                if (!user.EmailConfirmed())
                {
                    return(HttpResponse.Error(HttpStatusCode.Forbidden, "You need to confirm your email"));
                }

                return(HttpResponse.Data(new JObject()
                {
                    ["token"] = Jwt.FromUserId(user.id)
                }));
            });

            Post("/api/v1/register", _ => {
                var errors = ValidationProcessor.Process(Request, new IValidatorRule[] {
                    new ShouldHaveParameters(new[] { "login", "email", "password" }),
                    new MinLength("login", 4),
                    new MinLength("email", 4),
                    new MinLength("password", 6),
                    new ShouldBeValidEmail(),
                }, true);
                if (errors.Count > 0)
                {
                    return(HttpResponse.Errors(errors));
                }

                var login = GetRequestStr("login").Replace(" ", "");
                var user  = UserRepository.FindByLogin(login);
                if (user != null)
                {
                    return(HttpResponse.Error(
                               HttpStatusCode.Forbidden,
                               "User with this login already exist"
                               ));
                }

                var email = GetRequestStr("email").Replace(" ", "");
                user      = UserRepository.FindByEmail(email);
                if (user != null)
                {
                    return(HttpResponse.Error(
                               HttpStatusCode.Forbidden,
                               "User with this login already exist"
                               ));
                }

                var registeredUser = UserRepository.FindOrCreateByEmailAndLogin(
                    email, login, GetRequestStr("password"),
                    UserRepository.FindByGuid(GetRequestStr("referral_key"))
                    );

                var registerQueueItem = RegistrationQueueItemRepository.Create(registeredUser);

                MailGunSender.QueueTemplate(
                    "confirm-your-email", registeredUser.email, "GitCom - you almost there!",
                    new[] {
                    new KeyValuePair <string, string>("confirmation_key", registerQueueItem.confirmation_key),
                }
                    );

                return(HttpResponse.Data(new JObject()
                {
                    ["response"] = "Please confirm your email"
                }));
            });

            Post("/api/v1/lazy_register", _ => {
                var errors = ValidationProcessor.Process(Request, new IValidatorRule[] {
                    new ShouldHaveParameters(new[] { "email" }),
                    new ShouldBeValidEmail(),
                }, true);
                if (errors.Count > 0)
                {
                    return(HttpResponse.Errors(errors));
                }

                var email = GetRequestStr("email").Replace(" ", "").ToLower();

                var existingUser = UserRepository.FindByEmail(email);

                if (existingUser != null)
                {
                    return(HttpResponse.Error(
                               HttpStatusCode.Forbidden,
                               "User with this email already exist, you need to log in"
                               ));
                }

                var login = email.Split("@")[0];

                var registeredUser = UserRepository.FindOrCreateByEmailAndLogin(
                    email, login, Rand.RandomString()
                    );

                var registerQueueItem = RegistrationQueueItemRepository.Create(registeredUser);

                MailGunSender.QueueTemplate(
                    "confirm-your-email", registeredUser.email, "GitCom - you almost there!",
                    new[] {
                    new KeyValuePair <string, string>("confirmation_key", registerQueueItem.confirmation_key),
                }
                    );


                return(HttpResponse.Data(new JObject()
                {
                    ["token"] = Jwt.FromUserId(registeredUser.id)
                }));
            });

            Post("/api/v1/register/confirm_email", _ => {
                var errors = ValidationProcessor.Process(Request, new IValidatorRule[] {
                    new ShouldHaveParameters(new[] { "confirmation_key" }),
                }, true);
                if (errors.Count > 0)
                {
                    return(HttpResponse.Errors(errors));
                }

                var queuedItem = RegistrationQueueItemRepository.FindBy(
                    "confirmation_key", GetRequestStr("confirmation_key")
                    );

                if (queuedItem == null)
                {
                    return(HttpResponse.Error(HttpStatusCode.NotFound, "Confirmation key is invalid"));
                }

                if (queuedItem.email_confirmed)
                {
                    return(HttpResponse.Error(HttpStatusCode.Forbidden, "Email is already confirmed"));
                }

                var me = UserRepository.Find(queuedItem.user_id);

                queuedItem.EmailConfirmed();

                MailGunSender.QueueTemplate(
                    "registration-complete", me.email, "GitCom - welcome!",
                    new[] {
                    new KeyValuePair <string, string>("login", me.login),
                }
                    );

                return(HttpResponse.Data(new JObject()
                {
                    ["token"] = Jwt.FromUserId(me.id)
                }));
            });
        }
예제 #2
0
        public bool EmailConfirmed()
        {
            var queuedItem = RegistrationQueueItemRepository.Find(this);

            return(queuedItem == null || queuedItem.email_confirmed);
        }