2007-07-25 23:31:49 -07:00
|
|
|
//* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 04:12:37 -07:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
#include "nsIEffectiveTLDService.h"
|
|
|
|
|
2007-07-25 23:31:49 -07:00
|
|
|
#include "nsTHashtable.h"
|
|
|
|
#include "nsString.h"
|
|
|
|
#include "nsCOMPtr.h"
|
2012-06-05 20:18:25 -07:00
|
|
|
#include "mozilla/Attributes.h"
|
2007-07-25 23:31:49 -07:00
|
|
|
|
|
|
|
class nsIIDNService;
|
2008-02-14 14:57:20 -08:00
|
|
|
|
2012-09-11 04:42:23 -07:00
|
|
|
#define ETLD_ENTRY_N_INDEX_BITS 30
|
|
|
|
|
2008-02-14 14:57:20 -08:00
|
|
|
// struct for static data generated from effective_tld_names.dat
|
|
|
|
struct ETLDEntry {
|
2012-09-11 04:42:23 -07:00
|
|
|
uint32_t strtab_index : ETLD_ENTRY_N_INDEX_BITS;
|
|
|
|
uint32_t exception : 1;
|
|
|
|
uint32_t wild : 1;
|
2008-02-14 14:57:20 -08:00
|
|
|
};
|
|
|
|
|
2007-07-25 23:31:49 -07:00
|
|
|
|
|
|
|
// hash entry class
|
|
|
|
class nsDomainEntry : public PLDHashEntryHdr
|
|
|
|
{
|
2012-09-11 04:42:23 -07:00
|
|
|
friend class nsEffectiveTLDService;
|
2007-07-25 23:31:49 -07:00
|
|
|
public:
|
|
|
|
// Hash methods
|
|
|
|
typedef const char* KeyType;
|
|
|
|
typedef const char* KeyTypePointer;
|
|
|
|
|
2008-02-14 14:57:20 -08:00
|
|
|
nsDomainEntry(KeyTypePointer aEntry)
|
|
|
|
{
|
|
|
|
}
|
2007-07-25 23:31:49 -07:00
|
|
|
|
|
|
|
nsDomainEntry(const nsDomainEntry& toCopy)
|
|
|
|
{
|
|
|
|
// if we end up here, things will break. nsTHashtable shouldn't
|
|
|
|
// allow this, since we set ALLOW_MEMMOVE to true.
|
|
|
|
NS_NOTREACHED("nsDomainEntry copy constructor is forbidden!");
|
|
|
|
}
|
|
|
|
|
|
|
|
~nsDomainEntry()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
KeyType GetKey() const
|
|
|
|
{
|
2012-09-11 04:42:23 -07:00
|
|
|
return GetEffectiveTLDName(mData->strtab_index);
|
2007-07-25 23:31:49 -07:00
|
|
|
}
|
|
|
|
|
2011-09-28 23:19:26 -07:00
|
|
|
bool KeyEquals(KeyTypePointer aKey) const
|
2007-07-25 23:31:49 -07:00
|
|
|
{
|
2012-09-11 04:42:23 -07:00
|
|
|
return !strcmp(GetKey(), aKey);
|
2007-07-25 23:31:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static KeyTypePointer KeyToPointer(KeyType aKey)
|
|
|
|
{
|
|
|
|
return aKey;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PLDHashNumber HashKey(KeyTypePointer aKey)
|
|
|
|
{
|
|
|
|
// PL_DHashStringKey doesn't use the table parameter, so we can safely
|
2012-07-30 07:20:58 -07:00
|
|
|
// pass nullptr
|
|
|
|
return PL_DHashStringKey(nullptr, aKey);
|
2007-07-25 23:31:49 -07:00
|
|
|
}
|
|
|
|
|
2011-10-17 07:59:28 -07:00
|
|
|
enum { ALLOW_MEMMOVE = true };
|
2007-07-25 23:31:49 -07:00
|
|
|
|
2008-02-14 14:57:20 -08:00
|
|
|
void SetData(const ETLDEntry* entry) { mData = entry; }
|
|
|
|
|
2011-09-28 23:19:26 -07:00
|
|
|
bool IsNormal() { return mData->wild || !mData->exception; }
|
|
|
|
bool IsException() { return mData->exception; }
|
|
|
|
bool IsWild() { return mData->wild; }
|
2007-07-25 23:31:49 -07:00
|
|
|
|
2012-09-11 04:42:23 -07:00
|
|
|
static const char *GetEffectiveTLDName(size_t idx)
|
|
|
|
{
|
|
|
|
return strings.strtab + idx;
|
|
|
|
}
|
|
|
|
|
2007-07-25 23:31:49 -07:00
|
|
|
private:
|
2008-02-14 14:57:20 -08:00
|
|
|
const ETLDEntry* mData;
|
2012-09-11 04:42:23 -07:00
|
|
|
#define ETLD_STR_NUM_1(line) str##line
|
|
|
|
#define ETLD_STR_NUM(line) ETLD_STR_NUM_1(line)
|
|
|
|
struct etld_string_list {
|
|
|
|
#define ETLD_ENTRY(name, ex, wild) char ETLD_STR_NUM(__LINE__)[sizeof(name)];
|
|
|
|
#include "etld_data.inc"
|
|
|
|
#undef ETLD_ENTRY
|
|
|
|
};
|
|
|
|
static const union etld_strings {
|
|
|
|
struct etld_string_list list;
|
|
|
|
char strtab[1];
|
|
|
|
} strings;
|
|
|
|
static const ETLDEntry entries[];
|
|
|
|
void FuncForStaticAsserts(void);
|
|
|
|
#undef ETLD_STR_NUM
|
|
|
|
#undef ETLD_STR_NUM1
|
2007-07-25 23:31:49 -07:00
|
|
|
};
|
|
|
|
|
2012-06-05 20:18:25 -07:00
|
|
|
class nsEffectiveTLDService MOZ_FINAL : public nsIEffectiveTLDService
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_DECL_NSIEFFECTIVETLDSERVICE
|
|
|
|
|
2008-02-14 14:57:20 -08:00
|
|
|
nsEffectiveTLDService() { }
|
2007-03-22 10:30:00 -07:00
|
|
|
nsresult Init();
|
|
|
|
|
|
|
|
private:
|
2012-08-22 08:56:38 -07:00
|
|
|
nsresult GetBaseDomainInternal(nsCString &aHostname, uint32_t aAdditionalParts, nsACString &aBaseDomain);
|
2007-07-25 23:31:49 -07:00
|
|
|
nsresult NormalizeHostname(nsCString &aHostname);
|
2008-02-14 14:57:20 -08:00
|
|
|
~nsEffectiveTLDService() { }
|
2007-07-25 23:31:49 -07:00
|
|
|
|
|
|
|
nsTHashtable<nsDomainEntry> mHash;
|
|
|
|
nsCOMPtr<nsIIDNService> mIDNService;
|
2007-03-22 10:30:00 -07:00
|
|
|
};
|