@@ -12073,6 +12073,59 @@ fn variant_pki_enrollment_reject_error_rs_to_js<'a>(
1207312073 Ok(js_obj)
1207412074}
1207512075
12076+ // PkiEnrollmentSubmitError
12077+
12078+ #[allow(dead_code)]
12079+ fn variant_pki_enrollment_submit_error_rs_to_js<'a>(
12080+ cx: &mut impl Context<'a>,
12081+ rs_obj: libparsec::PkiEnrollmentSubmitError,
12082+ ) -> NeonResult<Handle<'a, JsObject>> {
12083+ let js_obj = cx.empty_object();
12084+ let js_display = JsString::try_new(cx, &rs_obj.to_string()).or_throw(cx)?;
12085+ js_obj.set(cx, "error", js_display)?;
12086+ match rs_obj {
12087+ libparsec::PkiEnrollmentSubmitError::AlreadyEnrolled { .. } => {
12088+ let js_tag =
12089+ JsString::try_new(cx, "PkiEnrollmentSubmitErrorAlreadyEnrolled").or_throw(cx)?;
12090+ js_obj.set(cx, "tag", js_tag)?;
12091+ }
12092+ libparsec::PkiEnrollmentSubmitError::AlreadySubmitted { .. } => {
12093+ let js_tag =
12094+ JsString::try_new(cx, "PkiEnrollmentSubmitErrorAlreadySubmitted").or_throw(cx)?;
12095+ js_obj.set(cx, "tag", js_tag)?;
12096+ }
12097+ libparsec::PkiEnrollmentSubmitError::EmailAlreadyUsed { .. } => {
12098+ let js_tag =
12099+ JsString::try_new(cx, "PkiEnrollmentSubmitErrorEmailAlreadyUsed").or_throw(cx)?;
12100+ js_obj.set(cx, "tag", js_tag)?;
12101+ }
12102+ libparsec::PkiEnrollmentSubmitError::IdAlreadyUsed { .. } => {
12103+ let js_tag =
12104+ JsString::try_new(cx, "PkiEnrollmentSubmitErrorIdAlreadyUsed").or_throw(cx)?;
12105+ js_obj.set(cx, "tag", js_tag)?;
12106+ }
12107+ libparsec::PkiEnrollmentSubmitError::Internal { .. } => {
12108+ let js_tag = JsString::try_new(cx, "PkiEnrollmentSubmitErrorInternal").or_throw(cx)?;
12109+ js_obj.set(cx, "tag", js_tag)?;
12110+ }
12111+ libparsec::PkiEnrollmentSubmitError::InvalidPayload { .. } => {
12112+ let js_tag =
12113+ JsString::try_new(cx, "PkiEnrollmentSubmitErrorInvalidPayload").or_throw(cx)?;
12114+ js_obj.set(cx, "tag", js_tag)?;
12115+ }
12116+ libparsec::PkiEnrollmentSubmitError::Offline { .. } => {
12117+ let js_tag = JsString::try_new(cx, "PkiEnrollmentSubmitErrorOffline").or_throw(cx)?;
12118+ js_obj.set(cx, "tag", js_tag)?;
12119+ }
12120+ libparsec::PkiEnrollmentSubmitError::PkiOperationError { .. } => {
12121+ let js_tag =
12122+ JsString::try_new(cx, "PkiEnrollmentSubmitErrorPkiOperationError").or_throw(cx)?;
12123+ js_obj.set(cx, "tag", js_tag)?;
12124+ }
12125+ }
12126+ Ok(js_obj)
12127+ }
12128+
1207612129// SelfShamirRecoveryInfo
1207712130
1207812131#[allow(dead_code)]
@@ -22903,6 +22956,102 @@ fn path_split(mut cx: FunctionContext) -> JsResult<JsPromise> {
2290322956 Ok(promise)
2290422957}
2290522958
22959+ // pki_enrollment_submit
22960+ fn pki_enrollment_submit(mut cx: FunctionContext) -> JsResult<JsPromise> {
22961+ crate::init_sentry();
22962+ let config = {
22963+ let js_val = cx.argument::<JsObject>(0)?;
22964+ struct_client_config_js_to_rs(&mut cx, js_val)?
22965+ };
22966+ let addr = {
22967+ let js_val = cx.argument::<JsString>(1)?;
22968+ {
22969+ let custom_from_rs_string = |s: String| -> Result<_, String> {
22970+ libparsec::ParsecPkiEnrollmentAddr::from_any(&s).map_err(|e| e.to_string())
22971+ };
22972+ match custom_from_rs_string(js_val.value(&mut cx)) {
22973+ Ok(val) => val,
22974+ Err(err) => return cx.throw_type_error(err),
22975+ }
22976+ }
22977+ };
22978+ let cert_ref = {
22979+ let js_val = cx.argument::<JsObject>(2)?;
22980+ struct_x509_certificate_reference_js_to_rs(&mut cx, js_val)?
22981+ };
22982+ let human_handle = {
22983+ let js_val = cx.argument::<JsObject>(3)?;
22984+ struct_human_handle_js_to_rs(&mut cx, js_val)?
22985+ };
22986+ let device_label = {
22987+ let js_val = cx.argument::<JsString>(4)?;
22988+ {
22989+ let custom_from_rs_string = |s: String| -> Result<_, String> {
22990+ libparsec::DeviceLabel::try_from(s.as_str()).map_err(|e| e.to_string())
22991+ };
22992+ match custom_from_rs_string(js_val.value(&mut cx)) {
22993+ Ok(val) => val,
22994+ Err(err) => return cx.throw_type_error(err),
22995+ }
22996+ }
22997+ };
22998+ let force = {
22999+ let js_val = cx.argument::<JsBoolean>(5)?;
23000+ js_val.value(&mut cx)
23001+ };
23002+ let channel = cx.channel();
23003+ let (deferred, promise) = cx.promise();
23004+
23005+ // TODO: Promises are not cancellable in Javascript by default, should we add a custom cancel method ?
23006+ let _handle = crate::TOKIO_RUNTIME
23007+ .lock()
23008+ .expect("Mutex is poisoned")
23009+ .spawn(async move {
23010+ let ret = libparsec::pki_enrollment_submit(
23011+ config,
23012+ addr,
23013+ cert_ref,
23014+ human_handle,
23015+ device_label,
23016+ force,
23017+ )
23018+ .await;
23019+
23020+ deferred.settle_with(&channel, move |mut cx| {
23021+ let js_ret = match ret {
23022+ Ok(ok) => {
23023+ let js_obj = JsObject::new(&mut cx);
23024+ let js_tag = JsBoolean::new(&mut cx, true);
23025+ js_obj.set(&mut cx, "ok", js_tag)?;
23026+ let js_value = JsNumber::new(&mut cx, {
23027+ let custom_to_rs_f64 =
23028+ |dt: libparsec::DateTime| -> Result<f64, &'static str> {
23029+ Ok((dt.as_timestamp_micros() as f64) / 1_000_000f64)
23030+ };
23031+ match custom_to_rs_f64(ok) {
23032+ Ok(ok) => ok,
23033+ Err(err) => return cx.throw_type_error(err),
23034+ }
23035+ });
23036+ js_obj.set(&mut cx, "value", js_value)?;
23037+ js_obj
23038+ }
23039+ Err(err) => {
23040+ let js_obj = cx.empty_object();
23041+ let js_tag = JsBoolean::new(&mut cx, false);
23042+ js_obj.set(&mut cx, "ok", js_tag)?;
23043+ let js_err = variant_pki_enrollment_submit_error_rs_to_js(&mut cx, err)?;
23044+ js_obj.set(&mut cx, "error", js_err)?;
23045+ js_obj
23046+ }
23047+ };
23048+ Ok(js_ret)
23049+ });
23050+ });
23051+
23052+ Ok(promise)
23053+ }
23054+
2290623055// show_certificate_selection_dialog_windows_only
2290723056fn show_certificate_selection_dialog_windows_only(mut cx: FunctionContext) -> JsResult<JsPromise> {
2290823057 crate::init_sentry();
@@ -27310,6 +27459,7 @@ pub fn register_meths(cx: &mut ModuleContext) -> NeonResult<()> {
2731027459 cx.export_function("pathNormalize", path_normalize)?;
2731127460 cx.export_function("pathParent", path_parent)?;
2731227461 cx.export_function("pathSplit", path_split)?;
27462+ cx.export_function("pkiEnrollmentSubmit", pki_enrollment_submit)?;
2731327463 cx.export_function(
2731427464 "showCertificateSelectionDialogWindowsOnly",
2731527465 show_certificate_selection_dialog_windows_only,
0 commit comments