lib/ddr/auth/groups.rb in ddr-models-1.13.1 vs lib/ddr/auth/groups.rb in ddr-models-1.13.2
- old
+ new
@@ -1,103 +1,106 @@
require "delegate"
module Ddr
module Auth
+ # Wraps an Array of Group objects
class Groups < SimpleDelegator
- Public = Group.build("public")
- Registered = Group.build("registered")
- DukeEppn = Group.build("duke.all")
+ PUBLIC = Group.new("public").freeze
+ REGISTERED = Group.new("registered").freeze
+ DUKE_EPPN = Group.new("duke.all").freeze
- Superusers = Group.build("superusers")
- CollectionCreators = Group.build("collection_creators")
+ Superusers = Group.new("superusers").freeze
+ CollectionCreators = Group.new("collection_creators").freeze
ISMEMBEROF_RE = Regexp.new('urn:mace:duke\.edu:groups:library:repository:ddr:[\w:]+')
DUKE_EPPN_RE = Regexp.new('(?=@duke\.edu)')
AFFILIATION_RE = Regexp.new('(%{a})(?=@duke\.edu)' % {a: Affiliation::VALUES.join("|")})
class << self
- # Return the list of all groups available for use in the repository
- # @return [Array<Group>] the groups
+
+ # Return the list of all groups available for use in the repository
+ # @return [Array<Group>] the groups
def all
- Affiliation.groups + remote + [Public, Registered, DukeEppn]
+ affiliation + remote + builtin
end
- def remote
- grouper.repository_group_names.map { |name| Group.build(name) }
+ # Build a Groups instance for the user and env context (if any)
+ def build(user, env=nil)
+ groups = [ PUBLIC ] # everybody
+ if user.persisted?
+ groups << REGISTERED
+ groups << DUKE_EPPN if duke_eppn?(user, env)
+ groups.concat remote(user, env)
+ groups.concat affiliation(user, env)
+ end
+ groups << Superusers if groups.include?(Ddr::Auth.superuser_group)
+ groups << CollectionCreators if groups.include?(Ddr::Auth.collection_creators_group)
+ new(groups)
end
- def grouper
- Ddr::Auth.grouper_gateway.new
+ def remote(*args)
+ if args.empty?
+ grouper.repository_group_names.map { |name| Group.new(name) }
+ else
+ user, env = args
+ names =
+ if env && env["ismemberof"]
+ env["ismemberof"].scan(ISMEMBEROF_RE).map { |name| name.sub(/^urn:mace:duke.edu:groups/, "duke") }
+ else
+ grouper.user_group_names(user)
+ end
+ names.map { |name| Group.new(name) }
+ end
end
- end
- attr_reader :env, :user
+ def affiliation(*args)
+ if args.empty?
+ Affiliation.groups
+ else
+ user, env = args
+ affiliations =
+ if env && env["affiliation"]
+ env["affiliation"].scan(AFFILIATION_RE).flatten
+ else
+ ldap.affiliations(user.principal_name)
+ end
+ affiliations.map { |a| Affiliation.group(a) }
+ end
+ end
- def initialize(user, env=nil)
- @user = user
- @env = env
- groups = [ Public ] # everybody
- if user.persisted?
- groups << Registered
- groups << DukeEppn if duke_eppn?
- groups.concat(remote)
- groups.concat(affiliation)
+ def duke_eppn?(user, env)
+ eppn =
+ if env && env["eppn"]
+ env["eppn"]
+ else
+ user.principal_name
+ end
+ !!(eppn =~ DUKE_EPPN_RE)
end
- super(groups)
- self << Superusers if names.include?(Ddr::Auth.superuser_group)
- self << CollectionCreators if names.include?(Ddr::Auth.collection_creators_group)
- end
- def inspect
- "#<#{self.class.name} user=\"#{user}\", env=#{env ? '[YES]' : '[NO]'}, groups=#{names.inspect}>"
- end
+ def builtin
+ [PUBLIC, REGISTERED, DUKE_EPPN]
+ end
- def to_s
- names.to_s
- end
+ def grouper
+ Ddr::Auth.grouper_gateway.new
+ end
- # Return a list of the group names
- # @return [Array<String>] the names
- def names
- map(&:to_s)
- end
+ def ldap
+ Ddr::Auth.ldap_gateway.new
+ end
- private
-
- def grouper
- self.class.grouper
end
- def remote
- names = if env && env["ismemberof"]
- env["ismemberof"].scan(ISMEMBEROF_RE).map { |name| name.sub(/^urn:mace:duke.edu:groups/, "duke") }
- else
- grouper.user_group_names(user)
- end
- names.map { |name| Group.build(name) }
- end
+ private_class_method :ldap, :grouper, :remote, :affiliation, :builtin, :duke_eppn?
- def duke_eppn?
- eppn = if env && env["eppn"]
- env["eppn"]
- else
- user.principal_name
- end
- !!(eppn =~ DUKE_EPPN_RE)
+ def inspect
+ "#<#{self.class.name} (#{self})>"
end
- def affiliation
- affiliations = if env && env["affiliation"]
- env["affiliation"].scan(AFFILIATION_RE).flatten
- else
- ldap.affiliations(user.principal_name)
- end
- affiliations.map { |a| Affiliation.group(a) }
- end
-
- def ldap
- Ddr::Auth.ldap_gateway.new
+ def agents
+ map(&:agent)
end
end
end
end