diff options
author | Werner Koch <[email protected]> | 2017-11-13 15:09:32 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2017-12-11 10:27:22 +0000 |
commit | 6c1dcd79cf0977844179d9a7b189c10af5e42a7e (patch) | |
tree | cdc688ad9e52b57e08e5620b808be9f4f406775a /dirmngr/server.c | |
parent | doc: Typo fix (diff) | |
download | gnupg-6c1dcd79cf0977844179d9a7b189c10af5e42a7e.tar.gz gnupg-6c1dcd79cf0977844179d9a7b189c10af5e42a7e.zip |
dirmngr: Keep track of domains used for WKD queries
* dirmngr/domaininfo.c: New file.
* dirmngr/Makefile.am (dirmngr_SOURCES): Add file.
* dirmngr/server.c (cmd_wkd_get): Check whether the domain is already
known and tell domaininfo about the results.
--
This adds a registry for domain information to eventually avoid
useless queries for domains which do not support WKD. The missing
part is a background task to check whether a queried domain supports
WKD at all and to expire old entries.
Signed-off-by: Werner Koch <[email protected]>
(cherry picked from commit 65038e6852185c20413d8f6602218ee636413b77)
Diffstat (limited to 'dirmngr/server.c')
-rw-r--r-- | dirmngr/server.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/dirmngr/server.c b/dirmngr/server.c index 7ed6cde15..18a5f7206 100644 --- a/dirmngr/server.c +++ b/dirmngr/server.c @@ -18,6 +18,8 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, see <https://www.gnu.org/licenses/>. + * + * SPDX-License-Identifier: GPL-3.0+ */ #include <config.h> @@ -833,11 +835,13 @@ cmd_wkd_get (assuan_context_t ctx, char *line) char *mbox = NULL; char *domainbuf = NULL; char *domain; /* Points to mbox or domainbuf. */ + char *domain_orig;/* Points to mbox. */ char sha1buf[20]; char *uri = NULL; char *encodedhash = NULL; int opt_submission_addr; int opt_policy_flags; + int is_wkd_query; /* True if this is a real WKD query. */ int no_log = 0; char portstr[20] = { 0 }; @@ -846,6 +850,7 @@ cmd_wkd_get (assuan_context_t ctx, char *line) if (has_option (line, "--quick")) ctrl->timeout = opt.connect_quick_timeout; line = skip_options (line); + is_wkd_query = !(opt_policy_flags || opt_submission_addr); mbox = mailbox_from_userid (line); if (!mbox || !(domain = strchr (mbox, '@'))) @@ -854,6 +859,18 @@ cmd_wkd_get (assuan_context_t ctx, char *line) goto leave; } *domain++ = 0; + domain_orig = domain; + + /* First check whether we already know that the domain does not + * support WKD. */ + if (is_wkd_query) + { + if (domaininfo_is_wkd_not_supported (domain_orig)) + { + err = gpg_error (GPG_ERR_NO_DATA); + goto leave; + } + } /* Check for SRV records. */ if (1) @@ -962,6 +979,29 @@ cmd_wkd_get (assuan_context_t ctx, char *line) err = ks_action_fetch (ctrl, uri, outfp); es_fclose (outfp); ctrl->server_local->inhibit_data_logging = 0; + /* Register the result under the domain name of MBOX. */ + switch (gpg_err_code (err)) + { + case 0: + domaininfo_set_wkd_supported (domain_orig); + break; + + case GPG_ERR_NO_NAME: + /* There is no such domain. */ + domaininfo_set_no_name (domain_orig); + break; + + case GPG_ERR_NO_DATA: + if (is_wkd_query) /* Mark that - we will latter do a check. */ + domaininfo_set_wkd_not_found (domain_orig); + else if (opt_policy_flags) /* No policy file - no support. */ + domaininfo_set_wkd_not_supported (domain_orig); + break; + + default: + /* Don't register other errors. */ + break; + } } } |