summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Andrew <mail@timothyandrew.net>2016-04-15 13:06:44 +0530
committerTimothy Andrew <mail@timothyandrew.net>2016-04-28 22:28:36 +0530
commit3a609038748055a27c7e01cf4b55d8249709c9cc (patch)
treeb6ec5626549f2c423b958b8ebc3c08061388a4ca
parent973b948b9e9553a57113983fa4e32207b581e0ad (diff)
downloadgitlab-ce-3a609038748055a27c7e01cf4b55d8249709c9cc.tar.gz
Allow creating Personal Access Tokens through the website.
-rw-r--r--app/controllers/profiles/personal_access_tokens_controller.rb22
-rw-r--r--app/models/personal_access_token.rb9
-rw-r--r--app/models/user.rb1
-rw-r--r--app/views/profiles/personal_access_tokens/create.html.haml2
-rw-r--r--app/views/profiles/personal_access_tokens/index.html.haml44
-rw-r--r--config/routes.rb1
-rw-r--r--db/migrate/20160415062917_create_personal_access_tokens.rb11
-rw-r--r--db/schema.rb14
8 files changed, 104 insertions, 0 deletions
diff --git a/app/controllers/profiles/personal_access_tokens_controller.rb b/app/controllers/profiles/personal_access_tokens_controller.rb
new file mode 100644
index 00000000000..dbf06cb4c6d
--- /dev/null
+++ b/app/controllers/profiles/personal_access_tokens_controller.rb
@@ -0,0 +1,22 @@
+class Profiles::PersonalAccessTokensController < ApplicationController
+ def index
+ @user = current_user
+ @personal_access_token = current_user.personal_access_tokens.new
+ end
+
+ def create
+ @personal_access_token = current_user.personal_access_tokens.generate(personal_access_token_params)
+
+ if @personal_access_token.save
+ redirect_to profile_personal_access_tokens_path, notice: "Created personal access token!"
+ else
+ render :index
+ end
+ end
+
+ private
+
+ def personal_access_token_params
+ params.require(:personal_access_token).permit(:name)
+ end
+end
diff --git a/app/models/personal_access_token.rb b/app/models/personal_access_token.rb
new file mode 100644
index 00000000000..29f2275475f
--- /dev/null
+++ b/app/models/personal_access_token.rb
@@ -0,0 +1,9 @@
+class PersonalAccessToken < ActiveRecord::Base
+ belongs_to :user
+
+ def self.generate(params)
+ personal_access_token = self.new(params)
+ personal_access_token.token = Devise.friendly_token(50)
+ personal_access_token
+ end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index b6f405c6981..7ac30d21cb7 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -109,6 +109,7 @@ class User < ActiveRecord::Base
# Profile
has_many :keys, dependent: :destroy
has_many :emails, dependent: :destroy
+ has_many :personal_access_tokens, dependent: :destroy
has_many :identities, dependent: :destroy, autosave: true
# Groups
diff --git a/app/views/profiles/personal_access_tokens/create.html.haml b/app/views/profiles/personal_access_tokens/create.html.haml
new file mode 100644
index 00000000000..89da41a75ef
--- /dev/null
+++ b/app/views/profiles/personal_access_tokens/create.html.haml
@@ -0,0 +1,2 @@
+%h1 Profiles::PersonalAccessTokens#create
+%p Find me in app/views/profiles/personal_access_tokens/create.html.haml
diff --git a/app/views/profiles/personal_access_tokens/index.html.haml b/app/views/profiles/personal_access_tokens/index.html.haml
new file mode 100644
index 00000000000..05eed3c5c3c
--- /dev/null
+++ b/app/views/profiles/personal_access_tokens/index.html.haml
@@ -0,0 +1,44 @@
+- page_title "Personal Access Tokens"
+- header_title page_title, profile_personal_access_tokens_path
+
+.row.prepend-top-default
+ .col-lg-3.profile-settings-sidebar
+ %h4.prepend-top-0
+ = page_title
+ %p
+ You can generate a personal access token for each application you use that needs access to GitLab.
+ .col-lg-9
+ %h5.prepend-top-0
+ Add a Personal Access Token
+ %p.profile-settings-content
+ Pick a name for the application, and we'll give you a unique token.
+ = form_for [:profile, @personal_access_token], method: :post, html: { class: 'js-requires-input' } do |f|
+
+ .form-group
+ = f.label :name, class: 'label-light'
+ = f.text_field :name, class: "form-control", required: true
+
+ .prepend-top-default
+ = f.submit 'Add Personal Access Token', class: "btn btn-create"
+
+ %hr
+
+ %h5
+ Active Personal Access Tokens
+
+ - if @user.personal_access_tokens.exists?
+ .table-responsive
+ %table.table.table-striped
+ %thead
+ %tr
+ %th Name
+ %th Token
+ %th Created At
+ %tbody
+ - @user.personal_access_tokens.each do |token|
+ %tr
+ %td= token.name
+ %td= token.token
+ %td= token.created_at
+ - else
+ %span You don't have any tokens yet. \ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index d664434e1a6..d1be826d2a1 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -333,6 +333,7 @@ Rails.application.routes.draw do
resources :keys
resources :emails, only: [:index, :create, :destroy]
resource :avatar, only: [:destroy]
+ resources :personal_access_tokens, only: [:index, :create]
resource :two_factor_auth, only: [:new, :create, :destroy] do
member do
post :codes
diff --git a/db/migrate/20160415062917_create_personal_access_tokens.rb b/db/migrate/20160415062917_create_personal_access_tokens.rb
new file mode 100644
index 00000000000..42a41349a0c
--- /dev/null
+++ b/db/migrate/20160415062917_create_personal_access_tokens.rb
@@ -0,0 +1,11 @@
+class CreatePersonalAccessTokens < ActiveRecord::Migration
+ def change
+ create_table :personal_access_tokens do |t|
+ t.references :user, index: true, foreign_key: true, null: false
+ t.string :token, index: {unique: true}, null: false
+ t.string :name, null: false
+
+ t.timestamps null: false
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 42457d92353..05c97003971 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -704,6 +704,19 @@ ActiveRecord::Schema.define(version: 20160421130527) do
add_index "oauth_applications", ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type", using: :btree
add_index "oauth_applications", ["uid"], name: "index_oauth_applications_on_uid", unique: true, using: :btree
+ create_table "personal_access_tokens", force: :cascade do |t|
+ t.integer "user_id", null: false
+ t.string "token", null: false
+ t.string "name", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.boolean "revoked", default: false
+ t.datetime "expires_at"
+ end
+
+ add_index "personal_access_tokens", ["token"], name: "index_personal_access_tokens_on_token", unique: true, using: :btree
+ add_index "personal_access_tokens", ["user_id"], name: "index_personal_access_tokens_on_user_id", using: :btree
+
create_table "project_group_links", force: :cascade do |t|
t.integer "project_id", null: false
t.integer "group_id", null: false
@@ -1030,4 +1043,5 @@ ActiveRecord::Schema.define(version: 20160421130527) do
add_index "web_hooks", ["created_at", "id"], name: "index_web_hooks_on_created_at_and_id", using: :btree
add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree
+ add_foreign_key "personal_access_tokens", "users"
end