Commit 56da71bb authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #46844 from sttts/sttts-invalid-query-params

Automatic merge from submit-queue (batch tested with PRs 46972, 42829, 46799, 46802, 46844) apiserver: return BadRequest 400 for invalid query params Fixes https://github.com/kubernetes/kubernetes/issues/39730 Replaces #40773.
parents f842bb99 4846c0d1
...@@ -1157,6 +1157,52 @@ func TestList(t *testing.T) { ...@@ -1157,6 +1157,52 @@ func TestList(t *testing.T) {
} }
} }
func TestRequestsWithInvalidQuery(t *testing.T) {
storage := map[string]rest.Storage{}
storage["simple"] = &SimpleRESTStorage{expectedResourceNamespace: "default"}
storage["withoptions"] = GetWithOptionsRESTStorage{}
var handler = handleInternal(storage, admissionControl, selfLinker, nil)
server := httptest.NewServer(handler)
defer server.Close()
for i, test := range []struct {
postfix string
method string
}{
{"/simple?labelSelector=<invalid>", http.MethodGet},
{"/simple/foo?gracePeriodSeconds=<invalid>", http.MethodDelete},
// {"/simple?labelSelector=<value>", http.MethodDelete}, TODO: implement DeleteCollection in SimpleRESTStorage
// {"/simple/foo?export=<invalid>", http.MethodGet}, TODO: there is no invalid bool in conversion. Should we be more strict?
// {"/simple/foo?resourceVersion=<invalid>", http.MethodGet}, TODO: there is no invalid resourceVersion. Should we be more strict?
// {"/withoptions?labelSelector=<invalid>", http.MethodGet}, TODO: SimpleGetOptions is always valid. Add more validation that can fail.
} {
baseURL := server.URL + "/" + grouplessPrefix + "/" + grouplessGroupVersion.Version + "/namespaces/default"
url := baseURL + test.postfix
r, err := http.NewRequest(test.method, url, nil)
if err != nil {
t.Errorf("%d: unexpected error: %v", i, err)
continue
}
resp, err := http.DefaultClient.Do(r)
if err != nil {
t.Errorf("%d: unexpected error: %v", i, err)
continue
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusBadRequest {
t.Errorf("%d: unexpected status: %d from url %s, Expected: %d, %#v", i, resp.StatusCode, url, http.StatusBadRequest, resp)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
t.Errorf("%d: unexpected error: %v", i, err)
continue
}
t.Logf("%d: body: %s", i, string(body))
}
}
}
func TestLogs(t *testing.T) { func TestLogs(t *testing.T) {
handler := handle(map[string]rest.Storage{}) handler := handle(map[string]rest.Storage{})
server := httptest.NewServer(handler) server := httptest.NewServer(handler)
......
...@@ -155,6 +155,7 @@ func GetResource(r rest.Getter, e rest.Exporter, scope RequestScope) http.Handle ...@@ -155,6 +155,7 @@ func GetResource(r rest.Getter, e rest.Exporter, scope RequestScope) http.Handle
if values := req.URL.Query(); len(values) > 0 { if values := req.URL.Query(); len(values) > 0 {
exports := metav1.ExportOptions{} exports := metav1.ExportOptions{}
if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &exports); err != nil { if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &exports); err != nil {
err = errors.NewBadRequest(err.Error())
return nil, err return nil, err
} }
if exports.Export { if exports.Export {
...@@ -164,6 +165,7 @@ func GetResource(r rest.Getter, e rest.Exporter, scope RequestScope) http.Handle ...@@ -164,6 +165,7 @@ func GetResource(r rest.Getter, e rest.Exporter, scope RequestScope) http.Handle
return e.Export(ctx, name, exports) return e.Export(ctx, name, exports)
} }
if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &options); err != nil { if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &options); err != nil {
err = errors.NewBadRequest(err.Error())
return nil, err return nil, err
} }
} }
...@@ -181,6 +183,7 @@ func GetResourceWithOptions(r rest.GetterWithOptions, scope RequestScope, isSubr ...@@ -181,6 +183,7 @@ func GetResourceWithOptions(r rest.GetterWithOptions, scope RequestScope, isSubr
opts, subpath, subpathKey := r.NewGetOptions() opts, subpath, subpathKey := r.NewGetOptions()
trace.Step("About to process Get options") trace.Step("About to process Get options")
if err := getRequestOptions(req, scope, opts, subpath, subpathKey, isSubresource); err != nil { if err := getRequestOptions(req, scope, opts, subpath, subpathKey, isSubresource); err != nil {
err = errors.NewBadRequest(err.Error())
return nil, err return nil, err
} }
if trace != nil { if trace != nil {
...@@ -227,6 +230,7 @@ func ConnectResource(connecter rest.Connecter, scope RequestScope, admit admissi ...@@ -227,6 +230,7 @@ func ConnectResource(connecter rest.Connecter, scope RequestScope, admit admissi
ctx = request.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
opts, subpath, subpathKey := connecter.NewConnectOptions() opts, subpath, subpathKey := connecter.NewConnectOptions()
if err := getRequestOptions(req, scope, opts, subpath, subpathKey, isSubresource); err != nil { if err := getRequestOptions(req, scope, opts, subpath, subpathKey, isSubresource); err != nil {
err = errors.NewBadRequest(err.Error())
scope.err(err, w, req) scope.err(err, w, req)
return return
} }
...@@ -293,6 +297,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch ...@@ -293,6 +297,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch
opts := metainternalversion.ListOptions{} opts := metainternalversion.ListOptions{}
if err := metainternalversion.ParameterCodec.DecodeParameters(req.URL.Query(), scope.MetaGroupVersion, &opts); err != nil { if err := metainternalversion.ParameterCodec.DecodeParameters(req.URL.Query(), scope.MetaGroupVersion, &opts); err != nil {
err = errors.NewBadRequest(err.Error())
scope.err(err, w, req) scope.err(err, w, req)
return return
} }
...@@ -968,6 +973,7 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope RequestSco ...@@ -968,6 +973,7 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope RequestSco
} else { } else {
if values := req.URL.Query(); len(values) > 0 { if values := req.URL.Query(); len(values) > 0 {
if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, options); err != nil { if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, options); err != nil {
err = errors.NewBadRequest(err.Error())
scope.err(err, w, req) scope.err(err, w, req)
return return
} }
...@@ -1065,6 +1071,7 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco ...@@ -1065,6 +1071,7 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco
listOptions := metainternalversion.ListOptions{} listOptions := metainternalversion.ListOptions{}
if err := metainternalversion.ParameterCodec.DecodeParameters(req.URL.Query(), scope.MetaGroupVersion, &listOptions); err != nil { if err := metainternalversion.ParameterCodec.DecodeParameters(req.URL.Query(), scope.MetaGroupVersion, &listOptions); err != nil {
err = errors.NewBadRequest(err.Error())
scope.err(err, w, req) scope.err(err, w, req)
return return
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment