作者:rltoscan
项目:gomb
// API that updates the level of a permission. Only owners can elevate a user's
// permission. Requires "userKey" of the user whose permission to update, the
// "doorKey" of the involved door, and the desired "level" of the permission.
func updatePermission(
r *http.Request, c appengine.Context, u *user.User) (*[]Permission, error) {
uKey, err := ds.DecodeKey(r.FormValue("userKey"))
if err != nil {
return nil, ErrNoUserKey
}
var dKey *ds.Key
dKey, err = ds.DecodeKey(r.FormValue("doorKey"))
if err != nil {
return nil, ErrNoDoorKey
}
var level int
level, err = strconv.Atoi(r.FormValue("level"))
if err != nil {
return nil, Err{"'level' missing or invalid.", http.StatusBadRequest}
}
if level != LevelOpener {
return nil, Err{"Only updating a permission to opener is allowed.",
http.StatusForbidden}
}
// Verify caller is owner of the door.
p := Permission{}
cnt := 0
if cnt, err = ds.NewQuery("Permission").
Filter("userKey=", ds.NewKey(c, "User", u.ID, 0, nil)).
Filter("doorKey=", dKey).
Filter("level=", LevelOwner).
Count(c); err != nil {
return nil, err
}
if cnt == 0 {
return nil, Err{
"Either the door doesn't exist, or you are not an owner on it.",
http.StatusForbidden}
}
p = Permission{}
k, err := ds.NewQuery("Permission").
Filter("userKey=", uKey).
Filter("doorKey=", dKey).
Run(c).
Next(&p)
if err != nil {
if err == ds.Done {
err = Err{"User not has asked for permission on this door",
http.StatusForbidden}
}
return nil, err
}
p.Level = level
if _, err = ds.Put(c, k, &p); err != nil {
return nil, err
}
return &[]Permission{p}, nil
}
作者:mroli
项目:Curious-Meal
// handler to access pairings as children of a dish (parent)
func pairingHandler(c *context) {
// validate the dish key
parentKey, err := datastore.DecodeKey(getParentID(c.r))
check(err)
c.checkUser(parentKey)
kind := "Pairing"
handler := newDataHandler(c, kind, func() Ided { return &Pairing{} }, "")
// we don't use the standard handlers for PUT and DELETE
switch c.r.Method {
case "PUT":
// can't modify a pairing, only add/remove
check(ErrUnsupported)
case "DELETE":
// validate the id
id := getID(c.r)
key, err := datastore.DecodeKey(id)
check(err)
handler.checkUser(key)
// find the symetrical pairing so we can remove it too
pairing := Pairing{}
err = datastore.Get(c.c, key, &pairing)
check(err)
otherParent := pairing.Other
query := datastore.NewQuery(kind).Ancestor(otherParent).Filter("Other=", parentKey).Filter("Description=", pairing.Description).KeysOnly()
keys, err := query.GetAll(c.c, nil)
check(err)
// delete the entry given
handler.delete(key)
// delete the symetrical pairing(s)
datastore.DeleteMulti(handler.c, keys)
// flush the cache
clearPairingCache(c, otherParent, key)
default:
// use the default handler for "GET" and "POST"
handler.handleRequest(parentKey,
func(method string, key *datastore.Key, item Ided) {
switch method {
case "POST":
// after a "POST" to create a new item,
// add the symetrical entry for the other dish
pairing := item.(*Pairing)
// create the matching entry
other := pairing.Other
newPairKey := datastore.NewIncompleteKey(c.c, kind, other)
pairing.Other = parentKey
pairing.Id = ""
newPairKey, err := datastore.Put(c.c, newPairKey, pairing)
check(err)
clearPairingCache(c, other, nil)
}
})
}
}
作者:rltoscan
项目:gomb
// Revokes a user's permission to a door. Can only be done by the owner of the
// door or the user whose permission to revoke.
func deletePermission(
r *http.Request, c appengine.Context, u *user.User) (*[]Permission, error) {
uKey, err := ds.DecodeKey(r.FormValue("userKey"))
if err != nil {
return nil, ErrNoUserKey
}
var dKey *ds.Key
dKey, err = ds.DecodeKey(r.FormValue("doorKey"))
if err != nil {
return nil, ErrNoDoorKey
}
// Verify caller is user in question or door owner.
callerKey := ds.NewKey(c, "User", u.ID, 0, nil)
if callerKey != uKey {
cnt := 0
if cnt, err = ds.NewQuery("Permission").
Filter("userKey=", callerKey).
Filter("doorKey=", dKey).
Filter("level=", LevelOwner).
Count(c); err != nil {
return nil, err
}
if cnt == 0 {
return nil, Err{"Only door owner can delete others' permission.",
http.StatusForbidden}
}
}
p := Permission{}
k, err := ds.NewQuery("Permission").
Filter("userKey=", uKey).
Filter("doorKey=", dKey).
Run(c).
Next(&p)
if err != nil {
if err == ds.Done {
err = Err{"Permission does not exist", http.StatusForbidden}
}
return nil, err
}
if err = ds.Delete(c, k); err != nil {
return nil, err
}
return &[]Permission{}, nil
}
作者:offpat
项目:ironpuzzle
func ID(c appengine.Context, id string) *Team {
k, err := datastore.DecodeKey(id)
if err != nil {
return nil
}
return Key(c, k)
}
作者:liyu
项目:hom
// GetListHelper is a helper function that retrieves a list and it's
// items from the datastore. If a failure occured, false is returned
// and a response was returned to the request. This case should be
// terminal.
func GetListHelper(c appengine.Context, w http.ResponseWriter,
r *http.Request, key string) (*List, bool) {
// Decode the string version of the key.
k, err := datastore.DecodeKey(key)
if err != nil {
gorca.LogAndUnexpected(c, w, r, err)
return nil, false
}
// Get the list by key.
var l List
if err := datastore.Get(c, k, &l); err != nil {
gorca.LogAndNotFound(c, w, r, err)
return nil, false
}
// Get all of the items for the list.
var li ItemsList
q := datastore.NewQuery("Item").Ancestor(k).Order("Order")
if _, err := q.GetAll(c, &li); err != nil {
gorca.LogAndUnexpected(c, w, r, err)
return nil, false
}
l.Items = li
return &l, true
}
作者:yokan
项目:MemoryBattle
func Cardsetdetail(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
// get key
encodedKey := r.FormValue("key")
decodedKey, err := datastore.DecodeKey(encodedKey)
if err != nil {
err.Error()
}
// delete mode
if r.FormValue("action") == "delete" {
err = datastore.Delete(c, decodedKey)
if err != nil {
err.Error()
}
http.Redirect(w, r, "/cardsetlist", 303)
}
// get cardset
cardset := new(Cardset)
err = datastore.Get(c, decodedKey, cardset)
if err != nil {
err.Error()
}
// output html
material := make(map[string]string)
material["Name"] = cardset.Name
material["Key"] = encodedKey
Output(w, "page/cardset/cardsetdetail.html", material)
}
作者:javie
项目:gocon
// LoadConference loads a conference from the datastore given its unique id.
func LoadConference(ctx appengine.Context, id string) (*Conference, error) {
k, err := datastore.DecodeKey(id)
if err != nil {
return nil, fmt.Errorf("wrong key %q: %v", id, err)
}
return loadConference(ctx, k)
}
作者:r0lode
项目:dots-master-serve
func captchaImageHandler(response http.ResponseWriter, request *http.Request) {
context := appengine.NewContext(request)
if request.FormValue(KEY_CAPTCHA_ID) == "" {
http.Error(response, utils.MSG_WRONG_PARAMETERS, http.StatusBadRequest)
return
}
key, err := datastore.DecodeKey(request.FormValue(KEY_CAPTCHA_ID))
if err != nil {
log.Fatal(err)
}
captcha := new(model.Captcha)
err = datastore.Get(context, key, captcha)
if err != nil {
http.Error(response, ERR_CAPTCHA_NOT_FOUND, http.StatusNotFound)
return
}
if captcha.Viewed {
http.Error(response, ERR_CAPTCHA_VIEWED, http.StatusForbidden)
return
}
captcha.Viewed = true
key, err = datastore.Put(context, key, captcha)
if err != nil {
log.Fatal(err)
return
}
response.Header().Set("content-type", "image/png")
png.Encode(response, genCaptchaImage(captcha.Value))
}
作者:TimSylveste
项目:bitwr
// Marks a bid as placed. This is purely informational for the user.
func PlaceBid(c appengine.Context, bidId string) error {
var key *datastore.Key
if k, err := datastore.DecodeKey(bidId); err != nil {
return err
} else {
key = k
}
f := func(c appengine.Context) error {
var bid Bid
if err := datastore.Get(c, key, bidCodec{&bid}); err != nil {
return err
}
if bid.State != InQueue {
c.Infof("Not placing bid %v : State=%v", key, bid.State)
return nil
}
bid.State = Placed
if _, err := datastore.Put(c, key, bidCodec{&bid}); err != nil {
return err
}
return nil
}
return datastore.RunInTransaction(c, f, nil)
}
作者:junglesun
项目:Aliz
func deleteOneItem(rw http.ResponseWriter, req *http.Request, keyString string) {
// To access datastore and to log
c := appengine.NewContext(req)
c.Infof("deleteOneItem()")
// Result
r := http.StatusNoContent
defer func() {
// Return status. WriteHeader() must be called before call to Write
if r == http.StatusNoContent {
rw.WriteHeader(http.StatusNoContent)
} else {
http.Error(rw, http.StatusText(r), r)
}
}()
key, err := datastore.DecodeKey(keyString)
if err != nil {
c.Errorf("%s in decoding key string", err)
r = http.StatusBadRequest
return
}
// Delete the entity
if err := datastore.Delete(c, key); err != nil {
c.Errorf("%s, in deleting entity by key", err)
r = http.StatusNotFound
return
}
c.Infof("Key %s is deleted", keyString)
}
作者:matthewd
项目:powerplu
func DeliveryHandler(w http.ResponseWriter, r *http.Request) {
keyId := bone.GetValue(r, "key")
c := appengine.NewContext(r)
key, err := datastore.DecodeKey(keyId)
var dbRequest MainRequest
if err = datastore.Get(c, key, &dbRequest); err != nil {
c.Errorf("%s", err)
}
var status *postmates.Status
if dbRequest.Pm_delivery_id == "" {
status, err = postmates.RescueDelivery(c)
if status != nil {
dbRequest.Pm_delivery_id = status.ID
if _, err := datastore.Put(c, key, &dbRequest); err != nil {
c.Errorf("%s", err)
}
}
} else {
status, err = postmates.GetStatus(c, dbRequest.Pm_delivery_id)
if err != nil {
c.Errorf("%s", err)
}
}
// send back important info
err = json.NewEncoder(w).Encode(&status)
if err != nil {
c.Errorf("%s", err)
}
}
作者:sellwee
项目:TOGY-serve
//TimeOverrideSubmit handles saving of time overrides into Datastore.
func TimeOverrideSubmit(c util.Context) (err error) {
date, err := time.Parse(dateFormat, c.R.FormValue("date"))
if err != nil {
return
}
on, err := time.Parse(timeFormat, c.R.FormValue("on"))
if err != nil {
return
}
off, err := time.Parse(timeFormat, c.R.FormValue("off"))
if err != nil {
return
}
tc := timeConfig.New(util.NormalizeDate(date), util.NormalizeTime(on), util.NormalizeTime(off))
var k *datastore.Key
if _, ok := c.Vars["id"]; ok {
k, err = datastore.DecodeKey(c.Vars["id"])
if err != nil {
return
}
} else {
k = nil
}
tc.SetKey(k)
err = tc.Save(c)
if err != nil {
return
}
http.Redirect(c.W, c.R, "/admin/config", 303)
return
}
作者:mroli
项目:Curious-Meal
// handler to switch which library the user is looking at
func switchHandler(c *context) {
// verify the library key
desiredKey, err := datastore.DecodeKey(getID(c.r))
check(err)
if desiredKey.Kind() != "Library" {
check(ErrUnknownItem)
}
// start by getting the user's own library
lid, l, _ := getOwnLibrary(c.c, c.u)
if !lid.Equal(desiredKey) {
// user want's to see someone else's library, check if they have
// permission
perm := getLibPerm(c.c, c.uid, desiredKey)
if perm == nil {
check(ErrPermissionDenied)
return
}
} else {
// we use nil to indicate the user wants their own library
desiredKey = nil
}
// we verified that the desiredKey is a library the user has permission to access
// save their preference
if desiredKey != nil {
l.UserPreferredLibrary = desiredKey.Encode()
} else {
l.UserPreferredLibrary = ""
}
_, err = datastore.Put(c.c, lid, l)
check(err)
memcache.Gob.Set(c.c, &memcache.Item{Key: lid.Encode(), Object: l})
// redirect the user back to the index to use the updated library preference
indexHandler(c)
}
作者:couchbaselab
项目:statstor
func batchDestroy(c appengine.Context, w http.ResponseWriter, r *http.Request) {
keyStr := []string{}
z, err := gzip.NewReader(r.Body)
maybePanic(err)
d := json.NewDecoder(z)
maybePanic(d.Decode(&keyStr))
c.Infof("Got %v keys to destroy", len(keyStr))
keys := []*datastore.Key{}
for _, k := range keyStr {
key, err := datastore.DecodeKey(k)
if err != nil {
c.Errorf("Error decoding key: %v: %v", k, err)
http.Error(w, err.Error(), 500)
return
}
keys = append(keys, key)
}
err = datastore.DeleteMulti(c, keys)
if err != nil {
c.Infof("Error deleting things: %v", err)
http.Error(w, err.Error(), 500)
return
}
w.WriteHeader(204)
}
作者:clicker36
项目:ebfmex-pu
func IsSess(w http.ResponseWriter, r *http.Request, c appengine.Context) (Sess, bool) {
var s Sess
now := time.Now().Add(time.Duration(GMTADJ) * time.Second)
if ck, err := r.Cookie("ebfmex-pub-sessid-ua"); err == nil {
key, _ := datastore.DecodeKey(ck.Value)
if err := datastore.Get(c, key, &s); err != nil {
// no hay sesión
//http.Error(w, err.Error(), http.StatusInternalServerError)
} else {
/* se verifica el control de sesion */
if cr, err := r.Cookie("ebfmex-pub-sesscontrol-ua"); err == nil {
if s.Md5 != cr.Value {
// Md5 no coincide, intenta entrar con otra cookie
return s, false
} else if now.After(s.Expiration) {
// Sesión expirada
return s, false
}
// OK
// Hay sesión
return s, true
}
}
}
return s, false
}
作者:reedlabot
项目:scribblevin
func gameGet(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
id := r.FormValue("Id")
gameKey, err := datastore.DecodeKey(id)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
q := datastore.NewQuery("move").Ancestor(gameKey).Order("-Timestamp").Limit(1)
moves := make([]Move, 0, 1)
if _, err := q.GetAll(c, &moves); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
response := GameGetResponse{
Type: moves[0].Type,
Data: string(moves[0].Data),
}
data, err := json.Marshal(response)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Write(data)
}
作者:Mononof
项目:automatic-diar
func appendToEntry(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
args := r.URL.Query()
rawKey := args.Get("key")
key, err := datastore.DecodeKey(rawKey)
if err != nil {
c.Errorf("Failed to parse decode key '%v': %v", rawKey, err)
return
}
var e DiaryEntry
err = datastore.Get(c, key, &e)
if err != nil {
c.Errorf("failed to fetch entry: %v", err)
return
}
var doc bytes.Buffer
entryAppendTemplate.Execute(&doc, EntryContent{
Date: e.Date,
Content: strings.Replace(string(e.Content), "\n", "<br>\n\n", -1),
Key: rawKey,
})
w.Header().Set("Content-Type", "text/html; charset=utf-8")
baseTemplate.Execute(w, BodyContent{
Body: doc.String(),
Title: e.Date.Format("Monday, 2. Jan"),
})
}
作者:PhilBeaudoi
项目:dynstor
func saveParagraph(w http.ResponseWriter, r *http.Request) {
if !checkUser(w, r) {
return
}
ctx := appengine.NewContext(r)
dec := json.NewDecoder(r.Body)
var p Paragraph
if err := dec.Decode(&p); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
var err error
var key *datastore.Key
keyString := r.FormValue("key")
if keyString != "" {
key, err = datastore.DecodeKey(keyString)
} else {
key = datastore.NewIncompleteKey(ctx, "Paragraph", nil)
}
if err == nil {
key, err = datastore.Put(ctx, key, &p)
}
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-type", "text/plain; charset=utf-8")
fmt.Fprintf(w, "%s", key.Encode())
}
作者:nu
项目:escape3ds_angularj
/**
* データストアからゲームを削除する
* 削除を命令したユーザとゲームの所有者が一致していることを事前に確認すること
* この関数内ではチェックを行わない
* @param {string} encodedGameKey エンコード済みのゲームキー
*/
func (this *Model) deleteGame(encodedGameKey string) {
gameKey, err := datastore.DecodeKey(encodedGameKey)
check(this.c, err)
err = datastore.Delete(this.c, gameKey)
check(this.c, err)
}
作者:davelondo
项目:wordpodcas
func getAdminEditPage(c appengine.Context, path string) string {
u := user.Current(c)
if u == nil || !user.IsAdmin(c) {
url, _ := user.LoginURL(c, "/admin/edit")
return fmt.Sprintf(`<a href="%s">Sign in or register</a>`, url)
}
//homepage, _ := template.New("template").Funcs(template.FuncMap{"DateToStringAdmin": DateToStringAdmin}).ParseFiles("site/editpodcast.html")
homepage := template.Must(
template.
New("editpodcast.html").
Funcs(template.FuncMap{"DateToStringAdmin": DateToStringAdmin}).
ParseFiles("site/editpodcast.html"))
pA := strings.Split(path, `/`)
keyString := pA[3]
key, _ := datastore.DecodeKey(keyString)
var p Podcast
datastore.Get(c, key, &p)
p.Key = key.Encode()
//p.PubDateFormatted = getValidDate(time.SecondsToUTC(int64(p.PubDate) / 1000000))
html := bytes.NewBufferString("")
homepage.Execute(html, p)
return html.String()
}