2012-10-07 140 views
3

我目前嘗試在Objective-C中擴展libssh2包裝器。SSH鍵盤交互式身份驗證

我試圖實施libssh2_userauth_keyboard_interactive方法。我的問題是響應回調。

我發現在網絡上此實現繞過「真正的」互動性和使用的實際密碼進行身份驗證可能:

int error = libssh2_userauth_keyboard_interactive(session, [username UTF8String], &kbdCallback); 

static void kbdCallback (const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract) 
{ 
    responses[0].text = (char *)[password UTF8String]; // resp. (char *)[@"test" UTF8String] 
    responses[0].length = strlen([password UTF8String]); // resp. (char *)[@"test" UTF8String] 
} 

我的一個問題是對static void中訪問實例變量password調用和我的另一個問題是,當我嘗試調用該方法時,我得到了SIGABRT(我使用了一個固定字符串來測試它是否有效)。

有沒有可能讓這個工作?

朱利安

回答

0

kbdCallback實際上不是一個方法,它是一個功能 - 你可以告訴一對夫婦的方式 - 沒有-或在它前面+,周圍的返回類型沒有括號,而且方法也不能static。所以,由於它是一個函數而不是一個方法,所以沒有與之關聯的對象,並且沒有指針;因此您無法直接訪問任何實例變量。我想有幾種方法可以解決這個問題。你可以有一個你的對象的靜態實例,該函數可以從中獲取密碼,或者如果有一些方法可以傳遞一個上下文指針以便在回調中使用,那麼你可以通過這種方式傳遞一個對象。

關於你的SIGABRT,你能說出究竟發生了哪一行,以及你使用的參數值是多少?你的問題並不清楚。

+0

更換

libssh2_session_init(); 

其實我不能通過任何上下文函數指針。當我改變傳遞的參數時,我得到了第一行的警告(對應於我上面的代碼):'不兼容的指針類型傳遞'。 'SIABRT'也發生在第一行。 –

+0

@Julian你可能不得不做一些不愉快的事情,比如在等待回調時將用戶名和密碼存儲在'static'變量中。另外,你可以說當參數崩潰時,什麼參數的值被傳遞給'libssh2_userauth_keyboard_interactive'? –

0

http://comments.gmane.org/gmane.network.ssh.libssh2.devel/4163

原因:的malloc-在-EXE-自由在-DLL在Win32下。
修復:使用自定義空閒/ malloc/realloc函數。下面添加

static void *my_alloc(size_t count, void **abstract)   { return malloc(count);} 
static void my_free(void *ptr, void **abstract)     { free(ptr);} 
static void *my_realloc(void *ptr, size_t count, void **abstract){ return realloc(ptr, count);} 

而且隨着

libssh2_session_init_ex(my_alloc, my_free, my_realloc, NULL); 
相關問題