Commit 70e3bffd authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Fixed: post-receive, project remove, tests

parent 39e37677
...@@ -15,11 +15,10 @@ class ProjectObserver < ActiveRecord::Observer ...@@ -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 ...@@ -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
......
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
......
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 ...@@ -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 ...@@ -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' ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment