mirror of
https://github.com/haiwen/seafile-server.git
synced 2025-07-01 01:11:49 +00:00
107 lines
2.8 KiB
C
107 lines
2.8 KiB
C
#ifndef CHECK_QUOTA_COMMON_H
|
|
#define CHECK_QUOTA_COMMON_H
|
|
|
|
#include <ccnet.h>
|
|
#include <searpc-client.h>
|
|
#include <ccnet/ccnetrpc-transport.h>
|
|
|
|
static SearpcClient *
|
|
create_sync_ccnetrpc_client (const char *central_config_dir, const char *config_dir, const char *service)
|
|
{
|
|
if (!config_dir || !service)
|
|
return NULL;
|
|
|
|
CcnetClient *sync_client;
|
|
SearpcClient *rpc_client;
|
|
|
|
sync_client = ccnet_client_new ();
|
|
if ((ccnet_client_load_confdir(sync_client, central_config_dir, config_dir)) < 0 ) {
|
|
return NULL;
|
|
}
|
|
|
|
if (ccnet_client_connect_daemon (sync_client, CCNET_CLIENT_SYNC) < 0)
|
|
{
|
|
g_object_unref ((GObject *)sync_client);
|
|
return NULL;
|
|
}
|
|
|
|
rpc_client = ccnet_create_rpc_client (sync_client, NULL, service);
|
|
|
|
return rpc_client;
|
|
}
|
|
|
|
static void
|
|
free_sync_rpc_client (SearpcClient *rpc_client)
|
|
{
|
|
CcnetrpcTransportParam *priv = rpc_client->arg;
|
|
CcnetClient *client = priv->session;
|
|
|
|
/* No need to call ccnet_client_disconnect_daemon. It's called in object
|
|
* finalize function of ccnet client class. */
|
|
g_object_unref ((GObject *)client);
|
|
ccnet_rpc_client_free (rpc_client);
|
|
}
|
|
|
|
static int
|
|
check_repo_owner_quota (CcnetProcessor *processor,
|
|
SearpcClient *rpc_client,
|
|
const char *repo_id)
|
|
{
|
|
USE_PRIV;
|
|
char *user = NULL;
|
|
int org_id;
|
|
gint64 quota, usage;
|
|
int ret = 0;
|
|
|
|
/* repo is guranteed to exist before check_repo_owner_quota */
|
|
user = seaf_repo_manager_get_repo_owner (seaf->repo_mgr, repo_id);
|
|
if (user != NULL) {
|
|
quota = seaf_quota_manager_get_user_quota (seaf->quota_mgr, user);
|
|
if (quota <= 0)
|
|
quota = seaf->quota_mgr->default_quota;
|
|
} else {
|
|
org_id = seaf_repo_manager_get_repo_org (seaf->repo_mgr, repo_id);
|
|
if (org_id < 0) {
|
|
priv->rsp_code = g_strdup (SC_QUOTA_ERROR);
|
|
priv->rsp_msg = g_strdup (SS_QUOTA_ERROR);
|
|
ret = -1;
|
|
goto out;
|
|
}
|
|
|
|
quota = seaf_quota_manager_get_org_quota (seaf->quota_mgr, org_id);
|
|
if (quota <= 0)
|
|
quota = seaf->quota_mgr->default_quota;
|
|
}
|
|
|
|
if (quota == INFINITE_QUOTA)
|
|
return ret;
|
|
|
|
if (user)
|
|
usage = seaf_quota_manager_get_user_usage (seaf->quota_mgr, user);
|
|
else
|
|
usage = seaf_quota_manager_get_org_usage (seaf->quota_mgr, org_id);
|
|
|
|
g_debug ("quota is %"G_GINT64_FORMAT", usage is %"G_GINT64_FORMAT"\n",
|
|
quota, usage);
|
|
|
|
if (usage < 0) {
|
|
priv->rsp_code = g_strdup (SC_QUOTA_ERROR);
|
|
priv->rsp_msg = g_strdup (SS_QUOTA_ERROR);
|
|
ret = -1;
|
|
goto out;
|
|
|
|
} else if (usage >= quota) {
|
|
priv->rsp_code = g_strdup (SC_QUOTA_FULL);
|
|
priv->rsp_msg = g_strdup (SS_QUOTA_FULL);
|
|
ret = -1;
|
|
goto out;
|
|
}
|
|
|
|
out:
|
|
g_free (user);
|
|
|
|
return ret;
|
|
}
|
|
|
|
#endif
|