コード例 #1
0
ファイル: group-mgr.c プロジェクト: aclindsa/ccnet
static int
create_group_common (CcnetGroupManager *mgr,
                     const char *group_name,
                     const char *user_name,
                     GError **error)
{
    CcnetDB *db = mgr->priv->db;
    gint64 now = get_current_time();
    char sql[512];
    int group_id = -1;

    char *user_name_l = g_ascii_strdown (user_name, -1);
    
    if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL)
        snprintf (sql, sizeof(sql), "INSERT INTO \"Group\"(group_name, "
                  "creator_name, timestamp) VALUES('%s', '%s', "
                  "%"G_GINT64_FORMAT")", group_name, user_name_l, now);
    else
        snprintf (sql, sizeof(sql), "INSERT INTO `Group`(`group_name`, "
                  "`creator_name`, `timestamp`) VALUES('%s', '%s', "
                  "%"G_GINT64_FORMAT")", group_name, user_name_l, now);

    if (ccnet_db_query (db, sql) < 0) {
        g_set_error (error, CCNET_DOMAIN, 0, "Failed to create group");
        goto out;
    }

    if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL)
        snprintf (sql, sizeof(sql),"SELECT group_id FROM \"Group\" WHERE "
                  "group_name = '%s' AND creator_name = '%s' AND"
                  " timestamp = %"G_GINT64_FORMAT"", group_name, user_name_l, now);
    else
        snprintf (sql, sizeof(sql),"SELECT `group_id` FROM `Group` WHERE "
                  "`group_name` = '%s' AND `creator_name` = '%s' AND"
                  " `timestamp` = %"G_GINT64_FORMAT"", group_name, user_name_l, now);
    group_id = ccnet_db_get_int (db, sql);
    if (group_id < 0) {
        g_set_error (error, CCNET_DOMAIN, 0, "Failed to create group");
        goto out;
    }
    
    snprintf (sql, sizeof(sql), "INSERT INTO GroupUser VALUES (%d, '%s', %d)",
              group_id, user_name_l, 1);
    if (ccnet_db_query (db, sql) < 0) {
        if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL)
            snprintf (sql, sizeof(sql), "DELETE FROM \"Group\" WHERE group_id=%d",
                      group_id);
        else
            snprintf (sql, sizeof(sql), "DELETE FROM `Group` WHERE group_id=%d",
                      group_id);
        ccnet_db_query (db, sql);
        g_set_error (error, CCNET_DOMAIN, 0, "Failed to create group");
        group_id = -1;
        goto out;
    }

