init bucketmeta

This commit is contained in:
weisd
2024-09-27 16:33:56 +08:00
parent cef6a583b7
commit b4f8088f0f
22 changed files with 687 additions and 0 deletions
+141
View File
@@ -0,0 +1,141 @@
use std::{collections::HashSet, default};
#[derive(Debug, Default)]
pub struct ActionSet(HashSet<Action>);
impl ActionSet {}
// 定义Action枚举类型
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum Action {
AbortMultipartUpload,
CreateBucket,
DeleteBucket,
ForceDeleteBucket,
DeleteBucketPolicy,
DeleteBucketCors,
DeleteObject,
GetBucketLocation,
GetBucketNotification,
GetBucketPolicy,
GetBucketCors,
GetObject,
GetObjectAttributes,
HeadBucket,
ListAllMyBuckets,
ListBucket,
GetBucketPolicyStatus,
ListBucketVersions,
ListBucketMultipartUploads,
ListenNotification,
ListenBucketNotification,
ListMultipartUploadParts,
PutBucketLifecycle,
GetBucketLifecycle,
PutBucketNotification,
PutBucketPolicy,
PutBucketCors,
PutObject,
DeleteObjectVersion,
DeleteObjectVersionTagging,
GetObjectVersion,
GetObjectVersionAttributes,
GetObjectVersionTagging,
PutObjectVersionTagging,
BypassGovernanceRetention,
PutObjectRetention,
GetObjectRetention,
GetObjectLegalHold,
PutObjectLegalHold,
GetBucketObjectLockConfiguration,
PutBucketObjectLockConfiguration,
GetBucketTagging,
PutBucketTagging,
GetObjectTagging,
PutObjectTagging,
DeleteObjectTagging,
PutBucketEncryption,
GetBucketEncryption,
PutBucketVersioning,
GetBucketVersioning,
PutReplicationConfiguration,
GetReplicationConfiguration,
ReplicateObject,
ReplicateDelete,
ReplicateTags,
GetObjectVersionForReplication,
RestoreObject,
ResetBucketReplicationState,
PutObjectFanOut,
#[default]
AllActions,
}
impl Action {
// 将字符串转换为Action枚举
fn from_str(s: &str) -> Option<Self> {
match s {
"s3:AbortMultipartUpload" => Some(Action::AbortMultipartUpload),
"s3:CreateBucket" => Some(Action::CreateBucket),
"s3:DeleteBucket" => Some(Action::DeleteBucket),
"s3:ForceDeleteBucket" => Some(Action::ForceDeleteBucket),
"s3:DeleteBucketPolicy" => Some(Action::DeleteBucketPolicy),
"s3:DeleteBucketCors" => Some(Action::DeleteBucketCors),
"s3:DeleteObject" => Some(Action::DeleteObject),
"s3:GetBucketLocation" => Some(Action::GetBucketLocation),
"s3:GetBucketNotification" => Some(Action::GetBucketNotification),
"s3:GetBucketPolicy" => Some(Action::GetBucketPolicy),
"s3:GetBucketCors" => Some(Action::GetBucketCors),
"s3:GetObject" => Some(Action::GetObject),
"s3:GetObjectAttributes" => Some(Action::GetObjectAttributes),
"s3:HeadBucket" => Some(Action::HeadBucket),
"s3:ListAllMyBuckets" => Some(Action::ListAllMyBuckets),
"s3:ListBucket" => Some(Action::ListBucket),
"s3:GetBucketPolicyStatus" => Some(Action::GetBucketPolicyStatus),
"s3:ListBucketVersions" => Some(Action::ListBucketVersions),
"s3:ListBucketMultipartUploads" => Some(Action::ListBucketMultipartUploads),
"s3:ListenNotification" => Some(Action::ListenNotification),
"s3:ListenBucketNotification" => Some(Action::ListenBucketNotification),
"s3:ListMultipartUploadParts" => Some(Action::ListMultipartUploadParts),
"s3:PutLifecycleConfiguration" => Some(Action::PutBucketLifecycle),
"s3:GetLifecycleConfiguration" => Some(Action::GetBucketLifecycle),
"s3:PutBucketNotification" => Some(Action::PutBucketNotification),
"s3:PutBucketPolicy" => Some(Action::PutBucketPolicy),
"s3:PutBucketCors" => Some(Action::PutBucketCors),
"s3:PutObject" => Some(Action::PutObject),
"s3:DeleteObjectVersion" => Some(Action::DeleteObjectVersion),
"s3:DeleteObjectVersionTagging" => Some(Action::DeleteObjectVersionTagging),
"s3:GetObjectVersion" => Some(Action::GetObjectVersion),
"s3:GetObjectVersionAttributes" => Some(Action::GetObjectVersionAttributes),
"s3:GetObjectVersionTagging" => Some(Action::GetObjectVersionTagging),
"s3:PutObjectVersionTagging" => Some(Action::PutObjectVersionTagging),
"s3:BypassGovernanceRetention" => Some(Action::BypassGovernanceRetention),
"s3:PutObjectRetention" => Some(Action::PutObjectRetention),
"s3:GetObjectRetention" => Some(Action::GetObjectRetention),
"s3:GetObjectLegalHold" => Some(Action::GetObjectLegalHold),
"s3:PutObjectLegalHold" => Some(Action::PutObjectLegalHold),
"s3:GetBucketObjectLockConfiguration" => Some(Action::GetBucketObjectLockConfiguration),
"s3:PutBucketObjectLockConfiguration" => Some(Action::PutBucketObjectLockConfiguration),
"s3:GetBucketTagging" => Some(Action::GetBucketTagging),
"s3:PutBucketTagging" => Some(Action::PutBucketTagging),
"s3:GetObjectTagging" => Some(Action::GetObjectTagging),
"s3:PutObjectTagging" => Some(Action::PutObjectTagging),
"s3:DeleteObjectTagging" => Some(Action::DeleteObjectTagging),
"s3:PutEncryptionConfiguration" => Some(Action::PutBucketEncryption),
"s3:GetEncryptionConfiguration" => Some(Action::GetBucketEncryption),
"s3:PutBucketVersioning" => Some(Action::PutBucketVersioning),
"s3:GetBucketVersioning" => Some(Action::GetBucketVersioning),
"s3:PutReplicationConfiguration" => Some(Action::PutReplicationConfiguration),
"s3:GetReplicationConfiguration" => Some(Action::GetReplicationConfiguration),
"s3:ReplicateObject" => Some(Action::ReplicateObject),
"s3:ReplicateDelete" => Some(Action::ReplicateDelete),
"s3:ReplicateTags" => Some(Action::ReplicateTags),
"s3:GetObjectVersionForReplication" => Some(Action::GetObjectVersionForReplication),
"s3:RestoreObject" => Some(Action::RestoreObject),
"s3:ResetBucketReplicationState" => Some(Action::ResetBucketReplicationState),
"s3:PutObjectFanOut" => Some(Action::PutObjectFanOut),
"s3:*" => Some(Action::AllActions),
_ => None,
}
}
}
@@ -0,0 +1,39 @@
use std::collections::HashMap;
use super::{
action::{Action, ActionSet},
condition::function::Functions,
effect::Effect,
principal::Principal,
resource::ResourceSet,
};
#[derive(Debug, Default)]
pub struct BucketPolicyArgs {
account_name: String,
groups: Vec<String>,
action: Action,
bucket_name: String,
condition_values: HashMap<String, Vec<String>>,
is_owner: bool,
object_name: String,
}
#[derive(Debug, Default)]
pub struct BPStatement {
sid: String,
effect: Effect,
principal: Principal,
actions: ActionSet,
not_actions: Option<ActionSet>,
resources: ResourceSet,
conditions: Option<Functions>,
}
#[derive(Debug, Default)]
pub struct BucketPolicy {
pub id: String,
pub version: String,
pub statements: Vec<BPStatement>,
}
@@ -0,0 +1,68 @@
use std::{
collections::{HashMap, HashSet},
fmt::{Debug, Display},
};
use super::name::Name;
#[derive(Debug, Clone)]
pub struct Key {
name: String,
variable: String,
}
// 定义ValueSet类型
pub type ValueSet = HashSet<String>;
// 定义Function trait
pub trait Function {
// evaluate方法
fn evaluate(&self, values: &HashMap<Key, ValueSet>) -> bool;
// key方法
fn key(&self) -> Key;
// name方法
fn name(&self) -> Name;
// String方法
fn to_string(&self) -> String;
// to_map方法
fn to_map(&self) -> HashMap<Key, ValueSet>;
// clone方法
fn clone(&self) -> Box<dyn Function>;
}
impl Display for dyn Function {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.to_string())
}
}
impl Debug for dyn Function {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.to_string())
}
}
// 定义Functions类型
pub struct Functions(Vec<Box<dyn Function>>);
impl Display for Functions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "[")?;
for v in self.0.iter() {
write!(f, "{:?}", v.to_string())?;
}
write!(f, "]")
}
}
impl Debug for Functions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("Functions").field(&self.0).finish()
}
}
@@ -0,0 +1,3 @@
pub mod function;
pub mod keyname;
pub mod name;
@@ -0,0 +1,68 @@
// 定义Name枚举类型
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Name {
StringEquals,
StringNotEquals,
StringEqualsIgnoreCase,
StringNotEqualsIgnoreCase,
StringLike,
StringNotLike,
BinaryEquals,
IpAddress,
NotIpAddress,
Null,
Bool,
NumericEquals,
NumericNotEquals,
NumericLessThan,
NumericLessThanEquals,
NumericGreaterThan,
NumericGreaterThanIfExists,
NumericGreaterThanEquals,
DateEquals,
DateNotEquals,
DateLessThan,
DateLessThanEquals,
DateGreaterThan,
DateGreaterThanEquals,
ForAllValues,
ForAnyValue,
}
// 实现Display trait用于打印
impl std::fmt::Display for Name {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(
f,
"{}",
match *self {
Name::StringEquals => "StringEquals",
Name::StringNotEquals => "StringNotEquals",
Name::StringEqualsIgnoreCase => "StringEqualsIgnoreCase",
Name::StringNotEqualsIgnoreCase => "StringNotEqualsIgnoreCase",
Name::StringLike => "StringLike",
Name::StringNotLike => "StringNotLike",
Name::BinaryEquals => "BinaryEquals",
Name::IpAddress => "IpAddress",
Name::NotIpAddress => "NotIpAddress",
Name::Null => "Null",
Name::Bool => "Bool",
Name::NumericEquals => "NumericEquals",
Name::NumericNotEquals => "NumericNotEquals",
Name::NumericLessThan => "NumericLessThan",
Name::NumericLessThanEquals => "NumericLessThanEquals",
Name::NumericGreaterThan => "NumericGreaterThan",
Name::NumericGreaterThanIfExists => "NumericGreaterThanIfExists",
Name::NumericGreaterThanEquals => "NumericGreaterThanEquals",
Name::DateEquals => "DateEquals",
Name::DateNotEquals => "DateNotEquals",
Name::DateLessThan => "DateLessThan",
Name::DateLessThanEquals => "DateLessThanEquals",
Name::DateGreaterThan => "DateGreaterThan",
Name::DateGreaterThanEquals => "DateGreaterThanEquals",
Name::ForAllValues => "ForAllValues",
Name::ForAnyValue => "ForAnyValue",
}
)
}
}
+21
View File
@@ -0,0 +1,21 @@
use std::str::FromStr;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Effect {
#[default]
Allow,
Deny,
}
// 实现从字符串解析Effect的功能
impl FromStr for Effect {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Allow" => Ok(Effect::Allow),
"Deny" => Ok(Effect::Deny),
_ => Err(()),
}
}
}
+6
View File
@@ -0,0 +1,6 @@
pub mod action;
pub mod bucket_policy;
pub mod condition;
pub mod effect;
pub mod principal;
pub mod resource;
+6
View File
@@ -0,0 +1,6 @@
use std::collections::HashSet;
#[derive(Debug, Clone, Default)]
pub struct Principal {
aws: HashSet<String>,
}
+24
View File
@@ -0,0 +1,24 @@
use std::{collections::HashSet, default};
// 定义ResourceARNType枚举类型
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum ResourceARNType {
#[default]
UnknownARN,
ResourceARNS3,
ResourceARNKMS,
}
// 定义资源ARN前缀
const RESOURCE_ARN_PREFIX: &str = "arn:aws:s3:::";
const RESOURCE_ARN_KMS_PREFIX: &str = "arn:rustfs:kms::::";
// 定义Resource结构体
#[derive(Debug, Default)]
pub struct Resource {
pattern: String,
r#type: ResourceARNType,
}
#[derive(Debug, Default)]
pub struct ResourceSet(HashSet<Resource>);