19923: Sanity check provided chunk prefix.
authorTom Clegg <tom@curii.com>
Fri, 27 Jan 2023 16:01:15 +0000 (11:01 -0500)
committerTom Clegg <tom@curii.com>
Fri, 27 Jan 2023 16:01:15 +0000 (11:01 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

services/keep-balance/balance.go
services/keep-balance/balance_run_test.go

index a0b888a51ff054d659d9a6d88dabecb224a8e538..ef15ea0704996927b5a6bbaa2b01ee8ec0520f6f 100644 (file)
@@ -275,6 +275,14 @@ func (bal *Balancer) CheckSanityEarly(c *arvados.Client) error {
                        return fmt.Errorf("config error: %s: proxy servers cannot be balanced", srv)
                }
        }
+       for _, c := range bal.ChunkPrefix {
+               if !strings.ContainsRune("0123456789abcdef", c) {
+                       return fmt.Errorf("invalid char %q in chunk prefix %q: only lowercase hex digits make sense", string(c), bal.ChunkPrefix)
+               }
+       }
+       if len(bal.ChunkPrefix) > 32 {
+               return fmt.Errorf("invalid chunk prefix %q: longer than a block hash", bal.ChunkPrefix)
+       }
 
        mountProblem := false
        type deviceMount struct {
index 5c9a648b746105ad75892f65c9e725effad51278..fb1c74d2fe4adfb178fcd1a44a2ceba3a0e1e4e9 100644 (file)
@@ -450,6 +450,37 @@ func (s *runSuite) TestRefuseNonAdmin(c *check.C) {
        c.Check(pullReqs.Count(), check.Equals, 0)
 }
 
+func (s *runSuite) TestInvalidChunkPrefix(c *check.C) {
+       for _, trial := range []struct {
+               prefix string
+               errRe  string
+       }{
+               {"123ABC", "invalid char \"A\" in chunk prefix.*"},
+               {"123xyz", "invalid char \"x\" in chunk prefix.*"},
+               {"123456789012345678901234567890123", "invalid chunk prefix .* longer than a block hash"},
+       } {
+               s.SetUpTest(c)
+               c.Logf("trying invalid prefix %q", trial.prefix)
+               opts := RunOptions{
+                       CommitPulls: true,
+                       CommitTrash: true,
+                       ChunkPrefix: trial.prefix,
+                       Logger:      ctxlog.TestLogger(c),
+               }
+               s.stub.serveCurrentUserAdmin()
+               s.stub.serveFooBarFileCollections()
+               s.stub.serveKeepServices(stubServices)
+               s.stub.serveKeepstoreMounts()
+               trashReqs := s.stub.serveKeepstoreTrash()
+               pullReqs := s.stub.serveKeepstorePull()
+               srv := s.newServer(&opts)
+               _, err := srv.runOnce(context.Background())
+               c.Check(err, check.ErrorMatches, trial.errRe)
+               c.Check(trashReqs.Count(), check.Equals, 0)
+               c.Check(pullReqs.Count(), check.Equals, 0)
+       }
+}
+
 func (s *runSuite) TestRefuseSameDeviceDifferentVolumes(c *check.C) {
        opts := RunOptions{
                CommitPulls: true,