Exemple #1
0
/*
 * Соеденение с сервером и аутентификация
 */
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;
}
Exemple #2
0
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;
}
Exemple #3
0
//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);
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}