예제 #1
1
func Acceso(w http.ResponseWriter, r *http.Request) {
	c := appengine.NewContext(r)
	var st sess.Sess
	if _, ok := sess.IsSess(w, r, c); !ok {
		//fmt.Fprintf(w, "u:%s, p:%s", r.FormValue("u"), r.FormValue("p"))
		if r.FormValue("u") != "" && r.FormValue("p") != "" {
			user := strings.TrimSpace(r.FormValue("u"))
			pass := strings.TrimSpace(r.FormValue("p"))
			/* validar usuario y pass */
			if model.ValidEmail.MatchString(user) && model.ValidPass.MatchString(pass) {
				q := datastore.NewQuery("Cta").Filter("Email =", user).Filter("Pass ="******"Status =", true)
				if count, _ := q.Count(c); count != 0 {
					for t := q.Run(c); ; {
						var g model.Cta
						key, err := t.Next(&g)
						if err == datastore.Done {
							break
						}
						// Coincide contraseña, se activa una sesión
						_, _, err = sess.SetSess(w, c, key, g.Email, g.Nombre)
						if err != nil {
							http.Error(w, err.Error(), http.StatusInternalServerError)
							return
						}

						// Redireccion
						http.Redirect(w, r, "/r/dash", http.StatusFound)
						return
					}
				}
			}
			st.User = r.FormValue("u")
			st.ErrMsg = "Usuario o contraseña incorrectos"
			st.ErrClass = "show"
		} else {
			st.User = r.FormValue("u")
			st.ErrMsg = "Proporcione usuario y contraseña"
			st.ErrClass = "show"
		}
	} else {
		// hay sesión
		http.Redirect(w, r, "/r/dash", http.StatusFound)
		return
	}
	tc := make(map[string]interface{})
	tc["Sess"] = st
	accesoErrorTpl.Execute(w, tc)
}
예제 #2
0
func pendienteVerifica(w http.ResponseWriter, r *http.Request) {
	c := appengine.NewContext(r)
	s, ok := sess.IsSess(w, r, c)
	if ok {
		http.Redirect(w, r, "/r/cta", http.StatusFound)
		return
	}
	fd, valid := ctaForm(w, r, s, true, registroTpl)
	if valid {
		u, err := model.GetCta(c, fd.Email)
		ctaFill(r, u)
		if err != nil {
			// No hay Cuenta registrada
			u.FechaHora = time.Now().Add(time.Duration(model.GMTADJ) * time.Second)
			u.Status = false
			u.CodigoCfm = "Verificar"

			// Generar código de confirmación distindo cada vez. Md5 del email + fecha-hora
			h := md5.New()
			io.WriteString(h, fmt.Sprintf("%s%s%s%s", time.Now().Add(time.Duration(model.GMTADJ)*time.Second), u.Email, u.Pass, model.RandId(12)))
			u.CodigoCfm = fmt.Sprintf("%x", h.Sum(nil))
		}

		u.FechaHora = time.Now().Add(time.Duration(model.GMTADJ) * time.Second)
		u.Status = true
		u.CodigoCfm = "Verificar"
		// Se agrega la cuenta sin activar para realizar el proceso de código de confirmación
		if u, err = model.PutCta(c, u); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}

		/* Prende la sesion */
		_, _, err = sess.SetSess(w, c, u.Key(c), u.Email, u.Nombre)

		// avisa del éxito independientemente del correo
		if err := activationMessageTpl.ExecuteTemplate(w, "verify", u); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
	} else {
		if err := activationMessageTpl.ExecuteTemplate(w, "codeerr", nil); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
	}
}
예제 #3
0
func ConfirmaCodigo(w http.ResponseWriter, r *http.Request) {
	c := appengine.NewContext(r)
	md5 := r.FormValue("m")
	key, _ := datastore.DecodeKey(r.FormValue("c"))
	var g model.Cta
	if err := datastore.Get(c, key, &g); err != nil {
		if err := activationMessageTpl.ExecuteTemplate(w, "codeerr", nil); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
		return
	}

	/* Se verifica el código de confirmación */
	if g.CodigoCfm == md5 && g.Status == false {
		// Si se confirma el md5 la cuenta admin se le asigna un folio y se activa el status
		if err := sharded_counter.Increment(c, "cuenta_admin"); err == nil {
			if folio, err := sharded_counter.Count(c, "cuenta_admin"); err == nil {
				g.Folio = folio
				g.Status = true
				g.CodigoCfm = "Confirmado"
				_, err := datastore.Put(c, key, &g)
				if err != nil {
					http.Error(w, err.Error(), http.StatusInternalServerError)
					return
				}
				/* Prende la sesion */
				_, _, err = sess.SetSess(w, c, key, g.Email, g.Nombre)
				if err != nil {
					http.Error(w, err.Error(), http.StatusInternalServerError)
					return
				}

				if MailServer == "gmail" {
					// Envia código activación
					var hbody bytes.Buffer
					var sender string
					if appengine.AppID(c) == "ebfmxorg" {
						sender = "El Buen Fin <*****@*****.**>"
					} else {
						sender = "El Buen Fin <*****@*****.**>"
					}
					if err := mailAvisoActivacionTpl.Execute(&hbody, g); err != nil {
						http.Error(w, err.Error(), http.StatusInternalServerError)
					}
					msg := &mail.Message{
						Sender:   sender,
						To:       []string{g.Email},
						Subject:  "Cuenta Activada / El Buen Fin en línea",
						HTMLBody: hbody.String(),
					}
					if err := mail.Send(c, msg); err != nil {
						// Problemas para enviar el correo NOK
						http.Error(w, err.Error(), http.StatusInternalServerError)
						http.Redirect(w, r, "/", http.StatusFound)
					}
					// avisa del éxito independientemente del correo
					if err := activationMessageTpl.ExecuteTemplate(w, "confirm", g); err != nil {
						http.Error(w, err.Error(), http.StatusInternalServerError)
					}
					return
				} else {
					client := urlfetch.Client(c)
					url := fmt.Sprintf("http://envia-m.mekate.com.mx/?Sender=%s&Tipo=Aviso&Email=%s&Nombre=%s&Pass=%s&AppId=ebfmxorg",
						"*****@*****.**",
						g.Email,
						url.QueryEscape(g.Nombre),
						url.QueryEscape(g.Pass))
					r1, err := client.Get(url)
					if err != nil {
						http.Error(w, err.Error(), http.StatusInternalServerError)
						return
					}

					if r1.StatusCode != 200 {
						http.Error(w, "Error de Transporte de Mail", http.StatusInternalServerError)
					}
					if err := activationMessageTpl.ExecuteTemplate(w, "confirm", g); err != nil {
						http.Error(w, err.Error(), http.StatusInternalServerError)
					}
					defer r1.Body.Close()
				}
			} else {
				// El Folio no es seguro, se deshecha la operación o se encola
				if err := activationMessageTpl.ExecuteTemplate(w, "codeerr", nil); err != nil {
					http.Error(w, err.Error(), http.StatusInternalServerError)
				}
				return
			}
		} else {
			// El Folio no es seguro, se deshecha la operación o se encola
			if err := activationMessageTpl.ExecuteTemplate(w, "codeerr", nil); err != nil {
				http.Error(w, err.Error(), http.StatusInternalServerError)
			}
			return
		}
	} else {
		if err := activationMessageTpl.ExecuteTemplate(w, "codeerr", nil); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
	}
}