Merge "syncbase/permissions: verify that nested permissions work correctly"
diff --git a/services/syncbase/server/nosql/table.go b/services/syncbase/server/nosql/table.go
index 51b5158..27097b6 100644
--- a/services/syncbase/server/nosql/table.go
+++ b/services/syncbase/server/nosql/table.go
@@ -246,11 +246,11 @@
} else {
parent = prefixPerms.Parent
}
- stPrefix := t.prefixPermsKey(prefix)
- stPrefixLimit := stPrefix + util.PrefixRangeLimitSuffix
+ stPrefixStart := t.prefixPermsKey(prefix)
+ stPrefixLimit := t.prefixPermsKey(prefix) + util.PrefixRangeLimitSuffix
prefixPerms = stPrefixPerms{Parent: parent, Perms: perms}
// Put the (prefix, perms) pair to the database.
- if err := util.Put(ctx, tx, stPrefix, prefixPerms); err != nil {
+ if err := util.Put(ctx, tx, stPrefixStart, prefixPerms); err != nil {
return err
}
return util.Put(ctx, tx, stPrefixLimit, prefixPerms)
@@ -298,9 +298,9 @@
if err := t.updateParentRefs(ctx, tx, prefix, prefixPerms.Parent); err != nil {
return err
}
- stPrefix := []byte(t.prefixPermsKey(prefix))
- stPrefixLimit := append(stPrefix, util.PrefixRangeLimitSuffix...)
- if err := tx.Delete(stPrefix); err != nil {
+ stPrefixStart := []byte(t.prefixPermsKey(prefix))
+ stPrefixLimit := []byte(t.prefixPermsKey(prefix) + util.PrefixRangeLimitSuffix)
+ if err := tx.Delete(stPrefixStart); err != nil {
return err
}
return tx.Delete(stPrefixLimit)
@@ -350,23 +350,22 @@
// updateParentRefs updates the parent for all children of the given
// prefix to newParent.
func (t *tableReq) updateParentRefs(ctx *context.T, tx store.Transaction, prefix, newParent string) error {
- stPrefix := []byte(t.prefixPermsKey(prefix))
- stPrefixStart := append(stPrefix, 0)
- stPrefixLimit := append(stPrefix, util.PrefixRangeLimitSuffix...)
+ stPrefixStart := []byte(t.prefixPermsKey(prefix) + "\x00")
+ stPrefixLimit := []byte(t.prefixPermsKey(prefix) + util.PrefixRangeLimitSuffix)
it := tx.Scan(stPrefixStart, stPrefixLimit)
var key, value []byte
for it.Advance() {
key, value = it.Key(key), it.Value(value)
+ it.Cancel()
var prefixPerms stPrefixPerms
if err := vom.Decode(value, &prefixPerms); err != nil {
- it.Cancel()
return verror.New(verror.ErrInternal, ctx, err)
}
prefixPerms.Parent = newParent
if err := util.Put(ctx, tx, string(key), prefixPerms); err != nil {
- it.Cancel()
return err
}
+ it = tx.Scan([]byte(string(key)+util.PrefixRangeLimitSuffix), stPrefixLimit)
}
if err := it.Err(); err != nil {
return verror.New(verror.ErrInternal, ctx, err)