From f6062f992eeb489a25aad59aa4816716bc0a2c10 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 25 Aug 2025 16:13:44 +0530 Subject: [PATCH 1/6] fix: memory leak in vue-letter from fallback text content (#12212) --- .../dashboard/components-next/message/bubbles/Email/Index.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/javascript/dashboard/components-next/message/bubbles/Email/Index.vue b/app/javascript/dashboard/components-next/message/bubbles/Email/Index.vue index 63b5f8eef..07c6167f7 100644 --- a/app/javascript/dashboard/components-next/message/bubbles/Email/Index.vue +++ b/app/javascript/dashboard/components-next/message/bubbles/Email/Index.vue @@ -41,9 +41,7 @@ const originalEmailText = computed(() => { }); const originalEmailHtml = computed( - () => - contentAttributes?.value?.email?.htmlContent?.full ?? - originalEmailText.value + () => contentAttributes?.value?.email?.htmlContent?.full || '' ); const messageContent = computed(() => { From 85fb20013e52e5f6e44b600c9fc03285a3d28888 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 Aug 2025 16:08:34 +0530 Subject: [PATCH 2/6] feat: remove enabled field --- .../20250825070005_create_account_saml_settings.rb | 1 - db/schema.rb | 1 - .../api/v1/accounts/saml_settings_controller.rb | 1 - enterprise/app/models/account_saml_settings.rb | 11 ++++------- spec/factories/account_saml_settings.rb | 5 ----- 5 files changed, 4 insertions(+), 15 deletions(-) diff --git a/db/migrate/20250825070005_create_account_saml_settings.rb b/db/migrate/20250825070005_create_account_saml_settings.rb index 63aa0d0e4..50a982180 100644 --- a/db/migrate/20250825070005_create_account_saml_settings.rb +++ b/db/migrate/20250825070005_create_account_saml_settings.rb @@ -2,7 +2,6 @@ class CreateAccountSamlSettings < ActiveRecord::Migration[7.1] def change create_table :account_saml_settings do |t| t.references :account, null: false - t.boolean :enabled, default: false, null: false t.string :sso_url t.string :certificate_fingerprint t.text :certificate diff --git a/db/schema.rb b/db/schema.rb index fec8293cf..78ccc3ddb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -30,7 +30,6 @@ ActiveRecord::Schema[7.1].define(version: 2025_08_25_070005) do create_table "account_saml_settings", force: :cascade do |t| t.bigint "account_id", null: false - t.boolean "enabled", default: false, null: false t.string "sso_url" t.string "certificate_fingerprint" t.text "certificate" diff --git a/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb b/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb index d958c8cd5..3ce518299 100644 --- a/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb +++ b/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb @@ -28,7 +28,6 @@ class Api::V1::Accounts::SamlSettingsController < Api::V1::Accounts::BaseControl def saml_settings_params params.require(:saml_settings).permit( - :enabled, :sso_url, :certificate_fingerprint, :certificate, diff --git a/enterprise/app/models/account_saml_settings.rb b/enterprise/app/models/account_saml_settings.rb index d15f2f346..9334e1a7c 100644 --- a/enterprise/app/models/account_saml_settings.rb +++ b/enterprise/app/models/account_saml_settings.rb @@ -6,7 +6,6 @@ # attribute_mappings :json # certificate :text # certificate_fingerprint :string -# enabled :boolean default(FALSE), not null # enforced_sso :boolean default(FALSE), not null # role_mappings :json # sso_url :string @@ -23,16 +22,14 @@ class AccountSamlSettings < ApplicationRecord belongs_to :account validates :account_id, presence: true - validates :sso_url, presence: true, if: :enabled? - validates :certificate, presence: true, if: :enabled? - validates :sp_entity_id, presence: true, if: :enabled? + validates :sso_url, presence: true + validates :certificate, presence: true + validates :sp_entity_id, presence: true before_save :generate_certificate_fingerprint, if: :certificate_changed? - scope :enabled, -> { where(enabled: true) } - def saml_enabled? - enabled && sso_url.present? && certificate_fingerprint.present? + sso_url.present? && certificate_fingerprint.present? end def sp_entity_id_or_default diff --git a/spec/factories/account_saml_settings.rb b/spec/factories/account_saml_settings.rb index 4e8a29199..b44e2eae7 100644 --- a/spec/factories/account_saml_settings.rb +++ b/spec/factories/account_saml_settings.rb @@ -1,7 +1,6 @@ FactoryBot.define do factory :account_saml_settings do account - enabled { false } sso_url { 'https://idp.example.com/saml/sso' } certificate_fingerprint { nil } certificate do @@ -22,10 +21,6 @@ FactoryBot.define do attribute_mappings { {} } role_mappings { {} } - trait :enabled do - enabled { true } - end - trait :with_role_mappings do role_mappings do { From 846ea71e567fb27b3850d32b88d4f360a2a92ed1 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 Aug 2025 16:13:17 +0530 Subject: [PATCH 3/6] feat: remove certificate fingerprint field --- ...0825070005_create_account_saml_settings.rb | 1 - db/schema.rb | 1 - .../v1/accounts/saml_settings_controller.rb | 1 - .../app/models/account_saml_settings.rb | 38 ++++++------------- .../_account_saml_settings.json.jbuilder | 3 -- spec/factories/account_saml_settings.rb | 1 - 6 files changed, 11 insertions(+), 34 deletions(-) diff --git a/db/migrate/20250825070005_create_account_saml_settings.rb b/db/migrate/20250825070005_create_account_saml_settings.rb index 50a982180..346345d2f 100644 --- a/db/migrate/20250825070005_create_account_saml_settings.rb +++ b/db/migrate/20250825070005_create_account_saml_settings.rb @@ -3,7 +3,6 @@ class CreateAccountSamlSettings < ActiveRecord::Migration[7.1] create_table :account_saml_settings do |t| t.references :account, null: false t.string :sso_url - t.string :certificate_fingerprint t.text :certificate t.string :sp_entity_id t.boolean :enforced_sso, default: false, null: false diff --git a/db/schema.rb b/db/schema.rb index 78ccc3ddb..3fd736853 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -31,7 +31,6 @@ ActiveRecord::Schema[7.1].define(version: 2025_08_25_070005) do create_table "account_saml_settings", force: :cascade do |t| t.bigint "account_id", null: false t.string "sso_url" - t.string "certificate_fingerprint" t.text "certificate" t.string "sp_entity_id" t.boolean "enforced_sso", default: false, null: false diff --git a/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb b/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb index 3ce518299..c1fa07e14 100644 --- a/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb +++ b/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb @@ -29,7 +29,6 @@ class Api::V1::Accounts::SamlSettingsController < Api::V1::Accounts::BaseControl def saml_settings_params params.require(:saml_settings).permit( :sso_url, - :certificate_fingerprint, :certificate, :sp_entity_id, :enforced_sso, diff --git a/enterprise/app/models/account_saml_settings.rb b/enterprise/app/models/account_saml_settings.rb index 9334e1a7c..33929d225 100644 --- a/enterprise/app/models/account_saml_settings.rb +++ b/enterprise/app/models/account_saml_settings.rb @@ -2,17 +2,16 @@ # # Table name: account_saml_settings # -# id :bigint not null, primary key -# attribute_mappings :json -# certificate :text -# certificate_fingerprint :string -# enforced_sso :boolean default(FALSE), not null -# role_mappings :json -# sso_url :string -# created_at :datetime not null -# updated_at :datetime not null -# account_id :bigint not null -# sp_entity_id :string +# id :bigint not null, primary key +# attribute_mappings :json +# certificate :text +# enforced_sso :boolean default(FALSE), not null +# role_mappings :json +# sso_url :string +# created_at :datetime not null +# updated_at :datetime not null +# account_id :bigint not null +# sp_entity_id :string # # Indexes # @@ -26,10 +25,8 @@ class AccountSamlSettings < ApplicationRecord validates :certificate, presence: true validates :sp_entity_id, presence: true - before_save :generate_certificate_fingerprint, if: :certificate_changed? - def saml_enabled? - sso_url.present? && certificate_fingerprint.present? + sso_url.present? && certificate.present? end def sp_entity_id_or_default @@ -41,17 +38,4 @@ class AccountSamlSettings < ApplicationRecord def installation_name GlobalConfigService.load('INSTALLATION_NAME', 'Chatwoot') end - - def generate_certificate_fingerprint - return if certificate.blank? - - begin - cert = OpenSSL::X509::Certificate.new(certificate) - self.certificate_fingerprint = OpenSSL::Digest::SHA256.new(cert.to_der).hexdigest.upcase.scan(/.{2}/).join(':') - rescue OpenSSL::X509::CertificateError => e - Rails.logger.error "Failed to parse SAML certificate: #{e.message}" - errors.add(:certificate, 'is not a valid X.509 certificate') - throw(:abort) - end - end end diff --git a/enterprise/app/views/api/v1/models/_account_saml_settings.json.jbuilder b/enterprise/app/views/api/v1/models/_account_saml_settings.json.jbuilder index 19b77b6bd..5423253f4 100644 --- a/enterprise/app/views/api/v1/models/_account_saml_settings.json.jbuilder +++ b/enterprise/app/views/api/v1/models/_account_saml_settings.json.jbuilder @@ -1,9 +1,6 @@ json.id account_saml_settings.id json.account_id account_saml_settings.account_id -json.enabled account_saml_settings.enabled json.sso_url account_saml_settings.sso_url -json.certificate_fingerprint account_saml_settings.certificate_fingerprint -json.certificate account_saml_settings.certificate json.sp_entity_id account_saml_settings.sp_entity_id json.enforced_sso account_saml_settings.enforced_sso json.attribute_mappings account_saml_settings.attribute_mappings || {} diff --git a/spec/factories/account_saml_settings.rb b/spec/factories/account_saml_settings.rb index b44e2eae7..9963b1839 100644 --- a/spec/factories/account_saml_settings.rb +++ b/spec/factories/account_saml_settings.rb @@ -2,7 +2,6 @@ FactoryBot.define do factory :account_saml_settings do account sso_url { 'https://idp.example.com/saml/sso' } - certificate_fingerprint { nil } certificate do key = OpenSSL::PKey::RSA.new(2048) cert = OpenSSL::X509::Certificate.new From 0c9e4f430ab84e343d501360ee96c3a52f7d778d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 Aug 2025 16:27:44 +0530 Subject: [PATCH 4/6] feat: remove enforced_sso and attribute_mappings field --- ...0825070005_create_account_saml_settings.rb | 2 -- db/schema.rb | 2 -- .../v1/accounts/saml_settings_controller.rb | 2 -- .../app/models/account_saml_settings.rb | 26 ++++++++++++------- .../_account_saml_settings.json.jbuilder | 4 +-- spec/factories/account_saml_settings.rb | 12 --------- 6 files changed, 17 insertions(+), 31 deletions(-) diff --git a/db/migrate/20250825070005_create_account_saml_settings.rb b/db/migrate/20250825070005_create_account_saml_settings.rb index 346345d2f..03ec4c5ef 100644 --- a/db/migrate/20250825070005_create_account_saml_settings.rb +++ b/db/migrate/20250825070005_create_account_saml_settings.rb @@ -5,8 +5,6 @@ class CreateAccountSamlSettings < ActiveRecord::Migration[7.1] t.string :sso_url t.text :certificate t.string :sp_entity_id - t.boolean :enforced_sso, default: false, null: false - t.json :attribute_mappings, default: {} t.json :role_mappings, default: {} t.timestamps diff --git a/db/schema.rb b/db/schema.rb index 3fd736853..498a48f72 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -33,8 +33,6 @@ ActiveRecord::Schema[7.1].define(version: 2025_08_25_070005) do t.string "sso_url" t.text "certificate" t.string "sp_entity_id" - t.boolean "enforced_sso", default: false, null: false - t.json "attribute_mappings", default: {} t.json "role_mappings", default: {} t.datetime "created_at", null: false t.datetime "updated_at", null: false diff --git a/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb b/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb index c1fa07e14..76e2911f1 100644 --- a/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb +++ b/enterprise/app/controllers/api/v1/accounts/saml_settings_controller.rb @@ -31,8 +31,6 @@ class Api::V1::Accounts::SamlSettingsController < Api::V1::Accounts::BaseControl :sso_url, :certificate, :sp_entity_id, - :enforced_sso, - attribute_mappings: {}, role_mappings: {} ) end diff --git a/enterprise/app/models/account_saml_settings.rb b/enterprise/app/models/account_saml_settings.rb index 33929d225..aa6ef962e 100644 --- a/enterprise/app/models/account_saml_settings.rb +++ b/enterprise/app/models/account_saml_settings.rb @@ -2,16 +2,14 @@ # # Table name: account_saml_settings # -# id :bigint not null, primary key -# attribute_mappings :json -# certificate :text -# enforced_sso :boolean default(FALSE), not null -# role_mappings :json -# sso_url :string -# created_at :datetime not null -# updated_at :datetime not null -# account_id :bigint not null -# sp_entity_id :string +# id :bigint not null, primary key +# certificate :text +# role_mappings :json +# sso_url :string +# created_at :datetime not null +# updated_at :datetime not null +# account_id :bigint not null +# sp_entity_id :string # # Indexes # @@ -33,6 +31,14 @@ class AccountSamlSettings < ApplicationRecord sp_entity_id.presence || "#{installation_name}-#{account_id}".downcase end + def attribute_mappings + { + 'email' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress', + 'first_name' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname', + 'last_name' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname' + } + end + private def installation_name diff --git a/enterprise/app/views/api/v1/models/_account_saml_settings.json.jbuilder b/enterprise/app/views/api/v1/models/_account_saml_settings.json.jbuilder index 5423253f4..8c053f706 100644 --- a/enterprise/app/views/api/v1/models/_account_saml_settings.json.jbuilder +++ b/enterprise/app/views/api/v1/models/_account_saml_settings.json.jbuilder @@ -2,8 +2,6 @@ json.id account_saml_settings.id json.account_id account_saml_settings.account_id json.sso_url account_saml_settings.sso_url json.sp_entity_id account_saml_settings.sp_entity_id -json.enforced_sso account_saml_settings.enforced_sso -json.attribute_mappings account_saml_settings.attribute_mappings || {} json.role_mappings account_saml_settings.role_mappings || {} json.created_at account_saml_settings.created_at -json.updated_at account_saml_settings.updated_at \ No newline at end of file +json.updated_at account_saml_settings.updated_at diff --git a/spec/factories/account_saml_settings.rb b/spec/factories/account_saml_settings.rb index 9963b1839..c4b7c9ef1 100644 --- a/spec/factories/account_saml_settings.rb +++ b/spec/factories/account_saml_settings.rb @@ -16,8 +16,6 @@ FactoryBot.define do cert.to_pem end sp_entity_id { 'chatwoot-test' } - enforced_sso { false } - attribute_mappings { {} } role_mappings { {} } trait :with_role_mappings do @@ -29,15 +27,5 @@ FactoryBot.define do } end end - - trait :with_attribute_mappings do - attribute_mappings do - { - 'email' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress', - 'name' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name', - 'first_name' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname' - } - end - end end end From abf07c44c263d27a433ae6465671e1d9676760a8 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 Aug 2025 16:28:39 +0530 Subject: [PATCH 5/6] chore: revert unrelated change --- db/schema.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 498a48f72..0cbafa386 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -276,7 +276,7 @@ ActiveRecord::Schema[7.1].define(version: 2025_08_25_070005) do t.jsonb "audience", default: [] t.datetime "scheduled_at", precision: nil t.boolean "trigger_only_during_business_hours", default: false - t.jsonb "template_params", default: {}, null: false + t.jsonb "template_params" t.index ["account_id"], name: "index_campaigns_on_account_id" t.index ["campaign_status"], name: "index_campaigns_on_campaign_status" t.index ["campaign_type"], name: "index_campaigns_on_campaign_type" From 94bbfff8fd21847f0afa7bc149e00f7faa9bd1fa Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 Aug 2025 16:30:22 +0530 Subject: [PATCH 6/6] chore: remove unnecessary change --- enterprise/app/models/enterprise/account.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/enterprise/app/models/enterprise/account.rb b/enterprise/app/models/enterprise/account.rb index 3aa9c35a8..642e4a99b 100644 --- a/enterprise/app/models/enterprise/account.rb +++ b/enterprise/app/models/enterprise/account.rb @@ -1,6 +1,4 @@ module Enterprise::Account - extend ActiveSupport::Concern - # TODO: Remove this when we upgrade administrate gem to the latest version # this is a temporary method since current administrate doesn't support virtual attributes def manually_managed_features; end