Skip to main content

ali_oss_rs/blocking/
acl.rs

1//! Object acl module
2
3use crate::{
4    acl_common::{build_get_object_acl_request, build_put_object_acl_request, parse_object_acl_from_xml},
5    common::VersionIdOnlyOptions,
6    object_common::ObjectAcl,
7    Result,
8};
9
10use super::Client;
11
12pub type PutObjectAclOptions = VersionIdOnlyOptions;
13pub type GetObjectAclOptions = VersionIdOnlyOptions;
14
15pub trait ObjectAclOperations {
16    /// Get an object's acl.
17    ///
18    /// Official document: <https://help.aliyun.com/zh/oss/developer-reference/getobjectacl>
19    fn get_object_acl<S1, S2>(&self, bucket_name: S1, object_key: S2, options: Option<GetObjectAclOptions>) -> Result<ObjectAcl>
20    where
21        S1: AsRef<str>,
22        S2: AsRef<str>;
23
24    /// Put an object's acl. If you want to restore the object's acl to follow bucket acl settings, pass acl as `ObjectAcl::Default`
25    ///
26    /// Official document: <https://help.aliyun.com/zh/oss/developer-reference/putobjectacl>
27    fn put_object_acl<S1, S2>(&self, bucket_name: S1, object_key: S2, acl: ObjectAcl, options: Option<GetObjectAclOptions>) -> Result<()>
28    where
29        S1: AsRef<str>,
30        S2: AsRef<str>;
31}
32
33impl ObjectAclOperations for Client {
34    /// Get an object's acl.
35    ///
36    /// Official document: <https://help.aliyun.com/zh/oss/developer-reference/getobjectacl>
37    fn get_object_acl<S1, S2>(&self, bucket_name: S1, object_key: S2, options: Option<GetObjectAclOptions>) -> Result<ObjectAcl>
38    where
39        S1: AsRef<str>,
40        S2: AsRef<str>,
41    {
42        let request = build_get_object_acl_request(bucket_name.as_ref(), object_key.as_ref(), &options)?;
43        let (_, content) = self.do_request::<String>(request)?;
44        parse_object_acl_from_xml(&content)
45    }
46
47    /// Put an object's acl. If you want to restore the object's acl to follow bucket acl settings, pass acl as `ObjectAcl::Default`
48    ///
49    /// Official document: <https://help.aliyun.com/zh/oss/developer-reference/putobjectacl>
50    fn put_object_acl<S1, S2>(&self, bucket_name: S1, object_key: S2, acl: ObjectAcl, options: Option<GetObjectAclOptions>) -> Result<()>
51    where
52        S1: AsRef<str>,
53        S2: AsRef<str>,
54    {
55        let request = build_put_object_acl_request(bucket_name.as_ref(), object_key.as_ref(), acl, &options)?;
56        let _ = self.do_request::<()>(request)?;
57        Ok(())
58    }
59}
60
61#[cfg(all(test, feature = "blocking"))]
62mod test_object_acl_blocking {
63    use std::sync::Once;
64
65    use reqwest::StatusCode;
66    use uuid::Uuid;
67
68    use super::Client;
69    use crate::{
70        blocking::{acl::ObjectAclOperations, object::ObjectOperations},
71        object_common::ObjectAcl,
72    };
73
74    static INIT: Once = Once::new();
75
76    fn setup() {
77        INIT.call_once(|| {
78            simple_logger::init_with_level(log::Level::Debug).unwrap();
79            dotenvy::dotenv().unwrap();
80        });
81    }
82
83    #[test]
84    fn test_object_acl_blocking() {
85        log::debug!("test a private object update to public");
86        setup();
87
88        let client = Client::from_env();
89
90        let bucket_name = "yuanyq";
91        let object_key = format!("rust-sdk-test/{}.jpg", Uuid::new_v4());
92        let file_path = "/home/yuanyq/Pictures/01-cover.jpg";
93
94        let response = client.put_object_from_file(bucket_name, &object_key, file_path, None);
95
96        assert!(response.is_ok());
97
98        let response = client.put_object_acl(bucket_name, &object_key, ObjectAcl::PublicRead, None);
99        assert!(response.is_ok());
100
101        let response = client.get_object_acl(bucket_name, &object_key, None);
102        assert!(response.is_ok());
103        let ret = response.unwrap();
104        assert_eq!(ObjectAcl::PublicRead, ret);
105
106        let url = format!("https://{}.oss-cn-beijing.aliyuncs.com/{}", bucket_name, object_key);
107        let status = reqwest::blocking::get(&url).unwrap().status();
108        assert_eq!(StatusCode::OK, status);
109
110        let response = client.put_object_acl(bucket_name, &object_key, ObjectAcl::Default, None);
111        assert!(response.is_ok());
112
113        let response = client.get_object_acl(bucket_name, &object_key, None);
114        assert!(response.is_ok());
115        let ret = response.unwrap();
116        assert_eq!(ObjectAcl::Default, ret);
117
118        let url = format!("https://{}.oss-cn-beijing.aliyuncs.com/{}", bucket_name, object_key);
119        let status = reqwest::blocking::get(&url).unwrap().status();
120        assert_eq!(StatusCode::FORBIDDEN, status);
121
122        client.delete_object(bucket_name, &object_key, None).unwrap();
123    }
124}