# 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
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
# Reset the login-by-mask option\r
#\r
def reset_login_by_mask\r
- @login_by_mask = Auth.manager.bot.config['auth.login_by_mask'] unless defined?(@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.manager.bot.config['auth.autologin'] unless defined?(@autologin)\r
+ @autologin = Auth.authmanager.bot.config['auth.autologin'] unless defined?(@autologin)\r
end\r
\r
# Do we allow automatic logging in?\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
\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
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