ateam-merb-auth-old 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +44 -0
- data/README +212 -0
- data/Rakefile +50 -0
- data/TODO +14 -0
- data/activerecord_generators/ma_migration/ma_migration_generator.rb +41 -0
- data/activerecord_generators/ma_migration/templates/schema/migrations/%time_stamp%_add_ma_user.rb +21 -0
- data/app/controllers/application.rb +7 -0
- data/app/controllers/sessions.rb +3 -0
- data/app/controllers/users.rb +3 -0
- data/app/helpers/application_helper.rb +64 -0
- data/app/mailers/user_mailer.rb +24 -0
- data/app/mailers/views/user_mailer/activation.text.erb +1 -0
- data/app/mailers/views/user_mailer/forgot_password.text.erb +5 -0
- data/app/mailers/views/user_mailer/signup.text.erb +7 -0
- data/app/views/layout/merb_auth.html.erb +16 -0
- data/app/views/sessions/new.html.erb +13 -0
- data/app/views/users/new.html.erb +21 -0
- data/datamapper_generators/ma_migration/ma_migration_generator.rb +38 -0
- data/datamapper_generators/ma_migration/templates/schema/migrations/add_ma_user.rb +21 -0
- data/lib/ateam-merb-auth-old.rb +1 -0
- data/lib/merb-auth.rb +184 -0
- data/lib/merb-auth/adapters/activerecord/init.rb +26 -0
- data/lib/merb-auth/adapters/activerecord/map.rb +44 -0
- data/lib/merb-auth/adapters/activerecord/model.rb +81 -0
- data/lib/merb-auth/adapters/common.rb +161 -0
- data/lib/merb-auth/adapters/datamapper/init.rb +28 -0
- data/lib/merb-auth/adapters/datamapper/map.rb +35 -0
- data/lib/merb-auth/adapters/datamapper/model.rb +72 -0
- data/lib/merb-auth/adapters/map.rb +0 -0
- data/lib/merb-auth/adapters/sequel/init.rb +26 -0
- data/lib/merb-auth/adapters/sequel/map.rb +36 -0
- data/lib/merb-auth/adapters/sequel/model.rb +86 -0
- data/lib/merb-auth/controller/controller.rb +113 -0
- data/lib/merb-auth/controller/sessions_base.rb +41 -0
- data/lib/merb-auth/controller/users_base.rb +58 -0
- data/lib/merb-auth/initializer.rb +47 -0
- data/lib/merb-auth/merbtasks.rb +168 -0
- data/lib/merb-auth/slicetasks.rb +102 -0
- data/plugins/forgotten_password/app/controllers/passwords.rb +90 -0
- data/plugins/forgotten_password/app/models/user.rb +52 -0
- data/plugins/forgotten_password/app/views/passwords/edit.html.erb +9 -0
- data/plugins/forgotten_password/app/views/passwords/new.html.erb +4 -0
- data/plugins/forgotten_password/forgotten_password.rb +6 -0
- data/plugins/forgotten_password/init.rb +8 -0
- data/plugins/forgotten_password/spec/controller_spec.rb +236 -0
- data/plugins/forgotten_password/spec/model_spec.rb +52 -0
- data/plugins/forgotten_password/spec/spec_helper.rb +36 -0
- data/public/javascripts/master.js +0 -0
- data/public/stylesheets/master.css +2 -0
- data/spec/controllers/plugins/test_plugin.rb +17 -0
- data/spec/controllers/sessions_spec.rb +118 -0
- data/spec/controllers/users_spec.rb +119 -0
- data/spec/mailers/user_mailer_spec.rb +75 -0
- data/spec/merb_auth_spec.rb +231 -0
- data/spec/models/ar_model_spec.rb +50 -0
- data/spec/models/common_spec.rb +0 -0
- data/spec/models/model_spec.rb +23 -0
- data/spec/models/sq_model_spec.rb +50 -0
- data/spec/shared_specs/shared_model_spec.rb +445 -0
- data/spec/spec_helper.rb +114 -0
- data/spec/spec_helpers/helpers.rb +18 -0
- data/spec/spec_helpers/valid_model_hashes.rb +10 -0
- data/stubs/app/controllers/application.rb +2 -0
- data/stubs/app/controllers/main.rb +2 -0
- data/stubs/app/mailers/views/activation.text.erb +1 -0
- data/stubs/app/mailers/views/signup.text.erb +7 -0
- data/stubs/app/views/sessions/new.html.erb +14 -0
- data/stubs/app/views/users/new.html.erb +18 -0
- metadata +120 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
class MerbAuth::UserMailer < Merb::MailController
|
2
|
+
|
3
|
+
controller_for_slice MerbAuth, :templates_for => :mailer, :path => "views"
|
4
|
+
|
5
|
+
def signup
|
6
|
+
@ivar = params[MA[:single_resource]]
|
7
|
+
Merb.logger.info "Sending Signup to #{@ivar.email} with code #{@ivar.activation_code}"
|
8
|
+
instance_variable_set("@#{MA[:single_resource]}", @ivar )
|
9
|
+
render_mail :text => :signup, :layout => nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def activation
|
13
|
+
@ivar = params[MA[:single_resource]]
|
14
|
+
Merb.logger.info "Sending Activation email to #{@ivar.email}"
|
15
|
+
instance_variable_set("@#{MA[:single_resource]}", @ivar )
|
16
|
+
render_mail :text => :activation, :layout => nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def forgot_password
|
20
|
+
@ivar = params[MA[:single_resource]]
|
21
|
+
instance_variable_set("@#{MA[:single_resource]}", @ivar )
|
22
|
+
render_mail :text => :forgot_password, :layout => nil
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Your email has been authenticated <%= @ivar.email %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
5
|
+
<title>Fresh MerbAuth Slice</title>
|
6
|
+
<link href="<%= public_path_for :stylesheet, 'master.css' %>" type="text/css" charset="utf-8" rel="stylesheet" media="all" />
|
7
|
+
<script src="<%= public_path_for :javascript, 'master.js' %>" type="text/javascript" charset="utf-8"></script>
|
8
|
+
</head>
|
9
|
+
<!-- you can override this layout at slices/merb_auth/app/views/layout/merb_auth.html.erb -->
|
10
|
+
<body class="merb_auth">
|
11
|
+
<div id="container">
|
12
|
+
<h1>MerbAuth Slice</h1>
|
13
|
+
<div id="main"><%= catch_content :for_layout %></div>
|
14
|
+
</div>
|
15
|
+
</body>
|
16
|
+
</html>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= form :action => url(:merb_auth_login) do -%>
|
2
|
+
<p><label for="email">Email</label><br/>
|
3
|
+
<%= text_field :name => "email" %></p>
|
4
|
+
|
5
|
+
<p><label for="password">Password</label><br/>
|
6
|
+
<%= password_field :name => "password" %></p>
|
7
|
+
|
8
|
+
<!--Uncomment this if you want this functionality-->
|
9
|
+
<!--<p><label for="remember_me">Remember me:</label>-->
|
10
|
+
<%#= checkbox_field :name => 'remember_me' %></p>
|
11
|
+
|
12
|
+
<p><%= submit 'Log in' %></p>
|
13
|
+
<% end =%>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= error_messages_for @ivar %>
|
2
|
+
<%= form_for @ivar, :action => url(:merb_auth_users) do %>
|
3
|
+
<p>
|
4
|
+
<%= text_field :email, :label => "Email" %>
|
5
|
+
</p>
|
6
|
+
<p>
|
7
|
+
<%= text_field :login, :label => "Nickname" %>
|
8
|
+
</p>
|
9
|
+
<p>
|
10
|
+
<%= password_field :password, :label => "Password" %>
|
11
|
+
</p>
|
12
|
+
<p>
|
13
|
+
<%= password_field :password_confirmation, :label => "Password Confirmation" %>
|
14
|
+
</p>
|
15
|
+
<p>
|
16
|
+
<%= recaptcha_tags if Object.const_defined?(:Ambethia) %>
|
17
|
+
</p>
|
18
|
+
<p>
|
19
|
+
<%= submit "Sign up" %>
|
20
|
+
</p>
|
21
|
+
<% end =%>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class MaMigrationGenerator < Merb::GeneratorBase
|
2
|
+
|
3
|
+
attr_accessor :plural_name, :single_name, :time_stamp
|
4
|
+
|
5
|
+
def initialize(runtime_args, runtime_options = {})
|
6
|
+
@base = File.dirname(__FILE__)
|
7
|
+
super
|
8
|
+
@name = args.shift
|
9
|
+
end
|
10
|
+
|
11
|
+
def manifest
|
12
|
+
record do |m|
|
13
|
+
@m = m
|
14
|
+
|
15
|
+
@table_name = @name.split("::").last.snake_case.singularize.pluralize
|
16
|
+
|
17
|
+
@assigns = {
|
18
|
+
:time_stamp => @time_stamp,
|
19
|
+
:class_name => @name,
|
20
|
+
:table_name => @table_name
|
21
|
+
}
|
22
|
+
|
23
|
+
copy_dirs
|
24
|
+
copy_files
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
def banner
|
31
|
+
<<-EOS
|
32
|
+
Creates a migration for merb-auth user model
|
33
|
+
|
34
|
+
USAGE: #{$0} #{spec.name} name"
|
35
|
+
EOS
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
migration 1, :create_ma_users_table do
|
2
|
+
up do
|
3
|
+
create_table :<%= table_name %> do
|
4
|
+
column :id, Integer, :serial => true
|
5
|
+
column :login, String, :nullable? => false
|
6
|
+
column :email, String, :nullable? => false
|
7
|
+
column :created_at, DateTime
|
8
|
+
column :updated_at, DateTime
|
9
|
+
column :activated_at, DateTime
|
10
|
+
column :activation_code, String
|
11
|
+
column :crypted_password, String
|
12
|
+
column :salt, String
|
13
|
+
column :remember_token_expires_at, DateTime
|
14
|
+
column :remember_token, String
|
15
|
+
column :password_reset_key, String
|
16
|
+
end
|
17
|
+
end
|
18
|
+
down do
|
19
|
+
drop_table :<%= table_name %>
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/merb-auth.rb'
|
data/lib/merb-auth.rb
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
if defined?(Merb::Plugins)
|
2
|
+
|
3
|
+
require "digest/sha1"
|
4
|
+
require "merb-mailer"
|
5
|
+
require "merb_helpers"
|
6
|
+
|
7
|
+
load File.join(File.dirname(__FILE__), "merb-auth", "initializer.rb")
|
8
|
+
|
9
|
+
Dir[File.dirname(__FILE__) / "merb-auth" / "controller" / "**" / "*.rb"].each do |f|
|
10
|
+
load f
|
11
|
+
end
|
12
|
+
|
13
|
+
adapter_path = File.join( File.dirname(__FILE__), "merb-auth", "adapters")
|
14
|
+
load File.join(adapter_path, "common.rb")
|
15
|
+
|
16
|
+
MA = MerbAuth
|
17
|
+
MA.register_adapter :datamapper, "#{adapter_path}/datamapper"
|
18
|
+
MA.register_adapter :activerecord, "#{adapter_path}/activerecord"
|
19
|
+
MA.register_adapter :sequel, "#{adapter_path}/sequel"
|
20
|
+
|
21
|
+
Merb::Plugins.add_rakefiles "merb-auth/merbtasks", "merb-auth/slicetasks"
|
22
|
+
|
23
|
+
# Register the Slice for the current host application
|
24
|
+
Merb::Slices::register(__FILE__)
|
25
|
+
|
26
|
+
|
27
|
+
class Merb::BootLoader::MaLoadPlugins < Merb::BootLoader
|
28
|
+
after Merb::BootLoader::LoadClasses
|
29
|
+
|
30
|
+
def self.run
|
31
|
+
MA.load_plugins!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Slice configuration - set this in a before_app_loads callback.
|
36
|
+
# By default a Slice uses its own layout, so you can swicht to
|
37
|
+
# the main application layout or no layout at all if needed.
|
38
|
+
#
|
39
|
+
# Configuration options:
|
40
|
+
# :layout - the layout to use; defaults to :merb_auth
|
41
|
+
# :mirror - which path component types to use on copy operations; defaults to all
|
42
|
+
Merb::Slices::config[:merb_auth] ||= {}
|
43
|
+
Merb::Slices::config[:merb_auth][:layout] ||= :merb_auth
|
44
|
+
|
45
|
+
# All Slice code is expected to be namespaced inside a module
|
46
|
+
module MerbAuth
|
47
|
+
|
48
|
+
|
49
|
+
def self.plugins
|
50
|
+
@@plugins ||= {}
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.add_routes(&blk)
|
54
|
+
custom_routes << blk
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.custom_routes
|
58
|
+
@custom_routes ||= []
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.setup_custom_routes!
|
62
|
+
Merb.logger.info "Adding custom routes"
|
63
|
+
custom_routes.each do |r|
|
64
|
+
r.call(MA[:router_scope])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Slice metadata
|
69
|
+
self.description = "MerbAuth is a Merb slice that provides authentication"
|
70
|
+
self.version = "0.1.0"
|
71
|
+
self.author = "Merb Core"
|
72
|
+
|
73
|
+
# Stub classes loaded hook - runs before LoadClasses BootLoader
|
74
|
+
# right after a slice's classes have been loaded internally
|
75
|
+
def self.loaded
|
76
|
+
# Setup the login field to use
|
77
|
+
MA[:login_field] = (MA[:login_field] || :email).to_sym
|
78
|
+
|
79
|
+
MA.load_adapter!
|
80
|
+
|
81
|
+
Merb::Controller.send(:include, MA::Controller::Helpers)
|
82
|
+
# sends the methoods to the controllers as an include so that other mixins can
|
83
|
+
# overwrite them
|
84
|
+
MA::Users.send( :include, MA::Controller::UsersBase)
|
85
|
+
MA::Sessions.send( :include, MA::Controller::SessionsBase)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Initialization hook - runs before AfterAppLoads BootLoader
|
89
|
+
def self.init
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
# Activation hook - runs after AfterAppLoads BootLoader
|
94
|
+
def self.activate
|
95
|
+
# Make the aliases for current stuff
|
96
|
+
Merb::Controller.module_eval do
|
97
|
+
alias_method :"current_#{MA[:single_resource]}", :current_ma_user
|
98
|
+
alias_method :"current_#{MA[:single_resource]}=", :current_ma_user=
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Deactivation hook - triggered by Merb::Slices#deactivate
|
103
|
+
def self.deactivate
|
104
|
+
end
|
105
|
+
|
106
|
+
# Setup routes inside the host application
|
107
|
+
#
|
108
|
+
# @param scope<Merb::Router::Behaviour>
|
109
|
+
# Routes will be added within this scope (namespace). In fact, any
|
110
|
+
# router behaviour is a valid namespace, so you can attach
|
111
|
+
# routes at any level of your router setup.
|
112
|
+
def self.setup_router(scope)
|
113
|
+
MA[:router_scope] = scope # Hangs onto the scope for the plugins which are loaded after the routes are setup
|
114
|
+
|
115
|
+
MA.setup_custom_routes!
|
116
|
+
|
117
|
+
plural_model_path = MA[:route_path_model] || MA[:plural_resource]
|
118
|
+
plural_model_path ||= "User".snake_case.singularize.pluralize
|
119
|
+
plural_model_path = plural_model_path.to_s.match(%r{^/?(.*?)/?$})[1]
|
120
|
+
single_model_name = plural_model_path.singularize
|
121
|
+
|
122
|
+
plural_session_path = MA[:route_path_session] || "sessions"
|
123
|
+
plural_session_path = plural_session_path.to_s.match(%r{^/?(.*?)/?$})[1]
|
124
|
+
single_session_name = plural_session_path.singularize
|
125
|
+
|
126
|
+
activation_name = (MA[:single_resource].to_s << "_activation").to_sym
|
127
|
+
|
128
|
+
MA[:routes] = {:user => {}}
|
129
|
+
MA[:routes][:user][:new] ||= :"new_#{single_model_name}"
|
130
|
+
MA[:routes][:user][:show] ||= :"#{single_model_name}"
|
131
|
+
MA[:routes][:user][:edit] ||= :"edit_#{single_model_name}"
|
132
|
+
MA[:routes][:user][:delete] ||= :"delete_#{single_model_name}"
|
133
|
+
MA[:routes][:user][:index] ||= :"#{plural_model_path}"
|
134
|
+
MA[:routes][:user][:activate] ||= :"#{single_model_name}_activation"
|
135
|
+
|
136
|
+
# Setup the model path
|
137
|
+
scope.to(:controller => "Users") do |c|
|
138
|
+
c.match("/#{plural_model_path}") do |u|
|
139
|
+
# setup the named routes
|
140
|
+
u.match("/new", :method => :get ).to( :action => "new" ).name(MA[:routes][:user][:new])
|
141
|
+
u.match("/:id", :method => :get ).to( :action => "show" ).name(MA[:routes][:user][:show])
|
142
|
+
u.match("/:id/edit", :method => :get ).to( :action => "edit" ).name(MA[:routes][:user][:edit])
|
143
|
+
u.match("/:id/delete", :method => :get ).to( :action => "delete" ).name(MA[:routes][:user][:delete])
|
144
|
+
u.match("/", :method => :get ).to( :action => "index" ).name(MA[:routes][:user][:index])
|
145
|
+
u.match("/activate/:activation_code", :method => :get).to( :action => "activate").name(MA[:routes][:user][:activate])
|
146
|
+
|
147
|
+
# Make the anonymous routes
|
148
|
+
u.match(%r{(/|/index)?(\.:format)?$}, :method => :get ).to( :action => "index")
|
149
|
+
u.match(%r{/new$}, :method => :get ).to( :action => "new")
|
150
|
+
u.match(%r{/:id(\.:format)?$}, :method => :get ).to( :action => "show")
|
151
|
+
u.match(%r{/:id/edit$}, :method => :get ).to( :action => "edit")
|
152
|
+
u.match(%r{/:id/delete$}, :method => :get ).to( :action => "delete")
|
153
|
+
u.match(%r{/?(\.:format)?$}, :method => :post ).to( :action => "create")
|
154
|
+
u.match(%r{/:id(\.:format)?$}, :method => :put ).to( :action => "update")
|
155
|
+
u.match(%r{/:id(\.:format)?$}, :method => :delete ).to( :action => "destroy")
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
scope.match("/signup").to(:controller => "Users", :action => "new" ).name(:signup)
|
160
|
+
scope.match("/login" ).to(:controller => "sessions", :action => "create" ).name(:login)
|
161
|
+
scope.match("/logout").to(:controller => "sessions", :action => "destroy").name(:logout)
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
# Setup the slice layout for MerbAuth
|
167
|
+
#
|
168
|
+
# Use MerbAuth.push_path and MerbAuth.push_app_path
|
169
|
+
# to set paths to merb_auth-level and app-level paths. Example:
|
170
|
+
#
|
171
|
+
# MerbAuth.push_path(:application, MerbAuth.root)
|
172
|
+
# MerbAuth.push_app_path(:application, Merb.root / "slices" / "merb-auth")
|
173
|
+
# ...
|
174
|
+
#
|
175
|
+
# Any component path that hasn't been set will default to MerbAuth.root
|
176
|
+
#
|
177
|
+
# Or just call setup_default_structure! to setup a basic Merb MVC structure.
|
178
|
+
MerbAuth.setup_default_structure!
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
Dir[File.join(File.dirname(__FILE__), "..", "plugins/*/init.rb")].each do |f|
|
183
|
+
require f
|
184
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
path = File.dirname(__FILE__)
|
4
|
+
|
5
|
+
if Merb.env?(:test)
|
6
|
+
# Need to make sure the class is removed when testing
|
7
|
+
# It should not impact a normal apps tests
|
8
|
+
if MA[:user]
|
9
|
+
klass = MA[:user]
|
10
|
+
Object.class_eval do
|
11
|
+
remove_const(klass.name) if klass
|
12
|
+
end
|
13
|
+
end
|
14
|
+
MA[:user] = nil
|
15
|
+
MerbAuth.module_eval do
|
16
|
+
remove_const("Adapter") if defined?(Adapter)
|
17
|
+
end
|
18
|
+
load path / ".." / "common.rb"
|
19
|
+
load path / "map.rb"
|
20
|
+
load path / "model.rb"
|
21
|
+
|
22
|
+
else
|
23
|
+
require path / ".." / "common"
|
24
|
+
require path / "map"
|
25
|
+
require path / "model"
|
26
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module MerbAuth
|
2
|
+
module Adapter
|
3
|
+
module ActiveRecord
|
4
|
+
module Map
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.send(:include, InstanceMethods)
|
8
|
+
base.send(:extend, ClassMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def find_active_with_conditions(conditions)
|
16
|
+
if MA[:user].instance_methods.include?("activated_at")
|
17
|
+
MA[:user].with_scope(:find => {:conditions => "activated_at IS NOT NULL"}) do
|
18
|
+
MA[:user].find(:first, :conditions => conditions)
|
19
|
+
end
|
20
|
+
else
|
21
|
+
MA[:user].find(:first, :conditions => conditions)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_with_conditions(conditions)
|
26
|
+
MA[:user].find(:first, :conditions => conditions)
|
27
|
+
end
|
28
|
+
|
29
|
+
def find_all_with_login_like(login)
|
30
|
+
MA[:user].with_scope(:find => {:order => "login DESC", :limit => 1}) do
|
31
|
+
MA[:user].find(:all, :conditions => ["login LIKE ?", login])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# A method to assist with specs
|
36
|
+
def clear_database_table
|
37
|
+
MA[:user].delete_all
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end # Map
|
42
|
+
end # ActiveRecord
|
43
|
+
end # Adapter
|
44
|
+
end # MerbAuthenticaiton
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module MerbAuth
|
2
|
+
module Adapter
|
3
|
+
module ActiveRecord
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
# Ensure base is a resource
|
7
|
+
raise "Mixin class is not an activerecord class" unless base.ancestors.include?(::ActiveRecord::Base)
|
8
|
+
set_model_class_decs!(base)
|
9
|
+
|
10
|
+
base.send(:include, Map)
|
11
|
+
base.send(:include, InstanceMethods )
|
12
|
+
base.send(:include, Common)
|
13
|
+
|
14
|
+
|
15
|
+
MA[:single_resource] ||= base.name.snake_case.gsub("::", "__").to_sym
|
16
|
+
MA[:plural_resource] ||= MA[:single_resource].to_s.pluralize.to_sym
|
17
|
+
|
18
|
+
MA[:user] = base
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
module InstanceMethods
|
23
|
+
|
24
|
+
def login=(login_name)
|
25
|
+
self[:login] = login_name.downcase unless login_name.nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
private
|
32
|
+
def self.set_model_class_decs!(base)
|
33
|
+
# base.instance_eval do
|
34
|
+
# # Virtual attribute for the unencrypted password
|
35
|
+
# attr_accessor :password, :password_confirmation
|
36
|
+
# validates_presence_of :login, :email
|
37
|
+
# validates_presence_of :password, :if => :password_required?
|
38
|
+
# validates_presence_of :password_confirmation, :if => :password_required?
|
39
|
+
# validates_length_of :password, :within => 4..40, :if => :password_required?
|
40
|
+
# validates_confirmation_of :password, :if => :password_required?
|
41
|
+
# validates_length_of :login, :within => 3..40
|
42
|
+
# validates_length_of :email, :within => 3..100
|
43
|
+
# validates_uniqueness_of :login, :email, :case_sensitive => false
|
44
|
+
# validates_uniqueness_of :password_reset_key, :if => Proc.new{|m| !m.password_reset_key.nil?}
|
45
|
+
#
|
46
|
+
#
|
47
|
+
# before_save :encrypt_password
|
48
|
+
# before_validation :set_login
|
49
|
+
# before_create :make_activation_code
|
50
|
+
# after_create :send_signup_notification
|
51
|
+
# end
|
52
|
+
end
|
53
|
+
|
54
|
+
module DefaultModelSetup
|
55
|
+
|
56
|
+
def self.included(base)
|
57
|
+
base.instance_eval do
|
58
|
+
# Virtual attribute for the unencrypted password
|
59
|
+
attr_accessor :password, :password_confirmation
|
60
|
+
validates_presence_of :login, :email
|
61
|
+
validates_presence_of :password, :if => :password_required?
|
62
|
+
validates_presence_of :password_confirmation, :if => :password_required?
|
63
|
+
validates_length_of :password, :within => 4..40, :if => :password_required?
|
64
|
+
validates_confirmation_of :password, :if => :password_required?
|
65
|
+
validates_length_of :login, :within => 3..40
|
66
|
+
validates_length_of :email, :within => 3..100
|
67
|
+
validates_uniqueness_of :login, :email, :case_sensitive => false
|
68
|
+
validates_uniqueness_of :password_reset_key, :if => Proc.new{|m| !m.password_reset_key.nil?}
|
69
|
+
|
70
|
+
|
71
|
+
before_save :encrypt_password
|
72
|
+
before_validation :set_login
|
73
|
+
before_create :make_activation_code
|
74
|
+
after_create :send_signup_notification
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end # DefaultModelSetup
|
78
|
+
|
79
|
+
end # ActiveRecord
|
80
|
+
end # Adapter
|
81
|
+
end # MerbAuth
|