diff --git a/cmd/neofs-rest-gw/integration_test.go b/cmd/neofs-rest-gw/integration_test.go index b6f8fe0..391c87b 100644 --- a/cmd/neofs-rest-gw/integration_test.go +++ b/cmd/neofs-rest-gw/integration_test.go @@ -89,7 +89,7 @@ func runLocalTests(ctx context.Context, t *testing.T, key *keys.PrivateKey) { func runTestInContainer(rootCtx context.Context, t *testing.T, key *keys.PrivateKey) { versions := []dockerImage{ - {image: "nspccdev/neofs-aio", version: "0.41.0"}, + {image: "nspccdev/neofs-aio", version: "0.42.1"}, } for _, version := range versions { @@ -150,9 +150,13 @@ func runTests(ctx context.Context, t *testing.T, key *keys.PrivateKey, node stri t.Run("rest new upload object", func(t *testing.T) { restNewObjectUpload(ctx, t, clientPool, cnrID, signer) }) t.Run("rest new upload object with bearer in cookie", func(t *testing.T) { restNewObjectUploadCookie(ctx, t, clientPool, cnrID, signer) }) - t.Run("rest new head object", func(t *testing.T) { restNewObjectHead(ctx, t, clientPool, &owner, cnrID, signer) }) - t.Run("rest new head by attribute", func(t *testing.T) { restNewObjectHeadByAttribute(ctx, t, clientPool, &owner, cnrID, signer) }) - t.Run("rest new get by attribute", func(t *testing.T) { restNewObjectGetByAttribute(ctx, t, clientPool, &owner, cnrID, signer) }) + t.Run("rest new upload object with wallet connect", func(t *testing.T) { restNewObjectUploadWC(ctx, t, clientPool, cnrID, signer) }) + t.Run("rest new head object", func(t *testing.T) { restNewObjectHead(ctx, t, clientPool, &owner, cnrID, signer, false) }) + t.Run("rest new head object with wallet connect", func(t *testing.T) { restNewObjectHead(ctx, t, clientPool, &owner, cnrID, signer, true) }) + t.Run("rest new head by attribute", func(t *testing.T) { restNewObjectHeadByAttribute(ctx, t, clientPool, &owner, cnrID, signer, false) }) + t.Run("rest new head by attribute with wallet connect", func(t *testing.T) { restNewObjectHeadByAttribute(ctx, t, clientPool, &owner, cnrID, signer, true) }) + t.Run("rest new get by attribute", func(t *testing.T) { restNewObjectGetByAttribute(ctx, t, clientPool, &owner, cnrID, signer, false) }) + t.Run("rest new get by attribute with wallet connect", func(t *testing.T) { restNewObjectGetByAttribute(ctx, t, clientPool, &owner, cnrID, signer, true) }) } func createDockerContainer(ctx context.Context, t *testing.T, image, version string) testcontainers.Container { @@ -1871,12 +1875,15 @@ func restObjectUploadInt(ctx context.Context, t *testing.T, clientPool *pool.Poo } func restNewObjectUpload(ctx context.Context, t *testing.T, clientPool *pool.Pool, cnrID cid.ID, signer user.Signer) { - restNewObjectUploadInt(ctx, t, clientPool, cnrID, signer, false) + restNewObjectUploadInt(ctx, t, clientPool, cnrID, signer, false, false) } func restNewObjectUploadCookie(ctx context.Context, t *testing.T, clientPool *pool.Pool, cnrID cid.ID, signer user.Signer) { - restNewObjectUploadInt(ctx, t, clientPool, cnrID, signer, true) + restNewObjectUploadInt(ctx, t, clientPool, cnrID, signer, true, false) } -func restNewObjectUploadInt(ctx context.Context, t *testing.T, clientPool *pool.Pool, cnrID cid.ID, signer user.Signer, cookie bool) { +func restNewObjectUploadWC(ctx context.Context, t *testing.T, clientPool *pool.Pool, cnrID cid.ID, signer user.Signer) { + restNewObjectUploadInt(ctx, t, clientPool, cnrID, signer, false, true) +} +func restNewObjectUploadInt(ctx context.Context, t *testing.T, clientPool *pool.Pool, cnrID cid.ID, signer user.Signer, cookie bool, walletConnect bool) { bt := apiserver.Bearer{ Object: []apiserver.Record{{ Operation: apiserver.OperationPUT, @@ -1897,15 +1904,15 @@ func restNewObjectUploadInt(ctx context.Context, t *testing.T, clientPool *pool. query := make(url.Values) query.Add(walletConnectQuery, strconv.FormatBool(useWalletConnect)) - // check that object bearer token is valid - request, err := http.NewRequest(http.MethodGet, testHost+"/v1/auth/bearer?"+query.Encode(), nil) - require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) resp := &apiserver.BinaryBearer{} - doRequest(t, httpClient, request, http.StatusOK, resp) - - actualTokenRaw, err := base64.StdEncoding.DecodeString(resp.Token) - require.NoError(t, err) + if !walletConnect { + request, err := http.NewRequest(http.MethodGet, testHost+"/v1/auth/bearer?"+query.Encode(), nil) + require.NoError(t, err) + prepareCommonHeaders(request.Header, bearerToken) + doRequest(t, httpClient, request, http.StatusOK, resp) + _, err = base64.StdEncoding.DecodeString(resp.Token) + require.NoError(t, err) + } content := "content of file" attributes := map[string]string{ @@ -1917,22 +1924,30 @@ func restNewObjectUploadInt(ctx context.Context, t *testing.T, clientPool *pool. attributesJSON, err := json.Marshal(attributes) require.NoError(t, err) + if !walletConnect { + // Change the query, we only need the `fullBearer` parameter here. + query = make(url.Values) + query.Add(fullBearerQuery, "true") + } body := bytes.NewBufferString(content) - request, err = http.NewRequest(http.MethodPost, testHost+"/v1/objects/"+cnrID.String(), body) + request, err := http.NewRequest(http.MethodPost, testHost+"/v1/objects/"+cnrID.String()+"?"+query.Encode(), body) require.NoError(t, err) - request.Header.Set("Content-Type", "text/plain") - request.Header.Set("X-Attributes", string(attributesJSON)) - if cookie { - request.Header.Add("Cookie", "Bearer="+base64.StdEncoding.EncodeToString(actualTokenRaw)+";") + if !walletConnect { + request.Header.Set("Content-Type", "text/plain") + if cookie { + request.Header.Add("Cookie", "Bearer="+resp.Token+";") + } else { + request.Header.Add("Authorization", "Bearer "+resp.Token) + } } else { - request.Header.Add("Authorization", "Bearer "+base64.StdEncoding.EncodeToString(actualTokenRaw)) + prepareCommonHeaders(request.Header, bearerToken) } + + request.Header.Set("X-Attributes", string(attributesJSON)) addr := &apiserver.AddressForUpload{} doRequest(t, httpClient, request, http.StatusOK, addr) - request.Header.Set("Content-Type", "text/plain") - var CID cid.ID err = CID.DecodeString(addr.ContainerId) require.NoError(t, err) @@ -1955,7 +1970,7 @@ func restNewObjectUploadInt(ctx context.Context, t *testing.T, clientPool *pool. } } -func restNewObjectHead(ctx context.Context, t *testing.T, p *pool.Pool, ownerID *user.ID, cnrID cid.ID, signer user.Signer) { +func restNewObjectHead(ctx context.Context, t *testing.T, p *pool.Pool, ownerID *user.ID, cnrID cid.ID, signer user.Signer, walletConnect bool) { bearer := apiserver.Bearer{ Object: []apiserver.Record{ { @@ -1987,11 +2002,13 @@ func restNewObjectHead(ctx context.Context, t *testing.T, p *pool.Pool, ownerID query := make(url.Values) query.Add(walletConnectQuery, strconv.FormatBool(useWalletConnect)) - request, err := http.NewRequest(http.MethodGet, testHost+"/v1/auth/bearer?"+query.Encode(), nil) - require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) resp := &apiserver.BinaryBearer{} - doRequest(t, httpClient, request, http.StatusOK, resp) + if !walletConnect { + request, err := http.NewRequest(http.MethodGet, testHost+"/v1/auth/bearer?"+query.Encode(), nil) + require.NoError(t, err) + prepareCommonHeaders(request.Header, bearerToken) + doRequest(t, httpClient, request, http.StatusOK, resp) + } var ( content = []byte("some content") @@ -2006,6 +2023,12 @@ func restNewObjectHead(ctx context.Context, t *testing.T, p *pool.Pool, ownerID } ) + if !walletConnect { + // Change the query, we only need the `fullBearer` parameter here. + query = make(url.Values) + query.Add(fullBearerQuery, "true") + } + t.Run("head", func(t *testing.T) { objID := createObject(ctx, t, p, ownerID, cnrID, attributes, content, signer) @@ -2013,10 +2036,14 @@ func restNewObjectHead(ctx context.Context, t *testing.T, p *pool.Pool, ownerID createTS, err := strconv.ParseInt(attrTS, 10, 64) require.NoError(t, err) - request, err = http.NewRequest(http.MethodHead, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_id/"+objID.EncodeToString()+"?"+query.Encode(), nil) + request, err := http.NewRequest(http.MethodHead, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_id/"+objID.EncodeToString()+"?"+query.Encode(), nil) require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) - request.Header.Set("Authorization", "Bearer "+resp.Token) + + if !walletConnect { + request.Header.Set("Authorization", "Bearer "+resp.Token) + } else { + prepareCommonHeaders(request.Header, bearerToken) + } headers, _ := doRequest(t, httpClient, request, http.StatusOK, nil) require.NotEmpty(t, headers) @@ -2066,10 +2093,14 @@ func restNewObjectHead(ctx context.Context, t *testing.T, p *pool.Pool, ownerID createTS, err := strconv.ParseInt(attrTS, 10, 64) require.NoError(t, err) - request, err = http.NewRequest(http.MethodHead, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_id/"+objID.EncodeToString()+"?"+query.Encode(), nil) + request, err := http.NewRequest(http.MethodHead, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_id/"+objID.EncodeToString()+"?"+query.Encode(), nil) require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) - request.Header.Set("Authorization", "Bearer "+resp.Token) + + if !walletConnect { + request.Header.Set("Authorization", "Bearer "+resp.Token) + } else { + prepareCommonHeaders(request.Header, bearerToken) + } headers, _ := doRequest(t, httpClient, request, http.StatusOK, nil) require.NotEmpty(t, headers) @@ -2110,7 +2141,7 @@ func restNewObjectHead(ctx context.Context, t *testing.T, p *pool.Pool, ownerID }) } -func restNewObjectHeadByAttribute(ctx context.Context, t *testing.T, p *pool.Pool, ownerID *user.ID, cnrID cid.ID, signer user.Signer) { +func restNewObjectHeadByAttribute(ctx context.Context, t *testing.T, p *pool.Pool, ownerID *user.ID, cnrID cid.ID, signer user.Signer, walletConnect bool) { bearer := apiserver.Bearer{ Object: []apiserver.Record{ { @@ -2151,15 +2182,17 @@ func restNewObjectHeadByAttribute(ctx context.Context, t *testing.T, p *pool.Poo query := make(url.Values) query.Add(walletConnectQuery, strconv.FormatBool(useWalletConnect)) - request, err := http.NewRequest(http.MethodGet, testHost+"/v1/auth/bearer?"+query.Encode(), nil) - require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) resp := &apiserver.BinaryBearer{} - doRequest(t, httpClient, request, http.StatusOK, resp) + if !walletConnect { + request, err := http.NewRequest(http.MethodGet, testHost+"/v1/auth/bearer?"+query.Encode(), nil) + require.NoError(t, err) + prepareCommonHeaders(request.Header, bearerToken) + doRequest(t, httpClient, request, http.StatusOK, resp) + } var ( content = []byte("some content") - fileNameAttr = "new-head-obj-by-attr-name-echo" + fileNameAttr = "new-head-obj-by-attr-name-" + strconv.FormatBool(walletConnect) attrKey = "soME-attribute" attrValue = "user value" attributes = map[string]string{ @@ -2169,6 +2202,11 @@ func restNewObjectHeadByAttribute(ctx context.Context, t *testing.T, p *pool.Poo } ) + if !walletConnect { + query = make(url.Values) + query.Add(fullBearerQuery, "true") + } + t.Run("head", func(t *testing.T) { objID := createObject(ctx, t, p, ownerID, cnrID, attributes, content, signer) @@ -2176,10 +2214,14 @@ func restNewObjectHeadByAttribute(ctx context.Context, t *testing.T, p *pool.Poo createTS, err := strconv.ParseInt(attrTS, 10, 64) require.NoError(t, err) - request, err = http.NewRequest(http.MethodHead, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_attribute/"+object.AttributeFileName+"/"+fileNameAttr+"?"+query.Encode(), nil) + request, err := http.NewRequest(http.MethodHead, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_attribute/"+object.AttributeFileName+"/"+fileNameAttr+"?"+query.Encode(), nil) require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) - request.Header.Set("Authorization", "Bearer "+resp.Token) + + if !walletConnect { + request.Header.Set("Authorization", "Bearer "+resp.Token) + } else { + prepareCommonHeaders(request.Header, bearerToken) + } headers, _ := doRequest(t, httpClient, request, http.StatusOK, nil) require.NotEmpty(t, headers) @@ -2229,10 +2271,14 @@ func restNewObjectHeadByAttribute(ctx context.Context, t *testing.T, p *pool.Poo createTS, err := strconv.ParseInt(attrTS, 10, 64) require.NoError(t, err) - request, err = http.NewRequest(http.MethodHead, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_attribute/"+object.AttributeFileName+"/"+multiSegmentName+"?"+query.Encode(), nil) + request, err := http.NewRequest(http.MethodHead, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_attribute/"+object.AttributeFileName+"/"+multiSegmentName+"?"+query.Encode(), nil) require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) - request.Header.Set("Authorization", "Bearer "+resp.Token) + + if !walletConnect { + request.Header.Set("Authorization", "Bearer "+resp.Token) + } else { + prepareCommonHeaders(request.Header, bearerToken) + } headers, _ := doRequest(t, httpClient, request, http.StatusOK, nil) require.NotEmpty(t, headers) @@ -2273,7 +2319,7 @@ func restNewObjectHeadByAttribute(ctx context.Context, t *testing.T, p *pool.Poo }) } -func restNewObjectGetByAttribute(ctx context.Context, t *testing.T, p *pool.Pool, ownerID *user.ID, cnrID cid.ID, signer user.Signer) { +func restNewObjectGetByAttribute(ctx context.Context, t *testing.T, p *pool.Pool, ownerID *user.ID, cnrID cid.ID, signer user.Signer, walletConnect bool) { bearer := apiserver.Bearer{ Object: []apiserver.Record{ { @@ -2305,15 +2351,17 @@ func restNewObjectGetByAttribute(ctx context.Context, t *testing.T, p *pool.Pool query := make(url.Values) query.Add(walletConnectQuery, strconv.FormatBool(useWalletConnect)) - request, err := http.NewRequest(http.MethodGet, testHost+"/v1/auth/bearer?"+query.Encode(), nil) - require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) resp := &apiserver.BinaryBearer{} - doRequest(t, httpClient, request, http.StatusOK, resp) + if !walletConnect { + request, err := http.NewRequest(http.MethodGet, testHost+"/v1/auth/bearer?"+query.Encode(), nil) + require.NoError(t, err) + prepareCommonHeaders(request.Header, bearerToken) + doRequest(t, httpClient, request, http.StatusOK, resp) + } var ( content = []byte("some content") - fileNameAttr = "new-get-obj-by-attr-name-echo" + fileNameAttr = "new-get-obj-by-attr-name-" + strconv.FormatBool(walletConnect) createTS = time.Now().Unix() attrKey = "user-attribute" attrValue = "user value" @@ -2327,10 +2375,20 @@ func restNewObjectGetByAttribute(ctx context.Context, t *testing.T, p *pool.Pool t.Run("get", func(t *testing.T) { objID := createObject(ctx, t, p, ownerID, cnrID, attributes, content, signer) - request, err = http.NewRequest(http.MethodGet, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_attribute/"+object.AttributeFileName+"/"+fileNameAttr+"?"+query.Encode(), nil) + if !walletConnect { + // Change the query, we only need the `fullBearer` parameter here. + query = make(url.Values) + query.Add(fullBearerQuery, "true") + } + + request, err := http.NewRequest(http.MethodGet, testHost+"/v1/objects/"+cnrID.EncodeToString()+"/by_attribute/"+object.AttributeFileName+"/"+fileNameAttr+"?"+query.Encode(), nil) require.NoError(t, err) - prepareCommonHeaders(request.Header, bearerToken) - request.Header.Set("Authorization", "Bearer "+resp.Token) + + if !walletConnect { + request.Header.Set("Authorization", "Bearer "+resp.Token) + } else { + prepareCommonHeaders(request.Header, bearerToken) + } headers, rawPayload := doRequest(t, httpClient, request, http.StatusOK, nil) require.NotEmpty(t, headers) diff --git a/handlers/apiserver/rest-server.gen.go b/handlers/apiserver/rest-server.gen.go index df264ab..bec7799 100644 --- a/handlers/apiserver/rest-server.gen.go +++ b/handlers/apiserver/rest-server.gen.go @@ -551,8 +551,35 @@ type PutObjectParams struct { XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` } +// NewOptionsUploadContainerObjectParams defines parameters for NewOptionsUploadContainerObject. +type NewOptionsUploadContainerObjectParams struct { + // WalletConnect Use wallet connect signature scheme or native NeoFS signature. + WalletConnect *SignatureScheme `form:"walletConnect,omitempty" json:"walletConnect,omitempty"` + + // FullBearer Provided bearer token is final or gate should assemble it using signature. + FullBearer *FullBearerToken `form:"fullBearer,omitempty" json:"fullBearer,omitempty"` + + // XBearerSignature Base64 encoded signature for bearer token. + XBearerSignature *SignatureParam `json:"X-Bearer-Signature,omitempty"` + + // XBearerSignatureKey Hex encoded the public part of the key that signed the bearer token. + XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` +} + // NewUploadContainerObjectParams defines parameters for NewUploadContainerObject. type NewUploadContainerObjectParams struct { + // WalletConnect Use wallet connect signature scheme or native NeoFS signature. + WalletConnect *SignatureScheme `form:"walletConnect,omitempty" json:"walletConnect,omitempty"` + + // FullBearer Provided bearer token is final or gate should assemble it using signature. + FullBearer *FullBearerToken `form:"fullBearer,omitempty" json:"fullBearer,omitempty"` + + // XBearerSignature Base64 encoded signature for bearer token. + XBearerSignature *SignatureParam `json:"X-Bearer-Signature,omitempty"` + + // XBearerSignatureKey Hex encoded the public part of the key that signed the bearer token. + XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` + // XAttributes All attributes are in a JSON-formatted map of key-value pairs, where the key is the // attribute name and the value is the attribute value. // You can also use the special attribute: @@ -581,26 +608,104 @@ type NewUploadContainerObjectParams struct { // NewGetByAttributeParams defines parameters for NewGetByAttribute. type NewGetByAttributeParams struct { + // WalletConnect Use wallet connect signature scheme or native NeoFS signature. + WalletConnect *SignatureScheme `form:"walletConnect,omitempty" json:"walletConnect,omitempty"` + + // FullBearer Provided bearer token is final or gate should assemble it using signature. + FullBearer *FullBearerToken `form:"fullBearer,omitempty" json:"fullBearer,omitempty"` + // Download Set the Content-Disposition header as attachment in response. This makes the browser to download object as file instead of showing it on the page. Download *string `form:"download,omitempty" json:"download,omitempty"` + + // XBearerSignature Base64 encoded signature for bearer token. + XBearerSignature *SignatureParam `json:"X-Bearer-Signature,omitempty"` + + // XBearerSignatureKey Hex encoded the public part of the key that signed the bearer token. + XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` } // NewHeadByAttributeParams defines parameters for NewHeadByAttribute. type NewHeadByAttributeParams struct { + // WalletConnect Use wallet connect signature scheme or native NeoFS signature. + WalletConnect *SignatureScheme `form:"walletConnect,omitempty" json:"walletConnect,omitempty"` + + // FullBearer Provided bearer token is final or gate should assemble it using signature. + FullBearer *FullBearerToken `form:"fullBearer,omitempty" json:"fullBearer,omitempty"` + // Download Set the Content-Disposition header as attachment in response. This makes the browser to download object as file instead of showing it on the page. Download *string `form:"download,omitempty" json:"download,omitempty"` + + // XBearerSignature Base64 encoded signature for bearer token. + XBearerSignature *SignatureParam `json:"X-Bearer-Signature,omitempty"` + + // XBearerSignatureKey Hex encoded the public part of the key that signed the bearer token. + XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` +} + +// NewOptionsByAttributeParams defines parameters for NewOptionsByAttribute. +type NewOptionsByAttributeParams struct { + // WalletConnect Use wallet connect signature scheme or native NeoFS signature. + WalletConnect *SignatureScheme `form:"walletConnect,omitempty" json:"walletConnect,omitempty"` + + // FullBearer Provided bearer token is final or gate should assemble it using signature. + FullBearer *FullBearerToken `form:"fullBearer,omitempty" json:"fullBearer,omitempty"` + + // XBearerSignature Base64 encoded signature for bearer token. + XBearerSignature *SignatureParam `json:"X-Bearer-Signature,omitempty"` + + // XBearerSignatureKey Hex encoded the public part of the key that signed the bearer token. + XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` } // NewGetContainerObjectParams defines parameters for NewGetContainerObject. type NewGetContainerObjectParams struct { + // WalletConnect Use wallet connect signature scheme or native NeoFS signature. + WalletConnect *SignatureScheme `form:"walletConnect,omitempty" json:"walletConnect,omitempty"` + + // FullBearer Provided bearer token is final or gate should assemble it using signature. + FullBearer *FullBearerToken `form:"fullBearer,omitempty" json:"fullBearer,omitempty"` + // Download Set the Content-Disposition header as attachment in response. This make the browser to download object as file instead of showing it on the page. Download *string `form:"download,omitempty" json:"download,omitempty"` + + // XBearerSignature Base64 encoded signature for bearer token. + XBearerSignature *SignatureParam `json:"X-Bearer-Signature,omitempty"` + + // XBearerSignatureKey Hex encoded the public part of the key that signed the bearer token. + XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` } // NewHeadContainerObjectParams defines parameters for NewHeadContainerObject. type NewHeadContainerObjectParams struct { + // WalletConnect Use wallet connect signature scheme or native NeoFS signature. + WalletConnect *SignatureScheme `form:"walletConnect,omitempty" json:"walletConnect,omitempty"` + + // FullBearer Provided bearer token is final or gate should assemble it using signature. + FullBearer *FullBearerToken `form:"fullBearer,omitempty" json:"fullBearer,omitempty"` + // Download Set the Content-Disposition header as attachment in response. This make the browser to download object as file instead of showing it on the page. Download *string `form:"download,omitempty" json:"download,omitempty"` + + // XBearerSignature Base64 encoded signature for bearer token. + XBearerSignature *SignatureParam `json:"X-Bearer-Signature,omitempty"` + + // XBearerSignatureKey Hex encoded the public part of the key that signed the bearer token. + XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` +} + +// NewOptionsContainerObjectParams defines parameters for NewOptionsContainerObject. +type NewOptionsContainerObjectParams struct { + // WalletConnect Use wallet connect signature scheme or native NeoFS signature. + WalletConnect *SignatureScheme `form:"walletConnect,omitempty" json:"walletConnect,omitempty"` + + // FullBearer Provided bearer token is final or gate should assemble it using signature. + FullBearer *FullBearerToken `form:"fullBearer,omitempty" json:"fullBearer,omitempty"` + + // XBearerSignature Base64 encoded signature for bearer token. + XBearerSignature *SignatureParam `json:"X-Bearer-Signature,omitempty"` + + // XBearerSignatureKey Hex encoded the public part of the key that signed the bearer token. + XBearerSignatureKey *SignatureKeyParam `json:"X-Bearer-Signature-Key,omitempty"` } // SearchObjectsParams defines parameters for SearchObjects. @@ -767,7 +872,7 @@ type ServerInterface interface { PutObject(ctx echo.Context, params PutObjectParams) error // (OPTIONS /objects/{containerId}) - NewOptionsUploadContainerObject(ctx echo.Context, containerId ContainerId) error + NewOptionsUploadContainerObject(ctx echo.Context, containerId ContainerId, params NewOptionsUploadContainerObjectParams) error // Upload object to NeoFS // (POST /objects/{containerId}) NewUploadContainerObject(ctx echo.Context, containerId ContainerId, params NewUploadContainerObjectParams) error @@ -779,7 +884,7 @@ type ServerInterface interface { NewHeadByAttribute(ctx echo.Context, containerId ContainerId, attrKey AttrKey, attrVal AttrVal, params NewHeadByAttributeParams) error // (OPTIONS /objects/{containerId}/by_attribute/{attrKey}/{attrVal}) - NewOptionsByAttribute(ctx echo.Context, containerId ContainerId, attrKey AttrKey, attrVal AttrVal) error + NewOptionsByAttribute(ctx echo.Context, containerId ContainerId, attrKey AttrKey, attrVal AttrVal, params NewOptionsByAttributeParams) error // Get object by container ID and object ID. Also, returns custom users' object attributes in header `X-Attributes`. It returns the MIME type based on headers or object contents, so the actual Content-Type can differ from the list in the "Response content type" section. // (GET /objects/{containerId}/by_id/{objectId}) NewGetContainerObject(ctx echo.Context, containerId ContainerId, objectId ObjectId, params NewGetContainerObjectParams) error @@ -788,7 +893,7 @@ type ServerInterface interface { NewHeadContainerObject(ctx echo.Context, containerId ContainerId, objectId ObjectId, params NewHeadContainerObjectParams) error // (OPTIONS /objects/{containerId}/by_id/{objectId}) - NewOptionsContainerObject(ctx echo.Context, containerId ContainerId, objectId ObjectId) error + NewOptionsContainerObject(ctx echo.Context, containerId ContainerId, objectId ObjectId, params NewOptionsContainerObjectParams) error // (OPTIONS /objects/{containerId}/search) OptionsObjectsSearch(ctx echo.Context, containerId string) error @@ -1589,8 +1694,56 @@ func (w *ServerInterfaceWrapper) NewOptionsUploadContainerObject(ctx echo.Contex return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter containerId: %s", err)) } + // Parameter object where we will unmarshal all parameters from the context + var params NewOptionsUploadContainerObjectParams + // ------------- Optional query parameter "walletConnect" ------------- + + err = runtime.BindQueryParameter("form", true, false, "walletConnect", ctx.QueryParams(), ¶ms.WalletConnect) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter walletConnect: %s", err)) + } + + // ------------- Optional query parameter "fullBearer" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fullBearer", ctx.QueryParams(), ¶ms.FullBearer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fullBearer: %s", err)) + } + + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Bearer-Signature" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature")]; found { + var XBearerSignature SignatureParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature", valueList[0], &XBearerSignature, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature: %s", err)) + } + + params.XBearerSignature = &XBearerSignature + } + // ------------- Optional header parameter "X-Bearer-Signature-Key" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature-Key")]; found { + var XBearerSignatureKey SignatureKeyParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature-Key, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature-Key", valueList[0], &XBearerSignatureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature-Key: %s", err)) + } + + params.XBearerSignatureKey = &XBearerSignatureKey + } + // Invoke the callback with all the unmarshaled arguments - err = w.Handler.NewOptionsUploadContainerObject(ctx, containerId) + err = w.Handler.NewOptionsUploadContainerObject(ctx, containerId, params) return err } @@ -1611,8 +1764,51 @@ func (w *ServerInterfaceWrapper) NewUploadContainerObject(ctx echo.Context) erro // Parameter object where we will unmarshal all parameters from the context var params NewUploadContainerObjectParams + // ------------- Optional query parameter "walletConnect" ------------- + + err = runtime.BindQueryParameter("form", true, false, "walletConnect", ctx.QueryParams(), ¶ms.WalletConnect) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter walletConnect: %s", err)) + } + + // ------------- Optional query parameter "fullBearer" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fullBearer", ctx.QueryParams(), ¶ms.FullBearer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fullBearer: %s", err)) + } headers := ctx.Request().Header + // ------------- Optional header parameter "X-Bearer-Signature" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature")]; found { + var XBearerSignature SignatureParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature", valueList[0], &XBearerSignature, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature: %s", err)) + } + + params.XBearerSignature = &XBearerSignature + } + // ------------- Optional header parameter "X-Bearer-Signature-Key" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature-Key")]; found { + var XBearerSignatureKey SignatureKeyParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature-Key, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature-Key", valueList[0], &XBearerSignatureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature-Key: %s", err)) + } + + params.XBearerSignatureKey = &XBearerSignatureKey + } // ------------- Optional header parameter "X-Attributes" ------------- if valueList, found := headers[http.CanonicalHeaderKey("X-Attributes")]; found { var XAttributes string @@ -1712,6 +1908,20 @@ func (w *ServerInterfaceWrapper) NewGetByAttribute(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params NewGetByAttributeParams + // ------------- Optional query parameter "walletConnect" ------------- + + err = runtime.BindQueryParameter("form", true, false, "walletConnect", ctx.QueryParams(), ¶ms.WalletConnect) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter walletConnect: %s", err)) + } + + // ------------- Optional query parameter "fullBearer" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fullBearer", ctx.QueryParams(), ¶ms.FullBearer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fullBearer: %s", err)) + } + // ------------- Optional query parameter "download" ------------- err = runtime.BindQueryParameter("form", true, false, "download", ctx.QueryParams(), ¶ms.Download) @@ -1719,6 +1929,38 @@ func (w *ServerInterfaceWrapper) NewGetByAttribute(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter download: %s", err)) } + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Bearer-Signature" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature")]; found { + var XBearerSignature SignatureParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature", valueList[0], &XBearerSignature, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature: %s", err)) + } + + params.XBearerSignature = &XBearerSignature + } + // ------------- Optional header parameter "X-Bearer-Signature-Key" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature-Key")]; found { + var XBearerSignatureKey SignatureKeyParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature-Key, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature-Key", valueList[0], &XBearerSignatureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature-Key: %s", err)) + } + + params.XBearerSignatureKey = &XBearerSignatureKey + } + // Invoke the callback with all the unmarshaled arguments err = w.Handler.NewGetByAttribute(ctx, containerId, attrKey, attrVal, params) return err @@ -1757,6 +1999,20 @@ func (w *ServerInterfaceWrapper) NewHeadByAttribute(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params NewHeadByAttributeParams + // ------------- Optional query parameter "walletConnect" ------------- + + err = runtime.BindQueryParameter("form", true, false, "walletConnect", ctx.QueryParams(), ¶ms.WalletConnect) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter walletConnect: %s", err)) + } + + // ------------- Optional query parameter "fullBearer" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fullBearer", ctx.QueryParams(), ¶ms.FullBearer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fullBearer: %s", err)) + } + // ------------- Optional query parameter "download" ------------- err = runtime.BindQueryParameter("form", true, false, "download", ctx.QueryParams(), ¶ms.Download) @@ -1764,6 +2020,38 @@ func (w *ServerInterfaceWrapper) NewHeadByAttribute(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter download: %s", err)) } + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Bearer-Signature" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature")]; found { + var XBearerSignature SignatureParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature", valueList[0], &XBearerSignature, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature: %s", err)) + } + + params.XBearerSignature = &XBearerSignature + } + // ------------- Optional header parameter "X-Bearer-Signature-Key" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature-Key")]; found { + var XBearerSignatureKey SignatureKeyParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature-Key, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature-Key", valueList[0], &XBearerSignatureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature-Key: %s", err)) + } + + params.XBearerSignatureKey = &XBearerSignatureKey + } + // Invoke the callback with all the unmarshaled arguments err = w.Handler.NewHeadByAttribute(ctx, containerId, attrKey, attrVal, params) return err @@ -1796,8 +2084,56 @@ func (w *ServerInterfaceWrapper) NewOptionsByAttribute(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter attrVal: %s", err)) } + // Parameter object where we will unmarshal all parameters from the context + var params NewOptionsByAttributeParams + // ------------- Optional query parameter "walletConnect" ------------- + + err = runtime.BindQueryParameter("form", true, false, "walletConnect", ctx.QueryParams(), ¶ms.WalletConnect) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter walletConnect: %s", err)) + } + + // ------------- Optional query parameter "fullBearer" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fullBearer", ctx.QueryParams(), ¶ms.FullBearer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fullBearer: %s", err)) + } + + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Bearer-Signature" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature")]; found { + var XBearerSignature SignatureParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature", valueList[0], &XBearerSignature, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature: %s", err)) + } + + params.XBearerSignature = &XBearerSignature + } + // ------------- Optional header parameter "X-Bearer-Signature-Key" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature-Key")]; found { + var XBearerSignatureKey SignatureKeyParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature-Key, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature-Key", valueList[0], &XBearerSignatureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature-Key: %s", err)) + } + + params.XBearerSignatureKey = &XBearerSignatureKey + } + // Invoke the callback with all the unmarshaled arguments - err = w.Handler.NewOptionsByAttribute(ctx, containerId, attrKey, attrVal) + err = w.Handler.NewOptionsByAttribute(ctx, containerId, attrKey, attrVal, params) return err } @@ -1826,6 +2162,20 @@ func (w *ServerInterfaceWrapper) NewGetContainerObject(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params NewGetContainerObjectParams + // ------------- Optional query parameter "walletConnect" ------------- + + err = runtime.BindQueryParameter("form", true, false, "walletConnect", ctx.QueryParams(), ¶ms.WalletConnect) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter walletConnect: %s", err)) + } + + // ------------- Optional query parameter "fullBearer" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fullBearer", ctx.QueryParams(), ¶ms.FullBearer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fullBearer: %s", err)) + } + // ------------- Optional query parameter "download" ------------- err = runtime.BindQueryParameter("form", true, false, "download", ctx.QueryParams(), ¶ms.Download) @@ -1833,6 +2183,38 @@ func (w *ServerInterfaceWrapper) NewGetContainerObject(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter download: %s", err)) } + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Bearer-Signature" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature")]; found { + var XBearerSignature SignatureParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature", valueList[0], &XBearerSignature, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature: %s", err)) + } + + params.XBearerSignature = &XBearerSignature + } + // ------------- Optional header parameter "X-Bearer-Signature-Key" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature-Key")]; found { + var XBearerSignatureKey SignatureKeyParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature-Key, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature-Key", valueList[0], &XBearerSignatureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature-Key: %s", err)) + } + + params.XBearerSignatureKey = &XBearerSignatureKey + } + // Invoke the callback with all the unmarshaled arguments err = w.Handler.NewGetContainerObject(ctx, containerId, objectId, params) return err @@ -1863,6 +2245,20 @@ func (w *ServerInterfaceWrapper) NewHeadContainerObject(ctx echo.Context) error // Parameter object where we will unmarshal all parameters from the context var params NewHeadContainerObjectParams + // ------------- Optional query parameter "walletConnect" ------------- + + err = runtime.BindQueryParameter("form", true, false, "walletConnect", ctx.QueryParams(), ¶ms.WalletConnect) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter walletConnect: %s", err)) + } + + // ------------- Optional query parameter "fullBearer" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fullBearer", ctx.QueryParams(), ¶ms.FullBearer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fullBearer: %s", err)) + } + // ------------- Optional query parameter "download" ------------- err = runtime.BindQueryParameter("form", true, false, "download", ctx.QueryParams(), ¶ms.Download) @@ -1870,6 +2266,38 @@ func (w *ServerInterfaceWrapper) NewHeadContainerObject(ctx echo.Context) error return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter download: %s", err)) } + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Bearer-Signature" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature")]; found { + var XBearerSignature SignatureParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature", valueList[0], &XBearerSignature, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature: %s", err)) + } + + params.XBearerSignature = &XBearerSignature + } + // ------------- Optional header parameter "X-Bearer-Signature-Key" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature-Key")]; found { + var XBearerSignatureKey SignatureKeyParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature-Key, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature-Key", valueList[0], &XBearerSignatureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature-Key: %s", err)) + } + + params.XBearerSignatureKey = &XBearerSignatureKey + } + // Invoke the callback with all the unmarshaled arguments err = w.Handler.NewHeadContainerObject(ctx, containerId, objectId, params) return err @@ -1894,8 +2322,56 @@ func (w *ServerInterfaceWrapper) NewOptionsContainerObject(ctx echo.Context) err return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter objectId: %s", err)) } + // Parameter object where we will unmarshal all parameters from the context + var params NewOptionsContainerObjectParams + // ------------- Optional query parameter "walletConnect" ------------- + + err = runtime.BindQueryParameter("form", true, false, "walletConnect", ctx.QueryParams(), ¶ms.WalletConnect) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter walletConnect: %s", err)) + } + + // ------------- Optional query parameter "fullBearer" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fullBearer", ctx.QueryParams(), ¶ms.FullBearer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fullBearer: %s", err)) + } + + headers := ctx.Request().Header + // ------------- Optional header parameter "X-Bearer-Signature" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature")]; found { + var XBearerSignature SignatureParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature", valueList[0], &XBearerSignature, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature: %s", err)) + } + + params.XBearerSignature = &XBearerSignature + } + // ------------- Optional header parameter "X-Bearer-Signature-Key" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("X-Bearer-Signature-Key")]; found { + var XBearerSignatureKey SignatureKeyParam + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for X-Bearer-Signature-Key, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "X-Bearer-Signature-Key", valueList[0], &XBearerSignatureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter X-Bearer-Signature-Key: %s", err)) + } + + params.XBearerSignatureKey = &XBearerSignatureKey + } + // Invoke the callback with all the unmarshaled arguments - err = w.Handler.NewOptionsContainerObject(ctx, containerId, objectId) + err = w.Handler.NewOptionsContainerObject(ctx, containerId, objectId, params) return err } @@ -2335,148 +2811,148 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "AAD//1b7aih00gAA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/handlers/newObjects.go b/handlers/newObjects.go index 5d3b322..c50c54c 100644 --- a/handlers/newObjects.go +++ b/handlers/newObjects.go @@ -20,11 +20,20 @@ import ( // NewUploadContainerObject handler that upload file as object with attributes to NeoFS. func (a *RestAPI) NewUploadContainerObject(ctx echo.Context, containerID apiserver.ContainerId, params apiserver.NewUploadContainerObjectParams) error { var ( - err error - addr oid.Address - btoken *bearer.Token + err error + addr oid.Address + btoken *bearer.Token + fullBearer apiserver.FullBearerToken + walletConnect apiserver.SignatureScheme ) + if params.FullBearer != nil { + fullBearer = *params.FullBearer + } + if params.WalletConnect != nil { + walletConnect = *params.WalletConnect + } + var idCnr cid.ID if err = idCnr.DecodeString(containerID); err != nil { resp := a.logAndGetErrorResponse("invalid container id", err) @@ -36,12 +45,10 @@ func (a *RestAPI) NewUploadContainerObject(ctx echo.Context, containerID apiserv return ctx.JSON(http.StatusBadRequest, util.NewErrorResponse(err)) } - if principal != "" { - btoken, err = getBearerTokenFromString(principal) - if err != nil { - resp := a.logAndGetErrorResponse("get bearer token", err) - return ctx.JSON(http.StatusBadRequest, resp) - } + btoken, err = getBearerToken(principal, params.XBearerSignature, params.XBearerSignatureKey, walletConnect, fullBearer) + if err != nil { + resp := a.logAndGetErrorResponse("invalid bearer token", err) + return ctx.JSON(http.StatusBadRequest, resp) } filtered, err := parseAndFilterAttributes(a.log, params.XAttributes) @@ -144,7 +151,24 @@ func (a *RestAPI) NewGetContainerObject(ctx echo.Context, containerID apiserver. return ctx.JSON(http.StatusBadRequest, resp) } - return a.getByAddress(ctx, addr, params.Download, principal, true) + var ( + fullBearer apiserver.FullBearerToken + walletConnect apiserver.SignatureScheme + ) + if params.FullBearer != nil { + fullBearer = *params.FullBearer + } + if params.WalletConnect != nil { + walletConnect = *params.WalletConnect + } + + btoken, err := getBearerToken(principal, params.XBearerSignature, params.XBearerSignatureKey, walletConnect, fullBearer) + if err != nil { + resp := a.logAndGetErrorResponse("get bearer token", err) + return ctx.JSON(http.StatusBadRequest, resp) + } + + return a.getByAddress(ctx, addr, params.Download, btoken, true) } // NewHeadContainerObject handler that returns object info (using container ID and object ID). @@ -161,7 +185,25 @@ func (a *RestAPI) NewHeadContainerObject(ctx echo.Context, containerID apiserver } ctx.Response().Header().Set(accessControlAllowOriginHeader, "*") - return a.headByAddress(ctx, addr, params.Download, principal, true) + + var ( + fullBearer apiserver.FullBearerToken + walletConnect apiserver.SignatureScheme + ) + if params.FullBearer != nil { + fullBearer = *params.FullBearer + } + if params.WalletConnect != nil { + walletConnect = *params.WalletConnect + } + + btoken, err := getBearerToken(principal, params.XBearerSignature, params.XBearerSignatureKey, walletConnect, fullBearer) + if err != nil { + resp := a.logAndGetErrorResponse("get bearer token", err) + return ctx.JSON(http.StatusBadRequest, resp) + } + + return a.headByAddress(ctx, addr, params.Download, btoken, true) } // NewGetByAttribute handler that returns object (payload and attributes) by a specific attribute. @@ -177,7 +219,24 @@ func (a *RestAPI) NewGetByAttribute(ctx echo.Context, containerID apiserver.Cont return ctx.JSON(http.StatusBadRequest, resp) } - res, err := a.search(ctx.Request().Context(), principal, cnrID, attrKey, attrVal, object.MatchStringEqual) + var ( + fullBearer apiserver.FullBearerToken + walletConnect apiserver.SignatureScheme + ) + if params.FullBearer != nil { + fullBearer = *params.FullBearer + } + if params.WalletConnect != nil { + walletConnect = *params.WalletConnect + } + + btoken, err := getBearerToken(principal, params.XBearerSignature, params.XBearerSignatureKey, walletConnect, fullBearer) + if err != nil { + resp := a.logAndGetErrorResponse("get bearer token", err) + return ctx.JSON(http.StatusBadRequest, resp) + } + + res, err := a.search(ctx.Request().Context(), btoken, cnrID, attrKey, attrVal, object.MatchStringEqual) if err != nil { resp := a.logAndGetErrorResponse("could not search for objects", err) return ctx.JSON(http.StatusNotFound, resp) @@ -207,7 +266,7 @@ func (a *RestAPI) NewGetByAttribute(ctx echo.Context, containerID apiserver.Cont addrObj.SetContainer(cnrID) addrObj.SetObject(buf[0]) - return a.getByAddress(ctx, addrObj, params.Download, principal, true) + return a.getByAddress(ctx, addrObj, params.Download, btoken, true) } // NewHeadByAttribute handler that returns object info (payload and attributes) by a specific attribute. @@ -223,7 +282,24 @@ func (a *RestAPI) NewHeadByAttribute(ctx echo.Context, containerID apiserver.Con return ctx.JSON(http.StatusBadRequest, resp) } - res, err := a.search(ctx.Request().Context(), principal, cnrID, attrKey, attrVal, object.MatchStringEqual) + var ( + fullBearer apiserver.FullBearerToken + walletConnect apiserver.SignatureScheme + ) + if params.FullBearer != nil { + fullBearer = *params.FullBearer + } + if params.WalletConnect != nil { + walletConnect = *params.WalletConnect + } + + btoken, err := getBearerToken(principal, params.XBearerSignature, params.XBearerSignatureKey, walletConnect, fullBearer) + if err != nil { + resp := a.logAndGetErrorResponse("get bearer token", err) + return ctx.JSON(http.StatusBadRequest, resp) + } + + res, err := a.search(ctx.Request().Context(), btoken, cnrID, attrKey, attrVal, object.MatchStringEqual) if err != nil { resp := a.logAndGetErrorResponse("could not search for objects", err) return ctx.JSON(http.StatusNotFound, resp) @@ -254,5 +330,6 @@ func (a *RestAPI) NewHeadByAttribute(ctx echo.Context, containerID apiserver.Con addrObj.SetObject(buf[0]) ctx.Response().Header().Set(accessControlAllowOriginHeader, "*") - return a.headByAddress(ctx, addrObj, params.Download, principal, true) + + return a.headByAddress(ctx, addrObj, params.Download, btoken, true) } diff --git a/handlers/objects.go b/handlers/objects.go index 458a396..45d32cd 100644 --- a/handlers/objects.go +++ b/handlers/objects.go @@ -399,18 +399,21 @@ func (a *RestAPI) GetContainerObject(ctx echo.Context, containerID apiserver.Con return ctx.JSON(http.StatusBadRequest, resp) } - return a.getByAddress(ctx, addr, params.Download, principal, false) -} - -// getByAddress returns object (using container ID and object ID). -func (a *RestAPI) getByAddress(ctx echo.Context, addr oid.Address, downloadParam *string, principal string, useJSON bool) error { - var prm client.PrmObjectGet + var btoken *bearer.Token if principal != "" { - btoken, err := getBearerTokenFromString(principal) + btoken, err = getBearerTokenFromString(principal) if err != nil { resp := a.logAndGetErrorResponse("get bearer token", err) return ctx.JSON(http.StatusBadRequest, resp) } + } + return a.getByAddress(ctx, addr, params.Download, btoken, false) +} + +// getByAddress returns object (using container ID and object ID). +func (a *RestAPI) getByAddress(ctx echo.Context, addr oid.Address, downloadParam *string, btoken *bearer.Token, useJSON bool) error { + var prm client.PrmObjectGet + if btoken != nil { attachBearer(&prm, btoken) } @@ -481,23 +484,23 @@ func (a *RestAPI) HeadContainerObject(ctx echo.Context, containerID apiserver.Co } ctx.Response().Header().Set(accessControlAllowOriginHeader, "*") - return a.headByAddress(ctx, addr, params.Download, principal, false) -} - -// headByAddress returns object info (using container ID and object ID). -func (a *RestAPI) headByAddress(ctx echo.Context, addr oid.Address, downloadParam *string, principal string, useJSON bool) error { - var ( - prm client.PrmObjectHead - btoken *bearer.Token - err error - ) + var btoken *bearer.Token if principal != "" { btoken, err = getBearerTokenFromString(principal) if err != nil { resp := a.logAndGetErrorResponse("get bearer token", err) return ctx.JSON(http.StatusBadRequest, resp) } + } + + return a.headByAddress(ctx, addr, params.Download, btoken, false) +} + +// headByAddress returns object info (using container ID and object ID). +func (a *RestAPI) headByAddress(ctx echo.Context, addr oid.Address, downloadParam *string, btoken *bearer.Token, useJSON bool) error { + var prm client.PrmObjectHead + if btoken != nil { attachBearer(&prm, btoken) } @@ -1050,7 +1053,16 @@ func (a *RestAPI) GetByAttribute(ctx echo.Context, containerID apiserver.Contain return ctx.JSON(http.StatusBadRequest, resp) } - res, err := a.search(ctx.Request().Context(), principal, cnrID, attrKey, attrVal, object.MatchStringEqual) + var btoken *bearer.Token + if principal != "" { + btoken, err = getBearerTokenFromString(principal) + if err != nil { + resp := a.logAndGetErrorResponse("get bearer token", err) + return ctx.JSON(http.StatusBadRequest, resp) + } + } + + res, err := a.search(ctx.Request().Context(), btoken, cnrID, attrKey, attrVal, object.MatchStringEqual) if err != nil { resp := a.logAndGetErrorResponse("could not search for objects", err) return ctx.JSON(http.StatusNotFound, resp) @@ -1080,7 +1092,7 @@ func (a *RestAPI) GetByAttribute(ctx echo.Context, containerID apiserver.Contain addrObj.SetContainer(cnrID) addrObj.SetObject(buf[0]) - return a.getByAddress(ctx, addrObj, params.Download, principal, false) + return a.getByAddress(ctx, addrObj, params.Download, btoken, false) } // HeadByAttribute handler that returns object info (payload and attributes) by a specific attribute. @@ -1096,7 +1108,16 @@ func (a *RestAPI) HeadByAttribute(ctx echo.Context, containerID apiserver.Contai return ctx.JSON(http.StatusBadRequest, resp) } - res, err := a.search(ctx.Request().Context(), principal, cnrID, attrKey, attrVal, object.MatchStringEqual) + var btoken *bearer.Token + if principal != "" { + btoken, err = getBearerTokenFromString(principal) + if err != nil { + resp := a.logAndGetErrorResponse("get bearer token", err) + return ctx.JSON(http.StatusBadRequest, resp) + } + } + + res, err := a.search(ctx.Request().Context(), btoken, cnrID, attrKey, attrVal, object.MatchStringEqual) if err != nil { resp := a.logAndGetErrorResponse("could not search for objects", err) return ctx.JSON(http.StatusNotFound, resp) @@ -1127,10 +1148,11 @@ func (a *RestAPI) HeadByAttribute(ctx echo.Context, containerID apiserver.Contai addrObj.SetObject(buf[0]) ctx.Response().Header().Set(accessControlAllowOriginHeader, "*") - return a.headByAddress(ctx, addrObj, params.Download, principal, false) + + return a.headByAddress(ctx, addrObj, params.Download, btoken, false) } -func (a *RestAPI) search(ctx context.Context, principal string, cid cid.ID, key, val string, op object.SearchMatchType) (*client.ObjectListReader, error) { +func (a *RestAPI) search(ctx context.Context, btoken *bearer.Token, cid cid.ID, key, val string, op object.SearchMatchType) (*client.ObjectListReader, error) { filters := object.NewSearchFilters() filters.AddRootFilter() filters.AddFilter(key, val, op) @@ -1138,11 +1160,7 @@ func (a *RestAPI) search(ctx context.Context, principal string, cid cid.ID, key, var prm client.PrmObjectSearch prm.SetFilters(filters) - if principal != "" { - btoken, err := getBearerTokenFromString(principal) - if err != nil { - return nil, err - } + if btoken != nil { attachBearer(&prm, btoken) } diff --git a/handlers/preflight.go b/handlers/preflight.go index e0dc993..4367144 100644 --- a/handlers/preflight.go +++ b/handlers/preflight.go @@ -9,8 +9,11 @@ import ( ) const ( - allOrigins = "*" - allowHeaders = "X-Bearer-For-All-Users, X-Bearer-Lifetime, X-Bearer-Owner-Id, X-Bearer-Signature, X-Bearer-Signature-Key, Content-Type, Authorization" + allOrigins = "*" + allowHeaders = "X-Bearer-For-All-Users, X-Bearer-Lifetime, X-Bearer-Owner-Id, " + + "X-Bearer-Signature, X-Bearer-Signature-Key, Content-Type, Authorization, " + + "X-Attribute-Filename, X-Attribute-Filepath, X-Attributes, " + + "X-Neofs-Expiration-RFC3339, X-Neofs-Expiration-Timestamp, X-Neofs-Expiration-Duration" allowUploadHeader = "*" methodGet = "GET" @@ -135,7 +138,7 @@ func (a *RestAPI) OptionsNetworkInfo(ctx echo.Context) error { } // NewOptionsUploadContainerObject handler for the upload object options request. -func (a *RestAPI) NewOptionsUploadContainerObject(ctx echo.Context, _ apiserver.ContainerId) error { +func (a *RestAPI) NewOptionsUploadContainerObject(ctx echo.Context, _ apiserver.ContainerId, _ apiserver.NewOptionsUploadContainerObjectParams) error { ctx.Response().Header().Set(accessControlAllowOriginHeader, allOrigins) ctx.Response().Header().Set(accessControlAllowHeadersHeader, allowUploadHeader) ctx.Response().Header().Set(accessControlAllowMethodsHeader, allowMethods(methodPost)) @@ -143,7 +146,7 @@ func (a *RestAPI) NewOptionsUploadContainerObject(ctx echo.Context, _ apiserver. } // NewOptionsContainerObject handler for the create object options request. -func (a *RestAPI) NewOptionsContainerObject(ctx echo.Context, _ apiserver.ContainerId, _ apiserver.ObjectId) error { +func (a *RestAPI) NewOptionsContainerObject(ctx echo.Context, _ apiserver.ContainerId, _ apiserver.ObjectId, _ apiserver.NewOptionsContainerObjectParams) error { ctx.Response().Header().Set(accessControlAllowOriginHeader, allOrigins) ctx.Response().Header().Set(accessControlAllowHeadersHeader, allowHeaders) ctx.Response().Header().Set(accessControlAllowMethodsHeader, allowMethods(methodGet, methodHead)) @@ -151,7 +154,7 @@ func (a *RestAPI) NewOptionsContainerObject(ctx echo.Context, _ apiserver.Contai } // NewOptionsByAttribute handler for the find by attribute options request. -func (a *RestAPI) NewOptionsByAttribute(ctx echo.Context, _ apiserver.ContainerId, _ apiserver.AttrKey, _ apiserver.AttrVal) error { +func (a *RestAPI) NewOptionsByAttribute(ctx echo.Context, _ apiserver.ContainerId, _ apiserver.AttrKey, _ apiserver.AttrVal, _ apiserver.NewOptionsByAttributeParams) error { ctx.Response().Header().Set(accessControlAllowOriginHeader, allOrigins) ctx.Response().Header().Set(accessControlAllowHeadersHeader, allowHeaders) ctx.Response().Header().Set(accessControlAllowMethodsHeader, allowMethods(methodGet, methodHead)) diff --git a/spec/rest.yaml b/spec/rest.yaml index 732f506..3f4c052 100644 --- a/spec/rest.yaml +++ b/spec/rest.yaml @@ -761,6 +761,10 @@ paths: parameters: - $ref: '#/components/parameters/containerId' - $ref: '#/components/parameters/objectId' + - $ref: '#/components/parameters/signatureParam' + - $ref: '#/components/parameters/signatureKeyParam' + - $ref: '#/components/parameters/signatureScheme' + - $ref: '#/components/parameters/fullBearerToken' - name: download in: query description: Set the Content-Disposition header as attachment in response. @@ -793,6 +797,10 @@ paths: parameters: - $ref: '#/components/parameters/containerId' - $ref: '#/components/parameters/objectId' + - $ref: '#/components/parameters/signatureParam' + - $ref: '#/components/parameters/signatureKeyParam' + - $ref: '#/components/parameters/signatureScheme' + - $ref: '#/components/parameters/fullBearerToken' responses: "200": description: CORS @@ -815,6 +823,10 @@ paths: parameters: - $ref: '#/components/parameters/containerId' - $ref: '#/components/parameters/objectId' + - $ref: '#/components/parameters/signatureParam' + - $ref: '#/components/parameters/signatureKeyParam' + - $ref: '#/components/parameters/signatureScheme' + - $ref: '#/components/parameters/fullBearerToken' - name: download in: query description: Set the Content-Disposition header as attachment in response. @@ -924,6 +936,10 @@ paths: operationId: newUploadContainerObject parameters: - $ref: '#/components/parameters/containerId' + - $ref: '#/components/parameters/signatureParam' + - $ref: '#/components/parameters/signatureKeyParam' + - $ref: '#/components/parameters/signatureScheme' + - $ref: '#/components/parameters/fullBearerToken' - name: X-Attributes in: header description: | @@ -995,6 +1011,10 @@ paths: operationId: newOptionsUploadContainerObject parameters: - $ref: '#/components/parameters/containerId' + - $ref: '#/components/parameters/signatureParam' + - $ref: '#/components/parameters/signatureKeyParam' + - $ref: '#/components/parameters/signatureScheme' + - $ref: '#/components/parameters/fullBearerToken' responses: "200": description: CORS @@ -1121,6 +1141,10 @@ paths: - $ref: '#/components/parameters/containerId' - $ref: '#/components/parameters/attrKey' - $ref: '#/components/parameters/attrVal' + - $ref: '#/components/parameters/signatureParam' + - $ref: '#/components/parameters/signatureKeyParam' + - $ref: '#/components/parameters/signatureScheme' + - $ref: '#/components/parameters/fullBearerToken' - name: download in: query description: Set the Content-Disposition header as attachment in response. @@ -1154,6 +1178,10 @@ paths: - $ref: '#/components/parameters/containerId' - $ref: '#/components/parameters/attrKey' - $ref: '#/components/parameters/attrVal' + - $ref: '#/components/parameters/signatureParam' + - $ref: '#/components/parameters/signatureKeyParam' + - $ref: '#/components/parameters/signatureScheme' + - $ref: '#/components/parameters/fullBearerToken' responses: "200": description: CORS @@ -1179,6 +1207,10 @@ paths: - $ref: '#/components/parameters/containerId' - $ref: '#/components/parameters/attrKey' - $ref: '#/components/parameters/attrVal' + - $ref: '#/components/parameters/signatureParam' + - $ref: '#/components/parameters/signatureKeyParam' + - $ref: '#/components/parameters/signatureScheme' + - $ref: '#/components/parameters/fullBearerToken' - name: download in: query description: Set the Content-Disposition header as attachment in response.