FEATURE: support SSO website and location overrides

FEATURE: support SSO website and location overrides

Add location and website + the ability to override using SSO using the sso_overrides_location and sso_overrides_website site settings.

diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/profile.js b/app/assets/javascripts/discourse/app/controllers/preferences/profile.js
index 71992e9..7eac6c1 100644
--- a/app/assets/javascripts/discourse/app/controllers/preferences/profile.js
+++ b/app/assets/javascripts/discourse/app/controllers/preferences/profile.js
@@ -48,6 +48,16 @@ export default Controller.extend({
     return canChangeBio;
   },
 
+  @discourseComputed("model.can_change_location")
+  canChangeLocation(canChangeLocation) {
+    return canChangeLocation;
+  },
+
+  @discourseComputed("model.can_change_website")
+  canChangeWebsite(canChangeWebsite) {
+    return canChangeWebsite;
+  },
+
   actions: {
     showFeaturedTopicModal() {
       showModal("feature-topic-on-profile", {
diff --git a/app/assets/javascripts/discourse/app/templates/preferences/profile.hbs b/app/assets/javascripts/discourse/app/templates/preferences/profile.hbs
index f07bcaf..fb3d780 100644
--- a/app/assets/javascripts/discourse/app/templates/preferences/profile.hbs
+++ b/app/assets/javascripts/discourse/app/templates/preferences/profile.hbs
@@ -17,19 +17,23 @@
   {{d-button icon="globe" label="user.use_current_timezone" action=(action "useCurrentTimezone") }}
 </div>
 
-<div class="control-group pref-location">
-  <label class="control-label">{{i18n "user.location"}}</label>
-  <div class="controls">
-    {{input type="text" value=model.location class="input-xxlarge" id="edit-location"}}
+{{#if model.can_change_location}}
+  <div class="control-group pref-location">
+    <label class="control-label">{{i18n "user.location"}}</label>
+    <div class="controls">
+      {{input type="text" value=model.location class="input-xxlarge" id="edit-location"}}
+    </div>
   </div>
-</div>
+{{/if}}
 
-<div class="control-group pref-website">
-  <label class="control-label">{{i18n "user.website"}}</label>
-  <div class="controls">
-    {{input type="text" value=model.website class="input-xxlarge"}}
+{{#if model.can_change_website}}
+  <div class="control-group pref-website">
+    <label class="control-label">{{i18n "user.website"}}</label>
+    <div class="controls">
+      {{input type="text" value=model.website class="input-xxlarge"}}
+    </div>
   </div>
-</div>
+{{/if}}
 
 {{#each userFields as |uf|}}
   <div class="control-group">
diff --git a/app/models/discourse_single_sign_on.rb b/app/models/discourse_single_sign_on.rb
index 085946c..ab8c6c6 100644
--- a/app/models/discourse_single_sign_on.rb
+++ b/app/models/discourse_single_sign_on.rb
@@ -117,6 +117,11 @@ class DiscourseSingleSignOn < SingleSignOn
       user.user_profile.save!
     end
 
+    if location
+      user.user_profile.location = location
+      user.user_profile.save!
+    end
+
     unless admin.nil? && moderator.nil?
       Group.refresh_automatic_groups!(:admins, :moderators, :staff)
     end
diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb
index 866dc39..352603d 100644
--- a/app/serializers/user_serializer.rb
+++ b/app/serializers/user_serializer.rb
@@ -51,6 +51,8 @@ class UserSerializer < UserCardSerializer
                      :ignored_usernames,
                      :mailing_list_posts_per_day,
                      :can_change_bio,
+                     :can_change_location,
+                     :can_change_website,
                      :user_api_keys,
                      :user_auth_tokens
 
@@ -108,6 +110,14 @@ class UserSerializer < UserCardSerializer
     !(SiteSetting.enable_sso && SiteSetting.sso_overrides_bio)
   end
 
+  def can_change_location
+    !(SiteSetting.enable_sso && SiteSetting.sso_overrides_location)
+  end
+
+  def can_change_website
+    !(SiteSetting.enable_sso && SiteSetting.sso_overrides_website)
+  end
+
   def user_api_keys
     keys = object.user_api_keys.where(revoked_at: nil).map do |k|
       {
diff --git a/app/serializers/web_hook_user_serializer.rb b/app/serializers/web_hook_user_serializer.rb
index 4fd63a8..31d178b 100644
--- a/app/serializers/web_hook_user_serializer.rb
+++ b/app/serializers/web_hook_user_serializer.rb
@@ -27,6 +27,8 @@ class WebHookUserSerializer < UserSerializer
     gravatar_avatar_upload_id
     custom_avatar_upload_id
     can_change_bio
+    can_change_location
+    can_change_website
     user_api_keys
     group_users
     user_auth_tokens
diff --git a/app/services/user_updater.rb b/app/services/user_updater.rb
index 02db79c..b30f5b1 100644
--- a/app/services/user_updater.rb
+++ b/app/services/user_updater.rb
@@ -52,13 +52,19 @@ class UserUpdater
 
   def update(attributes = {})
     user_profile = user.user_profile
-    user_profile.location = attributes.fetch(:location) { user_profile.location }
     user_profile.dismissed_banner_key = attributes[:dismissed_banner_key] if attributes[:dismissed_banner_key].present?
-    user_profile.website = format_url(attributes.fetch(:website) { user_profile.website })
     unless SiteSetting.enable_sso && SiteSetting.sso_overrides_bio
       user_profile.bio_raw = attributes.fetch(:bio_raw) { user_profile.bio_raw }
     end
 
+    unless SiteSetting.enable_sso && SiteSetting.sso_overrides_location
+      user_profile.location = attributes.fetch(:location) { user_profile.location }
+    end
+
+    unless SiteSetting.enable_sso && SiteSetting.sso_overrides_website
+      user_profile.website = format_url(attributes.fetch(:website) { user_profile.website })
+    end
+
     if attributes[:profile_background_upload_url] == ""
       user_profile.profile_background_upload_id = nil
     elsif upload = Upload.get_from_url(attributes[:profile_background_upload_url])
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index baf137f..7a0ebe6 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -1623,6 +1623,8 @@ en:
     sso_overrides_username: "Overrides local username with external site username from SSO payload on every login, and prevent local changes. (WARNING: discrepancies can occur due to differences in username length/requirements)"
     sso_overrides_name: "Overrides local full name with external site full name from SSO payload on every login, and prevent local changes."
     sso_overrides_avatar: "Overrides user avatar with external site avatar from SSO payload. If enabled, users will not be allowed to upload avatars on Discourse."
+    sso_overrides_location: "Overrides user location with external location from SSO payload and prevent local changes."
+    sso_overrides_website: "Overrides user website with external location from SSO payload and prevent local changes."
     sso_overrides_profile_background: "Overrides user profile background with external site avatar from SSO payload."
     sso_overrides_card_background: "Overrides user card background with external site avatar from SSO payload."
     sso_not_approved_url: "Redirect unapproved SSO accounts to this URL"
diff --git a/config/site_settings.yml b/config/site_settings.yml
index 7d9fd0f..ed4a4f1 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -454,6 +454,8 @@ login:
     default: false
     client: true
   sso_overrides_profile_background: false
+  sso_overrides_location: false
+  sso_overrides_website: false
   sso_overrides_card_background: false
   sso_not_approved_url: ""
   email_domains_blacklist:
diff --git a/lib/single_sign_on.rb b/lib/single_sign_on.rb
index a8e8ea7..e1436ce 100644
--- a/lib/single_sign_on.rb
+++ b/lib/single_sign_on.rb
@@ -27,6 +27,7 @@ class SingleSignOn
     title
     username
     website
+    location
   }
 
   FIXNUMS = []
diff --git a/spec/models/discourse_single_sign_on_spec.rb b/spec/models/discourse_single_sign_on_spec.rb
index 538d18d..fb318d1 100644
--- a/spec/models/discourse_single_sign_on_spec.rb
+++ b/spec/models/discourse_single_sign_on_spec.rb
@@ -33,6 +33,7 @@ describe DiscourseSingleSignOn do
     sso.custom_fields["a"] = "Aa"
     sso.custom_fields["b.b"] = "B.b"

[... diff too long, it was truncated ...]

GitHub sha: 67f3fe14

This commit appears in #9459 which was merged by SamSaffron.