From 72753e152b7c9608d262250ecfbb940e7abcabf2 Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Wed, 18 Sep 2024 16:28:15 +0800 Subject: [PATCH] Return error when failed to get user from database (#700) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Return error when failed to get user from database * Use CCNET_ERR_INTERNAL --------- Co-authored-by: 杨赫然 --- common/rpc-service.c | 8 +++----- common/user-mgr.c | 38 +++++++++++++++++++++++++++++--------- common/user-mgr.h | 5 +++-- fuse/getattr.c | 2 +- fuse/readdir.c | 2 +- lib/utils.h | 2 ++ 6 files changed, 39 insertions(+), 18 deletions(-) diff --git a/common/rpc-service.c b/common/rpc-service.c index 1354685..6cafbea 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -27,8 +27,6 @@ #define DEBUG_FLAG SEAFILE_DEBUG_OTHER #include "log.h" -#define CCNET_ERR_INTERNAL 500 - #ifndef SEAFILE_SERVER #include "../daemon/vc-utils.h" @@ -4726,7 +4724,7 @@ ccnet_rpc_get_emailuser (const char *email, GError **error) CcnetUserManager *user_mgr = seaf->user_mgr; CcnetEmailUser *emailuser = NULL; - emailuser = ccnet_user_manager_get_emailuser (user_mgr, email); + emailuser = ccnet_user_manager_get_emailuser (user_mgr, email, error); return (GObject *)emailuser; } @@ -4742,7 +4740,7 @@ ccnet_rpc_get_emailuser_with_import (const char *email, GError **error) CcnetUserManager *user_mgr = seaf->user_mgr; CcnetEmailUser *emailuser = NULL; - emailuser = ccnet_user_manager_get_emailuser_with_import (user_mgr, email); + emailuser = ccnet_user_manager_get_emailuser_with_import (user_mgr, email, error); return (GObject *)emailuser; } @@ -5448,7 +5446,7 @@ ccnet_rpc_get_org_emailusers (const char *url_prefix, int start , int limit, while (ptr) { char *email = ptr->data; CcnetEmailUser *emailuser = ccnet_user_manager_get_emailuser (user_mgr, - email); + email, NULL); if (emailuser != NULL) { ret = g_list_prepend (ret, emailuser); } diff --git a/common/user-mgr.c b/common/user-mgr.c index 18b680e..d8b9cf4 100644 --- a/common/user-mgr.c +++ b/common/user-mgr.c @@ -1147,26 +1147,41 @@ get_ldap_emailuser_cb (CcnetDBRow *row, void *data) static CcnetEmailUser* get_emailuser (CcnetUserManager *manager, const char *email, - gboolean import) + gboolean import, + GError **error) { CcnetDB *db = manager->priv->db; char *sql; CcnetEmailUser *emailuser = NULL; char *email_down; + int rc; sql = "SELECT e.id, e.email, is_staff, is_active, ctime, passwd, reference_id, role " " FROM EmailUser e LEFT JOIN UserRole ON e.email = UserRole.email " " WHERE e.email=?"; - if (seaf_db_statement_foreach_row (db, sql, get_emailuser_cb, &emailuser, - 1, "string", email) > 0) { + rc = seaf_db_statement_foreach_row (db, sql, get_emailuser_cb, &emailuser, + 1, "string", email); + if (rc > 0) { return emailuser; + } else if (rc < 0) { + if (error) { + g_set_error (error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Database error"); + } + return NULL; } email_down = g_ascii_strdown (email, strlen(email)); - if (seaf_db_statement_foreach_row (db, sql, get_emailuser_cb, &emailuser, - 1, "string", email_down) > 0) { + rc = seaf_db_statement_foreach_row (db, sql, get_emailuser_cb, &emailuser, + 1, "string", email_down); + if (rc > 0) { g_free (email_down); return emailuser; + } else if (rc < 0) { + if (error) { + g_set_error (error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Database error"); + } + g_free (email_down); + return NULL; } #ifdef HAVE_LDAP @@ -1179,6 +1194,9 @@ get_emailuser (CcnetUserManager *manager, get_ldap_emailuser_cb, &emailuser, 1, "string", email_down); if (ret < 0) { + if (error) { + g_set_error (error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Database error"); + } ccnet_warning ("get ldapuser from db failed.\n"); g_free (email_down); return NULL; @@ -1236,16 +1254,18 @@ get_emailuser (CcnetUserManager *manager, CcnetEmailUser* ccnet_user_manager_get_emailuser (CcnetUserManager *manager, - const char *email) + const char *email, + GError **error) { - return get_emailuser (manager, email, FALSE); + return get_emailuser (manager, email, FALSE, error); } CcnetEmailUser* ccnet_user_manager_get_emailuser_with_import (CcnetUserManager *manager, - const char *email) + const char *email, + GError **error) { - return get_emailuser (manager, email, TRUE); + return get_emailuser (manager, email, TRUE, error); } CcnetEmailUser* diff --git a/common/user-mgr.h b/common/user-mgr.h index cb44da2..1b070ff 100644 --- a/common/user-mgr.h +++ b/common/user-mgr.h @@ -84,11 +84,12 @@ ccnet_user_manager_validate_emailuser (CcnetUserManager *manager, const char *passwd); CcnetEmailUser* -ccnet_user_manager_get_emailuser (CcnetUserManager *manager, const char *email); +ccnet_user_manager_get_emailuser (CcnetUserManager *manager, const char *email, GError **error); CcnetEmailUser* ccnet_user_manager_get_emailuser_with_import (CcnetUserManager *manager, - const char *email); + const char *email, + GError **error); CcnetEmailUser* ccnet_user_manager_get_emailuser_by_id (CcnetUserManager *manager, int id); diff --git a/fuse/getattr.c b/fuse/getattr.c index a91799a..5466f7f 100644 --- a/fuse/getattr.c +++ b/fuse/getattr.c @@ -35,7 +35,7 @@ static int getattr_user(SeafileSession *seaf, const char *user, struct stat *stb { CcnetEmailUser *emailuser; - emailuser = ccnet_user_manager_get_emailuser (seaf->user_mgr, user); + emailuser = ccnet_user_manager_get_emailuser (seaf->user_mgr, user, NULL); if (!emailuser) { return -ENOENT; } diff --git a/fuse/readdir.c b/fuse/readdir.c index fe689c1..f71cf3c 100644 --- a/fuse/readdir.c +++ b/fuse/readdir.c @@ -94,7 +94,7 @@ static int readdir_user(SeafileSession *seaf, const char *user, GList *list = NULL, *p; GString *name; - emailuser = ccnet_user_manager_get_emailuser (seaf->user_mgr, user); + emailuser = ccnet_user_manager_get_emailuser (seaf->user_mgr, user, NULL); if (!emailuser) { return -ENOENT; } diff --git a/lib/utils.h b/lib/utils.h index 505e723..e3e9727 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -148,6 +148,8 @@ traverse_directory_win32 (wchar_t *path_w, #define CCNET_DOMAIN g_quark_from_string("ccnet") +#define CCNET_ERR_INTERNAL 500 + struct timeval timeval_from_msec (uint64_t milliseconds);