Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
d17494f23499
Commit
d17494f2
authored
Apr 15, 2016
by
Timothy Andrew
Browse files
Eager load `lib/api`
- So that the server doesn't have to be restarted for every change in dev.
parent
b6df138a6012
Changes
5
Hide whitespace changes
Inline
Side-by-side
config/application.rb
View file @
d17494f2
...
...
@@ -79,6 +79,8 @@
# This is needed for gitlab-shell
ENV
[
'GITLAB_PATH_OUTSIDE_HOOK'
]
=
ENV
[
'PATH'
]
config
.
eager_load_paths
+=
[
"
#{
Rails
.
root
}
/lib"
]
config
.
generators
do
|
g
|
g
.
factory_girl
false
end
...
...
config/routes.rb
View file @
d17494f2
require
'sidekiq/web'
require
'sidekiq/cron/web'
require
'api/api'
Rails
.
application
.
routes
.
draw
do
if
Gitlab
::
Sherlock
.
enabled?
...
...
lib/api/api.rb
View file @
d17494f2
Dir
[
"
#{
Rails
.
root
}
/lib/api/*.rb"
].
each
{
|
file
|
require
file
}
module
API
class
API
<
Grape
::
API
...
...
@@ -3,6 +1,6 @@
module
API
class
API
<
Grape
::
API
include
APIGuard
include
::
API
::
APIGuard
version
'v3'
,
using: :path
rescue_from
ActiveRecord
::
RecordNotFound
do
...
...
lib/api/api_guard.rb
View file @
d17494f2
...
...
@@ -2,6 +2,7 @@
require
'rack/oauth2'
module
APIGuard
extend
ActiveSupport
::
Concern
module
API
module
APIGuard
extend
ActiveSupport
::
Concern
...
...
@@ -7,6 +8,6 @@
included
do
|
base
|
# OAuth2 Resource Server Authentication
use
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
,
'The API'
do
|
request
|
# The authenticator only fetches the raw token string
included
do
|
base
|
# OAuth2 Resource Server Authentication
use
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
,
'The API'
do
|
request
|
# The authenticator only fetches the raw token string
...
...
@@ -12,5 +13,10 @@
# Must yield access token to store it in the env
request
.
access_token
# Must yield access token to store it in the env
request
.
access_token
end
helpers
HelperMethods
install_error_responders
(
base
)
end
...
...
@@ -15,7 +21,26 @@
end
helpers
HelperMethods
install_error_responders
(
base
)
end
# Helper Methods for Grape Endpoint
module
HelperMethods
# Invokes the doorkeeper guard.
#
# If token is presented and valid, then it sets @current_user.
#
# If the token does not have sufficient scopes to cover the requred scopes,
# then it raises InsufficientScopeError.
#
# If the token is expired, then it raises ExpiredError.
#
# If the token is revoked, then it raises RevokedError.
#
# If the token is not found (nil), then it raises TokenNotFoundError.
#
# Arguments:
#
# scopes: (optional) scopes required for this guard.
# Defaults to empty array.
#
def
doorkeeper_guard!
(
scopes:
[])
if
(
access_token
=
find_access_token
).
nil?
raise
TokenNotFoundError
...
...
@@ -21,25 +46,24 @@
# Helper Methods for Grape Endpoint
module
HelperMethods
# Invokes the doorkeeper guard.
#
# If token is presented and valid, then it sets @current_user.
#
# If the token does not have sufficient scopes to cover the requred scopes,
# then it raises InsufficientScopeError.
#
# If the token is expired, then it raises ExpiredError.
#
# If the token is revoked, then it raises RevokedError.
#
# If the token is not found (nil), then it raises TokenNotFoundError.
#
# Arguments:
#
# scopes: (optional) scopes required for this guard.
# Defaults to empty array.
#
def
doorkeeper_guard!
(
scopes:
[])
if
(
access_token
=
find_access_token
).
nil?
raise
TokenNotFoundError
else
case
validate_access_token
(
access_token
,
scopes
)
when
Oauth2
::
AccessTokenValidationService
::
INSUFFICIENT_SCOPE
raise
InsufficientScopeError
.
new
(
scopes
)
when
Oauth2
::
AccessTokenValidationService
::
EXPIRED
raise
ExpiredError
when
Oauth2
::
AccessTokenValidationService
::
REVOKED
raise
RevokedError
when
Oauth2
::
AccessTokenValidationService
::
VALID
@current_user
=
User
.
find
(
access_token
.
resource_owner_id
)
end
end
end
def
doorkeeper_guard
(
scopes:
[])
if
access_token
=
find_access_token
case
validate_access_token
(
access_token
,
scopes
)
when
Oauth2
::
AccessTokenValidationService
::
INSUFFICIENT_SCOPE
raise
InsufficientScopeError
.
new
(
scopes
)
when
Oauth2
::
AccessTokenValidationService
::
EXPIRED
raise
ExpiredError
...
...
@@ -45,13 +69,9 @@
else
case
validate_access_token
(
access_token
,
scopes
)
when
Oauth2
::
AccessTokenValidationService
::
INSUFFICIENT_SCOPE
raise
InsufficientScopeError
.
new
(
scopes
)
when
Oauth2
::
AccessTokenValidationService
::
EXPIRED
raise
ExpiredError
when
Oauth2
::
AccessTokenValidationService
::
REVOKED
raise
RevokedError
when
Oauth2
::
AccessTokenValidationService
::
VALID
@current_user
=
User
.
find
(
access_token
.
resource_owner_id
)
when
Oauth2
::
AccessTokenValidationService
::
REVOKED
raise
RevokedError
when
Oauth2
::
AccessTokenValidationService
::
VALID
@current_user
=
User
.
find
(
access_token
.
resource_owner_id
)
end
end
end
...
...
@@ -56,4 +76,21 @@
end
end
def
current_user
@current_user
end
private
def
find_access_token
@access_token
||=
Doorkeeper
.
authenticate
(
doorkeeper_request
,
Doorkeeper
.
configuration
.
access_token_methods
)
end
def
doorkeeper_request
@doorkeeper_request
||=
ActionDispatch
::
Request
.
new
(
env
)
end
def
validate_access_token
(
access_token
,
scopes
)
Oauth2
::
AccessTokenValidationService
.
validate
(
access_token
,
scopes:
scopes
)
end
end
...
...
@@ -58,8 +95,24 @@
end
def
doorkeeper_guard
(
scopes:
[])
if
access_token
=
find_access_token
case
validate_access_token
(
access_token
,
scopes
)
when
Oauth2
::
AccessTokenValidationService
::
INSUFFICIENT_SCOPE
raise
InsufficientScopeError
.
new
(
scopes
)
module
ClassMethods
# Installs the doorkeeper guard on the whole Grape API endpoint.
#
# Arguments:
#
# scopes: (optional) scopes required for this guard.
# Defaults to empty array.
#
def
guard_all!
(
scopes:
[])
before
do
guard!
scopes:
scopes
end
end
private
def
install_error_responders
(
base
)
error_classes
=
[
MissingTokenError
,
TokenNotFoundError
,
ExpiredError
,
RevokedError
,
InsufficientScopeError
]
base
.
send
:rescue_from
,
*
error_classes
,
oauth2_bearer_token_error_handler
end
...
...
@@ -65,4 +118,13 @@
when
Oauth2
::
AccessTokenValidationService
::
EXPIRED
raise
ExpiredError
def
oauth2_bearer_token_error_handler
Proc
.
new
do
|
e
|
response
=
case
e
when
MissingTokenError
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Unauthorized
.
new
when
TokenNotFoundError
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Unauthorized
.
new
(
:invalid_token
,
"Bad Access Token."
)
...
...
@@ -68,4 +130,11 @@
when
Oauth2
::
AccessTokenValidationService
::
REVOKED
raise
RevokedError
when
ExpiredError
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Unauthorized
.
new
(
:invalid_token
,
"Token is expired. You can either do re-authorization or token refresh."
)
when
RevokedError
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Unauthorized
.
new
(
:invalid_token
,
"Token was revoked. You have to re-authorize from the user."
)
...
...
@@ -71,7 +140,15 @@
when
Oauth2
::
AccessTokenValidationService
::
VALID
@current_user
=
User
.
find
(
access_token
.
resource_owner_id
)
when
InsufficientScopeError
# FIXME: ForbiddenError (inherited from Bearer::Forbidden of Rack::Oauth2)
# does not include WWW-Authenticate header, which breaks the standard.
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Forbidden
.
new
(
:insufficient_scope
,
Rack
::
OAuth2
::
Server
::
Resource
::
ErrorMethods
::
DEFAULT_DESCRIPTION
[
:insufficient_scope
],
{
scope:
e
.
scopes
})
end
response
.
finish
end
end
end
...
...
@@ -74,17 +151,8 @@
end
end
end
def
current_user
@current_user
end
private
def
find_access_token
@access_token
||=
Doorkeeper
.
authenticate
(
doorkeeper_request
,
Doorkeeper
.
configuration
.
access_token_methods
)
end
def
doorkeeper_request
@doorkeeper_request
||=
ActionDispatch
::
Request
.
new
(
env
)
end
#
# Exceptions
#
...
...
@@ -90,6 +158,3 @@
def
validate_access_token
(
access_token
,
scopes
)
Oauth2
::
AccessTokenValidationService
.
validate
(
access_token
,
scopes:
scopes
)
end
end
class
MissingTokenError
<
StandardError
;
end
...
...
@@ -95,15 +160,3 @@
module
ClassMethods
# Installs the doorkeeper guard on the whole Grape API endpoint.
#
# Arguments:
#
# scopes: (optional) scopes required for this guard.
# Defaults to empty array.
#
def
guard_all!
(
scopes:
[])
before
do
guard!
scopes:
scopes
end
end
class
TokenNotFoundError
<
StandardError
;
end
...
...
@@ -109,9 +162,3 @@
private
def
install_error_responders
(
base
)
error_classes
=
[
MissingTokenError
,
TokenNotFoundError
,
ExpiredError
,
RevokedError
,
InsufficientScopeError
]
base
.
send
:rescue_from
,
*
error_classes
,
oauth2_bearer_token_error_handler
end
class
ExpiredError
<
StandardError
;
end
...
...
@@ -117,13 +164,3 @@
def
oauth2_bearer_token_error_handler
Proc
.
new
do
|
e
|
response
=
case
e
when
MissingTokenError
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Unauthorized
.
new
when
TokenNotFoundError
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Unauthorized
.
new
(
:invalid_token
,
"Bad Access Token."
)
class
RevokedError
<
StandardError
;
end
...
...
@@ -129,24 +166,8 @@
when
ExpiredError
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Unauthorized
.
new
(
:invalid_token
,
"Token is expired. You can either do re-authorization or token refresh."
)
when
RevokedError
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Unauthorized
.
new
(
:invalid_token
,
"Token was revoked. You have to re-authorize from the user."
)
when
InsufficientScopeError
# FIXME: ForbiddenError (inherited from Bearer::Forbidden of Rack::Oauth2)
# does not include WWW-Authenticate header, which breaks the standard.
Rack
::
OAuth2
::
Server
::
Resource
::
Bearer
::
Forbidden
.
new
(
:insufficient_scope
,
Rack
::
OAuth2
::
Server
::
Resource
::
ErrorMethods
::
DEFAULT_DESCRIPTION
[
:insufficient_scope
],
{
scope:
e
.
scopes
})
end
response
.
finish
class
InsufficientScopeError
<
StandardError
attr_reader
:scopes
def
initialize
(
scopes
)
@scopes
=
scopes
end
end
end
...
...
@@ -150,23 +171,4 @@
end
end
end
#
# Exceptions
#
class
MissingTokenError
<
StandardError
;
end
class
TokenNotFoundError
<
StandardError
;
end
class
ExpiredError
<
StandardError
;
end
class
RevokedError
<
StandardError
;
end
class
InsufficientScopeError
<
StandardError
attr_reader
:scopes
def
initialize
(
scopes
)
@scopes
=
scopes
end
end
end
end
\ No newline at end of file
lib/ci/api/api.rb
View file @
d17494f2
...
...
@@ -3,7 +3,7 @@
module
Ci
module
API
class
API
<
Grape
::
API
include
APIGuard
include
::
API
::
APIGuard
version
'v1'
,
using: :path
rescue_from
ActiveRecord
::
RecordNotFound
do
...
...
Write
Preview
Supports
Markdown
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