2015-01-06 3 views
0

Я пытаюсь реализовать клиент XMPP Chat в Windows Phone 8.1, используя this library. Поскольку эта библиотека не поддерживает новую регистрацию пользователя, я пытаюсь включить ее в исходный код. Я использовал отдельный ServerFeaturesState для регистрации и назвал его RegisterServerFeaturesState. Теперь, когда я посылаю регистрации строфу, я получаю код ошибки 400.
Вот что я посылаю -Регистрация XMPP порождает ошибку 400 ошибок

<iq id="U4" type="set" xmlns="jabber:client"> 
    <query xmlns="jabber:iq:register"> 
    <username>[email protected]/RESOURCE</username> 
    <password>password1234</password> 
    </query> 
</iq> 

и вот что я получаю взамен -

<iq from="domain.lt" id="U5" type="error" xmlns="jabber:client"> 
    <query xmlns="jabber:iq:register"> 
    <username>[email protected]/RESOURCE</username> 
    <password>password1234</password> 
    </query> 
    <error code="400" type="modify"> 
    <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /> 
    </error> 
    <!--[TS]1/6/2015 4:45:37 PM--> 
</iq> 

Я использую следующий код в Execute методе моего состояния -

public override void Execute(Tag data = null) 
     { 
#if DEBUG 
      Manager.Events.LogMessage(this, LogType.Debug, "Starting RegisterServerFeaturesState Execution "+data); 
#endif 
      tags.streams.features features = null; 
      tags.jabber.client.iq iqRoot = null; 

      if (data is tags.streams.stream) 
      { 
       tags.streams.stream stream = data as tags.streams.stream; 
       if (!stream.version.StartsWith("1.")) 
       { 
        Manager.Events.Error(this, ErrorType.XMPPVersionNotSupported, ErrorPolicyType.Deactivate, "Expecting stream:features from 1.x server"); 
        return; 
       } 
       features = stream.features; 
#if DEBUG 
       Manager.Events.LogMessage(this, LogType.Debug, "RegisterServerFeaturesState stream"); 
#endif 
      } 
      else if (data is tags.streams.error) 
      { 
       var error = data as tags.streams.error; 
       string message = string.Empty; 

       if(error.HasElements) 
       { 
        var text = error.Element<tags.xmpp_streams.text>(tags.xmpp_streams.Namespace.text); 
        if (text != null) 
        { 
         message = text.Value; 
        } 
        else if(error.Elements().Count() > 0) 
        { 
         var element = error.Elements().First(); 
         if(element != null) 
          message = element.Name.LocalName; 
        } 
       } 

       Manager.Events.Error(this, ErrorType.ServerError, ErrorPolicyType.Reconnect, message); 
       return; 
      } 
      else if (data is tags.streams.features) 
      { 
       features = data as tags.streams.features; 
      } 
      else if (data is tags.jabber.client.iq) 
      { 
       iqRoot = data as tags.jabber.client.iq; 
      } 

      if (features != null) 
      { 
       if (features.starttls != null && Manager.Settings.SSL) 
       { 
        Manager.State = new StartTLSState(Manager); 
        tags.xmpp_tls.starttls tls = new tags.xmpp_tls.starttls(); 
        Manager.Connection.Send(tls); 
#if DEBUG 
        Manager.Events.LogMessage(this, LogType.Debug, "RegisterServerFeaturesState starttls"); 
#endif 
        return; 
       } 

       if (!Manager.IsRegistrationFeatureRequested) 
       { 
        var iq = new tags.jabber.client.iq(); 
        iq.type = tags.jabber.client.iq.typeEnum.get; 
        var query = new tags.jabber.iq.register.query(); 
        iq.Add(query); 
        Manager.Connection.Send(iq); 
        Manager.IsRegistrationFeatureRequested = true; 
        registrationRequestID = iq.id; 
        return; 
       } 
      } 
      else if (iqRoot != null) 
      { 
       if (Manager.IsRegistrationFeatureRequested) 
       { 
        if (iqRoot.type == tags.jabber.client.iq.typeEnum.result) 
        { 
#if DEBUG 
         Manager.Events.LogMessage(this, LogType.Debug, "Registration Instructions: Step 1"); 
#endif 
         var query = iqRoot.Element<tags.jabber.iq.register.query>(tags.jabber.iq.register.Namespace.query); 
         if (query != null) 
         { 
#if DEBUG 
          Manager.Events.LogMessage(this, LogType.Debug, "Registration Instructions: Step 2"); 
#endif 
          var instruction = query.Element<tags.jabber.iq.register.instructions>(tags.jabber.iq.register.Namespace.instructions); 
          if (instruction != null) 
          { 
#if DEBUG 
           Manager.Events.LogMessage(this, LogType.Debug, "Registration Instructions: " + instruction.Value); 
#endif 
           var username = query.Element<tags.jabber.iq.register.username>(tags.jabber.iq.register.Namespace.username); 
           var password = query.Element<tags.jabber.iq.register.password>(tags.jabber.iq.register.Namespace.password); 
           if (username != null && password != null) 
           { 
            var iq = new tags.jabber.client.iq(); 
            iq.type = tags.jabber.client.iq.typeEnum.set; 
            iq.to = iqRoot.from; 
            var requestQuery = new tags.jabber.iq.register.query(); 
            var userTag = new tags.jabber.iq.register.username(); 
            userTag.Value = Manager.Settings.Id; 
            var passTag = new tags.jabber.iq.register.password(); 
            passTag.Value = Manager.Settings.Password; 
            requestQuery.Add(userTag); 
            requestQuery.Add(passTag); 
            iq.Add(requestQuery); 
            Manager.Connection.Send(iq); 
            Manager.IsRegistrationRequestSent = true; 
            return; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Вот что получение инструкции о регистрации говорит

<iq from="domain.lt" id="U3" type="result" xmlns="jabber:client"> 
    <query xmlns="jabber:iq:register"> 
    <instructions>Choose a username and password to register with this server</instructions> 
    <username></username> 
    <password /> 
    </query> 

Я не уверен, что означает код ошибки 400. Я что-то забываю в регистрационной строфе?

+0

Серверы обычно ожидают только имя пользователя в элементе '', а не имя пользователя @ server/resource. Попробуйте указать только ' пользователь' там. – legoscia

+0

@legoscia Черт! Я потратил 3 часа на это, и все было так просто. Большое спасибо. Можете ли вы дать ему ответ, чтобы я мог принять его? – noob

ответ

1

В запросе регистрации вы указываете полный JID (имя пользователя, сервер и ресурс):

<username>[email protected]/RESOURCE</username> 

Однако серверы обычно ожидают только имя пользователя там, так что попробуйте вместо этого:

<username>user</username> 

Я не вижу, что это явно указано в XEP-0077, но, по крайней мере, это то, что показывают примеры.

Смежные вопросы