Skip to content

Commit cf86567

Browse files
committed
Fixes and password security update
1 parent fc3846e commit cf86567

13 files changed

Lines changed: 67 additions & 65 deletions

File tree

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ gem "chronic", "~> 0.10.2"
99

1010
gem 'redcarpet'
1111

12+
gem 'bcrypt'
13+
1214
gem 'activemodel-serializers-xml'
1315

1416
gem 'actionpack-page_caching'

Gemfile.lock

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ GEM
8484
addressable (2.8.7)
8585
public_suffix (>= 2.0.2, < 7.0)
8686
base64 (0.2.0)
87+
bcrypt (3.1.20)
88+
bcrypt (3.1.20-java)
8789
bigdecimal (3.1.8)
8890
bigdecimal (3.1.8-java)
8991
bindex (0.8.1)
@@ -338,6 +340,7 @@ PLATFORMS
338340
DEPENDENCIES
339341
actionpack-page_caching
340342
activemodel-serializers-xml
343+
bcrypt
341344
bootsnap
342345
capybara
343346
chronic (~> 0.10.2)

app/controllers/projects_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def users
153153
when :delete
154154
user = User.find(params[:user_id])
155155
unless user.owner_of_owner?
156-
Person.where(["user_id = ? AND project_id = ?", params[:user], @project.id]).delete_all
156+
Person.where(user_id: params[:user], project_id: @project.id).delete_all
157157
end
158158
end
159159

@@ -182,7 +182,7 @@ def companies
182182
end
183183
end
184184

185-
def neww
185+
def new
186186
authorize! :create_project, current_user
187187

188188
@project = Project.new

app/controllers/wiki_pages_controller.rb

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ def show
5656
def create
5757
@wiki_page = wiki_pages.build(wiki_page_params)
5858
@wiki_page.created_by = @logged_user
59-
@wiki_page.current_revision = true
6059
puts @wiki_page.inspect
6160

6261
if @wiki_page.save
@@ -68,7 +67,6 @@ def create
6867
end
6968

7069
def edit
71-
puts "WIKIP=#{@wiki_page.inspect}"
7270
end
7371

7472
def update
@@ -84,14 +82,15 @@ def update
8482
end
8583

8684
def destroy
85+
flash[:message] = I18n.t "wiki_engine.success_deleting_wiki_page"
86+
8787
if params[:version].nil?
88-
@wiki_page.where(:slug => id.slug).destroy
88+
@wiki_page.destroy
89+
redirect_to project_wiki_pages_path(@active_project)
8990
else
90-
@wiki_page.where(:slug => id.slug, :revision_number => params[:version].to_i).destroy
91+
@wiki_page.versions.where(revision_number: params[:version].to_i).destroy_all
92+
redirect_to project_wiki_page_path(@active_project, id: @wiki_page.slug)
9193
end
92-
93-
flash[:message] = I18n.t "wiki_engine.success_deleting_wiki_page"
94-
redirect_to project_wiki_pages_path(@active_project)
9594
end
9695

9796
def preview
@@ -112,7 +111,8 @@ def find_main_wiki_page
112111

113112
# Find all wiki pages. This is by default used only for list action.
114113
def find_wiki_pages
115-
@wiki_pages = wiki_pages.where(current_revision: true).all
114+
@wiki_pages = wiki_pages.where(revision_number: WikiPage.select('MAX(revision_number)')
115+
.group(:slug)).all
116116
end
117117

118118
# This is called when wiki page is not found. By default it display a page explaining
@@ -142,9 +142,11 @@ def find_main_wiki_page
142142
end
143143

144144
def load_related_object
145-
begin
146-
@wiki_page = wiki_pages.where(current_revision: true).where("slug = ? OR id = ?", params[:id], params[:id]).first
147-
rescue ActiveRecord::RecordNotFound
145+
@wiki_page = wiki_pages
146+
.where("slug = ? OR id = ?", params[:id], params[:id])
147+
.order(revision_number: :desc)
148+
.first
149+
if @wiki_page.nil?
148150
redirect_back_or_default project_path(@active_project)
149151
return false
150152
end

