13111: Ignore projects and collections with "/" in name.
authorTom Clegg <tclegg@veritasgenetics.com>
Wed, 11 Apr 2018 13:07:09 +0000 (09:07 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Wed, 11 Apr 2018 23:50:04 +0000 (19:50 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/fs_base.go
sdk/go/arvados/fs_collection.go
sdk/go/arvados/fs_project.go
sdk/go/arvados/fs_project_test.go
sdk/go/arvados/group.go

index 45beff6cf3fb663a6b901b1c17bed3dc3d8102d5..3058a7609c6665dfd22c2ee6bb205685c97afe7d 100644 (file)
@@ -589,3 +589,7 @@ func rlookup(start inode, path string) (node inode, err error) {
        }
        return
 }
+
+func permittedName(name string) bool {
+       return name != "" && name != "." && name != ".." && !strings.Contains(name, "/")
+}
index 923615ba768c003f957c70623c747dbb459b40e2..7ce37aa24e7b35bfbabec9508af3b2e308d4cc76 100644 (file)
@@ -821,8 +821,8 @@ func (dn *dirnode) createFileAndParents(path string) (fn *filenode, err error) {
        var node inode = dn
        names := strings.Split(path, "/")
        basename := names[len(names)-1]
-       if basename == "" || basename == "." || basename == ".." {
-               err = fmt.Errorf("invalid filename")
+       if !permittedName(basename) {
+               err = fmt.Errorf("invalid file part %q in path %q", basename, path)
                return
        }
        for _, name := range names[:len(names)-1] {
index 071cc0af2e214d112603f7c95aa59eb267636f91..827a44b82224b84af67eb92329115d2c4256b1b5 100644 (file)
@@ -63,7 +63,7 @@ func (pn *projectnode) load() {
                }
                for _, i := range resp.Items {
                        coll := i
-                       if coll.Name == "" || coll.Name == "." || coll.Name == ".." {
+                       if !permittedName(coll.Name) {
                                continue
                        }
                        pn.inode.Child(coll.Name, func(inode) (inode, error) {
@@ -85,7 +85,7 @@ func (pn *projectnode) load() {
                        break
                }
                for _, group := range resp.Items {
-                       if group.Name == "" || group.Name == "." || group.Name == ".." {
+                       if !permittedName(group.Name) {
                                continue
                        }
                        pn.inode.Child(group.Name, func(inode) (inode, error) {
index 69bae8942fe587672b11595a6953773825819981..058eb408610db365fa2ff49932c3b643cf9634a2 100644 (file)
@@ -10,6 +10,7 @@ import (
        "io"
        "os"
        "path/filepath"
+       "strings"
 
        "git.curoverse.com/arvados.git/sdk/go/arvadostest"
        check "gopkg.in/check.v1"
@@ -89,6 +90,34 @@ func (s *SiteFSSuite) testHomeProject(c *check.C, path string) {
        }
 }
 
+func (s *SiteFSSuite) TestSlashInName(c *check.C) {
+       badCollection := Collection{
+               Name:      "bad/collection",
+               OwnerUUID: arvadostest.AProjectUUID,
+       }
+       err := s.client.RequestAndDecode(&badCollection, "POST", "arvados/v1/collections", s.client.UpdateBody(&badCollection), nil)
+       c.Assert(err, check.IsNil)
+       defer s.client.RequestAndDecode(nil, "DELETE", "arvados/v1/collections/"+badCollection.UUID, nil, nil)
+
+       badProject := Group{
+               Name:       "bad/project",
+               GroupClass: "project",
+               OwnerUUID:  arvadostest.AProjectUUID,
+       }
+       err = s.client.RequestAndDecode(&badProject, "POST", "arvados/v1/groups", s.client.UpdateBody(&badProject), nil)
+       c.Assert(err, check.IsNil)
+       defer s.client.RequestAndDecode(nil, "DELETE", "arvados/v1/groups/"+badProject.UUID, nil, nil)
+
+       dir, err := s.fs.Open("/users/active/A Project")
+       c.Check(err, check.IsNil)
+       fis, err := dir.Readdir(-1)
+       c.Check(err, check.IsNil)
+       for _, fi := range fis {
+               c.Logf("fi.Name() == %q", fi.Name())
+               c.Check(strings.Contains(fi.Name(), "/"), check.Equals, false)
+       }
+}
+
 func (s *SiteFSSuite) TestProjectUpdatedByOther(c *check.C) {
        s.fs.MountProject("home", "")
 
index b00809f9193a89ee8c5e91db3eeabd1a5a54ee28..6b5718a6c740e69b0fd5c4fc8f19106c7dddef11 100644 (file)
@@ -6,9 +6,10 @@ package arvados
 
 // Group is an arvados#group record
 type Group struct {
-       UUID      string `json:"uuid,omitempty"`
-       Name      string `json:"name,omitempty"`
-       OwnerUUID string `json:"owner_uuid,omitempty"`
+       UUID       string `json:"uuid,omitempty"`
+       Name       string `json:"name,omitempty"`
+       OwnerUUID  string `json:"owner_uuid,omitempty"`
+       GroupClass string `json:"group_class"`
 }
 
 // GroupList is an arvados#groupList resource.
@@ -18,3 +19,7 @@ type GroupList struct {
        Offset         int     `json:"offset"`
        Limit          int     `json:"limit"`
 }
+
+func (g Group) resourceName() string {
+       return "group"
+}