From c6f364224e4b0c228e3005f918632cb32657f06a Mon Sep 17 00:00:00 2001 From: David Taylor <david@taylorhq.com> Date: Wed, 17 Oct 2018 10:33:27 +0100 Subject: [PATCH] FEATURE: Allow plugins to whitelist user custom fields for public display (#6499) This works exactly the same as `whitelist_staff_user_custom_fields`, but is not limited to staff --- app/models/user.rb | 12 ++++++++++++ lib/plugin/instance.rb | 6 ++++++ spec/serializers/user_serializer_spec.rb | 7 +++++++ 3 files changed, 25 insertions(+) diff --git a/app/models/user.rb b/app/models/user.rb index 4f3c56ee348..06b6ba89b67 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -252,9 +252,21 @@ class User < ActiveRecord::Base plugin_staff_user_custom_fields[custom_field_name] = plugin end + def self.plugin_public_user_custom_fields + @plugin_public_user_custom_fields ||= {} + end + + def self.register_plugin_public_custom_field(custom_field_name, plugin) + plugin_public_user_custom_fields[custom_field_name] = plugin + end + def self.whitelisted_user_custom_fields(guardian) fields = [] + plugin_public_user_custom_fields.each do |k, v| + fields << k if v.enabled? + end + if SiteSetting.public_user_custom_fields.present? fields += SiteSetting.public_user_custom_fields.split('|') end diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index bc198b39326..ac575b1c72b 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -121,6 +121,12 @@ class Plugin::Instance end end + def whitelist_public_user_custom_field(field) + reloadable_patch do |plugin| + ::User.register_plugin_public_custom_field(field, plugin) # plugin.enabled? is checked at runtime + end + end + def register_editable_user_custom_field(field) reloadable_patch do |plugin| ::User.register_plugin_editable_user_custom_field(field, plugin) # plugin.enabled? is checked at runtime diff --git a/spec/serializers/user_serializer_spec.rb b/spec/serializers/user_serializer_spec.rb index a637d13137b..c02ac89f307 100644 --- a/spec/serializers/user_serializer_spec.rb +++ b/spec/serializers/user_serializer_spec.rb @@ -195,6 +195,13 @@ describe UserSerializer do expect(json[:custom_fields]['public_field']).to eq(user.custom_fields['public_field']) expect(json[:custom_fields]['secret_field']).to eq(nil) end + + it "serializes the fields listed in plugin_public_user_custom_fields" do + plugin = Plugin::Instance.new + plugin.whitelist_public_user_custom_field :public_field + expect(json[:custom_fields]['public_field']).to eq(user.custom_fields['public_field']) + expect(json[:custom_fields]['secret_field']).to eq(nil) + end end context "with user_api_keys" do