blob: 048f80deab4b4373ab384bec80e1c6c7e75a2304 [file] [log] [blame]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SHILL_DNS_UTIL_H_
#define SHILL_DNS_UTIL_H_
#include <string>
#include <base/strings/string_piece.h>
namespace shill {
// TODO(crbug.com/751899): The DNS name validation code is adapted from
// dns_util* in Chrome:
//
// https://chromium.googlesource.com/chromium/src/+/3674d6f0ac52b4c7e3c21aa76f1cf842692ec692/net/dns/dns_util.h
//
// It would be better to include it in libchrome so that the code is
// maintained in one place.
// DNSDomainFromDot - convert a domain string to DNS format. From DJB's
// public domain DNS library.
//
// dotted: a string in dotted form: "www.google.com"
// out: a result in DNS form: "\x03www\x06google\x03com\x00"
bool DNSDomainFromDot(const base::StringPiece& dotted, std::string* out);
// Checks that a hostname is valid. Simple wrapper around DNSDomainFromDot.
bool IsValidDNSDomain(const base::StringPiece& dotted);
// Returns true if the character is valid in a DNS hostname label, whether in
// the first position or later in the label.
//
// This function asserts a looser form of the restrictions in RFC 7719 (section
// 2; https://tools.ietf.org/html/rfc7719#section-2): hostnames can include
// characters a-z, A-Z, 0-9, -, and _, and any of those characters (except -)
// are legal in the first position. The looser rules are necessary to support
// service records (initial _), and non-compliant but attested hostnames that
// include _. These looser rules also allow Punycode and hence IDN.
bool IsValidHostLabelCharacter(char c, bool is_first_char);
} // namespace shill
#endif // SHILL_DNS_UTIL_H_