X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/5d00ecb0932f86e4d2aced3d9258b96522ef38bd..91f976b99d4e7f00d2c1fbfee75812c3b1b780c6:/services/keep-web/handler_test.go diff --git a/services/keep-web/handler_test.go b/services/keep-web/handler_test.go index 57ac2190c4..1d03b90a3a 100644 --- a/services/keep-web/handler_test.go +++ b/services/keep-web/handler_test.go @@ -1,6 +1,11 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + package main import ( + "fmt" "html" "io/ioutil" "net/http" @@ -19,7 +24,7 @@ var _ = check.Suite(&UnitSuite{}) type UnitSuite struct{} func (s *UnitSuite) TestCORSPreflight(c *check.C) { - h := handler{Config: &Config{}} + h := handler{Config: DefaultConfig()} u, _ := url.Parse("http://keep-web.example/c=" + arvadostest.FooCollection + "/foo") req := &http.Request{ Method: "OPTIONS", @@ -70,9 +75,9 @@ func (s *UnitSuite) TestInvalidUUID(c *check.C) { RequestURI: u.RequestURI(), } resp := httptest.NewRecorder() - h := handler{Config: &Config{ - AnonymousTokens: []string{arvadostest.AnonymousToken}, - }} + cfg := DefaultConfig() + cfg.AnonymousTokens = []string{arvadostest.AnonymousToken} + h := handler{Config: cfg} h.ServeHTTP(resp, req) c.Check(resp.Code, check.Equals, http.StatusNotFound) } @@ -479,3 +484,108 @@ func (s *IntegrationSuite) testVhostRedirectTokenToCookie(c *check.C, method, ho c.Check(resp.Header().Get("Location"), check.Equals, "") return resp } + +func (s *IntegrationSuite) TestDirectoryListing(c *check.C) { + s.testServer.Config.AttachmentOnlyHost = "download.example.com" + authHeader := http.Header{ + "Authorization": {"OAuth2 " + arvadostest.ActiveToken}, + } + for _, trial := range []struct { + uri string + header http.Header + expect []string + cutDirs int + }{ + { + uri: strings.Replace(arvadostest.FooAndBarFilesInDirPDH, "+", "-", -1) + ".example.com/", + header: authHeader, + expect: []string{"dir1/foo", "dir1/bar"}, + cutDirs: 0, + }, + { + uri: strings.Replace(arvadostest.FooAndBarFilesInDirPDH, "+", "-", -1) + ".example.com/dir1/", + header: authHeader, + expect: []string{"foo", "bar"}, + cutDirs: 0, + }, + { + uri: "download.example.com/collections/" + arvadostest.FooAndBarFilesInDirUUID + "/", + header: authHeader, + expect: []string{"dir1/foo", "dir1/bar"}, + cutDirs: 2, + }, + { + uri: "collections.example.com/collections/download/" + arvadostest.FooAndBarFilesInDirUUID + "/" + arvadostest.ActiveToken + "/", + header: nil, + expect: []string{"dir1/foo", "dir1/bar"}, + cutDirs: 4, + }, + { + uri: "collections.example.com/c=" + arvadostest.FooAndBarFilesInDirUUID + "/t=" + arvadostest.ActiveToken + "/", + header: nil, + expect: []string{"dir1/foo", "dir1/bar"}, + cutDirs: 2, + }, + { + uri: "download.example.com/c=" + arvadostest.FooAndBarFilesInDirUUID + "/dir1/", + header: authHeader, + expect: []string{"foo", "bar"}, + cutDirs: 1, + }, + { + uri: "download.example.com/c=" + arvadostest.FooAndBarFilesInDirUUID + "/_/dir1/", + header: authHeader, + expect: []string{"foo", "bar"}, + cutDirs: 2, + }, + { + uri: arvadostest.FooAndBarFilesInDirUUID + ".example.com/dir1?api_token=" + arvadostest.ActiveToken, + header: authHeader, + expect: []string{"foo", "bar"}, + cutDirs: 0, + }, + { + uri: "collections.example.com/c=" + arvadostest.FooAndBarFilesInDirUUID + "/theperthcountyconspiracydoesnotexist/", + header: authHeader, + expect: nil, + }, + } { + c.Logf("%q => %q", trial.uri, trial.expect) + resp := httptest.NewRecorder() + u := mustParseURL("//" + trial.uri) + req := &http.Request{ + Method: "GET", + Host: u.Host, + URL: u, + RequestURI: u.RequestURI(), + Header: trial.header, + } + s.testServer.Handler.ServeHTTP(resp, req) + var cookies []*http.Cookie + for resp.Code == http.StatusSeeOther { + u, _ := req.URL.Parse(resp.Header().Get("Location")) + req = &http.Request{ + Method: "GET", + Host: u.Host, + URL: u, + RequestURI: u.RequestURI(), + Header: http.Header{}, + } + cookies = append(cookies, (&http.Response{Header: resp.Header()}).Cookies()...) + for _, c := range cookies { + req.AddCookie(c) + } + resp = httptest.NewRecorder() + s.testServer.Handler.ServeHTTP(resp, req) + } + if trial.expect == nil { + c.Check(resp.Code, check.Equals, http.StatusNotFound) + } else { + c.Check(resp.Code, check.Equals, http.StatusOK) + for _, e := range trial.expect { + c.Check(resp.Body.String(), check.Matches, `(?ms).*href="`+e+`".*`) + } + c.Check(resp.Body.String(), check.Matches, `(?ms).*--cut-dirs=`+fmt.Sprintf("%d", trial.cutDirs)+` .*`) + } + } +}