+ // Whilst simple hostnames (e.g. localhost) are valid we do not allow the server to use
+ // them to prevent issues with clients that differentiate between short client and server
+ // prefixes by checking whether the nickname contains a dot.
+ return numdots;
+}
+
+bool InspIRCd::IsSID(const std::string &str)
+{
+ /* Returns true if the string given is exactly 3 characters long,
+ * starts with a digit, and the other two characters are A-Z or digits
+ */
+ return ((str.length() == 3) && isdigit(str[0]) &&
+ ((str[1] >= 'A' && str[1] <= 'Z') || isdigit(str[1])) &&
+ ((str[2] >= 'A' && str[2] <= 'Z') || isdigit(str[2])));
+}
+
+/** A lookup table of values for multiplier characters used by
+ * InspIRCd::Duration(). In this lookup table, the indexes for
+ * the ascii values 'm' and 'M' have the value '60', the indexes
+ * for the ascii values 'D' and 'd' have a value of '86400', etc.
+ */
+static const unsigned int duration_multi[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86400, 0, 0, 0, 3600, 0, 0, 0, 0, 60, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 604800, 0, 31557600, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86400, 0, 0, 0, 3600, 0, 0, 0, 0, 60, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 604800, 0, 31557600, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+bool InspIRCd::Duration(const std::string& str, unsigned long& duration)
+{
+ unsigned long total = 0;
+ unsigned long subtotal = 0;
+
+ /* Iterate each item in the string, looking for number or multiplier */
+ for (std::string::const_iterator i = str.begin(); i != str.end(); ++i)
+ {
+ /* Found a number, queue it onto the current number */
+ if ((*i >= '0') && (*i <= '9'))
+ {
+ subtotal = (subtotal * 10) + (*i - '0');
+ }
+ else
+ {
+ /* Found something that's not a number, find out how much
+ * it multiplies the built up number by, multiply the total
+ * and reset the built up number.
+ */
+ unsigned int multiplier = duration_multi[static_cast<unsigned char>(*i)];
+ if (multiplier == 0)
+ return false;
+
+ total += subtotal * multiplier;
+
+ /* Next subtotal please */
+ subtotal = 0;
+ }
+ }
+ /* Any trailing values built up are treated as raw seconds */
+ duration = total + subtotal;