Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
ab387e11
Commit
ab387e11
authored
Dec 19, 2018
by
Grzegorz Bizon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Do not expose trigger token when user should not see it
parent
3f14d2f4
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
130 additions
and
17 deletions
+130
-17
app/controllers/projects/settings/ci_cd_controller.rb
app/controllers/projects/settings/ci_cd_controller.rb
+2
-0
app/controllers/projects/triggers_controller.rb
app/controllers/projects/triggers_controller.rb
+3
-4
app/models/ci/trigger.rb
app/models/ci/trigger.rb
+2
-1
app/presenters/ci/trigger_presenter.rb
app/presenters/ci/trigger_presenter.rb
+19
-0
app/views/projects/triggers/_trigger.html.haml
app/views/projects/triggers/_trigger.html.haml
+1
-1
changelogs/unreleased/security-pipeline-trigger-tokens-exposure.yml
.../unreleased/security-pipeline-trigger-tokens-exposure.yml
+5
-0
lib/api/entities.rb
lib/api/entities.rb
+4
-1
lib/api/helpers/presentable.rb
lib/api/helpers/presentable.rb
+29
-0
lib/api/triggers.rb
lib/api/triggers.rb
+5
-5
spec/presenters/ci/trigger_presenter_spec.rb
spec/presenters/ci/trigger_presenter_spec.rb
+51
-0
spec/requests/api/triggers_spec.rb
spec/requests/api/triggers_spec.rb
+9
-5
No files found.
app/controllers/projects/settings/ci_cd_controller.rb
View file @
ab387e11
...
...
@@ -101,7 +101,9 @@ module Projects
def
define_triggers_variables
@triggers
=
@project
.
triggers
.
present
(
current_user:
current_user
)
@trigger
=
::
Ci
::
Trigger
.
new
.
present
(
current_user:
current_user
)
end
def
define_badges_variables
...
...
app/controllers/projects/triggers_controller.rb
View file @
ab387e11
...
...
@@ -66,12 +66,11 @@ class Projects::TriggersController < Projects::ApplicationController
end
def
trigger
@trigger
||=
project
.
triggers
.
find
(
params
[
:id
])
||
render_404
@trigger
||=
project
.
triggers
.
find
(
params
[
:id
])
.
present
(
current_user:
current_user
)
end
def
trigger_params
params
.
require
(
:trigger
).
permit
(
:description
)
params
.
require
(
:trigger
).
permit
(
:description
)
end
end
app/models/ci/trigger.rb
View file @
ab387e11
...
...
@@ -4,6 +4,7 @@ module Ci
class
Trigger
<
ActiveRecord
::
Base
extend
Gitlab
::
Ci
::
Model
include
IgnorableColumn
include
Presentable
ignore_column
:deleted_at
...
...
@@ -29,7 +30,7 @@ module Ci
end
def
short_token
token
[
0
...
4
]
token
[
0
...
4
]
if
token
.
present?
end
def
legacy?
...
...
app/presenters/ci/trigger_presenter.rb
0 → 100644
View file @
ab387e11
# frozen_string_literal: true
module
Ci
class
TriggerPresenter
<
Gitlab
::
View
::
Presenter
::
Delegated
presents
:trigger
def
has_token_exposed?
can?
(
current_user
,
:admin_trigger
,
trigger
)
end
def
token
if
has_token_exposed?
trigger
.
token
else
trigger
.
short_token
end
end
end
end
app/views/projects/triggers/_trigger.html.haml
View file @
ab387e11
%tr
%td
-
if
can?
(
current_user
,
:admin_trigger
,
trigger
)
-
if
trigger
.
has_token_exposed?
%span
=
trigger
.
token
=
clipboard_button
(
text:
trigger
.
token
,
title:
"Copy trigger token to clipboard"
)
-
else
...
...
changelogs/unreleased/security-pipeline-trigger-tokens-exposure.yml
0 → 100644
View file @
ab387e11
---
title
:
Expose CI/CD trigger token only to the trigger owner
merge_request
:
author
:
type
:
security
lib/api/entities.rb
View file @
ab387e11
...
...
@@ -1244,8 +1244,11 @@ module API
end
class
Trigger
<
Grape
::
Entity
include
::
API
::
Helpers
::
Presentable
expose
:id
expose
:token
,
:description
expose
:token
expose
:description
expose
:created_at
,
:updated_at
,
:last_used
expose
:owner
,
using:
Entities
::
UserBasic
end
...
...
lib/api/helpers/presentable.rb
0 → 100644
View file @
ab387e11
# frozen_string_literal: true
module
API
module
Helpers
##
# This module makes it possible to use `app/presenters` with
# Grape Entities. It instantiates model presenter and passes
# options defined in the API endpoint to the presenter itself.
#
# present object, with: Entities::Something,
# current_user: current_user,
# another_option: 'my options'
#
# Example above will make `current_user` and `another_option`
# values available in the subclass of `Gitlab::View::Presenter`
# thorough a separate method in the presenter.
#
# The model class needs to have `::Presentable` module mixed in
# if you want to use `API::Helpers::Presentable`.
#
module
Presentable
extend
ActiveSupport
::
Concern
def
initialize
(
object
,
options
=
{})
super
(
object
.
present
(
options
),
options
)
end
end
end
end
lib/api/triggers.rb
View file @
ab387e11
...
...
@@ -51,7 +51,7 @@ module API
triggers
=
user_project
.
triggers
.
includes
(
:trigger_requests
)
present
paginate
(
triggers
),
with:
Entities
::
Trigger
present
paginate
(
triggers
),
with:
Entities
::
Trigger
,
current_user:
current_user
end
# rubocop: enable CodeReuse/ActiveRecord
...
...
@@ -68,7 +68,7 @@ module API
trigger
=
user_project
.
triggers
.
find
(
params
.
delete
(
:trigger_id
))
break
not_found!
(
'Trigger'
)
unless
trigger
present
trigger
,
with:
Entities
::
Trigger
present
trigger
,
with:
Entities
::
Trigger
,
current_user:
current_user
end
desc
'Create a trigger'
do
...
...
@@ -85,7 +85,7 @@ module API
declared_params
(
include_missing:
false
).
merge
(
owner:
current_user
))
if
trigger
.
valid?
present
trigger
,
with:
Entities
::
Trigger
present
trigger
,
with:
Entities
::
Trigger
,
current_user:
current_user
else
render_validation_error!
(
trigger
)
end
...
...
@@ -106,7 +106,7 @@ module API
break
not_found!
(
'Trigger'
)
unless
trigger
if
trigger
.
update
(
declared_params
(
include_missing:
false
))
present
trigger
,
with:
Entities
::
Trigger
present
trigger
,
with:
Entities
::
Trigger
,
current_user:
current_user
else
render_validation_error!
(
trigger
)
end
...
...
@@ -127,7 +127,7 @@ module API
if
trigger
.
update
(
owner:
current_user
)
status
:ok
present
trigger
,
with:
Entities
::
Trigger
present
trigger
,
with:
Entities
::
Trigger
,
current_user:
current_user
else
render_validation_error!
(
trigger
)
end
...
...
spec/presenters/ci/trigger_presenter_spec.rb
0 → 100644
View file @
ab387e11
require
'spec_helper'
describe
Ci
::
TriggerPresenter
do
set
(
:user
)
{
create
(
:user
)
}
set
(
:project
)
{
create
(
:project
)
}
set
(
:trigger
)
do
create
(
:ci_trigger
,
token:
'123456789abcd'
,
project:
project
)
end
subject
do
described_class
.
new
(
trigger
,
current_user:
user
)
end
before
do
project
.
add_maintainer
(
user
)
end
context
'when user is not a trigger owner'
do
describe
'#token'
do
it
'exposes only short token'
do
expect
(
subject
.
token
).
not_to
eq
trigger
.
token
expect
(
subject
.
token
).
to
eq
'1234'
end
end
describe
'#has_token_exposed?'
do
it
'does not have token exposed'
do
expect
(
subject
).
not_to
have_token_exposed
end
end
end
context
'when user is a trigger owner and builds admin'
do
before
do
trigger
.
update
(
owner:
user
)
end
describe
'#token'
do
it
'exposes full token'
do
expect
(
subject
.
token
).
to
eq
trigger
.
token
end
end
describe
'#has_token_exposed?'
do
it
'has token exposed'
do
expect
(
subject
).
to
have_token_exposed
end
end
end
end
spec/requests/api/triggers_spec.rb
View file @
ab387e11
require
'spec_helper'
describe
API
::
Triggers
do
let
(
:user
)
{
create
(
:user
)
}
let
(
:user2
)
{
create
(
:user
)
}
set
(
:user
)
{
create
(
:user
)
}
set
(
:user2
)
{
create
(
:user
)
}
let!
(
:trigger_token
)
{
'secure_token'
}
let!
(
:trigger_token_2
)
{
'secure_token_2'
}
let!
(
:project
)
{
create
(
:project
,
:repository
,
creator:
user
)
}
...
...
@@ -228,14 +229,17 @@ describe API::Triggers do
end
describe
'GET /projects/:id/triggers'
do
context
'authenticated user w
ith valid permission
s'
do
it
'returns
list of triggers
'
do
context
'authenticated user w
ho can access trigger
s'
do
it
'returns
a list of triggers with tokens exposed correctly
'
do
get
api
(
"/projects/
#{
project
.
id
}
/triggers"
,
user
)
expect
(
response
).
to
have_gitlab_http_status
(
200
)
expect
(
response
).
to
include_pagination_headers
expect
(
json_response
).
to
be_a
(
Array
)
expect
(
json_response
[
0
]).
to
have_key
(
'token'
)
expect
(
json_response
.
size
).
to
eq
2
expect
(
json_response
.
dig
(
0
,
'token'
)).
to
eq
trigger_token
expect
(
json_response
.
dig
(
1
,
'token'
)).
to
eq
trigger_token_2
[
0
..
3
]
end
end
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment