use redb::ReadableTable;
use super::tables::OIDC_PROVIDERS;
use super::types::{SystemCatalog, catalog_err};
#[derive(
Debug,
Clone,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
serde::Serialize,
serde::Deserialize,
)]
#[msgpack(map, allow_unknown_fields)]
pub struct StoredClaimMappingRule {
pub claim_name: String,
pub claim_value: String,
#[msgpack(default)]
pub default_database: Option<u64>,
#[msgpack(default)]
pub add_databases: Vec<u64>,
#[msgpack(default)]
pub add_roles: Vec<String>,
}
#[derive(
Debug,
Clone,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
serde::Serialize,
serde::Deserialize,
)]
#[msgpack(map, allow_unknown_fields)]
pub struct StoredOidcProvider {
pub provider_name: String,
pub issuer: String,
pub jwks_uri: String,
#[msgpack(default)]
pub audience: Option<String>,
#[msgpack(default)]
pub claim_mapping: Vec<StoredClaimMappingRule>,
pub created_at_lsn: u64,
}
impl SystemCatalog {
pub fn put_oidc_provider(&self, provider: &StoredOidcProvider) -> crate::Result<()> {
let bytes = zerompk::to_msgpack_vec(provider)
.map_err(|e| catalog_err("serialize StoredOidcProvider", e))?;
let txn = self
.db
.begin_write()
.map_err(|e| catalog_err("oidc_providers write txn", e))?;
{
let mut table = txn
.open_table(OIDC_PROVIDERS)
.map_err(|e| catalog_err("open oidc_providers", e))?;
table
.insert(provider.provider_name.as_str(), bytes.as_slice())
.map_err(|e| catalog_err("insert oidc_providers", e))?;
}
txn.commit()
.map_err(|e| catalog_err("oidc_providers commit", e))
}
pub fn get_oidc_provider(&self, name: &str) -> crate::Result<Option<StoredOidcProvider>> {
let txn = self
.db
.begin_read()
.map_err(|e| catalog_err("oidc_providers read txn", e))?;
let table = txn
.open_table(OIDC_PROVIDERS)
.map_err(|e| catalog_err("open oidc_providers", e))?;
match table
.get(name)
.map_err(|e| catalog_err("get oidc_providers", e))?
{
Some(v) => {
let p: StoredOidcProvider = zerompk::from_msgpack(v.value())
.map_err(|e| catalog_err("deser StoredOidcProvider", e))?;
Ok(Some(p))
}
None => Ok(None),
}
}
pub fn list_oidc_providers(&self) -> crate::Result<Vec<StoredOidcProvider>> {
let txn = self
.db
.begin_read()
.map_err(|e| catalog_err("oidc_providers read txn", e))?;
let table = txn
.open_table(OIDC_PROVIDERS)
.map_err(|e| catalog_err("open oidc_providers", e))?;
let mut out = Vec::new();
for entry in table
.iter()
.map_err(|e| catalog_err("iter oidc_providers", e))?
{
let (_, v) = entry.map_err(|e| catalog_err("iter item oidc_providers", e))?;
let p: StoredOidcProvider = zerompk::from_msgpack(v.value())
.map_err(|e| catalog_err("deser StoredOidcProvider", e))?;
out.push(p);
}
Ok(out)
}
pub fn delete_oidc_provider(&self, name: &str) -> crate::Result<()> {
let txn = self
.db
.begin_write()
.map_err(|e| catalog_err("oidc_providers write txn", e))?;
{
let mut table = txn
.open_table(OIDC_PROVIDERS)
.map_err(|e| catalog_err("open oidc_providers", e))?;
table
.remove(name)
.map_err(|e| catalog_err("remove oidc_providers", e))?;
}
txn.commit()
.map_err(|e| catalog_err("oidc_providers commit", e))
}
}