// File: /workspace/github_c_makefile_star2_O0/liuhaotian[P]xmppsh/libstrophe/src/auth.c
// Function: auth
static void _auth(xmpp_conn_t * const conn)
{
    xmpp_stanza_t *auth, *authdata, *query, *child, *iq;
    char *str, *authid;
    int anonjid;

    /* if there is no node in conn->jid, we assume anonymous connect */
    str = xmpp_jid_node(conn->ctx, conn->jid);
    if (str == NULL) {
	anonjid = 1;
    } else {
	xmpp_free(conn->ctx, str);
	anonjid = 0;
    }

    if (conn->tls_support)
    {
	tls_t *tls = tls_new(conn->ctx, conn->sock);

	/* If we couldn't init tls, it isn't there, so go on */
	if (!tls)
	{
	    conn->tls_support = 0;
	    _auth(conn);
	    return;
	}
	else
	{
	    tls_free(tls);
	}

	auth = _make_starttls(conn);

	if (!auth) {
	    disconnect_mem_error(conn);
	    return;
	}

	handler_add(conn, _handle_proceedtls_default, 
		    XMPP_NS_TLS, NULL, NULL, NULL);

	xmpp_send(conn, auth);
	xmpp_stanza_release(auth);

	/* TLS was tried, unset flag */
	conn->tls_support = 0;
    } else if (anonjid && conn->sasl_support & SASL_MASK_ANONYMOUS) {
	/* some crap here */
	auth = _make_sasl_auth(conn, "ANONYMOUS");
	if (!auth) {
	    disconnect_mem_error(conn);
	    return;
	}

	handler_add(conn, _handle_sasl_result, XMPP_NS_SASL,
	            NULL, NULL, "ANONYMOUS");

	xmpp_send(conn, auth);
	xmpp_stanza_release(auth);

	/* SASL ANONYMOUS was tried, unset flag */
	conn->sasl_support &= ~SASL_MASK_ANONYMOUS;
    } else if (anonjid) {
	xmpp_error(conn->ctx, "auth", 
		   "No node in JID, and SASL ANONYMOUS unsupported.");
	xmpp_disconnect(conn);
    } else if (conn->sasl_support & SASL_MASK_DIGESTMD5) {
	auth = _make_sasl_auth(conn, "DIGEST-MD5");
	if (!auth) {
	    disconnect_mem_error(conn);
	    return;

	}

	handler_add(conn, _handle_digestmd5_challenge, 
		    XMPP_NS_SASL, NULL, NULL, NULL);

	xmpp_send(conn, auth);
	xmpp_stanza_release(auth);

	/* SASL DIGEST-MD5 was tried, unset flag */
	conn->sasl_support &= ~SASL_MASK_DIGESTMD5;
    } else if (conn->sasl_support & SASL_MASK_PLAIN) {
	auth = _make_sasl_auth(conn, "PLAIN");
	if (!auth) {
	    disconnect_mem_error(conn);
	    return;
	}
	authdata = xmpp_stanza_new(conn->ctx);
	if (!authdata) {
	    disconnect_mem_error(conn);
	    return;
	}	
	authid = _get_authid(conn);
	if (!authid) {
	    disconnect_mem_error(conn);
	    return;
	}
	str = sasl_plain(conn->ctx, authid, conn->pass);
	if (!str) {
	    disconnect_mem_error(conn);
	    return;
	}
	xmpp_stanza_set_text(authdata, str);
	xmpp_free(conn->ctx, str);

	xmpp_stanza_add_child(auth, authdata);
	xmpp_stanza_release(authdata);

	handler_add(conn, _handle_sasl_result,
		    XMPP_NS_SASL, NULL, NULL, "PLAIN");

	xmpp_send(conn, auth);
	xmpp_stanza_release(auth);

	/* SASL PLAIN was tried */
	conn->sasl_support &= ~SASL_MASK_PLAIN;
    } else if (conn->type == XMPP_CLIENT) {
	/* legacy client authentication */
	
	iq = xmpp_stanza_new(conn->ctx);
	if (!iq) {
	    disconnect_mem_error(conn);
	    return;
	}
	xmpp_stanza_set_name(iq, "iq");
	xmpp_stanza_set_type(iq, "set");
	xmpp_stanza_set_id(iq, "_xmpp_auth1");

	query = xmpp_stanza_new(conn->ctx);
	if (!query) {
	    xmpp_stanza_release(iq);
	    disconnect_mem_error(conn);
	    return;
	}
	xmpp_stanza_set_name(query, "query");
	xmpp_stanza_set_ns(query, XMPP_NS_AUTH);
	xmpp_stanza_add_child(iq, query);
	xmpp_stanza_release(query);

	child = xmpp_stanza_new(conn->ctx);
	if (!child) {
	    xmpp_stanza_release(iq);
	    disconnect_mem_error(conn);
	    return;
	}
	xmpp_stanza_set_name(child, "username");
	xmpp_stanza_add_child(query, child);
	xmpp_stanza_release(child);

	authdata = xmpp_stanza_new(conn->ctx);
	if (!authdata) {
	    xmpp_stanza_release(iq);
	    disconnect_mem_error(conn);
	    return;
	}
	str = xmpp_jid_node(conn->ctx, conn->jid);
	xmpp_stanza_set_text(authdata, str);
	xmpp_free(conn->ctx, str);
	xmpp_stanza_add_child(child, authdata);
	xmpp_stanza_release(authdata);

	child = xmpp_stanza_new(conn->ctx);
	if (!child) {
	    xmpp_stanza_release(iq);
	    disconnect_mem_error(conn);
	    return;
	}
	xmpp_stanza_set_name(child, "password");
	xmpp_stanza_add_child(query, child);
	xmpp_stanza_release(child);

	authdata = xmpp_stanza_new(conn->ctx);
	if (!authdata) {
	    xmpp_stanza_release(iq);
	    disconnect_mem_error(conn);
	    return;
	}
	xmpp_stanza_set_text(authdata, conn->pass);
	xmpp_stanza_add_child(child, authdata);
	xmpp_stanza_release(authdata);

	child = xmpp_stanza_new(conn->ctx);
	if (!child) {
	    xmpp_stanza_release(iq);
	    disconnect_mem_error(conn);
	    return;
	}
	xmpp_stanza_set_name(child, "resource");
	xmpp_stanza_add_child(query, child);
	xmpp_stanza_release(child);

	authdata = xmpp_stanza_new(conn->ctx);
	if (!authdata) {
	    xmpp_stanza_release(iq);
	    disconnect_mem_error(conn);
	    return;
	}
	str = xmpp_jid_resource(conn->ctx, conn->jid);
	if (str) {
	    xmpp_stanza_set_text(authdata, str);
	    xmpp_free(conn->ctx, str);
	} else {
	    xmpp_stanza_release(authdata);
	    xmpp_stanza_release(iq);
	    xmpp_error(conn->ctx, "auth", 
		       "Cannot authenticate without resource");
	    xmpp_disconnect(conn);
	    return;
	}
	xmpp_stanza_add_child(child, authdata);
	xmpp_stanza_release(authdata);

	handler_add_id(conn, _handle_legacy, "_xmpp_auth1", NULL);
	handler_add_timed(conn, _handle_missing_legacy, 
			  LEGACY_TIMEOUT, NULL);

	xmpp_send(conn, iq);
	xmpp_stanza_release(iq);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rsi
callq 0x8ed0
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0x39a5
movl $0x1, -0x44(%rbp)
jmp 0x39bd
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x38(%rbp), %rsi
callq 0x66c0
movl $0x0, -0x44(%rbp)
movq -0x8(%rbp), %rax
cmpl $0x0, 0x40(%rax)
je 0x3a76
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x8(%rbp), %rax
movl 0x30(%rax), %esi
callq 0x13100
movq %rax, -0x50(%rbp)
cmpq $0x0, -0x50(%rbp)
jne 0x3a03
movq -0x8(%rbp), %rax
movl $0x0, 0x40(%rax)
movq -0x8(%rbp), %rdi
callq 0x3970
jmp 0x40a4
movq -0x50(%rbp), %rdi
callq 0x13220
movq -0x8(%rbp), %rdi
callq 0x40b0
movq %rax, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0x3a2e
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x8(%rbp), %rdi
leaq 0x6c7(%rip), %rsi       # 0x4100
leaq 0x10a16(%rip), %rdx     # 0x14456
xorl %eax, %eax
movl %eax, %r9d
movq %r9, %rcx
movq %r9, %r8
callq 0x85a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x6290
movq -0x10(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movl $0x0, 0x40(%rax)
jmp 0x40a4
cmpl $0x0, -0x44(%rbp)
je 0x3b06
movq -0x8(%rbp), %rax
movl 0x48(%rax), %eax
andl $0x4, %eax
cmpl $0x0, %eax
je 0x3b06
movq -0x8(%rbp), %rdi
leaq 0x10a23(%rip), %rsi     # 0x144bd
callq 0x4240
movq %rax, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0x3ab8
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x8(%rbp), %rdi
leaq 0x7ed(%rip), %rsi       # 0x42b0
leaq 0x109b7(%rip), %rdx     # 0x14481
xorl %eax, %eax
movl %eax, %r8d
leaq 0x109e7(%rip), %r9      # 0x144bd
movq %r8, %rcx
callq 0x85a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x6290
movq -0x10(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movl 0x48(%rax), %ecx
andl $-0x5, %ecx
movl %ecx, 0x48(%rax)
jmp 0x40a2
cmpl $0x0, -0x44(%rbp)
je 0x3b37
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
leaq 0x109f2(%rip), %rsi     # 0x1450d
leaq 0x109a5(%rip), %rdx     # 0x144c7
movb $0x0, %al
callq 0x68a0
movq -0x8(%rbp), %rdi
callq 0x5f10
jmp 0x40a0
movq -0x8(%rbp), %rax
movl 0x48(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
je 0x3bb9
movq -0x8(%rbp), %rdi
leaq 0x10961(%rip), %rsi     # 0x144b2
callq 0x4240
movq %rax, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0x3b6f
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x8(%rbp), %rdi
leaq 0x826(%rip), %rsi       # 0x43a0
leaq 0x10900(%rip), %rdx     # 0x14481
xorl %eax, %eax
movl %eax, %r9d
movq %r9, %rcx
movq %r9, %r8
callq 0x85a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x6290
movq -0x10(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movl 0x48(%rax), %ecx
andl $-0x3, %ecx
movl %ecx, 0x48(%rax)
jmp 0x409e
movq -0x8(%rbp), %rax
movl 0x48(%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x3cf4
movq -0x8(%rbp), %rdi
leaq 0x108d5(%rip), %rsi     # 0x144ac
callq 0x4240
movq %rax, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0x3bf5
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x3c1b
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x8(%rbp), %rdi
callq 0x4570
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x40(%rbp)
jne 0x3c3d
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x40(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x80(%rax), %rdx
callq 0xa9c0
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0x3c72
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x18(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x128e0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x38(%rbp), %rsi
callq 0x66c0
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x12850
movq -0x18(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
leaq 0x5ff(%rip), %rsi       # 0x42b0
leaq 0x107c9(%rip), %rdx     # 0x14481
xorl %eax, %eax
movl %eax, %r8d
leaq 0x107e8(%rip), %r9      # 0x144ac
movq %r8, %rcx
callq 0x85a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x6290
movq -0x10(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movl 0x48(%rax), %ecx
andl $-0x2, %ecx
movl %ecx, 0x48(%rax)
jmp 0x409c
movq -0x8(%rbp), %rax
cmpl $0x1, 0x10(%rax)
jne 0x409a
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
jne 0x3d28
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x30(%rbp), %rdi
leaq 0x102f3(%rip), %rsi     # 0x14026
callq 0x12550
movq -0x30(%rbp), %rdi
leaq 0x110e7(%rip), %rsi     # 0x14e2a
callq 0x12e20
movq -0x30(%rbp), %rdi
leaq 0x107a4(%rip), %rsi     # 0x144f7
callq 0x12df0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x3d87
movq -0x30(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x20(%rbp), %rdi
leaq 0x102a1(%rip), %rsi     # 0x14033
callq 0x12550
movq -0x20(%rbp), %rdi
leaq 0x10761(%rip), %rsi     # 0x14503
callq 0x12820
movq -0x30(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x12850
movq -0x20(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x3dec
movq -0x30(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x28(%rbp), %rdi
leaq 0x1071b(%rip), %rsi     # 0x14512
callq 0x12550
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x12850
movq -0x28(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x3e41
movq -0x30(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rsi
callq 0x8ed0
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x128e0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x38(%rbp), %rsi
callq 0x66c0
movq -0x28(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x12850
movq -0x18(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x3ebd
movq -0x30(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x28(%rbp), %rdi
leaq 0x10653(%rip), %rsi     # 0x1451b
callq 0x12550
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x12850
movq -0x28(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x3f12
movq -0x30(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x18(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x80(%rax), %rsi
callq 0x128e0
movq -0x28(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x12850
movq -0x18(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x3f6b
movq -0x30(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x28(%rbp), %rdi
leaq 0x105ca(%rip), %rsi     # 0x14540
callq 0x12550
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x12850
movq -0x28(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x11cb0
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x3fc0
movq -0x30(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
callq 0x13650
jmp 0x40a4
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rsi
callq 0x9040
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x38(%rbp)
je 0x4000
movq -0x18(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x128e0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x38(%rbp), %rsi
callq 0x66c0
jmp 0x403a
movq -0x18(%rbp), %rdi
callq 0x11f80
movq -0x30(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
leaq 0x104ec(%rip), %rsi     # 0x1450d
leaq 0x104fc(%rip), %rdx     # 0x14524
movb $0x0, %al
callq 0x68a0
movq -0x8(%rbp), %rdi
callq 0x5f10
jmp 0x40a4
movq -0x28(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x12850
movq -0x18(%rbp), %rdi
callq 0x11f80
movq -0x8(%rbp), %rdi
leaq 0x575(%rip), %rsi       # 0x45d0
leaq 0x10495(%rip), %rdx     # 0x144f7
xorl %eax, %eax
movl %eax, %ecx
callq 0x82a0
movq -0x8(%rbp), %rdi
leaq 0x6ba(%rip), %rsi       # 0x4730
movl $0x3a98, %edx           # imm = 0x3A98
xorl %eax, %eax
movl %eax, %ecx
callq 0x80c0
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x6290
movq -0x30(%rbp), %rdi
callq 0x11f80
jmp 0x409c
jmp 0x409e
jmp 0x40a0
jmp 0x40a2
jmp 0x40a4
addq $0x50, %rsp
popq %rbp
retq
nopw (%rax,%rax)