Public git read-only access via http

This commit is contained in:
Dmitriy Zaporozhets 2013-01-10 20:17:57 +02:00
parent eb626edd3f
commit 4c6224aad1
10 changed files with 89 additions and 15 deletions

View file

@ -0,0 +1,11 @@
class Public::ProjectsController < ApplicationController
skip_before_filter :authenticate_user!,
:reject_blocked, :set_current_user_for_observers,
:add_abilities
layout 'public'
def index
@projects = Project.where(public: true)
end
end

View file

@ -28,7 +28,7 @@ class Project < ActiveRecord::Base
attr_accessible :name, :path, :description, :default_branch, :issues_enabled,
:wall_enabled, :merge_requests_enabled, :wiki_enabled, as: [:default, :admin]
attr_accessible :namespace_id, :creator_id, as: :admin
attr_accessible :namespace_id, :creator_id, :public, as: :admin
attr_accessor :error_code

View file

@ -43,6 +43,13 @@
= f.label :wiki_enabled, "Wiki"
.input= f.check_box :wiki_enabled
%fieldset.features
%legend Public mode:
.clearfix
= f.label :public do
%span Allow public http clone
.input= f.check_box :public
%fieldset.features
%legend Transfer:
.control-group

View file

@ -77,6 +77,13 @@
SSH:
%td
= link_to @project.ssh_url_to_repo
- if @project.public
%tr.bgred
%td
%b
Public Read-Only Code access:
%td
= check_box_tag 'public', nil, @project.public
- if @repository
%table.zebra-striped

View file

@ -0,0 +1,17 @@
!!! 5
%html{ lang: "en"}
= render "layouts/head", title: "Error"
%body{class: "#{app_theme} application"}
%header.navbar.navbar-static-top.navbar-gitlab
.navbar-inner
.container
%div.app_logo
%span.separator
= link_to public_root_path, class: "home" do
%h1 GITLAB
%span.separator
%h1.project_name Public
.container
.content
.prepend-top-20
= yield

View file

@ -0,0 +1,14 @@
%h3.page_title
Projects
%small Read-Only Access
%hr
%ul.well-list
- @projects.each do |project|
%li.clearfix
%h5
%i.icon-star.cgreen
= project.name_with_namespace
.right
%span.monospace.tiny
git clone #{project.http_url_to_repo}

View file

@ -36,6 +36,14 @@ Gitlab::Application.routes.draw do
get 'help/ssh' => 'help#ssh'
get 'help/raketasks' => 'help#raketasks'
#
# Public namespace
#
namespace :public do
resources :projects, only: [:index]
root to: "projects#index"
end
#
# Admin Area
#

View file

@ -0,0 +1,5 @@
class AddPublicToProject < ActiveRecord::Migration
def change
add_column :projects, :public, :boolean, default: false, null: false
end
end

View file

@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20130102143055) do
ActiveRecord::Schema.define(:version => 20130110172407) do
create_table "events", :force => true do |t|
t.string "target_type"
@ -145,16 +145,17 @@ ActiveRecord::Schema.define(:version => 20130102143055) do
t.string "name"
t.string "path"
t.text "description"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.boolean "private_flag", :default => true, :null => false
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.boolean "private_flag", :default => true, :null => false
t.integer "creator_id"
t.string "default_branch"
t.boolean "issues_enabled", :default => true, :null => false
t.boolean "wall_enabled", :default => true, :null => false
t.boolean "merge_requests_enabled", :default => true, :null => false
t.boolean "wiki_enabled", :default => true, :null => false
t.boolean "issues_enabled", :default => true, :null => false
t.boolean "wall_enabled", :default => true, :null => false
t.boolean "merge_requests_enabled", :default => true, :null => false
t.boolean "wiki_enabled", :default => true, :null => false
t.integer "namespace_id"
t.boolean "public", :default => false, :null => false
end
add_index "projects", ["creator_id"], :name => "index_projects_on_owner_id"

View file

@ -3,6 +3,16 @@ module Grack
attr_accessor :user, :project
def valid?
# Find project by PATH_INFO from env
if m = /^\/([\w\.\/-]+)\.git/.match(@request.path_info).to_a
self.project = Project.find_with_namespace(m.last)
return false unless project
end
if @request.get? && project.public
return true
end
# Authentication with username and password
login, password = @auth.credentials
@ -17,12 +27,6 @@ module Grack
# Pass Gitolite update hook
ENV['GL_BYPASS_UPDATE_HOOK'] = "true"
# Find project by PATH_INFO from env
if m = /^\/([\w\.\/-]+)\.git/.match(@request.path_info).to_a
self.project = Project.find_with_namespace(m.last)
return false unless project
end
# Git upload and receive
if @request.get?
validate_get_request