libtld: /home/snapwebsites/snapcpp/contrib/libtld/src/validate_tld.cpp Source File

libtld  1.5.13
A library to determine the Top-Level Domain name of any URL.
validate_tld.cpp
Go to the documentation of this file.
1 /* TLD library -- TLD validation command line tools
2  * Copyright (c) 2011-2019 Made to Order Software Corp. All Rights Reserved
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 
31 #include "libtld/tld.h"
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <iostream>
36 
38 int err_count = 0;
39 
41 int verbose = 0;
42 
53 const char *schemes = "afp,adiumxtra,aw,beshare,bolo,cap,coap,crid,dns,feed,file,"
54  "finger,fish,ftp,ftps,git,gopher,http,https,icap,imap,"
55  "ipp,irc,irc6,ircs,mumble,mupdate,mysql,nfs,nntp,"
56  "opaquelocktoken,pop,psql,psyc,rmi,rsync,rtmp,rtsp,rtspu,"
57  "sftp,shttp,sieve,smb,snmp,soap.beep,soap.beeps,soldat,"
58  "ssh,teamspeak,telnet,tftp,tip,udp,unreal,ut2004,vemmi,"
59  "ventrilo,wais,webcal,wyciwyg,z39.50r,z39.50s";
60 
62 char const * user_schemes = nullptr;
63 
70 void check_uri(char const * uri)
71 {
72  tld_result result;
73  if(strncasecmp(uri, "mailto:", 7) == 0)
74  {
75  tld_email_list mail;
76  result = mail.parse(uri + 7, 0);
77  }
78  else
79  {
80  struct tld_info info;
81  char const * s(user_schemes == nullptr ? schemes : user_schemes);
82  result = tld_check_uri(uri, &info, s, 0);
83 
84  if(verbose)
85  {
86  std::cout << "URI: " << uri << std::endl;
87  std::cout << "Category: " << static_cast<int>(info.f_category) << std::endl;
88  std::cout << "Status: " << static_cast<int>(info.f_status) << std::endl;
89  if(info.f_country != nullptr)
90  {
91  std::cout << "Country: " << info.f_country << std::endl;
92  }
93  std::cout << "TLD: " << info.f_tld << std::endl;
94  std::cout << "Offset: " << info.f_offset << std::endl;
95  }
96  }
97  if(result != TLD_RESULT_SUCCESS)
98  {
99  fprintf(stderr, "error: URI \"%s\" is not considered valid.\n", uri);
100  ++err_count;
101  }
102 }
103 
108 void list()
109 {
110  for(const char *s(schemes); *s != '\0'; ++s)
111  {
112  if(*s == ',')
113  {
114  printf("\n");
115  }
116  else
117  {
118  printf("%c", *s);
119  }
120  }
121  printf("\n");
122  exit(1);
123 }
124 
130 void usage()
131 {
132  printf("Usage: validate_tld [-<opts>] <uri> | <email>\n");
133  printf("Where <uri> or <email> are URIs starting with a valid scheme.\n");
134  printf("The <email> scheme is mailto:.\n");
135  printf("Where -<opts> are:\n");
136  printf(" -h | --help print out this help screen\n");
137  printf(" -l | --list print the default list of schemes\n");
138  printf(" -s | --schemes <list> set the list of schemes with user's defined schemes\n");
139  printf(" the list is a comma separate set of scheme names\n");
140  printf(" -v | --verbose request some verbosity of the tool's work\n");
141  exit(1);
142 }
143 
155 int main(int argc, char *argv[])
156 {
157  try
158  {
159  bool uri(false);
160 
161  for(int i(1); i < argc; ++i)
162  {
163  if(argv[i][0] == '-')
164  {
165  if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0)
166  {
167  usage();
168  /*NOTREACHED*/
169  }
170  else if(strcmp(argv[i], "-l") == 0 || strcmp(argv[i], "--list") == 0)
171  {
172  list();
173  /*NOTREACHED*/
174  }
175  else if(strcmp(argv[i], "--version") == 0)
176  {
177  printf("%s\n", LIBTLD_VERSION);
178  if(verbose)
179  {
180  printf("libtld v%s\n", tld_version());
181  }
182  exit(1);
183  }
184  else if(strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--schemes") == 0)
185  {
186  ++i;
187  if(i >= argc)
188  {
189  fprintf(stderr, "error: the --schemes option requires a list of comma separated schemes.\n");
190  }
191  user_schemes = argv[i];
192  }
193  else if(strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--verbose") == 0)
194  {
195  verbose = 1;
196  }
197  }
198  else
199  {
200  uri = true;
201  check_uri(argv[i]);
202  }
203  }
204 
205  if(!uri)
206  {
207  fprintf(stderr, "error: no URI were specified on the command line.\n");
208  ++err_count;
209  }
210 
211  return err_count > 0 ? 1 : 0;
212  }
213  catch(std::exception const& e) // LCOV_EXCL_LINE
214  {
215  // an exception occurred, print out the message and exit with an error
216  //
217  // note that this tool is not expecting any exception
218  // because we only access the C interface which does
219  // not throw
220  //
221  std::cerr << "exception: " << e.what() << std::endl; // LCOV_EXCL_LINE
222  exit(1); // LCOV_EXCL_LINE
223  }
224 }
225 
226 // vim: ts=4 sw=4 et
int verbose
Whether the user asked for verbosity, false by default.
void check_uri(char const *uri)
Check the parameter as a URI.
enum tld_status f_status
The status of the TLD.
Definition: tld.h:94
const char * f_tld
Pointer to the TLD in the URI string you supplied.
Definition: tld.h:96
The C++ side of the email list implementation.
Definition: tld.h:181
The public header of the libtld library.
int f_offset
The offset to the TLD in the URI string you supplied.
Definition: tld.h:97
LIBTLD_EXPORT enum tld_result tld_check_uri(const char *uri, struct tld_info *info, const char *protocols, int flags)
Check that a URI is valid.
Definition: tld.c:741
void list()
List the default schemes accepted.
#define LIBTLD_VERSION
The version of the library as a string.
const char * schemes
List of schemes that we more or less support (some schemes have extensions using the semi-colon that ...
LIBTLD_EXPORT const char * tld_version()
Return the version of the library.
Definition: tld.c:1043
tld_result
The result returned by tld().
Definition: tld.h:81
char const * user_schemes
Hold a list of schemes as defined by the end user.
int err_count
Number of errors so we know whether to exit with 0 or 1.
Success! The TLD of the specified URI is valid.
Definition: tld.h:83
const char * f_country
The country where this TLD is used.
Definition: tld.h:95
enum tld_category f_category
The category of the TLD.
Definition: tld.h:93
Set of information returned by the tld() function.
Definition: tld.h:91
tld_result parse(const std::string &emails, int flags)
Parse a new list of emails.
Definition: tld_emails.cpp:395
void usage()
Print out the help of the tld tool.
int main(int argc, char *argv[])
The validate tools.

This document is part of the Snap! Websites Project.

Copyright by Made to Order Software Corp.

Syndicate content

Snap! Websites
An Open Source CMS System in C++

Contact Us Directly