@@ -682,106 +682,97 @@ static xmpp_stanza_t *_make_starttls(xmpp_conn_t *conn)
682682 return starttls ;
683683}
684684
685+ static int _add_sasl2_child (xmpp_ctx_t * ctx ,
686+ xmpp_stanza_t * dst ,
687+ const char * name ,
688+ const char * data )
689+ {
690+ xmpp_stanza_t * element = xmpp_stanza_new (ctx );
691+ if (!element )
692+ return 1 ;
693+ xmpp_stanza_t * sub = xmpp_stanza_new (ctx );
694+ if (!sub ) {
695+ xmpp_stanza_release (element );
696+ return 1 ;
697+ }
698+
699+ xmpp_stanza_set_name (element , name );
700+ xmpp_stanza_set_ns (element , XMPP_NS_SASL2 );
701+ xmpp_stanza_set_text (sub , data );
702+ xmpp_stanza_add_child_ex (element , sub , 0 );
703+ xmpp_stanza_add_child_ex (dst , element , 0 );
704+
705+ return 0 ;
706+ }
707+
685708static xmpp_stanza_t * _make_sasl_auth (xmpp_conn_t * conn ,
686709 const char * mechanism ,
687710 const char * initial_data )
688711{
689- xmpp_stanza_t * auth , * init , * user_agent ;
690- xmpp_stanza_t * inittxt = NULL ;
712+ xmpp_stanza_t * auth = NULL , * user_agent = NULL ;
691713
692714 /* build auth stanza */
693- if (initial_data ) {
694- inittxt = xmpp_stanza_new (conn -> ctx );
695- if (!inittxt )
696- return NULL ;
697- }
698715 auth = xmpp_stanza_new (conn -> ctx );
699- if (auth ) {
700- if (conn -> sasl_support & SASL_MASK_SASL2 ) {
701- xmpp_stanza_set_name (auth , "authenticate" );
702- xmpp_stanza_set_ns (auth , XMPP_NS_SASL2 );
703- if (initial_data ) {
704- init = xmpp_stanza_new (conn -> ctx );
705- if (!init ) {
706- xmpp_stanza_release (auth );
707- return NULL ;
708- }
709- xmpp_stanza_set_name (init , "initial-response" );
710- xmpp_stanza_set_ns (init , XMPP_NS_SASL2 );
711- xmpp_stanza_set_text (inittxt , initial_data );
712- xmpp_stanza_add_child_ex (init , inittxt , 0 );
713- xmpp_stanza_add_child_ex (auth , init , 0 );
716+ if (auth == NULL )
717+ return NULL ;
718+
719+ if (conn -> sasl_support & SASL_MASK_SASL2 ) {
720+ xmpp_stanza_set_name (auth , "authenticate" );
721+ xmpp_stanza_set_ns (auth , XMPP_NS_SASL2 );
722+ if (initial_data ) {
723+ if (_add_sasl2_child (conn -> ctx , auth , "initial-response" ,
724+ initial_data )) {
725+ goto error_out ;
714726 }
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 );
727+ }
728+ if (conn -> user_agent_id || conn -> user_agent_software ||
729+ conn -> user_agent_device ) {
730+ user_agent = xmpp_stanza_new (conn -> ctx );
731+ if (!user_agent ) {
732+ goto error_out ;
733+ }
734+ xmpp_stanza_set_name (user_agent , "user-agent" );
735+ xmpp_stanza_set_ns (user_agent , XMPP_NS_SASL2 );
736+ if (conn -> user_agent_id ) {
737+ xmpp_stanza_set_attribute (user_agent , "id" ,
738+ conn -> user_agent_id );
739+ }
740+ if (conn -> user_agent_software ) {
741+ if (_add_sasl2_child (conn -> ctx , user_agent , "software" ,
742+ conn -> user_agent_software )) {
743+ goto error_out ;
767744 }
768- xmpp_stanza_add_child_ex (auth , user_agent , 0 );
769745 }
770- } else {
771- xmpp_stanza_set_name (auth , "auth" );
772- xmpp_stanza_set_ns (auth , XMPP_NS_SASL );
773- if (initial_data ) {
774- xmpp_stanza_set_text (inittxt , initial_data );
775- xmpp_stanza_add_child_ex (auth , inittxt , 0 );
746+ if (conn -> user_agent_device ) {
747+ if (_add_sasl2_child (conn -> ctx , user_agent , "device" ,
748+ conn -> user_agent_device )) {
749+ goto error_out ;
750+ }
776751 }
752+ xmpp_stanza_add_child_ex (auth , user_agent , 0 );
777753 }
778- xmpp_stanza_set_attribute (auth , "mechanism" , mechanism );
779754 } else {
780- if (inittxt )
781- xmpp_stanza_release (inittxt );
755+ xmpp_stanza_set_name (auth , "auth" );
756+ xmpp_stanza_set_ns (auth , XMPP_NS_SASL );
757+ if (initial_data ) {
758+ xmpp_stanza_t * inittxt = xmpp_stanza_new (conn -> ctx );
759+ if (!inittxt ) {
760+ goto error_out ;
761+ }
762+ xmpp_stanza_set_text (inittxt , initial_data );
763+ xmpp_stanza_add_child_ex (auth , inittxt , 0 );
764+ }
782765 }
766+ xmpp_stanza_set_attribute (auth , "mechanism" , mechanism );
783767
784768 return auth ;
769+
770+ error_out :
771+ if (user_agent )
772+ xmpp_stanza_release (user_agent );
773+ if (auth )
774+ xmpp_stanza_release (auth );
775+ return NULL ;
785776}
786777
787778/* authenticate the connection
0 commit comments