c-ipfs/namesys/isdomain.c

116 lines
2.3 KiB
C

#include <string.h>
#include <ctype.h>
#include <time.h>
#include "ipfs/namesys/namesys.h"
#include "ipfs/namesys/isdomain.h"
void ToUpper(char *dst, char *src)
{
while(*src) {
*dst++ = toupper(*src++);
}
*dst = '\0';
}
int HasSuffix (char *s, char *suf)
{
char *p;
p = s + strlen(s) - strlen(suf);
return strcmp(p, suf) == 0;
}
int IsAtArray(tlds *a, char *s)
{
char str[strlen(s)+1];
ToUpper(str, s);
while(a->str) {
if (strcmp(a->str, str) == 0) {
return a->condition;
}
a++;
}
return 0;
}
int domainMatchString (char *d)
{
char str[strlen(d)+1], *p = str, *l;
ToUpper(str, d);
// l point to last two chars.
l = p + strlen(p) - 2;
// can't start with a dot
if (*p == '.') {
return 0; // invalid
}
// last 2 chars can't be a dot or a number.
if ((*l >= 'A' && *l <= 'Z') && (l[1] >= 'A' && l[1] <= 'Z')) {
while (*p) {
if ((*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || *p == '.' || *p == '-') {
p++;
} else {
return 0; // invalid
}
}
} else {
return 0; // invalid
}
return 1; // valid
}
// IsICANNTLD returns whether the given string is a TLD (Top Level Domain),
// according to ICANN. Well, really according to the TLDs listed in this
// package.
int IsICANNTLD(char *s)
{
return IsAtArray (TLDs, s);
}
// IsExtendedTLD returns whether the given string is a TLD (Top Level Domain),
// extended with a few other "TLDs", .bit, .onion
int IsExtendedTLD (char *s)
{
return IsAtArray (ExtendedTLDs, s);
}
// IsTLD returns whether the given string is a TLD (according to ICANN, or
// in the set of ExtendedTLDs listed in this package.
int IsTLD (char *s)
{
return IsICANNTLD (s) || IsExtendedTLD(s);
}
// IsDomain returns whether given string is a domain.
// It first checks the TLD, and then uses a regular expression.
int IsDomain (char *s)
{
char str[strlen(s)];
char *tld;
strcpy(str, s);
s = str; // work with local copy.
if (HasSuffix (s, ".")) {
s[strlen(s) - 1] = '\0';
}
tld = strrchr(s, '.');
if (!tld) { // don't have a dot.
return 0;
}
tld++; // ignore last dot
if (!IsTLD (tld)) {
return 0;
}
return domainMatchString(s);
}