refinerycms-authentication 2.0.10 → 2.1.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/refinery/admin/users_controller.rb +82 -54
  3. data/app/controllers/refinery/passwords_controller.rb +1 -1
  4. data/app/controllers/refinery/users_controller.rb +1 -1
  5. data/app/models/refinery/user.rb +28 -9
  6. data/app/views/refinery/admin/users/_actions.html.erb +3 -0
  7. data/app/views/refinery/admin/users/_form.html.erb +6 -4
  8. data/app/views/refinery/admin/users/_records.html.erb +7 -0
  9. data/app/views/refinery/passwords/edit.html.erb +1 -1
  10. data/app/views/refinery/users/new.html.erb +1 -1
  11. data/config/locales/bg.yml +1 -1
  12. data/config/locales/cs.yml +3 -3
  13. data/config/locales/da.yml +1 -1
  14. data/config/locales/de.yml +1 -1
  15. data/config/locales/el.yml +1 -1
  16. data/config/locales/en.yml +3 -2
  17. data/config/locales/es.yml +1 -1
  18. data/config/locales/fi.yml +1 -1
  19. data/config/locales/fr.yml +1 -1
  20. data/config/locales/hu.yml +72 -0
  21. data/config/locales/it.yml +1 -1
  22. data/config/locales/ja.yml +1 -1
  23. data/config/locales/ko.yml +2 -2
  24. data/config/locales/lt.yml +1 -1
  25. data/config/locales/lv.yml +1 -1
  26. data/config/locales/nb.yml +1 -1
  27. data/config/locales/nl.yml +37 -35
  28. data/config/locales/pl.yml +7 -3
  29. data/config/locales/pt-BR.yml +1 -1
  30. data/config/locales/pt.yml +72 -0
  31. data/config/locales/rs.yml +1 -1
  32. data/config/locales/ru.yml +1 -1
  33. data/config/locales/sk.yml +9 -9
  34. data/config/locales/sl.yml +1 -1
  35. data/config/locales/sv.yml +1 -1
  36. data/config/locales/tr.yml +72 -0
  37. data/config/locales/uk.yml +98 -0
  38. data/config/locales/vi.yml +1 -1
  39. data/config/locales/zh-CN.yml +5 -5
  40. data/config/locales/zh-TW.yml +1 -1
  41. data/config/routes.rb +9 -11
  42. data/db/migrate/20120301234455_add_slug_to_refinery_users.rb +7 -0
  43. data/lib/refinery/authenticated_system.rb +1 -1
  44. data/lib/refinery/authentication.rb +1 -0
  45. data/lib/refinery/authentication/devise.rb +0 -7
  46. data/lib/refinery/authentication/engine.rb +3 -4
  47. data/refinerycms-authentication.gemspec +4 -4
  48. data/spec/controllers/refinery/admin/users_controller_spec.rb +14 -5
  49. data/spec/factories/user.rb +2 -2
  50. data/spec/{requests → features}/refinery/admin/users_spec.rb +10 -10
  51. data/spec/{requests → features}/refinery/passwords_spec.rb +1 -1
  52. data/spec/{requests → features}/refinery/sessions_spec.rb +12 -11
  53. data/spec/models/refinery/user_spec.rb +57 -10
  54. metadata +29 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 240da4d27a713a4b948f356018480a9da60606e7
4
- data.tar.gz: 43891d48f2ab2b1e45aeb98dbed2394f794a186c
3
+ metadata.gz: e10d50b46b093530d9a2411b4ed0ad58fef167e9
4
+ data.tar.gz: 75c0cb210cc8b10a3d610440b0e230592a738203
5
5
  SHA512:
