:default => 'rbotauth', :wizard => true,\r
:desc => 'Password for the bot owner' )\r
BotConfig.register BotConfigBooleanValue.new( 'auth.login_by_mask',\r
- :default => 'false',\r
- :desc => 'Set true if new botusers should allow logging in without a password when the user netmask is known')\r
+ :default => 'true',\r
+ :desc => 'Set false to prevent new botusers from logging in without a password when the user netmask is known')\r
BotConfig.register BotConfigBooleanValue.new( 'auth.autologin',\r
- :default => 'false',\r
- :desc => 'Set true if new botusers should try to recognize IRC users without a need to manually login')\r
+ :default => 'true',\r
+ :desc => 'Set false to prevent new botusers from recognizing IRC users without a need to manually login')\r
# BotConfig.register BotConfigIntegerValue.new( 'auth.default_level',\r
# :default => 10, :wizard => true,\r
# :desc => 'The default level for new/unknown users' )\r
\r
# Generate a random password of length _l_\r
#\r
- def random_password(l=8)\r
+ def Auth.random_password(l=8)\r
pwd = ""\r
8.times do\r
pwd += (rand(26) + (rand(2) == 0 ? 65 : 97) ).chr\r
# This class describes a permission set\r
class PermissionSet\r
\r
+ attr_reader :perm\r
# Create a new (empty) PermissionSet\r
#\r
def initialize\r
end\r
\r
\r
+ # This is the error that gets raised when an invalid password is met\r
+ #\r
+ class InvalidPassword < RuntimeError\r
+ end\r
+\r
+\r
# This is the basic class for bot users: they have a username, a password,\r
# a list of netmasks to match against, and a list of permissions.\r
#\r
attr_reader :username\r
attr_reader :password\r
attr_reader :netmasks\r
+ attr_reader :perm\r
attr_writer :login_by_mask\r
attr_writer :autologin\r
\r
@password = nil\r
@netmasks = NetmaskList.new\r
@perm = {}\r
- @login_by_mask = Auth.manager.bot.config['auth.login_by_mask'] unless defined?(@login_by_mask)\r
- @autologin = Auth.manager.bot.config['auth.autologin'] unless defined?(@autologin)\r
+ reset_login_by_mask\r
+ reset_autologin\r
end\r
\r
# Inspection\r
str << ">"\r
end\r
\r
+ # In strings\r
+ def to_s\r
+ @username\r
+ end\r
+\r
# Convert into a hash\r
def to_hash\r
{\r
@login_by_mask\r
end\r
\r
+ # Reset the login-by-mask option\r
+ #\r
+ def reset_login_by_mask\r
+ @login_by_mask = Auth.authmanager.bot.config['auth.login_by_mask'] unless defined?(@login_by_mask)\r
+ end\r
+\r
+ # Reset the autologin option\r
+ #\r
+ def reset_autologin\r
+ @autologin = Auth.authmanager.bot.config['auth.autologin'] unless defined?(@autologin)\r
+ end\r
+\r
# Do we allow automatic logging in?\r
#\r
def autologin?\r
\r
# Resets the password by creating a new onw\r
def reset_password\r
- @password = random_password\r
+ @password = Auth.random_password\r
end\r
\r
# Sets the permission for command _cmd_ to _val_ on channel _chan_\r
\r
# Removes all <code>Netmask</code>s\r
#\r
- def reset_netmask_list\r
+ def reset_netmasks\r
@netmasks = NetmaskList.new\r
end\r
\r
# and replacing any nonalphanumeric character with _\r
#\r
def BotUser.sanitize_username(name)\r
- return name.to_s.chomp.downcase.gsub(/[^a-z0-9]/,"_")\r
+ candidate = name.to_s.chomp.downcase.gsub(/[^a-z0-9]/,"_")\r
+ raise "sanitized botusername #{candidate} too short" if candidate.length < 3\r
+ return candidate\r
end\r
\r
end\r
#\r
class DefaultBotUserClass < BotUser\r
\r
- private :login, :add_netmask, :delete_netmask\r
+ private :add_netmask, :delete_netmask\r
\r
include Singleton\r
\r
- # The default BotUser is named 'everyone', it doesn't allow autologin\r
- # (meaningless) and it allows login-by-mask\r
+ # The default BotUser is named 'everyone'\r
#\r
def initialize\r
- @login_by_mask = true\r
- @autologin = false\r
+ reset_login_by_mask\r
+ reset_autologin\r
super("everyone")\r
@default_perm = PermissionSet.new\r
end\r
return @login_by_mask\r
end\r
\r
+ # The default botuser allows logins by mask\r
+ #\r
+ def reset_login_by_mask\r
+ @login_by_mask = true\r
+ end\r
+\r
# This method returns without changing anything\r
#\r
def autologin=(val)\r
return\r
end\r
\r
+ # The default botuser doesn't allow autologin (meaningless)\r
+ #\r
+ def reset_autologin\r
+ @autologin = false\r
+ end\r
+\r
# Sets the default permission for the default user (i.e. the ones\r
# set by the BotModule writers) on all channels\r
#\r
end\r
\r
# Resets the NetmaskList\r
- def reset_netmask_list\r
+ def reset_netmasks\r
super\r
add_netmask("*!*@*")\r
end\r
\r
def initialize\r
@login_by_mask = false\r
- @autologin = false\r
+ @autologin = true\r
super("owner")\r
end\r
\r
\r
attr_reader :everyone\r
attr_reader :botowner\r
+ attr_reader :bot\r
\r
# The instance manages two <code>Hash</code>es: one that maps\r
# <code>Irc::User</code>s onto <code>BotUser</code>s, and the other that maps\r
\r
# Maps <code>Irc::User</code> to BotUser\r
def irc_to_botuser(ircuser)\r
- # TODO check netmasks\r
- @botusers[ircuser.to_irc_user] || everyone\r
+ logged = @botusers[ircuser.to_irc_user]\r
+ return logged if logged\r
+ return autologin(ircuser)\r
end\r
\r
# creates a new BotUser\r
def create_botuser(name, password=nil)\r
n = BotUser.sanitize_username(name)\r
k = n.to_sym\r
- raise "BotUser #{n} exists" if include?(k)\r
+ raise "botuser #{n} exists" if include?(k)\r
bu = BotUser.new(n)\r
bu.password = password\r
@allbotusers[k] = bu\r
+ return bu\r
end\r
\r
# returns the botuser with name _name_\r
k = n.to_sym\r
raise "No such BotUser #{n}" unless include?(k)\r
if @botusers.has_key?(ircuser)\r
- return true if @botusers[ircuser].name = n\r
+ return true if @botusers[ircuser].username == n\r
# TODO\r
# @botusers[ircuser].logout(ircuser)\r
end\r
raise "Could not check permission for user #{user.inspect} to run #{cmdtxt.inspect} on #{chan.inspect}"\r
end\r
\r
- # Checks if command _cmd_ is allowed to User _user_ on _chan_\r
+ # Checks if command _cmd_ is allowed to User _user_ on _chan_, optionally\r
+ # telling if the user is authorized\r
+ #\r
def allow?(cmdtxt, user, chan=nil)\r
- permit?(user, cmdtxt, chan)\r
+ if permit?(user, cmdtxt, chan)\r
+ return true\r
+ else\r
+ # cmds = cmdtxt.split('::')\r
+ # @bot.say chan, "you don't have #{cmds.last} (#{cmds.first}) permissions here" if chan\r
+ @bot.say chan, "#{user}, you don't have '#{cmdtxt}' permissions here" if chan\r
+ return false\r
+ end\r
end\r
\r
end\r