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) }
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) } } }
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) } } }