char * seaf_clone_manager_add_task (SeafCloneManager *mgr, const char *repo_id, const char *peer_id, const char *repo_name, const char *token, const char *passwd, const char *worktree_in, const char *peer_addr, const char *peer_port, const char *email, GError **error) { SeafRepo *repo; char *worktree; char *ret; g_assert (strlen(repo_id) == 36); repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); if (repo != NULL && repo->head != NULL) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Repo already exists"); return NULL; } if (is_duplicate_task (mgr, repo_id)) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Task is already in progress"); return NULL; } if (!check_worktree_path (mgr, worktree_in, error)) return NULL; /* Return error if worktree_in conflicts with another repo or * is not a directory. */ worktree = make_worktree (mgr, worktree_in, FALSE, error); if (!worktree) { return NULL; } ret = add_task_common (mgr, repo, repo_id, peer_id, repo_name, token, passwd, worktree, peer_addr, peer_port, email, error); g_free (worktree); return ret; }
char * seaf_clone_manager_add_download_task (SeafCloneManager *mgr, const char *repo_id, const char *peer_id, const char *repo_name, const char *token, const char *passwd, const char *wt_parent, const char *peer_addr, const char *peer_port, const char *email, GError **error) { SeafRepo *repo; char *wt_tmp, *worktree; char *ret; g_assert (strlen(repo_id) == 36); repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); if (repo != NULL && repo->head != NULL) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Repo already exists"); return NULL; } if (is_duplicate_task (mgr, repo_id)) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Task is already in progress"); return NULL; } wt_tmp = g_build_filename (wt_parent, repo_name, NULL); worktree = make_worktree_for_download (mgr, wt_tmp, error); if (!worktree) { g_free (wt_tmp); return NULL; } ret = add_task_common (mgr, repo, repo_id, peer_id, repo_name, token, passwd, worktree, peer_addr, peer_port, email, error); g_free (worktree); g_free (wt_tmp); return ret; }
char * seaf_clone_manager_add_task (SeafCloneManager *mgr, const char *repo_id, int repo_version, const char *peer_id, const char *repo_name, const char *token, const char *passwd, const char *magic, int enc_version, const char *random_key, const char *worktree_in, const char *peer_addr, const char *peer_port, const char *email, const char *more_info, GError **error) { SeafRepo *repo; char *worktree; char *ret; gboolean sync_wt_name = FALSE; if (!seaf->started) { seaf_message ("System not started, skip adding clone task.\n"); return NULL; } #ifdef USE_GPL_CRYPTO if (repo_version == 0 || (passwd && enc_version < 2)) { seaf_warning ("Don't support syncing old version libraries.\n"); g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "Don't support syncing old version libraries"); return NULL; } #endif if (passwd && !check_encryption_args (magic, enc_version, random_key, error)) return NULL; /* After a repo was unsynced, the sync task may still be blocked in the * network, so the repo is not actually deleted yet. * In this case just return an error to the user. */ SyncInfo *sync_info = seaf_sync_manager_get_sync_info (seaf->sync_mgr, repo_id); if (sync_info && sync_info->in_sync) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Repo already exists"); return NULL; } repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); if (repo != NULL && repo->head != NULL) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Repo already exists"); return NULL; } if (is_duplicate_task (mgr, repo_id)) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Task is already in progress"); return NULL; } if (passwd && seafile_verify_repo_passwd(repo_id, passwd, magic, enc_version) < 0) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Incorrect password"); return NULL; } if (!seaf_clone_manager_check_worktree_path (mgr, worktree_in, error)) return NULL; /* Return error if worktree_in conflicts with another repo or * is not a directory. */ worktree = make_worktree (mgr, worktree_in, FALSE, error); if (!worktree) { return NULL; } /* Don't sync worktree folder name with library name later if they're not the same * at the beginning. */ sync_wt_name = is_wt_repo_name_same (worktree, repo_name); /* If a repo was unsynced and then downloaded again, there may be * a garbage record for this repo. We don't want the downloaded blocks * be removed by GC. */ if (repo_version > 0) seaf_repo_manager_remove_garbage_repo (seaf->repo_mgr, repo_id); /* Delete orphan information in the db in case the repo was corrupt. */ if (!repo) seaf_repo_manager_remove_repo_ondisk (seaf->repo_mgr, repo_id, FALSE); ret = add_task_common (mgr, repo_id, repo_version, peer_id, repo_name, token, passwd, enc_version, random_key, worktree, peer_addr, peer_port, email, more_info, sync_wt_name, error); g_free (worktree); return ret; }
char * seaf_clone_manager_add_download_task (SeafCloneManager *mgr, const char *repo_id, int repo_version, const char *peer_id, const char *repo_name, const char *token, const char *passwd, const char *magic, int enc_version, const char *random_key, const char *wt_parent, const char *peer_addr, const char *peer_port, const char *email, const char *more_info, GError **error) { SeafRepo *repo; char *wt_tmp, *worktree; char *ret; if (!seaf->started) { seaf_message ("System not started, skip adding clone task.\n"); return NULL; } #ifdef USE_GPL_CRYPTO if (repo_version == 0 || (passwd && enc_version < 2)) { seaf_warning ("Don't support syncing old version libraries.\n"); g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "Don't support syncing old version libraries"); return NULL; } #endif if (passwd && !check_encryption_args (magic, enc_version, random_key, error)) return NULL; /* After a repo was unsynced, the sync task may still be blocked in the * network, so the repo is not actually deleted yet. * In this case just return an error to the user. */ SyncInfo *sync_info = seaf_sync_manager_get_sync_info (seaf->sync_mgr, repo_id); if (sync_info && sync_info->in_sync) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Repo already exists"); return NULL; } repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); if (repo != NULL && repo->head != NULL) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Repo already exists"); return NULL; } if (is_duplicate_task (mgr, repo_id)) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Task is already in progress"); return NULL; } if (passwd && seafile_verify_repo_passwd(repo_id, passwd, magic, enc_version) < 0) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Incorrect password"); return NULL; } IgnoreReason reason; if (should_ignore_on_checkout (repo_name, &reason)) { if (reason == IGNORE_REASON_END_SPACE_PERIOD) g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "Library name ends with space or period character"); else g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "Library name contains invalid characters such as ':', '*', '|', '?'"); return NULL; } wt_tmp = g_build_filename (wt_parent, repo_name, NULL); worktree = make_worktree_for_download (mgr, wt_tmp, error); if (!worktree) { g_free (wt_tmp); return NULL; } /* If a repo was unsynced and then downloaded again, there may be * a garbage record for this repo. We don't want the downloaded blocks * be removed by GC. */ if (repo_version > 0) seaf_repo_manager_remove_garbage_repo (seaf->repo_mgr, repo_id); /* Delete orphan information in the db in case the repo was corrupt. */ if (!repo) seaf_repo_manager_remove_repo_ondisk (seaf->repo_mgr, repo_id, FALSE); ret = add_task_common (mgr, repo_id, repo_version, peer_id, repo_name, token, passwd, enc_version, random_key, worktree, peer_addr, peer_port, email, more_info, TRUE, error); g_free (worktree); g_free (wt_tmp); return ret; }
char * seaf_clone_manager_add_download_task (SeafCloneManager *mgr, const char *repo_id, const char *peer_id, const char *repo_name, const char *token, const char *passwd, const char *magic, const char *wt_parent, const char *peer_addr, const char *peer_port, const char *email, GError **error) { SeafRepo *repo; char *wt_tmp, *worktree; char *ret; if (!seaf->started) { seaf_message ("System not started, skip adding clone task.\n"); return NULL; } g_assert (strlen(repo_id) == 36); repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); if (repo != NULL && repo->head != NULL) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Repo already exists"); return NULL; } if (is_duplicate_task (mgr, repo_id)) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Task is already in progress"); return NULL; } /* If magic is not given, check password before checkout. */ if (passwd && magic && seaf_repo_verify_passwd(repo_id, passwd, magic) < 0) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Incorrect password"); return NULL; } wt_tmp = g_build_filename (wt_parent, repo_name, NULL); worktree = make_worktree_for_download (mgr, wt_tmp, error); if (!worktree) { g_free (wt_tmp); return NULL; } ret = add_task_common (mgr, repo, repo_id, peer_id, repo_name, token, passwd, worktree, peer_addr, peer_port, email, error); g_free (worktree); g_free (wt_tmp); return ret; }