@@ -786,41 +786,36 @@ func TestNewRequest_errorForNoTrailingSlash(t *testing.T) {
786786 }
787787}
788788
789- func TestUrlContainsDotDotPathSegment (t * testing.T ) {
789+ func TestCheckURLPathTraversal (t * testing.T ) {
790790 t .Parallel ()
791791 tests := []struct {
792792 input string
793- want bool
794- wantErr bool
793+ wantErr error
795794 }{
796- {"repos/o/r/contents/file.txt" , false , false },
797- {"repos/o/r/contents/dir/file.txt" , false , false },
798- {"repos/o/r/contents/file..txt" , false , false },
799- {"repos/o/r?q=a..b" , false , false },
800- {"repos/../admin/users" , true , false },
801- {"repos/x/../../../admin" , true , false },
802- {"../admin" , true , false },
803- {"repos/o/r/contents/.." , true , false },
804- {"repos/o/r/contents/../secrets" , true , false },
795+ {"repos/o/r/contents/file.txt" , nil },
796+ {"repos/o/r/contents/dir/file.txt" , nil },
797+ {"repos/o/r/contents/file..txt" , nil },
798+ {"repos/o/r?q=a..b" , nil },
799+ {"repos/../admin/users" , ErrPathForbidden },
800+ {"repos/x/../../../admin" , ErrPathForbidden },
801+ {"../admin" , ErrPathForbidden },
802+ {"repos/o/r/contents/.." , ErrPathForbidden },
803+ {"repos/o/r/contents/../secrets" , ErrPathForbidden },
805804 // Full URLs with scheme.
806- {"https://api.github.com/repos/../admin" , true , false },
807- {"https://api.github.com/repos/o/r/contents/file.txt" , false , false },
808- {"https://api.github.com/repos/o/r/contents/file..txt" , false , false },
805+ {"https://api.github.com/repos/../admin" , ErrPathForbidden },
806+ {"https://api.github.com/repos/o/r/contents/file.txt" , nil },
807+ {"https://api.github.com/repos/o/r/contents/file..txt" , nil },
809808 // URL with fragment.
810- {"repos/o/r/contents/file.txt#section" , false , false },
811- {"repos/../admin#frag" , true , false },
809+ {"repos/o/r/contents/file.txt#section" , nil },
810+ {"repos/../admin#frag" , ErrPathForbidden },
812811 // URL with userinfo.
813- {"https://user:pass@api.github.com/repos/../admin" , true , false },
814- {"https://user:pass@api.github.com/repos/o/r" , false , false },
812+ {"https://user:pass@api.github.com/repos/../admin" , ErrPathForbidden },
813+ {"https://user:pass@api.github.com/repos/o/r" , nil },
815814 }
816815 for _ , tt := range tests {
817- got , err := urlContainsDotDotPathSegment (tt .input )
818- if (err != nil ) != tt .wantErr {
819- t .Errorf ("urlContainsDotDotPathSegment(%q) error = %v, wantErr %v" , tt .input , err , tt .wantErr )
820- continue
821- }
822- if got != tt .want {
823- t .Errorf ("urlContainsDotDotPathSegment(%q) = %v, want %v" , tt .input , got , tt .want )
816+ err := checkURLPathTraversal (tt .input )
817+ if ! errors .Is (err , tt .wantErr ) {
818+ t .Errorf ("checkURLPathTraversal(%q) = %v, want %v" , tt .input , err , tt .wantErr )
824819 }
825820 }
826821}
0 commit comments