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