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
b6957974
Commit
b6957974
authored
Aug 25, 2017
by
Robert Schilling
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
API: Add GPG key management
parent
c4dcd667
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
247 additions
and
0 deletions
+247
-0
changelogs/unreleased/api-gpg-key-management.yml
changelogs/unreleased/api-gpg-key-management.yml
+5
-0
lib/api/entities.rb
lib/api/entities.rb
+4
-0
lib/api/users.rb
lib/api/users.rb
+70
-0
spec/requests/api/users_spec.rb
spec/requests/api/users_spec.rb
+168
-0
No files found.
changelogs/unreleased/api-gpg-key-management.yml
0 → 100644
View file @
b6957974
---
title
:
'
API:
Add
GPG
key
management'
merge_request
:
13828
author
:
Robert Schilling
type
:
added
lib/api/entities.rb
View file @
b6957974
...
@@ -491,6 +491,10 @@ module API
...
@@ -491,6 +491,10 @@ module API
expose
:user
,
using:
Entities
::
UserPublic
expose
:user
,
using:
Entities
::
UserPublic
end
end
class
GPGKey
<
Grape
::
Entity
expose
:id
,
:key
,
:created_at
end
class
Note
<
Grape
::
Entity
class
Note
<
Grape
::
Entity
# Only Issue and MergeRequest have iid
# Only Issue and MergeRequest have iid
NOTEABLE_TYPES_WITH_IID
=
%w(Issue MergeRequest)
.
freeze
NOTEABLE_TYPES_WITH_IID
=
%w(Issue MergeRequest)
.
freeze
...
...
lib/api/users.rb
View file @
b6957974
...
@@ -492,6 +492,76 @@ module API
...
@@ -492,6 +492,76 @@ module API
destroy_conditionally!
(
key
)
destroy_conditionally!
(
key
)
end
end
desc
"Get the currently authenticated user's GPG keys"
do
detail
'This feature was added in GitLab 10.0'
success
Entities
::
GPGKey
end
params
do
use
:pagination
end
get
'gpg_keys'
do
present
paginate
(
current_user
.
gpg_keys
),
with:
Entities
::
GPGKey
end
desc
'Get a single GPG key owned by currently authenticated user'
do
detail
'This feature was added in GitLab 10.0'
success
Entities
::
GPGKey
end
params
do
requires
:key_id
,
type:
Integer
,
desc:
'The ID of the GPG key'
end
get
'gpg_keys/:key_id'
do
key
=
current_user
.
gpg_keys
.
find_by
(
id:
params
[
:key_id
])
not_found!
(
'GPG Key'
)
unless
key
present
key
,
with:
Entities
::
GPGKey
end
desc
'Add a new GPG key to the currently authenticated user'
do
detail
'This feature was added in GitLab 10.0'
success
Entities
::
GPGKey
end
params
do
requires
:key
,
type:
String
,
desc:
'The new GPG key'
end
post
'gpg_keys'
do
key
=
current_user
.
gpg_keys
.
new
(
declared_params
)
if
key
.
save
present
key
,
with:
Entities
::
GPGKey
else
render_validation_error!
(
key
)
end
end
desc
'Revoke a GPG key owned by currently authenticated user'
do
detail
'This feature was added in GitLab 10.0'
end
params
do
requires
:key_id
,
type:
Integer
,
desc:
'The ID of the GPG key'
end
post
'gpg_keys/:key_id/revoke'
do
key
=
current_user
.
gpg_keys
.
find_by
(
id:
params
[
:key_id
])
not_found!
(
'GPG Key'
)
unless
key
key
.
revoke
status
:accepted
end
desc
'Delete a GPG key from the currently authenticated user'
do
detail
'This feature was added in GitLab 10.0'
end
params
do
requires
:key_id
,
type:
Integer
,
desc:
'The ID of the SSH key'
end
delete
'gpg_keys/:key_id'
do
key
=
current_user
.
gpg_keys
.
find_by
(
id:
params
[
:key_id
])
not_found!
(
'GPG Key'
)
unless
key
status
204
key
.
destroy
end
desc
"Get the currently authenticated user's email addresses"
do
desc
"Get the currently authenticated user's email addresses"
do
success
Entities
::
Email
success
Entities
::
Email
end
end
...
...
spec/requests/api/users_spec.rb
View file @
b6957974
...
@@ -4,6 +4,7 @@ describe API::Users do
...
@@ -4,6 +4,7 @@ describe API::Users do
let
(
:user
)
{
create
(
:user
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:admin
)
{
create
(
:admin
)
}
let
(
:admin
)
{
create
(
:admin
)
}
let
(
:key
)
{
create
(
:key
,
user:
user
)
}
let
(
:key
)
{
create
(
:key
,
user:
user
)
}
let
(
:gpg_key
)
{
create
(
:gpg_key
,
user:
user
)
}
let
(
:email
)
{
create
(
:email
,
user:
user
)
}
let
(
:email
)
{
create
(
:email
,
user:
user
)
}
let
(
:omniauth_user
)
{
create
(
:omniauth_user
)
}
let
(
:omniauth_user
)
{
create
(
:omniauth_user
)
}
let
(
:ldap_user
)
{
create
(
:omniauth_user
,
provider:
'ldapmain'
)
}
let
(
:ldap_user
)
{
create
(
:omniauth_user
,
provider:
'ldapmain'
)
}
...
@@ -1153,6 +1154,173 @@ describe API::Users do
...
@@ -1153,6 +1154,173 @@ describe API::Users do
end
end
end
end
describe
'GET /user/gpg_keys'
do
context
'when unauthenticated'
do
it
'returns authentication error'
do
get
api
(
'/user/gpg_keys'
)
expect
(
response
).
to
have_http_status
(
401
)
end
end
context
'when authenticated'
do
it
'returns array of GPG keys'
do
user
.
gpg_keys
<<
gpg_key
user
.
save
get
api
(
'/user/gpg_keys'
,
user
)
expect
(
response
).
to
have_http_status
(
200
)
expect
(
response
).
to
include_pagination_headers
expect
(
json_response
).
to
be_an
Array
expect
(
json_response
.
first
[
'key'
]).
to
eq
(
gpg_key
.
key
)
end
context
'scopes'
do
let
(
:path
)
{
'/user/gpg_keys'
}
let
(
:api_call
)
{
method
(
:api
)
}
include_examples
'allows the "read_user" scope'
end
end
end
describe
'GET /user/gpg_keys/:key_id'
do
it
'returns a single key'
do
user
.
gpg_keys
<<
gpg_key
user
.
save
get
api
(
"/user/gpg_keys/
#{
gpg_key
.
id
}
"
,
user
)
expect
(
response
).
to
have_http_status
(
200
)
expect
(
json_response
[
'key'
]).
to
eq
(
gpg_key
.
key
)
end
it
'returns 404 Not Found within invalid ID'
do
get
api
(
'/user/gpg_keys/42'
,
user
)
expect
(
response
).
to
have_http_status
(
404
)
expect
(
json_response
[
'message'
]).
to
eq
(
'404 GPG Key Not Found'
)
end
it
"returns 404 error if admin accesses user's GPG key"
do
user
.
gpg_keys
<<
gpg_key
user
.
save
get
api
(
"/user/gpg_keys/
#{
gpg_key
.
id
}
"
,
admin
)
expect
(
response
).
to
have_http_status
(
404
)
expect
(
json_response
[
'message'
]).
to
eq
(
'404 GPG Key Not Found'
)
end
it
'returns 404 for invalid ID'
do
get
api
(
'/users/gpg_keys/ASDF'
,
admin
)
expect
(
response
).
to
have_http_status
(
404
)
end
context
'scopes'
do
let
(
:path
)
{
"/user/gpg_keys/
#{
gpg_key
.
id
}
"
}
let
(
:api_call
)
{
method
(
:api
)
}
include_examples
'allows the "read_user" scope'
end
end
describe
'POST /user/gpg_keys'
do
it
'creates a GPG key'
do
key_attrs
=
attributes_for
:gpg_key
expect
do
post
api
(
'/user/gpg_keys'
,
user
),
key_attrs
expect
(
response
).
to
have_http_status
(
201
)
end
.
to
change
{
user
.
gpg_keys
.
count
}.
by
(
1
)
end
it
'returns a 401 error if unauthorized'
do
post
api
(
'/user/gpg_keys'
),
key:
'some key'
expect
(
response
).
to
have_http_status
(
401
)
end
it
'does not create GPG key without key'
do
post
api
(
'/user/gpg_keys'
,
user
)
expect
(
response
).
to
have_http_status
(
400
)
expect
(
json_response
[
'error'
]).
to
eq
(
'key is missing'
)
end
end
describe
'POST /user/gpg_keys/:key_id/revoke'
do
it
'revokes existing GPG key'
do
user
.
gpg_keys
<<
gpg_key
user
.
save
expect
do
post
api
(
"/user/gpg_keys/
#{
gpg_key
.
id
}
/revoke"
,
user
)
expect
(
response
).
to
have_http_status
(
:accepted
)
end
.
to
change
{
user
.
gpg_keys
.
count
}.
by
(
-
1
)
end
it
'returns 404 if key ID not found'
do
post
api
(
'/user/gpg_keys/42/revoke'
,
user
)
expect
(
response
).
to
have_http_status
(
404
)
expect
(
json_response
[
'message'
]).
to
eq
(
'404 GPG Key Not Found'
)
end
it
'returns 401 error if unauthorized'
do
user
.
gpg_keys
<<
gpg_key
user
.
save
post
api
(
"/user/gpg_keys/
#{
gpg_key
.
id
}
/revoke"
)
expect
(
response
).
to
have_http_status
(
401
)
end
it
'returns a 404 for invalid ID'
do
post
api
(
'/users/gpg_keys/ASDF/revoke'
,
admin
)
expect
(
response
).
to
have_http_status
(
404
)
end
end
describe
'DELETE /user/gpg_keys/:key_id'
do
it
'deletes existing GPG key'
do
user
.
gpg_keys
<<
gpg_key
user
.
save
expect
do
delete
api
(
"/user/gpg_keys/
#{
gpg_key
.
id
}
"
,
user
)
expect
(
response
).
to
have_http_status
(
204
)
end
.
to
change
{
user
.
gpg_keys
.
count
}.
by
(
-
1
)
end
it
'returns 404 if key ID not found'
do
delete
api
(
'/user/gpg_keys/42'
,
user
)
expect
(
response
).
to
have_http_status
(
404
)
expect
(
json_response
[
'message'
]).
to
eq
(
'404 GPG Key Not Found'
)
end
it
'returns 401 error if unauthorized'
do
user
.
gpg_keys
<<
gpg_key
user
.
save
delete
api
(
"/user/gpg_keys/
#{
gpg_key
.
id
}
"
)
expect
(
response
).
to
have_http_status
(
401
)
end
it
'returns a 404 for invalid ID'
do
delete
api
(
'/users/gpg_keys/ASDF'
,
admin
)
expect
(
response
).
to
have_http_status
(
404
)
end
end
describe
"GET /user/emails"
do
describe
"GET /user/emails"
do
context
"when unauthenticated"
do
context
"when unauthenticated"
do
it
"returns authentication error"
do
it
"returns authentication error"
do
...
...
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