3

現在、Objective-C で libssh2 ラッパーを拡張しようとしています。

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]
}

password私の問題の 1 つは、呼び出し内でインスタンス変数にアクセスすることです。もう 1 つの問題static voidは、メソッドを呼び出そうとすると SIGABRT が発生することです (固定文字列を使用して、それが機能するかどうかをテストしました)。

それを機能させる可能性はありますか?!

ジュリアン

4

2 に答える 2

0

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

原因: Win32 での malloc-in-EXE-free-in-DLL。
修正:カスタムの free/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();

libssh2_session_init_ex(my_alloc, my_free, my_realloc, NULL);
于 2013-08-28T18:13:03.270 に答える
0

kbdCallbackは実際にはメソッドではなく、関数です - いくつかの方法を知ることができます - ない-+、その前になく、戻り値の型を括弧で囲みません。また、メソッドは ではありませんstatic。したがって、メソッドではなく関数であるため、それに関連付けられたオブジェクトもselfポインターもありません。したがって、インスタンス変数に直接アクセスすることはできません。これを解決するにはいくつかの方法があると思います。関数がパスワードを取得できるオブジェクトの静的インスタンスを持つことができます。または、コールバックで使用されるコンテキスト ポインターを渡す方法があれば、その方法でオブジェクトを渡すことができます。

あなたの について、SIGABRT正確にどの行で発生し、使用している引数の値は何ですか? あなたの質問からは明らかではありません。

于 2012-10-08T06:11:00.980 に答える