6
- metadata.gz: 57643506ed99f7b5e933b47ec4bc9a36aacf2acf4145b1b85c0a121c88cb38214b4574f327f030ff8e2fb88408efcff8bf2dba280b88a9d36469ca7b86a2b6fe
7
- data.tar.gz: 9e07f93f3dc9c1017c37609852bf7fc7beb490da7dace0c219ef46cbf8c6de377c78423d07042882254c5e76f1fd5ee240911d60c8335db723b69a1bf8fabfae
6
+ metadata.gz: 5df94292c59ba79fc7fb1b1d2434c3d3c46d739d7e7e9ee50d0de7080a187b1c5743918f7bd47eefbc0c209f0b1dd6b4238f7749974f5bb0668e0b983420ffa6
7
+ data.tar.gz: 3b2665aa68871310a69e79e2d047317e486a2880df406342acc1ff051395eb16eb90d6d98e299f54bc572c29e995565296d0def2746121c9b90287d58d47d87b
@@ -7,7 +7,10 @@ module Refinery
7
7
  :title_attribute => 'username',
8
8
  :xhr_paging => true
9
9
 
10
- before_filter :load_available_plugins_and_roles, :only => [:new, :create, :edit, :update]
10
+ before_filter :find_available_plugins, :find_available_roles,
11
+ :only => [:new, :create, :edit, :update]
12
+ before_filter :redirect_unless_user_editable!, :only => [:edit, :update]
13
+ before_filter :exclude_password_assignment_when_blank!, :only => :update
11
14
 
12
15
  def new
13
16
  @user = Refinery::User.new
@@ -15,92 +18,117 @@ module Refinery
15
18
  end
16
19
 
17
20
  def create
18
- @user = Refinery::User.new(params[:user].except(:roles))
21
+ @user = Refinery::User.new params[:user].except(:roles)
19
22
  @selected_plugin_names = params[:user][:plugins] || []
20
23
  @selected_role_names = params[:user][:roles] || []
21
24
 
22
25
  if @user.save
23
- @user.plugins = @selected_plugin_names
24
- # if the user is a superuser and can assign roles according to this site's
25
- # settings then the roles are set with the POST data.
26
- unless current_refinery_user.has_role?(:superuser) and Refinery::Authentication.superuser_can_assign_roles
27
- @user.add_role(:refinery)
28
- else
29
- @user.roles = @selected_role_names.collect { |r| Refinery::Role[r.downcase.to_sym] }
30
- end
31
-
32
- redirect_to refinery.admin_users_path,
33
- :notice => t('created', :what => @user.username, :scope => 'refinery.crudify')
26
+ create_successful
34
27
  else
35
- render :action => 'new'
28
+ create_failed
36
29
  end
37
30
  end
38
31
 
39
32
  def edit
40
- redirect_unless_user_editable!
41
-
42
- @selected_plugin_names = @user.plugins.collect(&:name)
33
+ @selected_plugin_names = find_user.plugins.map(&:name)
43
34
  end
44
35
 
45
36
  def update
46
- redirect_unless_user_editable!
47
-
48
37
  # Store what the user selected.
49
38
  @selected_role_names = params[:user].delete(:roles) || []
50
- unless current_refinery_user.has_role?(:superuser) and Refinery::Authentication.superuser_can_assign_roles
51
- @selected_role_names = @user.roles.collect(&:title)
52
- end
39
+ @selected_role_names = @user.roles.select(:title).map(&:title) unless user_can_assign_roles?
53
40
  @selected_plugin_names = params[:user][:plugins]
54
41
 
55
- # Prevent the current user from locking themselves out of the User manager
56
- if current_refinery_user.id == @user.id and (params[:user][:plugins].exclude?("refinery_users") || @selected_role_names.map(&:downcase).exclude?("refinery"))
57
- flash.now[:error] = t('cannot_remove_user_plugin_from_current_user', :scope => 'refinery.admin.users.update')
58
- render :edit
42
+ if user_is_locking_themselves_out?
43
+ flash.now[:error] = t('lockout_prevented', :scope => 'refinery.admin.users.update')
44
+ render :edit and return
45
+ end
46
+
47
+ store_user_memento
48
+
49
+ @user.roles = @selected_role_names.map { |r| Refinery::Role[r.downcase] }
50
+ if @user.update_attributes params[:user]
51
+ update_successful
59
52
  else
