diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2012-01-14 21:26:35 +0200 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2012-01-14 21:26:35 +0200 |
commit | cbd78922ee43c0124458e2867071f752cae712f4 (patch) | |
tree | 5367dd4e0370f11bc5733de364016f2572a3323f | |
parent | 09b877ef29a0c641457eb986c5b228d003c51c16 (diff) | |
parent | dda6b0ab63eb8080e34b4273cfb6aadb7a29c028 (diff) | |
download | gitlab-ce-cbd78922ee43c0124458e2867071f752cae712f4.tar.gz |
Merge branch 'deploy_keys'
Conflicts:
app/views/layouts/project.html.haml
db/schema.rb
-rw-r--r-- | app/controllers/deploy_keys_controller.rb | 44 | ||||
-rw-r--r-- | app/models/key.rb | 17 | ||||
-rw-r--r-- | app/models/project.rb | 3 | ||||
-rw-r--r-- | app/views/deploy_keys/_form.html.haml | 16 | ||||
-rw-r--r-- | app/views/deploy_keys/_show.html.haml | 7 | ||||
-rw-r--r-- | app/views/deploy_keys/create.js.haml | 9 | ||||
-rw-r--r-- | app/views/deploy_keys/edit.html.haml | 7 | ||||
-rw-r--r-- | app/views/deploy_keys/index.html.haml | 11 | ||||
-rw-r--r-- | app/views/deploy_keys/new.html.haml | 5 | ||||
-rw-r--r-- | app/views/deploy_keys/new.js.haml | 11 | ||||
-rw-r--r-- | app/views/deploy_keys/show.html.haml | 10 | ||||
-rw-r--r-- | app/views/layouts/project.html.haml | 1 | ||||
-rw-r--r-- | app/views/repositories/_head.html.haml | 11 | ||||
-rw-r--r-- | config/routes.rb | 2 | ||||
-rw-r--r-- | db/migrate/20111231111825_add_project_id_to_key.rb | 6 | ||||
-rw-r--r-- | db/schema.rb | 3 | ||||
-rw-r--r-- | spec/models/key_spec.rb | 2 | ||||
-rw-r--r-- | spec/requests/projects_deploy_keys_spec.rb | 68 | ||||
-rw-r--r-- | spec/requests/projects_security_spec.rb | 9 |
19 files changed, 234 insertions, 8 deletions
diff --git a/app/controllers/deploy_keys_controller.rb b/app/controllers/deploy_keys_controller.rb new file mode 100644 index 00000000000..36e42789e11 --- /dev/null +++ b/app/controllers/deploy_keys_controller.rb @@ -0,0 +1,44 @@ +class DeployKeysController < ApplicationController + respond_to :js, :html + layout "project" + before_filter :project + + # Authorize + before_filter :add_project_abilities + before_filter :authorize_admin_project! + + def project + @project ||= Project.find_by_code(params[:project_id]) + end + + def index + @keys = @project.deploy_keys.all + end + + def show + @key = @project.deploy_keys.find(params[:id]) + end + + def new + @key = @project.deploy_keys.new + + respond_with(@key) + end + + def create + @key = @project.deploy_keys.new(params[:key]) + @key.save + + respond_with(@key) + end + + def destroy + @key = @project.deploy_keys.find(params[:id]) + @key.destroy + + respond_to do |format| + format.html { redirect_to project_deploy_keys_url } + format.js { render :nothing => true } + end + end +end diff --git a/app/models/key.rb b/app/models/key.rb index 359538d2cbd..e59753681e8 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -1,5 +1,6 @@ class Key < ActiveRecord::Base belongs_to :user + belongs_to :project validates :title, :presence => true, @@ -15,7 +16,11 @@ class Key < ActiveRecord::Base after_destroy :repository_delete_key def set_identifier - self.identifier = "#{user.identifier}_#{Time.now.to_i}" + if is_deploy_key + self.identifier = "deploy_#{project.code}_#{Time.now.to_i}" + else + self.identifier = "#{user.identifier}_#{Time.now.to_i}" + end end def update_repository @@ -31,10 +36,18 @@ class Key < ActiveRecord::Base c.update_projects(projects) end end + + def is_deploy_key + true if project_id + end #projects that has this key def projects - user.projects + if is_deploy_key + [project] + else + user.projects + end end end # == Schema Information diff --git a/app/models/project.rb b/app/models/project.rb index 420b8d1ba3e..10a5ffd0bce 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -14,6 +14,7 @@ class Project < ActiveRecord::Base has_many :users, :through => :users_projects has_many :notes, :dependent => :destroy has_many :snippets, :dependent => :destroy + has_many :deploy_keys, :dependent => :destroy, :foreign_key => "project_id", :class_name => "Key" has_many :web_hooks, :dependent => :destroy acts_as_taggable @@ -199,7 +200,7 @@ class Project < ActiveRecord::Base def repository_readers keys = Key.joins({:user => :users_projects}). where("users_projects.project_id = ? AND users_projects.repo_access = ?", id, Repository::REPO_R) - keys.map(&:identifier) + keys.map(&:identifier) + deploy_keys.map(&:identifier) end def repository_writers diff --git a/app/views/deploy_keys/_form.html.haml b/app/views/deploy_keys/_form.html.haml new file mode 100644 index 00000000000..d3a2682ae3e --- /dev/null +++ b/app/views/deploy_keys/_form.html.haml @@ -0,0 +1,16 @@ +%div + = form_for [@project, @key], :url => project_deploy_keys_path, :remote => true do |f| + -if @key.errors.any? + %ul + - @key.errors.full_messages.each do |msg| + %li= msg + + .form-row + = f.label :title + = f.text_field :title, :style => "width:300px" + .form-row + = f.label :key + = f.text_area :key, :style => "width:300px; height:130px" + .form-row + = f.submit 'Save', :class => "grey-button" + diff --git a/app/views/deploy_keys/_show.html.haml b/app/views/deploy_keys/_show.html.haml new file mode 100644 index 00000000000..b1622f35167 --- /dev/null +++ b/app/views/deploy_keys/_show.html.haml @@ -0,0 +1,7 @@ +%a.update-item{:href => project_deploy_key_path(key.project, key)} + %span.update-title + = key.title + %span.update-author + Added + = time_ago_in_words(key.created_at) + ago diff --git a/app/views/deploy_keys/create.js.haml b/app/views/deploy_keys/create.js.haml new file mode 100644 index 00000000000..0e8757f880f --- /dev/null +++ b/app/views/deploy_keys/create.js.haml @@ -0,0 +1,9 @@ +- if @key.valid? + :plain + $("#new_key_dialog").dialog("close"); + $("#keys-table .data").append("#{escape_javascript(render(:partial => 'show', :locals => {:key => @key} ))}"); + $("#no_ssh_key_defined").hide(); +- else + :plain + $("#new_key_dialog").empty(); + $("#new_key_dialog").append("#{escape_javascript(render('form'))}"); diff --git a/app/views/deploy_keys/edit.html.haml b/app/views/deploy_keys/edit.html.haml new file mode 100644 index 00000000000..9b1b9aac221 --- /dev/null +++ b/app/views/deploy_keys/edit.html.haml @@ -0,0 +1,7 @@ +%h1 Editing key + += render 'form' + += link_to 'Show', @key +\| += link_to 'Back', project_deploy_keys_path diff --git a/app/views/deploy_keys/index.html.haml b/app/views/deploy_keys/index.html.haml new file mode 100644 index 00000000000..d3feadb8742 --- /dev/null +++ b/app/views/deploy_keys/index.html.haml @@ -0,0 +1,11 @@ += render "repositories/head" + +%div#keys-table{ :class => "update-data ui-box ui-box-small ui-box-big" } + .data + - @keys.each do |key| + = render(:partial => 'show', :locals => {:key => key}) + +:javascript + $('.delete-key').live('ajax:success', function() { + $(this).closest('.update-item').fadeOut(); }); + diff --git a/app/views/deploy_keys/new.html.haml b/app/views/deploy_keys/new.html.haml new file mode 100644 index 00000000000..9be37204567 --- /dev/null +++ b/app/views/deploy_keys/new.html.haml @@ -0,0 +1,5 @@ +%h1 New key + += render 'form' + += link_to 'Back', project_deploy_keys_path diff --git a/app/views/deploy_keys/new.js.haml b/app/views/deploy_keys/new.js.haml new file mode 100644 index 00000000000..86e9db030c5 --- /dev/null +++ b/app/views/deploy_keys/new.js.haml @@ -0,0 +1,11 @@ +:plain + var new_key_dialog = $("<div id='new_key_dialog'></div>"); + new_key_dialog.html("#{escape_javascript(render('form'))}"); + $(new_key_dialog).dialog({ + width: 350, + resizable: false, + draggable: false, + title: "Add new public key", + close: function(event, ui) { $("#new_key_dialog").remove();}, + modal: true + }); diff --git a/app/views/deploy_keys/show.html.haml b/app/views/deploy_keys/show.html.haml new file mode 100644 index 00000000000..2c5c6149313 --- /dev/null +++ b/app/views/deploy_keys/show.html.haml @@ -0,0 +1,10 @@ +.ui-box.width-100p + %h3= @key.title + .data + %pre= @key.key + .clear + .buttons + = link_to 'Remove', project_deploy_key_path(@key.project, @key), :confirm => 'Are you sure?', :method => :delete, :class => "red-button delete-key right" + .clear + + diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml index f27516deefa..3afb762d303 100644 --- a/app/views/layouts/project.html.haml +++ b/app/views/layouts/project.html.haml @@ -44,5 +44,6 @@ %span{ :class => "number" }= @project.merge_requests.opened.count + .project-content = yield diff --git a/app/views/repositories/_head.html.haml b/app/views/repositories/_head.html.haml index 53af050df44..82a22807634 100644 --- a/app/views/repositories/_head.html.haml +++ b/app/views/repositories/_head.html.haml @@ -11,13 +11,18 @@ = link_to project_hooks_path, :class => "tab #{'active' if controller.controller_name == "hooks" }" do %span Hooks - -#= link_to "#", :class => "tab" do - %span - Deploy Keys + - if can? current_user, :admin_project, @project + = link_to project_deploy_keys_path(@project), :class => "tab #{'active' if controller.controller_name == "deploy_keys"}" do + %span + Deploy Keys - if current_page?(project_hooks_path(@project)) - if can? current_user, :admin_project, @project = link_to new_project_hook_path(@project), :class => "add_new", :title => "New Web Hook" do = image_tag "add_new.png", :width => 14 + - if current_page?(project_deploy_keys_path(@project)) + - if can? current_user, :admin_project, @project + = link_to new_project_deploy_key_path(@project), :class => "add_new", :title => "New Deploy Key", :remote => true do + = image_tag "add_new.png", :width => 14 diff --git a/config/routes.rb b/config/routes.rb index 9d1e7089209..3a4018d5cff 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -53,6 +53,8 @@ Gitlab::Application.routes.draw do end end + resources :deploy_keys + resources :refs, :only => [], :path => "/" do collection do get "switch" diff --git a/db/migrate/20111231111825_add_project_id_to_key.rb b/db/migrate/20111231111825_add_project_id_to_key.rb new file mode 100644 index 00000000000..dc80cbdb71f --- /dev/null +++ b/db/migrate/20111231111825_add_project_id_to_key.rb @@ -0,0 +1,6 @@ +class AddProjectIdToKey < ActiveRecord::Migration + def change + add_column :keys, :project_id, :integer, :null => true + change_column :keys, :user_id, :integer, :null => true + end +end diff --git a/db/schema.rb b/db/schema.rb index 935f108afe9..e4066f50443 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -39,12 +39,13 @@ ActiveRecord::Schema.define(:version => 20120110180749) do end create_table "keys", :force => true do |t| - t.integer "user_id", :null => false + t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" t.text "key" t.string "title" t.string "identifier" + t.integer "project_id" end create_table "merge_requests", :force => true do |t| diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb index 6522b825e14..dec0b9961a3 100644 --- a/spec/models/key_spec.rb +++ b/spec/models/key_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' describe Key do describe "Associations" do - it { should belong_to(:user) } + it { should belong_to(:user) or belong_to(:project) } end describe "Validation" do diff --git a/spec/requests/projects_deploy_keys_spec.rb b/spec/requests/projects_deploy_keys_spec.rb new file mode 100644 index 00000000000..8258f2609a1 --- /dev/null +++ b/spec/requests/projects_deploy_keys_spec.rb @@ -0,0 +1,68 @@ +require 'spec_helper' + +describe "Projects", "DeployKeys" do + let(:project) { Factory :project } + + before do + login_as :user + project.add_access(@user, :read, :write, :admin) + end + + describe "GET /keys" do + before do + @key = Factory :key, :project => project + visit project_deploy_keys_path(project) + end + + subject { page } + + it { should have_content(@key.title) } + + describe "Destroy" do + before { visit project_deploy_key_path(project, @key) } + + it "should remove entry" do + expect { + click_link "Remove" + }.to change { project.deploy_keys.count }.by(-1) + end + end + end + + describe "New key", :js => true do + before do + visit project_deploy_keys_path(project) + click_link "New Deploy Key" + end + + it "should open new key popup" do + page.should have_content("Add new public key") + end + + describe "fill in" do + before do + fill_in "key_title", :with => "laptop" + fill_in "key_key", :with => "publickey234=" + end + + it { expect { click_button "Save" }.to change {Key.count}.by(1) } + + it "should add new key to table" do + click_button "Save" + + page.should_not have_content("Add new public key") + page.should have_content "laptop" + end + end + end + + describe "Show page" do + before do + @key = Factory :key, :project => project + visit project_deploy_key_path(project, @key) + end + + it { page.should have_content @key.title } + it { page.should have_content @key.key[0..10] } + end +end diff --git a/spec/requests/projects_security_spec.rb b/spec/requests/projects_security_spec.rb index 2ddeb6e181c..fb9f3d8cc60 100644 --- a/spec/requests/projects_security_spec.rb +++ b/spec/requests/projects_security_spec.rb @@ -105,6 +105,15 @@ describe "Projects" do it { edit_project_path(@project).should be_denied_for :visitor } end + describe "GET /project_code/deploy_keys" do + it { project_deploy_keys_path(@project).should be_allowed_for @u1 } + it { project_deploy_keys_path(@project).should be_denied_for @u3 } + it { project_deploy_keys_path(@project).should be_denied_for :admin } + it { project_deploy_keys_path(@project).should be_denied_for @u2 } + it { project_deploy_keys_path(@project).should be_denied_for :user } + it { project_deploy_keys_path(@project).should be_denied_for :visitor } + end + describe "GET /project_code/issues" do it { project_issues_path(@project).should be_allowed_for @u1 } it { project_issues_path(@project).should be_allowed_for @u3 } |