diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e8284a0..ece2529 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -51,7 +51,7 @@ module ApplicationHelper def link_to_user(user, options={}) if user.is_a?(User) name = h(user.name(options[:format])) - if user.active? || (User.current.admin? && user.logged?) + if user.active? || (User.current.admin? && user.logged?) && (User.current.admin? && (not User.current.allowed_to?(:hide_public_projects, nil, :global => true))) only_path = options[:only_path].nil? ? true : options[:only_path] link_to name, user_url(user, :only_path => only_path), :class => user.css_classes else diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index b714a1e..f38f4a7 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -62,8 +62,10 @@ module ProjectsHelper def render_project_action_links links = (+"").html_safe - if User.current.allowed_to?(:add_project, nil, :global => true) - links << link_to(l(:label_project_new), new_project_path, :class => 'icon icon-add') + if not User.current.allowed_to?(:hide_public_projects, nil, :global => true) + if User.current.allowed_to?(:add_project, nil, :global => true) + links << link_to(l(:label_project_new), new_project_path, :class => 'icon icon-add') + end end if User.current.admin? links << link_to(l(:label_administration), admin_projects_path, :class => 'icon icon-settings') @@ -74,9 +76,13 @@ module ProjectsHelper # Renders the projects index def render_project_hierarchy(projects) render_project_nested_lists(projects) do |project| - s = link_to_project(project, {}, :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'icon icon-user my-project' : nil}") - if project.description.present? - s << content_tag('div', textilizable(project.short_description, :project => project), :class => 'wiki description') + if (not User.current.logged?) || ((not User.current.admin) && (not User.current.member_of?(project)) && User.current.allowed_to?(:hide_public_projects, nil, :global => true)) + s = "" + else + s = link_to_project(project, {}, :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'icon icon-user my-project' : nil}") + if project.description.present? + s << content_tag('div', textilizable(project.short_description, :project => project), :class => 'wiki description') + end end s end diff --git a/app/models/project.rb b/app/models/project.rb index d4af06c..4591be7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -188,7 +188,7 @@ class Project < ActiveRecord::Base statement_by_role = {} unless options[:member] role = user.builtin_role - if role.allowed_to?(permission) + if role.allowed_to?(permission) && !user.allowed_to?(:hide_public_projects, nil, :global => true) s = "#{Project.table_name}.is_public = #{connection.quoted_true}" if user.id group = role.anonymous? ? Group.anonymous : Group.non_member diff --git a/app/models/user.rb b/app/models/user.rb index c7612c9..d4fab04 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -603,7 +603,7 @@ class User < Principal return [] if project.nil? || project.archived? if membership = membership(project) membership.roles.to_a - elsif project.is_public? + elsif project.is_public? && !allowed_to?(:hide_public_projects, nil, :global => true) project.override_roles(builtin_role) else [] @@ -705,7 +705,7 @@ class User < Principal roles = roles_for_project(context) return false unless roles roles.any? {|role| - (context.is_public? || role.member?) && + ((context.is_public? && !allowed_to?(:hide_public_projects, nil, :global => true)) || role.member?) && role.allowed_to?(action) && (block_given? ? yield(role, self) : true) } diff --git a/lib/redmine.rb b/lib/redmine.rb index 9ecca63..cad51d6 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -79,6 +79,7 @@ Redmine::Scm::Base.add "Filesystem" # Permissions Redmine::AccessControl.map do |map| map.permission :view_project, {:projects => [:show, :bookmark], :activities => [:index]}, :public => true, :read => true + map.permission :hide_public_projects, {:projects => [:show]}, :require => :loggedin map.permission :search_project, {:search => :index}, :public => true, :read => true map.permission :add_project, {:projects => [:new, :create]}, :require => :loggedin map.permission :edit_project, {:projects => [:settings, :edit, :update]}, :require => :member