60
- # Store the current plugins and roles for this user.
61
- @previously_selected_plugin_names = @user.plugins.collect(&:name)
62
- @previously_selected_roles = @user.roles
63
- @user.roles = @selected_role_names.collect { |r| Refinery::Role[r.downcase.to_sym] }
64
- if params[:user][:password].blank? and params[:user][:password_confirmation].blank?
65
- params[:user].except!(:password, :password_confirmation)
66
- end
67
-
68
- if @user.update_attributes(params[:user])
69
- redirect_to refinery.admin_users_path,
70
- :notice => t('updated', :what => @user.username, :scope => 'refinery.crudify')
71
- else
72
- @user.plugins = @previously_selected_plugin_names
73
- @user.roles = @previously_selected_roles
74
- @user.save
75
- render :edit
76
- end
53
+ update_failed
77
54
  end
78
55
  end
79
56
 
80
- protected
57
+ protected
58
+ def create_successful
59
+ @user.plugins = @selected_plugin_names
81
60
 
82
- def find_user_with_slug
83
- begin
84
- find_user_without_slug
85
- rescue ActiveRecord::RecordNotFound
86
- @user = Refinery::User.all.detect{|u| u.to_param == params[:id]}
61
+ # if the user is a superuser and can assign roles according to this site's
62
+ # settings then the roles are set with the POST data.
63
+ if user_can_assign_roles?
64
+ @user.roles = @selected_role_names.map { |r| Refinery::Role[r.downcase] }
65
+ else
66
+ @user.add_role :refinery
87
67
  end
68
+
69
+ redirect_to refinery.admin_users_path,
70
+ :notice => t('created', :what => @user.username, :scope => 'refinery.crudify')
71
+ end
72
+
73
+ def create_failed
74
+ render :action => 'new'
88
75
  end
89
- alias_method_chain :find_user, :slug
90
76
 
