sub validate_hostmask {
my ($hostmask) = (@_);
$hostmask or return 0;
# if ($hostmask !~ /^[^!@]+![^!@]+@[^!@]+$/) { #dancer ircd
if ($hostmask !~ /^[^!@]+![i|n]=[^!@]+@[^!@]+$/) {
debug("'$hostmask' has bad syntax");
return undef;
}
# if ($hostmask =~ /!\*@/ or $hostmask =~ /@[\*\.]*$/) { #dancer ircd
if ($hostmask =~ /!\*@/ or $hostmask =~ /@[\*\.]*$/) {
debug("'$hostmask' is an open hostmask (insecure)");
return undef;
}
return 1;
}
# Converts an RFC 1459 IRC hostmask (with * as a glob wildchar) into a
# regular expression.
# params:
# $hostmask : hostmask to convert
# returns:
# A regular expression representation of $hostmask
sub hostmask_to_regexp {
my ($hostmask) = @_;
# split hostmask into nick and userhost, since the rules differ
my ($nick, $userhost) = $hostmask =~ /^(.*)!(.*)$/;
# print "# $nick --- $userhost\n";
# Substitutions to take a standard IRC hostmask and convert it to
# a regexp. I thought this was pretty clever... :)
# {}| are really the lowercase equivalents of []\ (Don't ask me... read RFC1459)
# The result of this is that { is equivalent to [ in a nick, etc.
# I couldn't do a direct substitution for each of these. There would
# be problems with the inserted ] and \ chars (used to define the
# character classes on the right side of the s///) being picked up
# by the second and third s/// expressions. The solution was to
# substitute a character that would never be found in a real hostmask
# in a first pass, and convert those characters to the correct
# regexp in a second pass.
# First pass: convert each instance of a char (upper or lower) to some
# 'impossible' character. (ascii 01, 02, and 03)
$nick =~ s/[{[]/\01/g;
$nick =~ s/[}\]]/\02/g;
$nick =~ s/[|\\]/\03/g;
# Second pass: convert each impossible char to the appropriate regexp
$nick =~ s/\01/[{[]/g;
$nick =~ s/\02/[}\\]]/g;
$nick =~ s/\03/[|\\\\]/g;
$userhost =~ s/([[\]{}|\\])/\\$1/g; # escape \[]{} only in userhost
$hostmask = "$nick!$userhost"; # recombine
$hostmask =~ s/([().?^\$])/\\$1/g; # escape ().?^$
$hostmask =~ s/\*/.*/g; # translate wildchar "*" to regexp equivalent ".*"
return $hostmask;
}