Re: [PATCH v4 08/16] reorganize indexing of multipart/signed and multipart/encrypted
[notmuch-archives.git] / 7b / 38101f55403e5f72f48e7eeb338561d5f04a17
1 Return-Path: <amdragon@mit.edu>\r
2 X-Original-To: notmuch@notmuchmail.org\r
3 Delivered-To: notmuch@notmuchmail.org\r
4 Received: from localhost (localhost [127.0.0.1])\r
5         by olra.theworths.org (Postfix) with ESMTP id C131F431FAF\r
6         for <notmuch@notmuchmail.org>; Mon, 25 Aug 2014 10:26:42 -0700 (PDT)\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: -2.3\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5\r
12         tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled\r
13 Received: from olra.theworths.org ([127.0.0.1])\r
14         by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
15         with ESMTP id FKz+dq5eoNK1 for <notmuch@notmuchmail.org>;\r
16         Mon, 25 Aug 2014 10:26:35 -0700 (PDT)\r
17 Received: from dmz-mailsec-scanner-1.mit.edu (dmz-mailsec-scanner-1.mit.edu\r
18         [18.9.25.12])\r
19         (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))\r
20         (No client certificate requested)\r
21         by olra.theworths.org (Postfix) with ESMTPS id AE854431FC0\r
22         for <notmuch@notmuchmail.org>; Mon, 25 Aug 2014 10:26:22 -0700 (PDT)\r
23 X-AuditID: 1209190c-f795e6d000006c66-d5-53fb71be0f5e\r
24 Received: from mailhub-auth-2.mit.edu ( [18.7.62.36])\r
25         (using TLS with cipher AES256-SHA (256/256 bits))\r
26         (Client did not present a certificate)\r
27         by dmz-mailsec-scanner-1.mit.edu (Symantec Messaging Gateway) with SMTP\r
28         id 51.07.27750.EB17BF35; Mon, 25 Aug 2014 13:26:22 -0400 (EDT)\r
29 Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11])\r
30         by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id s7PHQJ6D014430; \r
31         Mon, 25 Aug 2014 13:26:19 -0400\r
32 Received: from drake.dyndns.org (31-35-14.wireless.csail.mit.edu\r
33         [128.31.35.14]) (authenticated bits=0)\r
34         (User authenticated as amdragon@ATHENA.MIT.EDU)\r
35         by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id s7PHQC0J029623\r
36         (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
37         Mon, 25 Aug 2014 13:26:18 -0400\r
38 Received: from amthrax by drake.dyndns.org with local (Exim 4.77)\r
39         (envelope-from <amdragon@mit.edu>)\r
40         id 1XLy20-0003jk-28; Mon, 25 Aug 2014 13:26:12 -0400\r
41 From: Austin Clements <amdragon@mit.edu>\r
42 To: notmuch@notmuchmail.org\r
43 Subject: [PATCH v4 10/11] lib: Return an error from operations that require an\r
44         upgrade\r
45 Date: Mon, 25 Aug 2014 13:26:08 -0400\r
46 Message-Id: <1408987569-14146-11-git-send-email-amdragon@mit.edu>\r
47 X-Mailer: git-send-email 2.0.0\r
48 In-Reply-To: <1408987569-14146-1-git-send-email-amdragon@mit.edu>\r
49 References: <1408987569-14146-1-git-send-email-amdragon@mit.edu>\r
50 X-Brightmail-Tracker:\r
51  H4sIAAAAAAAAA+NgFjrGIsWRmVeSWpSXmKPExsUixG6noruv8HewwfSL8hY3WrsZLZqmO1tc\r
52         vzmT2YHZ49b91+wez1bdYvbYcug9cwBzFJdNSmpOZllqkb5dAlfGi7+b2QtuaFe8+/uRtYGx\r
53         WaWLkZNDQsBEYmHrC3YIW0ziwr31bF2MXBxCArOZJF5M28YEkhAS2Mgo8aSJHyJxjEni+sbN\r
54         7BDOXEaJvvtXwdrZBDQkft9aDNYhIiAtsfPubFYQm1nAS2LZhX4wW1ggTOLG9SVsIDaLgKrE\r
55         9pOXmEFsXgFHiYNz10CdISfRcOMTWA0nUHz6wtlQVzhIfL98nnkCI/8CRoZVjLIpuVW6uYmZ\r
56         OcWpybrFyYl5ealFuoZ6uZkleqkppZsYQcHFKcmzg/HNQaVDjAIcjEo8vDfifwcLsSaWFVfm\r
57         HmKU5GBSEuWdlg8U4kvKT6nMSCzOiC8qzUktPsQowcGsJMLbDJLjTUmsrEotyodJSXOwKInz\r
58         vrW2ChYSSE8sSc1OTS1ILYLJynBwKEnw5hYANQoWpaanVqRl5pQgpJk4OEGG8wANjwep4S0u\r
59         SMwtzkyHyJ9iVJQS510LslUAJJFRmgfXC4v+V4ziQK8I8x4FaecBJg647ldAg5mABpv2/AQZ\r
60         XJKIkJJqYNwWIPrjrd5aLSv+5roKv0ZX5atpSiICYZN2yUQYrGSV3abxjnV5AQszW2b6grrT\r
61         abWbg1a1Xt0z9dcmxlAGgw/dcTUOqzedinJpd+6qiar2zmXyDwr+cdrvlW7UTe1CY7N/Haum\r
62         K55vzVtgPV1k/S4fxmMJJ9c8vDHjz9w/RvvOB585NuucvRJLcUaioRZzUXEiAIblWNnZAgAA\r
63 X-BeenThere: notmuch@notmuchmail.org\r
64 X-Mailman-Version: 2.1.13\r
65 Precedence: list\r
66 List-Id: "Use and development of the notmuch mail system."\r
67         <notmuch.notmuchmail.org>\r
68 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
69         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
70 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
71 List-Post: <mailto:notmuch@notmuchmail.org>\r
72 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
73 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
74         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
75 X-List-Received-Date: Mon, 25 Aug 2014 17:26:43 -0000\r
76 \r
77 Previously, there was no protection against a caller invoking an\r
78 operation on an old database version that would effectively corrupt\r
79 the database by treating it like a newer version.\r
80 \r
81 According to notmuch.h, any caller that opens the database in\r
82 read/write mode is supposed to check if the database needs upgrading\r
83 and perform an upgrade if it does.  This would protect against this,\r
84 but nobody (even the CLI) actually does this.\r
85 \r
86 However, with features, it's easy to protect against incompatible\r
87 operations on a fine-grained basis.  This lightweight change allows\r
88 callers to safely operate on old database versions, while preventing\r
89 specific operations that would corrupt the database with an\r
90 informative error message.\r
91 ---\r
92  lib/database.cc  |  5 +++++\r
93  lib/directory.cc |  5 +++++\r
94  lib/message.cc   |  8 ++++++++\r
95  lib/notmuch.h    | 16 ++++++++++++++++\r
96  4 files changed, 34 insertions(+)\r
97 \r
98 diff --git a/lib/database.cc b/lib/database.cc\r
99 index 53397bb..5116188 100644\r
100 --- a/lib/database.cc\r
101 +++ b/lib/database.cc\r
102 @@ -316,6 +316,8 @@ notmuch_status_to_string (notmuch_status_t status)\r
103         return "Unbalanced number of calls to notmuch_database_begin_atomic/end_atomic";\r
104      case NOTMUCH_STATUS_UNSUPPORTED_OPERATION:\r
105         return "Unsupported operation";\r
106 +    case NOTMUCH_STATUS_UPGRADE_REQUIRED:\r
107 +       return "Operation requires a database upgrade";\r
108      default:\r
109      case NOTMUCH_STATUS_LAST_STATUS:\r
110         return "Unknown error status value";\r
111 @@ -2226,6 +2228,9 @@ notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,\r
112      if (message_ret == NULL)\r
113         return NOTMUCH_STATUS_NULL_POINTER;\r
114  \r
115 +    if (! (notmuch->features & NOTMUCH_FEATURE_FILE_TERMS))\r
116 +       return NOTMUCH_STATUS_UPGRADE_REQUIRED;\r
117 +\r
118      /* return NULL on any failure */\r
119      *message_ret = NULL;\r
120  \r
121 diff --git a/lib/directory.cc b/lib/directory.cc\r
122 index 6a3ffed..8daaec8 100644\r
123 --- a/lib/directory.cc\r
124 +++ b/lib/directory.cc\r
125 @@ -105,6 +105,11 @@ _notmuch_directory_create (notmuch_database_t *notmuch,\r
126      const char *db_path;\r
127      notmuch_bool_t create = (flags & NOTMUCH_FIND_CREATE);\r
128  \r
129 +    if (! (notmuch->features & NOTMUCH_FEATURE_DIRECTORY_DOCS)) {\r
130 +       *status_ret = NOTMUCH_STATUS_UPGRADE_REQUIRED;\r
131 +       return NULL;\r
132 +    }\r
133 +\r
134      *status_ret = NOTMUCH_STATUS_SUCCESS;\r
135  \r
136      path = _notmuch_database_relative_path (notmuch, path);\r
137 diff --git a/lib/message.cc b/lib/message.cc\r
138 index ed8c59e..68f7e68 100644\r
139 --- a/lib/message.cc\r
140 +++ b/lib/message.cc\r
141 @@ -655,6 +655,10 @@ _notmuch_message_add_filename (notmuch_message_t *message,\r
142      if (filename == NULL)\r
143         INTERNAL_ERROR ("Message filename cannot be NULL.");\r
144  \r
145 +    if (! (message->notmuch->features & NOTMUCH_FEATURE_FILE_TERMS) ||\r
146 +       ! (message->notmuch->features & NOTMUCH_FEATURE_BOOL_FOLDER))\r
147 +       return NOTMUCH_STATUS_UPGRADE_REQUIRED;\r
148 +\r
149      relative = _notmuch_database_relative_path (message->notmuch, filename);\r
150  \r
151      status = _notmuch_database_split_path (local, relative, &directory, NULL);\r
152 @@ -699,6 +703,10 @@ _notmuch_message_remove_filename (notmuch_message_t *message,\r
153      notmuch_private_status_t private_status;\r
154      notmuch_status_t status;\r
155  \r
156 +    if (! (message->notmuch->features & NOTMUCH_FEATURE_FILE_TERMS) ||\r
157 +       ! (message->notmuch->features & NOTMUCH_FEATURE_BOOL_FOLDER))\r
158 +       return NOTMUCH_STATUS_UPGRADE_REQUIRED;\r
159 +\r
160      status = _notmuch_database_filename_to_direntry (\r
161         local, message->notmuch, filename, NOTMUCH_FIND_LOOKUP, &direntry);\r
162      if (status || !direntry)\r
163 diff --git a/lib/notmuch.h b/lib/notmuch.h\r
164 index 3c5ec98..cbf2ba5 100644\r
165 --- a/lib/notmuch.h\r
166 +++ b/lib/notmuch.h\r
167 @@ -160,6 +160,10 @@ typedef enum _notmuch_status {\r
168       */\r
169      NOTMUCH_STATUS_UNSUPPORTED_OPERATION,\r
170      /**\r
171 +     * The operation requires a database upgrade.\r
172 +     */\r
173 +    NOTMUCH_STATUS_UPGRADE_REQUIRED,\r
174 +    /**\r
175       * Not an actual status value. Just a way to find out how many\r
176       * valid status values there are.\r
177       */\r
178 @@ -438,6 +442,9 @@ notmuch_database_end_atomic (notmuch_database_t *notmuch);\r
179   *\r
180   * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred;\r
181   *     directory not retrieved.\r
182 + *\r
183 + * NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the\r
184 + *     database to use this function.\r
185   */\r
186  notmuch_status_t\r
187  notmuch_database_get_directory (notmuch_database_t *database,\r
188 @@ -490,6 +497,9 @@ notmuch_database_get_directory (notmuch_database_t *database,\r
189   *\r
190   * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only\r
191   *     mode so no message can be added.\r
192 + *\r
193 + * NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the\r
194 + *     database to use this function.\r
195   */\r
196  notmuch_status_t\r
197  notmuch_database_add_message (notmuch_database_t *database,\r
198 @@ -520,6 +530,9 @@ notmuch_database_add_message (notmuch_database_t *database,\r
199   *\r
200   * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only\r
201   *     mode so no message can be removed.\r
202 + *\r
203 + * NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the\r
204 + *     database to use this function.\r
205   */\r
206  notmuch_status_t\r
207  notmuch_database_remove_message (notmuch_database_t *database,\r
208 @@ -575,6 +588,9 @@ notmuch_database_find_message (notmuch_database_t *database,\r
209   * NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory, creating the message object\r
210   *\r
211   * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred\r
212 + *\r
213 + * NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the\r
214 + *     database to use this function.\r
215   */\r
216  notmuch_status_t\r
217  notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,\r
218 -- \r
219 2.0.0\r
220 \r