X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=pageant.h;h=6e29f40c181a0fc8e8186d25f1acb8aa29a6ec8c;hb=b0b5d5fbe63e982d6a230269a2e2a823e2586512;hp=4d53cbec21a8905a67af2fc892f43d9e6e00e1d2;hpb=bc4066e454f38358f17860e3d4244f63b930f994;p=PuTTY.git diff --git a/pageant.h b/pageant.h index 4d53cbec..6e29f40c 100644 --- a/pageant.h +++ b/pageant.h @@ -76,10 +76,68 @@ void keylist_update(void); * protocol. Call pageant_listener_new() to set up a state; then * create a socket using the returned pointer as a Plug; then call * pageant_listener_got_socket() to give the listening state its own - * socket pointer. + * socket pointer. Also, provide a logging function later if you want + * to. */ struct pageant_listen_state; -struct pageant_listen_state *pageant_listener_new(void *logctx, - pageant_logfn_t logfn); +struct pageant_listen_state *pageant_listener_new(void); void pageant_listener_got_socket(struct pageant_listen_state *pl, Socket sock); +void pageant_listener_set_logfn(struct pageant_listen_state *pl, + void *logctx, pageant_logfn_t logfn); void pageant_listener_free(struct pageant_listen_state *pl); + +/* + * Functions to perform specific key actions, either as a client of an + * ssh-agent running elsewhere, or directly on the agent state in this + * process. (On at least one platform we want to do this in an + * agnostic way between the two situations.) + * + * pageant_get_keylist{1,2} work just like pageant_make_keylist{1,2} + * above, except that they can also cope if they have to contact an + * external agent. + * + * pageant_add_keyfile() is used to load a private key from a file and + * add it to the agent. Initially, you should call it with passphrase + * NULL, and it will check if the key is already in the agent, and + * whether a passphrase is required. Return values are given in the + * enum below. On return, *retstr will either be NULL, or a + * dynamically allocated string containing a key comment or an error + * message. + * + * pageant_add_keyfile() also remembers passphrases with which it's + * successfully decrypted keys (because if you try to add multiple + * keys in one go, you might very well have used the same passphrase + * for keys that have the same trust properties). Call + * pageant_forget_passphrases() to get rid of them all. + */ +void *pageant_get_keylist1(int *length); +void *pageant_get_keylist2(int *length); +enum { + PAGEANT_ACTION_OK, /* success; no further action needed */ + PAGEANT_ACTION_FAILURE, /* failure; *retstr is error message */ + PAGEANT_ACTION_NEED_PP /* need passphrase: *retstr is key comment */ +}; +int pageant_add_keyfile(Filename *filename, const char *passphrase, + char **retstr); +void pageant_forget_passphrases(void); + +struct pageant_pubkey { + /* Everything needed to identify a public key found by + * pageant_enum_keys and pass it back to the agent or other code + * later */ + void *blob; + int bloblen; + char *comment; + int ssh_version; +}; +struct pageant_pubkey *pageant_pubkey_copy(struct pageant_pubkey *key); +void pageant_pubkey_free(struct pageant_pubkey *key); + +typedef void (*pageant_key_enum_fn_t)(void *ctx, + const char *fingerprint, + const char *comment, + struct pageant_pubkey *key); +int pageant_enum_keys(pageant_key_enum_fn_t callback, void *callback_ctx, + char **retstr); +int pageant_delete_key(struct pageant_pubkey *key, char **retstr); +int pageant_delete_all_keys(char **retstr);