1 /* $NetBSD: valid_utf8_hostname.c,v 1.2 2017/02/14 01:16:49 christos Exp $ */
2
3 /*++
4 /* NAME
5 /* valid_utf8_hostname 3
6 /* SUMMARY
7 /* validate (maybe UTF-8) domain name
8 /* SYNOPSIS
9 /* #include <valid_utf8_hostname.h>
10 /*
11 /* int valid_utf8_hostname(
12 /* int enable_utf8,
13 /* const char *domain,
14 /* int gripe)
15 /* DESCRIPTION
16 /* valid_utf8_hostname() is a wrapper around valid_hostname().
17 /* If EAI support is compiled in, and enable_utf8 is true, the
18 /* name is converted from UTF-8 to ASCII per IDNA rules, before
19 /* invoking valid_hostname().
20 /* SEE ALSO
21 /* valid_hostname(3) STD3 hostname validation.
22 /* DIAGNOSTICS
23 /* Fatal errors: memory allocation problem.
24 /* Warnings: malformed domain name.
25 /* LICENSE
26 /* .ad
27 /* .fi
28 /* The Secure Mailer license must be distributed with this software.
29 /* AUTHOR(S)
30 /* Wietse Venema
31 /* IBM T.J. Watson Research
32 /* P.O. Box 704
33 /* Yorktown Heights, NY 10598, USA
34 /*--*/
35
36 /*
37 * System library.
38 */
39 #include <sys_defs.h>
40
41 /*
42 * Utility library.
43 */
44 #include <msg.h>
45 #include <mymalloc.h>
46 #include <stringops.h>
47 #include <valid_hostname.h>
48 #include <midna_domain.h>
49 #include <valid_utf8_hostname.h>
50
51 /* valid_utf8_hostname - validate internationalized domain name */
52
valid_utf8_hostname(int enable_utf8,const char * name,int gripe)53 int valid_utf8_hostname(int enable_utf8, const char *name, int gripe)
54 {
55 static const char myname[] = "valid_utf8_hostname";
56
57 /*
58 * Trivial cases first.
59 */
60 if (*name == 0) {
61 if (gripe)
62 msg_warn("%s: empty domain name", myname);
63 return (0);
64 }
65
66 /*
67 * Convert non-ASCII domain name to ASCII and validate the result per
68 * STD3. midna_domain_to_ascii() applies valid_hostname() to the result.
69 * Propagate the gripe parameter for better diagnostics (note that
70 * midna_domain_to_ascii() logs a problem only when the result is not
71 * cached).
72 */
73 #ifndef NO_EAI
74 if (enable_utf8 && !allascii(name)) {
75 if (midna_domain_to_ascii(name) == 0) {
76 if (gripe)
77 msg_warn("%s: malformed UTF-8 domain name", myname);
78 return (0);
79 } else {
80 return (1);
81 }
82 }
83 #endif
84
85 /*
86 * Validate ASCII name per STD3.
87 */
88 return (valid_hostname(name, gripe));
89 }
90