app/helpers/application_helper.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,14 @@ def actions_for_time_short(time)
180180
{ name: I18n.t("delete"), url: project_time_path(time.project, id: time.id), cond: can?(:delete, time), data: { turbo_method: :delete, turbo_confirm: I18n.t("time_confirm_delete") } }]
181181
end
182182

183-
def actions_for_wiki_page(page)
183+
def actions_for_wiki_page(page, version=nil)
184+
if version.nil?
185+
delete_path = project_wiki_page_path(page.project, id: page.slug)
186+
else
187+
delete_path = project_delete_version_wiki_page_path(page.project, id: page.slug, version: version.revision_number)
188+
end
184189
[{ name: I18n.t("edit"), url: edit_project_wiki_page_path(page.project, id: page.slug), cond: can?(:edit, page) },
185-
{ name: I18n.t("delete"), url: project_wiki_page_path(page.project, id: page.slug), cond: can?(:delete, page), data: { turbo_method: :delete, turbo_confirm: I18n.t("wiki_page_confirm_delete") } }]
190+
{ name: I18n.t("delete"), url: delete_path, cond: can?(:delete, page), data: { turbo_method: :delete, turbo_confirm: I18n.t("wiki_page_confirm_delete") } }]
186191
end
187192

188193
def running_time_for_task(task)

app/helpers/wiki_pages_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def current_version(version)
5858

5959
def versions(versions)
6060
versions.collect do |version|
61-
[t("wiki_engine.version#{"_edited_by" unless version.user_name.blank?}", version: version.revision_number, user: version.user_name), project_wiki_page_path(@active_project, id: version.slug, version: version.revision_number)]
61+
[t("wiki_engine.version#{"_edited_by" unless version.user_name.blank?}", version: version.revision_number, user: version.user_name), project_version_wiki_page_path(@active_project, id: version.slug, version: version.revision_number)]
6262
end
6363
end
6464

app/models/user.rb

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818
#++
1919

20-
require "digest/sha1"
20+
require "bcrypt"
2121

2222
class User < ApplicationRecord
2323
include Rails.application.routes.url_helpers
@@ -101,7 +101,7 @@ def password
101101

102102
def password=(value)
103103
return if @generated_password
104-
salt = nil
104+
salt = ""
105105
token = nil
106106

107107
if value.empty?
@@ -114,16 +114,7 @@ def password=(value)
114114
# Calculate a unique token with salt
115115
loop do
116116
# Grab a few random things...
117-
tnow = Time.now()
118-
sec = tnow.tv_usec
119-
usec = tnow.tv_usec % 0x100000
120-
rval = rand()
121-
roffs = rand(25)
122-
123-
# Now we can calculate salt and token
124-
salt = Digest::SHA1.hexdigest(sprintf("%s%08x%05x%.8f", rand(32767), sec, usec, rval))[roffs..roffs + 12]
125-
token = Digest::SHA1.hexdigest(salt + value)
126-
117+
token = BCrypt::Password.create(value)
127118
break if User.where({ token: token }).first.nil?
128119
end
129120

@@ -190,7 +181,7 @@ def self.authenticate(login, pass)
190181
end
191182

192183
def valid_password(pass)
193-
self.token == Digest::SHA1.hexdigest(self.salt + pass)
184+
BCrypt::Password.new(self.token) == pass
194185
end
195186

196187
# Helpers

app/models/wiki_page.rb

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def process_create
2020

2121
def process_destroy
2222
if self.revision_number == 0
23+
2324
Activity.new_log(self, created_by, :delete)
2425
end
2526
end
@@ -52,18 +53,14 @@ def new_version(params)
5253
new_version.current_revision = true
5354

