in crates/libs/core/src/types/common/security_credentials/claims_credentials.rs [29:83]
fn apply_inner(
&self,
settings_interface: mssf_com::FabricClient::IFabricClientSettings2,
) -> crate::Result<()> {
let server_thumbprints: Box<[PCWSTR]> = self
.ServerThumbprints
.iter()
.map(WString::as_pcwstr)
.collect();
// Maybe a bit paranoid, but let's make sure we use a null ptr if it's an empty boxed slice
fn slice_to_ptr(val: &[PCWSTR]) -> *const PCWSTR {
if val.is_empty() {
std::ptr::null()
} else {
val.as_ptr()
}
}
let mut ex1 = FABRIC_CLAIMS_CREDENTIALS_EX1 {
ServerThumbprintCount: u32::try_from(server_thumbprints.len()).unwrap(),
ServerThumbprints: slice_to_ptr(&server_thumbprints),
Reserved: std::ptr::null_mut(),
};
let server_common_names: Box<[PCWSTR]> = self
.ServerCommonNames
.iter()
.map(WString::as_pcwstr)
.collect();
let issuer_thumbprints: Box<[PCWSTR]> = self
.IssuerThumbprints
.iter()
.map(WString::as_pcwstr)
.collect();
let mut value = FABRIC_CLAIMS_CREDENTIALS {
ServerCommonNameCount: u32::try_from(server_common_names.len()).unwrap(),
ServerCommonNames: slice_to_ptr(&server_common_names),
IssuerThumbprintCount: u32::try_from(issuer_thumbprints.len()).unwrap(),
IssuerThumbprints: slice_to_ptr(&issuer_thumbprints),
LocalClaims: self.LocalClaims.as_pcwstr(),
ProtectionLevel: self.ProtectionLevel.into(),
Reserved: addr_of_mut!(ex1) as *mut c_void,
};
let security_credentials = FABRIC_SECURITY_CREDENTIALS {
Kind: FABRIC_SECURITY_CREDENTIAL_KIND_CLAIMS,
Value: addr_of_mut!(value) as *mut c_void,
};
// SAFETY: COM interop. SetSecurityCredentials does not retain reference to the passed in data after function returns.
let result = unsafe { settings_interface.SetSecurityCredentials(&security_credentials) }
.map_err(crate::Error::from);
#[cfg(miri)] // TODO: investigate what's wrong with windows_core::implement drop implement.
Box::leak(Box::new(settings_interface));
result
}