use crate::{
base::PermissionLevel,
identity::{Config, Scope},
};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum Delivery {
Drop,
Inject(PermissionLevel),
}
pub(crate) fn inbound_delivery(config: &Config, server: &str, scope: &Scope) -> Delivery {
match config.resolve_permission(server, scope) {
PermissionLevel::Mute => Delivery::Drop,
level => Delivery::Inject(level),
}
}
pub(crate) fn emit_allowed(config: &Config, server: &str, scope: &Scope) -> bool {
config.resolve_permission(server, scope).may_emit()
}
pub(crate) fn any_emit_allowed<'a>(config: &Config, joined: impl IntoIterator<Item = (&'a str, &'a str)>) -> bool {
joined
.into_iter()
.any(|(server, channel)| config.resolve_permission(server, &Scope::Channel(channel.to_owned())).may_emit())
}
#[cfg(test)]
mod tests {
#![allow(clippy::unwrap_used)]
use super::*;
use crate::identity::PermissionOverride;
use pretty_assertions::assert_eq;
fn config_with(default: PermissionLevel, overrides: Vec<PermissionOverride>) -> Config {
Config {
default_permission: default,
servers: vec![],
overrides,
}
}
fn override_for(server: &str, channel: Option<&str>, level: PermissionLevel) -> PermissionOverride {
PermissionOverride {
server: server.to_owned(),
channel: channel.map(str::to_owned),
level,
}
}
#[test]
fn bridge_perm_mute_drops_inbound() {
let config = config_with(PermissionLevel::Notify, vec![override_for("s1", Some("ops"), PermissionLevel::Mute)]);
assert_eq!(inbound_delivery(&config, "s1", &Scope::Channel("ops".to_owned())), Delivery::Drop);
}
#[test]
fn bridge_perm_notify_injects_read_only() {
let config = config_with(PermissionLevel::Notify, vec![]);
assert_eq!(inbound_delivery(&config, "s1", &Scope::Channel("ops".to_owned())), Delivery::Inject(PermissionLevel::Notify));
assert_eq!(inbound_delivery(&config, "s1", &Scope::Whisper), Delivery::Inject(PermissionLevel::Notify));
}
#[test]
fn bridge_perm_emit_requires_converse_or_above() {
let config = config_with(
PermissionLevel::Notify,
vec![override_for("s1", Some("ops"), PermissionLevel::Converse), override_for("s1", Some("act-chan"), PermissionLevel::Act)],
);
assert!(!emit_allowed(&config, "s1", &Scope::Channel("public".to_owned())));
assert!(emit_allowed(&config, "s1", &Scope::Channel("ops".to_owned())));
assert!(emit_allowed(&config, "s1", &Scope::Channel("act-chan".to_owned())));
}
#[test]
fn bridge_perm_emit_tools_offered_when_any_channel_is_converse() {
let config = config_with(PermissionLevel::Notify, vec![override_for("s1", Some("ops"), PermissionLevel::Converse)]);
assert!(!any_emit_allowed(&config, [("s1", "public"), ("s1", "lobby")]));
assert!(any_emit_allowed(&config, [("s1", "public"), ("s1", "ops")]));
}
}