summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-01-21 07:17:56 +0200
committerSergey Poznyakoff <gray@gnu.org>2019-01-21 10:31:37 +0200
commitdb7165424199a473265eda5d35f2399e8816e92d (patch)
treec55a57f21f540c45b93f60543bca8bbb24b9bc3a
parent29a837b1126c701191affceb092afbb8de5d5ffc (diff)
downloadmailutils-db7165424199a473265eda5d35f2399e8816e92d.tar.gz
mailutils-db7165424199a473265eda5d35f2399e8816e92d.tar.bz2
Improve folder handling and expansion in mail. Add convenience functions to the library.
* configure.ac: Build libmailutils/wicket * libmailutils/Makefile.am: Likewise. * libmailutils/base/wicket.c: Move file wicket stuff to ... * libmailutils/wicket/file.c: ... here * libmailutils/wicket/noauth.c: New file. * libmailutils/wicket/Makefile.am: New file. * include/mailutils/auth.h (mu_noauth_ticket_create) (mu_noauth_wicket_create): New protos. * include/mailutils/folder.h (mu_folder_attach_ticket) (mu_folder_is_local): New protos. * include/mailutils/mailbox.h (mu_mailbox_attach_ticket): New proto. * include/mailutils/sys/folder.h (_mu_folder): Remove flags. Add new member: is_local. * libmailutils/mailbox/folder.c (mu_folder_create_from_record): Set is_local. (mu_folder_attach_ticket): New function. (mu_folder_is_local): New function. * libmailutils/mailbox/mbx_default.c (mu_mailbox_attach_ticket): New function. * libmailutils/url/create.c: Allow for trailing / in url. * libproto/imap/mbox.c (_imap_mbx_open): Do initial scan. (__imap_msg_get_stream): Initialize clos.size. * libproto/imap/tests/imapfolder.c: Attach ticket to the folder. * mail/cd.c (mail_cd): Expand directory name (~, %, + notations) prior to use. * mail/file.c (mail_file): Attach ticket to the mailbox. * mail/copy.c (append_to_mailbox): Likewise. * mail/mailline.c: Rewrite directory expansion. Implement fully functional folder expansion. * mail/util.c (util_folder_path) (util_outfolder_name): Rewrite using mu_mailbox_expand_name.
-rw-r--r--configure.ac1
-rw-r--r--include/mailutils/auth.h3
-rw-r--r--include/mailutils/folder.h3
-rw-r--r--include/mailutils/mailbox.h2
-rw-r--r--include/mailutils/sys/folder.h5
-rw-r--r--libmailutils/Makefile.am5
-rw-r--r--libmailutils/base/wicket.c253
-rw-r--r--libmailutils/mailbox/folder.c49
-rw-r--r--libmailutils/mailbox/mbx_default.c43
-rw-r--r--libmailutils/url/create.c11
-rw-r--r--libmailutils/wicket/Makefile.am28
-rw-r--r--libmailutils/wicket/file.c266
-rw-r--r--libmailutils/wicket/noauth.c65
-rw-r--r--libproto/imap/mbox.c7
-rw-r--r--libproto/imap/tests/imapfolder.c1
-rw-r--r--mail/cd.c15
-rw-r--r--mail/copy.c1
-rw-r--r--mail/file.c24
-rw-r--r--mail/mailline.c353
-rw-r--r--mail/mailvar.c2
-rw-r--r--mail/util.c133
21 files changed, 771 insertions, 499 deletions
diff --git a/configure.ac b/configure.ac
index 8f440076a..0ef4a235d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1520,6 +1520,7 @@ AC_CONFIG_FILES([
1520 libmailutils/stream/Makefile 1520 libmailutils/stream/Makefile
1521 libmailutils/stdstream/Makefile 1521 libmailutils/stdstream/Makefile
1522 libmailutils/url/Makefile 1522 libmailutils/url/Makefile
1523 libmailutils/wicket/Makefile
1523 libmailutils/Makefile 1524 libmailutils/Makefile
1524 messages/Makefile 1525 messages/Makefile
1525 mh/Makefile 1526 mh/Makefile
diff --git a/include/mailutils/auth.h b/include/mailutils/auth.h
index b4a650ed8..73fa98e54 100644
--- a/include/mailutils/auth.h
+++ b/include/mailutils/auth.h
@@ -74,6 +74,9 @@ void *mu_wicket_get_data (mu_wicket_t wicket);
74int mu_wicket_set_get_ticket (mu_wicket_t wicket, 74int mu_wicket_set_get_ticket (mu_wicket_t wicket,
75 int (*_get_ticket) (mu_wicket_t, void *, 75 int (*_get_ticket) (mu_wicket_t, void *,
76 const char *, mu_ticket_t *)); 76 const char *, mu_ticket_t *));
77
78int mu_noauth_ticket_create (mu_ticket_t *pticket);
79int mu_noauth_wicket_create (mu_wicket_t *pwicket);
77int mu_file_wicket_create (mu_wicket_t *pwicket, const char *filename); 80int mu_file_wicket_create (mu_wicket_t *pwicket, const char *filename);
78 81
79struct mu_debug_locus; 82struct mu_debug_locus;
diff --git a/include/mailutils/folder.h b/include/mailutils/folder.h
index 2d71a0e11..12327987d 100644
--- a/include/mailutils/folder.h
+++ b/include/mailutils/folder.h
@@ -60,6 +60,9 @@ extern int mu_folder_enumerate (mu_folder_t, const char *,
60extern int mu_folder_lsub (mu_folder_t, const char *, const char *, 60extern int mu_folder_lsub (mu_folder_t, const char *, const char *,
61 mu_list_t *); 61 mu_list_t *);
62 62
63extern int mu_folder_attach_ticket (mu_folder_t folder);
64extern int mu_folder_is_local (mu_folder_t folder);
65
63 /* Match function */ 66 /* Match function */
64extern int mu_folder_set_match (mu_folder_t folder, mu_folder_match_fp pmatch); 67extern int mu_folder_set_match (mu_folder_t folder, mu_folder_match_fp pmatch);
65extern int mu_folder_get_match (mu_folder_t folder, 68extern int mu_folder_get_match (mu_folder_t folder,
diff --git a/include/mailutils/mailbox.h b/include/mailutils/mailbox.h
index 5c5f4c628..e54ae88f0 100644
--- a/include/mailutils/mailbox.h
+++ b/include/mailutils/mailbox.h
@@ -72,6 +72,8 @@ extern int mu_mailbox_expunge (mu_mailbox_t);
72extern int mu_mailbox_sync (mu_mailbox_t); 72extern int mu_mailbox_sync (mu_mailbox_t);
73extern int mu_mailbox_save_attributes (mu_mailbox_t) MU_DEPRECATED; 73extern int mu_mailbox_save_attributes (mu_mailbox_t) MU_DEPRECATED;
74 74
75extern int mu_mailbox_attach_ticket (mu_mailbox_t mbox);
76
75#define MU_UIDL_LENGTH 70 77#define MU_UIDL_LENGTH 70
76#define MU_UIDL_BUFFER_SIZE (MU_UIDL_LENGTH+1) 78#define MU_UIDL_BUFFER_SIZE (MU_UIDL_LENGTH+1)
77 79
diff --git a/include/mailutils/sys/folder.h b/include/mailutils/sys/folder.h
index c32835e66..050a18f97 100644
--- a/include/mailutils/sys/folder.h
+++ b/include/mailutils/sys/folder.h
@@ -28,9 +28,6 @@
28extern "C" { 28extern "C" {
29# endif 29# endif
30 30
31# define MU_FOLDER_LIST 0
32# define MU_FOLDER_ENUM 1
33
34struct _mu_folder 31struct _mu_folder
35{ 32{
36 /* Data */ 33 /* Data */
@@ -39,7 +36,7 @@ struct _mu_folder
39 mu_property_t property; 36 mu_property_t property;
40 mu_monitor_t monitor; 37 mu_monitor_t monitor;
41 mu_url_t url; 38 mu_url_t url;
42 int flags; 39 int is_local;
43 int ref; 40 int ref;
44 size_t uid; 41 size_t uid;
45 42
diff --git a/libmailutils/Makefile.am b/libmailutils/Makefile.am
index c940d9cc2..55b623892 100644
--- a/libmailutils/Makefile.am
+++ b/libmailutils/Makefile.am
@@ -18,7 +18,7 @@
18SUBDIRS = \ 18SUBDIRS = \
19 auth base address list sockaddr cidr cfg cli diag\ 19 auth base address list sockaddr cidr cfg cli diag\
20 filter locus mailbox mailer mime msgset opt server string stream stdstream\ 20 filter locus mailbox mailer mime msgset opt server string stream stdstream\
21 property url imapio datetime . tests 21 property url imapio datetime wicket . tests
22 22
23lib_LTLIBRARIES = libmailutils.la 23lib_LTLIBRARIES = libmailutils.la
24 24
@@ -49,7 +49,8 @@ libmailutils_la_LIBADD = \
49 string/libstring.la\ 49 string/libstring.la\
50 stream/libstream.la\ 50 stream/libstream.la\
51 stdstream/libstdstream.la\ 51 stdstream/libstdstream.la\
52 url/liburl.la 52 url/liburl.la\
53 wicket/libwicket.la
53 54
54libmailutils_la_LDFLAGS = -version-info @VI_CURRENT@:@VI_REVISION@:@VI_AGE@ 55libmailutils_la_LDFLAGS = -version-info @VI_CURRENT@:@VI_REVISION@:@VI_AGE@
55 56
diff --git a/libmailutils/base/wicket.c b/libmailutils/base/wicket.c
index c60ddff85..22cd2c155 100644
--- a/libmailutils/base/wicket.c
+++ b/libmailutils/base/wicket.c
@@ -19,24 +19,9 @@
19# include <config.h> 19# include <config.h>
20#endif 20#endif
21 21
22#include <errno.h>
23#include <sys/types.h>
24#include <sys/stat.h>
25#include <pwd.h>
26#include <string.h>
27#include <stdlib.h> 22#include <stdlib.h>
28#include <stdio.h>
29#include <unistd.h>
30#include <ctype.h>
31 23
32#include <mailutils/errno.h> 24#include <mailutils/errno.h>
33#include <mailutils/util.h>
34#include <mailutils/mu_auth.h>
35#include <mailutils/stream.h>
36#include <mailutils/cstr.h>
37#include <mailutils/nls.h>
38#include <mailutils/errno.h>
39
40#include <mailutils/sys/auth.h> 25#include <mailutils/sys/auth.h>
41#include <mailutils/sys/url.h> 26#include <mailutils/sys/url.h>
42 27
@@ -135,241 +120,3 @@ mu_wicket_set_get_ticket (mu_wicket_t wicket,
135 return 0; 120 return 0;
136} 121}
137 122
138
139/* A "file wicket" implementation */
140
141struct file_wicket
142{
143 char *filename;
144};
145
146static void
147_file_wicket_destroy (mu_wicket_t wicket)
148{
149 struct file_wicket *fw = mu_wicket_get_data (wicket);
150 free (fw->filename);
151 free (fw);
152}
153
154struct file_ticket
155{
156 char *filename;
157 char *user;
158 mu_url_t tickurl;
159};
160
161static void
162file_ticket_destroy (mu_ticket_t ticket)
163{
164 struct file_ticket *ft = mu_ticket_get_data (ticket);
165 if (ft)
166 {
167 free (ft->filename);
168 free (ft->user);
169 mu_url_destroy (&ft->tickurl);
170 free (ft);
171 }
172}
173
174int
175file_ticket_get_cred (mu_ticket_t ticket, mu_url_t url, const char *challenge,
176 char **pplain, mu_secret_t *psec)
177{
178 struct file_ticket *ft = mu_ticket_get_data (ticket);
179 int rc = 0;
180
181 if (!ft->tickurl)
182 {
183 rc = mu_wicket_file_match_url (ft->filename, url,
184 MU_URL_PARSE_ALL,
185 &ft->tickurl);
186 if (rc)