diff --git a/app/assets/javascripts/discourse/app/components/login-buttons.js b/app/assets/javascripts/discourse/app/components/login-buttons.js index 1a80f85604a..e78c245d12b 100644 --- a/app/assets/javascripts/discourse/app/components/login-buttons.js +++ b/app/assets/javascripts/discourse/app/components/login-buttons.js @@ -25,7 +25,7 @@ export default Component.extend({ canUsePasskeys() { return ( this.siteSettings.enable_local_logins && - this.siteSettings.experimental_passkeys && + this.siteSettings.enable_passkeys && isWebauthnSupported() ); }, diff --git a/app/assets/javascripts/discourse/app/components/modal/login.js b/app/assets/javascripts/discourse/app/components/modal/login.js index fc464962896..f745ca60315 100644 --- a/app/assets/javascripts/discourse/app/components/modal/login.js +++ b/app/assets/javascripts/discourse/app/components/modal/login.js @@ -96,7 +96,7 @@ export default class Login extends Component { get canUsePasskeys() { return ( this.siteSettings.enable_local_logins && - this.siteSettings.experimental_passkeys && + this.siteSettings.enable_passkeys && isWebauthnSupported() ); } diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/security.js b/app/assets/javascripts/discourse/app/controllers/preferences/security.js index 9483dd87a21..4d29848da54 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/security.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/security.js @@ -28,7 +28,7 @@ export default Controller.extend(CanCheckEmails, { return ( !this.siteSettings.enable_discourse_connect && this.siteSettings.enable_local_logins && - this.siteSettings.experimental_passkeys && + this.siteSettings.enable_passkeys && isWebauthnSupported() ); }, diff --git a/app/assets/javascripts/discourse/tests/acceptance/modal/login/login-test.js b/app/assets/javascripts/discourse/tests/acceptance/modal/login/login-test.js index d1b07457627..f0abb87cbd8 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/modal/login/login-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/modal/login/login-test.js @@ -47,7 +47,7 @@ acceptance("Modal - Login - With 2FA", function (needs) { acceptance("Modal - Login - With Passkeys enabled", function (needs) { needs.settings({ - experimental_passkeys: true, + enable_passkeys: true, }); needs.pretender((server, helper) => { @@ -72,7 +72,7 @@ acceptance("Modal - Login - With Passkeys enabled", function (needs) { acceptance("Modal - Login - With Passkeys disabled", function (needs) { needs.settings({ - experimental_passkeys: false, + enable_passkeys: false, }); test("Excludes passkeys button and conditional UI", async function (assert) { @@ -87,7 +87,7 @@ acceptance("Modal - Login - With Passkeys disabled", function (needs) { acceptance("Modal - Login - Passkeys on mobile", function (needs) { needs.mobileView(); needs.settings({ - experimental_passkeys: true, + enable_passkeys: true, }); needs.pretender((server, helper) => { diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-preferences-security-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-preferences-security-test.js index 5adb555dbea..6d9587e9265 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-preferences-security-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-preferences-security-test.js @@ -99,7 +99,7 @@ acceptance("User Preferences - Security", function (needs) { }); test("Viewing Passkeys - user has a key", async function (assert) { - this.siteSettings.experimental_passkeys = true; + this.siteSettings.enable_passkeys = true; updateCurrentUser({ user_passkeys: [ @@ -161,7 +161,7 @@ acceptance("User Preferences - Security", function (needs) { }); test("Viewing Passkeys - empty state", async function (assert) { - this.siteSettings.experimental_passkeys = true; + this.siteSettings.enable_passkeys = true; await visit("/u/eviltrout/preferences/security"); @@ -179,7 +179,7 @@ acceptance("User Preferences - Security", function (needs) { }); test("Viewing Passkeys - another user has a key", async function (assert) { - this.siteSettings.experimental_passkeys = true; + this.siteSettings.enable_passkeys = true; // user charlie has passkeys in fixtures await visit("/u/charlie/preferences/security"); diff --git a/app/controllers/session_controller.rb b/app/controllers/session_controller.rb index 44f40080f38..9ec0f8a2b55 100644 --- a/app/controllers/session_controller.rb +++ b/app/controllers/session_controller.rb @@ -338,7 +338,7 @@ class SessionController < ApplicationController end def passkey_login - raise Discourse::NotFound unless SiteSetting.experimental_passkeys + raise Discourse::NotFound unless SiteSetting.enable_passkeys params.require(:publicKeyCredential) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 238ec7d9639..9125572906b 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1609,7 +1609,7 @@ class UsersController < ApplicationController end def create_passkey - raise Discourse::NotFound unless SiteSetting.experimental_passkeys + raise Discourse::NotFound unless SiteSetting.enable_passkeys challenge_session = DiscourseWebauthn.stage_challenge(current_user, secure_session) render json: @@ -1624,7 +1624,7 @@ class UsersController < ApplicationController end def register_passkey - raise Discourse::NotFound unless SiteSetting.experimental_passkeys + raise Discourse::NotFound unless SiteSetting.enable_passkeys params.require(:name) params.require(:attestation) @@ -1644,7 +1644,7 @@ class UsersController < ApplicationController end def delete_passkey - raise Discourse::NotFound unless SiteSetting.experimental_passkeys + raise Discourse::NotFound unless SiteSetting.enable_passkeys current_user.security_keys.find_by(id: params[:id].to_i)&.destroy! @@ -1652,7 +1652,7 @@ class UsersController < ApplicationController end def rename_passkey - raise Discourse::NotFound unless SiteSetting.experimental_passkeys + raise Discourse::NotFound unless SiteSetting.enable_passkeys params.require(:id) params.require(:name) diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb index f47c7b70032..4cd0cc885d6 100644 --- a/app/serializers/user_serializer.rb +++ b/app/serializers/user_serializer.rb @@ -175,7 +175,7 @@ class UserSerializer < UserCardSerializer end def include_user_passkeys? - SiteSetting.experimental_passkeys? + SiteSetting.enable_passkeys? end def bio_raw diff --git a/config/site_settings.yml b/config/site_settings.yml index fdb81f6036c..86da5d14b4a 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -416,6 +416,10 @@ login: client: true default: true validator: "EnableLocalLoginsViaEmailValidator" + enable_passkeys: + client: true + default: false + hidden: true allow_new_registrations: client: true default: true @@ -2180,10 +2184,6 @@ developer: experimental_topics_filter: client: true default: false - experimental_passkeys: - client: true - default: false - hidden: true experimental_search_menu_groups: type: group_list list_type: compact diff --git a/db/migrate/20231111201253_rename_experimental_passkeys_site_setting.rb b/db/migrate/20231111201253_rename_experimental_passkeys_site_setting.rb new file mode 100644 index 00000000000..bbc168398d7 --- /dev/null +++ b/db/migrate/20231111201253_rename_experimental_passkeys_site_setting.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class RenameExperimentalPasskeysSiteSetting < ActiveRecord::Migration[7.0] + def up + execute "UPDATE site_settings SET name = 'enable_passkeys' WHERE name = 'experimental_passkeys'" + end + + def down + execute "UPDATE site_settings SET name = 'experimental_passkeys' WHERE name = 'enable_passkeys'" + end +end diff --git a/spec/requests/session_controller_spec.rb b/spec/requests/session_controller_spec.rb index 0f57078122d..14821993c3f 100644 --- a/spec/requests/session_controller_spec.rb +++ b/spec/requests/session_controller_spec.rb @@ -3043,14 +3043,14 @@ RSpec.describe SessionController do describe "#passkey_login" do it "returns 404 if feature is not enabled" do - SiteSetting.experimental_passkeys = false + SiteSetting.enable_passkeys = false post "/session/passkey/auth.json" expect(response.status).to eq(404) end - context "when experimental_passkeys is enabled" do - before { SiteSetting.experimental_passkeys = true } + context "when enable_passkeys is enabled" do + before { SiteSetting.enable_passkeys = true } it "fails if public key param is missing" do post "/session/passkey/auth.json" diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb index e57c6faec3f..6417855581d 100644 --- a/spec/requests/users_controller_spec.rb +++ b/spec/requests/users_controller_spec.rb @@ -5950,7 +5950,7 @@ RSpec.describe UsersController do describe "#create_passkey" do before do - SiteSetting.experimental_passkeys = true + SiteSetting.enable_passkeys = true stub_secure_session_confirmed end @@ -5991,7 +5991,7 @@ RSpec.describe UsersController do end describe "#rename_passkey" do - before { SiteSetting.experimental_passkeys = true } + before { SiteSetting.enable_passkeys = true } it "fails if no user is logged in" do put "/u/rename_passkey/NONE.json" @@ -6044,7 +6044,7 @@ RSpec.describe UsersController do end describe "#delete_passkey" do - before { SiteSetting.experimental_passkeys = true } + before { SiteSetting.enable_passkeys = true } fab!(:passkey) { Fabricate(:passkey_with_random_credential, user: user1) } it "fails if user does not have a confirmed session" do @@ -6079,7 +6079,7 @@ RSpec.describe UsersController do end describe "#register_passkey" do - before { SiteSetting.experimental_passkeys = true } + before { SiteSetting.enable_passkeys = true } it "fails if user is not logged in" do stub_secure_session_confirmed diff --git a/spec/serializers/user_serializer_spec.rb b/spec/serializers/user_serializer_spec.rb index 23a5112b3b6..fae00312370 100644 --- a/spec/serializers/user_serializer_spec.rb +++ b/spec/serializers/user_serializer_spec.rb @@ -456,7 +456,7 @@ RSpec.describe UserSerializer do end it "includes passkeys if feature is enabled" do - SiteSetting.experimental_passkeys = true + SiteSetting.enable_passkeys = true json = UserSerializer.new(user, scope: Guardian.new(user), root: false).as_json diff --git a/spec/system/user_page/user_preferences_security_spec.rb b/spec/system/user_page/user_preferences_security_spec.rb index b359f068912..a8332637308 100644 --- a/spec/system/user_page/user_preferences_security_spec.rb +++ b/spec/system/user_page/user_preferences_security_spec.rb @@ -49,7 +49,7 @@ describe "User preferences for Security", type: :system do end shared_examples "passkeys" do - before { SiteSetting.experimental_passkeys = true } + before { SiteSetting.enable_passkeys = true } it "adds a passkey and logs in with it" do options =