mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-11 13:12:22 +00:00
Make SSH APIs present even without SSH support
The SSH APIs will just return an error code and state that the library was built without SSH support if they are called in that case.
This commit is contained in:
parent
82cb8e236a
commit
a3c062dbf8
@ -36,14 +36,15 @@ typedef enum {
|
|||||||
} git_credtype_t;
|
} git_credtype_t;
|
||||||
|
|
||||||
/* The base structure for all credential types */
|
/* The base structure for all credential types */
|
||||||
typedef struct git_cred {
|
typedef struct git_cred git_cred;
|
||||||
|
|
||||||
|
struct git_cred {
|
||||||
git_credtype_t credtype;
|
git_credtype_t credtype;
|
||||||
void (*free)(
|
void (*free)(git_cred *cred);
|
||||||
struct git_cred *cred);
|
};
|
||||||
} git_cred;
|
|
||||||
|
|
||||||
/* A plaintext username and password */
|
/* A plaintext username and password */
|
||||||
typedef struct git_cred_userpass_plaintext {
|
typedef struct {
|
||||||
git_cred parent;
|
git_cred parent;
|
||||||
char *username;
|
char *username;
|
||||||
char *password;
|
char *password;
|
||||||
@ -51,6 +52,9 @@ typedef struct git_cred_userpass_plaintext {
|
|||||||
|
|
||||||
#ifdef GIT_SSH
|
#ifdef GIT_SSH
|
||||||
typedef LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*git_cred_sign_callback));
|
typedef LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*git_cred_sign_callback));
|
||||||
|
#else
|
||||||
|
typedef int (*git_cred_sign_callback)(void *, ...);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A ssh key file and passphrase */
|
/* A ssh key file and passphrase */
|
||||||
typedef struct git_cred_ssh_keyfile_passphrase {
|
typedef struct git_cred_ssh_keyfile_passphrase {
|
||||||
@ -68,7 +72,6 @@ typedef struct git_cred_ssh_publickey {
|
|||||||
void *sign_callback;
|
void *sign_callback;
|
||||||
void *sign_data;
|
void *sign_data;
|
||||||
} git_cred_ssh_publickey;
|
} git_cred_ssh_publickey;
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new plain-text username and password credential object.
|
* Creates a new plain-text username and password credential object.
|
||||||
@ -84,7 +87,6 @@ GIT_EXTERN(int) git_cred_userpass_plaintext_new(
|
|||||||
const char *username,
|
const char *username,
|
||||||
const char *password);
|
const char *password);
|
||||||
|
|
||||||
#ifdef GIT_SSH
|
|
||||||
/**
|
/**
|
||||||
* Creates a new ssh key file and passphrase credential object.
|
* Creates a new ssh key file and passphrase credential object.
|
||||||
* The supplied credential parameter will be internally duplicated.
|
* The supplied credential parameter will be internally duplicated.
|
||||||
@ -116,9 +118,8 @@ GIT_EXTERN(int) git_cred_ssh_publickey_new(
|
|||||||
git_cred **out,
|
git_cred **out,
|
||||||
const char *publickey,
|
const char *publickey,
|
||||||
size_t publickey_len,
|
size_t publickey_len,
|
||||||
git_cred_sign_callback,
|
git_cred_sign_callback sign_fn,
|
||||||
void *sign_data);
|
void *sign_data);
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signature of a function which acquires a credential object.
|
* Signature of a function which acquires a credential object.
|
||||||
@ -152,17 +153,21 @@ typedef enum {
|
|||||||
|
|
||||||
typedef void (*git_transport_message_cb)(const char *str, int len, void *data);
|
typedef void (*git_transport_message_cb)(const char *str, int len, void *data);
|
||||||
|
|
||||||
typedef struct git_transport {
|
typedef struct git_transport git_transport;
|
||||||
|
|
||||||
|
struct git_transport {
|
||||||
unsigned int version;
|
unsigned int version;
|
||||||
/* Set progress and error callbacks */
|
/* Set progress and error callbacks */
|
||||||
int (*set_callbacks)(struct git_transport *transport,
|
int (*set_callbacks)(
|
||||||
|
git_transport *transport,
|
||||||
git_transport_message_cb progress_cb,
|
git_transport_message_cb progress_cb,
|
||||||
git_transport_message_cb error_cb,
|
git_transport_message_cb error_cb,
|
||||||
void *payload);
|
void *payload);
|
||||||
|
|
||||||
/* Connect the transport to the remote repository, using the given
|
/* Connect the transport to the remote repository, using the given
|
||||||
* direction. */
|
* direction. */
|
||||||
int (*connect)(struct git_transport *transport,
|
int (*connect)(
|
||||||
|
git_transport *transport,
|
||||||
const char *url,
|
const char *url,
|
||||||
git_cred_acquire_cb cred_acquire_cb,
|
git_cred_acquire_cb cred_acquire_cb,
|
||||||
void *cred_acquire_payload,
|
void *cred_acquire_payload,
|
||||||
@ -172,17 +177,19 @@ typedef struct git_transport {
|
|||||||
/* This function may be called after a successful call to connect(). The
|
/* This function may be called after a successful call to connect(). The
|
||||||
* provided callback is invoked for each ref discovered on the remote
|
* provided callback is invoked for each ref discovered on the remote
|
||||||
* end. */
|
* end. */
|
||||||
int (*ls)(struct git_transport *transport,
|
int (*ls)(
|
||||||
|
git_transport *transport,
|
||||||
git_headlist_cb list_cb,
|
git_headlist_cb list_cb,
|
||||||
void *payload);
|
void *payload);
|
||||||
|
|
||||||
/* Executes the push whose context is in the git_push object. */
|
/* Executes the push whose context is in the git_push object. */
|
||||||
int (*push)(struct git_transport *transport, git_push *push);
|
int (*push)(git_transport *transport, git_push *push);
|
||||||
|
|
||||||
/* This function may be called after a successful call to connect(), when
|
/* This function may be called after a successful call to connect(), when
|
||||||
* the direction is FETCH. The function performs a negotiation to calculate
|
* the direction is FETCH. The function performs a negotiation to calculate
|
||||||
* the wants list for the fetch. */
|
* the wants list for the fetch. */
|
||||||
int (*negotiate_fetch)(struct git_transport *transport,
|
int (*negotiate_fetch)(
|
||||||
|
git_transport *transport,
|
||||||
git_repository *repo,
|
git_repository *repo,
|
||||||
const git_remote_head * const *refs,
|
const git_remote_head * const *refs,
|
||||||
size_t count);
|
size_t count);
|
||||||
@ -190,28 +197,29 @@ typedef struct git_transport {
|
|||||||
/* This function may be called after a successful call to negotiate_fetch(),
|
/* This function may be called after a successful call to negotiate_fetch(),
|
||||||
* when the direction is FETCH. This function retrieves the pack file for
|
* when the direction is FETCH. This function retrieves the pack file for
|
||||||
* the fetch from the remote end. */
|
* the fetch from the remote end. */
|
||||||
int (*download_pack)(struct git_transport *transport,
|
int (*download_pack)(
|
||||||
|
git_transport *transport,
|
||||||
git_repository *repo,
|
git_repository *repo,
|
||||||
git_transfer_progress *stats,
|
git_transfer_progress *stats,
|
||||||
git_transfer_progress_callback progress_cb,
|
git_transfer_progress_callback progress_cb,
|
||||||
void *progress_payload);
|
void *progress_payload);
|
||||||
|
|
||||||
/* Checks to see if the transport is connected */
|
/* Checks to see if the transport is connected */
|
||||||
int (*is_connected)(struct git_transport *transport);
|
int (*is_connected)(git_transport *transport);
|
||||||
|
|
||||||
/* Reads the flags value previously passed into connect() */
|
/* Reads the flags value previously passed into connect() */
|
||||||
int (*read_flags)(struct git_transport *transport, int *flags);
|
int (*read_flags)(git_transport *transport, int *flags);
|
||||||
|
|
||||||
/* Cancels any outstanding transport operation */
|
/* Cancels any outstanding transport operation */
|
||||||
void (*cancel)(struct git_transport *transport);
|
void (*cancel)(git_transport *transport);
|
||||||
|
|
||||||
/* This function is the reverse of connect() -- it terminates the
|
/* This function is the reverse of connect() -- it terminates the
|
||||||
* connection to the remote end. */
|
* connection to the remote end. */
|
||||||
int (*close)(struct git_transport *transport);
|
int (*close)(git_transport *transport);
|
||||||
|
|
||||||
/* Frees/destructs the git_transport object. */
|
/* Frees/destructs the git_transport object. */
|
||||||
void (*free)(struct git_transport *transport);
|
void (*free)(git_transport *transport);
|
||||||
} git_transport;
|
};
|
||||||
|
|
||||||
#define GIT_TRANSPORT_VERSION 1
|
#define GIT_TRANSPORT_VERSION 1
|
||||||
#define GIT_TRANSPORT_INIT {GIT_TRANSPORT_VERSION}
|
#define GIT_TRANSPORT_INIT {GIT_TRANSPORT_VERSION}
|
||||||
@ -299,35 +307,36 @@ typedef enum {
|
|||||||
GIT_SERVICE_RECEIVEPACK = 4,
|
GIT_SERVICE_RECEIVEPACK = 4,
|
||||||
} git_smart_service_t;
|
} git_smart_service_t;
|
||||||
|
|
||||||
struct git_smart_subtransport;
|
typedef struct git_smart_subtransport git_smart_subtransport;
|
||||||
|
typedef struct git_smart_subtransport_stream git_smart_subtransport_stream;
|
||||||
|
|
||||||
/* A stream used by the smart transport to read and write data
|
/* A stream used by the smart transport to read and write data
|
||||||
* from a subtransport */
|
* from a subtransport */
|
||||||
typedef struct git_smart_subtransport_stream {
|
struct git_smart_subtransport_stream {
|
||||||
/* The owning subtransport */
|
/* The owning subtransport */
|
||||||
struct git_smart_subtransport *subtransport;
|
git_smart_subtransport *subtransport;
|
||||||
|
|
||||||
int (*read)(
|
int (*read)(
|
||||||
struct git_smart_subtransport_stream *stream,
|
git_smart_subtransport_stream *stream,
|
||||||
char *buffer,
|
char *buffer,
|
||||||
size_t buf_size,
|
size_t buf_size,
|
||||||
size_t *bytes_read);
|
size_t *bytes_read);
|
||||||
|
|
||||||
int (*write)(
|
int (*write)(
|
||||||
struct git_smart_subtransport_stream *stream,
|
git_smart_subtransport_stream *stream,
|
||||||
const char *buffer,
|
const char *buffer,
|
||||||
size_t len);
|
size_t len);
|
||||||
|
|
||||||
void (*free)(
|
void (*free)(
|
||||||
struct git_smart_subtransport_stream *stream);
|
git_smart_subtransport_stream *stream);
|
||||||
} git_smart_subtransport_stream;
|
};
|
||||||
|
|
||||||
/* An implementation of a subtransport which carries data for the
|
/* An implementation of a subtransport which carries data for the
|
||||||
* smart transport */
|
* smart transport */
|
||||||
typedef struct git_smart_subtransport {
|
struct git_smart_subtransport {
|
||||||
int (* action)(
|
int (* action)(
|
||||||
git_smart_subtransport_stream **out,
|
git_smart_subtransport_stream **out,
|
||||||
struct git_smart_subtransport *transport,
|
git_smart_subtransport *transport,
|
||||||
const char *url,
|
const char *url,
|
||||||
git_smart_service_t action);
|
git_smart_service_t action);
|
||||||
|
|
||||||
@ -337,10 +346,10 @@ typedef struct git_smart_subtransport {
|
|||||||
*
|
*
|
||||||
* 1. UPLOADPACK_LS -> UPLOADPACK
|
* 1. UPLOADPACK_LS -> UPLOADPACK
|
||||||
* 2. RECEIVEPACK_LS -> RECEIVEPACK */
|
* 2. RECEIVEPACK_LS -> RECEIVEPACK */
|
||||||
int (* close)(struct git_smart_subtransport *transport);
|
int (*close)(git_smart_subtransport *transport);
|
||||||
|
|
||||||
void (* free)(struct git_smart_subtransport *transport);
|
void (*free)(git_smart_subtransport *transport);
|
||||||
} git_smart_subtransport;
|
};
|
||||||
|
|
||||||
/* A function which creates a new subtransport for the smart transport */
|
/* A function which creates a new subtransport for the smart transport */
|
||||||
typedef int (*git_smart_subtransport_cb)(
|
typedef int (*git_smart_subtransport_cb)(
|
||||||
|
@ -82,12 +82,28 @@ static void ssh_keyfile_passphrase_free(struct git_cred *cred)
|
|||||||
git__free(c);
|
git__free(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ssh_publickey_free(struct git_cred *cred)
|
||||||
|
{
|
||||||
|
git_cred_ssh_publickey *c = (git_cred_ssh_publickey *)cred;
|
||||||
|
|
||||||
|
git__free(c->publickey);
|
||||||
|
|
||||||
|
c->sign_callback = NULL;
|
||||||
|
c->sign_data = NULL;
|
||||||
|
|
||||||
|
memset(c, 0, sizeof(*c));
|
||||||
|
|
||||||
|
git__free(c);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int git_cred_ssh_keyfile_passphrase_new(
|
int git_cred_ssh_keyfile_passphrase_new(
|
||||||
git_cred **cred,
|
git_cred **cred,
|
||||||
const char *publickey,
|
const char *publickey,
|
||||||
const char *privatekey,
|
const char *privatekey,
|
||||||
const char *passphrase)
|
const char *passphrase)
|
||||||
{
|
{
|
||||||
|
#ifdef GIT_SSH
|
||||||
git_cred_ssh_keyfile_passphrase *c;
|
git_cred_ssh_keyfile_passphrase *c;
|
||||||
|
|
||||||
assert(cred && privatekey);
|
assert(cred && privatekey);
|
||||||
@ -113,29 +129,27 @@ int git_cred_ssh_keyfile_passphrase_new(
|
|||||||
|
|
||||||
*cred = &c->parent;
|
*cred = &c->parent;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
#else
|
||||||
|
GIT_UNUSED(publickey);
|
||||||
|
GIT_UNUSED(privatekey);
|
||||||
|
GIT_UNUSED(passphrase);
|
||||||
|
|
||||||
static void ssh_publickey_free(struct git_cred *cred)
|
assert(cred);
|
||||||
{
|
*cred = NULL;
|
||||||
git_cred_ssh_publickey *c = (git_cred_ssh_publickey *)cred;
|
|
||||||
|
|
||||||
git__free(c->publickey);
|
giterr_set(GITERR_INVALID, "Cannot create SSH credential. Library was built without SSH support");
|
||||||
|
return -1;
|
||||||
c->sign_callback = NULL;
|
#endif
|
||||||
c->sign_data = NULL;
|
|
||||||
|
|
||||||
memset(c, 0, sizeof(*c));
|
|
||||||
|
|
||||||
git__free(c);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_cred_ssh_publickey_new(
|
int git_cred_ssh_publickey_new(
|
||||||
git_cred **cred,
|
git_cred **cred,
|
||||||
const char *publickey,
|
const char *publickey,
|
||||||
size_t publickey_len,
|
size_t publickey_len,
|
||||||
LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)),
|
git_cred_sign_callback sign_callback,
|
||||||
void *sign_data)
|
void *sign_data)
|
||||||
{
|
{
|
||||||
|
#ifdef GIT_SSH
|
||||||
git_cred_ssh_publickey *c;
|
git_cred_ssh_publickey *c;
|
||||||
|
|
||||||
if (!cred)
|
if (!cred)
|
||||||
@ -158,5 +172,16 @@ int git_cred_ssh_publickey_new(
|
|||||||
|
|
||||||
*cred = &c->parent;
|
*cred = &c->parent;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
#else
|
||||||
|
GIT_UNUSED(publickey);
|
||||||
|
GIT_UNUSED(publickey_len);
|
||||||
|
GIT_UNUSED(sign_callback);
|
||||||
|
GIT_UNUSED(sign_data);
|
||||||
|
|
||||||
|
assert(cred);
|
||||||
|
*cred = NULL;
|
||||||
|
|
||||||
|
giterr_set(GITERR_INVALID, "Cannot create SSH credential. Library was built without SSH support");
|
||||||
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
* a Linking Exception. For full terms see the included COPYING file.
|
* a Linking Exception. For full terms see the included COPYING file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef GIT_SSH
|
|
||||||
|
|
||||||
#include "git2.h"
|
#include "git2.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "netops.h"
|
#include "netops.h"
|
||||||
#include "smart.h"
|
#include "smart.h"
|
||||||
|
|
||||||
|
#ifdef GIT_SSH
|
||||||
|
|
||||||
#include <libssh2.h>
|
#include <libssh2.h>
|
||||||
|
|
||||||
#define OWNING_SUBTRANSPORT(s) ((ssh_subtransport *)(s)->parent.subtransport)
|
#define OWNING_SUBTRANSPORT(s) ((ssh_subtransport *)(s)->parent.subtransport)
|
||||||
@ -496,13 +496,15 @@ static void _ssh_free(git_smart_subtransport *subtransport)
|
|||||||
|
|
||||||
git__free(t);
|
git__free(t);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int git_smart_subtransport_ssh(git_smart_subtransport **out, git_transport *owner)
|
int git_smart_subtransport_ssh(
|
||||||
|
git_smart_subtransport **out, git_transport *owner)
|
||||||
{
|
{
|
||||||
|
#ifdef GIT_SSH
|
||||||
ssh_subtransport *t;
|
ssh_subtransport *t;
|
||||||
|
|
||||||
if (!out)
|
assert(out);
|
||||||
return -1;
|
|
||||||
|
|
||||||
t = git__calloc(sizeof(ssh_subtransport), 1);
|
t = git__calloc(sizeof(ssh_subtransport), 1);
|
||||||
GITERR_CHECK_ALLOC(t);
|
GITERR_CHECK_ALLOC(t);
|
||||||
@ -514,6 +516,13 @@ int git_smart_subtransport_ssh(git_smart_subtransport **out, git_transport *owne
|
|||||||
|
|
||||||
*out = (git_smart_subtransport *) t;
|
*out = (git_smart_subtransport *) t;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
#else
|
||||||
|
GIT_UNUSED(owner);
|
||||||
|
|
||||||
|
assert(out);
|
||||||
|
*out = NULL;
|
||||||
|
|
||||||
|
giterr_set(GITERR_INVALID, "Cannot create SSH transport. Library was built without SSH support");
|
||||||
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user