@@ -686,7 +686,7 @@ static xmpp_stanza_t *_make_sasl_auth(xmpp_conn_t *conn,
686686 const char * mechanism ,
687687 const char * initial_data )
688688{
689- xmpp_stanza_t * auth , * init ;
689+ xmpp_stanza_t * auth , * init , * user_agent ;
690690 xmpp_stanza_t * inittxt = NULL ;
691691
692692 /* build auth stanza */
@@ -712,6 +712,61 @@ static xmpp_stanza_t *_make_sasl_auth(xmpp_conn_t *conn,
712712 xmpp_stanza_add_child_ex (init , inittxt , 0 );
713713 xmpp_stanza_add_child_ex (auth , init , 0 );
714714 }
715+ if (conn -> user_agent_id || conn -> user_agent_software ||
716+ conn -> user_agent_device ) {
717+ user_agent = xmpp_stanza_new (conn -> ctx );
718+ if (!user_agent ) {
719+ xmpp_stanza_release (auth );
720+ return NULL ;
721+ }
722+ xmpp_stanza_set_name (user_agent , "user-agent" );
723+ xmpp_stanza_set_ns (user_agent , XMPP_NS_SASL2 );
724+ if (conn -> user_agent_id ) {
725+ xmpp_stanza_set_attribute (user_agent , "id" ,
726+ conn -> user_agent_id );
727+ }
728+ if (conn -> user_agent_software ) {
729+ xmpp_stanza_t * software = xmpp_stanza_new (conn -> ctx );
730+ if (!software ) {
731+ xmpp_stanza_release (user_agent );
732+ xmpp_stanza_release (auth );
733+ return NULL ;
734+ }
735+ xmpp_stanza_set_name (software , "software" );
736+ xmpp_stanza_set_ns (software , XMPP_NS_SASL2 );
737+ xmpp_stanza_t * txt = xmpp_stanza_new (conn -> ctx );
738+ if (!txt ) {
739+ xmpp_stanza_release (software );
740+ xmpp_stanza_release (user_agent );
741+ xmpp_stanza_release (auth );
742+ return NULL ;
743+ }
744+ xmpp_stanza_set_text (txt , conn -> user_agent_software );
745+ xmpp_stanza_add_child_ex (software , txt , 0 );
746+ xmpp_stanza_add_child_ex (user_agent , software , 0 );
747+ }
748+ if (conn -> user_agent_device ) {
749+ xmpp_stanza_t * device = xmpp_stanza_new (conn -> ctx );
750+ if (!device ) {
751+ xmpp_stanza_release (user_agent );
752+ xmpp_stanza_release (auth );
753+ return NULL ;
754+ }
755+ xmpp_stanza_set_name (device , "device" );
756+ xmpp_stanza_set_ns (device , XMPP_NS_SASL2 );
757+ xmpp_stanza_t * txt = xmpp_stanza_new (conn -> ctx );
758+ if (!txt ) {
759+ xmpp_stanza_release (device );
760+ xmpp_stanza_release (user_agent );
761+ xmpp_stanza_release (auth );
762+ return NULL ;
763+ }
764+ xmpp_stanza_set_text (txt , conn -> user_agent_device );
765+ xmpp_stanza_add_child_ex (device , txt , 0 );
766+ xmpp_stanza_add_child_ex (user_agent , device , 0 );
767+ }
768+ xmpp_stanza_add_child_ex (auth , user_agent , 0 );
769+ }
715770 } else {
716771 xmpp_stanza_set_name (auth , "auth" );
717772 xmpp_stanza_set_ns (auth , XMPP_NS_SASL );
0 commit comments