out:
    g_free (user_name_l);
    return group_id;
}
コード例 #2
0
ファイル: group-mgr.c プロジェクト: blablup/ccnet
int ccnet_group_manager_remove_group (CcnetGroupManager *mgr,
                                      int group_id,
                                      const char *user_name,
                                      GError **error)
{
    CcnetDB *db = mgr->priv->db;
    char sql[512];

    /* No permission check here, since both group staff and seahub staff
     * can remove group.
     */

    if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL)
        snprintf (sql, sizeof(sql), "DELETE FROM \"Group\" WHERE group_id=%d",
                  group_id);
    else
        snprintf (sql, sizeof(sql), "DELETE FROM `Group` WHERE group_id=%d",
                  group_id);
    ccnet_db_query (db, sql);

    snprintf (sql, sizeof(sql), "DELETE FROM GroupUser WHERE group_id=%d",
              group_id);
    ccnet_db_query (db, sql);

    return 0;
}
コード例 #3
0
ファイル: group-mgr.c プロジェクト: blablup/ccnet
int ccnet_group_manager_quit_group (CcnetGroupManager *mgr,
                                    int group_id,
                                    const char *user_name,
                                    GError **error)
{
    CcnetDB *db = mgr->priv->db;
    char sql[512];

    /* check where user is the staff of the group */
    if (check_group_staff (db, group_id, user_name)) {
        g_set_error (error, CCNET_DOMAIN, 0,
                     "Group staff can not quit group");
        return -1;
    }

    /* check whether group exists */
    if (!check_group_exists (db, group_id)) {
        g_set_error (error, CCNET_DOMAIN, 0, "Group not exists");
        return -1;
    }

    snprintf (sql, sizeof(sql), "DELETE FROM GroupUser WHERE group_id=%d "
              "AND user_name='%s'", group_id, user_name);
    ccnet_db_query (db, sql);

    return 0;
}
コード例 #4
0
ファイル: group-mgr.c プロジェクト: blablup/ccnet
int ccnet_group_manager_remove_member (CcnetGroupManager *mgr,
                                       int group_id,
                                       const char *user_name,
                                       const char *member_name,
                                       GError **error)
{
    CcnetDB *db = mgr->priv->db;
    char sql[512];

    /* check whether user is the staff of the group */
    if (!check_group_staff (db, group_id, user_name)) {
        g_set_error (error, CCNET_DOMAIN, 0,
                     "Only group staff can remove member");
        return -1;
    }

    /* check whether group exists */
    if (!check_group_exists (db, group_id)) {
        g_set_error (error, CCNET_DOMAIN, 0, "Group not exists");
        return -1;
    }

    /* can not remove myself */
    if (g_strcmp0 (user_name, member_name) == 0) {
        g_set_error (error, CCNET_DOMAIN, 0, "Can not remove myself");
        return -1;
    }

    snprintf (sql, sizeof(sql), "DELETE FROM GroupUser WHERE group_id=%d AND "
              "user_name='%s'", group_id, member_name);
    ccnet_db_query (db, sql);

    return 0;
}
コード例 #5
0
ファイル: user-mgr.c プロジェクト: hfeeki/ccnet
int
ccnet_user_manager_update_emailuser (CcnetUserManager *manager,
                                     int id, const char* passwd,
                                     int is_staff, int is_active)
{
    CcnetDB* db = manager->priv->db;
    char sql[512];
    char hashed_passwd[41];

#ifdef HAVE_LDAP
    if (!manager->use_ldap || is_staff) {
#endif
        hash_password (passwd, hashed_passwd);

        snprintf (sql, 512, "UPDATE EmailUser SET passwd='%s', is_staff='%d', "
                  "is_active='%d' WHERE id='%d'", hashed_passwd, is_staff,
                  is_active, id);

        return ccnet_db_query (db, sql);
#ifdef HAVE_LDAP
    }
#endif

    return 0;
}
コード例 #6
0
ファイル: user-mgr.c プロジェクト: hfeeki/ccnet
int
ccnet_user_manager_add_emailuser (CcnetUserManager *manager,
                                  const char *email,
                                  const char *passwd,
                                  int is_staff, int is_active)
{
    CcnetDB *db = manager->priv->db;
    gint64 now = get_current_time();
    char sql[512];
    char hashed_passwd[41];

#ifdef HAVE_LDAP
    if (manager->use_ldap)
        return 0;
#endif

    hash_password (passwd, hashed_passwd);

    snprintf (sql, 512, "INSERT INTO EmailUser(email, passwd, is_staff, "
              "is_active, ctime) VALUES ('%s', '%s', '%d', '%d', "
              "%"G_GINT64_FORMAT")", email, hashed_passwd, is_staff,
              is_active, now);

    return ccnet_db_query (db, sql);
}
コード例 #7
0
ファイル: group-mgr.c プロジェクト: blablup/ccnet
int
ccnet_group_manager_remove_group_user (CcnetGroupManager *mgr,
                                       const char *user)
{
    CcnetDB *db = mgr->priv->db;
    char sql[256];

    snprintf (sql, sizeof(sql), "DELETE FROM GroupUser "
              "WHERE user_name = '%s'", user);
    return ccnet_db_query (db, sql);
}
コード例 #8
0
ファイル: group-mgr.c プロジェクト: aclindsa/ccnet
int ccnet_group_manager_set_group_name (CcnetGroupManager *mgr,
                                        int group_id,
                                        const char *group_name,
                                        GError **error)
{
    CcnetDB *db = mgr->priv->db;
    char sql[512];

    snprintf (sql, sizeof(sql), "UPDATE `Group` SET group_name = '%s' "
              "WHERE group_id = %d", group_name, group_id);
    ccnet_db_query (db, sql);

    return 0;
}
コード例 #9
0
ファイル: group-mgr.c プロジェクト: blablup/ccnet
int ccnet_group_manager_unset_admin (CcnetGroupManager *mgr,
                                     int group_id,
                                     const char *member_name,
                                     GError **error)
{
    CcnetDB *db = mgr->priv->db;
    char sql[512];

    snprintf (sql, sizeof(sql), "UPDATE GroupUser SET is_staff = 0 "
              "WHERE group_id = %d and user_name = '%s'",
              group_id, member_name);
    ccnet_db_query (db, sql);

    return 0;
}
コード例 #10
0
ファイル: user-mgr.c プロジェクト: hfeeki/ccnet
int
ccnet_user_manager_remove_emailuser (CcnetUserManager *manager,
                                     const char *email)
{
    CcnetDB *db = manager->priv->db;
    char sql[512];

#ifdef HAVE_LDAP
    if (manager->use_ldap)
        return 0;
#endif

    snprintf (sql, 512, "DELETE FROM EmailUser WHERE email='%s'", email);

    return ccnet_db_query (db, sql);
}
コード例 #11
0
ファイル: user-mgr.c プロジェクト: hfeeki/ccnet
static int check_db_table (CcnetDB *db)
{
    char *sql;

    int db_type = ccnet_db_type (db);
    if (db_type == CCNET_DB_TYPE_MYSQL) {
        sql = "CREATE TABLE IF NOT EXISTS EmailUser ("
            "id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, "
            "email VARCHAR(255), passwd CHAR(41), "
            "is_staff BOOL NOT NULL, is_active BOOL NOT NULL, "
            "ctime BIGINT, UNIQUE INDEX (email))"
            "ENGINE=INNODB";
        if (ccnet_db_query (db, sql) < 0)
            return -1;
        sql = "CREATE TABLE IF NOT EXISTS Binding (email VARCHAR(255), peer_id CHAR(41),"
            "UNIQUE INDEX (peer_id), INDEX (email(20)))"
            "ENGINE=INNODB";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

    } else if (db_type == CCNET_DB_TYPE_SQLITE) {
        sql = "CREATE TABLE IF NOT EXISTS EmailUser ("
            "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
            "email TEXT, passwd TEXT, is_staff bool NOT NULL, "
            "is_active bool NOT NULL, ctime INTEGER)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE UNIQUE INDEX IF NOT EXISTS email_index on EmailUser (email)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE TABLE IF NOT EXISTS Binding (email TEXT, peer_id TEXT)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE INDEX IF NOT EXISTS email_index on Binding (email)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE UNIQUE INDEX IF NOT EXISTS peer_index on Binding (peer_id)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;
    }

    return 0;
}
コード例 #12
0
ファイル: group-mgr.c プロジェクト: aclindsa/ccnet
int ccnet_group_manager_add_member (CcnetGroupManager *mgr,
                                    int group_id,
                                    const char *user_name,
                                    const char *member_name,
                                    GError **error)
{
    CcnetDB *db = mgr->priv->db;
    char sql[512];

    /* check whether user is the staff of the group */
    if (!check_group_staff (db, group_id, user_name)) {
        g_set_error (error, CCNET_DOMAIN, 0,
                     "Permission error: only group staff can add member");
        return -1; 
    }    

    /* check whether group exists */
    if (!check_group_exists (db, group_id)) {
        g_set_error (error, CCNET_DOMAIN, 0, "Group not exists");
        return -1;
    }

    /* check whether group is full */
    /* snprintf (sql, sizeof(sql), "SELECT count(group_id) FROM `GroupUser` " */
    /*           "WHERE `group_id` = %d", group_id); */
    /* int count = ccnet_db_get_int (db, sql); */
    /* if (count >= MAX_GROUP_MEMBERS) { */
    /*     g_set_error (error, CCNET_DOMAIN, 0, "Group is full"); */
    /*     return -1; */
    /* } */

    char *member_name_l = g_ascii_strdown (member_name, -1);
    snprintf (sql, sizeof(sql), "INSERT INTO GroupUser VALUES (%d, '%s', %d)",
              group_id, member_name, 0);
    g_free (member_name_l);
    if (ccnet_db_query (db, sql) < 0) {
        g_set_error (error, CCNET_DOMAIN, 0, "Failed to add member to group");
        return -1;
    }

    return 0;
}
コード例 #13
0
ファイル: message.c プロジェクト: 9thsector/ccnet
void
ccnet_message_to_db (CcnetDB *db, const char *table, CcnetMessage *message)
{
    char *sql;
    sql = ccnet_sql_printf ("INSERT INTO %s VALUES ("
                            "NULL, %u, '%s', '%s', '%s', %Q, %u, %u, %Q, %Q);",
                            table,
                            message->flags,
                            message->id,
                            message->from,
                            message->to,
                            message->bloom, /* may be NULL */
                            message->ctime,
                            message->rtime,
                            message->app,
                            message->body);

    ccnet_db_query (db, sql);
    ccnet_sql_free (sql);
}
コード例 #14
0
ファイル: group-mgr.c プロジェクト: aclindsa/ccnet
int
ccnet_group_manager_set_group_creator (CcnetGroupManager *mgr,
                                       int group_id,
                                       const char *user_name)
{
    CcnetDB *db = mgr->priv->db;
    char sql[512];

    if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL) {
        snprintf (sql, sizeof(sql), "UPDATE \"Group\" SET creator_name = '%s' "
                  "WHERE group_id = %d", user_name, group_id);
    } else {
        snprintf (sql, sizeof(sql), "UPDATE `Group` SET creator_name = '%s' "
                  "WHERE group_id = %d", user_name, group_id);
    }
    
    ccnet_db_query (db, sql);

    return 0;
    
}
コード例 #15
0
ファイル: user-mgr.c プロジェクト: bvleur/ccnet
int
ccnet_user_manager_add_emailuser (CcnetUserManager *manager,
                                  const char *email,
                                  const char *passwd,
                                  int is_staff, int is_active)
{
    CcnetDB *db = manager->priv->db;
    gint64 now = get_current_time();
    char sql[512];
    char hashed_passwd[41];
    int ret;

#ifdef HAVE_LDAP
    if (manager->use_ldap)
        return 0;
#endif

    if (manager->priv->max_users &&
        manager->priv->cur_users >= manager->priv->max_users) {
        ccnet_warning ("User number exceeds limit. Users %d, limit %d.\n",
                       manager->priv->cur_users, manager->priv->max_users);
        return -1;
    }

    hash_password (passwd, hashed_passwd);

    snprintf (sql, 512, "INSERT INTO EmailUser(email, passwd, is_staff, "
              "is_active, ctime) VALUES ('%s', '%s', '%d', '%d', "
              "%"G_GINT64_FORMAT")", email, hashed_passwd, is_staff,
              is_active, now);

    ret = ccnet_db_query (db, sql);
    if (ret < 0)
        return ret;

    manager->priv->cur_users ++;
    return 0;
}
コード例 #16
0
ファイル: group-mgr.c プロジェクト: blablup/ccnet
static int check_db_table (CcnetDB *db)
{
    char *sql;

    int db_type = ccnet_db_type (db);
    if (db_type == CCNET_DB_TYPE_MYSQL) {
        sql = "CREATE TABLE IF NOT EXISTS `Group` (`group_id` INTEGER"
              " PRIMARY KEY AUTO_INCREMENT, `group_name` VARCHAR(255),"
              " `creator_name` VARCHAR(255), `timestamp` BIGINT)"
              "ENGINE=INNODB";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE TABLE IF NOT EXISTS `GroupUser` (`group_id` INTEGER,"
              " `user_name` VARCHAR(255), `is_staff` tinyint, UNIQUE INDEX"
              " (`group_id`, `user_name`), INDEX (`user_name`))"
              "ENGINE=INNODB";
        if (ccnet_db_query (db, sql) < 0)
            return -1;
    } else if (db_type == CCNET_DB_TYPE_SQLITE) {
        sql = "CREATE TABLE IF NOT EXISTS `Group` (`group_id` INTEGER"
              " PRIMARY KEY AUTOINCREMENT, `group_name` VARCHAR(255),"
              " `creator_name` VARCHAR(255), `timestamp` BIGINT)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE TABLE IF NOT EXISTS `GroupUser` (`group_id` INTEGER, "
              "`user_name` VARCHAR(255), `is_staff` tinyint)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE UNIQUE INDEX IF NOT EXISTS groupid_username_indx on "
              "`GroupUser` (`group_id`, `user_name`)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE INDEX IF NOT EXISTS username_indx on "
              "`GroupUser` (`user_name`)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;
    } else if (db_type == CCNET_DB_TYPE_PGSQL) {
        sql = "CREATE TABLE IF NOT EXISTS \"Group\" (group_id SERIAL"
              " PRIMARY KEY, group_name VARCHAR(255),"
              " creator_name VARCHAR(255), timestamp BIGINT)";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        sql = "CREATE TABLE IF NOT EXISTS GroupUser (group_id INTEGER,"
              " user_name VARCHAR(255), is_staff smallint, UNIQUE "
              " (group_id, user_name))";
        if (ccnet_db_query (db, sql) < 0)
            return -1;

        if (!pgsql_index_exists (db, "groupuser_username_idx")) {
            sql = "CREATE INDEX groupuser_username_idx ON GroupUser (user_name)";
            if (ccnet_db_query (db, sql) < 0)
                return -1;
        }
    }

    return 0;
}