Skip to content

Commit 6767bfa

Browse files
authored
add encoded filename as part of delete api url (#3141)
1 parent 607d94f commit 6767bfa

File tree

11 files changed

+65
-39
lines changed

11 files changed

+65
-39
lines changed

integration/user_api_bucket_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,9 @@ func DeleteObject(bucketName, path string, recursive, allVersions bool) (*http.R
423423
DELETE:
424424
{{baseUrl}}/buckets/bucketName/objects?path=Y2VzYXJpby50eHQ=&recursive=false&all_versions=false
425425
*/
426-
url := "http://localhost:9090/api/v1/buckets/" + bucketName + "/objects?path=" +
427-
path + "&recursive=" + strconv.FormatBool(recursive) + "&all_versions=" +
426+
prefixEncoded := base64.StdEncoding.EncodeToString([]byte(path))
427+
url := "http://localhost:9090/api/v1/buckets/" + bucketName + "/objects?prefix=" +
428+
prefixEncoded + "&recursive=" + strconv.FormatBool(recursive) + "&all_versions=" +
428429
strconv.FormatBool(allVersions)
429430
request, err := http.NewRequest(
430431
"DELETE",
@@ -1639,7 +1640,6 @@ func TestDeleteObject(t *testing.T) {
16391640
assert := assert.New(t)
16401641
bucketName := "testdeleteobjectbucket1"
16411642
fileName := "testdeleteobjectfile"
1642-
path := "dGVzdGRlbGV0ZW9iamVjdGZpbGUxLnR4dA==" // fileName encoded base64
16431643
numberOfFiles := 2
16441644

16451645
// 1. Create bucket
@@ -1662,8 +1662,9 @@ func TestDeleteObject(t *testing.T) {
16621662
}
16631663
}
16641664

1665+
objPathFull := fileName + "1.txt" // would be encoded in DeleteObject util method.
16651666
// 3. Delete only one object from the bucket.
1666-
deleteResponse, deleteError := DeleteObject(bucketName, path, false, false)
1667+
deleteResponse, deleteError := DeleteObject(bucketName, objPathFull, false, false)
16671668
assert.Nil(deleteError)
16681669
if deleteError != nil {
16691670
log.Println(deleteError)

portal-ui/src/api/consoleApi.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2092,7 +2092,7 @@ export class Api<
20922092
deleteObject: (
20932093
bucketName: string,
20942094
query: {
2095-
path: string;
2095+
prefix: string;
20962096
version_id?: string;
20972097
recursive?: boolean;
20982098
all_versions?: boolean;

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/DeleteMultipleObjects.tsx

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import { hasPermission } from "../../../../../../common/SecureComponent";
2525
import { IAM_SCOPES } from "../../../../../../common/SecureComponent/permissions";
2626
import { useSelector } from "react-redux";
2727
import { BucketVersioningResponse } from "api/consoleApi";
28+
import { api } from "../../../../../../api";
29+
import { encodeURLString } from "../../../../../../common/utils";
2830

2931
interface IDeleteObjectProps {
3032
closeDeleteModalAndRefresh: (refresh: boolean) => void;
@@ -86,13 +88,37 @@ const DeleteObject = ({
8688
}
8789

8890
if (toSend) {
89-
invokeDeleteApi(
90-
"POST",
91-
`/api/v1/buckets/${selectedBucket}/delete-objects?all_versions=${deleteVersions}${
92-
bypassGovernance ? "&bypass=true" : ""
93-
}`,
94-
toSend,
95-
);
91+
if (selectedObjects.length === 1) {
92+
const firstObject = selectedObjects[0];
93+
api.buckets
94+
.deleteObject(selectedBucket, {
95+
prefix: encodeURLString(firstObject),
96+
all_versions: deleteVersions,
97+
bypass: bypassGovernance,
98+
recursive: firstObject.endsWith("/"), //if it is just a prefix
99+
})
100+
.then(onDelSuccess)
101+
.catch((err) => {
102+
dispatch(
103+
setErrorSnackMessage({
104+
errorMessage: `Could not delete object. ${err.statusText}. ${
105+
retentionConfig
106+
? "Please check retention mode and if object is WORM protected."
107+
: ""
108+
}`,
109+
detailedError: "",
110+
}),
111+
);
112+
});
113+
} else {
114+
invokeDeleteApi(
115+
"POST",
116+
`/api/v1/buckets/${selectedBucket}/delete-objects?all_versions=${deleteVersions}${
117+
bypassGovernance ? "&bypass=true" : ""
118+
}`,
119+
toSend,
120+
);
121+
}
96122
}
97123
};
98124

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/DeleteNonCurrent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ const DeleteNonCurrentVersions = ({
5959
if (deleteLoading) {
6060
api.buckets
6161
.deleteObject(selectedBucket, {
62-
path: selectedObject,
62+
prefix: selectedObject,
6363
non_current_versions: true,
6464
bypass: bypassGovernance,
6565
})

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/DeleteObject.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ const DeleteObject = ({
8080
const recursive = decodedSelectedObject.endsWith("/");
8181
invokeDeleteApi(
8282
"DELETE",
83-
`/api/v1/buckets/${selectedBucket}/objects?path=${selectedObject}${
83+
`/api/v1/buckets/${selectedBucket}/objects?prefix=${selectedObject}${
8484
selectedVersion !== ""
8585
? `&version_id=${selectedVersion}`
8686
: `&recursive=${recursive}&all_versions=${deleteVersions}`

portal-ui/tests/permissions-3/bucketDeleteAllVersions.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,8 @@
1717
import * as roles from "../utils/roles";
1818
import * as elements from "../utils/elements";
1919
import * as functions from "../utils/functions";
20-
import { bucketsElement } from "../utils/elements-menu";
2120
import { testBucketBrowseButtonFor } from "../utils/functions";
2221
import { Selector } from "testcafe";
23-
import * as constants from "../utils/constants";
24-
import { deleteAllVersions } from "../utils/elements";
2522

2623
fixture("For user with Bucket Read & Write permissions").page(
2724
"http://localhost:9090",
@@ -45,6 +42,9 @@ test
4542
.setFilesToUpload(elements.uploadInput, "../uploads/test.txt")
4643
.wait(1000);
4744
})("All versions of an object can be deleted from a bucket", async (t) => {
45+
const versionRows = Selector(
46+
"div.ReactVirtualized__Grid.ReactVirtualized__Table__Grid > div > div:nth-child(1)",
47+
);
4848
await t
4949
.useRole(roles.bucketReadWrite)
5050
.navigateTo("http://localhost:9090/browser")
@@ -55,11 +55,7 @@ test
5555
.click(elements.deleteButton)
5656
.click(elements.deleteAllVersions)
5757
.click(Selector("button:enabled").withExactText("Delete").nth(1))
58-
.expect(
59-
Selector(
60-
"div.ReactVirtualized__Grid.ReactVirtualized__Table__Grid > div > div:nth-child(1)",
61-
).exists,
62-
)
58+
.expect(versionRows.exists)
6359
.notOk();
6460
})
6561
.after(async (t) => {

restapi/embedded_spec.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

restapi/operations/object/delete_object_parameters.go

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

restapi/operations/object/delete_object_urlbuilder.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

restapi/user_objects.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,16 @@ func registerObjectsHandlers(api *operations.ConsoleAPI) {
6363
})
6464
// delete object
6565
api.ObjectDeleteObjectHandler = objectApi.DeleteObjectHandlerFunc(func(params objectApi.DeleteObjectParams, session *models.Principal) middleware.Responder {
66+
fmt.Println("ObjectDeleteObjectHandler", params.Prefix)
6667
if err := getDeleteObjectResponse(session, params); err != nil {
6768
return objectApi.NewDeleteObjectDefault(err.Code).WithPayload(err.APIError)
6869
}
6970
return objectApi.NewDeleteObjectOK()
7071
})
7172
// delete multiple objects
7273
api.ObjectDeleteMultipleObjectsHandler = objectApi.DeleteMultipleObjectsHandlerFunc(func(params objectApi.DeleteMultipleObjectsParams, session *models.Principal) middleware.Responder {
74+
fmt.Println("ObjectDeleteMultipleObjectsHandler", params)
75+
7376
if err := getDeleteMultiplePathsResponse(session, params); err != nil {
7477
return objectApi.NewDeleteMultipleObjectsDefault(err.Code).WithPayload(err.APIError)
7578
}
@@ -764,8 +767,8 @@ func getDeleteObjectResponse(session *models.Principal, params objectApi.DeleteO
764767
ctx, cancel := context.WithCancel(params.HTTPRequest.Context())
765768
defer cancel()
766769
var prefix string
767-
if params.Path != "" {
768-
encodedPrefix := SanitizeEncodedPrefix(params.Path)
770+
if params.Prefix != "" {
771+
encodedPrefix := SanitizeEncodedPrefix(params.Prefix)
769772
decodedPrefix, err := base64.StdEncoding.DecodeString(encodedPrefix)
770773
if err != nil {
771774
return ErrorWithContext(ctx, err)

0 commit comments

Comments
 (0)