[Ovirt-devel] [PATCH] Added to enable LDAP support via the ActiveLdap gem.
Darryl L. Pierce
dpierce at redhat.com
Thu May 8 15:05:34 UTC 2008
From: Darryl L. Pierce <mcpierce at mcpierce-laptop.localdomain>
---
wui/src/app/helpers/ldap_connection.rb | 46 +++++++++++++
wui/src/app/models/account.rb | 24 +++++++
wui/src/vendor/plugins/active_ldap/README | 54 +++++++++++++++
.../active_ldap/generators/model_active_ldap/USAGE | 17 +++++
.../model_active_ldap_generator.rb | 70 ++++++++++++++++++++
.../model_active_ldap/templates/fixtures.yml | 11 +++
.../templates/model_active_ldap.rb | 3 +
.../model_active_ldap/templates/unit_test.rb | 10 +++
.../scaffold_active_ldap_generator.rb | 7 ++
.../scaffold_al/scaffold_al_generator.rb | 20 ++++++
wui/src/vendor/plugins/active_ldap/init.rb | 64 ++++++++++++++++++
11 files changed, 326 insertions(+), 0 deletions(-)
create mode 100644 wui/src/app/helpers/ldap_connection.rb
create mode 100644 wui/src/app/models/account.rb
create mode 100644 wui/src/vendor/plugins/active_ldap/README
create mode 100644 wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/USAGE
create mode 100644 wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/model_active_ldap_generator.rb
create mode 100644 wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/fixtures.yml
create mode 100644 wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/model_active_ldap.rb
create mode 100644 wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/unit_test.rb
create mode 100644 wui/src/vendor/plugins/active_ldap/generators/scaffold_active_ldap/scaffold_active_ldap_generator.rb
create mode 100644 wui/src/vendor/plugins/active_ldap/generators/scaffold_al/scaffold_al_generator.rb
create mode 100644 wui/src/vendor/plugins/active_ldap/init.rb
diff --git a/wui/src/app/helpers/ldap_connection.rb b/wui/src/app/helpers/ldap_connection.rb
new file mode 100644
index 0000000..53256fa
--- /dev/null
+++ b/wui/src/app/helpers/ldap_connection.rb
@@ -0,0 +1,46 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +LDAPConnection+ handles establishing, returning and closing
+# connections with an LDAP server.
+#
+class LDAPConnection
+ @@hostname = nil
+ @@port = 389
+
+ # Connects the LDAP server.
+ def LDAPConnection.connect(
+ base,
+ hostname = LDAPConnection.hostname,
+ port = LDAPConnection.port
+ )
+ ActiveLdap::Base.establish_connection(:host => hostname
+ end
+
+ # Returns whether a connection already exists to the LDAP server.
+ def LDAPConnection.connected?
+ return ActiveLdap::Base.connected?
+ end
+
+ # Disconnects from the LDAP server.
+ def LDAPConnection.disconnected
+ ActiveLdap::Base.remove_connection if LDAPConnection.connected?
+ end
+
+end
diff --git a/wui/src/app/models/account.rb b/wui/src/app/models/account.rb
new file mode 100644
index 0000000..94c3bb6
--- /dev/null
+++ b/wui/src/app/models/account.rb
@@ -0,0 +1,24 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +Account+ represents a single user's account from the LDAP server.
+#
+class Account < ActiveLdap::Base
+ ldap_mapping :dn_attribute => 'uid', :classes => ['person', 'posixAccount']
+end
diff --git a/wui/src/vendor/plugins/active_ldap/README b/wui/src/vendor/plugins/active_ldap/README
new file mode 100644
index 0000000..8e40086
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/README
@@ -0,0 +1,54 @@
+= ActiveLdap plugin for Ruby on Rails
+
+== Setup
+
+You need to write RAILS_ROOT/config/ldap.yml like the following:
+
+ development:
+ host: 127.0.0.1
+ port: 389
+ base: dc=devel,dc=local,dc=net
+ bind_dn: cn=admin,dc=local,dc=net
+ password: secret
+
+ test:
+ host: 127.0.0.1
+ port: 389
+ base: dc=test,dc=local,dc=net
+ bind_dn: cn=admin,dc=local,dc=net
+ password: secret
+
+ production:
+ host: 127.0.0.1
+ port: 389
+ base: dc=production,dc=local,dc=net
+ bind_dn: cn=admin,dc=local,dc=net
+ password: secret
+
+== Model
+
+Here is some examples.
+
+app/model/member.rb:
+ class Member < ActiveLdap::Base
+ ldap_mapping :dn_attribute => 'uid',
+ :classes => ['person', 'posixAccount']
+ belongs_to :primary_group, :class => "Group",
+ :foreign_key => "gidNumber", :primary_key => "gidNumber"
+ belongs_to :groups, :many => 'memberUid'
+ end
+
+app/model/group.rb:
+ class Group < ActiveLdap::Base
+ ldap_mapping :dn_attribute => "cn", :classes => ['posixGroup']
+ has_many :members, :wrap => "memberUid"
+ has_many :primary_members,
+ :foreign_key => 'gidNumber',
+ :primary_key => 'gidNumber'
+ end
+
+app/model/ou.rb:
+ class Ou < ActiveLdap::Base
+ ldap_mapping :prefix => "",
+ :classes => ["top", "organizationalUnit"]
+ end
diff --git a/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/USAGE b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/USAGE
new file mode 100644
index 0000000..a86c5dd
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/USAGE
@@ -0,0 +1,17 @@
+Description:
+ The model_activeldap generator creates stubs for a new model.
+
+ The generator takes a model name as its argument. The model name may be given in CamelCase or under_score and
+ should not be suffixed with 'Model'.
+
+ The generator creates a model class in app/models, a test suite in test/unit, and test fixtures in
+ test/fixtures/singular_name.yml. It will not create a migration.
+
+Examples:
+ ./script/generate model_activeldap user
+
+ This will create a User model:
+ Model: app/models/user.rb
+ Test: test/unit/user_test.rb
+ Fixtures: test/fixtures/users.yml
+
diff --git a/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/model_active_ldap_generator.rb b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/model_active_ldap_generator.rb
new file mode 100644
index 0000000..f8435a3
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/model_active_ldap_generator.rb
@@ -0,0 +1,70 @@
+class ModelActiveLdapGenerator < Rails::Generator::NamedBase
+ include ActiveLdap::GetTextSupport
+
+ default_options :dn_attribute => "cn", :classes => nil
+
+ def manifest
+ record do |m|
+ # Check for class naming collisions.
+ m.class_collisions class_path, class_name, "#{class_name}Test"
+
+ # Model, test, and fixture directories.
+ m.directory File.join('app/models', class_path)
+ m.directory File.join('test/unit', class_path)
+ m.directory File.join('test/fixtures', class_path)
+
+ # Model class, unit test, and fixtures.
+ m.template('model_active_ldap.rb',
+ File.join('app/models', class_path, "#{file_name}.rb"),
+ :assigns => {:ldap_mapping => ldap_mapping})
+ m.template('unit_test.rb',
+ File.join('test/unit', class_path, "#{file_name}_test.rb"))
+ m.template('fixtures.yml',
+ File.join('test/fixtures', class_path, "#{table_name}.yml"))
+ end
+ end
+
+ private
+ def add_options!(opt)
+ opt.separator ''
+ opt.separator 'Options:'
+ opt.on("--dn-attribute=ATTRIBUTE",
+ _("Use ATTRIBUTE as default DN attribute for " \
+ "instances of this model"),
+ _("(default: %s)") % options[:dn_attribute]) do |attribute|
+ options[:dn_attribute] = attribute
+ end
+
+ opt.on("--prefix=PREFIX",
+ _("Use PREFIX as prefix for this model"),
+ _("(default: %s)") % default_prefix) do |prefix|
+ options[:prefix] = prefix
+ end
+
+ opt.on("--classes=CLASS,CLASS,...",
+ Array,
+ "Use CLASSES as required objectClass for instances of this model",
+ "(default: %s)" % options[:classes]) do |classes|
+ options[:classes] = classes
+ end
+ end
+
+ def prefix
+ options[:prefix] || default_prefix
+ end
+
+ def default_prefix
+ "ou=#{Inflector.pluralize(Inflector.demodulize(name))}"
+ end
+
+ def ldap_mapping(indent=' ')
+ mapping = "ldap_mapping "
+ mapping_options = [":dn_attribute => #{options[:dn_attribute].dump}"]
+ mapping_options << ":prefix => #{prefix.dump}"
+ if options[:classes]
+ mapping_options << ":classes => #{options[:classes].inspect}"
+ end
+ mapping_options = mapping_options.join(",\n#{indent}#{' ' * mapping.size}")
+ "#{indent}#{mapping}#{mapping_options}"
+ end
+end
diff --git a/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/fixtures.yml b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/fixtures.yml
new file mode 100644
index 0000000..9f5ae29
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/fixtures.yml
@@ -0,0 +1,11 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+ id: 1
+<% for attribute in attributes -%>
+ <%= attribute.name %>: <%= attribute.default %>
+<% end -%>
+two:
+ id: 2
+<% for attribute in attributes -%>
+ <%= attribute.name %>: <%= attribute.default %>
+<% end -%>
\ No newline at end of file
diff --git a/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/model_active_ldap.rb b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/model_active_ldap.rb
new file mode 100644
index 0000000..cdfa66b
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/model_active_ldap.rb
@@ -0,0 +1,3 @@
+class <%= class_name %> < ActiveLdap::Base
+<%= ldap_mapping %>
+end
diff --git a/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/unit_test.rb b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/unit_test.rb
new file mode 100644
index 0000000..b464de4
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/generators/model_active_ldap/templates/unit_test.rb
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../test_helper'
+
+class <%= class_name %>Test < Test::Unit::TestCase
+ fixtures :<%= table_name %>
+
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff --git a/wui/src/vendor/plugins/active_ldap/generators/scaffold_active_ldap/scaffold_active_ldap_generator.rb b/wui/src/vendor/plugins/active_ldap/generators/scaffold_active_ldap/scaffold_active_ldap_generator.rb
new file mode 100644
index 0000000..35ad937
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/generators/scaffold_active_ldap/scaffold_active_ldap_generator.rb
@@ -0,0 +1,7 @@
+class ScaffoldActiveLdapGenerator < Rails::Generator::Base
+ def manifest
+ record do |m|
+ m.template("ldap.yml", File.join("config", "ldap.yml"))
+ end
+ end
+end
diff --git a/wui/src/vendor/plugins/active_ldap/generators/scaffold_al/scaffold_al_generator.rb b/wui/src/vendor/plugins/active_ldap/generators/scaffold_al/scaffold_al_generator.rb
new file mode 100644
index 0000000..3fa365c
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/generators/scaffold_al/scaffold_al_generator.rb
@@ -0,0 +1,20 @@
+class ScaffoldAlGenerator < Rails::Generator::Base
+ include ActiveLdap::GetTextSupport
+
+ def initialize(*args)
+ duped_args = args.collect {|arg| arg.dup}
+ super
+ logger.warning(_("scaffold_al is deprecated. " \
+ "Use scaffold_active_ldap instead."))
+ generator_class = self.class.lookup("scaffold_active_ldap").klass
+ @generator = generator_class.new(duped_args)
+ end
+
+ def manifest
+ @generator.manifest
+ end
+
+ def source_path(*args)
+ @generator.source_path(*args)
+ end
+end
diff --git a/wui/src/vendor/plugins/active_ldap/init.rb b/wui/src/vendor/plugins/active_ldap/init.rb
new file mode 100644
index 0000000..35e19d4
--- /dev/null
+++ b/wui/src/vendor/plugins/active_ldap/init.rb
@@ -0,0 +1,64 @@
+require_library_or_gem 'active_ldap'
+ActiveLdap::Base.logger ||= RAILS_DEFAULT_LOGGER
+
+required_version = ["0", "9", "1"]
+if (ActiveLdap::VERSION.split(".") <=> required_version) < 0
+ ActiveLdap::Base.class_eval do
+ format = _("You need ActiveLdap %s or later")
+ logger.error(format % required_version.join("."))
+ end
+end
+
+ldap_configuration_file = File.join(RAILS_ROOT, 'config', 'ldap.yml')
+if File.exist?(ldap_configuration_file)
+ configurations = YAML.load(ERB.new(IO.read(ldap_configuration_file)).result)
+ ActiveLdap::Base.configurations = configurations
+ ActiveLdap::Base.establish_connection
+else
+ ActiveLdap::Base.class_eval do
+ format = _("You should run 'script/generator scaffold_active_ldap' to make %s.")
+ logger.error(format % ldap_configuration_file)
+ end
+end
+
+class ::ActionView::Base
+ include ActiveLdap::Helper
+end
+
+module ::ActionController
+ module LdapBenchmarking
+ def self.included(base)
+ base.class_eval do
+ alias_method_chain :render, :active_ldap_benchmark
+ alias_method_chain :rendering_runtime, :active_ldap
+ end
+ end
+
+ protected
+ def render_with_active_ldap_benchmark(*args, &block)
+ if logger
+ @ldap_runtime_before_render = ActiveLdap::Base.reset_runtime
+ result = render_without_active_ldap_benchmark(*args, &block)
+ @ldap_runtime_after_render = ActiveLdap::Base.reset_runtime
+ @rendering_runtime -= @ldap_runtime_after_render
+ result
+ else
+ render_without_active_ldap_benchmark(*args, &block)
+ end
+ end
+
+ private
+ def rendering_runtime_with_active_ldap(runtime)
+ result = rendering_runtime_without_active_ldap(runtime)
+ ldap_runtime = ActiveLdap::Base.reset_runtime
+ ldap_runtime += @ldap_runtime_before_render || 0
+ ldap_runtime += @ldap_runtime_after_render || 0
+ ldap_percentage = ldap_runtime * 100 / runtime
+ result + (" | LDAP: %.5f (%d%%)" % [ldap_runtime, ldap_percentage])
+ end
+ end
+
+ class Base
+ include LdapBenchmarking
+ end
+end
--
1.5.4.1
More information about the ovirt-devel
mailing list