Фон
Я пишу приложение для Linux (gtkmm), которое использует один частный репозиторий, размещенный на github. Приложение использует Libgit2
и SSH Authentication
.
Ключи SSH были созданы извне и отлично работают при тестировании через терминал.
В настоящее время у меня есть две проблемы, которые, скорее всего, коррелируют.
Проблема 1: невозможно использовать ключи шифрования Exchange.
Эта проблема возникает при попытке клонировать частный репозиторий; и это ошибка, напечатанная из Libgit2.
Я пытался использовать git_cred_ssh_key_new
И git_cred_ssh_key_from_agent
безуспешно.
Проблема 2: обратный вызов учетных данных никогда не вызывается.
Я гарантировал, что этот (Credential
обратный вызов) был установлен для опций клонирования, опций извлечения и удаленных обратных вызовов; и используется git_clone()
.
Внутри находится кут, который никогда не печатается; как текст, связанный с GUI, который также не задан; поэтому я определил, что это никогда не вызывается.
int repoManager_gitCredentialCallback(git_cred **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload){
cout << "Credentials Called" << endl;
string temp_publicKey = Global::programHomeDir + "/id_rsa.pub";
string temp_privateKey = Global::programHomeDir + "/id_rsa";
return git_cred_ssh_key_new( out, username_from_url, temp_publicKey.c_str(), temp_privateKey.c_str(), "" );
} // END - gitCredentialCallback
В функции для клонирования:
// SET GIT OPTIONS:
git_clone_options repoManager_cloneOptions = GIT_CLONE_OPTIONS_INIT;
git_fetch_options repoManager_fetchOptions = GIT_FETCH_OPTIONS_INIT;
// git_remote_callbacks repoManager_remoteCallbacks = GIT_REMOTE_CALLBACKS_INIT;
repoManager_cloneOptions.fetch_opts.callbacks.credentials = repoManager_gitCredentialCallback;
repoManager_cloneOptions.fetch_opts.callbacks.transfer_progress = repoManager_fetchProgress;
repoManager_cloneOptions.fetch_opts.callbacks.payload = this;
repoManager_cloneOptions.remote_cb = repoManager_gitRemoteCallback;
// repoManager_remoteCallbacks.credentials = repoManager_gitCredentialCallback;
// repoManager_cloneOptions.fetch_opts = repoManager_fetchOptions;
repoManager_fetchOptions.callbacks.transfer_progress = repoManager_fetchProgress;
repoManager_fetchOptions.callbacks.credentials = repoManager_gitCredentialCallback;
repoManager_fetchOptions.callbacks.payload = this;
repoManager_fetchOptions.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;
if(git_clone(&repoManager_repo, repoManager_RepoURL, Global::launcherRepositoryDir.c_str(), &repoManager_cloneOptions) < 0){
RepoManager_thread_taskFailed("Failed to Clone the repository.", "FAIL: Clone failed.");
return;
} // END - Git Clone