Commit 987a5aa2 authored by Jean-Philippe Lang's avatar Jean-Philippe Lang

Anonymous users can now be allowed to create, edit, comment issues, comment news…

Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums.
These permissions need to be explicitly given to the Anonymous role (Admin -> Roles & Permissions -> Anonymous).

git-svn-id: http://redmine.rubyforge.org/svn/trunk@919 e93f8b46-1217-0410-a6f0-8f06a7374b81
parent 99f9aea8
...@@ -23,10 +23,6 @@ class ApplicationController < ActionController::Base ...@@ -23,10 +23,6 @@ class ApplicationController < ActionController::Base
require_dependency "repository/#{scm.underscore}" require_dependency "repository/#{scm.underscore}"
end end
def logged_in_user
User.current.logged? ? User.current : nil
end
def current_role def current_role
@current_role ||= User.current.role_for_project(@project) @current_role ||= User.current.role_for_project(@project)
end end
......
...@@ -49,7 +49,7 @@ class DocumentsController < ApplicationController ...@@ -49,7 +49,7 @@ class DocumentsController < ApplicationController
@attachments = [] @attachments = []
params[:attachments].each { |file| params[:attachments].each { |file|
next unless file.size > 0 next unless file.size > 0
a = Attachment.create(:container => @document, :file => file, :author => logged_in_user) a = Attachment.create(:container => @document, :file => file, :author => User.current)
@attachments << a unless a.new_record? @attachments << a unless a.new_record?
} if params[:attachments] and params[:attachments].is_a? Array } if params[:attachments] and params[:attachments].is_a? Array
Mailer.deliver_attachments_added(@attachments) if !@attachments.empty? && Setting.notified_events.include?('document_added') Mailer.deliver_attachments_added(@attachments) if !@attachments.empty? && Setting.notified_events.include?('document_added')
......
...@@ -82,7 +82,7 @@ class IssuesController < ApplicationController ...@@ -82,7 +82,7 @@ class IssuesController < ApplicationController
def show def show
@custom_values = @issue.custom_values.find(:all, :include => :custom_field, :order => "#{CustomField.table_name}.position") @custom_values = @issue.custom_values.find(:all, :include => :custom_field, :order => "#{CustomField.table_name}.position")
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
@status_options = @issue.status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker) if logged_in_user @status_options = @issue.status.find_new_statuses_allowed_to(User.current.role_for_project(@project), @issue.tracker)
respond_to do |format| respond_to do |format|
format.html { render :template => 'issues/show.rhtml' } format.html { render :template => 'issues/show.rhtml' }
format.pdf { send_data(render(:template => 'issues/show.rfpdf', :layout => false), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") } format.pdf { send_data(render(:template => 'issues/show.rfpdf', :layout => false), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
...@@ -95,7 +95,7 @@ class IssuesController < ApplicationController ...@@ -95,7 +95,7 @@ class IssuesController < ApplicationController
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) } @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
else else
begin begin
@issue.init_journal(self.logged_in_user) @issue.init_journal(User.current)
# Retrieve custom fields and values # Retrieve custom fields and values
if params["custom_fields"] if params["custom_fields"]
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) } @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
...@@ -117,7 +117,7 @@ class IssuesController < ApplicationController ...@@ -117,7 +117,7 @@ class IssuesController < ApplicationController
journal = @issue.init_journal(User.current, params[:notes]) journal = @issue.init_journal(User.current, params[:notes])
params[:attachments].each { |file| params[:attachments].each { |file|
next unless file.size > 0 next unless file.size > 0
a = Attachment.create(:container => @issue, :file => file, :author => logged_in_user) a = Attachment.create(:container => @issue, :file => file, :author => User.current)
journal.details << JournalDetail.new(:property => 'attachment', journal.details << JournalDetail.new(:property => 'attachment',
:prop_key => a.id, :prop_key => a.id,
:value => a.filename) unless a.new_record? :value => a.filename) unless a.new_record?
...@@ -132,17 +132,17 @@ class IssuesController < ApplicationController ...@@ -132,17 +132,17 @@ class IssuesController < ApplicationController
end end
def change_status def change_status
@status_options = @issue.status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker) if logged_in_user @status_options = @issue.status.find_new_statuses_allowed_to(User.current.role_for_project(@project), @issue.tracker)
@new_status = IssueStatus.find(params[:new_status_id]) @new_status = IssueStatus.find(params[:new_status_id])
if params[:confirm] if params[:confirm]
begin begin
journal = @issue.init_journal(self.logged_in_user, params[:notes]) journal = @issue.init_journal(User.current, params[:notes])
@issue.status = @new_status @issue.status = @new_status
if @issue.update_attributes(params[:issue]) if @issue.update_attributes(params[:issue])
# Save attachments # Save attachments
params[:attachments].each { |file| params[:attachments].each { |file|
next unless file.size > 0 next unless file.size > 0
a = Attachment.create(:container => @issue, :file => file, :author => logged_in_user) a = Attachment.create(:container => @issue, :file => file, :author => User.current)
journal.details << JournalDetail.new(:property => 'attachment', journal.details << JournalDetail.new(:property => 'attachment',
:prop_key => a.id, :prop_key => a.id,
:value => a.filename) unless a.new_record? :value => a.filename) unless a.new_record?
...@@ -150,7 +150,7 @@ class IssuesController < ApplicationController ...@@ -150,7 +150,7 @@ class IssuesController < ApplicationController
# Log time # Log time
if current_role.allowed_to?(:log_time) if current_role.allowed_to?(:log_time)
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => logged_in_user, :spent_on => Date.today) @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
@time_entry.attributes = params[:time_entry] @time_entry.attributes = params[:time_entry]
@time_entry.save @time_entry.save
end end
...@@ -176,7 +176,7 @@ class IssuesController < ApplicationController ...@@ -176,7 +176,7 @@ class IssuesController < ApplicationController
def destroy_attachment def destroy_attachment
a = @issue.attachments.find(params[:attachment_id]) a = @issue.attachments.find(params[:attachment_id])
a.destroy a.destroy
journal = @issue.init_journal(self.logged_in_user) journal = @issue.init_journal(User.current)
journal.details << JournalDetail.new(:property => 'attachment', journal.details << JournalDetail.new(:property => 'attachment',
:prop_key => a.id, :prop_key => a.id,
:old_value => a.filename) :old_value => a.filename)
...@@ -225,12 +225,11 @@ private ...@@ -225,12 +225,11 @@ private
def retrieve_query def retrieve_query
if params[:query_id] if params[:query_id]
@query = Query.find(params[:query_id], :conditions => {:project_id => (@project ? @project.id : nil)}) @query = Query.find(params[:query_id], :conditions => {:project_id => (@project ? @project.id : nil)})
@query.executed_by = logged_in_user
session[:query] = @query session[:query] = @query
else else
if params[:set_filter] or !session[:query] or session[:query].project != @project if params[:set_filter] or !session[:query] or session[:query].project != @project
# Give it a name, required to be valid # Give it a name, required to be valid
@query = Query.new(:name => "_", :executed_by => logged_in_user) @query = Query.new(:name => "_")
@query.project = @project @query.project = @project
if params[:fields] and params[:fields].is_a? Array if params[:fields] and params[:fields].is_a? Array
params[:fields].each do |field| params[:fields].each do |field|
......
...@@ -31,12 +31,12 @@ class MessagesController < ApplicationController ...@@ -31,12 +31,12 @@ class MessagesController < ApplicationController
def new def new
@message = Message.new(params[:message]) @message = Message.new(params[:message])
@message.author = logged_in_user @message.author = User.current
@message.board = @board @message.board = @board
if request.post? && @message.save if request.post? && @message.save
params[:attachments].each { |file| params[:attachments].each { |file|
next unless file.size > 0 next unless file.size > 0
Attachment.create(:container => @message, :file => file, :author => logged_in_user) Attachment.create(:container => @message, :file => file, :author => User.current)
} if params[:attachments] and params[:attachments].is_a? Array } if params[:attachments] and params[:attachments].is_a? Array
redirect_to :action => 'show', :id => @message redirect_to :action => 'show', :id => @message
end end
...@@ -44,7 +44,7 @@ class MessagesController < ApplicationController ...@@ -44,7 +44,7 @@ class MessagesController < ApplicationController
def reply def reply
@reply = Message.new(params[:reply]) @reply = Message.new(params[:reply])
@reply.author = logged_in_user @reply.author = User.current
@reply.board = @board @reply.board = @board
@message.children << @reply @message.children << @reply
redirect_to :action => 'show', :id => @message redirect_to :action => 'show', :id => @message
......
...@@ -44,7 +44,7 @@ class MyController < ApplicationController ...@@ -44,7 +44,7 @@ class MyController < ApplicationController
# Show user's page # Show user's page
def page def page
@user = self.logged_in_user @user = User.current
@blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT @blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT
end end
...@@ -76,7 +76,7 @@ class MyController < ApplicationController ...@@ -76,7 +76,7 @@ class MyController < ApplicationController
# Manage user's password # Manage user's password
def password def password
@user = self.logged_in_user @user = User.current
flash[:error] = l(:notice_can_t_change_password) and redirect_to :action => 'account' and return if @user.auth_source_id flash[:error] = l(:notice_can_t_change_password) and redirect_to :action => 'account' and return if @user.auth_source_id
if request.post? if request.post?
if @user.check_password?(params[:password]) if @user.check_password?(params[:password])
...@@ -102,7 +102,7 @@ class MyController < ApplicationController ...@@ -102,7 +102,7 @@ class MyController < ApplicationController
# User's page layout configuration # User's page layout configuration
def page_layout def page_layout
@user = self.logged_in_user @user = User.current
@blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT.dup @blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT.dup
session[:page_layout] = @blocks session[:page_layout] = @blocks
%w(top left right).each {|f| session[:page_layout][f] ||= [] } %w(top left right).each {|f| session[:page_layout][f] ||= [] }
...@@ -116,7 +116,7 @@ class MyController < ApplicationController ...@@ -116,7 +116,7 @@ class MyController < ApplicationController
def add_block def add_block
block = params[:block] block = params[:block]
render(:nothing => true) and return unless block && (BLOCKS.keys.include? block) render(:nothing => true) and return unless block && (BLOCKS.keys.include? block)
@user = self.logged_in_user @user = User.current
# remove if already present in a group # remove if already present in a group
%w(top left right).each {|f| (session[:page_layout][f] ||= []).delete block } %w(top left right).each {|f| (session[:page_layout][f] ||= []).delete block }
# add it on top # add it on top
...@@ -151,7 +151,7 @@ class MyController < ApplicationController ...@@ -151,7 +151,7 @@ class MyController < ApplicationController
# Save user's page layout # Save user's page layout
def page_layout_save def page_layout_save
@user = self.logged_in_user @user = User.current
@user.pref[:my_page_layout] = session[:page_layout] if session[:page_layout] @user.pref[:my_page_layout] = session[:page_layout] if session[:page_layout]
@user.pref.save @user.pref.save
session[:page_layout] = nil session[:page_layout] = nil
......
...@@ -45,7 +45,7 @@ class NewsController < ApplicationController ...@@ -45,7 +45,7 @@ class NewsController < ApplicationController
def add_comment def add_comment
@comment = Comment.new(params[:comment]) @comment = Comment.new(params[:comment])
@comment.author = logged_in_user @comment.author = User.current
if @news.comments << @comment if @news.comments << @comment
flash[:notice] = l(:label_comment_added) flash[:notice] = l(:label_comment_added)
redirect_to :action => 'show', :id => @news redirect_to :action => 'show', :id => @news
......
...@@ -48,7 +48,7 @@ class ProjectsController < ApplicationController ...@@ -48,7 +48,7 @@ class ProjectsController < ApplicationController
# Lists visible projects # Lists visible projects
def list def list
projects = Project.find :all, projects = Project.find :all,
:conditions => Project.visible_by(logged_in_user), :conditions => Project.visible_by(User.current),
:include => :parent :include => :parent
@project_tree = projects.group_by {|p| p.parent || p} @project_tree = projects.group_by {|p| p.parent || p}
@project_tree.each_key {|p| @project_tree[p] -= [p]} @project_tree.each_key {|p| @project_tree[p] -= [p]}
...@@ -176,7 +176,7 @@ class ProjectsController < ApplicationController ...@@ -176,7 +176,7 @@ class ProjectsController < ApplicationController
if request.post? and @document.save if request.post? and @document.save
# Save the attachments # Save the attachments
params[:attachments].each { |a| params[:attachments].each { |a|
Attachment.create(:container => @document, :file => a, :author => logged_in_user) unless a.size == 0 Attachment.create(:container => @document, :file => a, :author => User.current) unless a.size == 0
} if params[:attachments] and params[:attachments].is_a? Array } if params[:attachments] and params[:attachments].is_a? Array
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
Mailer.deliver_document_added(@document) if Setting.notified_events.include?('document_added') Mailer.deliver_document_added(@document) if Setting.notified_events.include?('document_added')
...@@ -216,7 +216,7 @@ class ProjectsController < ApplicationController ...@@ -216,7 +216,7 @@ class ProjectsController < ApplicationController
return return
end end
@issue.status = default_status @issue.status = default_status
@allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker))if logged_in_user @allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(User.current.role_for_project(@project), @issue.tracker))
if request.get? if request.get?
@issue.start_date ||= Date.today @issue.start_date ||= Date.today
...@@ -321,10 +321,9 @@ class ProjectsController < ApplicationController ...@@ -321,10 +321,9 @@ class ProjectsController < ApplicationController
# Add a news to @project # Add a news to @project
def add_news def add_news
@news = News.new(:project => @project) @news = News.new(:project => @project, :author => User.current)
if request.post? if request.post?
@news.attributes = params[:news] @news.attributes = params[:news]
@news.author_id = self.logged_in_user.id if self.logged_in_user
if @news.save if @news.save
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
Mailer.deliver_news_added(@news) if Setting.notified_events.include?('news_added') Mailer.deliver_news_added(@news) if Setting.notified_events.include?('news_added')
...@@ -340,7 +339,7 @@ class ProjectsController < ApplicationController ...@@ -340,7 +339,7 @@ class ProjectsController < ApplicationController
@attachments = [] @attachments = []
params[:attachments].each { |file| params[:attachments].each { |file|
next unless file.size > 0 next unless file.size > 0
a = Attachment.create(:container => @version, :file => file, :author => logged_in_user) a = Attachment.create(:container => @version, :file => file, :author => User.current)
@attachments << a unless a.new_record? @attachments << a unless a.new_record?
} if params[:attachments] and params[:attachments].is_a? Array } if params[:attachments] and params[:attachments].is_a? Array
Mailer.deliver_attachments_added(@attachments) if !@attachments.empty? && Setting.notified_events.include?('file_added') Mailer.deliver_attachments_added(@attachments) if !@attachments.empty? && Setting.notified_events.include?('file_added')
......
...@@ -22,14 +22,13 @@ class QueriesController < ApplicationController ...@@ -22,14 +22,13 @@ class QueriesController < ApplicationController
def index def index
@queries = @project.queries.find(:all, @queries = @project.queries.find(:all,
:order => "name ASC", :order => "name ASC",
:conditions => ["is_public = ? or user_id = ?", true, (logged_in_user ? logged_in_user.id : 0)]) :conditions => ["is_public = ? or user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
end end
def new def new
@query = Query.new(params[:query]) @query = Query.new(params[:query])
@query.project = @project @query.project = @project
@query.user = logged_in_user @query.user = User.current
@query.executed_by = logged_in_user
@query.is_public = false unless current_role.allowed_to?(:manage_public_queries) @query.is_public = false unless current_role.allowed_to?(:manage_public_queries)
@query.column_names = nil if params[:default_columns] @query.column_names = nil if params[:default_columns]
...@@ -71,9 +70,8 @@ private ...@@ -71,9 +70,8 @@ private
def find_project def find_project
if params[:id] if params[:id]
@query = Query.find(params[:id]) @query = Query.find(params[:id])
@query.executed_by = logged_in_user
@project = @query.project @project = @query.project
render_403 unless @query.editable_by?(logged_in_user) render_403 unless @query.editable_by?(User.current)
else else
@project = Project.find(params[:project_id]) @project = Project.find(params[:project_id])
end end
......
...@@ -31,7 +31,7 @@ class SearchController < ApplicationController ...@@ -31,7 +31,7 @@ class SearchController < ApplicationController
begin; offset = params[:offset].to_time if params[:offset]; rescue; end begin; offset = params[:offset].to_time if params[:offset]; rescue; end
# quick jump to an issue # quick jump to an issue
if @question.match(/^#?(\d+)$/) && Issue.find_by_id($1, :include => :project, :conditions => Project.visible_by(logged_in_user)) if @question.match(/^#?(\d+)$/) && Issue.find_by_id($1, :include => :project, :conditions => Project.visible_by(User.current))
redirect_to :controller => "issues", :action => "show", :id => $1 redirect_to :controller => "issues", :action => "show", :id => $1
return return
end end
...@@ -87,7 +87,7 @@ class SearchController < ApplicationController ...@@ -87,7 +87,7 @@ class SearchController < ApplicationController
end end
else else
operator = @all_words ? ' AND ' : ' OR ' operator = @all_words ? ' AND ' : ' OR '
Project.with_scope(:find => {:conditions => Project.visible_by(logged_in_user)}) do Project.with_scope(:find => {:conditions => Project.visible_by(User.current)}) do
@results += Project.find(:all, :limit => limit, :conditions => [ (["(LOWER(name) like ? OR LOWER(description) like ?)"] * like_tokens.size).join(operator), * (like_tokens * 2).sort] ) if @scope.include? 'projects' @results += Project.find(:all, :limit => limit, :conditions => [ (["(LOWER(name) like ? OR LOWER(description) like ?)"] * like_tokens.size).join(operator), * (like_tokens * 2).sort] ) if @scope.include? 'projects'
end end
# if only one project is found, user is redirected to its overview # if only one project is found, user is redirected to its overview
......
...@@ -107,15 +107,15 @@ class TimelogController < ApplicationController ...@@ -107,15 +107,15 @@ class TimelogController < ApplicationController
@entries = (@issue ? @issue : @project).time_entries.find(:all, :include => [:activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], :order => sort_clause) @entries = (@issue ? @issue : @project).time_entries.find(:all, :include => [:activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], :order => sort_clause)
@total_hours = @entries.inject(0) { |sum,entry| sum + entry.hours } @total_hours = @entries.inject(0) { |sum,entry| sum + entry.hours }
@owner_id = logged_in_user ? logged_in_user.id : 0 @owner_id = User.current.id
send_csv and return if 'csv' == params[:export] send_csv and return if 'csv' == params[:export]
render :action => 'details', :layout => false if request.xhr? render :action => 'details', :layout => false if request.xhr?
end end
def edit def edit
render_404 and return if @time_entry && @time_entry.user != logged_in_user render_404 and return if @time_entry && @time_entry.user != User.current
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => logged_in_user, :spent_on => Date.today) @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
@time_entry.attributes = params[:time_entry] @time_entry.attributes = params[:time_entry]
if request.post? and @time_entry.save if request.post? and @time_entry.save
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
......
...@@ -19,7 +19,7 @@ class WelcomeController < ApplicationController ...@@ -19,7 +19,7 @@ class WelcomeController < ApplicationController
layout 'base' layout 'base'
def index def index
@news = News.latest logged_in_user @news = News.latest User.current
@projects = Project.latest logged_in_user @projects = Project.latest User.current
end end
end end
...@@ -69,7 +69,7 @@ class WikiController < ApplicationController ...@@ -69,7 +69,7 @@ class WikiController < ApplicationController
#@content.text = params[:content][:text] #@content.text = params[:content][:text]
#@content.comments = params[:content][:comments] #@content.comments = params[:content][:comments]
@content.attributes = params[:content] @content.attributes = params[:content]
@content.author = logged_in_user @content.author = User.current
# if page is new @page.save will also save content, but not if page isn't a new record # if page is new @page.save will also save content, but not if page isn't a new record
if (@page.new_record? ? @page.save : @content.save) if (@page.new_record? ? @page.save : @content.save)
redirect_to :action => 'index', :id => @project, :page => @page.title redirect_to :action => 'index', :id => @project, :page => @page.title
...@@ -157,7 +157,7 @@ class WikiController < ApplicationController ...@@ -157,7 +157,7 @@ class WikiController < ApplicationController
# Save the attachments # Save the attachments
params[:attachments].each { |file| params[:attachments].each { |file|
next unless file.size > 0 next unless file.size > 0
a = Attachment.create(:container => @page, :file => file, :author => logged_in_user) a = Attachment.create(:container => @page, :file => file, :author => User.current)
} if params[:attachments] and params[:attachments].is_a? Array } if params[:attachments] and params[:attachments].is_a? Array
redirect_to :action => 'index', :page => @page.title redirect_to :action => 'index', :page => @page.title
end end
......
...@@ -21,7 +21,7 @@ class Attachment < ActiveRecord::Base ...@@ -21,7 +21,7 @@ class Attachment < ActiveRecord::Base
belongs_to :container, :polymorphic => true belongs_to :container, :polymorphic => true
belongs_to :author, :class_name => "User", :foreign_key => "author_id" belongs_to :author, :class_name => "User", :foreign_key => "author_id"
validates_presence_of :container, :filename validates_presence_of :container, :filename, :author
validates_length_of :filename, :maximum => 255 validates_length_of :filename, :maximum => 255
validates_length_of :disk_filename, :maximum => 255 validates_length_of :disk_filename, :maximum => 255
...@@ -82,11 +82,6 @@ class Attachment < ActiveRecord::Base ...@@ -82,11 +82,6 @@ class Attachment < ActiveRecord::Base
def increment_download def increment_download
increment!(:downloads) increment!(:downloads)
end end
# returns last created projects
def self.most_downloaded
find(:all, :limit => 5, :order => "downloads DESC")
end
def project def project
container.is_a?(Project) ? container : container.project container.is_a?(Project) ? container : container.project
......
...@@ -112,11 +112,8 @@ class Query < ActiveRecord::Base ...@@ -112,11 +112,8 @@ class Query < ActiveRecord::Base
def initialize(attributes = nil) def initialize(attributes = nil)
super attributes super attributes
self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} } self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} }
end @executed_by = User.current.logged? ? User.current : nil
set_language_if_valid(executed_by.language) if executed_by
def executed_by=(user)
@executed_by = user
set_language_if_valid(user.language) if user
end end
def validate def validate
......
...@@ -19,6 +19,7 @@ require "digest/sha1" ...@@ -19,6 +19,7 @@ require "digest/sha1"
class User < ActiveRecord::Base class User < ActiveRecord::Base
# Account statuses # Account statuses
STATUS_ANONYMOUS = 0
STATUS_ACTIVE = 1 STATUS_ACTIVE = 1
STATUS_REGISTERED = 2 STATUS_REGISTERED = 2
STATUS_LOCKED = 3 STATUS_LOCKED = 3
...@@ -36,15 +37,15 @@ class User < ActiveRecord::Base ...@@ -36,15 +37,15 @@ class User < ActiveRecord::Base
# Prevents unauthorized assignments # Prevents unauthorized assignments
attr_protected :login, :admin, :password, :password_confirmation, :hashed_password attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
validates_presence_of :login, :firstname, :lastname, :mail validates_presence_of :login, :firstname, :lastname, :mail, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
validates_uniqueness_of :login, :mail validates_uniqueness_of :login, :mail
# Login must contain lettres, numbers, underscores only # Login must contain lettres, numbers, underscores only
validates_format_of :login, :with => /^[a-z0-9_\-@\.]+$/i validates_format_of :login, :with => /^[a-z0-9_\-@\.]*$/i
validates_length_of :login, :maximum => 30 validates_length_of :login, :maximum => 30
validates_format_of :firstname, :lastname, :with => /^[\w\s\'\-]*$/i validates_format_of :firstname, :lastname, :with => /^[\w\s\'\-]*$/i
validates_length_of :firstname, :lastname, :maximum => 30 validates_length_of :firstname, :lastname, :maximum => 30
validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :allow_nil => true
validates_length_of :mail, :maximum => 60 validates_length_of :mail, :maximum => 60, :allow_nil => true
# Password length between 4 and 12 # Password length between 4 and 12
validates_length_of :password, :in => 4..12, :allow_nil => true validates_length_of :password, :in => 4..12, :allow_nil => true
validates_confirmation_of :password, :allow_nil => true validates_confirmation_of :password, :allow_nil => true
...@@ -216,11 +217,17 @@ class User < ActiveRecord::Base ...@@ -216,11 +217,17 @@ class User < ActiveRecord::Base
end end
def self.current def self.current
@current_user ||= AnonymousUser.new @current_user ||= User.anonymous
end end
def self.anonymous def self.anonymous
AnonymousUser.new return @anonymous_user if @anonymous_user
anonymous_user = AnonymousUser.find(:first)
if anonymous_user.nil?
anonymous_user = AnonymousUser.create(:lastname => 'Anonymous', :firstname => '', :mail => '', :login => '', :status => 0)
raise 'Unable to create the anonymous user.' if anonymous_user.new_record?
end
@anonymous_user = anonymous_user
end end
private private
...@@ -231,16 +238,17 @@ private ...@@ -231,16 +238,17 @@ private
end end
class AnonymousUser < User class AnonymousUser < User
def logged?
false
end
def time_zone def validate_on_create
nil # There should be only one AnonymousUser in the database
errors.add_to_base 'An anonymous user already exists.' if AnonymousUser.find(:first)
end end
# Anonymous user has no RSS key # Overrides a few properties
def rss_key def logged?; false end
nil def admin; false end
end def name; 'Anonymous' end
def mail; nil end
def time_zone; nil end
def rss_key; nil end
end end
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
<h3 class="icon22 icon22-comment"><%= l(:label_comment_plural) %></h3> <h3 class="icon22 icon22-comment"><%= l(:label_comment_plural) %></h3>
<% @news.comments.each do |comment| %> <% @news.comments.each do |comment| %>
<% next if comment.new_record? %> <% next if comment.new_record? %>
<h4><%= format_time(comment.created_on) %> - <%= comment.author.name %></h4> <h4><%= authoring comment.created_on, comment.author %></h4>
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %> <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
</div> </div>
......
class AddUsersType < ActiveRecord::Migration
def self.up
add_column :users, :type, :string
User.update_all "type = 'User'"
end
def self.down
remove_column :users, :type
end
end
...@@ -29,11 +29,11 @@ Redmine::AccessControl.map do |map| ...@@ -29,11 +29,11 @@ Redmine::AccessControl.map do |map|
:issues => [:index, :changes, :show, :context_menu], :issues => [:index, :changes, :show, :context_menu],
:queries => :index, :queries => :index,
:reports => :issue_report}, :public => true :reports => :issue_report}, :public => true
map.permission :add_issues, {:projects => :add_issue}, :require => :loggedin map.permission :add_issues, {:projects => :add_issue}
map.permission :edit_issues, {:projects => :bulk_edit_issues, map.permission :edit_issues, {:projects => :bulk_edit_issues,
:issues => [:edit, :destroy_attachment]}, :require => :loggedin :issues => [:edit, :destroy_attachment]}
map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}, :require => :loggedin map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}
map.permission :add_issue_notes, {:issues => :add_note}, :require => :loggedin map.permission :add_issue_notes, {:issues => :add_note}
map.permission :change_issue_status, {:issues => :change_status}, :require => :loggedin map.permission :change_issue_status, {:issues => :change_status}, :require => :loggedin
map.permission :move_issues, {:projects => :move_issues}, :require => :loggedin map.permission :move_issues, {:projects => :move_issues}, :require => :loggedin
map.permission :delete_issues, {:issues => :destroy}, :require => :member map.permission :delete_issues, {:issues => :destroy}, :require => :member
...@@ -53,7 +53,7 @@ Redmine::AccessControl.map do |map| ...@@ -53,7 +53,7 @@ Redmine::AccessControl.map do |map|
map.project_module :news do |map| map.project_module :news do |map|
map.permission :manage_news, {:projects => :add_news, :news => [:edit, :destroy, :destroy_comment]}, :require => :member map.permission :manage_news, {:projects => :add_news, :news => [:edit, :destroy, :destroy_comment]}, :require => :member
map.permission :view_news, {:news => [:index, :show]}, :public => true map.permission :view_news, {:news => [:index, :show]}, :public => true
map.permission :comment_news, {:news => :add_comment}, :require => :loggedin map.permission :comment_news, {:news => :add_comment}
end end
map.project_module :documents do |map| map.project_module :documents do |map|
...@@ -83,7 +83,7 @@ Redmine::AccessControl.map do |map| ...@@ -83,7 +83,7 @@ Redmine::AccessControl.map do |map|
map.project_module :boards do |map| map.project_module :boards do |map|
map.permission :manage_boards, {:boards => [:new, :edit, :destroy]}, :require => :member map.permission :manage_boards, {:boards => [:new, :edit, :destroy]}, :require => :member
map.permission :view_messages, {:boards => [:index, :show], :messages => [:show]}, :public => true map.permission :view_messages, {:boards => [:index, :show], :messages => [:show]}, :public => true
map.permission :add_messages, {:messages => [:new, :reply]}, :require => :loggedin map.permission :add_messages, {:messages => [:new, :reply]}
end end
end end
......
...@@ -60,7 +60,7 @@ class UserTest < Test::Unit::TestCase ...@@ -60,7 +60,7 @@ class UserTest < Test::Unit::TestCase
def test_validate def test_validate
@admin.login = "" @admin.login = ""
assert !@admin.save assert !@admin.save
assert_equal 2, @admin.errors.count assert_equal 1, @admin.errors.count
end end
def test_password def test_password
...@@ -87,6 +87,13 @@ class UserTest < Test::Unit::TestCase ...@@ -87,6 +87,13 @@ class UserTest < Test::Unit::TestCase
assert_equal nil, user assert_equal nil, user
end end
def test_create_anonymous
AnonymousUser.delete_all
anon = User.anonymous
assert !anon.new_record?
assert_kind_of AnonymousUser, anon
end
def test_rss_key def test_rss_key
assert_nil @jsmith.rss_token assert_nil @jsmith.rss_token
key = @jsmith.rss_key key = @jsmith.rss_key
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment