Skip to content

Commit ffb3342

Browse files
feat(binding): Allow to submit pki request
Closes #11447
1 parent 31b010e commit ffb3342

File tree

7 files changed

+468
-2
lines changed

7 files changed

+468
-2
lines changed

bindings/electron/src/index.d.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2792,6 +2792,50 @@ export type PkiEnrollmentRejectError =
27922792
| PkiEnrollmentRejectErrorOffline
27932793

27942794

2795+
// PkiEnrollmentSubmitError
2796+
export interface PkiEnrollmentSubmitErrorAlreadyEnrolled {
2797+
tag: "PkiEnrollmentSubmitErrorAlreadyEnrolled"
2798+
error: string
2799+
}
2800+
export interface PkiEnrollmentSubmitErrorAlreadySubmitted {
2801+
tag: "PkiEnrollmentSubmitErrorAlreadySubmitted"
2802+
error: string
2803+
}
2804+
export interface PkiEnrollmentSubmitErrorEmailAlreadyUsed {
2805+
tag: "PkiEnrollmentSubmitErrorEmailAlreadyUsed"
2806+
error: string
2807+
}
2808+
export interface PkiEnrollmentSubmitErrorIdAlreadyUsed {
2809+
tag: "PkiEnrollmentSubmitErrorIdAlreadyUsed"
2810+
error: string
2811+
}
2812+
export interface PkiEnrollmentSubmitErrorInternal {
2813+
tag: "PkiEnrollmentSubmitErrorInternal"
2814+
error: string
2815+
}
2816+
export interface PkiEnrollmentSubmitErrorInvalidPayload {
2817+
tag: "PkiEnrollmentSubmitErrorInvalidPayload"
2818+
error: string
2819+
}
2820+
export interface PkiEnrollmentSubmitErrorOffline {
2821+
tag: "PkiEnrollmentSubmitErrorOffline"
2822+
error: string
2823+
}
2824+
export interface PkiEnrollmentSubmitErrorPkiOperationError {
2825+
tag: "PkiEnrollmentSubmitErrorPkiOperationError"
2826+
error: string
2827+
}
2828+
export type PkiEnrollmentSubmitError =
2829+
| PkiEnrollmentSubmitErrorAlreadyEnrolled
2830+
| PkiEnrollmentSubmitErrorAlreadySubmitted
2831+
| PkiEnrollmentSubmitErrorEmailAlreadyUsed
2832+
| PkiEnrollmentSubmitErrorIdAlreadyUsed
2833+
| PkiEnrollmentSubmitErrorInternal
2834+
| PkiEnrollmentSubmitErrorInvalidPayload
2835+
| PkiEnrollmentSubmitErrorOffline
2836+
| PkiEnrollmentSubmitErrorPkiOperationError
2837+
2838+
27952839
// SelfShamirRecoveryInfo
27962840
export interface SelfShamirRecoveryInfoDeleted {
27972841
tag: "SelfShamirRecoveryInfoDeleted"
@@ -4703,6 +4747,14 @@ export function pathParent(
47034747
export function pathSplit(
47044748
path: string
47054749
): Promise<Array<string>>
4750+
export function pkiEnrollmentSubmit(
4751+
config: ClientConfig,
4752+
addr: string,
4753+
cert_ref: X509CertificateReference,
4754+
human_handle: HumanHandle,
4755+
device_label: string,
4756+
force: boolean
4757+
): Promise<Result<number, PkiEnrollmentSubmitError>>
47064758
export function showCertificateSelectionDialogWindowsOnly(
47074759
): Promise<Result<X509CertificateReference | null, ShowCertificateSelectionDialogError>>
47084760
export function testCheckMailbox(

bindings/electron/src/meths.rs

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
2290723056
fn 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,

bindings/generator/api/device.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
DeviceID,
77
DeviceLabel,
88
ErrorVariant,
9+
Handle,
910
HumanHandle,
1011
OrganizationID,
1112
Password,
@@ -16,7 +17,6 @@
1617
UserID,
1718
Variant,
1819
VariantItemUnit,
19-
Handle,
2020
)
2121
from .pki import X509CertificateReference
2222

bindings/generator/api/pki.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,23 @@
22

33
from typing import ClassVar
44

5+
from .addr import ParsecPkiEnrollmentAddr
56
from .common import (
67
Bytes,
78
BytesBasedType,
89
DateTime,
10+
DeviceLabel,
911
EnrollmentID,
1012
ErrorVariant,
13+
HumanHandle,
1114
Result,
1215
StrBasedType,
1316
Structure,
1417
UnitStructure,
1518
Variant,
1619
VariantItemTuple,
1720
)
21+
from .config import ClientConfig
1822

1923

2024
class X509CertificateHash(StrBasedType):
@@ -110,3 +114,32 @@ class AuthorNotAllowed: ...
110114
class EnrollmentNoLongerAvailable: ...
111115

112116
class EnrollmentNotFound: ...
117+
118+
119+
class PkiEnrollmentSubmitError(ErrorVariant):
120+
class Offline: ...
121+
122+
class Internal: ...
123+
124+
class AlreadyEnrolled: ...
125+
126+
class AlreadySubmitted: ...
127+
128+
class EmailAlreadyUsed: ...
129+
130+
class IdAlreadyUsed: ...
131+
132+
class InvalidPayload: ...
133+
134+
class PkiOperationError: ...
135+
136+
137+
async def pki_enrollment_submit(
138+
config: ClientConfig,
139+
addr: ParsecPkiEnrollmentAddr,
140+
cert_ref: X509CertificateReference,
141+
human_handle: HumanHandle,
142+
device_label: DeviceLabel,
143+
force: bool,
144+
) -> Result[DateTime, PkiEnrollmentSubmitError]:
145+
raise NotImplementedError

0 commit comments

Comments
 (0)