Ejemplo n.º 1
0
static void *
check_tx (void *vprocessor)
{
    CcnetProcessor *processor = vprocessor;
    USE_PRIV;

    char *owner = NULL;
    int org_id;
    SearpcClient *rpc_client = NULL;

    char *repo_id = priv->repo_id;

    rpc_client = create_sync_ccnetrpc_client
                 (seaf->session->config_dir, "ccnet-threaded-rpcserver");

    if (!rpc_client) {
        priv->rsp_code = g_strdup(SC_SERVER_ERROR);
        priv->rsp_msg = g_strdup(SS_SERVER_ERROR);
        goto out;
    }

    if (!seaf_repo_manager_repo_exists (seaf->repo_mgr, repo_id)) {
        priv->rsp_code = g_strdup(SC_BAD_REPO);
        priv->rsp_msg = g_strdup(SS_BAD_REPO);
        goto out;
    }

    if (priv->type == CHECK_TX_TYPE_UPLOAD &&
            check_repo_owner_quota (processor, rpc_client, repo_id) < 0)
        goto out;

    owner = seaf_repo_manager_get_repo_owner (seaf->repo_mgr, repo_id);
    if (owner != NULL) {
        /* If the user is not owner, check share permission */
        if (strcmp (owner, priv->email) != 0) {
            if(!check_repo_share_permission (rpc_client, repo_id, priv->email)) {
                priv->rsp_code = g_strdup(SC_ACCESS_DENIED);
                priv->rsp_msg = g_strdup(SS_ACCESS_DENIED);
                goto out;
            }
        }
    } else {
        /* This should be a repo created in an org. */
        org_id = seaf_repo_manager_get_repo_org (seaf->repo_mgr, repo_id);
        if (org_id < 0 ||
                !ccnet_org_user_exists (rpc_client, org_id, priv->email)) {
            priv->rsp_code = g_strdup(SC_ACCESS_DENIED);
            priv->rsp_msg = g_strdup(SS_ACCESS_DENIED);
            goto out;
        }
    }

    get_branch_head (processor);

out:
    g_free (owner);
    if (rpc_client)
        free_sync_rpc_client (rpc_client);
    return vprocessor;
}
Ejemplo n.º 2
0
int
seaf_quota_manager_check_quota (SeafQuotaManager *mgr,
                                const char *repo_id)
{
    char *user = NULL;
    int org_id;
    gint64 quota, usage;
    int ret = 0;

    user = seaf_repo_manager_get_repo_owner (seaf->repo_mgr, repo_id);
    if (user != NULL) {
        quota = seaf_quota_manager_get_user_quota (mgr, user);
    } else if (seaf->cloud_mode) {
        org_id = seaf_repo_manager_get_repo_org (seaf->repo_mgr, repo_id);
        if (org_id < 0) {
            seaf_warning ("Repo %s has no owner.\n", repo_id);
            ret = -1;
            goto out;
        }

        quota = seaf_quota_manager_get_org_quota (mgr, org_id);
    } else {
        seaf_warning ("Repo %s has no owner.\n", repo_id);
        ret = -1;
        goto out;
    }

    if (quota == INFINITE_QUOTA)
        goto out;

    if (user) {
        if (!mgr->calc_share_usage) {
            usage = seaf_quota_manager_get_user_usage (mgr, user);
        } else {
            gint64 my_usage, share_usage;
            share_usage = seaf_quota_manager_get_user_share_usage (mgr, user);
            if (share_usage < 0) {
                ret = -1;
                goto out;
            }
            my_usage = seaf_quota_manager_get_user_usage (mgr, user);
            if (my_usage < 0) {
                ret = -1;
                goto out;
            }
            usage = my_usage + share_usage;
        }
    } else
        usage = seaf_quota_manager_get_org_usage (mgr, org_id);

    if (usage < 0 || usage >= quota)
        ret = -1;

out:
    g_free (user);
    return ret;
}
Ejemplo n.º 3
0
int
seaf_quota_manager_check_quota (SeafQuotaManager *mgr,
                                const char *repo_id)
{
    SeafVirtRepo *vinfo;
    const char *r_repo_id = repo_id;
    char *user = NULL;
    int org_id;
    gint64 quota, usage;
    int ret = 0;

    /* If it's a virtual repo, check quota to origin repo. */
    vinfo = seaf_repo_manager_get_virtual_repo_info (seaf->repo_mgr, repo_id);
    if (vinfo)
        r_repo_id = vinfo->origin_repo_id;

    user = seaf_repo_manager_get_repo_owner (seaf->repo_mgr, r_repo_id);
    if (user != NULL) {
        quota = seaf_quota_manager_get_user_quota (mgr, user);
    } else if (seaf->cloud_mode) {
        org_id = seaf_repo_manager_get_repo_org (seaf->repo_mgr, r_repo_id);
        if (org_id < 0) {
            seaf_warning ("Repo %s has no owner.\n", r_repo_id);
            ret = -1;
            goto out;
        }

        quota = seaf_quota_manager_get_org_quota (mgr, org_id);
    } else {
        seaf_warning ("Repo %s has no owner.\n", r_repo_id);
        ret = -1;
        goto out;
    }

    if (quota == INFINITE_QUOTA)
        goto out;

    if (user) {
        if (!mgr->calc_share_usage) {
            usage = seaf_quota_manager_get_user_usage (mgr, user);
        } else {
            gint64 my_usage, share_usage;
            share_usage = seaf_quota_manager_get_user_share_usage (mgr, user);
            if (share_usage < 0) {
                ret = -1;
                goto out;
            }
            my_usage = seaf_quota_manager_get_user_usage (mgr, user);
            if (my_usage < 0) {
                ret = -1;
                goto out;
            }
            usage = my_usage + share_usage;
        }
    } else
        usage = seaf_quota_manager_get_org_usage (mgr, org_id);

    if (usage < 0 || usage >= quota)
        ret = -1;

out:
    seaf_virtual_repo_info_free (vinfo);
    g_free (user);
    return ret;
}