fn apply_inner()

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
    }