Skip to content

Commit

Permalink
Test that suspended and deleted users can't use OAuth tokens
Browse files Browse the repository at this point in the history
  • Loading branch information
tomhughes committed Aug 25, 2023
1 parent 477f700 commit 6759130
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 12 deletions.
41 changes: 29 additions & 12 deletions test/integration/oauth2_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@

class OAuth2Test < ActionDispatch::IntegrationTest
def test_oauth2
user = create(:user)
client = create(:oauth_application, :redirect_uri => "https://some.web.app.example.org/callback", :scopes => "read_prefs write_api read_gpx")
state = SecureRandom.urlsafe_base64(16)

authorize_client(client, :state => state)
authorize_client(user, client, :state => state)
assert_response :redirect
code = validate_redirect(client, state)

token = request_token(client, code)

test_token(token, client)
test_token(token, user, client)
end

def test_oauth2_oob
user = create(:user)
client = create(:oauth_application, :redirect_uri => "urn:ietf:wg:oauth:2.0:oob", :scopes => "read_prefs write_api read_gpx")

authorize_client(client)
authorize_client(user, client)
assert_response :redirect
follow_redirect!
assert_response :success
Expand All @@ -28,42 +30,44 @@ def test_oauth2_oob

token = request_token(client, code)

test_token(token, client)
test_token(token, user, client)
end

def test_oauth2_pkce_plain
user = create(:user)
client = create(:oauth_application, :redirect_uri => "https://some.web.app.example.org/callback", :scopes => "read_prefs write_api read_gpx")
state = SecureRandom.urlsafe_base64(16)
verifier = SecureRandom.urlsafe_base64(48)
challenge = verifier

authorize_client(client, :state => state, :code_challenge => challenge, :code_challenge_method => "plain")
authorize_client(user, client, :state => state, :code_challenge => challenge, :code_challenge_method => "plain")
assert_response :redirect
code = validate_redirect(client, state)

token = request_token(client, code, verifier)

test_token(token, client)
test_token(token, user, client)
end

def test_oauth2_pkce_s256
user = create(:user)
client = create(:oauth_application, :redirect_uri => "https://some.web.app.example.org/callback", :scopes => "read_prefs write_api read_gpx")
state = SecureRandom.urlsafe_base64(16)
verifier = SecureRandom.urlsafe_base64(48)
challenge = Base64.urlsafe_encode64(Digest::SHA256.digest(verifier), :padding => false)

authorize_client(client, :state => state, :code_challenge => challenge, :code_challenge_method => "S256")
authorize_client(user, client, :state => state, :code_challenge => challenge, :code_challenge_method => "S256")
assert_response :redirect
code = validate_redirect(client, state)

token = request_token(client, code, verifier)

test_token(token, client)
test_token(token, user, client)
end

private

def authorize_client(client, options = {})
def authorize_client(user, client, options = {})
options = options.merge(:client_id => client.uid,
:redirect_uri => client.redirect_uri,
:response_type => "code",
Expand All @@ -73,8 +77,6 @@ def authorize_client(client, options = {})
assert_response :redirect
assert_redirected_to login_path(:referer => request.fullpath)

user = create(:user)

post login_path(:username => user.email, :password => "test")
follow_redirect!
assert_response :success
Expand Down Expand Up @@ -138,7 +140,7 @@ def request_token(client, code, verifier = nil)
token["access_token"]
end

def test_token(token, client)
def test_token(token, user, client)
get user_preferences_path
assert_response :unauthorized

Expand All @@ -156,6 +158,21 @@ def test_token(token, client)
get api_trace_path(:id => 2), :headers => auth_header
assert_response :forbidden

user.suspend!

get user_preferences_path, :headers => auth_header
assert_response :forbidden

user.hide!

get user_preferences_path, :headers => auth_header
assert_response :forbidden

user.unhide!

get user_preferences_path, :headers => auth_header
assert_response :success

post oauth_revoke_path(:token => token)
assert_response :forbidden

Expand Down
48 changes: 48 additions & 0 deletions test/integration/oauth_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,18 @@ def oauth10_without_callback(client)
signed_get "/api/0.6/gpx/2", :oauth => { :token => token }
assert_response :forbidden

token.user.suspend!
signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
assert_response :forbidden

token.user.hide!
signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
assert_response :forbidden

token.user.unhide!
signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
assert_response :success

session_for(token.user)

post "/oauth/revoke", :params => { :token => token.token }
Expand Down Expand Up @@ -174,6 +186,18 @@ def oauth10_with_callback(client, callback_url)
signed_get "/api/0.6/user/details", :oauth => { :token => token }
assert_response :forbidden

token.user.suspend!
signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
assert_response :forbidden

token.user.hide!
signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
assert_response :forbidden

token.user.unhide!
signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
assert_response :success

session_for(token.user)

post "/oauth/revoke", :params => { :token => token.token }
Expand Down Expand Up @@ -237,6 +261,18 @@ def oauth10a_without_callback(client)
signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
assert_response :forbidden

token.user.suspend!
signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
assert_response :forbidden

token.user.hide!
signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
assert_response :forbidden

token.user.unhide!
signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
assert_response :success

session_for(token.user)

post "/oauth/revoke", :params => { :token => token.token }
Expand Down Expand Up @@ -292,6 +328,18 @@ def oauth10a_with_callback(client, callback_url)
signed_get "/api/0.6/user/details", :oauth => { :token => token }
assert_response :forbidden

token.user.suspend!
signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
assert_response :forbidden

token.user.hide!
signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
assert_response :forbidden

token.user.unhide!
signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
assert_response :success

session_for(token.user)

post "/oauth/revoke", :params => { :token => token.token }
Expand Down

0 comments on commit 6759130

Please sign in to comment.