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)
|
def after_destroy(project)
|
||||||
GitoliteWorker.perform_async(
|
GitoliteWorker.perform_async(
|
||||||
:remove_repository,
|
:remove_repository,
|
||||||
self.path_with_namespace
|
project.path_with_namespace
|
||||||
)
|
)
|
||||||
|
|
||||||
project.satellite.destroy
|
project.satellite.destroy
|
||||||
project.destroy_repository
|
|
||||||
|
|
||||||
log_info("Project \"#{project.name}\" was removed")
|
log_info("Project \"#{project.name}\" was removed")
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,8 +27,9 @@ class PostReceive
|
||||||
User.find_by_email(email) if email
|
User.find_by_email(email) if email
|
||||||
elsif /^[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}$/.match(identifier)
|
elsif /^[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}$/.match(identifier)
|
||||||
User.find_by_email(identifier)
|
User.find_by_email(identifier)
|
||||||
else
|
elsif identifier =~ /key/
|
||||||
User.find_by_username(identifier.strip)
|
key_id = identifier.gsub("key-", "")
|
||||||
|
Key.find_by_id(key_id).try(:user)
|
||||||
end
|
end
|
||||||
|
|
||||||
unless user
|
unless user
|
||||||
|
|
|
@ -1,23 +1,37 @@
|
||||||
module Gitlab
|
module Gitlab
|
||||||
# Access API
|
# Internal access API
|
||||||
class Internal < Grape::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
|
project = Project.find_with_namespace(params[:project])
|
||||||
user = User.find_by_username(params[:username])
|
action = case params[:action]
|
||||||
project = Project.find_with_namespace(params[:project])
|
when 'git-upload-pack'
|
||||||
action = case params[:action]
|
then :download_code
|
||||||
when 'git-upload-pack'
|
when 'git-receive-pack'
|
||||||
then :download_code
|
then
|
||||||
when 'git-receive-pack'
|
if project.protected_branch?(params[:ref])
|
||||||
then
|
:push_code_to_protected_branches
|
||||||
if project.protected_branch?(params[:ref])
|
else
|
||||||
:push_code_to_protected_branches
|
:push_code
|
||||||
else
|
end
|
||||||
: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
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,16 +1,15 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Gitlab::Gitolite do
|
describe Gitlab::Shell do
|
||||||
let(:project) { double('Project', id: 7, path: 'diaspora') }
|
let(:project) { double('Project', id: 7, path: 'diaspora') }
|
||||||
let(:gitolite) { Gitlab::Gitolite.new }
|
let(:gitolite) { Gitlab::Shell.new }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
Project.stub(find: project)
|
Project.stub(find: project)
|
||||||
end
|
end
|
||||||
|
|
||||||
it { should respond_to :set_key }
|
it { should respond_to :add_key }
|
||||||
it { should respond_to :remove_key }
|
it { should respond_to :remove_key }
|
||||||
|
|
||||||
it { should respond_to :add_repository }
|
it { should respond_to :add_repository }
|
||||||
it { should respond_to :remove_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(:url_to_repo) }
|
||||||
it { should respond_to(:repo_exists?) }
|
it { should respond_to(:repo_exists?) }
|
||||||
it { should respond_to(:satellite) }
|
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(:observe_push) }
|
||||||
it { should respond_to(:update_merge_requests) }
|
it { should respond_to(:update_merge_requests) }
|
||||||
it { should respond_to(:execute_hooks) }
|
it { should respond_to(:execute_hooks) }
|
||||||
|
|
|
@ -24,19 +24,4 @@ describe ProtectedBranch do
|
||||||
it { should validate_presence_of(:project) }
|
it { should validate_presence_of(:project) }
|
||||||
it { should validate_presence_of(:name) }
|
it { should validate_presence_of(:name) }
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@ require 'spec_helper'
|
||||||
describe KeyObserver do
|
describe KeyObserver do
|
||||||
before do
|
before do
|
||||||
@key = double('Key',
|
@key = double('Key',
|
||||||
identifier: 'admin_654654',
|
shell_id: 'key-32',
|
||||||
key: '== a vaild ssh key',
|
key: '== a vaild ssh key',
|
||||||
projects: [],
|
projects: [],
|
||||||
is_deploy_key: false
|
is_deploy_key: false
|
||||||
|
@ -14,14 +14,14 @@ describe KeyObserver do
|
||||||
|
|
||||||
context :after_save do
|
context :after_save do
|
||||||
it 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)
|
@observer.after_save(@key)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context :after_destroy do
|
context :after_destroy do
|
||||||
it 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)
|
@observer.after_destroy(@key)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -48,11 +48,11 @@ module Gitlab
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_key name, key
|
def add_key id, key
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove_key key
|
def remove_key id, key
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,7 +11,7 @@ describe PostReceive do
|
||||||
context "web hook" do
|
context "web hook" do
|
||||||
let(:project) { create(:project) }
|
let(:project) { create(:project) }
|
||||||
let(:key) { create(:key, user: project.owner) }
|
let(:key) { create(:key, user: project.owner) }
|
||||||
let(:key_id) { key.identifier }
|
let(:key_id) { key.shell_id }
|
||||||
|
|
||||||
it "fetches the correct project" do
|
it "fetches the correct project" do
|
||||||
Project.should_receive(:find_with_namespace).with(project.path_with_namespace).and_return(project)
|
Project.should_receive(:find_with_namespace).with(project.path_with_namespace).and_return(project)
|
||||||
|
@ -19,7 +19,7 @@ describe PostReceive do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "does not run if the author is not in the project" do
|
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(:observe_push)
|
||||||
project.should_not_receive(:execute_hooks)
|
project.should_not_receive(:execute_hooks)
|
||||||
|
|
Loading…
Add table
Reference in a new issue