diff options
author | Werner Koch <[email protected]> | 2013-08-09 17:19:26 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2013-08-09 17:19:26 +0000 |
commit | 8579091c4f6a36e6bb06fcfbd147a776166fd3ea (patch) | |
tree | bf1e746416e7c1378832a65329cdcbffd6070df2 /src/gpgme-tool.c | |
parent | Prefer GnuPG-2 engines over GnuPG-1. (diff) | |
download | gpgme-8579091c4f6a36e6bb06fcfbd147a776166fd3ea.tar.gz gpgme-8579091c4f6a36e6bb06fcfbd147a776166fd3ea.zip |
Add function gpgme_data_identify.
* src/gpgme.h.in (gpgme_data_type_t): New.
(gpgme_data_identify): New prototype.
* src/data-identify.c: New.
* src/parsetlv.c, src/parsetlv.h: New. Take from gpa.
* src/libgpgme.vers, src/gpgme.def: Add gpgme_data_identify.
* src/gpgme-tool.c (status): Add STATUS_IDENTIFY_RESULT.
(gt_identify): New.
(cmd_identify): New.
(hlp_passwd): Move close to cmd_passwd.
--
It is often useful to have a way to identify the data which needs
processing. This is such a common task that it makes sense to
implement this in gpgme to avoid diverging implementations.
Diffstat (limited to 'src/gpgme-tool.c')
-rw-r--r-- | src/gpgme-tool.c | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c index 0ebababb..2bf7654a 100644 --- a/src/gpgme-tool.c +++ b/src/gpgme-tool.c @@ -1435,7 +1435,8 @@ typedef enum status STATUS_INCLUDE_CERTS, STATUS_KEYLIST_MODE, STATUS_RECIPIENT, - STATUS_ENCRYPT_RESULT + STATUS_ENCRYPT_RESULT, + STATUS_IDENTIFY_RESULT } status_t; const char *status_string[] = @@ -1448,7 +1449,8 @@ const char *status_string[] = "INCLUDE_CERTS", "KEYLIST_MODE", "RECIPIENT", - "ENCRYPT_RESULT" + "ENCRYPT_RESULT", + "IDENTIFY_RESULT" }; struct gpgme_tool @@ -2065,11 +2067,6 @@ gt_vfs_create (gpgme_tool_t gt, const char *container_file, int flags) } -static const char hlp_passwd[] = - "PASSWD <user-id>\n" - "\n" - "Ask the backend to change the passphrase for the key\n" - "specified by USER-ID."; gpg_error_t gt_passwd (gpgme_tool_t gt, char *fpr) { @@ -2086,6 +2083,29 @@ gt_passwd (gpgme_tool_t gt, char *fpr) } +gpg_error_t +gt_identify (gpgme_tool_t gt, gpgme_data_t data) +{ + const char *s = "?"; + + switch (gpgme_data_identify (data, 0)) + { + case GPGME_DATA_TYPE_INVALID: return gpg_error (GPG_ERR_GENERAL); + case GPGME_DATA_TYPE_UNKNOWN : s = "unknown"; break; + case GPGME_DATA_TYPE_PGP_SIGNED : s = "PGP-signed"; break; + case GPGME_DATA_TYPE_PGP_OTHER : s = "PGP"; break; + case GPGME_DATA_TYPE_PGP_KEY : s = "PGP-key"; break; + case GPGME_DATA_TYPE_CMS_SIGNED : s = "CMS-signed"; break; + case GPGME_DATA_TYPE_CMS_ENCRYPTED: s = "CMS-encrypted"; break; + case GPGME_DATA_TYPE_CMS_OTHER : s = "CMS"; break; + case GPGME_DATA_TYPE_X509_CERT : s = "X.509"; break; + case GPGME_DATA_TYPE_PKCS12 : s = "PKCS12"; break; + } + gt_write_status (gt, STATUS_IDENTIFY_RESULT, s, NULL); + return 0; +} + + #define GT_RESULT_ENCRYPT 0x1 #define GT_RESULT_DECRYPT 0x2 #define GT_RESULT_SIGN 0x4 @@ -3374,6 +3394,11 @@ cmd_vfs_create (assuan_context_t ctx, char *line) } +static const char hlp_passwd[] = + "PASSWD <user-id>\n" + "\n" + "Ask the backend to change the passphrase for the key\n" + "specified by USER-ID."; static gpg_error_t cmd_passwd (assuan_context_t ctx, char *line) { @@ -3430,6 +3455,39 @@ cmd_hash_algo_name (assuan_context_t ctx, char *line) } +static const char hlp_identify[] = + "IDENTIY\n" + "\n" + "Identify the type of data set with the INPUT command."; +static gpg_error_t +cmd_identify (assuan_context_t ctx, char *line) +{ + struct server *server = assuan_get_pointer (ctx); + gpg_error_t err; + assuan_fd_t inp_fd; + char *inp_fn; + gpgme_data_t inp_data; + + inp_fd = server->input_fd; + inp_fn = server->input_filename; + if (inp_fd == ASSUAN_INVALID_FD && !inp_fn) + return GPG_ERR_ASS_NO_INPUT; + + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); + if (err) + return err; + + err = gt_identify (server->gt, inp_data); + + gpgme_data_release (inp_data); + server_reset_fds (server); + + return err; +} + + + /* Tell the assuan library about our commands. */ static gpg_error_t register_commands (assuan_context_t ctx) @@ -3488,6 +3546,7 @@ register_commands (assuan_context_t ctx) { "PUBKEY_ALGO_NAME", cmd_pubkey_algo_name }, { "HASH_ALGO_NAME", cmd_hash_algo_name }, { "PASSWD", cmd_passwd, hlp_passwd }, + { "IDENTIFY", cmd_identify, hlp_identify }, { NULL } }; int idx; |