#ifndef _GNU_SOURCE
#define _GNU_SOURCE /* for getline */
#endif
+#include <stdbool.h>
#include <stdio.h>
#include <sysexits.h>
#include "gmime-extra.h"
-typedef GMimeCryptoContext notmuch_crypto_context_t;
-/* This is automatically included only since gmime 2.6.10 */
-#include <gmime/gmime-pkcs7-context.h>
-
#include "notmuch.h"
/* This is separate from notmuch-private.h because we're trying to
#include <errno.h>
#include <signal.h>
#include <ctype.h>
+#include <zlib.h>
#include "talloc-extra.h"
+#include "crypto.h"
+#include "repair.h"
-#define unused(x) x __attribute__ ((unused))
+#define unused(x) x ## _unused __attribute__ ((unused))
-#define STRINGIFY(s) STRINGIFY_(s)
+#define STRINGIFY(s) STRINGIFY_ (s)
#define STRINGIFY_(s) #s
typedef struct mime_node mime_node_t;
struct notmuch_show_params;
typedef struct notmuch_show_format {
- struct sprinter *(*new_sprinter) (const void *ctx, FILE *stream);
- notmuch_status_t (*part) (const void *ctx, struct sprinter *sprinter,
- struct mime_node *node, int indent,
- const struct notmuch_show_params *params);
+ struct sprinter *(*new_sprinter)(const void *ctx, FILE *stream);
+ notmuch_status_t (*part)(const void *ctx, struct sprinter *sprinter,
+ struct mime_node *node, int indent,
+ const struct notmuch_show_params *params);
} notmuch_show_format_t;
-typedef struct notmuch_crypto {
- notmuch_crypto_context_t* gpgctx;
- notmuch_crypto_context_t* pkcs7ctx;
- notmuch_bool_t verify;
- notmuch_bool_t decrypt;
- const char *gpgpath;
-} notmuch_crypto_t;
-
typedef struct notmuch_show_params {
- notmuch_bool_t entire_thread;
- notmuch_bool_t omit_excluded;
- notmuch_bool_t output_body;
+ bool entire_thread;
+ bool omit_excluded;
+ bool output_body;
int part;
- notmuch_crypto_t crypto;
- notmuch_bool_t include_html;
+ _notmuch_crypto_t crypto;
+ bool include_html;
GMimeStream *out_stream;
} notmuch_show_params_t;
*
* Note that __location__ comes from talloc.h.
*/
-#define INTERNAL_ERROR(format, ...) \
- do { \
- fprintf(stderr, \
- "Internal error: " format " (%s)\n", \
- ##__VA_ARGS__, __location__); \
- exit (1); \
+#define INTERNAL_ERROR(format, ...) \
+ do { \
+ fprintf (stderr, \
+ "Internal error: " format " (%s)\n", \
+ ##__VA_ARGS__, __location__); \
+ exit (1); \
} while (0)
#define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0]))
static inline void
chomp_newline (char *str)
{
- if (str && str[strlen(str)-1] == '\n')
- str[strlen(str)-1] = '\0';
+ if (str && str[strlen (str) - 1] == '\n')
+ str[strlen (str) - 1] = '\0';
}
/* Exit status code indicating temporary failure; user is invited to
* this. New (required) map fields can be added without increasing
* this.
*/
-#define NOTMUCH_FORMAT_CUR 3
+#define NOTMUCH_FORMAT_CUR 4
/* The minimum supported structured output format version. Requests
* for format versions below this will return an error. */
#define NOTMUCH_FORMAT_MIN 1
void
notmuch_exit_if_unsupported_format (void);
-notmuch_crypto_context_t *
-notmuch_crypto_get_context (notmuch_crypto_t *crypto, const char *protocol);
-
-int
-notmuch_crypto_cleanup (notmuch_crypto_t *crypto);
-
int
notmuch_count_command (notmuch_config_t *config, int argc, char *argv[]);
int
notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[]);
+int
+notmuch_reindex_command (notmuch_config_t *config, int argc, char *argv[]);
+
int
notmuch_reply_command (notmuch_config_t *config, int argc, char *argv[]);
void
format_part_sprinter (const void *ctx, struct sprinter *sp, mime_node_t *node,
- notmuch_bool_t first, notmuch_bool_t output_body,
- notmuch_bool_t include_html);
+ bool output_body,
+ bool include_html);
void
format_headers_sprinter (struct sprinter *sp, GMimeMessage *message,
- notmuch_bool_t reply);
+ bool reply, const _notmuch_message_crypto_t *msg_crypto);
typedef enum {
NOTMUCH_SHOW_TEXT_PART_REPLY = 1 << 0,
/* notmuch-config.c */
typedef enum {
- NOTMUCH_CONFIG_OPEN = 1 << 0,
- NOTMUCH_CONFIG_CREATE = 1 << 1,
+ NOTMUCH_CONFIG_OPEN = 1 << 0,
+ NOTMUCH_CONFIG_CREATE = 1 << 1,
} notmuch_config_mode_t;
notmuch_config_t *
int
notmuch_config_save (notmuch_config_t *config);
-notmuch_bool_t
+bool
notmuch_config_is_new (notmuch_config_t *config);
const char *
notmuch_config_set_database_path (notmuch_config_t *config,
const char *database_path);
-const char *
-notmuch_config_get_crypto_gpg_path (notmuch_config_t *config);
-
-void
-notmuch_config_set_crypto_gpg_path (notmuch_config_t *config,
- const char *gpg_path);
-
const char *
notmuch_config_get_user_name (notmuch_config_t *config);
const char *new_ignore[],
size_t length);
-notmuch_bool_t
+bool
notmuch_config_get_maildir_synchronize_flags (notmuch_config_t *config);
void
notmuch_config_set_maildir_synchronize_flags (notmuch_config_t *config,
- notmuch_bool_t synchronize_flags);
+ bool synchronize_flags);
const char **
notmuch_config_get_search_exclude_tags (notmuch_config_t *config, size_t *length);
void
notmuch_config_set_search_exclude_tags (notmuch_config_t *config,
- const char *list[],
- size_t length);
+ const char *list[],
+ size_t length);
int
notmuch_run_hook (const char *db_path, const char *hook);
-notmuch_bool_t
+bool
debugger_is_active (void);
/* mime-node.c */
int part_num;
/* True if decryption of this part was attempted. */
- notmuch_bool_t decrypt_attempted;
+ bool decrypt_attempted;
/* True if decryption of this part's child succeeded. In this
* case, the decrypted part is substituted for the second child of
* this part (which would usually be the encrypted data). */
- notmuch_bool_t decrypt_success;
+ bool decrypt_success;
/* True if signature verification on this part was attempted. */
- notmuch_bool_t verify_attempted;
+ bool verify_attempted;
/* The list of signatures for signed or encrypted containers. If
* there are no signatures, this will be NULL. */
- GMimeSignatureList* sig_list;
+ GMimeSignatureList *sig_list;
/* Internal: Context inherited from the root iterator. */
struct mime_node_context *ctx;
/* Internal: For successfully decrypted multipart parts, the
- * decrypted part to substitute for the second child. */
- GMimeObject *decrypted_child;
+ * decrypted part to substitute for the second child; or, for
+ * PKCS#7 parts, the part returned after removing/processing the
+ * PKCS#7 transformation */
+ GMimeObject *unwrapped_child;
/* Internal: The next child for depth-first traversal and the part
* number to assign it (or -1 if unknown). */
/* Construct a new MIME node pointing to the root message part of
* message. If crypto->verify is true, signed child parts will be
- * verified. If crypto->decrypt is true, encrypted child parts will be
- * decrypted. If the crypto contexts (crypto->gpgctx or
- * crypto->pkcs7) are NULL, they will be lazily initialized.
+ * verified. If crypto->decrypt is NOTMUCH_DECRYPT_TRUE, encrypted
+ * child parts will be decrypted using either stored session keys or
+ * asymmetric crypto. If crypto->decrypt is NOTMUCH_DECRYPT_AUTO,
+ * only session keys will be tried. If the crypto contexts
+ * (crypto->gpgctx or crypto->pkcs7) are NULL, they will be lazily
+ * initialized.
*
* Return value:
*
*/
notmuch_status_t
mime_node_open (const void *ctx, notmuch_message_t *message,
- notmuch_crypto_t *crypto, mime_node_t **node_out);
+ _notmuch_crypto_t *crypto, mime_node_t **node_out);
/* Return a new MIME node for the requested child part of parent.
* parent will be used as the talloc context for the returned child
mime_node_child (mime_node_t *parent, int child);
/* Return the nth child of node in a depth-first traversal. If n is
- * 0, returns node itself. Returns NULL if there is no such part. */
+* 0, returns node itself. Returns NULL if there is no such part. */
mime_node_t *
mime_node_seek_dfs (mime_node_t *node, int n);
+const _notmuch_message_crypto_t *
+mime_node_get_message_crypto_status (mime_node_t *node);
+
typedef enum dump_formats {
DUMP_FORMAT_AUTO,
DUMP_FORMAT_BATCH_TAG,
} dump_format_t;
typedef enum dump_includes {
- DUMP_INCLUDE_TAGS = 1,
- DUMP_INCLUDE_CONFIG = 2,
- DUMP_INCLUDE_PROPERTIES = 4
+ DUMP_INCLUDE_TAGS = 1,
+ DUMP_INCLUDE_CONFIG = 2,
+ DUMP_INCLUDE_PROPERTIES = 4
} dump_include_t;
#define DUMP_INCLUDE_DEFAULT (DUMP_INCLUDE_TAGS | DUMP_INCLUDE_CONFIG | DUMP_INCLUDE_PROPERTIES)
const char *query_str,
dump_format_t output_format,
dump_include_t include,
- notmuch_bool_t gzip_output);
+ bool gzip_output);
-/* If status is non-zero (i.e. error) print appropriate
- messages to stderr.
-*/
+/* If status indicates error print appropriate
+ * messages to stderr.
+ */
notmuch_status_t
print_status_query (const char *loc,
const notmuch_query_t *query,
notmuch_status_t status);
+notmuch_status_t
+print_status_message (const char *loc,
+ const notmuch_message_t *message,
+ notmuch_status_t status);
+
notmuch_status_t
print_status_database (const char *loc,
const notmuch_database_t *database,
int
status_to_exit (notmuch_status_t status);
+notmuch_status_t
+print_status_gzbytes (const char *loc,
+ gzFile file,
+ int bytes);
+
+/* the __location__ macro is defined in talloc.h */
+#define ASSERT_GZBYTES(file, bytes) ((print_status_gzbytes (__location__, file, bytes)) ? exit (1) : 0)
+#define GZPRINTF(file, fmt, ...) ASSERT_GZBYTES (file, gzprintf (file, fmt, ##__VA_ARGS__));
+#define GZPUTS(file, str) ASSERT_GZBYTES(file, gzputs (file, str));
+
#include "command-line-arguments.h"
-extern char *notmuch_requested_db_uuid;
-extern const notmuch_opt_desc_t notmuch_shared_options [];
+extern const char *notmuch_requested_db_uuid;
+extern const notmuch_opt_desc_t notmuch_shared_options [];
void notmuch_exit_if_unmatched_db_uuid (notmuch_database_t *notmuch);
-void notmuch_process_shared_options (const char* subcommand_name);
-int notmuch_minimal_options (const char* subcommand_name,
+void notmuch_process_shared_options (const char *subcommand_name);
+int notmuch_minimal_options (const char *subcommand_name,
int argc, char **argv);
+
+
+/* the state chosen by the user invoking one of the notmuch
+ * subcommands that does indexing */
+struct _notmuch_client_indexing_cli_choices {
+ int decrypt_policy;
+ bool decrypt_policy_set;
+ notmuch_indexopts_t *opts;
+};
+extern struct _notmuch_client_indexing_cli_choices indexing_cli_choices;
+extern const notmuch_opt_desc_t notmuch_shared_indexing_options [];
+notmuch_status_t
+notmuch_process_shared_indexing_options (notmuch_database_t *notmuch);
+
#endif