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
c6b2ff8a
Commit
c6b2ff8a
authored
Feb 09, 2018
by
Eric Eastwood
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Hide CI secret variable values on save
See
https://gitlab.com/gitlab-org/gitlab-ce/issues/42928
parent
dbb934c8
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
82 additions
and
15 deletions
+82
-15
app/assets/javascripts/ci_variable_list/ajax_variable_list.js
...assets/javascripts/ci_variable_list/ajax_variable_list.js
+1
-0
app/assets/javascripts/ci_variable_list/ci_variable_list.js
app/assets/javascripts/ci_variable_list/ci_variable_list.js
+4
-0
changelogs/unreleased/42929-hide-new-variable-values.yml
changelogs/unreleased/42929-hide-new-variable-values.yml
+5
-0
spec/javascripts/ci_variable_list/ajax_variable_list_spec.js
spec/javascripts/ci_variable_list/ajax_variable_list_spec.js
+35
-11
spec/javascripts/ci_variable_list/ci_variable_list_spec.js
spec/javascripts/ci_variable_list/ci_variable_list_spec.js
+37
-4
No files found.
app/assets/javascripts/ci_variable_list/ajax_variable_list.js
View file @
c6b2ff8a
...
...
@@ -75,6 +75,7 @@ export default class AjaxVariableList {
if
(
res
.
status
===
statusCodes
.
OK
&&
res
.
data
)
{
this
.
updateRowsWithPersistedVariables
(
res
.
data
.
variables
);
this
.
variableList
.
hideValues
();
}
else
if
(
res
.
status
===
statusCodes
.
BAD_REQUEST
)
{
// Validation failed
this
.
errorBox
.
innerHTML
=
generateErrorBoxContent
(
res
.
data
);
...
...
app/assets/javascripts/ci_variable_list/ci_variable_list.js
View file @
c6b2ff8a
...
...
@@ -178,6 +178,10 @@ export default class VariableList {
this
.
$container
.
find
(
'
.js-row-remove-button
'
).
attr
(
'
disabled
'
,
!
isEnabled
);
}
hideValues
()
{
this
.
secretValues
.
updateDom
(
false
);
}
getAllData
()
{
// Ignore the last empty row because we don't want to try persist
// a blank variable and run into validation problems.
...
...
changelogs/unreleased/42929-hide-new-variable-values.yml
0 → 100644
View file @
c6b2ff8a
---
title
:
Hide CI secret variable values after saving
merge_request
:
17044
author
:
type
:
changed
spec/javascripts/ci_variable_list/ajax_variable_list_spec.js
View file @
c6b2ff8a
import
$
from
'
jquery
'
;
import
MockAdapter
from
'
axios-mock-adapter
'
;
import
axios
from
'
~/lib/utils/axios_utils
'
;
import
AjaxFormVariableList
from
'
~/ci_variable_list/ajax_variable_list
'
;
const
VARIABLE_PATCH_ENDPOINT
=
'
http://test.host/frontend-fixtures/builds-project/variables
'
;
const
HIDE_CLASS
=
'
hide
'
;
describe
(
'
AjaxFormVariableList
'
,
()
=>
{
preloadFixtures
(
'
projects/ci_cd_settings.html.raw
'
);
...
...
@@ -45,16 +47,16 @@ describe('AjaxFormVariableList', () => {
const
loadingIcon
=
saveButton
.
querySelector
(
'
.js-secret-variables-save-loading-icon
'
);
mock
.
onPatch
(
VARIABLE_PATCH_ENDPOINT
).
reply
(()
=>
{
expect
(
loadingIcon
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
false
);
expect
(
loadingIcon
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
false
);
return
[
200
,
{}];
});
expect
(
loadingIcon
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
true
);
expect
(
loadingIcon
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
true
);
ajaxVariableList
.
onSaveClicked
()
.
then
(()
=>
{
expect
(
loadingIcon
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
true
);
expect
(
loadingIcon
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
true
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
...
...
@@ -78,11 +80,11 @@ describe('AjaxFormVariableList', () => {
it
(
'
hides any previous error box
'
,
(
done
)
=>
{
mock
.
onPatch
(
VARIABLE_PATCH_ENDPOINT
).
reply
(
200
);
expect
(
errorBox
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
true
);
expect
(
errorBox
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
true
);
ajaxVariableList
.
onSaveClicked
()
.
then
(()
=>
{
expect
(
errorBox
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
true
);
expect
(
errorBox
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
true
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
...
...
@@ -103,17 +105,39 @@ describe('AjaxFormVariableList', () => {
.
catch
(
done
.
fail
);
});
it
(
'
hides secret values
'
,
(
done
)
=>
{
mock
.
onPatch
(
VARIABLE_PATCH_ENDPOINT
).
reply
(
200
,
{});
const
row
=
container
.
querySelector
(
'
.js-row:first-child
'
);
const
valueInput
=
row
.
querySelector
(
'
.js-ci-variable-input-value
'
);
const
valuePlaceholder
=
row
.
querySelector
(
'
.js-secret-value-placeholder
'
);
valueInput
.
value
=
'
bar
'
;
$
(
valueInput
).
trigger
(
'
input
'
);
expect
(
valuePlaceholder
.
classList
.
contains
(
HIDE_CLASS
)).
toBe
(
true
);
expect
(
valueInput
.
classList
.
contains
(
HIDE_CLASS
)).
toBe
(
false
);
ajaxVariableList
.
onSaveClicked
()
.
then
(()
=>
{
expect
(
valuePlaceholder
.
classList
.
contains
(
HIDE_CLASS
)).
toBe
(
false
);
expect
(
valueInput
.
classList
.
contains
(
HIDE_CLASS
)).
toBe
(
true
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
shows error box with validation errors
'
,
(
done
)
=>
{
const
validationError
=
'
some validation error
'
;
mock
.
onPatch
(
VARIABLE_PATCH_ENDPOINT
).
reply
(
400
,
[
validationError
,
]);
expect
(
errorBox
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
true
);
expect
(
errorBox
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
true
);
ajaxVariableList
.
onSaveClicked
()
.
then
(()
=>
{
expect
(
errorBox
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
false
);
expect
(
errorBox
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
false
);
expect
(
errorBox
.
textContent
.
trim
().
replace
(
/
\n
+
\s
+/m
,
'
'
)).
toEqual
(
`Validation failed
${
validationError
}
`
);
})
.
then
(
done
)
...
...
@@ -123,11 +147,11 @@ describe('AjaxFormVariableList', () => {
it
(
'
shows flash message when request fails
'
,
(
done
)
=>
{
mock
.
onPatch
(
VARIABLE_PATCH_ENDPOINT
).
reply
(
500
);
expect
(
errorBox
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
true
);
expect
(
errorBox
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
true
);
ajaxVariableList
.
onSaveClicked
()
.
then
(()
=>
{
expect
(
errorBox
.
classList
.
contains
(
'
hide
'
)).
toEqual
(
true
);
expect
(
errorBox
.
classList
.
contains
(
HIDE_CLASS
)).
toEqual
(
true
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
...
...
@@ -170,9 +194,9 @@ describe('AjaxFormVariableList', () => {
const
valueInput
=
row
.
querySelector
(
'
.js-ci-variable-input-value
'
);
keyInput
.
value
=
'
foo
'
;
keyInput
.
dispatchEvent
(
new
Event
(
'
input
'
)
);
$
(
keyInput
).
trigger
(
'
input
'
);
valueInput
.
value
=
'
bar
'
;
valueInput
.
dispatchEvent
(
new
Event
(
'
input
'
)
);
$
(
valueInput
).
trigger
(
'
input
'
);
expect
(
idInput
.
value
).
toEqual
(
''
);
...
...
spec/javascripts/ci_variable_list/ci_variable_list_spec.js
View file @
c6b2ff8a
import
VariableList
from
'
~/ci_variable_list/ci_variable_list
'
;
import
getSetTimeoutPromise
from
'
../helpers/set_timeout_promise_helper
'
;
const
HIDE_CLASS
=
'
hide
'
;
describe
(
'
VariableList
'
,
()
=>
{
preloadFixtures
(
'
pipeline_schedules/edit.html.raw
'
);
preloadFixtures
(
'
pipeline_schedules/edit_with_variables.html.raw
'
);
...
...
@@ -92,14 +94,14 @@ describe('VariableList', () => {
const
$inputValue
=
$row
.
find
(
'
.js-ci-variable-input-value
'
);
const
$placeholder
=
$row
.
find
(
'
.js-secret-value-placeholder
'
);
expect
(
$placeholder
.
hasClass
(
'
hide
'
)).
toBe
(
false
);
expect
(
$inputValue
.
hasClass
(
'
hide
'
)).
toBe
(
true
);
expect
(
$placeholder
.
hasClass
(
HIDE_CLASS
)).
toBe
(
false
);
expect
(
$inputValue
.
hasClass
(
HIDE_CLASS
)).
toBe
(
true
);
// Reveal values
$wrapper
.
find
(
'
.js-secret-value-reveal-button
'
).
click
();
expect
(
$placeholder
.
hasClass
(
'
hide
'
)).
toBe
(
true
);
expect
(
$inputValue
.
hasClass
(
'
hide
'
)).
toBe
(
false
);
expect
(
$placeholder
.
hasClass
(
HIDE_CLASS
)).
toBe
(
true
);
expect
(
$inputValue
.
hasClass
(
HIDE_CLASS
)).
toBe
(
false
);
});
});
});
...
...
@@ -179,4 +181,35 @@ describe('VariableList', () => {
expect
(
$wrapper
.
find
(
'
.js-ci-variable-input-key:not([disabled])
'
).
length
).
toBe
(
3
);
});
});
describe
(
'
hideValues
'
,
()
=>
{
beforeEach
(()
=>
{
loadFixtures
(
'
projects/ci_cd_settings.html.raw
'
);
$wrapper
=
$
(
'
.js-ci-variable-list-section
'
);
variableList
=
new
VariableList
({
container
:
$wrapper
,
formField
:
'
variables
'
,
});
variableList
.
init
();
});
it
(
'
should hide value input and show placeholder stars
'
,
()
=>
{
const
$row
=
$wrapper
.
find
(
'
.js-row
'
);
const
$inputValue
=
$row
.
find
(
'
.js-ci-variable-input-value
'
);
const
$placeholder
=
$row
.
find
(
'
.js-secret-value-placeholder
'
);
$row
.
find
(
'
.js-ci-variable-input-value
'
)
.
val
(
'
foo
'
)
.
trigger
(
'
input
'
);
expect
(
$placeholder
.
hasClass
(
HIDE_CLASS
)).
toBe
(
true
);
expect
(
$inputValue
.
hasClass
(
HIDE_CLASS
)).
toBe
(
false
);
variableList
.
hideValues
();
expect
(
$placeholder
.
hasClass
(
HIDE_CLASS
)).
toBe
(
false
);
expect
(
$inputValue
.
hasClass
(
HIDE_CLASS
)).
toBe
(
true
);
});
});
});
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