5455
if new_version.save
55-
self.versions.update_all(current_revision: false)
56+
self.versions.where.not(id: new_version.id).update_all(current_revision: false)
5657
end
5758

5859
new_version
5960
end
6061

6162
def object_url(host = nil)
62-
if self.current_revision
63-
project_wiki_page_url(project, id: self.friendly_id, only_path: host.nil?, host: host)
64-
else
65-
project_wiki_page_url(project, id: self.friendly_id, version: self.revision_number, only_path: host.nil?, host: host)
66-
end
63+
project_wiki_page_url(project, id: self.friendly_id, only_path: host.nil?, host: host)
6764
end
6865

6966
# Search

app/views/tasks/_form.html.haml

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
- if not form.object.new_record? and @no_show_list.nil?
2-
%div
3-
%label{for: "addTaskTaskList#{form.object.id}"}
4-
= t('task_list')
5-
\:
6-
%span.label_required *
7-
= form.select 'task_list_id', TaskList.select_list(@active_project), {}, id: "addTaskTaskList#{task.id}"
8-
%div
9-
%label{for: "addTaskText#{form.object.id}"}
10-
= t('text')
11-
\:
12-
%span.label_required *
13-
= form.text_area 'text', id: "addTaskText#{form.object.id}", class: 'short autofocus', rows: 10, cols: 40
14-
%div
15-
%label{for: "taskAssignedTo#{form.object.id}"}
16-
= t('assign_to')
17-
\:
18-
= assign_project_select_form form, 'task', 'assigned_to_id', @active_project, id: "taskAssignedTo#{form.object.id}"
19-
%div
20-
= form.check_box 'send_notification', '1', id: "taskSendNotification#{form.object.id}", class: 'checkbox'
21-
%label.checkbox{for: "taskSendNotification#{form.object.id}"}= t('send_email_notification_to_user')
22-
%div
23-
%label{for: "addTaskHours"}
24-
= t('estimated_hours')
25-
\:
26-
= form.text_field 'estimated_hours', id: 'addTaskHours', class: 'short'
1+
= error_messages_for :task
2+
%div
3+
%label{for: "addTaskTaskList#{form.object.id}"}
4+
= t('task_list')
5+
\:
6+
%span.label_required *
7+
= form.select 'task_list_id', TaskList.select_list(@active_project), {}, id: "addTaskTaskListSelect#{form.object.id}"
8+
%div
9+
%label{for: "addTaskText#{form.object.id}"}
10+
= t('text')
11+
\:
12+
%span.label_required *
13+
= form.text_area 'text', id: "addTaskText#{form.object.id}", class: 'short autofocus', rows: 10, cols: 40
14+
%div
15+
%label{for: "taskAssignedTo#{form.object.id}"}
16+
= t('assign_to')
17+
\:
18+
= form_assign_project_select form, 'assigned_to_id', @active_project, id: "taskAssignedTo#{form.object.id}"
19+
%div
20+
= form.check_box :'send_notification', id: "taskSendNotification#{form.object.id}", class: 'checkbox'
21+
%label.checkbox{for: "taskSendNotification#{form.object.id}"}= t('send_email_notification_to_user')
22+
%div
23+
%label{for: "addTaskHours"}
24+
= t('estimated_hours')
25+
\:
26+
= form.text_field 'estimated_hours', id: 'addTaskHours', class: 'short'

app/views/tasks/edit.html.haml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
- @page_actions << {title: :add_task_list, :url=> new_project_task_list_path(@active_project)}
44

55
= form_with(model: @task, url: project_task_list_task_path(@task.project, @task.task_list, @task), method: :put) do |form|
6-
= render partial: 'form', locals: {form: form}, object: @task,
6+
= render partial: 'form', locals: {form: form}
77
%div
88
%button.submit{type: "submit"}= t('edit_task')

0 commit comments

Comments
 (0)