refinerycms-authentication-devise 1.0.0
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.
- checksums.yaml +7 -0
- data/.gitignore +89 -0
- data/.travis.yml +15 -0
- data/Gemfile +50 -0
- data/Rakefile +20 -0
- data/app/controllers/refinery/authentication/devise/admin/users_controller.rb +147 -0
- data/app/controllers/refinery/authentication/devise/passwords_controller.rb +58 -0
- data/app/controllers/refinery/authentication/devise/sessions_controller.rb +39 -0
- data/app/controllers/refinery/authentication/devise/users_controller.rb +50 -0
- data/app/decorators/controllers/action_controller_base_decorator.rb +25 -0
- data/app/decorators/controllers/refinery/admin_controller_decorator.rb +20 -0
- data/app/decorators/controllers/refinery/application_controller_decorator.rb +7 -0
- data/app/mailers/refinery/authentication/devise/user_mailer.rb +26 -0
- data/app/models/refinery/authentication/devise/nil_user.rb +31 -0
- data/app/models/refinery/authentication/devise/role.rb +22 -0
- data/app/models/refinery/authentication/devise/roles_users.rb +12 -0
- data/app/models/refinery/authentication/devise/user.rb +166 -0
- data/app/models/refinery/authentication/devise/user_plugin.rb +11 -0
- data/app/views/refinery/authentication/devise/admin/users/_actions.html.erb +7 -0
- data/app/views/refinery/authentication/devise/admin/users/_form.html.erb +94 -0
- data/app/views/refinery/authentication/devise/admin/users/_records.html.erb +10 -0
- data/app/views/refinery/authentication/devise/admin/users/_user.html.erb +23 -0
- data/app/views/refinery/authentication/devise/admin/users/_users.html.erb +4 -0
- data/app/views/refinery/authentication/devise/admin/users/edit.html.erb +1 -0
- data/app/views/refinery/authentication/devise/admin/users/index.html.erb +6 -0
- data/app/views/refinery/authentication/devise/admin/users/new.html.erb +1 -0
- data/app/views/refinery/authentication/devise/passwords/edit.html.erb +26 -0
- data/app/views/refinery/authentication/devise/passwords/new.html.erb +17 -0
- data/app/views/refinery/authentication/devise/sessions/new.html.erb +27 -0
- data/app/views/refinery/authentication/devise/user_mailer/reset_notification.html.erb +12 -0
- data/app/views/refinery/authentication/devise/user_mailer/reset_notification.text.plain.erb +7 -0
- data/app/views/refinery/authentication/devise/users/new.html.erb +29 -0
- data/app/views/refinery/layouts/login.html.erb +22 -0
- data/bin/rails +5 -0
- data/bin/rake +21 -0
- data/bin/rspec +22 -0
- data/bin/spring +18 -0
- data/config/locales/bg.yml +73 -0
- data/config/locales/ca.yml +75 -0
- data/config/locales/cs.yml +77 -0
- data/config/locales/da.yml +73 -0
- data/config/locales/de.yml +73 -0
- data/config/locales/el.yml +73 -0
- data/config/locales/en.yml +77 -0
- data/config/locales/es.yml +73 -0
- data/config/locales/fi.yml +73 -0
- data/config/locales/fr.yml +73 -0
- data/config/locales/hu.yml +73 -0
- data/config/locales/it.yml +77 -0
- data/config/locales/ja.yml +73 -0
- data/config/locales/ko.yml +73 -0
- data/config/locales/lt.yml +56 -0
- data/config/locales/lv.yml +73 -0
- data/config/locales/nb.yml +73 -0
- data/config/locales/nl.yml +77 -0
- data/config/locales/pl.yml +73 -0
- data/config/locales/pt-BR.yml +69 -0
- data/config/locales/pt.yml +73 -0
- data/config/locales/rs.yml +73 -0
- data/config/locales/ru.yml +70 -0
- data/config/locales/sk.yml +73 -0
- data/config/locales/sl.yml +62 -0
- data/config/locales/sv.yml +65 -0
- data/config/locales/tr.yml +73 -0
- data/config/locales/uk.yml +71 -0
- data/config/locales/vi.yml +73 -0
- data/config/locales/zh-CN.yml +73 -0
- data/config/locales/zh-TW.yml +74 -0
- data/config/routes.rb +49 -0
- data/db/migrate/20100913234705_create_refinerycms_authentication_schema.rb +43 -0
- data/db/migrate/20120301234455_add_slug_to_refinery_users.rb +7 -0
- data/db/migrate/20130805143059_add_full_name_to_refinery_users.rb +5 -0
- data/db/migrate/20150503125200_rename_tables_to_new_namespace.rb +17 -0
- data/lib/generators/refinery/authentication/devise/generator.rb +18 -0
- data/lib/generators/refinery/authentication/devise/templates/config/initializers/refinery/authentication/devise.rb.erb +8 -0
- data/lib/refinery/authentication/devise/authorisation_adapter.rb +36 -0
- data/lib/refinery/authentication/devise/authorisation_manager.rb +30 -0
- data/lib/refinery/authentication/devise/configuration.rb +22 -0
- data/lib/refinery/authentication/devise/engine.rb +43 -0
- data/lib/refinery/authentication/devise/initialiser.rb +228 -0
- data/lib/refinery/authentication/devise/system.rb +63 -0
- data/lib/refinery/authentication/devise.rb +26 -0
- data/lib/refinerycms-authentication-devise.rb +1 -0
- data/license.md +21 -0
- data/readme.md +11 -0
- data/refinerycms-authentication-devise.gemspec +22 -0
- data/spec/controllers/refinery/authentication/devise/admin/users_controller_spec.rb +90 -0
- data/spec/factories/user.rb +27 -0
- data/spec/features/refinery/authentication/devise/admin/users_spec.rb +88 -0
- data/spec/features/refinery/authentication/devise/passwords_spec.rb +71 -0
- data/spec/features/refinery/authentication/devise/sessions_spec.rb +103 -0
- data/spec/lib/refinery/authentication/devise/configuration_spec.rb +41 -0
- data/spec/models/refinery/user_spec.rb +285 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/support/refinery/authentication/devise/controller_macros.rb +48 -0
- data/spec/support/refinery/authentication/devise/feature_macros.rb +26 -0
- data/tasks/rspec.rake +4 -0
- metadata +225 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
require 'devise'
|
|
2
|
+
require 'friendly_id'
|
|
3
|
+
|
|
4
|
+
module Refinery
|
|
5
|
+
module Authentication
|
|
6
|
+
module Devise
|
|
7
|
+
class User < Refinery::Core::BaseModel
|
|
8
|
+
|
|
9
|
+
extend FriendlyId
|
|
10
|
+
|
|
11
|
+
has_and_belongs_to_many :roles, join_table: :refinery_authentication_devise_roles_users
|
|
12
|
+
|
|
13
|
+
has_many :plugins, -> { order('position ASC') },
|
|
14
|
+
class_name: "Refinery::Authentication::Devise::UserPlugin", dependent: :destroy
|
|
15
|
+
|
|
16
|
+
friendly_id :username, use: [:slugged]
|
|
17
|
+
|
|
18
|
+
# Include default devise modules. Others available are:
|
|
19
|
+
# :token_authenticatable, :confirmable, :lockable and :timeoutable
|
|
20
|
+
if self.respond_to?(:devise)
|
|
21
|
+
devise :database_authenticatable, :registerable, :recoverable, :rememberable,
|
|
22
|
+
:trackable, :validatable, authentication_keys: [:login]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Setup accessible (or protected) attributes for your model
|
|
26
|
+
# :login is a virtual attribute for authenticating by either username or email
|
|
27
|
+
# This is in addition to a real persisted field like 'username'
|
|
28
|
+
attr_accessor :login
|
|
29
|
+
|
|
30
|
+
validates :username, presence: true, uniqueness: true
|
|
31
|
+
before_validation :downcase_username, :strip_username
|
|
32
|
+
|
|
33
|
+
class << self
|
|
34
|
+
# Find user by email or username.
|
|
35
|
+
# https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign_in-using-their-username-or-email-address
|
|
36
|
+
def find_for_database_authentication(conditions)
|
|
37
|
+
value = conditions[authentication_keys.first]
|
|
38
|
+
where(["username = :value OR email = :value", { value: value }]).first
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def find_or_initialize_with_error_by_reset_password_token(original_token)
|
|
42
|
+
find_or_initialize_with_error_by :reset_password_token,
|
|
43
|
+
::Devise.token_generator.digest(self, :reset_password_token, original_token)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Call devise reset function, taken from
|
|
48
|
+
# https://github.com/plataformatec/devise/blob/v3.2.4/lib/devise/models/recoverable.rb#L45-L56
|
|
49
|
+
def generate_reset_password_token!
|
|
50
|
+
raw, enc = ::Devise.token_generator.generate(self.class, :reset_password_token)
|
|
51
|
+
update_attributes(
|
|
52
|
+
:reset_password_token => enc,
|
|
53
|
+
:reset_password_sent_at => Time.now.utc
|
|
54
|
+
)
|
|
55
|
+
raw
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def plugins=(plugin_names)
|
|
59
|
+
return :can_not_set_plugins_when_not_persisted unless persisted?
|
|
60
|
+
|
|
61
|
+
filtered_names = filter_existing_plugins_for(string_plugin_names(plugin_names))
|
|
62
|
+
create_plugins_for(filtered_names)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def active_plugins
|
|
66
|
+
@active_plugins ||= Refinery::Plugins.new(
|
|
67
|
+
Refinery::Plugins.registered.select do |plugin|
|
|
68
|
+
has_role?(:superuser) || authorised_plugins.include?(plugin.name)
|
|
69
|
+
end
|
|
70
|
+
)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def authorised_plugins
|
|
74
|
+
plugins.collect(&:name) | ::Refinery::Plugins.always_allowed.names
|
|
75
|
+
end
|
|
76
|
+
alias_method :authorized_plugins, :authorised_plugins
|
|
77
|
+
|
|
78
|
+
# Returns a URL to the first plugin with a URL in the menu. Used for
|
|
79
|
+
# admin user's root admin url.
|
|
80
|
+
# See Refinery::Core::NilUser#landing_url.
|
|
81
|
+
def landing_url
|
|
82
|
+
active_plugins.in_menu.first_url_in_menu
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def can_delete?(user_to_delete = self)
|
|
86
|
+
user_to_delete.persisted? &&
|
|
87
|
+
!user_to_delete.has_role?(:superuser) &&
|
|
88
|
+
::Refinery::Authentication::Devise::Role[:refinery].users.any? &&
|
|
89
|
+
id != user_to_delete.id
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def can_edit?(user_to_edit = self)
|
|
93
|
+
user_to_edit.persisted? && (user_to_edit == self || self.has_role?(:superuser))
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def add_role(title)
|
|
97
|
+
raise ArgumentException, "Role should be the title of the role not a role object." if title.is_a?(::Refinery::Authentication::Devise::Role)
|
|
98
|
+
roles << ::Refinery::Authentication::Devise::Role[title] unless has_role?(title)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def has_role?(title)
|
|
102
|
+
raise ArgumentException, "Role should be the title of the role not a role object." if title.is_a?(::Refinery::Authentication::Devise::Role)
|
|
103
|
+
roles.any?{ |r| r.title == title.to_s.camelize}
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def create_first
|
|
107
|
+
if valid?
|
|
108
|
+
# first we need to save user
|
|
109
|
+
save
|
|
110
|
+
# add refinery role
|
|
111
|
+
add_role(:refinery)
|
|
112
|
+
# add superuser role if there are no other users
|
|
113
|
+
add_role(:superuser) if ::Refinery::Authentication::Devise::Role[:refinery].users.count == 1
|
|
114
|
+
# add plugins
|
|
115
|
+
self.plugins = Refinery::Plugins.registered.in_menu.names
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# return true/false based on validations
|
|
119
|
+
valid?
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def to_s
|
|
123
|
+
(full_name.presence || username).to_s
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
private
|
|
127
|
+
# To ensure uniqueness without case sensitivity we first downcase the username.
|
|
128
|
+
# We do this here and not in SQL is that it will otherwise bypass indexes using LOWER:
|
|
129
|
+
# SELECT 1 FROM "refinery_users" WHERE LOWER("refinery_users"."username") = LOWER('UsErNAME') LIMIT 1
|
|
130
|
+
def downcase_username
|
|
131
|
+
self.username = self.username.downcase if self.username?
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# To ensure that we aren't creating "admin" and "admin " as the same thing.
|
|
135
|
+
# Also ensures that "admin user" and "admin user" are the same thing.
|
|
136
|
+
def strip_username
|
|
137
|
+
self.username = self.username.strip.gsub(/\ {2,}/, ' ') if self.username?
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def string_plugin_names(plugin_names)
|
|
141
|
+
plugin_names.select{ |plugin_name| plugin_name.is_a?(String) }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def create_plugins_for(plugin_names)
|
|
145
|
+
plugin_names.each { |plugin_name| plugins.create name: plugin_name, position: plugin_position}
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def plugin_position
|
|
149
|
+
plugins.select(:position).map{ |p| p.position.to_i}.max.to_i + 1
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def filter_existing_plugins_for(plugin_names)
|
|
153
|
+
assigned_plugins = plugins.load
|
|
154
|
+
assigned_plugins.each do |assigned_plugin|
|
|
155
|
+
if plugin_names.include?(assigned_plugin.name)
|
|
156
|
+
plugin_names.delete(assigned_plugin.name)
|
|
157
|
+
else
|
|
158
|
+
assigned_plugin.destroy
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
plugin_names
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<%= form_for [refinery, :authentication, :devise, :admin, @user] do |f| %>
|
|
2
|
+
|
|
3
|
+
<%= render '/refinery/admin/error_messages',
|
|
4
|
+
:object => @user,
|
|
5
|
+
:include_object_name => true %>
|
|
6
|
+
|
|
7
|
+
<div class='field'>
|
|
8
|
+
<%= f.label :username %>
|
|
9
|
+
<%= f.text_field :username %>
|
|
10
|
+
</div>
|
|
11
|
+
<div class='field'>
|
|
12
|
+
<%= f.label :full_name %>
|
|
13
|
+
<%= f.text_field :full_name %>
|
|
14
|
+
</div>
|
|
15
|
+
<div class='field'>
|
|
16
|
+
<%= f.label :email %>
|
|
17
|
+
<%= f.text_field :email %>
|
|
18
|
+
</div>
|
|
19
|
+
<div class='field'>
|
|
20
|
+
<%= f.label :password %>
|
|
21
|
+
<%= f.password_field :password, :autocomplete => 'off' %>
|
|
22
|
+
<% if @user.persisted? %>
|
|
23
|
+
<br>
|
|
24
|
+
<%= content_tag(:span, t('.blank_password_keeps_current')) %>
|
|
25
|
+
<% end %>
|
|
26
|
+
</div>
|
|
27
|
+
<div class='field'>
|
|
28
|
+
<%= f.label :password_confirmation %>
|
|
29
|
+
<%= f.password_field :password_confirmation, :autocomplete => 'off' %>
|
|
30
|
+
</div>
|
|
31
|
+
<div class='field plugin_access'>
|
|
32
|
+
<span class='label_with_help'>
|
|
33
|
+
<%= f.label :plugin_access, t('.plugin_access'), :class => "title_label" %>
|
|
34
|
+
<%= link_to "(#{t('.enable_all')})", "", :id => "user_plugins_enable_all" %>
|
|
35
|
+
</span>
|
|
36
|
+
<ul id='plugins' class='checkboxes'>
|
|
37
|
+
<% @available_plugins.each do |plugin| -%>
|
|
38
|
+
<% if Refinery::Plugins.always_allowed.names.include?(plugin[:name]) or
|
|
39
|
+
(plugin[:name] == 'refinery_authentication_devise' && @user.id == current_refinery_user.id) %>
|
|
40
|
+
<%= hidden_field_tag 'user[plugins][]', plugin[:name],
|
|
41
|
+
:id => "plugins_#{plugin[:name]}" %>
|
|
42
|
+
<% else %>
|
|
43
|
+
<li>
|
|
44
|
+
<%= check_box_tag 'user[plugins][]', plugin[:name],
|
|
45
|
+
@selected_plugin_names.include?(plugin[:name]),
|
|
46
|
+
:id => "plugins_#{plugin[:name]}" %>
|
|
47
|
+
<%= f.label 'user[plugins][]',
|
|
48
|
+
t('title', :scope => "refinery.plugins.#{plugin[:name].downcase}", :default => plugin[:title]),
|
|
49
|
+
:class => "stripped",
|
|
50
|
+
:for => "plugins_#{plugin[:name]}" %>
|
|
51
|
+
</li>
|
|
52
|
+
<% end %>
|
|
53
|
+
<% end %>
|
|
54
|
+
</ul>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<% if current_refinery_user.has_role?(:superuser) && Refinery::Authentication::Devise.superuser_can_assign_roles %>
|
|
58
|
+
<div class='field role_access'>
|
|
59
|
+
<span class='label_with_help'>
|
|
60
|
+
<%= f.label :role_access, t('.role_access'), :class => "title_label" %>
|
|
61
|
+
</span>
|
|
62
|
+
<ul id='roles' class='checkboxes'>
|
|
63
|
+
<% @available_roles.each do |role|
|
|
64
|
+
downcased_title = (title = role[:title]).downcase -%>
|
|
65
|
+
<li>
|
|
66
|
+
<%= check_box_tag 'user[roles][]', downcased_title, @user.has_role?(title),
|
|
67
|
+
:id => "roles_#{downcased_title}" %>
|
|
68
|
+
<%= f.label 'user[roles][]',
|
|
69
|
+
t(downcased_title, :scope => 'refinery.authentication.devise.roles', :default => title),
|
|
70
|
+
:class => 'stripped',
|
|
71
|
+
:for => "roles_#{downcased_title}" %>
|
|
72
|
+
</li>
|
|
73
|
+
<% end %>
|
|
74
|
+
</ul>
|
|
75
|
+
</div>
|
|
76
|
+
<% end %>
|
|
77
|
+
|
|
78
|
+
<%= render '/refinery/admin/form_actions', :f => f,
|
|
79
|
+
:continue_editing => false,
|
|
80
|
+
:hide_delete => !current_refinery_user.can_delete?(@user),
|
|
81
|
+
:delete_title => t('delete', :scope => 'refinery.authentication.devise.admin.users'),
|
|
82
|
+
:delete_confirmation => t('message', :scope => 'refinery.authentication.devise.admin.delete', :title => @user.username) %>
|
|
83
|
+
<% end %>
|
|
84
|
+
|
|
85
|
+
<% content_for :javascripts do %>
|
|
86
|
+
<script>
|
|
87
|
+
$(document).ready(function() {
|
|
88
|
+
$('#user_plugins_enable_all').click(function(e, a) {
|
|
89
|
+
$('div.field.plugin_access ul#plugins li input:checkbox').prop('checked', true);
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
</script>
|
|
94
|
+
<% end %>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<%= render 'refinery/admin/search_header', :url => refinery.authentication_devise_admin_users_path %>
|
|
2
|
+
<% if @users.any? %>
|
|
3
|
+
<div class='pagination_container'>
|
|
4
|
+
<%= render 'users' %>
|
|
5
|
+
</div>
|
|
6
|
+
<% else %>
|
|
7
|
+
<p>
|
|
8
|
+
<%= t('no_results', :scope => 'refinery.authentication.devise.admin.search') %>
|
|
9
|
+
</p>
|
|
10
|
+
<% end %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<li id="sortable_<%= user.id %>" class='clearfix record <%= cycle("on", "on-hover") %>'>
|
|
2
|
+
<span class='title'>
|
|
3
|
+
<strong><%= user.username %></strong>
|
|
4
|
+
<span class="preview">
|
|
5
|
+
<%= t('.preview', :who => user.email, :created_at => l(user.created_at, :format => :short)) %>
|
|
6
|
+
</span>
|
|
7
|
+
</span>
|
|
8
|
+
<span class='actions'>
|
|
9
|
+
<%= mail_to user.email, refinery_icon_tag('email_go.png'),
|
|
10
|
+
:title => t('.email_user') %>
|
|
11
|
+
<%= link_to refinery_icon_tag('application_edit.png'),
|
|
12
|
+
refinery.edit_authentication_devise_admin_user_path(user),
|
|
13
|
+
:title => t('edit', :scope => 'refinery.authentication.devise.admin.users') if current_refinery_user.can_edit?(user) %>
|
|
14
|
+
<%= link_to refinery_icon_tag('delete.png'),
|
|
15
|
+
refinery.authentication_devise_admin_user_path(user),
|
|
16
|
+
:class => "cancel confirm-delete",
|
|
17
|
+
:title => t('delete', :scope => 'refinery.authentication.devise.admin.users'),
|
|
18
|
+
:method => :delete,
|
|
19
|
+
:data => {
|
|
20
|
+
:confirm => t('message', :scope => 'refinery.authentication.devise.admin.delete', :title => user.username)
|
|
21
|
+
} if current_refinery_user.can_delete?(user) %>
|
|
22
|
+
</span>
|
|
23
|
+
</li>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= render 'form' %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= render 'form' %>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<% content_for :header, t('pick_new_password_for', :scope => 'refinery.authentication.devise.users.reset', :email => resource.email) %>
|
|
2
|
+
|
|
3
|
+
<%= form_for resource, :as => resource_name,
|
|
4
|
+
:url => refinery.authentication_devise_user_password_path,
|
|
5
|
+
:html => { :method => :put } do |f| %>
|
|
6
|
+
<%= f.hidden_field :reset_password_token, :value => @reset_password_token %>
|
|
7
|
+
|
|
8
|
+
<%= render '/refinery/admin/error_messages', :object => resource, :include_object_name => true %>
|
|
9
|
+
|
|
10
|
+
<div class='field'>
|
|
11
|
+
<%= f.label :password %>
|
|
12
|
+
<%= f.password_field :password, :class => 'larger widest' %>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class='field'>
|
|
16
|
+
<%= f.label :password_confirmation %>
|
|
17
|
+
<%= f.password_field :password_confirmation, :class => 'larger widest' %>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<%= render '/refinery/admin/form_actions', :f => f,
|
|
21
|
+
:continue_editing => false,
|
|
22
|
+
:submit_button_text => t('reset_password', :scope => 'refinery.authentication.devise.users.reset'),
|
|
23
|
+
:cancel_url => refinery.login_path,
|
|
24
|
+
:cancel_title => nil,
|
|
25
|
+
:hide_delete => true -%>
|
|
26
|
+
<% end -%>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<% content_for :header, t('enter_email_address', :scope => 'refinery.authentication.devise.users.forgot') %>
|
|
2
|
+
|
|
3
|
+
<%= form_for resource, :as => resource_name,
|
|
4
|
+
:url => refinery.authentication_devise_user_password_path,
|
|
5
|
+
:html => { :method => :post } do |f| %>
|
|
6
|
+
|
|
7
|
+
<div class='field'>
|
|
8
|
+
<%= f.text_field :email, :class => "larger widest",
|
|
9
|
+
:placeholder => t('email_address', :scope => 'refinery.authentication.devise.users.forgot') %>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<%= render '/refinery/admin/form_actions', :f => f,
|
|
13
|
+
:continue_editing => false,
|
|
14
|
+
:submit_button_text => t('reset_password', :scope => 'refinery.authentication.devise.users.forgot'),
|
|
15
|
+
:cancel_url => refinery.authentication_devise_user_session_path,
|
|
16
|
+
:cancel_title => nil -%>
|
|
17
|
+
<% end -%>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<% content_for :header, t('.hello_please_sign_in') %>
|
|
2
|
+
|
|
3
|
+
<%= form_for resource, :as => resource_name,
|
|
4
|
+
:url => refinery.authentication_devise_user_session_path do |f| %>
|
|
5
|
+
<div class='field session_username clearfix'>
|
|
6
|
+
<%= f.label :login %>
|
|
7
|
+
<%= f.text_field :login, :class => 'larger widest' %>
|
|
8
|
+
</div>
|
|
9
|
+
<div class='field session_password clearfix'>
|
|
10
|
+
<%= f.label :password %>
|
|
11
|
+
<%= f.password_field :password, :autocomplete => 'off', :class => 'larger widest' %>
|
|
12
|
+
</div>
|
|
13
|
+
<div class='clearfix'>
|
|
14
|
+
<% if devise_mapping.rememberable? %>
|
|
15
|
+
<div class='field remember_me'>
|
|
16
|
+
<%= f.check_box :remember_me %>
|
|
17
|
+
<%= f.label :remember_me %>
|
|
18
|
+
</div>
|
|
19
|
+
<% end %>
|
|
20
|
+
<div class='field forgot_password'>
|
|
21
|
+
<%= link_to t('.forgot_password'), refinery.new_authentication_devise_user_password_path %>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
<%= render '/refinery/admin/form_actions', :f => f,
|
|
25
|
+
:submit_button_text => t('.sign_in'),
|
|
26
|
+
:hide_cancel => true %>
|
|
27
|
+
<% end -%>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<p>
|
|
2
|
+
<%= t('reset_request_received_for', :scope => 'refinery.authentication.devise.user_mailer.reset_notification', :username => @user.username) %>
|
|
3
|
+
</p>
|
|
4
|
+
<p>
|
|
5
|
+
<%= t('visit_this_url', :scope => 'refinery.authentication.devise.user_mailer.reset_notification') %>:
|
|
6
|
+
</p>
|
|
7
|
+
<p>
|
|
8
|
+
<%= @url %>
|
|
9
|
+
</p>
|
|
10
|
+
<p>
|
|
11
|
+
(<%= t('remain_same_if_no_action', :scope => 'refinery.authentication.devise.user_mailer.reset_notification') %>)
|
|
12
|
+
</p>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<%= t('reset_request_received_for', :scope => 'refinery.authentication.devise.user_mailer.reset_notification', :username => @user.username) %>
|
|
2
|
+
|
|
3
|
+
<%= t('visit_this_url', :scope => 'refinery.authentication.devise.user_mailer.reset_notification') %>:
|
|
4
|
+
|
|
5
|
+
<%= @url %>
|
|
6
|
+
|
|
7
|
+
(<%= t('remain_same_if_no_action', :scope => 'refinery.authentication.devise.user_mailer.reset_notification') %>)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<% content_for :header, t('there_are_no_users', :scope => 'refinery.welcome') %>
|
|
2
|
+
|
|
3
|
+
<%= form_for :user, :url => refinery.signup_path do |f| -%>
|
|
4
|
+
|
|
5
|
+
<%= render '/refinery/admin/error_messages', :object => @user, :include_object_name => true %>
|
|
6
|
+
|
|
7
|
+
<div class='field'>
|
|
8
|
+
<%= f.label :username %>
|
|
9
|
+
<%= f.text_field :username, :class => 'larger widest' %>
|
|
10
|
+
</div>
|
|
11
|
+
<div class='field'>
|
|
12
|
+
<%= f.label :email %>
|
|
13
|
+
<%= f.text_field :email, :class => 'larger widest' %>
|
|
14
|
+
</div>
|
|
15
|
+
<div class='field'>
|
|
16
|
+
<%= f.label :password %>
|
|
17
|
+
<%= f.password_field :password, :class => 'larger widest' %>
|
|
18
|
+
</div>
|
|
19
|
+
<div class='field'>
|
|
20
|
+
<%= f.label :password_confirmation %>
|
|
21
|
+
<%= f.password_field :password_confirmation, :class => 'larger widest' %>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<%= render '/refinery/admin/form_actions', :f => f,
|
|
25
|
+
:submit_continue => false,
|
|
26
|
+
:submit_button_text => t('.sign_up'),
|
|
27
|
+
:hide_delete => true,
|
|
28
|
+
:hide_cancel => true %>
|
|
29
|
+
<% end -%>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<%= render '/refinery/html_tag' %>
|
|
3
|
+
<%= render '/refinery/admin/head' %>
|
|
4
|
+
<body class='login <%= I18n.locale %>'>
|
|
5
|
+
<div id='tooltip_container'></div>
|
|
6
|
+
<div id="login_container" class="clearfix">
|
|
7
|
+
<header>
|
|
8
|
+
<h1><%= yield :header %></h1>
|
|
9
|
+
</header>
|
|
10
|
+
<div id="page_container">
|
|
11
|
+
<div id="page">
|
|
12
|
+
<div id="content" class="clearfix">
|
|
13
|
+
<div id="flash_container">
|
|
14
|
+
<%= render '/refinery/message' %>
|
|
15
|
+
</div>
|
|
16
|
+
<%= yield %>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</body>
|
|
22
|
+
</html>
|
data/bin/rails
ADDED
data/bin/rake
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# This file was generated by Bundler.
|
|
4
|
+
#
|
|
5
|
+
# The application 'rake' is installed as part of a gem, and
|
|
6
|
+
# this file is here to facilitate running it.
|
|
7
|
+
#
|
|
8
|
+
begin
|
|
9
|
+
if Dir.exist?(File.expand_path('../../spec/dummy', __FILE__))
|
|
10
|
+
load File.expand_path("../spring", __FILE__)
|
|
11
|
+
end
|
|
12
|
+
rescue LoadError
|
|
13
|
+
end
|
|
14
|
+
require 'pathname'
|
|
15
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
|
16
|
+
Pathname.new(__FILE__).realpath)
|
|
17
|
+
|
|
18
|
+
require 'rubygems'
|
|
19
|
+
require 'bundler/setup'
|
|
20
|
+
|
|
21
|
+
load Gem.bin_path('rake', 'rake')
|
data/bin/rspec
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# This file was generated by Bundler.
|
|
4
|
+
#
|
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
|
6
|
+
# this file is here to facilitate running it.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
begin
|
|
10
|
+
if Dir.exist?(File.expand_path('../../spec/dummy', __FILE__))
|
|
11
|
+
load File.expand_path("../spring", __FILE__)
|
|
12
|
+
end
|
|
13
|
+
rescue LoadError
|
|
14
|
+
end
|
|
15
|
+
require 'pathname'
|
|
16
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
|
17
|
+
Pathname.new(__FILE__).realpath)
|
|
18
|
+
|
|
19
|
+
require 'rubygems'
|
|
20
|
+
require 'bundler/setup'
|
|
21
|
+
|
|
22
|
+
load Gem.bin_path('rspec-core', 'rspec')
|
data/bin/spring
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# This file loads spring without using Bundler, in order to be fast
|
|
4
|
+
# It gets overwritten when you run the `spring binstub` command
|
|
5
|
+
|
|
6
|
+
unless defined?(Spring)
|
|
7
|
+
require "rubygems"
|
|
8
|
+
require "bundler"
|
|
9
|
+
|
|
10
|
+
if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)
|
|
11
|
+
ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
|
|
12
|
+
ENV["GEM_HOME"] = ""
|
|
13
|
+
Gem.paths = ENV
|
|
14
|
+
|
|
15
|
+
gem "spring", match[1]
|
|
16
|
+
require "spring/binstub"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
bg:
|
|
2
|
+
refinery:
|
|
3
|
+
plugins:
|
|
4
|
+
refinery_authentication_devise:
|
|
5
|
+
title: Потребители
|
|
6
|
+
description: Управление на потребители
|
|
7
|
+
authentication:
|
|
8
|
+
devise:
|
|
9
|
+
admin:
|
|
10
|
+
users:
|
|
11
|
+
delete: Изтриване на този потребител завинаги
|
|
12
|
+
edit: Редактиране на този потребител
|
|
13
|
+
update:
|
|
14
|
+
lockout_prevented: Не можете да премахнете добавката "Потребители" чрез потребителя, с който сте влезли в момента в системата.
|
|
15
|
+
form:
|
|
16
|
+
blank_password_keeps_current: При празно поле текущата парола ще бъде запазена
|
|
17
|
+
plugin_access: Достъп до добавки
|
|
18
|
+
role_access: Достъп до роли
|
|
19
|
+
enable_all: разрешаване на всички
|
|
20
|
+
actions:
|
|
21
|
+
create_new_user: Добавяне на нов потребител
|
|
22
|
+
user:
|
|
23
|
+
email_user: Изпращане на е-поща до този потребител
|
|
24
|
+
preview: '(%{who}) добавен на %{created_at}'
|
|
25
|
+
sessions:
|
|
26
|
+
new:
|
|
27
|
+
hello_please_sign_in: Здравейте! Моля, влезте в системата.
|
|
28
|
+
sign_in: Вход
|
|
29
|
+
forgot_password: Забравена парола
|
|
30
|
+
user_mailer:
|
|
31
|
+
reset_notification:
|
|
32
|
+
subject: Връзка за смяна на Вашата парола
|
|
33
|
+
reset_request_received_for: "Получена е заявка за смяна на паролата на %{username}"
|
|
34
|
+
visit_this_url: Моля, посетете следния уеб адрес за въвеждане на нова парола
|
|
35
|
+
remain_same_if_no_action: Вашата парола ще остане непроменена, ако не предприемете никакви действия
|
|
36
|
+
users:
|
|
37
|
+
new:
|
|
38
|
+
fill_form: За начало, моля попълнете Вашите данни в полетата по-долу.
|
|
39
|
+
sign_up: Регистрация
|
|
40
|
+
create:
|
|
41
|
+
welcome: 'Добре дошли в Refinery, %{who}'
|
|
42
|
+
forgot:
|
|
43
|
+
email_address: Е-поща
|
|
44
|
+
enter_email_address: Моля, въведете адреса на е-пощата на Вашия потребител.
|
|
45
|
+
reset_password: Смяна на парола
|
|
46
|
+
blank_email: Не сте въвели адрес на е-поща.
|
|
47
|
+
email_not_associated_with_account_html: 'За съжаление, "%{email}" не принадлежи на нито един потребител.<br />Сигурни ли сте, че въведохте точния адрес?'
|
|
48
|
+
email_reset_sent: До Вас бе изпратена е-поща, съдържаща връзка за смяна на паролата Ви.
|
|
49
|
+
password_encryption: Налага се да смените Вашата парола, тъй като метода за криптиране на пароли в Refinery бе променен. Чрез новия метод паролите се съхраняват по-сигурно отпреди.
|
|
50
|
+
reset:
|
|
51
|
+
successful: 'Паролата бе успешно сменена за "%{email}"'
|
|
52
|
+
pick_new_password_for: "Моля, изберете нова парола за %{email}"
|
|
53
|
+
reset_password: Смяна на парола
|
|
54
|
+
roles:
|
|
55
|
+
superuser: Привилегирован потребител
|
|
56
|
+
refinery: Refinery
|
|
57
|
+
devise:
|
|
58
|
+
failure:
|
|
59
|
+
unauthenticated: Трябва да влезете в системата преди да продължите.
|
|
60
|
+
invalid: "За съжаление сте въвели грешно потребителско име или парола."
|
|
61
|
+
sessions:
|
|
62
|
+
signed_in: Успешен вход в системата.
|
|
63
|
+
activerecord:
|
|
64
|
+
models:
|
|
65
|
+
refinery/authentication/devise/user: потребител
|
|
66
|
+
attributes:
|
|
67
|
+
refinery/authentication/devise/user:
|
|
68
|
+
login: Вход
|
|
69
|
+
username: Потребителско име
|
|
70
|
+
password: Парола
|
|
71
|
+
password_confirmation: Потвърждение на паролата
|
|
72
|
+
email: Е-поща
|
|
73
|
+
remember_me: Запомняне на данните за вход
|