]> uap-core.de Git - note.git/commitdiff
add session auth callback main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 27 Jun 2026 16:29:20 +0000 (18:29 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 27 Jun 2026 16:29:20 +0000 (18:29 +0200)
dav-rs/src/dav/ffi.rs
dav-rs/src/dav/session.rs
libidav/atomic.h
libidav/session.c
libidav/webdav.h

index aea58aa1bb766f75c4d56faef9b9195ae58c77ed..982296c99130b2cebd158ea18489bde5824363a2 100644 (file)
@@ -68,6 +68,11 @@ pub type DavReadFunc = Option<extern "C" fn(data: *const c_void, size: libc::siz
 pub type DavWriteFunc = Option<extern "C" fn(data: *const c_void, size: libc::size_t, count: libc::size_t, stream: *mut c_void) -> libc::size_t>;
 pub type DavSeekFunc = Option<extern "C" fn(stream: *mut c_void, offset: c_long, whence: c_int) -> c_int>;
 
+
+pub type DavDestructorFunc = Option<extern "C" fn(data: *mut c_void)>;
+
+pub type DavAuthCallback = Option<extern "C" fn(session: *mut DavSession, userdata: *mut c_void) -> c_int>;
+
 #[repr(C)]
 #[allow(dead_code)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
index b7d4b11bb2f7d2eb500e7e87bab1a4bfd7471e95..e744746e958be7a3e8b44efae4542fef209c169e 100644 (file)
  */
 #![allow(dead_code)]
 
-use std::ffi::{c_char, c_int, CStr, CString};
+use std::ffi::{c_char, c_int, c_void, CStr, CString};
 use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign};
 use crate::dav::context::DavContext;
 use crate::dav::ffi;
+use crate::dav::ffi::{DavAuthCallback, DavDestructorFunc};
 
 pub struct Session {
     pub ptr: *mut ffi::DavSession
@@ -54,6 +55,10 @@ impl Clone for Session {
     }
 }
 
+struct AuthCallbackWrapper {
+    callback: Box<dyn FnMut(&Session) -> bool>,
+}
+
 impl Session {
     pub fn set_auth(&self, user: &str, password: &str) {
         let user_cstr = CString::new(user).unwrap();
@@ -72,6 +77,26 @@ impl Session {
             dav_session_enable_encryption(self.ptr, flags.bits() as i32);
         }
     }
+
+    pub fn auth_callback<F>(&self, f: F)
+    where F: FnMut(&Session) -> bool + 'static {
+        let wrapper = Box::new( AuthCallbackWrapper { callback: Box::new(f) });
+        let raw = Box::into_raw(wrapper);
+        unsafe {
+            dav_session_reg_destructor(self.ptr, raw as *mut c_void, Some(auth_callback_destructor));
+            dav_session_set_authcallback(self.ptr, Some(auth_callback), raw as *mut c_void);
+        }
+    }
+}
+
+extern "C" fn auth_callback(sn: *mut ffi::DavSession, userdata: *mut c_void) -> c_int {
+    let wrapper: &mut AuthCallbackWrapper = unsafe { &mut *(userdata as *mut AuthCallbackWrapper) };
+    (wrapper.callback)(&Session { ptr: sn }) as c_int
+}
+
+extern "C" fn auth_callback_destructor(data: *mut c_void) {
+    let callback: Box<dyn FnMut(&Session) -> bool> = unsafe { Box::from_raw(data as *mut Box<dyn FnMut(&Session) -> bool>) };
+    drop(callback);
 }
 
 
@@ -233,9 +258,12 @@ unsafe extern "C" {
     fn dav_session_unref(sn: *mut ffi::DavSession);
     fn dav_session_clone(sn: *mut ffi::DavSession) -> *mut ffi::DavSession;
     fn dav_session_set_auth(sn: *mut ffi::DavSession, user: *const c_char, password: *const c_char);
+    fn dav_session_set_authcallback(sn: *mut ffi::DavSession, func: DavAuthCallback, userdata: *mut c_void);
 
     fn dav_session_get_error(sn: *const ffi::DavSession) -> ffi::DavError;
     fn dav_session_get_errorstr(sn: *const ffi::DavSession) -> *const c_char;
 
     fn dav_session_enable_encryption(sn: *mut ffi::DavSession, flags: c_int);
+
+    fn dav_session_reg_destructor(sn: *mut ffi::DavSession, data: *mut c_void, destructor: DavDestructorFunc);
 }
\ No newline at end of file
index 8f63d468e05edefb633777af19eefe44076180ba..44ed050bdeedef094c23f6a6371625bc53572518 100644 (file)
@@ -33,7 +33,7 @@
 extern "C" {
 #endif
 
-#if defined(__gnu_linux__) || defined(OSX) || defined(BSD)
+#if defined(__gnu_linux__) || defined(__APPLE__) || defined(__GNUC__) || defined(__clang__)
 
 #define dav_atomic_inc32(intptr) __sync_fetch_and_add(intptr, 1)
 #define dav_atomic_dec32(intptr) (__sync_fetch_and_sub(intptr, 1) - 1)
index 4d1b6c565d879bfabf6cbda464489a0f7d2e7e77..9937a04c738a8b4c99f5f600899275afeab22315 100644 (file)
@@ -406,6 +406,10 @@ char* dav_session_strdup(DavSession *sn, const char *str) {
     return cx_strdup_a(sn->mp->allocator, cx_str((char*)str)).ptr;
 }
 
+void  dav_session_reg_destructor(DavSession *sn, void *data, cx_destructor_func destr) {
+    cxMempoolRegister(sn->mp, data, destr);
+}
+
 
 char* dav_session_create_plain_href(DavSession *sn, const char *path) {
     if(!DAV_ENCRYPT_NAME(sn) && !DAV_DECRYPT_NAME(sn)) {
index 14f4160a6dedbe9678fdc56a19bcefc53e12c729..c5526d8cea767009d6c7d0c4c7556c538147de15 100644 (file)
@@ -317,6 +317,7 @@ void* dav_session_calloc(DavSession *sn, size_t nelm, size_t size);
 void* dav_session_realloc(DavSession *sn, void *ptr, size_t size);
 void  dav_session_free(DavSession *sn, void *ptr);
 char* dav_session_strdup(DavSession *sn, const char *str);
+void  dav_session_reg_destructor(DavSession *sn, void *data, cx_destructor_func destr);
 
 void dav_set_effective_href(DavSession *sn, DavResource *resource);
 DavResource* dav_get(DavSession *sn, char *path, const char *properties);