Validate rs/oauth redirect_uri before storing return URL

This commit is contained in:
2026-08-10 11:21:33 -06:00
parent 7a892fad4e
commit a62d84e20a
2 changed files with 18 additions and 4 deletions
+5 -4
View File
@@ -1,4 +1,5 @@
class Rs::OauthController < ApplicationController class Rs::OauthController < ApplicationController
prepend_before_action :assert_redirect_uri, only: [:new, :create]
before_action :require_signed_in_with_username, only: :new before_action :require_signed_in_with_username, only: :new
before_action :authenticate_user!, only: :create before_action :authenticate_user!, only: :create
@@ -16,8 +17,6 @@ class Rs::OauthController < ApplicationController
["In 1 month", 1.month.from_now], ["In 1 month", 1.month.from_now],
["In 1 day", 1.day.from_now]] ["In 1 day", 1.day.from_now]]
http_status :bad_request and return unless @redirect_uri.present?
unless current_user == @user unless current_user == @user
sign_out :user sign_out :user
@@ -64,8 +63,6 @@ class Rs::OauthController < ApplicationController
state = params[:state].presence state = params[:state].presence
expire_at = params[:expire_at].presence expire_at = params[:expire_at].presence
http_status :bad_request and return unless redirect_uri.present?
if permissions.empty? if permissions.empty?
redirect_to(url_with_state("#{redirect_uri}#error=invalid_scope", state), redirect_to(url_with_state("#{redirect_uri}#error=invalid_scope", state),
allow_other_host: true) and return allow_other_host: true) and return
@@ -97,6 +94,10 @@ class Rs::OauthController < ApplicationController
private private
def assert_redirect_uri
http_status :bad_request unless params[:redirect_uri].present?
end
def require_signed_in_with_username def require_signed_in_with_username
unless user_signed_in? unless user_signed_in?
session[:user_return_to] = request.url session[:user_return_to] = request.url
@@ -222,6 +222,19 @@ RSpec.describe Rs::OauthController, type: :controller do
expect(response).to redirect_to(new_user_session_path(cn: user.cn, ou: user.ou)) expect(response).to redirect_to(new_user_session_path(cn: user.cn, ou: user.ou))
end end
context "without a redirect_uri" do
it "returns a 400 without storing the return location" do
get :new, params: {
username: user.cn,
scope: "documents,photos",
client_id: "https://example.com"
}
expect(response.response_code).to eq(400)
expect(session[:user_return_to]).to be_nil
end
end
end end
describe "root access" do describe "root access" do