예제 #1
0
파일: user-mgr.c 프로젝트: 9thsector/ccnet
CcnetEmailUser*
ccnet_user_manager_get_emailuser (CcnetUserManager *manager,
                                  const char *email)
{
    CcnetDB *db = manager->priv->db;
    char *sql;
    CcnetEmailUser *emailuser = NULL;
    char *email_down;

    sql = "SELECT id, email, is_staff, is_active, ctime"
        " FROM EmailUser WHERE email=?";
    if (ccnet_db_statement_foreach_row (db, sql, get_emailuser_cb, &emailuser,
                                        1, "string", email) > 0) {
        char *role = ccnet_user_manager_get_role_emailuser (manager, email);
        if (role) {
            g_object_set (emailuser, "role", role, NULL);
            g_free (role);
        }
        return emailuser;
    }

    email_down = g_ascii_strdown (email, strlen(email));
    if (ccnet_db_statement_foreach_row (db, sql, get_emailuser_cb, &emailuser,
                                        1, "string", email_down) > 0) {
        char *role = ccnet_user_manager_get_role_emailuser(manager, email_down);
        if (role) {
            g_object_set (emailuser, "role", role, NULL);
            g_free (role);
        }
        g_free (email_down);
        return emailuser;
    }
    g_free (email_down);

#ifdef HAVE_LDAP
    if (manager->use_ldap) {
        GList *users, *ptr;

        users = ldap_list_users (manager, email, -1, -1);
        if (!users)
            return NULL;
        emailuser = users->data;

        /* Free all except the first user. */
        for (ptr = users->next; ptr; ptr = ptr->next)
            g_object_unref (ptr->data);
        g_list_free (users);

        char *role = ccnet_user_manager_get_role_emailuser(manager, email);
        if (role) {
            g_object_set (emailuser, "role", role, NULL);
            g_free (role);
        }
        return emailuser;
    }
#endif

    return NULL;
}
예제 #2
0
파일: user-mgr.c 프로젝트: 9thsector/ccnet
int
ccnet_user_manager_validate_emailuser (CcnetUserManager *manager,
                                       const char *email,
                                       const char *passwd)
{
    CcnetDB *db = manager->priv->db;
    char *sql;
    char *email_down;
    char *stored_passwd = NULL;
    gboolean need_upgrade = FALSE;

#ifdef HAVE_LDAP
    if (manager->use_ldap) {
        if (ldap_verify_user_password (manager, email, passwd) == 0)
            return 0;
    }
#endif

    sql = "SELECT passwd FROM EmailUser WHERE email=?";
    if (ccnet_db_statement_foreach_row (db, sql,
                                        get_password, &stored_passwd,
                                        1, "string", email) > 0) {
        if (validate_passwd (passwd, stored_passwd, &need_upgrade)) {
            if (need_upgrade)
                update_user_passwd (manager, email, passwd);
            g_free (stored_passwd);
            return 0;
        } else {
            g_free (stored_passwd);
            return -1;
        }
    }

    email_down = g_ascii_strdown (email, strlen(email));
    if (ccnet_db_statement_foreach_row (db, sql,
                                        get_password, &stored_passwd,
                                        1, "string", email_down) > 0) {
        g_free (email_down);
        if (validate_passwd (passwd, stored_passwd, &need_upgrade)) {
            if (need_upgrade)
                update_user_passwd (manager, email, passwd);
            g_free (stored_passwd);
            return 0;
        } else {
            g_free (stored_passwd);
            return -1;
        }
    }
    g_free (email_down);

    return -1;
}
예제 #3
0
파일: user-mgr.c 프로젝트: 9thsector/ccnet
GList*
ccnet_user_manager_search_emailusers (CcnetUserManager *manager,
                                      const char *email_patt,
                                      int start, int limit)
{
    CcnetDB *db = manager->priv->db;
    GList *ret = NULL;

#ifdef HAVE_LDAP
    if (manager->use_ldap) {
        char *ldap_patt = db_pattern_to_ldap_pattern (email_patt);
        ret = ldap_list_users (manager, ldap_patt, -1, -1);
        g_free (ldap_patt);
    }
#endif

    int rc;
    if (start == -1 && limit == -1)
        rc = ccnet_db_statement_foreach_row (db,
                                             "SELECT t1.id, t1.email, "
                                             "t1.is_staff, t1.is_active, t1.ctime, "
                                             "t2.role FROM EmailUser AS t1 "
                                             "LEFT JOIN UserRole AS t2 "
                                             "ON t1.email = t2.email "
                                             "WHERE t1.Email LIKE ? "
                                             "ORDER BY t1.id",
                                             get_emailusers_cb, &ret,
                                             1, "string", email_patt);
    else
        rc = ccnet_db_statement_foreach_row (db,
                                             "SELECT t1.id, t1.email, "
                                             "t1.is_staff, t1.is_active, t1.ctime, "
                                             "t2.role FROM EmailUser AS t1 "
                                             "LEFT JOIN UserRole AS t2 "
                                             "ON t1.email = t2.email "
                                             "WHERE t1.Email LIKE ? "
                                             "ORDER BY t1.id LIMIT ? OFFSET ?",
                                             get_emailusers_cb, &ret,
                                             3, "string", email_patt,
                                             "int", limit, "int", start);
    
    if (rc < 0) {
        while (ret != NULL) {
            g_object_unref (ret->data);
            ret = g_list_delete_link (ret, ret);
        }
        return NULL;
    }

    return g_list_reverse (ret);
}
예제 #4
0
파일: user-mgr.c 프로젝트: 9thsector/ccnet
GList*
ccnet_user_manager_get_emailusers (CcnetUserManager *manager,
                                   const char *source,
                                   int start, int limit)
{
    CcnetDB *db = manager->priv->db;
    GList *ret = NULL;

#ifdef HAVE_LDAP
    if (manager->use_ldap && g_strcmp0 (source, "LDAP") == 0) {
        GList *users;
        users = ldap_list_users (manager, "*", start, limit);
        return g_list_reverse (users);
    }
#endif

    if (g_strcmp0 (source, "DB") != 0)
        return NULL;

    int rc;
    if (start == -1 && limit == -1)
        rc = ccnet_db_statement_foreach_row (db,
                                             "SELECT t1.id, t1.email, "
                                             "t1.is_staff, t1.is_active, t1.ctime, "
                                             "t2.role FROM EmailUser AS t1 "
                                             "LEFT JOIN UserRole AS t2 "
                                             "ON t1.email = t2.email ",
                                             get_emailusers_cb, &ret,
                                             0);
    else
        rc = ccnet_db_statement_foreach_row (db,
                                             "SELECT t1.id, t1.email, "
                                             "t1.is_staff, t1.is_active, t1.ctime, "
                                             "t2.role FROM EmailUser AS t1 "
                                             "LEFT JOIN UserRole AS t2 "
                                             "ON t1.email = t2.email "
                                             "ORDER BY t1.id LIMIT ? OFFSET ?",
                                             get_emailusers_cb, &ret,
                                             2, "int", limit, "int", start);

    if (rc < 0) {
        while (ret != NULL) {
            g_object_unref (ret->data);
            ret = g_list_delete_link (ret, ret);
        }
        return NULL;
    }

    return g_list_reverse (ret);
}
예제 #5
0
파일: group-mgr.c 프로젝트: ezhangle/ccnet
GList*
ccnet_group_manager_get_all_groups (CcnetGroupManager *mgr,
                                    int start, int limit, GError **error)
{
    CcnetDB *db = mgr->priv->db;
    GList *ret = NULL;
    int rc;

    if (ccnet_db_type(mgr->priv->db) == CCNET_DB_TYPE_PGSQL) {
        if (start == -1 && limit == -1) {
            rc = ccnet_db_statement_foreach_row (db, "SELECT group_id, group_name, "
                                                 "creator_name, timestamp FROM \"Group\" "
                                                 "ORDER BY timestamp DESC",
                                                 get_all_ccnetgroups_cb, &ret,
                                                 0);
        } else {
            rc = ccnet_db_statement_foreach_row (db, "SELECT group_id, group_name, "
                                                 "creator_name, timestamp FROM \"Group\" "
                                                 "ORDER BY timestamp DESC LIMIT ? OFFSET ?",
                                                 get_all_ccnetgroups_cb, &ret,
                                                 2, "int", limit, "int", start);
        }
    } else {
        if (start == -1 && limit == -1) {
            rc = ccnet_db_statement_foreach_row (db, "SELECT `group_id`, `group_name`, "
                                                 "`creator_name`, `timestamp` FROM `Group` "
                                                 "ORDER BY timestamp DESC",
                                                 get_all_ccnetgroups_cb, &ret,
                                                 0);
        } else {
            rc = ccnet_db_statement_foreach_row (db, "SELECT `group_id`, `group_name`, "
                                                 "`creator_name`, `timestamp` FROM `Group` "
                                                 "ORDER BY timestamp DESC LIMIT ?, ?",
                                                 get_all_ccnetgroups_cb, &ret,
                                                 2, "int", start, "int", limit);
        }
    }

    if (rc < 0)
        return NULL;

    return g_list_reverse (ret);
}
예제 #6
0
파일: user-mgr.c 프로젝트: 9thsector/ccnet
CcnetEmailUser*
ccnet_user_manager_get_emailuser_by_id (CcnetUserManager *manager, int id)
{
    CcnetDB *db = manager->priv->db;
    char *sql;
    CcnetEmailUser *emailuser = NULL;

    sql = "SELECT id, email, is_staff, is_active, ctime"
        " FROM EmailUser WHERE id=?";
    if (ccnet_db_statement_foreach_row (db, sql, get_emailuser_cb, &emailuser,
                                        1, "int", id) < 0)
        return NULL;

    return emailuser;
}
예제 #7
0
파일: user-mgr.c 프로젝트: 9thsector/ccnet
static char*
ccnet_user_manager_get_role_emailuser (CcnetUserManager *manager,
                                     const char* email)
{

    CcnetDB *db = manager->priv->db;
    const char *sql;
    char* role;

    sql = "SELECT role FROM UserRole WHERE email=?";
    if (ccnet_db_statement_foreach_row (db, sql, get_role_emailuser_cb, &role,
                                        1, "string", email) > 0)
        return role;

    return NULL;
}
예제 #8
0
파일: group-mgr.c 프로젝트: ezhangle/ccnet
GList *
ccnet_group_manager_get_group_members (CcnetGroupManager *mgr, int group_id,
                                       GError **error)
{
    CcnetDB *db = mgr->priv->db;
    char *sql;
    GList *group_users = NULL;
    
    sql = "SELECT * FROM GroupUser WHERE group_id = ?";
    if (ccnet_db_statement_foreach_row (db, sql,
                                        get_ccnet_groupuser_cb, &group_users,
                                        1, "int", group_id) < 0)
        return NULL;

    return g_list_reverse (group_users);
}
예제 #9
0
파일: group-mgr.c 프로젝트: ezhangle/ccnet
CcnetGroup *
ccnet_group_manager_get_group (CcnetGroupManager *mgr, int group_id,
                               GError **error)
{
    CcnetDB *db = mgr->priv->db;
    char *sql;
    CcnetGroup *ccnetgroup = NULL;

    if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL)
        sql = "SELECT * FROM \"Group\" WHERE group_id = ?";
    else
        sql = "SELECT * FROM `Group` WHERE group_id = ?";
    if (ccnet_db_statement_foreach_row (db, sql,
                                        get_ccnetgroup_cb, &ccnetgroup,
                                        1, "int", group_id) < 0)
        return NULL;

    return ccnetgroup;
}
예제 #10
0
파일: group-mgr.c 프로젝트: ezhangle/ccnet
GList *
ccnet_group_manager_get_groupids_by_user (CcnetGroupManager *mgr,
                                          const char *user_name,
                                          GError **error)
{
    CcnetDB *db = mgr->priv->db;
    GList *group_ids = NULL;

    if (ccnet_db_statement_foreach_row (db,
                                        "SELECT group_id FROM GroupUser "
                                        "WHERE user_name=?",
                                        get_group_ids_cb, &group_ids,
                                        1, "string", user_name) < 0) {
        g_list_free (group_ids);
        return NULL;
    }

    return g_list_reverse (group_ids);
}