diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-01-21 07:17:56 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-01-21 10:31:37 +0200 |
commit | db7165424199a473265eda5d35f2399e8816e92d (patch) | |
tree | c55a57f21f540c45b93f60543bca8bbb24b9bc3a | |
parent | 29a837b1126c701191affceb092afbb8de5d5ffc (diff) | |
download | mailutils-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.ac | 1 | ||||
-rw-r--r-- | include/mailutils/auth.h | 3 | ||||
-rw-r--r-- | include/mailutils/folder.h | 3 | ||||
-rw-r--r-- | include/mailutils/mailbox.h | 2 | ||||
-rw-r--r-- | include/mailutils/sys/folder.h | 5 | ||||
-rw-r--r-- | libmailutils/Makefile.am | 5 | ||||
-rw-r--r-- | libmailutils/base/wicket.c | 253 | ||||
-rw-r--r-- | libmailutils/mailbox/folder.c | 49 | ||||
-rw-r--r-- | libmailutils/mailbox/mbx_default.c | 43 | ||||
-rw-r--r-- | libmailutils/url/create.c | 11 | ||||
-rw-r--r-- | libmailutils/wicket/Makefile.am | 28 | ||||
-rw-r--r-- | libmailutils/wicket/file.c | 266 | ||||
-rw-r--r-- | libmailutils/wicket/noauth.c | 65 | ||||
-rw-r--r-- | libproto/imap/mbox.c | 7 | ||||
-rw-r--r-- | libproto/imap/tests/imapfolder.c | 1 | ||||
-rw-r--r-- | mail/cd.c | 15 | ||||
-rw-r--r-- | mail/copy.c | 1 | ||||
-rw-r--r-- | mail/file.c | 24 | ||||
-rw-r--r-- | mail/mailline.c | 353 | ||||
-rw-r--r-- | mail/mailvar.c | 2 | ||||
-rw-r--r-- | mail/util.c | 133 |
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([ libmailutils/stream/Makefile libmailutils/stdstream/Makefile libmailutils/url/Makefile + libmailutils/wicket/Makefile libmailutils/Makefile messages/Makefile 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); int mu_wicket_set_get_ticket (mu_wicket_t wicket, int (*_get_ticket) (mu_wicket_t, void *, const char *, mu_ticket_t *)); + +int mu_noauth_ticket_create (mu_ticket_t *pticket); +int mu_noauth_wicket_create (mu_wicket_t *pwicket); int mu_file_wicket_create (mu_wicket_t *pwicket, const char *filename); struct 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 *, extern int mu_folder_lsub (mu_folder_t, const char *, const char *, mu_list_t *); +extern int mu_folder_attach_ticket (mu_folder_t folder); +extern int mu_folder_is_local (mu_folder_t folder); + /* Match function */ extern int mu_folder_set_match (mu_folder_t folder, mu_folder_match_fp pmatch); extern 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); extern int mu_mailbox_sync (mu_mailbox_t); extern int mu_mailbox_save_attributes (mu_mailbox_t) MU_DEPRECATED; +extern int mu_mailbox_attach_ticket (mu_mailbox_t mbox); + #define MU_UIDL_LENGTH 70 #define MU_UIDL_BUFFER_SIZE (MU_UIDL_LENGTH+1) 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 @@ extern "C" { # endif -# define MU_FOLDER_LIST 0 -# define MU_FOLDER_ENUM 1 - struct _mu_folder { /* Data */ @@ -39,7 +36,7 @@ struct _mu_folder mu_property_t property; mu_monitor_t monitor; mu_url_t url; - int flags; + int is_local; int ref; size_t uid; 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 @@ SUBDIRS = \ auth base address list sockaddr cidr cfg cli diag\ filter locus mailbox mailer mime msgset opt server string stream stdstream\ - property url imapio datetime . tests + property url imapio datetime wicket . tests lib_LTLIBRARIES = libmailutils.la @@ -49,7 +49,8 @@ libmailutils_la_LIBADD = \ string/libstring.la\ stream/libstream.la\ stdstream/libstdstream.la\ - url/liburl.la + url/liburl.la\ + wicket/libwicket.la libmailutils_la_LDFLAGS = -version-info @VI_CURRENT@:@VI_REVISION@:@VI_AGE@ 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 @@ # include <config.h> #endif -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <pwd.h> -#include <string.h> #include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <ctype.h> #include <mailutils/errno.h> -#include <mailutils/util.h> -#include <mailutils/mu_auth.h> -#include <mailutils/stream.h> -#include <mailutils/cstr.h> -#include <mailutils/nls.h> -#include <mailutils/errno.h> - #include <mailutils/sys/auth.h> #include <mailutils/sys/url.h> @@ -135,241 +120,3 @@ mu_wicket_set_get_ticket (mu_wicket_t wicket, return 0; } - -/* A "file wicket" implementation */ - -struct file_wicket -{ - char *filename; -}; - -static void -_file_wicket_destroy (mu_wicket_t wicket) -{ - struct file_wicket *fw = mu_wicket_get_data (wicket); - free (fw->filename); - free (fw); -} - -struct file_ticket -{ - char *filename; - char *user; - mu_url_t tickurl; -}; - -static void -file_ticket_destroy (mu_ticket_t ticket) -{ - struct file_ticket *ft = mu_ticket_get_data (ticket); - if (ft) - { - free (ft->filename); - free (ft->user); - mu_url_destroy (&ft->tickurl); - free (ft); - } -} - -int -file_ticket_get_cred (mu_ticket_t ticket, mu_url_t url, const char *challenge, - char **pplain, mu_secret_t *psec) -{ - struct file_ticket *ft = mu_ticket_get_data (ticket); - int rc = 0; - - if (!ft->tickurl) - { - rc = mu_wicket_file_match_url (ft->filename, url, - MU_URL_PARSE_ALL, - &ft->tickurl); - if (rc) - return rc; - } - if (pplain) - { - if (ft->user) - { - *pplain = strdup (ft->user); - if (!*pplain) - rc = ENOMEM; - } - else - rc = mu_url_aget_user (ft->tickurl, pplain); - } - else - rc = mu_url_get_secret (ft->tickurl, psec); - return rc; -} - -static int -_file_wicket_get_ticket (mu_wicket_t wicket, void *data, - const char *user, mu_ticket_t *pticket) -{ - int rc; - mu_ticket_t ticket; - struct file_wicket *fw = data; - struct file_ticket *ft = calloc (1, sizeof (*ft)); - ft->filename = strdup (fw->filename); - if (!ft->filename) - { - free (ft); - return ENOMEM; - } - if (user) - { - ft->user = strdup (user); - if (!ft->user) - { - free (ft->filename); - free (ft); - return ENOMEM; - } - } - else - ft->user = NULL; - - rc = mu_ticket_create (&ticket, NULL); - if (rc) - { - free (ft->filename); - free (ft->user); - free (ft); - return rc; - } - - mu_ticket_set_destroy (ticket, file_ticket_destroy, NULL); - mu_ticket_set_data (ticket, ft, NULL); - mu_ticket_set_get_cred (ticket, file_ticket_get_cred, NULL); - - *pticket = ticket; - return 0; -} - -int -mu_wicket_stream_match_url (mu_stream_t stream, struct mu_locus_point *loc, - mu_url_t url, int parse_flags, - mu_url_t *pticket_url) -{ - int rc; - mu_url_t u = NULL; - char *buf = NULL; - size_t bufsize = 0; - size_t len; - mu_url_t pret = NULL; - int weight = 0; - int line = loc->mu_line; - - while ((rc = mu_stream_getline (stream, &buf, &bufsize, &len)) == 0 - && len > 0) - { - char *p; - int err; - int n; - - loc->mu_line++; - p = mu_str_stripws (buf); - - /* Skip empty lines and comments. */ - if (*p == 0 || *p == '#') - continue; - - if ((err = mu_url_create_hint (&u, p, parse_flags, NULL)) != 0) - { - /* Skip erroneous entry */ - mu_error (_("%s:%u: cannot create URL: %s"), - loc->mu_file, loc->mu_line, mu_strerror (err)); - continue; - } - - if (!mu_url_has_flag (u, MU_URL_USER|MU_URL_SECRET)) - { - mu_error (_("%s:%u: URL is missing required parts"), - loc->mu_file, loc->mu_line); - mu_url_destroy (&u); - continue; - } - - if (!mu_url_matches_ticket (u, url, &n)) - { - mu_url_destroy (&u); - continue; - } - - if (!pret || n < weight) - { - pret = u; - weight = n; - line = loc->mu_line; - if (weight == 0) - break; - } - } - free (buf); - - if (rc == 0) - { - if (pret) - { - *pticket_url = pret; - loc->mu_line = line; - } - else - rc = MU_ERR_NOENT; - } - - return rc; -} - -int -mu_wicket_file_match_url (const char *name, mu_url_t url, - int parse_flags, - mu_url_t *pticket_url) -{ - mu_stream_t stream; - int rc; - struct mu_locus_point loc; - - rc = mu_file_stream_create (&stream, name, MU_STREAM_READ); - if (rc) - return rc; - loc.mu_file = (char*) name; - loc.mu_line = 0; - loc.mu_col = 0; - rc = mu_wicket_stream_match_url (stream, &loc, url, parse_flags, - pticket_url); - mu_stream_close (stream); - mu_stream_destroy (&stream); - return rc; -} - -int -mu_file_wicket_create (mu_wicket_t *pwicket, const char *filename) -{ - mu_wicket_t wicket; - int rc; - struct file_wicket *fw = calloc (1, sizeof (*fw)); - - if (!fw) - return ENOMEM; - fw->filename = strdup (filename); - if (!fw->filename) - { - free (fw); - return ENOMEM; - } - - rc = mu_wicket_create (&wicket); - if (rc) - { - free (fw->filename); - free (fw); - return rc; - } - mu_wicket_set_data (wicket, fw); - mu_wicket_set_destroy (wicket, _file_wicket_destroy); - mu_wicket_set_get_ticket (wicket, _file_wicket_get_ticket); - *pwicket = wicket; - return 0; -} - diff --git a/libmailutils/mailbox/folder.c b/libmailutils/mailbox/folder.c index 64f997d3f..67735448a 100644 --- a/libmailutils/mailbox/folder.c +++ b/libmailutils/mailbox/folder.c @@ -36,7 +36,7 @@ #include <mailutils/property.h> #include <mailutils/mailbox.h> #include <mailutils/imaputil.h> - +#include <mailutils/util.h> #include <mailutils/sys/folder.h> /* Internal folder list. */ @@ -121,6 +121,7 @@ mu_folder_create_from_record (mu_folder_t *pfolder, mu_url_t url, if (folder != NULL) { folder->url = url; + folder->is_local = record->flags & MU_RECORD_LOCAL; /* Initialize the internal foilder lock, now so the concrete folder could use it. */ status = mu_monitor_create (&folder->monitor, 0, folder); @@ -170,6 +171,52 @@ mu_folder_create (mu_folder_t *pfolder, const char *name) return rc; } +int +mu_folder_attach_ticket (mu_folder_t folder) +{ + mu_authority_t auth = NULL; + int rc = MU_ERR_NOENT; + + if (mu_folder_get_authority (folder, &auth) == 0 && auth) + { + char *filename = mu_tilde_expansion (mu_ticket_file, + MU_HIERARCHY_DELIMITER, NULL); + mu_wicket_t wicket; + + mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_TRACE1, + ("Reading user ticket file %s", filename)); + if ((rc = mu_file_wicket_create (&wicket, filename)) == 0) + { + mu_ticket_t ticket; + + if ((rc = mu_wicket_get_ticket (wicket, NULL, &ticket)) == 0) + { + rc = mu_authority_set_ticket (auth, ticket); + mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_TRACE1, + ("Retrieved and set ticket: %d", rc)); + } + else + mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_ERROR, + ("Error retrieving ticket: %s\n", + mu_strerror (rc))); + mu_wicket_destroy (&wicket); + } + else + mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_ERROR, + ("Error creating wicket: %s\n", mu_strerror (rc))); + free (filename); + } + return rc; +} + +int +mu_folder_is_local (mu_folder_t folder) +{ + if (!folder) + return -1; + return folder->is_local; +} + /* The folder is destroy if it is the last reference. */ void mu_folder_destroy (mu_folder_t *pfolder) diff --git a/libmailutils/mailbox/mbx_default.c b/libmailutils/mailbox/mbx_default.c index 29890bfa8..bd9f8763d 100644 --- a/libmailutils/mailbox/mbx_default.c +++ b/libmailutils/mailbox/mbx_default.c @@ -344,44 +344,15 @@ percent_expand (const char *file, char **mbox) return status; } -static void -attach_auth_ticket (mu_mailbox_t mbox) +int +mu_mailbox_attach_ticket (mu_mailbox_t mbox) { + int rc; mu_folder_t folder = NULL; - mu_authority_t auth = NULL; - if (mu_mailbox_get_folder (mbox, &folder) == 0 - && mu_folder_get_authority (folder, &auth) == 0 - && auth) - { - char *filename = mu_tilde_expansion (mu_ticket_file, - MU_HIERARCHY_DELIMITER, NULL); - mu_wicket_t wicket; - int rc; - - mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_TRACE1, - ("Reading user ticket file %s", filename)); - if ((rc = mu_file_wicket_create (&wicket, filename)) == 0) - { - mu_ticket_t ticket; - - if ((rc = mu_wicket_get_ticket (wicket, NULL, &ticket)) == 0) - { - rc = mu_authority_set_ticket (auth, ticket); - mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_TRACE1, - ("Retrieved and set ticket: %d", rc)); - } - else - mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_ERROR, - ("Error retrieving ticket: %s\n", - mu_strerror (rc))); - mu_wicket_destroy (&wicket); - } - else - mu_debug (MU_DEBCAT_MAILBOX, MU_DEBUG_ERROR, - ("Error creating wicket: %s\n", mu_strerror (rc))); - free (filename); - } + if ((rc = mu_mailbox_get_folder (mbox, &folder)) == 0) + rc = mu_folder_attach_ticket (folder); + return rc; } /* Expand mailbox name according to the following rules: @@ -490,7 +461,7 @@ mu_mailbox_create_default (mu_mailbox_t *pmbox, const char *mail) status = mu_mailbox_create (pmbox, mboxname); free (mboxname); if (status == 0) - attach_auth_ticket (*pmbox); + mu_mailbox_attach_ticket (*pmbox); return status; } diff --git a/libmailutils/url/create.c b/libmailutils/url/create.c index 124be32e0..3b19a4f2c 100644 --- a/libmailutils/url/create.c +++ b/libmailutils/url/create.c @@ -269,7 +269,16 @@ _mu_url_ctx_parse_host (struct mu_url_ctx *ctx, int has_host) if (*ctx->cur == '/') { if (has_host) - ctx->cur++; + { + ctx->cur++; + if (*ctx->cur == 0) + { + rc = str_assign (&url->path, ""); + if (rc == 0) + url->flags |= MU_URL_PATH; + return rc; + } + } return _mu_url_ctx_parse_path (ctx); } diff --git a/libmailutils/wicket/Makefile.am b/libmailutils/wicket/Makefile.am new file mode 100644 index 000000000..b7f352879 --- /dev/null +++ b/libmailutils/wicket/Makefile.am @@ -0,0 +1,28 @@ +# GNU Mailutils -- a suite of utilities for electronic mail +# Copyright (C) 2010-2019 Free Software Foundation, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General +# Public License along with this library. If not, see +# <http://www.gnu.org/licenses/>. + +noinst_LTLIBRARIES = libwicket.la +libwicket_la_SOURCES = \ + file.c\ + noauth.c + +localedir = $(datadir)/locale +AM_CPPFLAGS = \ + @MU_LIB_COMMON_INCLUDES@ -I/libmailutils\ + -DSYSCONFDIR=\"$(sysconfdir)\"\ + -DSITE_VIRTUAL_PWDDIR=\"@SITE_VIRTUAL_PWDDIR@\"\ + -DLOCALEDIR=\"$(localedir)\" diff --git a/libmailutils/wicket/file.c b/libmailutils/wicket/file.c new file mode 100644 index 000000000..73e7e6520 --- /dev/null +++ b/libmailutils/wicket/file.c @@ -0,0 +1,266 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 1999-2019 Free Software Foundation, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library. If not, see + <http://www.gnu.org/licenses/>. */ + +/* A "file wicket" implementation */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdlib.h> +#include <mailutils/errno.h> +#include <mailutils/error.h> +#include <mailutils/auth.h> +#include <mailutils/url.h> +#include <mailutils/stream.h> +#include <mailutils/cstr.h> +#include <mailutils/nls.h> + +struct file_wicket +{ + char *filename; +}; + +static void +_file_wicket_destroy (mu_wicket_t wicket) +{ + struct file_wicket *fw = mu_wicket_get_data (wicket); + free (fw->filename); + free (fw); +} + +struct file_ticket +{ + char *filename; + char *user; + mu_url_t tickurl; +}; + +static void +file_ticket_destroy (mu_ticket_t ticket) +{ + struct file_ticket *ft = mu_ticket_get_data (ticket); + if (ft) + { + free (ft->filename); + free (ft->user); + mu_url_destroy (&ft->tickurl); + free (ft); + } +} + +int +file_ticket_get_cred (mu_ticket_t ticket, mu_url_t url, const char *challenge, + char **pplain, mu_secret_t *psec) +{ + struct file_ticket *ft = mu_ticket_get_data (ticket); + int rc = 0; + + if (!ft->tickurl) + { + rc = mu_wicket_file_match_url (ft->filename, url, + MU_URL_PARSE_ALL, + &ft->tickurl); + if (rc) + return rc; + } + if (pplain) + { + if (ft->user) + { + *pplain = strdup (ft->user); + if (!*pplain) + rc = ENOMEM; + } + else + rc = mu_url_aget_user (ft->tickurl, pplain); + } + else + rc = mu_url_get_secret (ft->tickurl, psec); + return rc; +} + +static int +_file_wicket_get_ticket (mu_wicket_t wicket, void *data, + const char *user, mu_ticket_t *pticket) +{ + int rc; + mu_ticket_t ticket; + struct file_wicket *fw = data; + struct file_ticket *ft = calloc (1, sizeof (*ft)); + ft->filename = strdup (fw->filename); + if (!ft->filename) + { + free (ft); + return ENOMEM; + } + if (user) + { + ft->user = strdup (user); + if (!ft->user) + { + free (ft->filename); + free (ft); + return ENOMEM; + } + } + else + ft->user = NULL; + + rc = mu_ticket_create (&ticket, NULL); + if (rc) + { + free (ft->filename); + free (ft->user); + free (ft); + return rc; + } + + mu_ticket_set_destroy (ticket, file_ticket_destroy, NULL); + mu_ticket_set_data (ticket, ft, NULL); + mu_ticket_set_get_cred (ticket, file_ticket_get_cred, NULL); + + *pticket = ticket; + return 0; +} + +int +mu_wicket_stream_match_url (mu_stream_t stream, struct mu_locus_point *loc, + mu_url_t url, int parse_flags, + mu_url_t *pticket_url) +{ + int rc; + mu_url_t u = NULL; + char *buf = NULL; + size_t bufsize = 0; + size_t len; + mu_url_t pret = NULL; + int weight = 0; + int line = loc->mu_line; + + while ((rc = mu_stream_getline (stream, &buf, &bufsize, &len)) == 0 + && len > 0) + { + char *p; + int err; + int n; + + loc->mu_line++; + p = mu_str_stripws (buf); + + /* Skip empty lines and comments. */ + if (*p == 0 || *p == '#') + continue; + + if ((err = mu_url_create_hint (&u, p, parse_flags, NULL)) != 0) + { + /* Skip erroneous entry */ + mu_error (_("%s:%u: cannot create URL: %s"), + loc->mu_file, loc->mu_line, mu_strerror (err)); + continue; + } + + if (!mu_url_has_flag (u, MU_URL_USER|MU_URL_SECRET)) + { + mu_error (_("%s:%u: URL is missing required parts"), + loc->mu_file, loc->mu_line); + mu_url_destroy (&u); + continue; + } + + if (!mu_url_matches_ticket (u, url, &n)) + { + mu_url_destroy (&u); + continue; + } + + if (!pret || n < weight) + { + pret = u; + weight = n; + line = loc->mu_line; + if (weight == 0) + break; + } + } + free (buf); + + if (rc == 0) + { + if (pret) + { + *pticket_url = pret; + loc->mu_line = line; + } + else + rc = MU_ERR_NOENT; + } + + return rc; +} + +int +mu_wicket_file_match_url (const char *name, mu_url_t url, + int parse_flags, + mu_url_t *pticket_url) +{ + mu_stream_t stream; + int rc; + struct mu_locus_point loc; + + rc = mu_file_stream_create (&stream, name, MU_STREAM_READ); + if (rc) + return rc; + loc.mu_file = (char*) name; + loc.mu_line = 0; + loc.mu_col = 0; + rc = mu_wicket_stream_match_url (stream, &loc, url, parse_flags, + pticket_url); + mu_stream_close (stream); + mu_stream_destroy (&stream); + return rc; +} + +int +mu_file_wicket_create (mu_wicket_t *pwicket, const char *filename) +{ + mu_wicket_t wicket; + int rc; + struct file_wicket *fw = calloc (1, sizeof (*fw)); + + if (!fw) + return ENOMEM; + fw->filename = strdup (filename); + if (!fw->filename) + { + free (fw); + return ENOMEM; + } + + rc = mu_wicket_create (&wicket); + if (rc) + { + free (fw->filename); + free (fw); + return rc; + } + mu_wicket_set_data (wicket, fw); + mu_wicket_set_destroy (wicket, _file_wicket_destroy); + mu_wicket_set_get_ticket (wicket, _file_wicket_get_ticket); + *pwicket = wicket; + return 0; +} diff --git a/libmailutils/wicket/noauth.c b/libmailutils/wicket/noauth.c new file mode 100644 index 000000000..2a4da1080 --- /dev/null +++ b/libmailutils/wicket/noauth.c @@ -0,0 +1,65 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 1999-2019 Free Software Foundation, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library. If not, see + <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdlib.h> +#include <mailutils/errno.h> +#include <mailutils/auth.h> + +static int +noauth_ticket_get_cred (mu_ticket_t ticket, mu_url_t url, const char *challenge, + char **pplain, mu_secret_t *psec) +{ + return MU_ERR_AUTH_FAILURE; +} + +int +mu_noauth_ticket_create (mu_ticket_t *pticket) +{ + mu_ticket_t ticket; + int rc; + + rc = mu_ticket_create (&ticket, NULL); + if (rc) + return rc; + mu_ticket_set_get_cred (ticket, noauth_ticket_get_cred, NULL); + *pticket = ticket; + return 0; +} + +static int +noauth_get_ticket (mu_wicket_t wicket, void *data, + const char *user, mu_ticket_t *pticket) +{ + return mu_noauth_ticket_create (pticket); +} + +int +mu_noauth_wicket_create (mu_wicket_t *pwicket) +{ + mu_wicket_t wicket; + int rc; + + rc = mu_wicket_create (&wicket); + if (rc) + return rc; + mu_wicket_set_get_ticket (wicket, noauth_get_ticket); + return 0; +} diff --git a/libproto/imap/mbox.c b/libproto/imap/mbox.c index 1442e6254..fde568a69 100644 --- a/libproto/imap/mbox.c +++ b/libproto/imap/mbox.c @@ -183,7 +183,8 @@ __imap_msg_get_stream (struct _mu_imap_message *imsg, size_t msgno, clos.imsg = imsg; clos.save_stream = imbx->cache; - + clos.size = 0; + rc = mu_msgset_add_range (msgset, msgno, msgno, MU_MSGSET_NUM); if (rc == 0) { @@ -757,7 +758,9 @@ _imap_mbx_open (mu_mailbox_t mbox, int flags) if (imbx->stats.flags & MU_IMAP_STAT_MESSAGE_COUNT) rc = _imap_realloc_messages (imbx, imbx->stats.message_count); - + + _imap_mbx_scan (mbox, 1, NULL); + return rc; } diff --git a/libproto/imap/tests/imapfolder.c b/libproto/imap/tests/imapfolder.c index 6f91b6349..8d3f6ce44 100644 --- a/libproto/imap/tests/imapfolder.c +++ b/libproto/imap/tests/imapfolder.c @@ -202,6 +202,7 @@ main (int argc, char **argv) mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_create", fname, rc); return 1; } + mu_folder_attach_ticket (folder); rc = mu_folder_open (folder, MU_STREAM_READ); if (rc) @@ -24,7 +24,8 @@ int mail_cd (int argc, char **argv) { - char *dir; + char *dir, *edir; + int rc; if (argc > 2) return 1; @@ -33,10 +34,16 @@ mail_cd (int argc, char **argv) else dir = getenv ("HOME"); - if (chdir (dir)) + rc = mu_mailbox_expand_name (dir, &edir); + if (rc) { - mu_diag_funcall (MU_DIAG_ERROR, "chdir", dir, errno); + mu_diag_funcall (MU_DIAG_ERROR, "mu_mailbox_expand_name", dir, rc); return 1; } - return 0; + + rc = chdir (edir); + if (rc) + mu_diag_funcall (MU_DIAG_ERROR, "chdir", edir, errno); + free (edir); + return rc; } diff --git a/mail/copy.c b/mail/copy.c index 476b441bc..15deebe6f 100644 --- a/mail/copy.c +++ b/mail/c |