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; }
static void * check_tx (void *vprocessor) { CcnetProcessor *processor = vprocessor; USE_PRIV; char *user = NULL; char *repo_id = priv->repo_id; 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 (decrypt_token (processor) < 0) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); goto out; } user = seaf_repo_manager_get_email_by_token ( seaf->repo_mgr, repo_id, priv->token); if (!user) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); goto out; } if (priv->type == CHECK_TX_TYPE_UPLOAD && seaf_quota_manager_check_quota (seaf->quota_mgr, repo_id) < 0) { priv->rsp_code = g_strdup(SC_QUOTA_FULL); priv->rsp_msg = g_strdup(SS_QUOTA_FULL); goto out; } char *perm = seaf_repo_manager_check_permission (seaf->repo_mgr, repo_id, user, NULL); if (!perm || (strcmp (perm, "r") == 0 && priv->type == CHECK_TX_TYPE_UPLOAD)) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); g_free (perm); goto out; } g_free (perm); get_branch_head (processor); out: g_free (user); return vprocessor; }
static void * check_tx (void *vprocessor) { CcnetProcessor *processor = vprocessor; USE_PRIV; char *user = NULL; char *repo_id = priv->repo_id; 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 (decrypt_token (processor) < 0) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); goto out; } user = seaf_repo_manager_get_email_by_token ( seaf->repo_mgr, repo_id, priv->token); if (!user) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); goto out; } if (priv->type == CHECK_TX_TYPE_UPLOAD && seaf_quota_manager_check_quota (seaf->quota_mgr, repo_id) < 0) { priv->rsp_code = g_strdup(SC_QUOTA_FULL); priv->rsp_msg = g_strdup(SS_QUOTA_FULL); goto out; } char *perm = seaf_repo_manager_check_permission (seaf->repo_mgr, repo_id, user, NULL); if (!perm || (strcmp (perm, "r") == 0 && priv->type == CHECK_TX_TYPE_UPLOAD)) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); g_free (perm); goto out; } g_free (perm); /* Record the (token, email, <peer info>) information, <peer info> may * include peer_id, peer_ip, peer_name, etc. */ if (!seaf_repo_manager_token_peer_info_exists (seaf->repo_mgr, priv->token)) seaf_repo_manager_add_token_peer_info (seaf->repo_mgr, priv->token, processor->peer_id, priv->peer_addr, priv->peer_name, (gint64)time(NULL)); else seaf_repo_manager_update_token_peer_info (seaf->repo_mgr, priv->token, priv->peer_addr, (gint64)time(NULL)); get_branch_head (processor); out: g_free (user); return vprocessor; }
static void * check_tx (void *vprocessor) { CcnetProcessor *processor = vprocessor; USE_PRIV; char *user = NULL; char *repo_id = priv->repo_id; SeafRepo *repo = NULL; repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); if (!repo) { priv->rsp_code = g_strdup(SC_BAD_REPO); priv->rsp_msg = g_strdup(SS_BAD_REPO); goto out; } if (repo->version > 0 && priv->client_version < 6) { seaf_warning ("Client protocol version is %d, " "cannot sync version %d repo %s.\n", priv->client_version, repo->version, repo_id); priv->rsp_code = g_strdup(SC_PROTOCOL_MISMATCH); priv->rsp_msg = g_strdup(SS_PROTOCOL_MISMATCH); goto out; } if (decrypt_token (processor) < 0) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); goto out; } user = seaf_repo_manager_get_email_by_token ( seaf->repo_mgr, repo_id, priv->token); if (!user) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); goto out; } if (priv->type == CHECK_TX_TYPE_UPLOAD && seaf_quota_manager_check_quota (seaf->quota_mgr, repo_id) < 0) { priv->rsp_code = g_strdup(SC_QUOTA_FULL); priv->rsp_msg = g_strdup(SS_QUOTA_FULL); goto out; } char *perm = seaf_repo_manager_check_permission (seaf->repo_mgr, repo_id, user, NULL); if (!perm || (strcmp (perm, "r") == 0 && priv->type == CHECK_TX_TYPE_UPLOAD)) { priv->rsp_code = g_strdup(SC_ACCESS_DENIED); priv->rsp_msg = g_strdup(SS_ACCESS_DENIED); g_free (perm); goto out; } g_free (perm); /* Record the (token, email, <peer info>) information, <peer info> may * include peer_id, peer_ip, peer_name, etc. */ if (!seaf_repo_manager_token_peer_info_exists (seaf->repo_mgr, priv->token)) seaf_repo_manager_add_token_peer_info (seaf->repo_mgr, priv->token, processor->peer_id, priv->peer_addr, priv->peer_name, (gint64)time(NULL)); else seaf_repo_manager_update_token_peer_info (seaf->repo_mgr, priv->token, priv->peer_addr, (gint64)time(NULL)); get_branch_head (processor); /* Fill information for sending events. */ priv->user = g_strdup(user); if (repo->virtual_info) { memcpy (priv->orig_repo_id, repo->virtual_info->origin_repo_id, 36); priv->orig_path = g_strdup(repo->virtual_info->path); } else memcpy (priv->orig_repo_id, repo_id, 36); out: seaf_repo_unref (repo); g_free (user); return vprocessor; }