public void TestRedireccionEnlaceSeguroIncorrecto()
        {
            DataIntegradorEntities db         = new DataIntegradorEntities();
            EnlaceSeguroController controller = new EnlaceSeguroController(db);

            CurrentUser.setCurrentUser("*****@*****.**", "Superusuario", "0000000001", "0000000001");

            // Permitir solamente a [email protected]
            string url = controller.ObtenerEnlaceSeguro("/Home/About/", "*****@*****.**");

            // Obtener el hash solamente, deshacerse de /EnlaceSeguro/RedireccionSegura?urlHash=
            string hash = url.Substring(url.LastIndexOf("=") + 1);

            var result = controller.RedireccionSegura(hash) as RedirectToRouteResult;

            // Eliminar las tuplas insertadas
            EnlaceSeguro es = db.EnlaceSeguro.Find(hash);

            if (es != null)
            {
                db.EnlaceSeguro.Remove(es);
                db.SaveChanges();
            }

            Assert.AreEqual("Index", result.RouteValues["action"]);
        }
예제 #2
0
        public void HomeReestablecerContrasenna()
        {
            //Arrange
            var adminContrasennaActual = "*****@*****.**";
            var adminCorreoActual      = "*****@*****.**";
            var pruebaContrasenna      = "nuevaContrasenna";

            DataIntegradorEntities db = new DataIntegradorEntities();
            EnlaceSeguroController enlaceController = new EnlaceSeguroController(db);
            var controller = HomeControllerAs("*****@*****.**", false);
            //CurrentUser.setCurrentUser("*****@*****.**", "Superusuario", "0000000001", "0000000001");

            string url1 = enlaceController.ObtenerEnlaceSeguroAnonimo("/Home/ReestablecerContrasenna/", usuario: adminCorreoActual, reestablecerContrasenna: true, usos: 2);

            // Obtener el hash solamente, deshacerse de /EnlaceSeguro/RedireccionSegura?urlHash=
            string hashObtenido = url1.Substring(url1.LastIndexOf("=") + 1);

            var result = controller.ReestablecerContrasenna(hashObtenido, adminContrasennaActual, adminContrasennaActual, false) as ViewResult;

            // Eliminar las tuplas insertadas
            EnlaceSeguro es1 = db.EnlaceSeguro.Find(hashObtenido);

            if (es1 != null)
            {
                db.EnlaceSeguro.Remove(es1);
                db.SaveChanges();
            }

            var resultadoObtenido = result.ViewBag.NotifyTitle;
            var resultadoEsperado = "Contraseña Cambiada";

            Assert.AreEqual(resultadoObtenido, resultadoEsperado);
        }
        public void TestObtenerEnlaceSeguroUnico()
        {
            DataIntegradorEntities db         = new DataIntegradorEntities();
            EnlaceSeguroController controller = new EnlaceSeguroController(db);

            CurrentUser.setCurrentUser("*****@*****.**", "Superusuario", "0000000001", "0000000001");

            string url1 = controller.ObtenerEnlaceSeguro("https://localhost:44334/Home/About/");
            string url2 = controller.ObtenerEnlaceSeguro("https://localhost:44334/Home/About/");

            // Obtener el hash solamente, deshacerse de /EnlaceSeguro/RedireccionSegura?urlHash=
            string hash1 = url1.Substring(url1.LastIndexOf("=") + 1);
            string hash2 = url2.Substring(url2.LastIndexOf("=") + 1);

            // Eliminar las tuplas insertadas
            EnlaceSeguro es1 = db.EnlaceSeguro.Find(hash1);

            if (es1 != null)
            {
                db.EnlaceSeguro.Remove(es1);
                db.SaveChanges();
            }

            EnlaceSeguro es2 = db.EnlaceSeguro.Find(hash2);

            if (es2 != null)
            {
                db.EnlaceSeguro.Remove(es2);
                db.SaveChanges();
            }

            Assert.AreNotEqual(url1, url2);
        }
예제 #4
0
        private ActionResult Redirigir(string urlHash, bool anonimo = false)
        {
            // Busca tupla en la base de datos
            EnlaceSeguro enlaceSeguro = db.EnlaceSeguro.SingleOrDefault(u => u.Hash == urlHash);

            if (enlaceSeguro != null)
            {
                // Podría mejorarse para asegurarse de que la hora esté sincronizada con la base de datos
                DateTime momentoActual           = DateTime.Now;
                DateTime expira                  = (DateTime)enlaceSeguro.Expira;
                int      usos                    = enlaceSeguro.Usos;
                bool     reestablecerContrasenna = enlaceSeguro.ReestablecerContrasenna;
                int      fechaValida             = DateTime.Compare(momentoActual, expira);
                // Enlace válido
                if (fechaValida < 0)
                {
                    // no se utiliza "> 0" ya que se desea que -1 haga que el enlace no tenga limite de uso
                    if (usos != 0)
                    {
                        // Revisar usuario válido
                        if (!anonimo && enlaceSeguro.UsuarioAsociado != null)
                        {
                            if (CurrentUser.getUsername() == enlaceSeguro.UsuarioAsociado)
                            {
                                //se envia a borrar el enlace, esto decrementa su valor de "usos" disponibles.
                                db.EnlaceSeguro.Remove(enlaceSeguro);
                                db.SaveChanges();
                                return(Redirect(enlaceSeguro.UrlReal));
                            }
                        }
                        // Enlace no relacionado a un solo usuario o anónimos permitidos
                        else
                        {
                            if (!reestablecerContrasenna)
                            {
                                //se envia a borrar el enlace, esto decrementa su valor de "usos" disponibles.
                                db.EnlaceSeguro.Remove(enlaceSeguro);
                                db.SaveChanges();
                                return(Redirect(enlaceSeguro.UrlReal));
                            }
                            else
                            //Los enlaces seguros para reestablecer una contraseña se comportan de una manera diferente
                            //y se manejan en el controlador de Home, en "ReestablecerContrasenna".
                            {
                                //se envia a borrar el enlace, esto decrementa su valor de "usos" disponibles.
                                db.EnlaceSeguro.Remove(enlaceSeguro);
                                db.SaveChanges();
                                return(RedirectToAction("ReestablecerContrasenna", "Home", new { enlaceSeguroHash = enlaceSeguro.Hash }));
                            }
                        }
                    }
                }
            }
            TempData["alertmessage"] = "Enlace no válido.";
            return(RedirectToAction("Index", "Home"));
        }