1use crate::{
6 ffi, AsyncResult, Cancellable, SocketConnectable, TlsCertificate, TlsCertificateFlags,
7 TlsDatabaseLookupFlags, TlsDatabaseVerifyFlags, TlsInteraction,
8};
9use glib::{prelude::*, translate::*};
10use std::{boxed::Box as Box_, pin::Pin};
11
12glib::wrapper! {
13 #[doc(alias = "GTlsDatabase")]
14 pub struct TlsDatabase(Object<ffi::GTlsDatabase, ffi::GTlsDatabaseClass>);
15
16 match fn {
17 type_ => || ffi::g_tls_database_get_type(),
18 }
19}
20
21impl TlsDatabase {
22 pub const NONE: Option<&'static TlsDatabase> = None;
23}
24
25pub trait TlsDatabaseExt: IsA<TlsDatabase> + 'static {
26 #[doc(alias = "g_tls_database_create_certificate_handle")]
27 fn create_certificate_handle(
28 &self,
29 certificate: &impl IsA<TlsCertificate>,
30 ) -> Option<glib::GString> {
31 unsafe {
32 from_glib_full(ffi::g_tls_database_create_certificate_handle(
33 self.as_ref().to_glib_none().0,
34 certificate.as_ref().to_glib_none().0,
35 ))
36 }
37 }
38
39 #[doc(alias = "g_tls_database_lookup_certificate_for_handle")]
40 fn lookup_certificate_for_handle(
41 &self,
42 handle: &str,
43 interaction: Option<&impl IsA<TlsInteraction>>,
44 flags: TlsDatabaseLookupFlags,
45 cancellable: Option<&impl IsA<Cancellable>>,
46 ) -> Result<Option<TlsCertificate>, glib::Error> {
47 unsafe {
48 let mut error = std::ptr::null_mut();
49 let ret = ffi::g_tls_database_lookup_certificate_for_handle(
50 self.as_ref().to_glib_none().0,
51 handle.to_glib_none().0,
52 interaction.map(|p| p.as_ref()).to_glib_none().0,
53 flags.into_glib(),
54 cancellable.map(|p| p.as_ref()).to_glib_none().0,
55 &mut error,
56 );
57 if error.is_null() {
58 Ok(from_glib_full(ret))
59 } else {
60 Err(from_glib_full(error))
61 }
62 }
63 }
64
65 #[doc(alias = "g_tls_database_lookup_certificate_for_handle_async")]
66 fn lookup_certificate_for_handle_async<
67 P: FnOnce(Result<TlsCertificate, glib::Error>) + 'static,
68 >(
69 &self,
70 handle: &str,
71 interaction: Option<&impl IsA<TlsInteraction>>,
72 flags: TlsDatabaseLookupFlags,
73 cancellable: Option<&impl IsA<Cancellable>>,
74 callback: P,
75 ) {
76 let main_context = glib::MainContext::ref_thread_default();
77 let is_main_context_owner = main_context.is_owner();
78 let has_acquired_main_context = (!is_main_context_owner)
79 .then(|| main_context.acquire().ok())
80 .flatten();
81 assert!(
82 is_main_context_owner || has_acquired_main_context.is_some(),
83 "Async operations only allowed if the thread is owning the MainContext"
84 );
85
86 let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
87 Box_::new(glib::thread_guard::ThreadGuard::new(callback));
88 unsafe extern "C" fn lookup_certificate_for_handle_async_trampoline<
89 P: FnOnce(Result<TlsCertificate, glib::Error>) + 'static,
90 >(
91 _source_object: *mut glib::gobject_ffi::GObject,
92 res: *mut crate::ffi::GAsyncResult,
93 user_data: glib::ffi::gpointer,
94 ) {
95 let mut error = std::ptr::null_mut();
96 let ret = ffi::g_tls_database_lookup_certificate_for_handle_finish(
97 _source_object as *mut _,
98 res,
99 &mut error,
100 );
101 let result = if error.is_null() {
102 Ok(from_glib_full(ret))
103 } else {
104 Err(from_glib_full(error))
105 };
106 let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
107 Box_::from_raw(user_data as *mut _);
108 let callback: P = callback.into_inner();
109 callback(result);
110 }
111 let callback = lookup_certificate_for_handle_async_trampoline::<P>;
112 unsafe {
113 ffi::g_tls_database_lookup_certificate_for_handle_async(
114 self.as_ref().to_glib_none().0,
115 handle.to_glib_none().0,
116 interaction.map(|p| p.as_ref()).to_glib_none().0,
117 flags.into_glib(),
118 cancellable.map(|p| p.as_ref()).to_glib_none().0,
119 Some(callback),
120 Box_::into_raw(user_data) as *mut _,
121 );
122 }
123 }
124
125 fn lookup_certificate_for_handle_future(
126 &self,
127 handle: &str,
128 interaction: Option<&(impl IsA<TlsInteraction> + Clone + 'static)>,
129 flags: TlsDatabaseLookupFlags,
130 ) -> Pin<Box_<dyn std::future::Future<Output = Result<TlsCertificate, glib::Error>> + 'static>>
131 {
132 let handle = String::from(handle);
133 let interaction = interaction.map(ToOwned::to_owned);
134 Box_::pin(crate::GioFuture::new(
135 self,
136 move |obj, cancellable, send| {
137 obj.lookup_certificate_for_handle_async(
138 &handle,
139 interaction.as_ref().map(::std::borrow::Borrow::borrow),
140 flags,
141 Some(cancellable),
142 move |res| {
143 send.resolve(res);
144 },
145 );
146 },
147 ))
148 }
149
150 #[doc(alias = "g_tls_database_lookup_certificate_issuer")]
151 fn lookup_certificate_issuer(
152 &self,
153 certificate: &impl IsA<TlsCertificate>,
154 interaction: Option<&impl IsA<TlsInteraction>>,
155 flags: TlsDatabaseLookupFlags,
156 cancellable: Option<&impl IsA<Cancellable>>,
157 ) -> Result<TlsCertificate, glib::Error> {
158 unsafe {
159 let mut error = std::ptr::null_mut();
160 let ret = ffi::g_tls_database_lookup_certificate_issuer(
161 self.as_ref().to_glib_none().0,
162 certificate.as_ref().to_glib_none().0,
163 interaction.map(|p| p.as_ref()).to_glib_none().0,
164 flags.into_glib(),
165 cancellable.map(|p| p.as_ref()).to_glib_none().0,
166 &mut error,
167 );
168 if error.is_null() {
169 Ok(from_glib_full(ret))
170 } else {
171 Err(from_glib_full(error))
172 }
173 }
174 }
175
176 #[doc(alias = "g_tls_database_lookup_certificate_issuer_async")]
177 fn lookup_certificate_issuer_async<P: FnOnce(Result<TlsCertificate, glib::Error>) + 'static>(
178 &self,
179 certificate: &impl IsA<TlsCertificate>,
180 interaction: Option<&impl IsA<TlsInteraction>>,
181 flags: TlsDatabaseLookupFlags,
182 cancellable: Option<&impl IsA<Cancellable>>,
183 callback: P,
184 ) {
185 let main_context = glib::MainContext::ref_thread_default();
186 let is_main_context_owner = main_context.is_owner();
187 let has_acquired_main_context = (!is_main_context_owner)
188 .then(|| main_context.acquire().ok())
189 .flatten();
190 assert!(
191 is_main_context_owner || has_acquired_main_context.is_some(),
192 "Async operations only allowed if the thread is owning the MainContext"
193 );
194
195 let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
196 Box_::new(glib::thread_guard::ThreadGuard::new(callback));
197 unsafe extern "C" fn lookup_certificate_issuer_async_trampoline<
198 P: FnOnce(Result<TlsCertificate, glib::Error>) + 'static,
199 >(
200 _source_object: *mut glib::gobject_ffi::GObject,
201 res: *mut crate::ffi::GAsyncResult,
202 user_data: glib::ffi::gpointer,
203 ) {
204 let mut error = std::ptr::null_mut();
205 let ret = ffi::g_tls_database_lookup_certificate_issuer_finish(
206 _source_object as *mut _,
207 res,
208 &mut error,
209 );
210 let result = if error.is_null() {
211 Ok(from_glib_full(ret))
212 } else {
213 Err(from_glib_full(error))
214 };
215 let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
216 Box_::from_raw(user_data as *mut _);
217 let callback: P = callback.into_inner();
218 callback(result);
219 }
220 let callback = lookup_certificate_issuer_async_trampoline::<P>;
221 unsafe {
222 ffi::g_tls_database_lookup_certificate_issuer_async(
223 self.as_ref().to_glib_none().0,
224 certificate.as_ref().to_glib_none().0,
225 interaction.map(|p| p.as_ref()).to_glib_none().0,
226 flags.into_glib(),
227 cancellable.map(|p| p.as_ref()).to_glib_none().0,
228 Some(callback),
229 Box_::into_raw(user_data) as *mut _,
230 );
231 }
232 }
233
234 fn lookup_certificate_issuer_future(
235 &self,
236 certificate: &(impl IsA<TlsCertificate> + Clone + 'static),
237 interaction: Option<&(impl IsA<TlsInteraction> + Clone + 'static)>,
238 flags: TlsDatabaseLookupFlags,
239 ) -> Pin<Box_<dyn std::future::Future<Output = Result<TlsCertificate, glib::Error>> + 'static>>
240 {
241 let certificate = certificate.clone();
242 let interaction = interaction.map(ToOwned::to_owned);
243 Box_::pin(crate::GioFuture::new(
244 self,
245 move |obj, cancellable, send| {
246 obj.lookup_certificate_issuer_async(
247 &certificate,
248 interaction.as_ref().map(::std::borrow::Borrow::borrow),
249 flags,
250 Some(cancellable),
251 move |res| {
252 send.resolve(res);
253 },
254 );
255 },
256 ))
257 }
258
259 #[doc(alias = "g_tls_database_lookup_certificates_issued_by")]
260 fn lookup_certificates_issued_by(
261 &self,
262 issuer_raw_dn: &glib::ByteArray,
263 interaction: Option<&impl IsA<TlsInteraction>>,
264 flags: TlsDatabaseLookupFlags,
265 cancellable: Option<&impl IsA<Cancellable>>,
266 ) -> Result<Vec<TlsCertificate>, glib::Error> {
267 unsafe {
268 let mut error = std::ptr::null_mut();
269 let ret = ffi::g_tls_database_lookup_certificates_issued_by(
270 self.as_ref().to_glib_none().0,
271 issuer_raw_dn.to_glib_none().0,
272 interaction.map(|p| p.as_ref()).to_glib_none().0,
273 flags.into_glib(),
274 cancellable.map(|p| p.as_ref()).to_glib_none().0,
275 &mut error,
276 );
277 if error.is_null() {
278 Ok(FromGlibPtrContainer::from_glib_full(ret))
279 } else {
280 Err(from_glib_full(error))
281 }
282 }
283 }
284
285 #[doc(alias = "g_tls_database_lookup_certificates_issued_by_async")]
286 fn lookup_certificates_issued_by_async<
287 P: FnOnce(Result<Vec<TlsCertificate>, glib::Error>) + 'static,
288 >(
289 &self,
290 issuer_raw_dn: &glib::ByteArray,
291 interaction: Option<&impl IsA<TlsInteraction>>,
292 flags: TlsDatabaseLookupFlags,
293 cancellable: Option<&impl IsA<Cancellable>>,
294 callback: P,
295 ) {
296 let main_context = glib::MainContext::ref_thread_default();
297 let is_main_context_owner = main_context.is_owner();
298 let has_acquired_main_context = (!is_main_context_owner)
299 .then(|| main_context.acquire().ok())
300 .flatten();
301 assert!(
302 is_main_context_owner || has_acquired_main_context.is_some(),
303 "Async operations only allowed if the thread is owning the MainContext"
304 );
305
306 let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
307 Box_::new(glib::thread_guard::ThreadGuard::new(callback));
308 unsafe extern "C" fn lookup_certificates_issued_by_async_trampoline<
309 P: FnOnce(Result<Vec<TlsCertificate>, glib::Error>) + 'static,
310 >(
311 _source_object: *mut glib::gobject_ffi::GObject,
312 res: *mut crate::ffi::GAsyncResult,
313 user_data: glib::ffi::gpointer,
314 ) {
315 let mut error = std::ptr::null_mut();
316 let ret = ffi::g_tls_database_lookup_certificates_issued_by_finish(
317 _source_object as *mut _,
318 res,
319 &mut error,
320 );
321 let result = if error.is_null() {
322 Ok(FromGlibPtrContainer::from_glib_full(ret))
323 } else {
324 Err(from_glib_full(error))
325 };
326 let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
327 Box_::from_raw(user_data as *mut _);
328 let callback: P = callback.into_inner();
329 callback(result);
330 }
331 let callback = lookup_certificates_issued_by_async_trampoline::<P>;
332 unsafe {
333 ffi::g_tls_database_lookup_certificates_issued_by_async(
334 self.as_ref().to_glib_none().0,
335 issuer_raw_dn.to_glib_none().0,
336 interaction.map(|p| p.as_ref()).to_glib_none().0,
337 flags.into_glib(),
338 cancellable.map(|p| p.as_ref()).to_glib_none().0,
339 Some(callback),
340 Box_::into_raw(user_data) as *mut _,
341 );
342 }
343 }
344
345 fn lookup_certificates_issued_by_future(
346 &self,
347 issuer_raw_dn: &glib::ByteArray,
348 interaction: Option<&(impl IsA<TlsInteraction> + Clone + 'static)>,
349 flags: TlsDatabaseLookupFlags,
350 ) -> Pin<
351 Box_<dyn std::future::Future<Output = Result<Vec<TlsCertificate>, glib::Error>> + 'static>,
352 > {
353 let issuer_raw_dn = issuer_raw_dn.clone();
354 let interaction = interaction.map(ToOwned::to_owned);
355 Box_::pin(crate::GioFuture::new(
356 self,
357 move |obj, cancellable, send| {
358 obj.lookup_certificates_issued_by_async(
359 &issuer_raw_dn,
360 interaction.as_ref().map(::std::borrow::Borrow::borrow),
361 flags,
362 Some(cancellable),
363 move |res| {
364 send.resolve(res);
365 },
366 );
367 },
368 ))
369 }
370
371 #[doc(alias = "g_tls_database_verify_chain")]
372 fn verify_chain(
373 &self,
374 chain: &impl IsA<TlsCertificate>,
375 purpose: &str,
376 identity: Option<&impl IsA<SocketConnectable>>,
377 interaction: Option<&impl IsA<TlsInteraction>>,
378 flags: TlsDatabaseVerifyFlags,
379 cancellable: Option<&impl IsA<Cancellable>>,
380 ) -> Result<TlsCertificateFlags, glib::Error> {
381 unsafe {
382 let mut error = std::ptr::null_mut();
383 let ret = ffi::g_tls_database_verify_chain(
384 self.as_ref().to_glib_none().0,
385 chain.as_ref().to_glib_none().0,
386 purpose.to_glib_none().0,
387 identity.map(|p| p.as_ref()).to_glib_none().0,
388 interaction.map(|p| p.as_ref()).to_glib_none().0,
389 flags.into_glib(),
390 cancellable.map(|p| p.as_ref()).to_glib_none().0,
391 &mut error,
392 );
393 if error.is_null() {
394 Ok(from_glib(ret))
395 } else {
396 Err(from_glib_full(error))
397 }
398 }
399 }
400
401 #[doc(alias = "g_tls_database_verify_chain_async")]
402 fn verify_chain_async<P: FnOnce(Result<TlsCertificateFlags, glib::Error>) + 'static>(
403 &self,
404 chain: &impl IsA<TlsCertificate>,
405 purpose: &str,
406 identity: Option<&impl IsA<SocketConnectable>>,
407 interaction: Option<&impl IsA<TlsInteraction>>,
408 flags: TlsDatabaseVerifyFlags,
409 cancellable: Option<&impl IsA<Cancellable>>,
410 callback: P,
411 ) {
412 let main_context = glib::MainContext::ref_thread_default();
413 let is_main_context_owner = main_context.is_owner();
414 let has_acquired_main_context = (!is_main_context_owner)
415 .then(|| main_context.acquire().ok())
416 .flatten();
417 assert!(
418 is_main_context_owner || has_acquired_main_context.is_some(),
419 "Async operations only allowed if the thread is owning the MainContext"
420 );
421
422 let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
423 Box_::new(glib::thread_guard::ThreadGuard::new(callback));
424 unsafe extern "C" fn verify_chain_async_trampoline<
425 P: FnOnce(Result<TlsCertificateFlags, glib::Error>) + 'static,
426 >(
427 _source_object: *mut glib::gobject_ffi::GObject,
428 res: *mut crate::ffi::GAsyncResult,
429 user_data: glib::ffi::gpointer,
430 ) {
431 let mut error = std::ptr::null_mut();
432 let ret =
433 ffi::g_tls_database_verify_chain_finish(_source_object as *mut _, res, &mut error);
434 let result = if error.is_null() {
435 Ok(from_glib(ret))
436 } else {
437 Err(from_glib_full(error))
438 };
439 let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
440 Box_::from_raw(user_data as *mut _);
441 let callback: P = callback.into_inner();
442 callback(result);
443 }
444 let callback = verify_chain_async_trampoline::<P>;
445 unsafe {
446 ffi::g_tls_database_verify_chain_async(
447 self.as_ref().to_glib_none().0,
448 chain.as_ref().to_glib_none().0,
449 purpose.to_glib_none().0,
450 identity.map(|p| p.as_ref()).to_glib_none().0,
451 interaction.map(|p| p.as_ref()).to_glib_none().0,
452 flags.into_glib(),
453 cancellable.map(|p| p.as_ref()).to_glib_none().0,
454 Some(callback),
455 Box_::into_raw(user_data) as *mut _,
456 );
457 }
458 }
459
460 fn verify_chain_future(
461 &self,
462 chain: &(impl IsA<TlsCertificate> + Clone + 'static),
463 purpose: &str,
464 identity: Option<&(impl IsA<SocketConnectable> + Clone + 'static)>,
465 interaction: Option<&(impl IsA<TlsInteraction> + Clone + 'static)>,
466 flags: TlsDatabaseVerifyFlags,
467 ) -> Pin<
468 Box_<dyn std::future::Future<Output = Result<TlsCertificateFlags, glib::Error>> + 'static>,
469 > {
470 let chain = chain.clone();
471 let purpose = String::from(purpose);
472 let identity = identity.map(ToOwned::to_owned);
473 let interaction = interaction.map(ToOwned::to_owned);
474 Box_::pin(crate::GioFuture::new(
475 self,
476 move |obj, cancellable, send| {
477 obj.verify_chain_async(
478 &chain,
479 &purpose,
480 identity.as_ref().map(::std::borrow::Borrow::borrow),
481 interaction.as_ref().map(::std::borrow::Borrow::borrow),
482 flags,
483 Some(cancellable),
484 move |res| {
485 send.resolve(res);
486 },
487 );
488 },
489 ))
490 }
491}
492
493impl<O: IsA<TlsDatabase>> TlsDatabaseExt for O {}