class Yus::Session
Public Class Methods
new(needle)
click to toggle source
# File lib/yus/session.rb, line 20 def initialize(needle) @needle = needle @timeout = needle.config.session_timeout @mutex = Mutex.new touch! end
Public Instance Methods
affiliate(name, groupname)
click to toggle source
# File lib/yus/session.rb, line 26 def affiliate(name, groupname) info("affiliate(name=#{name}, group=#{groupname})") @mutex.synchronize { allow_or_fail('edit', 'yus.entities') user = find_or_fail(name) group = find_or_fail(groupname) user.join(group) save(user, group) } touch! end
create_entity(name, valid_until=nil, valid_from=Time.now)
click to toggle source
# File lib/yus/session.rb, line 58 def create_entity(name, valid_until=nil, valid_from=Time.now) info("create_entity(name=#{name}, valid_until=#{valid_until}, valid_from=#{valid_from})") entity = nil @mutex.synchronize { allow_or_fail('edit', 'yus.entities') if(@needle.persistence.find_entity(name)) debug("create_entity: Duplicate Name: '#{name}'") raise DuplicateNameError, "Duplicate name: #{name}" end entity = Entity.new(name, valid_until, valid_from) entity.grant('set_password', name) @needle.persistence.add_entity(entity) } touch! entity end
delete_entity(name)
click to toggle source
# File lib/yus/session.rb, line 74 def delete_entity(name) info("delete_entity(name=#{name})") allow_or_fail 'edit', 'yus.entities' entity = find_or_fail name @needle.persistence.delete_entity name touch! end
destroy!()
click to toggle source
# File lib/yus/session.rb, line 81 def destroy! @needle = @user = nil @timeout = -1 end
disaffiliate(name, groupname)
click to toggle source
# File lib/yus/session.rb, line 85 def disaffiliate(name, groupname) info("disaffiliate(name=#{name}, group=#{groupname})") @mutex.synchronize { allow_or_fail('edit', 'yus.entities') user = find_or_fail(name) group = find_or_fail(groupname) save(user, group) } touch! end
dump_to_yaml(yaml_name=nil)
click to toggle source
# File lib/yus/session.rb, line 37 def dump_to_yaml(yaml_name=nil) yaml_name ||= File.expand_path(File.join(__FILE__, '..', '..', '..', 'data', 'yus_dump.yml')) ::FileUtils.makedirs(File.dirname(yaml_name)) if entities.is_a?(Hash) # when running unit tests, where MockPersistence uses a Hash File.open(yaml_name, 'w') { |f| YAML.dump(@needle.persistence, f) } else File.open(yaml_name, 'w') { |fh| ids = entities.collect { |item| item.odba_id } ids.each { |odba_id| begin yaml = YAML.dump(ODBA.cache.fetch(odba_id, nil)) fh.puts yaml fh.puts rescue end } } info "dumped #{entities.size} entities to #{yaml_name}" end end
entities()
click to toggle source
# File lib/yus/session.rb, line 98 def entities allow_or_fail('edit', 'yus.entities') touch! @needle.persistence.entities end
expired?()
click to toggle source
# File lib/yus/session.rb, line 95 def expired? Time.now > (@last_access + @timeout) end
find_entity(name)
click to toggle source
# File lib/yus/session.rb, line 103 def find_entity(name) allow_or_fail('edit', 'yus.entities') touch! @needle.persistence.find_entity(name) end
grant(name, action, item=nil, expires=nil)
click to toggle source
# File lib/yus/session.rb, line 108 def grant(name, action, item=nil, expires=nil) info("grant(name=#{name}, action=#{action}, item=#{item}, expires=#{expires})") @mutex.synchronize { allow_or_fail('grant', action) user = find_or_fail(name) user.grant(action, item || :everything, expires || :never) save(user) } touch! end
last_login(name, domain=@domain)
click to toggle source
# File lib/yus/session.rb, line 118 def last_login(name, domain=@domain) if(user = find_entity(name)) user.last_login(domain) end end
remove_token(token)
click to toggle source
# File lib/yus/session.rb, line 123 def remove_token(token) @user.remove_token token save @user nil end
rename(oldname, newname)
click to toggle source
# File lib/yus/session.rb, line 128 def rename(oldname, newname) info("rename(#{oldname}, #{newname})") @mutex.synchronize { allow_or_fail('edit', 'yus.entities') user = find_or_fail(oldname) if((other = @needle.persistence.find_entity(newname)) && other != user) raise DuplicateNameError, "Duplicate name: #{newname}" end user.revoke('set_password', oldname) user.rename(newname) user.grant('set_password', newname) save(user) } end
revoke(name, action, item=nil, time=nil)
click to toggle source
# File lib/yus/session.rb, line 142 def revoke(name, action, item=nil, time=nil) info("revoke(name=#{name}, action=#{action}, item=#{item}, time=#{time})") @mutex.synchronize { allow_or_fail('grant', action) user = find_or_fail(name) user.revoke(action, item || :everything, time) save(user) } touch! end
set_entity_preference(name, key, value, domain=@domain)
click to toggle source
# File lib/yus/session.rb, line 161 def set_entity_preference(name, key, value, domain=@domain) debug("set_entity_preference(name=#{name}, key=#{key}, value=#{value}, domain=#{domain})") @mutex.synchronize { allow_or_fail('edit', 'yus.entities') user = find_or_fail(name) user.set_preference(key, value, domain) save(user) } touch! end
set_password(name, pass)
click to toggle source
# File lib/yus/session.rb, line 152 def set_password(name, pass) @mutex.synchronize { allow_or_fail('set_password', name) user = find_or_fail(name) user.passhash = @needle.config.digest.hexdigest(pass) save(user) } touch! end
Private Instance Methods
allow_or_fail(action, item)
click to toggle source
# File lib/yus/session.rb, line 172 def allow_or_fail(action, item) unless(allowed?(action, item)) raise NotPrivilegedError, "You are not privileged to #{action} #{item}" end end
debug(message)
click to toggle source
# File lib/yus/session.rb, line 177 def debug(message) @needle.logger.debug(self.class) { message } end
find_or_fail(name)
click to toggle source
# File lib/yus/session.rb, line 180 def find_or_fail(name) @needle.persistence.find_entity(name) \ or raise UnknownEntityError, "Unknown Entity '#{name}'" end
info(message)
click to toggle source
# File lib/yus/session.rb, line 184 def info(message) @needle.logger.info(self.class) { message } end
save(*args)
click to toggle source
# File lib/yus/session.rb, line 187 def save(*args) args.each { |entity| @needle.persistence.save_entity(entity) } end
touch!()
click to toggle source
# File lib/yus/session.rb, line 192 def touch! @last_access = Time.now end