github.com/aleksi/gonuts.io@v0.0.0-20130622121132-3b0f2d1999fb/app/gonuts/controllers/me.go (about) 1 package controllers 2 3 import ( 4 "appengine" 5 "appengine/datastore" 6 gaeuser "appengine/user" 7 "bytes" 8 "fmt" 9 "html/template" 10 "net/http" 11 "net/url" 12 13 "gonuts" 14 nutp "gonuts.io/AlekSi/nut" 15 ) 16 17 func myHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) { 18 d := make(ContentData) 19 u := gaeuser.Current(c) 20 21 if u == nil || u.ID == "" { 22 url, err := gaeuser.LoginURL(c, "/-/me") 23 gonuts.LogError(c, err) 24 d["LoginURL"] = url 25 d["OpenIDURL"] = "/-/me/openid" 26 } else { 27 user := new(gonuts.User) 28 err := datastore.Get(c, gonuts.UserKey(c, u), user) 29 if err == nil { 30 url, err := gaeuser.LogoutURL(c, "/") 31 gonuts.LogError(c, err) 32 d["LogoutURL"] = url 33 d["Identifier"] = user.Identifier() 34 d["Token"] = user.Token 35 d["GenerateURL"] = "/-/me/generate" 36 d["Vendors"] = user.Vendors 37 } else if err == datastore.ErrNoSuchEntity { 38 user = &gonuts.User{Id: u.ID, Email: u.Email, FederatedIdentity: u.FederatedIdentity} 39 url, err := gaeuser.LogoutURL(c, "/-/me") 40 gonuts.LogError(c, err) 41 d["LogoutURL"] = url 42 d["Identifier"] = user.Identifier() 43 d["RegisterURL"] = "/-/me/register" 44 } else { 45 panic(err) 46 } 47 } 48 49 var content bytes.Buffer 50 gonuts.PanicIfErr(Base.ExecuteTemplate(&content, "me.html", d)) 51 52 bd := BaseData{ 53 Tabtitle: "Me", 54 Title: "Me", 55 Content: template.HTML(content.String()), 56 } 57 gonuts.PanicIfErr(Base.Execute(w, &bd)) 58 } 59 60 func registerHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) { 61 u := gaeuser.Current(c) 62 if u != nil && u.ID != "" { 63 var err error 64 vendor := r.FormValue("vendor") 65 if !nutp.VendorRegexp.MatchString(vendor) { 66 err = fmt.Errorf("Vendor name should match %s.", nutp.VendorRegexp.String()) 67 WriteError(w, http.StatusBadRequest, err) 68 return 69 } 70 71 v := &gonuts.Vendor{Vendor: vendor} 72 user := &gonuts.User{Id: u.ID, Email: u.Email, FederatedIdentity: u.FederatedIdentity} 73 gonuts.PanicIfErr(user.GenerateToken()) 74 75 err = datastore.Get(c, gonuts.VendorKey(c, vendor), v) 76 if err != datastore.ErrNoSuchEntity { 77 if err == nil { 78 err = fmt.Errorf("Vendor name %q is already registered.", vendor) 79 WriteError(w, http.StatusForbidden, err) 80 return 81 } 82 83 gonuts.LogError(c, err) 84 WriteError(w, http.StatusInternalServerError, err) 85 return 86 } 87 88 err = datastore.Get(c, gonuts.UserKey(c, u), user) 89 if err != datastore.ErrNoSuchEntity { 90 gonuts.LogError(c, err) 91 WriteError(w, http.StatusInternalServerError, err) 92 return 93 } 94 95 c.Infof("Adding user %s (%s) to vendor %s.", user.Id, user.Identifier(), v.Vendor) 96 user.AddVendor(v) 97 _, err = datastore.Put(c, gonuts.VendorKey(c, vendor), v) 98 gonuts.PanicIfErr(err) 99 _, err = datastore.Put(c, gonuts.UserKey(c, u), user) 100 gonuts.PanicIfErr(err) 101 } 102 103 http.Redirect(w, r, "/-/me", http.StatusSeeOther) 104 } 105 106 func generateHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) { 107 u := gaeuser.Current(c) 108 if u != nil && u.ID != "" { 109 key := gonuts.UserKey(c, u) 110 user := gonuts.User{} 111 err := datastore.Get(c, key, &user) 112 if err == nil { 113 gonuts.PanicIfErr(user.GenerateToken()) 114 _, err = datastore.Put(c, key, &user) 115 } 116 gonuts.LogError(c, err) 117 } 118 http.Redirect(w, r, "/-/me", http.StatusSeeOther) 119 } 120 121 func openIdHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) { 122 u := gaeuser.Current(c) 123 if u != nil && u.ID != "" { 124 err := fmt.Errorf("This page is not supposed to be accessible by logged-in users") 125 WriteError(w, http.StatusForbidden, err) 126 return 127 } 128 129 provider := r.FormValue("provider") 130 if _, err := url.Parse(provider); err != nil { 131 err := fmt.Errorf("OpenID provider name should be a valid url") 132 WriteError(w, http.StatusBadRequest, err) 133 return 134 } 135 136 url, err := gaeuser.LoginURLFederated(c, "/-/me", provider) 137 if err != nil { 138 gonuts.LogError(c, err) 139 return 140 } 141 142 http.Redirect(w, r, url, http.StatusSeeOther) 143 }