diff options
-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 @@ -1517,12 +1517,13 @@ AC_CONFIG_FILES([ libmailutils/property/Makefile libmailutils/server/Makefile libmailutils/string/Makefile libmailutils/stream/Makefile libmailutils/stdstream/Makefile libmailutils/url/Makefile + libmailutils/wicket/Makefile libmailutils/Makefile messages/Makefile mh/Makefile mh/etc/Makefile mimeview/Makefile movemail/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 @@ -71,12 +71,15 @@ int mu_wicket_set_destroy (mu_wicket_t wicket, void (*_destroy) (mu_wicket_t)); int mu_wicket_set_data (mu_wicket_t wicket, void *data); 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; 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); 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 @@ -57,12 +57,15 @@ extern int mu_folder_enumerate (mu_folder_t, const char *, void *, int, size_t, mu_list_t *, mu_folder_enumerate_fp, void *); 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, mu_folder_match_fp *pmatch); /* Two often used matchers: */ 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 @@ -69,12 +69,14 @@ extern int mu_mailbox_messages_count (mu_mailbox_t, size_t *); extern int mu_mailbox_messages_recent (mu_mailbox_t, size_t *); extern int mu_mailbox_message_unseen (mu_mailbox_t, size_t *); 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) struct mu_uidl { size_t msgno; 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 @@ -25,24 +25,21 @@ # include <mailutils/folder.h> # ifdef __cplusplus extern "C" { # endif -# define MU_FOLDER_LIST 0 -# define MU_FOLDER_ENUM 1 - struct _mu_folder { /* Data */ mu_authority_t authority; mu_observable_t observable; mu_property_t property; mu_monitor_t monitor; mu_url_t url; - int flags; + int is_local; int ref; size_t uid; /* Back pointer to the specific mailbox */ void *data; diff --git a/libmailutils/Makefile.am b/libmailutils/Makefile.am index c940d9cc2..55b623892 100644 --- a/libmailutils/Makefile.am +++ b/libmailutils/Makefile.am @@ -15,13 +15,13 @@ # Public License along with this library. If not, see # <http://www.gnu.org/licenses/>. 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 libmailutils_la_SOURCES = libmailutils_la_LIBADD = \ @@ -46,10 +46,11 @@ libmailutils_la_LIBADD = \ opt/libopt.la\ property/libproperty.la\ server/libserver.la\ 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 @@ -16,30 +16,15 @@ <http://www.gnu.org/licenses/>. */ #ifdef HAVE_CONFIG_H # 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> int mu_wicket_create (mu_wicket_t *pwicket) { @@ -132,244 +117,6 @@ mu_wicket_set_get_ticket (mu_wicket_t wicket, if (!wicket) return EINVAL; wicket->_get_ticket = _get_ticket; 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 @@ -33,13 +33,13 @@ #include <mailutils/registrar.h> #include <mailutils/url.h> #include <mailutils/errno.h> #include <mailutils/property.h> #include <mailutils/mailbox.h> #include <mailutils/imaputil.h> - +#include <mailutils/util.h> #include <mailutils/sys/folder.h> /* Internal folder list. */ static mu_list_t known_folder_list; static int is_known_folder (mu_url_t, mu_folder_t *); @@ -118,12 +118,13 @@ mu_folder_create_from_record (mu_folder_t *pfolder, mu_url_t url, /* Allocate memory for the folder. */ folder = calloc (1, sizeof (*folder)); 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); if (status == 0) { /* Create the concrete folder type. */ @@ -167,12 +168,58 @@ mu_folder_create (mu_folder_t *pfolder, const char *name) rc = mu_folder_create_from_record (pfolder, url, NULL); if (rc) mu_url_destroy (&url); 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) { if (pfolder && *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 @@ -341,50 +341,21 @@ percent_expand (const char *file, char **mbox) status = user_mailbox_name (user, mbox); free (user); 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: NAME Expands to -------------+------------------------------------ @@ -487,10 +458,10 @@ mu_mailbox_create_default (mu_mailbox_t *pmbox, const char *mail) if (status) return status; 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 @@ -266,13 +266,22 @@ _mu_url_ctx_parse_host (struct mu_url_ctx *ctx, int has_host) url->flags |= MU_URL_PORT; } 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); } if (*ctx->cur == ';') return _mu_url_ctx_parse_param (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 @@ -180,13 +180,14 @@ __imap_msg_get_stream (struct _mu_imap_message *imsg, size_t msgno, if (rc == 0) { struct save_closure clos; 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) { _imap_mbx_clrerr (imbx); rc = _imap_fetch_with_callback (imap, msgset, "BODY[]", _save_message_callback, &clos); @@ -754,13 +755,15 @@ _imap_mbx_open (mu_mailbox_t mbox, int flags) &imbx->stats); if (rc) return rc; 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; } static int _imap_mbx_close (mu_mailbox_t mbox) { 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 @@ -199,12 +199,13 @@ main (int argc, char **argv) rc = mu_folder_create (&folder, fname); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_create", fname, rc); return 1; }< |