mod ask_tgs;
mod ask_tgt;
use ask_tgs::{ask_s4u2proxy, ask_s4u2self, ask_tgs};
use ask_tgt::ask_tgt;
use crate::{
communication::KdcComm,
core::{CredFormat, KrbUser, Vault},
error::Result,
};
use kerberos_crypto::Key;
pub fn ask(realm: &str,
username: &str,
user_key: Option<Key>,
impersonate_user: Option<KrbUser>,
service: Option<String>,
user_service: Option<String>,
rename_service: Option<String>,
vault: &mut dyn Vault,
credential_format: CredFormat,
kdccomm: KdcComm)
-> Result<()>
{
let user = KrbUser::new(username.to_string(), realm.to_string());
match service
{
Some(service) => match impersonate_user
{
Some(impersonate_user) => ask_s4u2proxy(
user,
impersonate_user,
service,
user_service,
rename_service,
vault,
user_key.as_ref(),
credential_format,
kdccomm,
),
None => ask_tgs(user, service, rename_service, user_key.as_ref(), credential_format, vault, kdccomm),
},
None => match impersonate_user
{
Some(impersonate_user) =>
{
ask_s4u2self(user, impersonate_user, user_service, vault, user_key.as_ref(), credential_format, kdccomm)
},
None => match user_key
{
Some(user_key) => ask_tgt(user, &user_key, credential_format, vault, kdccomm),
None => Err("Required credentials to request a TGT")?,
},
},
}
}