use super::User;
use std::{collections::HashMap, env, sync::Mutex};
const HADOOP_PROXY_USER: &str = "HADOOP_PROXY_USER";
static LOGIN_USER_REF: Mutex<Option<UserGroupInformation>> = Mutex::new(None);
#[derive(Clone, Copy)]
pub struct UserGroupInformation {
user: User,
}
impl UserGroupInformation {
fn ensure_initialized() {
}
pub fn get_current_user() -> anyhow::Result<Self> {
Self::ensure_initialized();
Self::get_login_user()
}
pub fn get_login_user() -> anyhow::Result<Self> {
Self::ensure_initialized();
if let Some(login_user) = *LOGIN_USER_REF.lock().unwrap() {
return Ok(login_user);
}
let new_login_user = Self::create_login_user(None)?;
let login_user = *LOGIN_USER_REF.lock().unwrap().get_or_insert_with(|| {
new_login_user.spawn_auto_renewal_thread_for_user_creds(false);
new_login_user
});
Ok(login_user)
}
fn create_login_user(subject: Option<&str>) -> anyhow::Result<Self> {
let real_user = Self::do_subject_login(subject, None)?;
let proxy_user = env::var(HADOOP_PROXY_USER).ok().filter(|p| !p.is_empty());
let login_user = proxy_user.map_or(real_user, |p| Self::create_proxy_user(&p, &real_user));
Ok(login_user)
}
fn spawn_auto_renewal_thread_for_user_creds(&self, _force: bool) {
}
pub fn create_proxy_user(_user: &str, real_user: &Self) -> Self {
real_user.to_owned()
}
pub fn get_short_user_name(&self) -> String {
self.user.get_short_name()
}
pub fn get_user_name(&self) -> String {
self.user.get_name()
}
fn do_subject_login(
_subject: Option<&str>,
_params: Option<HashMap<String, String>>,
) -> anyhow::Result<Self> {
Ok(Self { user: User {} })
}
}