use swf_core::models::authentication::*;
#[derive(Default)]
pub struct AuthenticationPolicyDefinitionBuilder {
reference: Option<String>,
builder: Option<AuthenticationSchemeBuilder>,
}
impl AuthenticationPolicyDefinitionBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn use_(&mut self, reference: &str) -> &mut Self {
self.reference = Some(reference.to_string());
self
}
pub fn basic(&mut self) -> &mut BasicAuthenticationSchemeDefinitionBuilder {
let builder = BasicAuthenticationSchemeDefinitionBuilder::new();
self.builder = Some(AuthenticationSchemeBuilder::Basic(builder));
if let Some(AuthenticationSchemeBuilder::Basic(ref mut builder)) = self.builder {
builder
} else {
unreachable!("Builder should always be set to Basic");
}
}
pub fn bearer(&mut self) -> &mut BearerAuthenticationSchemeDefinitionBuilder {
let builder = BearerAuthenticationSchemeDefinitionBuilder::new();
self.builder = Some(AuthenticationSchemeBuilder::Bearer(builder));
if let Some(AuthenticationSchemeBuilder::Bearer(ref mut builder)) = self.builder {
builder
} else {
unreachable!("Builder should always be set to Bearer");
}
}
pub fn digest(&mut self) -> &mut DigestAuthenticationSchemeDefinitionBuilder {
let builder = DigestAuthenticationSchemeDefinitionBuilder::new();
self.builder = Some(AuthenticationSchemeBuilder::Digest(builder));
if let Some(AuthenticationSchemeBuilder::Digest(ref mut builder)) = self.builder {
builder
} else {
unreachable!("Builder should always be set to Digest");
}
}
pub fn oauth2(&mut self) -> &mut OAuth2AuthenticationSchemeDefinitionBuilder {
let builder = OAuth2AuthenticationSchemeDefinitionBuilder::new();
self.builder = Some(AuthenticationSchemeBuilder::OAuth2(builder));
if let Some(AuthenticationSchemeBuilder::OAuth2(ref mut builder)) = self.builder {
builder
} else {
unreachable!("Builder should always be set to OAuth2");
}
}
pub fn oidc(&mut self) -> &mut OidcAuthenticationSchemeDefinitionBuilder {
let builder = OidcAuthenticationSchemeDefinitionBuilder::new();
self.builder = Some(AuthenticationSchemeBuilder::Oidc(builder));
if let Some(AuthenticationSchemeBuilder::Oidc(ref mut builder)) = self.builder {
builder
} else {
unreachable!("Builder should always be set to Oidc");
}
}
pub fn build(self) -> AuthenticationPolicyDefinition {
if let Some(reference) = self.reference {
AuthenticationPolicyDefinition {
use_: Some(reference),
..Default::default()
}
} else {
if let Some(builder) = self.builder {
match builder {
AuthenticationSchemeBuilder::Basic(builder) => builder.build(),
AuthenticationSchemeBuilder::Bearer(builder) => builder.build(),
AuthenticationSchemeBuilder::Digest(builder) => builder.build(),
AuthenticationSchemeBuilder::OAuth2(builder) => builder.build(),
AuthenticationSchemeBuilder::Oidc(builder) => builder.build(),
}
} else {
panic!("The authentication policy must be configured");
}
}
}
}
pub(crate) enum AuthenticationSchemeBuilder {
Basic(BasicAuthenticationSchemeDefinitionBuilder),
Bearer(BearerAuthenticationSchemeDefinitionBuilder),
Digest(DigestAuthenticationSchemeDefinitionBuilder),
OAuth2(OAuth2AuthenticationSchemeDefinitionBuilder),
Oidc(OidcAuthenticationSchemeDefinitionBuilder),
}
#[derive(Default)]
pub struct BasicAuthenticationSchemeDefinitionBuilder {
scheme: BasicAuthenticationSchemeDefinition,
}
impl BasicAuthenticationSchemeDefinitionBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn use_secret(&mut self, secret: &str) -> &mut Self {
self.scheme.use_ = Some(secret.to_string());
self
}
pub fn with_username(&mut self, username: &str) -> &mut Self {
self.scheme.username = Some(username.to_string());
self
}
pub fn with_password(&mut self, password: &str) -> &mut Self {
self.scheme.password = Some(password.to_string());
self
}
pub fn build(self) -> AuthenticationPolicyDefinition {
AuthenticationPolicyDefinition {
basic: Some(self.scheme),
..Default::default()
}
}
}
#[derive(Default)]
pub struct BearerAuthenticationSchemeDefinitionBuilder {
scheme: BearerAuthenticationSchemeDefinition,
}
impl BearerAuthenticationSchemeDefinitionBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn use_secret(&mut self, secret: &str) -> &mut Self {
self.scheme.use_ = Some(secret.to_string());
self
}
pub fn with_token(&mut self, token: &str) -> &mut Self {
self.scheme.token = Some(token.to_string());
self
}
pub fn build(self) -> AuthenticationPolicyDefinition {
AuthenticationPolicyDefinition {
bearer: Some(self.scheme),
..Default::default()
}
}
}
#[derive(Default)]
pub struct DigestAuthenticationSchemeDefinitionBuilder {
scheme: DigestAuthenticationSchemeDefinition,
}
impl DigestAuthenticationSchemeDefinitionBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn use_secret(&mut self, secret: &str) -> &mut Self {
self.scheme.use_ = Some(secret.to_string());
self
}
pub fn with_username(&mut self, username: &str) -> &mut Self {
self.scheme.username = Some(username.to_string());
self
}
pub fn with_password(&mut self, password: &str) -> &mut Self {
self.scheme.password = Some(password.to_string());
self
}
pub fn build(self) -> AuthenticationPolicyDefinition {
AuthenticationPolicyDefinition {
digest: Some(self.scheme),
..Default::default()
}
}
}
#[derive(Default)]
pub struct OAuth2AuthenticationSchemeDefinitionBuilder {
scheme: OAuth2AuthenticationSchemeDefinition,
}
impl OAuth2AuthenticationSchemeDefinitionBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn use_secret(&mut self, secret: &str) -> &mut Self {
self.scheme.use_ = Some(secret.to_string());
self
}
pub fn with_authority(&mut self, authority: &str) -> &mut Self {
self.scheme.authority = Some(authority.to_string());
self
}
pub fn with_grant(&mut self, grant: &str) -> &mut Self {
self.scheme.grant = Some(grant.to_string());
self
}
pub fn with_client_id(&mut self, id: &str) -> &mut Self {
self.scheme.client.get_or_insert_with(Default::default).id = Some(id.to_string());
self
}
pub fn with_client_secret(&mut self, secret: &str) -> &mut Self {
self.scheme
.client
.get_or_insert_with(Default::default)
.secret = Some(secret.to_string());
self
}
pub fn with_scopes(&mut self, scopes: Vec<String>) -> &mut Self {
self.scheme.scopes = Some(scopes);
self
}
pub fn build(self) -> AuthenticationPolicyDefinition {
AuthenticationPolicyDefinition {
oauth2: Some(self.scheme),
..Default::default()
}
}
}
#[derive(Default)]
pub struct OidcAuthenticationSchemeDefinitionBuilder {
scheme: OpenIDConnectSchemeDefinition,
}
impl OidcAuthenticationSchemeDefinitionBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn use_secret(&mut self, secret: &str) -> &mut Self {
self.scheme.use_ = Some(secret.to_string());
self
}
pub fn with_authority(&mut self, authority: &str) -> &mut Self {
self.scheme.authority = Some(authority.to_string());
self
}
pub fn with_grant(&mut self, grant: &str) -> &mut Self {
self.scheme.grant = Some(grant.to_string());
self
}
pub fn with_client_id(&mut self, id: &str) -> &mut Self {
self.scheme.client.get_or_insert_with(Default::default).id = Some(id.to_string());
self
}
pub fn with_client_secret(&mut self, secret: &str) -> &mut Self {
self.scheme
.client
.get_or_insert_with(Default::default)
.secret = Some(secret.to_string());
self
}
pub fn with_scopes(&mut self, scopes: Vec<String>) -> &mut Self {
self.scheme.scopes = Some(scopes);
self
}
pub fn build(self) -> AuthenticationPolicyDefinition {
AuthenticationPolicyDefinition {
oidc: Some(self.scheme),
..Default::default()
}
}
}