use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::fmt;
use crate::neo_fs::types::{AccessPermission, ContainerId, OwnerId};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Operation {
Container(ContainerOperation),
Object(ObjectOperation),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ContainerOperation {
Get,
Put,
Delete,
GetEACL,
SetEACL,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ObjectOperation {
Get,
Put,
Head,
Search,
Delete,
Range,
Hash,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Target {
pub role: TargetRole,
pub keys: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TargetRole {
Owner,
Group,
Users,
Others,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Action {
Allow,
Deny,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Filter {
pub key: String,
pub value: String,
pub operation: FilterOperation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FilterOperation {
Eq,
Ne,
Gt,
Ge,
Lt,
Le,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EACLRecord {
pub operation: Operation,
pub action: Action,
pub target: Target,
pub filters: Vec<Filter>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EACL {
pub container_id: ContainerId,
pub records: Vec<EACLRecord>,
}
impl EACL {
pub fn new(container_id: ContainerId) -> Self {
Self { container_id, records: Vec::new() }
}
pub fn add_record(&mut self, record: EACLRecord) {
self.records.push(record);
}
}
#[derive(Clone, Serialize, Deserialize)]
pub struct BearerToken {
pub owner_id: OwnerId,
pub token_id: String,
pub expiration: DateTime<Utc>,
pub operations: Vec<AccessPermission>,
pub container_id: ContainerId,
pub signature: Vec<u8>,
}
impl fmt::Debug for BearerToken {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("BearerToken")
.field("owner_id", &self.owner_id)
.field("token_id", &self.token_id)
.field("expiration", &self.expiration)
.field("operations", &self.operations.len())
.field("container_id", &self.container_id)
.field("signature_len", &self.signature.len())
.finish()
}
}
#[derive(Clone, Serialize, Deserialize)]
pub struct SessionToken {
pub token_id: String,
pub owner_id: OwnerId,
pub expiration: DateTime<Utc>,
pub session_key: String,
pub signature: Vec<u8>,
}
impl fmt::Debug for SessionToken {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SessionToken")
.field("token_id", &self.token_id)
.field("owner_id", &self.owner_id)
.field("expiration", &self.expiration)
.field("session_key", &"<redacted>")
.field("signature_len", &self.signature.len())
.finish()
}
}