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