91
- def load_available_plugins_and_roles
92
- @available_plugins = Refinery::Plugins.registered.in_menu.collect { |a|
77
+ def update_successful
78
+ redirect_to refinery.admin_users_path,
79
+ :notice => t('updated', :what => @user.username, :scope => 'refinery.crudify')
80
+ end
81
+
82
+ def update_failed
83
+ user_memento_rollback!
84
+
85
+ render :edit
86
+ end
87
+
88
+ def find_available_plugins
89
+ @available_plugins = Refinery::Plugins.registered.in_menu.map { |a|
93
90
  { :name => a.name, :title => a.title }
94
91
  }.sort_by { |a| a[:title] }
92
+ end
95
93
 
94
+ def find_available_roles
96
95
  @available_roles = Refinery::Role.all
97
96
  end
98
97
 
99
98
  def redirect_unless_user_editable!
100
- unless current_refinery_user.can_edit?(@user)
101
- redirect_to(main_app.refinery_admin_users_path) and return
99
+ redirect_to refinery.admin_users_path unless current_refinery_user.can_edit? find_user
100
+ end
101
+
102
+ private
103
+ def exclude_password_assignment_when_blank!
104
+ if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
105
+ params[:user].except!(:password, :password_confirmation)
102
106
  end
103
107
  end
108
+
109
+ def user_can_assign_roles?
110
+ Refinery::Authentication.superuser_can_assign_roles &&
111
+ current_refinery_user.has_role?(:superuser)
112
+ end
113
+
114
+ def user_is_locking_themselves_out?
115
+ return false if current_refinery_user.id != @user.id || @selected_plugin_names.blank?
116
+
117
+ @selected_plugin_names.exclude?('refinery_users') || # removing user plugin access
118
+ @selected_role_names.map(&:downcase).exclude?('refinery') # Or we're removing the refinery role
119
+ end
120
+
121
+ def store_user_memento
122
+ # Store the current plugins and roles for this user.
123
+ @previously_selected_plugin_names = @user.plugins.map(&:name)
124
+ @previously_selected_roles = @user.roles
125
+ end
126
+
127
+ def user_memento_rollback!
128
+ @user.plugins = @previously_selected_plugin_names
129
+ @user.roles = @previously_selected_roles
130
+ @user.save
131
+ end
104
132
  end
105
133
  end
106
134
  end
@@ -36,7 +36,7 @@ module Refinery
36
36
  # Call devise reset function.
37
37
  user.send(:generate_reset_password_token!)
38
38
  UserMailer.reset_notification(user, request).deliver
39
- redirect_to refinery.new_refinery_user_session_path,
39
+ redirect_to refinery.login_path,
40
40
  :notice => t('email_reset_sent', :scope => 'refinery.users.forgot')
41
41
  else
42
42
  flash.now[:error] = if (email = params[:refinery_user][:email]).blank?
@@ -31,7 +31,7 @@ module Refinery
31
31
  if refinery_user?
32
32
  redirect_to refinery.admin_users_path
33
33
  elsif refinery_users_exist?
34
- redirect_to refinery.new_refinery_user_session_path
34
+ redirect_to refinery.login_path
35
35
  end
36
36
  end
37
37
 
@@ -8,7 +8,7 @@ module Refinery
8
8
  has_and_belongs_to_many :roles, :join_table => :refinery_roles_users
9
9
 
10
10
  has_many :plugins, :class_name => "UserPlugin", :order => "position ASC", :dependent => :destroy
11
- friendly_id :username
11
+ friendly_id :username, :use => [:slugged]
12
12
 
13
13
  # Include default devise modules. Others available are:
14
14
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
@@ -24,7 +24,7 @@ module Refinery
24
24
  attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :plugins, :login
25
25
 
26
26
  validates :username, :presence => true, :uniqueness => true
27
- before_validation :downcase_username
27
+ before_validation :downcase_username, :strip_username
28
28
 
29
29
  class << self
30
30
  # Find user by email or username.
@@ -36,11 +36,28 @@ module Refinery
36
36
  end
37
37
 
38
38
  def plugins=(plugin_names)
39
- if persisted? # don't add plugins when the user_id is nil.
40
- UserPlugin.delete_all(:user_id => id)
39
+ return unless persisted?
41
40
 
41
+ plugin_names = plugin_names.dup
42
+ plugin_names.reject! { |plugin_name| !plugin_name.is_a?(String) }
43
+
44
+ if plugins.empty?
42
45
  plugin_names.each_with_index do |plugin_name, index|
43
- plugins.create(:name => plugin_name, :position => index) if plugin_name.is_a?(String)
46
+ plugins.create(:name => plugin_name, :position => index)
47
+ end
48
+ else
49
+ assigned_plugins = plugins.all
50
+ assigned_plugins.each do |assigned_plugin|
51
+ if plugin_names.include?(assigned_plugin.name)
52
+ plugin_names.delete(assigned_plugin.name)
53
+ else
54
+ assigned_plugin.destroy
55
+ end
56
+ end
57
+
58
+ plugin_names.each do |plugin_name|
59
+ plugins.create(:name => plugin_name,
60
+ :position => plugins.select(:position).map{|p| p.position.to_i}.max + 1)
44
61
  end
45
62
  end
46
63
  end
@@ -90,10 +107,6 @@ module Refinery
90
107
  username.to_s
91
108
  end
92
109
 
93
- def to_param
94
- to_s.parameterize
95
- end
96
-
97
110
  private
98
111
  # To ensure uniqueness without case sensitivity we first downcase the username.
99
112
  # We do this here and not in SQL is that it will otherwise bypass indexes using LOWER:
@@ -102,5 +115,11 @@ module Refinery
102
115
  self.username = self.username.downcase if self.username?
103
116
  end
104
117
 
118
+ # To ensure that we aren't creating "admin" and "admin " as the same thing.
119
+ # Also ensures that "admin user" and "admin user" are the same thing.
120
+ def strip_username
121
+ self.username = self.username.strip.gsub(/\ {2,}/, ' ') if self.username?
122
+ end
123
+
105
124
  end
106
125
  end
@@ -1,4 +1,7 @@
1
1
  <ul>
2
+ <li>
3
+ <%= render '/refinery/admin/search', :url => refinery.admin_users_path %>
4
+ </li>
2
5
  <li>
3
6
  <%= link_to t('.create_new_user'),
4
7
  refinery.new_admin_user_path, :class => "add_icon" %>
@@ -1,6 +1,8 @@
1
1
  <%= form_for [refinery, :admin, @user] do |f| %>
2
2
 
3
- <%= render '/refinery/admin/error_messages', :object => @user, :include_object_name => true %>
3
+ <%= render '/refinery/admin/error_messages',
4
+ :object => @user,
5
+ :include_object_name => true %>
4
6
 
5
7
  <div class='field'>
6
8
  <%= f.label :username %>
@@ -14,7 +16,7 @@
14
16
  <%= f.label :password %>
15
17
  <%= f.password_field :password, :autocomplete => 'off' %>
16
18
  <% if @user.persisted? %>
17
- <%= content_tag(:br) %>
19
+ <br>
18
20
  <%= content_tag(:span, t('.blank_password_keeps_current')) %>
19
21
  <% end %>
20
22
  </div>
@@ -30,7 +32,7 @@
30
32
  <ul id='plugins' class='checkboxes'>
31
33
  <% @available_plugins.each do |plugin| -%>
32
34
  <% if Refinery::Plugins.always_allowed.names.include?(plugin[:name]) or
33
- (plugin[:name] == 'refinery_users' and @user.id == current_refinery_user.id) %>
35
+ (plugin[:name] == 'refinery_users' && @user.id == current_refinery_user.id) %>
34
36
  <%= hidden_field_tag 'user[plugins][]', plugin[:name],
35
37
  :id => "plugins_#{plugin[:name]}" %>
36
38
  <% else %>
@@ -48,7 +50,7 @@
48
50
  </ul>
49
51
  </div>
50
52
 
51
- <% if current_refinery_user.has_role?(:superuser) and Refinery::Authentication.superuser_can_assign_roles %>
53
+ <% if current_refinery_user.has_role?(:superuser) && Refinery::Authentication.superuser_can_assign_roles %>
52
54
  <div class='field role_access'>
53
55
  <span class='label_with_help'>
54
56
  <%= f.label :role_access, t('.role_access'), :class => "title_label" %>
@@ -1,3 +1,10 @@
1
+ <%= render 'refinery/admin/search_header', :url => refinery.admin_users_path %>
2
+ <% if @users.any? %>
1
3
  <div class='pagination_container'>
2
4
  <%= render 'users' %>
3
5
  </div>
6
+ <% else %>
7
+ <p>
8
+ <%= t('no_results', :scope => 'refinery.admin.search') %>
9
+ </p>
10
+ <% end %>
@@ -20,7 +20,7 @@
20
20
  <%= render '/refinery/admin/form_actions', :f => f,
21
21
  :continue_editing => false,
22
22
  :submit_button_text => t('reset_password', :scope => 'refinery.users.reset'),
23
- :cancel_url => refinery.new_refinery_user_session_path,
23
+ :cancel_url => refinery.login_path,
24
24
  :cancel_title => nil,
25
25
  :hide_delete => true -%>
26
26
  <% end -%>
@@ -1,6 +1,6 @@
1
1
  <% content_for :header, t('there_are_no_users', :scope => 'refinery.welcome') %>
2
2
 
3
- <%= form_for :user, :url => refinery.refinery_user_registration_path do |f| -%>
3
+ <%= form_for :user, :url => refinery.signup_path do |f| -%>
4
4
 
5
5
  <%= render '/refinery/admin/error_messages', :object => @user, :include_object_name => true %>
6
6
 
@@ -9,7 +9,7 @@ bg:
9
9
  delete: Изтриване на този потребител завинаги
10
10
  edit: Редактиране на този потребител
11
11
  update:
12
- cannot_remove_user_plugin_from_current_user: Не можете да премахнете добавката "Потребители" чрез потребителя, с който сте влезли в момента в системата.
12
+ lockout_prevented: Не можете да премахнете добавката "Потребители" чрез потребителя, с който сте влезли в момента в системата.
13
13
  form:
14
14
  blank_password_keeps_current: При празно поле текущата парола ще бъде запазена
15
15
  plugin_access: Достъп до добавки
@@ -9,7 +9,7 @@ cs:
9
9
  delete: Smazat tohoto uživatele
10
10
  edit: Editovat tohoto uživatele
11
11
  update:
12
- cannot_remove_user_plugin_from_current_user: Nemůžete odstranit 'Users' plugin z aktuálně přihlášeného konta.
12
+ lockout_prevented: Nemůžete odstranit 'Users' plugin z aktuálně přihlášeného konta.
13
13
  form:
14
14
  blank_password_keeps_current: Pokud necháte toto pole prázné bude zachováno stávající heslo
15
15
  plugin_access: Přístup k pluginům
@@ -23,7 +23,7 @@ cs:
23
23
  sessions:
24
24
  new:
25
25
  hello_please_sign_in: Prosím přihlašte se
26
- sign_in: Přihlášení
26
+ sign_in: Přihlásit se
27
27
  forgot_password: Zapomenuté heslo
28
28
  users:
29
29
  new:
@@ -67,7 +67,7 @@ cs:
67
67
  refinery/user: uživatel
68
68
  attributes:
69
69
  refinery/user:
70
- login: Přihlásit
70
+ login: Uživatelské jméno nebo email
71
71
  email: Email
72
72
  username: Uživatelské jméno
73
73
  password: Heslo
@@ -9,7 +9,7 @@ da:
9
9
  delete: Slet bruger
10
10
  edit: Redigér bruger
11
11
  update:
12
- cannot_remove_user_plugin_from_current_user: "Du kan ikke deaktivere 'Brugere' for en bruger, der er logget på."
12
+ lockout_prevented: "Du kan ikke deaktivere 'Brugere' for en bruger, der er logget på."
13
13
  form:
14
14
  blank_password_keeps_current: 'Hvis du ikke indtaster noget, beholdes den nuværende adgangskode'
15
15
  plugin_access: Plugin adgang
@@ -9,7 +9,7 @@ de:
9
9
  delete: Diesen Benutzer für immer löschen
10
10
  edit: Diesen Benutzer bearbeiten
11
11
  update:
12
- cannot_remove_user_plugin_from_current_user: Sie können die Erweiterung 'Benutzer' nicht vom aktuellen Konto entfernen.
12
+ lockout_prevented: Sie können die Erweiterung 'Benutzer' nicht vom aktuellen Konto entfernen.
13
13
  form:
14
14
  blank_password_keeps_current: 'Wird das Passwort leer gelassen, wird das aktuelle Passwort beibehalten'
15
15
  plugin_access: Zugriff auf Erweiterungen
@@ -9,7 +9,7 @@ el:
9
9
  delete: Διαγραφή χρήστη
10
10
  edit: Επεξεργασία χρήστη
11
11
  update:
12
- cannot_remove_user_plugin_from_current_user: Δεν μπορείτε να διαγράψετε το 'Users' plugin για αυτόν τον λογαριασμό.
12
+ lockout_prevented: Δεν μπορείτε να διαγράψετε το 'Users' plugin για αυτόν τον λογαριασμό.
13
13
  form:
14
14
  blank_password_keeps_current: Αφήνοντας κενό τον κωδικό δε θα άλλαξει
15
15
  plugin_access: Πρόσβαση Plugin
@@ -9,7 +9,7 @@ en:
9
9
  delete: Remove this user forever
10
10
  edit: Edit this user
11
11
  update:
12
- cannot_remove_user_plugin_from_current_user: You cannot remove the 'Users' plugin from the currently logged in account.
12
+ lockout_prevented: You cannot remove the 'Users' plugin from the currently logged in account.
13
13
  form:
14
14
  blank_password_keeps_current: Leaving password blank keeps the current password
15
15
  plugin_access: Plugin access
@@ -57,6 +57,7 @@ en:
57
57
  failure:
58
58
  unauthenticated: You need to sign in before continuing.
59
59
  invalid: "Sorry, your login or password was incorrect."
60
+ not_found_in_database: "Sorry, your login or password was incorrect."
60
61
  sessions:
61
62
  signed_in: Signed in successfully.
62
63
  activerecord:
@@ -64,7 +65,7 @@ en:
64
65
  refinery/user: user
65
66
  attributes:
66
67
  refinery/user:
67
- login: Login
68
+ login: Username or email
68
69
  username: Username
69
70
  password: Password
70
71
  password_confirmation: Password confirmation