This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/models/login-method.js.es6
2019-11-08 13:46:50 -05:00

84 lines
2.1 KiB
JavaScript

import discourseComputed from "discourse-common/utils/decorators";
import EmberObject from "@ember/object";
import { updateCsrfToken } from "discourse/lib/ajax";
import { Promise } from "rsvp";
import Session from "discourse/models/session";
const LoginMethod = EmberObject.extend({
@discourseComputed
title() {
return this.title_override || I18n.t(`login.${this.name}.title`);
},
@discourseComputed
prettyName() {
return this.pretty_name_override || I18n.t(`login.${this.name}.name`);
},
@discourseComputed
message() {
return this.message_override || I18n.t(`login.${this.name}.message`);
},
doLogin({ reconnect = false } = {}) {
if (this.customLogin) {
this.customLogin();
return Promise.resolve();
}
if (this.custom_url) {
window.location = this.custom_url;
return Promise.resolve();
}
let authUrl = Discourse.getURL(`/auth/${this.name}`);
if (reconnect) {
authUrl += "?reconnect=true";
}
return LoginMethod.buildPostForm(authUrl).then(form => form.submit());
}
});
LoginMethod.reopenClass({
buildPostForm(url) {
// Login always happens in an anonymous context, with no CSRF token
// So we need to fetch it before sending a POST request
return updateCsrfToken().then(() => {
const form = document.createElement("form");
form.setAttribute("style", "display:none;");
form.setAttribute("method", "post");
form.setAttribute("action", url);
const input = document.createElement("input");
input.setAttribute("name", "authenticity_token");
input.setAttribute("value", Session.currentProp("csrfToken"));
form.appendChild(input);
document.body.appendChild(form);
return form;
});
}
});
let methods;
export function findAll() {
if (methods) return methods;
methods = [];
Discourse.Site.currentProp("auth_providers").forEach(provider =>
methods.pushObject(LoginMethod.create(provider))
);
// exclude FA icon for Google, uses custom SVG
methods.forEach(m => m.set("isGoogle", m.name === "google_oauth2"));
return methods;
}
export default LoginMethod;