2011-12-15 11 views
2

Ejabberdサーバー(バージョン2.1.9)とクライアントアプリケーションが正常に動作していますが、アプリケーションのXMPPクライアントがEjabberdに接続する方法を変更してリクエスト数を減らしたい/それらの間の応答、モバイル環境のためと私は最初の接続時間を短縮したいので。Ejabberd Single Request Sign On

XMPPプロトコル仕様(RFC 6120)といくつかのプロトコル拡張機能(XEP)を参照しました。つまり、XEP-0305 Quickstartですが、プロトコル自体にはシングルリクエストサインインとQuickstart拡張は指定されていませんが、私が探している時間短縮のための要求では不十分です。

私は、クライアントとサーバーの両方を変更するために開始し、概念実証として、今のところ次のことを達成したいしたすべての解決策を見つける検索していない後:

//Client Request 
<?xml version='1.0'?> 
<stream:stream ... user='user' pass='pass'> 

//Server Response 
<?xml version='1.0'?> 
<stream:stream ... success='1'> 

私は私のクライアントを変更することができましたしたがって、Ejabberdサーバーは正常に接続されているように見えますが、セッションを確立した後にクライアントが要求した場合でも、サーバーからの応答は得られません。私はWiresharkを使用してTCP接続クライアントとサーバー側を確認しました。クライアント側はオープンでリクエストは送信され、サーバー側も開いてリクエストが受信されますが、レスポンスを送信しようとすると送信されます。私は、ファイルejabberd_c2s.erlを変更したと変更は以下の通りです

//init function 
... 
%% changed the first state of the fsm to point to quickstart 
%%          {ok, wait_for_stream, #state{socket = Socket1, 
      {ok, wait_for_quickstart, #state{socket = Socket1, 
... 

//wait_for_quickstart function 
... 
case resource_conflict_action(U, StateData#state.server, R) of 
    closenew -> 
    send_header(StateData, Server, "1.0", DefaultLang, "0"), 
    send_trailer(StateData), 
    {stop, normal, StateData}; 
    {accept_resource, R2} -> 
     JID = jlib:make_jid(U, StateData#state.server, R2), 
     allow = acl:match_rule(Server,c2s,JID),   
     case ejabberd_auth:check_password(U, Server, P) of 
     true -> 
      send_header(StateData, Server, "1.0", DefaultLang, "1"), 
      change_shaper(StateData, JID), 
      {Fs, Ts} = ejabberd_hooks:run_fold(
      roster_get_subscription_lists, 
      StateData#state.server, 
      {[], []}, 
      [U, StateData#state.server]), 
      LJID = jlib:jid_tolower(jlib:jid_remove_resource(JID)), 
      Fs1 = [LJID | Fs], 
      Ts1 = [LJID | Ts], 
      PrivList = 
      ejabberd_hooks:run_fold(
      privacy_get_user_list, 
      StateData#state.server, 
      #userlist{}, 
      [U, StateData#state.server]), 
     SID = {now(), self()}, 
     Conn = get_conn_type(StateData), 
     Info = [{ip, StateData#state.ip}, 
     {conn, Conn}, 
     {auth_module, StateData#state.auth_module}], 
     ejabberd_sm:open_session(SID, U, StateData#state.server, R, Info), 
     NewStateData = 
      StateData#state{ 
      user = U, 
      resource = R2, 
      jid = JID, 
      sid = SID, 
      conn = Conn, 
      auth_module = ejabberd_auth_internal, 
      authenticated = true, 
      pres_f = ?SETS:from_list(Fs1), 
      pres_t = ?SETS:from_list(Ts1), 
      privacy_list = PrivList}, 
      fsm_next_state_pack(session_established, 
      NewStateData); 
     _ -> 
      %%auth fail 
      end 
end. 

だけ明確にする:最初のクライアント認証要求とサーバの応答がうまく送信されている、後続の要求もあります送信されても​​応答はありません。

私は何かを見落としていますか?失敗していたものだった実際ヌーノ・フレイタス@事前

+1

ルーティングに関する問題があるようです。リソースを生成していますか、またはユーザーがリソースを送信する必要がありますか?上記は指定しないでください。通常はバインド操作で実行されますが、スキップした後に失敗した可能性があります。 –

答えて

1

おかげで、あなたの役に立つ洞察力に感謝。

は、私は、コードを追加しました: #state.langが定義されていなかったため <presence/>タグは、サーバー上で破ったので、私が持っていた:私の要求にサーバーが応答をしたが、他の事に気を悪くはなかった
R1 = xml:get_attr_s("r",Attrs), 
R = case jlib:resourceprep(R1) of 
     error -> error; 
     "" -> 
     lists:concat([randoms:get_string() | tuple_to_list(now())]); 
     Resource -> Resource 
    end, 

それを wait_for_quickstart関数で定義して、XMPPクライアントサーバーの単一サインをコンセプトの証明としました。

関連する問題