diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index bcbf80355..3e513a4b2 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -100,7 +100,7 @@ class Api::V1::AccountsController < Api::BaseController end def check_signup_enabled - raise ActionController::RoutingError, 'Not Found' if GlobalConfigService.load('ENABLE_ACCOUNT_SIGNUP', 'false') == 'false' + raise ActionController::RoutingError, 'Not Found' unless GlobalConfigService.account_signup_enabled? end def validate_captcha diff --git a/app/controllers/api/v2/accounts_controller.rb b/app/controllers/api/v2/accounts_controller.rb index bed0a212a..5a19ddeed 100644 --- a/app/controllers/api/v2/accounts_controller.rb +++ b/app/controllers/api/v2/accounts_controller.rb @@ -58,7 +58,7 @@ class Api::V2::AccountsController < Api::BaseController end def check_signup_enabled - raise ActionController::RoutingError, 'Not Found' if GlobalConfigService.load('ENABLE_ACCOUNT_SIGNUP', 'false') == 'false' + raise ActionController::RoutingError, 'Not Found' unless GlobalConfigService.account_signup_enabled? end def validate_captcha diff --git a/app/controllers/devise_overrides/omniauth_callbacks_controller.rb b/app/controllers/devise_overrides/omniauth_callbacks_controller.rb index 900125670..af759af54 100644 --- a/app/controllers/devise_overrides/omniauth_callbacks_controller.rb +++ b/app/controllers/devise_overrides/omniauth_callbacks_controller.rb @@ -51,8 +51,7 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa end def account_signup_allowed? - # set it to true by default, this is the behaviour across the app - GlobalConfigService.load('ENABLE_ACCOUNT_SIGNUP', 'false') != 'false' + GlobalConfigService.account_signup_enabled? end def resource_class(_mapping = nil) diff --git a/lib/global_config_service.rb b/lib/global_config_service.rb index 0649c24af..31612a240 100644 --- a/lib/global_config_service.rb +++ b/lib/global_config_service.rb @@ -14,4 +14,8 @@ class GlobalConfigService GlobalConfig.clear_cache i.value end + + def self.account_signup_enabled? + load('ENABLE_ACCOUNT_SIGNUP', 'false').to_s != 'false' + end end diff --git a/spec/requests/signup_enforcement_spec.rb b/spec/requests/signup_enforcement_spec.rb new file mode 100644 index 000000000..7f7992c34 --- /dev/null +++ b/spec/requests/signup_enforcement_spec.rb @@ -0,0 +1,74 @@ +require 'rails_helper' + +RSpec.describe 'Signup enforcement', type: :request do + let(:signup_config_name) { 'ENABLE_ACCOUNT_SIGNUP' } + + before do + GlobalConfig.clear_cache + InstallationConfig.where(name: signup_config_name).delete_all + InstallationConfig.create!(name: signup_config_name, value: false, locked: false) + end + + after do + InstallationConfig.where(name: signup_config_name).delete_all + GlobalConfig.clear_cache + OmniAuth.config.mock_auth[:google_oauth2] = nil + end + + describe 'POST /api/v1/accounts' do + it 'blocks signup when the config is stored as boolean false' do + post api_v1_accounts_url, + params: { + account_name: 'verify', + user_full_name: 'Verify User', + email: "verify-#{SecureRandom.hex(4)}@example.com", + password: 'Password1!' + }, + as: :json + + expect(response).to have_http_status(:not_found) + end + end + + describe 'POST /api/v2/accounts' do + it 'blocks signup when the config is stored as boolean false' do + post api_v2_accounts_url, + params: { + email: "verify-#{SecureRandom.hex(4)}@example.com", + password: 'Password1!' + }, + as: :json + + expect(response).to have_http_status(:not_found) + end + end + + describe 'GET /omniauth/google_oauth2/callback' do + let(:email_validation_service) { instance_double(Account::SignUpEmailValidationService, perform: true) } + + before do + OmniAuth.config.test_mode = true + allow(Account::SignUpEmailValidationService).to receive(:new).and_return(email_validation_service) + end + + it 'redirects to no-account-found when the config is stored as boolean false' do + OmniAuth.config.mock_auth[:google_oauth2] = OmniAuth::AuthHash.new( + provider: 'google', + uid: '123545', + info: { + name: 'test', + email: "verify-#{SecureRandom.hex(4)}@example.com", + image: 'https://example.com/image.jpg' + } + ) + + with_modified_env FRONTEND_URL: 'http://www.example.com' do + get '/omniauth/google_oauth2/callback' + + expect(response).to redirect_to('http://www.example.com/auth/google_oauth2/callback') + follow_redirect! + expect(response).to redirect_to(%r{/app/login\?error=no-account-found$}) + end + end + end +end