From c4b1b848bcf9edb0066c5c5f083ea06c57e2c96e Mon Sep 17 00:00:00 2001
From: Robin Ward <robin.ward@gmail.com>
Date: Fri, 25 Sep 2015 11:29:05 -0400
Subject: [PATCH] More extension points for login buttons, used by OAuth2
 plugin

---
 .../discourse/models/login_method.js          | 23 +++++++++++++++----
 lib/plugin/auth_provider.rb                   | 20 ++++++++++++++--
 lib/plugin/instance.rb                        | 10 +++-----
 spec/components/post_creator_spec.rb          |  1 -
 4 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/app/assets/javascripts/discourse/models/login_method.js b/app/assets/javascripts/discourse/models/login_method.js
index 074cdedf2..9411cfee9 100644
--- a/app/assets/javascripts/discourse/models/login_method.js
+++ b/app/assets/javascripts/discourse/models/login_method.js
@@ -1,9 +1,15 @@
 Discourse.LoginMethod = Ember.Object.extend({
-  title: function(){
+  title: function() {
+    var titleSetting = this.get('titleSetting');
+    if (!Ember.isEmpty(titleSetting)) {
+      var result = Discourse.SiteSettings[titleSetting];
+      if (!Ember.isEmpty(result)) { return result; }
+    }
+
     return this.get("titleOverride") || I18n.t("login." + this.get("name") + ".title");
   }.property(),
 
-  message: function(){
+  message: function() {
     return this.get("messageOverride") || I18n.t("login." + this.get("name") + ".message");
   }.property()
 });
@@ -12,8 +18,8 @@ Discourse.LoginMethod = Ember.Object.extend({
 //  just Em.get("Discourse.LoginMethod.all") and then
 //  pushObject for any new methods
 Discourse.LoginMethod.reopenClass({
-  register: function(method){
-    if(this.methods){
+  register: function(method) {
+    if (this.methods){
       this.methods.pushObject(method);
     } else {
       this.preRegister = this.preRegister || [];
@@ -50,7 +56,14 @@ Discourse.LoginMethod.reopenClass({
 
     if (this.preRegister){
       this.preRegister.forEach(function(method){
-        methods.pushObject(method);
+        var enabledSetting = method.get('enabledSetting');
+        if (enabledSetting) {
+          if (Discourse.SiteSettings[enabledSetting]) {
+            methods.pushObject(method);
+          }
+        } else {
+          methods.pushObject(method);
+        }
       });
       delete this.preRegister;
     }
diff --git a/lib/plugin/auth_provider.rb b/lib/plugin/auth_provider.rb
index 367f9a651..8db104f3e 100644
--- a/lib/plugin/auth_provider.rb
+++ b/lib/plugin/auth_provider.rb
@@ -1,9 +1,25 @@
 class Plugin::AuthProvider
-  attr_accessor :glyph, :background_color, :title,
-                :message, :frame_width, :frame_height, :authenticator
+
+  def self.auth_attributes
+    [:glyph, :background_color, :title, :message, :frame_width, :frame_height, :authenticator,
+     :title_setting, :enabled_setting]
+  end
+
+  attr_accessor(*auth_attributes)
 
   def name
     authenticator.name
   end
 
+  def to_json
+    result = {name: name}
+    result['titleOverride'] = title if title
+    result['titleSetting'] = title_setting if title_setting
+    result['enabledSetting'] = enabled_setting if enabled_setting
+    result['messageOverride'] = message if message
+    result['frameWidth'] = frame_width if frame_width
+    result['frameHeight'] = frame_height if frame_height
+    result.to_json
+  end
+
 end
diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb
index d51adc4f1..0b0493b6e 100644
--- a/lib/plugin/instance.rb
+++ b/lib/plugin/instance.rb
@@ -218,13 +218,8 @@ class Plugin::Instance
     js = javascripts.join("\n")
 
     auth_providers.each do |auth|
-      overrides = ""
-      overrides = ", titleOverride: '#{auth.title}'" if auth.title
-      overrides << ", messageOverride: '#{auth.message}'" if auth.message
-      overrides << ", frameWidth: '#{auth.frame_width}'" if auth.frame_width
-      overrides << ", frameHeight: '#{auth.frame_height}'" if auth.frame_height
 
-      js << "Discourse.LoginMethod.register(Discourse.LoginMethod.create({name: '#{auth.name}'#{overrides}}));\n"
+      js << "Discourse.LoginMethod.register(Discourse.LoginMethod.create(#{auth.to_json}));\n"
 
       if auth.glyph
         css << ".btn-social.#{auth.name}:before{ content: '#{auth.glyph}'; }\n"
@@ -305,7 +300,8 @@ class Plugin::Instance
 
   def auth_provider(opts)
     provider = Plugin::AuthProvider.new
-    [:glyph, :background_color, :title, :message, :frame_width, :frame_height, :authenticator].each do |sym|
+
+    Plugin::AuthProvider.auth_attributes.each do |sym|
       provider.send "#{sym}=", opts.delete(sym)
     end
     auth_providers << provider
diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb
index 38b4e52a0..5b4924342 100644
--- a/spec/components/post_creator_spec.rb
+++ b/spec/components/post_creator_spec.rb
@@ -295,7 +295,6 @@ describe PostCreator do
 
       expect(whisper_reply).to be_present
       expect(whisper_reply.post_type).to eq(Post.types[:whisper])
-      expect(true).to eq(false)
     end
   end