Projects
Kolab:16:TestingLinked
cyrus-imapd-3
0004-Autocreate-on-PROPFIND.patch
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0004-Autocreate-on-PROPFIND.patch of Package cyrus-imapd-3 (Revision 1)
Currently displaying revision
1
,
Show latest
From 589ff4d046586ea313dea026ca58de52ec504755 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf <mollekopf@apheleia-it.ch> Date: Mon, 24 Oct 2022 21:37:34 +0200 Subject: [PATCH 4/4] Autocreate on PROPFIND If we don't have existing calendar folders then dav_parse_req_target fails, because it looks for the base calendar via mupdate. The new codepath simply attempts to lookup the inbox instead and then proxies the request to that backend, triggering the autocreate. This requires that the inbox has been created before though. --- imap/http_dav.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/imap/http_dav.c b/imap/http_dav.c index 7c13d783b..2aac8d5bb 100644 --- a/imap/http_dav.c +++ b/imap/http_dav.c @@ -484,6 +484,28 @@ static unsigned long principal_allow_cb(struct request_target_t *tgt) return tgt->namespace->allow; } +static struct backend *proxy_findinboxserver(const char *userid) +{ + mbentry_t *mbentry = NULL; + struct backend *s = NULL; + + char *inbox = mboxname_user_mbox(userid, NULL); + int r = mboxlist_lookup(inbox, &mbentry, NULL); + free(inbox); + + if (r) return NULL; + + if (mbentry->mbtype & MBTYPE_REMOTE) { + s = proxy_findserver(mbentry->server, &http_protocol, + httpd_userid, &backend_cached, + NULL, NULL, httpd_in); + } + + mboxlist_entry_free(&mbentry); + + return s; +} + /* Parse request-target path in DAV principals namespace */ static int principal_parse_path(const char *path, struct request_target_t *tgt, @@ -6116,7 +6138,18 @@ EXPORTED int meth_propfind(struct transaction_t *txn, void *params) /* Parse the path */ if (fparams->parse_path) { r = dav_parse_req_target(txn, fparams); - if (r) return r; + if (r) { + + struct backend *be; + be = proxy_findinboxserver(txn->req_tgt.userid); + if (!be) { + syslog(LOG_ERR, "Could not find a backend"); + return HTTP_UNAVAILABLE; + } + return http_pipe_req_resp(be, txn); + + return r; + } } /* Make sure method is allowed */ -- 2.37.3
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.