Fixed: post-receive, project remove, tests
This commit is contained in:
parent
39e37677f2
commit
70e3bffd95
9 changed files with 43 additions and 47 deletions
|
@ -15,11 +15,10 @@ class ProjectObserver < ActiveRecord::Observer
|
|||
def after_destroy(project)
|
||||
GitoliteWorker.perform_async(
|
||||
:remove_repository,
|
||||
self.path_with_namespace
|
||||
project.path_with_namespace
|
||||
)
|
||||
|
||||
project.satellite.destroy
|
||||
project.destroy_repository
|
||||
|
||||
log_info("Project \"#{project.name}\" was removed")
|
||||
end
|
||||
|
|
|
@ -27,8 +27,9 @@ class PostReceive
|
|||
User.find_by_email(email) if email
|
||||
elsif /^[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}$/.match(identifier)
|
||||
User.find_by_email(identifier)
|
||||
else
|
||||
User.find_by_username(identifier.strip)
|
||||
elsif identifier =~ /key/
|
||||
key_id = identifier.gsub("key-", "")
|
||||
Key.find_by_id(key_id).try(:user)
|
||||
end
|
||||
|
||||
unless user
|
||||
|
|
|
@ -1,23 +1,37 @@
|
|||
module Gitlab
|
||||
# Access API
|
||||
# Internal access API
|
||||
class Internal < Grape::API
|
||||
namespace 'internal' do
|
||||
#
|
||||
# Check if ssh key has access to project code
|
||||
#
|
||||
get "/allowed" do
|
||||
key = Key.find(params[:key_id])
|
||||
user = key.user
|
||||
|
||||
get "/allowed" do
|
||||
user = User.find_by_username(params[:username])
|
||||
project = Project.find_with_namespace(params[:project])
|
||||
action = case params[:action]
|
||||
when 'git-upload-pack'
|
||||
then :download_code
|
||||
when 'git-receive-pack'
|
||||
then
|
||||
if project.protected_branch?(params[:ref])
|
||||
:push_code_to_protected_branches
|
||||
else
|
||||
:push_code
|
||||
project = Project.find_with_namespace(params[:project])
|
||||
action = case params[:action]
|
||||
when 'git-upload-pack'
|
||||
then :download_code
|
||||
when 'git-receive-pack'
|
||||
then
|
||||
if project.protected_branch?(params[:ref])
|
||||
:push_code_to_protected_branches
|
||||
else
|
||||
:push_code
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
user.can?(action, project)
|
||||
user.can?(action, project)
|
||||
end
|
||||
|
||||
#
|
||||
# Discover user by ssh key
|
||||
#
|
||||
get "/discover" do
|
||||
key = Key.find(params[:key_id])
|
||||
present key.user, with: Entities::User
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,16 +1,15 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Gitlab::Gitolite do
|
||||
describe Gitlab::Shell do
|
||||
let(:project) { double('Project', id: 7, path: 'diaspora') }
|
||||
let(:gitolite) { Gitlab::Gitolite.new }
|
||||
let(:gitolite) { Gitlab::Shell.new }
|
||||
|
||||
before do
|
||||
Project.stub(find: project)
|
||||
end
|
||||
|
||||
it { should respond_to :set_key }
|
||||
it { should respond_to :add_key }
|
||||
it { should respond_to :remove_key }
|
||||
|
||||
it { should respond_to :add_repository }
|
||||
it { should respond_to :remove_repository }
|
||||
|
|
@ -77,8 +77,6 @@ describe Project do
|
|||
it { should respond_to(:url_to_repo) }
|
||||
it { should respond_to(:repo_exists?) }
|
||||
it { should respond_to(:satellite) }
|
||||
it { should respond_to(:update_repository) }
|
||||
it { should respond_to(:destroy_repository) }
|
||||
it { should respond_to(:observe_push) }
|
||||
it { should respond_to(:update_merge_requests) }
|
||||
it { should respond_to(:execute_hooks) }
|
||||
|
|
|
@ -24,19 +24,4 @@ describe ProtectedBranch do
|
|||
it { should validate_presence_of(:project) }
|
||||
it { should validate_presence_of(:name) }
|
||||
end
|
||||
|
||||
describe 'Callbacks' do
|
||||
let(:branch) { build(:protected_branch) }
|
||||
|
||||
it 'call update_repository after save' do
|
||||
branch.should_receive(:update_repository)
|
||||
branch.save
|
||||
end
|
||||
|
||||
it 'call update_repository after destroy' do
|
||||
branch.save
|
||||
branch.should_receive(:update_repository)
|
||||
branch.destroy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,7 +3,7 @@ require 'spec_helper'
|
|||
describe KeyObserver do
|
||||
before do
|
||||
@key = double('Key',
|
||||
identifier: 'admin_654654',
|
||||
shell_id: 'key-32',
|
||||
key: '== a vaild ssh key',
|
||||
projects: [],
|
||||
is_deploy_key: false
|
||||
|
@ -14,14 +14,14 @@ describe KeyObserver do
|
|||
|
||||
context :after_save do
|
||||
it do
|
||||
GitoliteWorker.should_receive(:perform_async).with(:set_key, @key.identifier, @key.key, @key.projects.map(&:id))
|
||||
GitoliteWorker.should_receive(:perform_async).with(:add_key, @key.shell_id, @key.key)
|
||||
@observer.after_save(@key)
|
||||
end
|
||||
end
|
||||
|
||||
context :after_destroy do
|
||||
it do
|
||||
GitoliteWorker.should_receive(:perform_async).with(:remove_key, @key.identifier, @key.projects.map(&:id))
|
||||
GitoliteWorker.should_receive(:perform_async).with(:remove_key, @key.shell_id, @key.key)
|
||||
@observer.after_destroy(@key)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -48,11 +48,11 @@ module Gitlab
|
|||
true
|
||||
end
|
||||
|
||||
def add_key name, key
|
||||
def add_key id, key
|
||||
true
|
||||
end
|
||||
|
||||
def remove_key key
|
||||
def remove_key id, key
|
||||
true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -11,7 +11,7 @@ describe PostReceive do
|
|||
context "web hook" do
|
||||
let(:project) { create(:project) }
|
||||
let(:key) { create(:key, user: project.owner) }
|
||||
let(:key_id) { key.identifier }
|
||||
let(:key_id) { key.shell_id }
|
||||
|
||||
it "fetches the correct project" do
|
||||
Project.should_receive(:find_with_namespace).with(project.path_with_namespace).and_return(project)
|
||||
|
@ -19,7 +19,7 @@ describe PostReceive do
|
|||
end
|
||||
|
||||
it "does not run if the author is not in the project" do
|
||||
Key.stub(find_by_identifier: nil)
|
||||
Key.stub(find_by_id: nil)
|
||||
|
||||
project.should_not_receive(:observe_push)
|
||||
project.should_not_receive(:execute_hooks)
|
||||
|
|
Loading…
Reference in a new issue