Commit 4c6224aad173a26f1fbe20588b4b155f031d779f

Authored by Dmitriy Zaporozhets
1 parent eb626edd

Public git read-only access via http

app/controllers/public/projects_controller.rb 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +class Public::ProjectsController < ApplicationController
  2 + skip_before_filter :authenticate_user!,
  3 + :reject_blocked, :set_current_user_for_observers,
  4 + :add_abilities
  5 +
  6 + layout 'public'
  7 +
  8 + def index
  9 + @projects = Project.where(public: true)
  10 + end
  11 +end
... ...
app/models/project.rb
... ... @@ -28,7 +28,7 @@ class Project &lt; ActiveRecord::Base
28 28 attr_accessible :name, :path, :description, :default_branch, :issues_enabled,
29 29 :wall_enabled, :merge_requests_enabled, :wiki_enabled, as: [:default, :admin]
30 30  
31   - attr_accessible :namespace_id, :creator_id, as: :admin
  31 + attr_accessible :namespace_id, :creator_id, :public, as: :admin
32 32  
33 33 attr_accessor :error_code
34 34  
... ...
app/views/admin/projects/_form.html.haml
... ... @@ -44,6 +44,13 @@
44 44 .input= f.check_box :wiki_enabled
45 45  
46 46 %fieldset.features
  47 + %legend Public mode:
  48 + .clearfix
  49 + = f.label :public do
  50 + %span Allow public http clone
  51 + .input= f.check_box :public
  52 +
  53 + %fieldset.features
47 54 %legend Transfer:
48 55 .control-group
49 56 = f.label :namespace_id do
... ...
app/views/admin/projects/show.html.haml
... ... @@ -77,6 +77,13 @@
77 77 SSH:
78 78 %td
79 79 = link_to @project.ssh_url_to_repo
  80 + - if @project.public
  81 + %tr.bgred
  82 + %td
  83 + %b
  84 + Public Read-Only Code access:
  85 + %td
  86 + = check_box_tag 'public', nil, @project.public
80 87  
81 88 - if @repository
82 89 %table.zebra-striped
... ...
app/views/layouts/public.html.haml 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +!!! 5
  2 +%html{ lang: "en"}
  3 + = render "layouts/head", title: "Error"
  4 + %body{class: "#{app_theme} application"}
  5 + %header.navbar.navbar-static-top.navbar-gitlab
  6 + .navbar-inner
  7 + .container
  8 + %div.app_logo
  9 + %span.separator
  10 + = link_to public_root_path, class: "home" do
  11 + %h1 GITLAB
  12 + %span.separator
  13 + %h1.project_name Public
  14 + .container
  15 + .content
  16 + .prepend-top-20
  17 + = yield
... ...
app/views/public/projects/index.html.haml 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +%h3.page_title
  2 + Projects
  3 + %small Read-Only Access
  4 +%hr
  5 +
  6 +%ul.well-list
  7 + - @projects.each do |project|
  8 + %li.clearfix
  9 + %h5
  10 + %i.icon-star.cgreen
  11 + = project.name_with_namespace
  12 + .right
  13 + %span.monospace.tiny
  14 + git clone #{project.http_url_to_repo}
... ...
config/routes.rb
... ... @@ -37,6 +37,14 @@ Gitlab::Application.routes.draw do
37 37 get 'help/raketasks' => 'help#raketasks'
38 38  
39 39 #
  40 + # Public namespace
  41 + #
  42 + namespace :public do
  43 + resources :projects, only: [:index]
  44 + root to: "projects#index"
  45 + end
  46 +
  47 + #
40 48 # Admin Area
41 49 #
42 50 namespace :admin do
... ...
db/migrate/20130110172407_add_public_to_project.rb 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +class AddPublicToProject < ActiveRecord::Migration
  2 + def change
  3 + add_column :projects, :public, :boolean, default: false, null: false
  4 + end
  5 +end
... ...
db/schema.rb
... ... @@ -11,7 +11,7 @@
11 11 #
12 12 # It's strongly recommended to check this file into your version control system.
13 13  
14   -ActiveRecord::Schema.define(:version => 20130102143055) do
  14 +ActiveRecord::Schema.define(:version => 20130110172407) do
15 15  
16 16 create_table "events", :force => true do |t|
17 17 t.string "target_type"
... ... @@ -145,16 +145,17 @@ ActiveRecord::Schema.define(:version =&gt; 20130102143055) do
145 145 t.string "name"
146 146 t.string "path"
147 147 t.text "description"
148   - t.datetime "created_at", :null => false
149   - t.datetime "updated_at", :null => false
150   - t.boolean "private_flag", :default => true, :null => false
  148 + t.datetime "created_at", :null => false
  149 + t.datetime "updated_at", :null => false
  150 + t.boolean "private_flag", :default => true, :null => false
151 151 t.integer "creator_id"
152 152 t.string "default_branch"
153   - t.boolean "issues_enabled", :default => true, :null => false
154   - t.boolean "wall_enabled", :default => true, :null => false
155   - t.boolean "merge_requests_enabled", :default => true, :null => false
156   - t.boolean "wiki_enabled", :default => true, :null => false
  153 + t.boolean "issues_enabled", :default => true, :null => false
  154 + t.boolean "wall_enabled", :default => true, :null => false
  155 + t.boolean "merge_requests_enabled", :default => true, :null => false
  156 + t.boolean "wiki_enabled", :default => true, :null => false
157 157 t.integer "namespace_id"
  158 + t.boolean "public", :default => false, :null => false
158 159 end
159 160  
160 161 add_index "projects", ["creator_id"], :name => "index_projects_on_owner_id"
... ...
lib/gitlab/backend/grack_auth.rb
... ... @@ -3,6 +3,16 @@ module Grack
3 3 attr_accessor :user, :project
4 4  
5 5 def valid?
  6 + # Find project by PATH_INFO from env
  7 + if m = /^\/([\w\.\/-]+)\.git/.match(@request.path_info).to_a
  8 + self.project = Project.find_with_namespace(m.last)
  9 + return false unless project
  10 + end
  11 +
  12 + if @request.get? && project.public
  13 + return true
  14 + end
  15 +
6 16 # Authentication with username and password
7 17 login, password = @auth.credentials
8 18  
... ... @@ -17,12 +27,6 @@ module Grack
17 27 # Pass Gitolite update hook
18 28 ENV['GL_BYPASS_UPDATE_HOOK'] = "true"
19 29  
20   - # Find project by PATH_INFO from env
21   - if m = /^\/([\w\.\/-]+)\.git/.match(@request.path_info).to_a
22   - self.project = Project.find_with_namespace(m.last)
23   - return false unless project
24   - end
25   -
26 30 # Git upload and receive
27 31 if @request.get?
28 32 validate_get_request
... ...