use crate::enums::secdesc::LdapSid;
use log::{trace,error};
pub fn sid_maker(sid: LdapSid, domain: &String) -> String {
let mut sub: String = "".to_owned();
trace!("sid_maker before: {:?}",&sid);
for v in &sid.sub_authority {
sub.push_str(&"-".to_owned());
sub.push_str(&v.to_string());
}
let mut result: String = "S-".to_owned();
result.push_str(&sid.revision.to_string());
result.push_str(&"-");
result.push_str(&sid.identifier_authority.value[5].to_string());
result.push_str(&sub);
let mut final_sid: String = "".to_owned();
if result.len() <= 16 {
final_sid.push_str(&domain.to_uppercase());
final_sid.push_str(&"-".to_owned());
final_sid.push_str(&result.to_owned());
} else {
final_sid = result;
}
trace!("sid_maker value: {}",final_sid);
if final_sid.contains("S-0-0"){
error!("SID contains null bytes!\n[INPUT: {:?}]\n[OUTPUT: {}]", &sid, final_sid);
}
return final_sid;
}
pub fn objectsid_to_vec8(sid: &String) -> Vec<u8>
{
let mut vec_sid: Vec<u8> = Vec::new();
for value in sid.as_bytes() {
vec_sid.push(*value);
}
return vec_sid
}
pub fn decode_guid(raw_guid: &Vec<u8>) -> String
{
let mut str_guid: String = "".to_owned();
let mut part1 = vec![];
part1.push(raw_guid[3] & 0xFF);
part1.push(raw_guid[2] & 0xFF);
part1.push(raw_guid[1] & 0xFF);
part1.push(raw_guid[0] & 0xFF);
str_guid.push_str(&hex_push(&part1));
str_guid.push_str("-");
let mut part2 = vec![];
part2.push(raw_guid[5] & 0xFF);
part2.push(raw_guid[4] & 0xFF);
str_guid.push_str(&hex_push(&part2));
str_guid.push_str("-");
let mut part3 = vec![];
part3.push(raw_guid[7] & 0xFF);
part3.push(raw_guid[6] & 0xFF);
str_guid.push_str(&hex_push(&part3));
str_guid.push_str("-");
let mut part4 = vec![];
part4.push(raw_guid[8] & 0xFF);
part4.push(raw_guid[9] & 0xFF);
str_guid.push_str(&hex_push(&part4));
str_guid.push_str("-");
let mut part5 = vec![];
part5.push(raw_guid[10] & 0xFF);
part5.push(raw_guid[11] & 0xFF);
part5.push(raw_guid[12] & 0xFF);
part5.push(raw_guid[13] & 0xFF);
part5.push(raw_guid[14] & 0xFF);
part5.push(raw_guid[15] & 0xFF);
str_guid.push_str(&hex_push(&part5));
return str_guid
}
pub fn hex_push(blob: &[u8]) -> String {
let mut buf: String = "".to_owned();
for ch in blob {
fn hex_from_digit(num: u8) -> char {
if num < 10 {
(b'0' + num) as char
} else {
(b'A' + num - 10) as char
}
}
buf.push(hex_from_digit(ch / 16));
buf.push(hex_from_digit(ch % 16));
}
return buf;
}
pub fn bin_to_string(raw_guid: &Vec<u8>) -> String
{
let mut str_guid: String = "".to_owned();
let mut part1 = vec![];
part1.push(raw_guid[12] & 0xFF);
part1.push(raw_guid[13] & 0xFF);
part1.push(raw_guid[14] & 0xFF);
part1.push(raw_guid[15] & 0xFF);
str_guid.push_str(&hex_push(&part1));
str_guid.push_str("-");
let mut part2 = vec![];
part2.push(raw_guid[10] & 0xFF);
part2.push(raw_guid[11] & 0xFF);
str_guid.push_str(&hex_push(&part2));
str_guid.push_str("-");
let mut part3 = vec![];
part3.push(raw_guid[8] & 0xFF);
part3.push(raw_guid[9] & 0xFF);
str_guid.push_str(&hex_push(&part3));
str_guid.push_str("-");
let mut part4 = vec![];
part4.push(raw_guid[7] & 0xFF);
part4.push(raw_guid[6] & 0xFF);
str_guid.push_str(&hex_push(&part4));
str_guid.push_str("-");
let mut part5 = vec![];
part5.push(raw_guid[5] & 0xFF);
part5.push(raw_guid[4] & 0xFF);
part5.push(raw_guid[3] & 0xFF);
part5.push(raw_guid[2] & 0xFF);
part5.push(raw_guid[1] & 0xFF);
part5.push(raw_guid[0] & 0xFF);
str_guid.push_str(&hex_push(&part5));
return str_guid
}