2012-10-07 100 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); 
相关问题