/* * Соеденение с сервером и аутентификация */ LmConnection* jid_connect(const struct _jid *jid, GMainContext *context) { LmConnection *new_connect; GError *error = NULL; // Проверяем context if(!context) context = g_main_context_default(); // Создаём соединение и пытаемся соедениться new_connect = lm_connection_new_with_context(jid->server, context); if(!lm_connection_open_and_block(new_connect, &error)) { g_print ("Couldn't open connection to '%s':\n%s\n", jid->server, error->message); return NULL; } // Авторизируемся if(!lm_connection_authenticate_and_block(new_connect, jid->username, jid->password, jid->resource, &error)) { g_print("Couldn't authenticate with '%s' '%s':\n%s\n", jid->username, jid->password, error->message); return NULL; } printf("Established connect with %s\n", jid->server); return new_connect; }
gboolean xmpp_connect(Xinb *x) { gchar *server = g_hash_table_lookup(x->config, "server"); gchar *username = g_hash_table_lookup(x->config, "username"); gchar *password = g_hash_table_lookup(x->config, "password"); gchar *resource = g_hash_table_lookup(x->config, "resource"); x->conn = lm_connection_new_with_context(server, x->context); x->state = LM_CONNECTION_STATE_OPENING; if(!lm_connection_open_and_block(x->conn, &(x->gerror))) { log_record(x, LOGS_ERR, "Couldn't open new connection to '%s': %s", server, x->gerror->message); g_clear_error(&(x->gerror)); return FALSE; } x->state = LM_CONNECTION_STATE_OPEN; if(!lm_connection_authenticate_and_block(x->conn, username, password, resource, &(x->gerror))) { log_record(x, LOGS_ERR, "Couldn't authenticate with '%s', '%s': %s", username, password, x->gerror->message); g_clear_error(&(x->gerror)); return FALSE; } x->state = LM_CONNECTION_STATE_AUTHENTICATED; log_record(x, LOGS_INFO, "'%s@%s/%s' has been connected", username, server, resource); return TRUE; }
//doc Loudmouth registerAccount(server, username, password) Registers a new account at XMPP server. Returns <code>true</code> or <code>false</code>. IoObject *IoLoudmouth_registerAccount(IoLoudmouth *self, IoObject *locals, IoMessage *m) { char *server = IoMessage_locals_cStringArgAt_(m, locals, 0), *username = IoMessage_locals_cStringArgAt_(m, locals, 1), *password = IoMessage_locals_cStringArgAt_(m, locals, 2), *error_message = "Unknown error"; LmConnection *connection = lm_connection_new(server); LmMessage *xmpp_msg, *xmpp_reply; LmMessageNode *query, *node; int success = 0; if(!lm_connection_open_and_block(connection, NULL)) { error_message = "Could not open connection"; success = 0; } else { xmpp_msg = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); query = lm_message_node_add_child(xmpp_msg->node, "query", NULL); lm_message_node_set_attributes(query, "xmlns", "jabber:iq:register", NULL); lm_message_node_add_child(query, "username", username); lm_message_node_add_child(query, "password", password); xmpp_reply = lm_connection_send_with_reply_and_block(connection, xmpp_msg, NULL); lm_connection_close(connection, NULL); lm_connection_unref(connection); if(!xmpp_reply) { success = 0; error_message = "No reply from server"; } else { switch(lm_message_get_sub_type(xmpp_reply)) { case LM_MESSAGE_SUB_TYPE_RESULT: success = 1; break; case LM_MESSAGE_SUB_TYPE_ERROR: default: success = 0; node = lm_message_node_find_child(xmpp_reply->node, "error"); error_message = (node == NULL) ? lm_message_node_get_value(node) : "Unknown error"; lm_message_node_unref(node); } } lm_message_unref(xmpp_reply); lm_message_unref(xmpp_msg); lm_message_node_unref(query); } free(server); free(username); free(password); IOASSERT(success, error_message); free(error_message); return IOBOOL(self, success); }
boolean xmpp_connect (const char *user, const char * passwd, const char * server, unsigned short port) { GError * error = NULL; LmMessage * m; LmMessage * reply; LmMessageNode * query; LmMessageNode * item; gboolean success; lm_connection_set_server (connection, server); lm_connection_set_port (connection, port); g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, _("Connecting to %s..."), server); success = lm_connection_open_and_block (connection, &error); if (!success) goto error; g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, _("Authenticating with JID %s..."), user); success = lm_connection_authenticate_and_block (connection, user, passwd, CONN_XMPP_RESOURCE, &error); if (!success) goto error; g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, _("Connected successfully."), user); /* Fetch roster */ m = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET); query = lm_message_node_add_child (m->node, "query", NULL); lm_message_node_set_attributes (query, "xmlns", "jabber:iq:roster", NULL); reply = lm_connection_send_with_reply_and_block (connection, m, &error); query = lm_message_node_get_child (reply->node, "query"); item = lm_message_node_get_child (query, "item"); while (item) { xmpp_user_t user; const gchar *jid, *name; jid = lm_message_node_get_attribute (item, "jid"); name = lm_message_node_get_attribute (item, "name"); user = intern_user (jid); user->name = g_strdup (name); user->status = OFFLINE; item = item->next; } lm_message_unref (reply); lm_message_unref (m); m = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_PRESENCE, LM_MESSAGE_SUB_TYPE_AVAILABLE); lm_connection_send(connection, m, NULL); lm_message_unref (m); return TRUE; /* Error handling */ error: g_message ("%s", error->message); return FALSE; }
gboolean jid_reg(struct _jid *jid, GMainContext *context) { LmConnection *reg_connect; LmMessage *m, *reply; LmMessageNode *query, *node; GError *error = NULL; // Проверяем context if(!context) context = g_main_context_default(); // Подключаемся reg_connect = lm_connection_new_with_context(jid->server, context); // Настраиваем ssl /* if(jid->use_ssl) { LmSSL *ssl; // Проверяем поддержку ssl if(!lm_ssl_is_supported()) { g_print("Your Loudmouth doesn't support SSL. Reinstall loudmouth.\n"); jid->use_ssl = FALSE; } g_print("Configure ssl\n"); ssl = lm_ssl_new(NULL, LM_SSL_RESPONSE_CONTINUE, NULL, NULL); lm_connection_set_ssl(reg_connect, ssl); lm_ssl_unref(ssl); lm_connection_set_port(reg_connect, LM_CONNECTION_DEFAULT_PORT_SSL); } */ // Проверяем коннект if(!lm_connection_open_and_block(reg_connect, &error)) { fprintf(stderr, "Failed to open connection: %s\n", error->message); return FALSE; } // Определяем сообщение m = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); // Составляем запрос query = lm_message_node_add_child(m->node, "query", NULL); lm_message_node_set_attributes(query, "xmlns", "jabber:iq:register", NULL); lm_message_node_add_child(query, "username", jid->username); lm_message_node_add_child(query, "password", jid->password); // Отпревляем сообщение и ждём ответ reply = lm_connection_send_with_reply_and_block(reg_connect, m, &error); if(!reply) { fprintf(stderr, "Failed to send registration request on server \"%s\":\n %s\n", jid->server, error->message); return FALSE; } //Закрываем соединение lm_connection_close(reg_connect, NULL); lm_connection_unref(reg_connect); // Проверяем ответ switch(lm_message_get_sub_type(reply)) { case LM_MESSAGE_SUB_TYPE_RESULT: g_print("Succeeded in register account '%s@%s'\n", jid->username, jid->server); break; case LM_MESSAGE_SUB_TYPE_ERROR: default: g_print("Failed to register account '%s@%s' due to: ", jid->username, jid->server); node = lm_message_node_find_child(reply->node, "error"); if(node) g_print("%s\n", lm_message_node_get_value (node)); else g_print("Unknown error\n"); return FALSE; break; } return TRUE; }