diff --git a/app/assets/javascripts/discourse/controllers/login_controller.js b/app/assets/javascripts/discourse/controllers/login_controller.js index 5ea6a4c39dd..55c3c309886 100644 --- a/app/assets/javascripts/discourse/controllers/login_controller.js +++ b/app/assets/javascripts/discourse/controllers/login_controller.js @@ -16,19 +16,12 @@ Discourse.LoginController = Discourse.Controller.extend(Discourse.ModalFunctiona return Discourse.Site.instance(); }.property(), - /** Determines whether at least one login button is enabled **/ hasAtLeastOneLoginButton: function() { - return Discourse.SiteSettings.enable_google_logins || - Discourse.SiteSettings.enable_facebook_logins || - Discourse.SiteSettings.enable_cas_logins || - Discourse.SiteSettings.enable_twitter_logins || - Discourse.SiteSettings.enable_yahoo_logins || - Discourse.SiteSettings.enable_github_logins || - Discourse.SiteSettings.enable_persona_logins; - }.property(), + return Em.get("Discourse.LoginMethod.all").length > 0; + }.property("Discourse.LoginMethod.all.@each"), loginButtonText: function() { return this.get('loggingIn') ? I18n.t('login.logging_in') : I18n.t('login.title'); @@ -78,54 +71,30 @@ Discourse.LoginController = Discourse.Controller.extend(Discourse.ModalFunctiona authMessage: (function() { if (this.blank('authenticate')) return ""; - return I18n.t("login." + (this.get('authenticate')) + ".message"); + var method = Discourse.get('LoginMethod.all').findProperty("name", this.get("authenticate")); + if(method){ + return method.get('message'); + } }).property('authenticate'), - twitterLogin: function() { - this.set('authenticate', 'twitter'); - var left = this.get('lastX') - 400; - var top = this.get('lastY') - 200; - return window.open(Discourse.getURL("/auth/twitter"), "_blank", "menubar=no,status=no,height=400,width=800,left=" + left + ",top=" + top); - }, + externalLogin: function(loginMethod){ + var name = loginMethod.get("name"); + var customLogin = loginMethod.get("customLogin"); - facebookLogin: function() { - this.set('authenticate', 'facebook'); - var left = this.get('lastX') - 400; - var top = this.get('lastY') - 200; - return window.open(Discourse.getURL("/auth/facebook"), "_blank", "menubar=no,status=no,height=400,width=800,left=" + left + ",top=" + top); - }, - - casLogin: function() { - var left, top; - this.set('authenticate', 'cas'); - left = this.get('lastX') - 400; - top = this.get('lastY') - 200; - return window.open("/auth/cas", "_blank", "menubar=no,status=no,height=400,width=800,left=" + left + ",top=" + top); - }, - - openidLogin: function(provider) { - var left = this.get('lastX') - 400; - var top = this.get('lastY') - 200; - if (provider === "yahoo") { - this.set("authenticate", 'yahoo'); - return window.open(Discourse.getURL("/auth/yahoo"), "_blank", "menubar=no,status=no,height=400,width=800,left=" + left + ",top=" + top); + if(customLogin){ + customLogin(); } else { - window.open(Discourse.getURL("/auth/google"), "_blank", "menubar=no,status=no,height=500,width=850,left=" + left + ",top=" + top); - return this.set("authenticate", 'google'); + this.set('authenticate', name); + var left = this.get('lastX') - 400; + var top = this.get('lastY') - 200; + + var height = loginMethod.get("frameHeight") || 400; + var width = loginMethod.get("frameWidth") || 800; + window.open(Discourse.getURL("/auth/" + name), "_blank", + "menubar=no,status=no,height=" + height + ",width=" + width + ",left=" + left + ",top=" + top); } }, - githubLogin: function() { - this.set('authenticate', 'github'); - var left = this.get('lastX') - 400; - var top = this.get('lastY') - 200; - return window.open(Discourse.getURL("/auth/github"), "_blank", "menubar=no,status=no,height=400,width=800,left=" + left + ",top=" + top); - }, - - personaLogin: function() { - navigator.id.request(); - }, - authenticationComplete: function(options) { if (options.awaiting_approval) { this.flash(I18n.t('login.awaiting_approval'), 'success'); diff --git a/app/assets/javascripts/discourse/models/login_method.js b/app/assets/javascripts/discourse/models/login_method.js new file mode 100644 index 00000000000..5d11e3c2101 --- /dev/null +++ b/app/assets/javascripts/discourse/models/login_method.js @@ -0,0 +1,69 @@ +Discourse.LoginMethod = Ember.Object.extend({ + title: function(){ + return this.get("titleOverride") || I18n.t("login." + this.get("name") + ".title"); + }.property(), + + message: function(){ + return this.get("messageOverride") || I18n.t("login." + this.get("name") + ".message"); + }.property() +}); + +// Note, you can add login methods by adding to the list +// just Em.get("Discourse.LoginMethod.all") and then +// pushObject for any new methods +Discourse.LoginMethod.reopenClass({ + register: function(method){ + if(this.methods){ + this.methods.pushObject(method); + } else { + this.preRegister = this.preRegister || []; + this.preRegister.push(method); + } + }, + + all: function(){ + if (this.methods) { return this.methods; } + + var methods = this.methods = Em.A(); + + /* + * enable_google_logins etc. + * */ + + [ "google", + "facebook", + "cas", + "twitter", + "yahoo", + "github", + "persona" + ].forEach(function(name){ + if(Discourse.SiteSettings["enable_" + name + "_logins"]){ + + var params = {name: name}; + + if(name === "persona") { + params.customLogin = function(){ + navigator.id.request(); + }; + } + + if(name === "google") { + params.frameWidth = 850; + params.frameHeight = 500; + } + + methods.pushObject(Discourse.LoginMethod.create(params)); + } + }); + + if (this.preRegister){ + this.preRegister.forEach(function(method){ + methods.pushObject(method); + }); + delete this.preRegister; + } + return methods; + }.property() +}); + diff --git a/app/assets/javascripts/discourse/templates/modal/login.js.handlebars b/app/assets/javascripts/discourse/templates/modal/login.js.handlebars index 53904f4c3f9..b0bf035c4cf 100644 --- a/app/assets/javascripts/discourse/templates/modal/login.js.handlebars +++ b/app/assets/javascripts/discourse/templates/modal/login.js.handlebars @@ -1,27 +1,9 @@