A Public Suffix List is a collection of Top Level Domains (TLDs) suffixes.
TLDs include Global Top Level Domains (gTLDs) like .com
and .net
;
Country Top Level Domains (ccTLDs) like .de
and .cn
;
and Brand Top Level Domains like .apple
and .google
.
Brand TLDs allows users to register their own top level domain that exist at the same level as ICANN's gTLDs.
Brand TLDs are sometimes referred to as Vanity Domains.
Browsers, web clients and other user agents can use a public suffix list to:
- avoid privacy-leaking "supercookies"
- avoid privacy-leaking "super domain" certificates (see post from Jeffry Walton)
- domain highlighting parts of the domain in a user interface
- sorting domain lists by site
Libpsl...
- has built-in PSL data for fast access (DAWG/DAFSA reduces size from 180kB to ~32kB)
- allows to load PSL data from files
- checks if a given domain is a "public suffix"
- provides immediate cookie domain verification
- finds the longest public part of a given domain
- finds the shortest private part of a given domain
- works with international domains (UTF-8 and IDNA2008 Punycode)
- is thread-safe
- handles IDNA2008 UTS#46 (if libicu is available)
Find more information about the Public Suffix List here.
Download the Public Suffix List here.
The original DAFSA code is from the Chromium Project.
You find the current API documentation here.
#include <stdio.h>
#include <libpsl.h>
int main(int argc, char **argv)
{
const char *domain = "www.example.com";
const char *cookie_domain = ".com";
const psl_ctx_t *psl = psl_builtin();
int is_public, is_acceptable;
is_public = psl_is_public_suffix(psl, domain);
printf("%s %s a public suffix.\n", domain, is_public ? "is" : "is not");
is_acceptable = psl_is_cookie_domain_acceptable(psl, domain, cookie_domain);
printf("cookie domain '%s' %s acceptable for domain '%s'.\n",
cookie_domain, is_acceptable ? "is" : "is not", domain);
return 0;
}
Libpsl comes with a tool 'psl' that gives you access to most of the library API via command line.
$ psl --help
prints the usage.
The DAFSA format is a compressed representation of strings. Here we use it to reduce the whole PSL to about 32k in size.
Generate psl.dafsa
from list/public_suffix_list.dat
$ src/psl-make-dafsa --output-format=binary list/public_suffix_list.dat psl.dafsa
Test the result (example)
$ tools/psl --load-psl-file psl.dafsa aeroclub.aero
Libpsl is made available under the terms of the MIT license.
See the LICENSE file that accompanies this distribution for the full text of the license.
src/psl-make-dafsa and src/lookup_string_in_fixed_set.c are licensed under the term written in src/LICENSE.chromium.
Choose a release from https://github.com/rockdaboot/libpsl/tags an download the tarball
named libpsl-{version}.tar.*
. Unpack with tar xf <filename>
, cd into the libsl* directory.
Build with
./configure
make
make check
Install with
sudo make install
Download project with
git clone --recursive https://github.com/rockdaboot/libpsl
cd libpsl
Prerequisites:
-
python2.7+ (for converting the PSL list)
-
basic C development tools (compiler, linker, make)
-
autoconf, autoconf-archive, autopoint, automake, autotools
-
libtool, gettext, pkg-config
-
development files for either libidn2, libicu or libidn (the latter only offers IDNA2003)
-
for building docs: gtk-doc-tools (gtkdocize)
./autogen.sh ./configure make make check
meson builddir
ninja -C builddir
ninja -C builddir test
There is also an unofficial MSVC nmake build configuration in msvc/
. Please
see README.MSVC.md on building libpsl with Visual Studio via NMake or Meson.
To join the mailing list send an email to
libpsl-bugs+subscribe@googlegroups.com
and follow the instructions provided by the answer mail.
Or click join.