summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-01-14 21:26:35 +0200
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-01-14 21:26:35 +0200
commitcbd78922ee43c0124458e2867071f752cae712f4 (patch)
tree5367dd4e0370f11bc5733de364016f2572a3323f
parent09b877ef29a0c641457eb986c5b228d003c51c16 (diff)
parentdda6b0ab63eb8080e34b4273cfb6aadb7a29c028 (diff)
downloadgitlab-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.rb44
-rw-r--r--app/models/key.rb17
-rw-r--r--app/models/project.rb3
-rw-r--r--app/views/deploy_keys/_form.html.haml16
-rw-r--r--app/views/deploy_keys/_show.html.haml7
-rw-r--r--app/views/deploy_keys/create.js.haml9
-rw-r--r--app/views/deploy_keys/edit.html.haml7
-rw-r--r--app/views/deploy_keys/index.html.haml11
-rw-r--r--app/views/deploy_keys/new.html.haml5
-rw-r--r--app/views/deploy_keys/new.js.haml11
-rw-r--r--app/views/deploy_keys/show.html.haml10
-rw-r--r--app/views/layouts/project.html.haml1
-rw-r--r--app/views/repositories/_head.html.haml11
-rw-r--r--config/routes.rb2
-rw-r--r--db/migrate/20111231111825_add_project_id_to_key.rb6
-rw-r--r--db/schema.rb3
-rw-r--r--spec/models/key_spec.rb2
-rw-r--r--spec/requests/projects_deploy_keys_spec.rb68
-rw-r--r--spec/requests/projects_security_spec.rb9
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 }