hangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegram
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
344 lines
10 KiB
344 lines
10 KiB
Ext.define("Rambox.ux.Auth0", { |
|
singleton: true, |
|
|
|
// private |
|
lock: null, |
|
auth0: null, |
|
authService: null, |
|
backupCurrent: false, |
|
|
|
init: function () { |
|
var me = this; |
|
|
|
var Auth0 = require("auth0-js"); |
|
var _AuthService = require("./resources/js/AuthService"); |
|
|
|
me.authService = new _AuthService.default({ |
|
clientId: auth0Cfg.clientID, |
|
authorizeEndpoint: "https://" + auth0Cfg.domain + "/authorize", |
|
audience: "https://" + auth0Cfg.domain + "/userinfo", |
|
scope: "openid profile offline_access", |
|
redirectUri: "https://" + auth0Cfg.domain + "/mobile", |
|
tokenEndpoint: "https://" + auth0Cfg.domain + "/oauth/token", |
|
}); |
|
|
|
me.auth0 = new Auth0.WebAuth({ |
|
clientID: auth0Cfg.clientID, |
|
domain: auth0Cfg.domain, |
|
}); |
|
|
|
//me.defineEvents(); |
|
}, |
|
|
|
onLogin: function (token, authWindow) { |
|
var me = this; |
|
|
|
authWindow.close(); |
|
|
|
me.auth0.client.userInfo(token.access_token, function (err, profile) { |
|
if (err) { |
|
if (err.error === 401 || err.error === "Unauthorized") |
|
return me.renewToken(me.checkConfiguration); |
|
Ext.Msg.hide(); |
|
return Ext.Msg.show({ |
|
title: "Error", |
|
message: |
|
"There was an error getting the profile: " + err.error_description, |
|
icon: Ext.Msg.ERROR, |
|
buttons: Ext.Msg.OK, |
|
}); |
|
} |
|
|
|
profile.user_metadata = profile["https://rambox.pro/user_metadata"]; |
|
delete profile["https://rambox.pro/user_metadata"]; |
|
|
|
// Display a spinner while waiting |
|
Ext.Msg.wait(locale["app.window[29]"], locale["app.window[28]"]); |
|
|
|
// Google Analytics Event |
|
ga_storage._trackEvent("Users", "loggedIn"); |
|
|
|
// Set cookies to help Tooltip.io messages segmentation |
|
Ext.util.Cookies.set("auth0", true); |
|
|
|
// User is logged in |
|
// Save the profile and JWT. |
|
localStorage.setItem("profile", JSON.stringify(profile)); |
|
localStorage.setItem("access_token", token.access_token); |
|
localStorage.setItem("id_token", token.id_token); |
|
localStorage.setItem("refresh_token", token.refresh_token); |
|
|
|
if ( |
|
!Ext.isEmpty(profile.user_metadata) && |
|
!Ext.isEmpty(profile.user_metadata.services) && |
|
!me.backupCurrent |
|
) { |
|
Ext.each(profile.user_metadata.services, function (s) { |
|
var service = Ext.create("Rambox.model.Service", s); |
|
service.save(); |
|
Ext.getStore("Services").add(service); |
|
}); |
|
|
|
require("electron").remote.app.relaunch(); |
|
require("electron").remote.app.exit(); |
|
} |
|
|
|
Ext.Msg.hide(); |
|
Ext.cq1("app-main").getViewModel().set("username", profile.name); |
|
Ext.cq1("app-main").getViewModel().set("avatar", profile.picture); |
|
}); |
|
}, |
|
|
|
backupConfiguration: function (callback) { |
|
var me = this; |
|
|
|
Ext.Msg.wait("Saving backup...", "Please wait..."); |
|
|
|
// Getting all services |
|
var lastupdate = new Date().toJSON(); |
|
var services = []; |
|
Ext.getStore("Services").each(function (service) { |
|
var s = Ext.clone(service); |
|
delete s.data.id; |
|
delete s.data.zoomLevel; |
|
services.push(s.data); |
|
}); |
|
|
|
Ext.Ajax.request({ |
|
url: |
|
"https://rambox.auth0.com/api/v2/users/" + |
|
Ext.decode(localStorage.getItem("profile")).sub, |
|
method: "PATCH", |
|
headers: { authorization: "Bearer " + localStorage.getItem("id_token") }, |
|
jsonData: { |
|
user_metadata: { services: services, services_lastupdate: lastupdate }, |
|
}, |
|
success: function (response) { |
|
Ext.Msg.hide(); |
|
// Save the last update in localStorage |
|
var profile = Ext.decode(localStorage.getItem("profile")); |
|
if (!profile.user_metadata) profile.user_metadata = {}; |
|
profile.user_metadata.services_lastupdate = lastupdate; |
|
localStorage.setItem("profile", Ext.encode(profile)); |
|
Ext.cq1("app-main") |
|
.getViewModel() |
|
.set("last_sync", new Date(lastupdate).toUTCString()); |
|
|
|
Ext.toast({ |
|
html: |
|
'<i class="fa fa-check fa-3x fa-pull-left" aria-hidden="true"></i> Your configuration were successfully backed up.', |
|
title: "Synchronize Configuration", |
|
width: 300, |
|
align: "t", |
|
closable: false, |
|
}); |
|
|
|
if (Ext.isFunction(callback)) callback.bind(me)(); |
|
}, |
|
failure: function (response) { |
|
if (response.status === 401) |
|
return me.renewToken(me.backupConfiguration); |
|
|
|
Ext.Msg.hide(); |
|
Ext.toast({ |
|
html: |
|
'<i class="fa fa-times fa-3x fa-pull-left" aria-hidden="true"></i> Error occurred when trying to backup your configuration.', |
|
title: "Synchronize Configuration", |
|
width: 300, |
|
align: "t", |
|
closable: false, |
|
}); |
|
|
|
if (Ext.isFunction(callback)) callback.bind(me)(); |
|
|
|
console.error(response); |
|
}, |
|
}); |
|
}, |
|
|
|
restoreConfiguration: function () { |
|
var me = this; |
|
|
|
me.auth0.client.userInfo( |
|
localStorage.getItem("access_token"), |
|
function (err, profile) { |
|
if (err) { |
|
if (err.code === 401) return me.renewToken(me.restoreConfiguration); |
|
return Ext.Msg.show({ |
|
title: "Error", |
|
message: |
|
"There was an error getting the profile: " + err.description, |
|
icon: Ext.Msg.ERROR, |
|
buttons: Ext.Msg.OK, |
|
}); |
|
} |
|
|
|
profile.user_metadata = profile["https://rambox.pro/user_metadata"]; |
|
delete profile["https://rambox.pro/user_metadata"]; |
|
|
|
// First we remove all current services |
|
Ext.cq1("app-main") |
|
.getController() |
|
.removeAllServices(false, function () { |
|
if (!profile.user_metadata || !profile.user_metadata.services) |
|
return; |
|
Ext.each(profile.user_metadata.services, function (s) { |
|
var service = Ext.create("Rambox.model.Service", s); |
|
service.save(); |
|
Ext.getStore("Services").add(service); |
|
}); |
|
|
|
require("electron").remote.getCurrentWindow().reload(); |
|
}); |
|
} |
|
); |
|
}, |
|
|
|
checkConfiguration: function () { |
|
var me = this; |
|
|
|
me.auth0.client.userInfo( |
|
localStorage.getItem("access_token"), |
|
function (err, profile) { |
|
if (err) { |
|
if (err.code === 401) return me.renewToken(me.checkConfiguration); |
|
return Ext.Msg.show({ |
|
title: "Error", |
|
message: |
|
"There was an error getting the profile: " + err.description, |
|
icon: Ext.Msg.ERROR, |
|
buttons: Ext.Msg.OK, |
|
}); |
|
} |
|
|
|
profile.user_metadata = profile["https://rambox.pro/user_metadata"]; |
|
delete profile["https://rambox.pro/user_metadata"]; |
|
|
|
if (!profile.user_metadata) { |
|
Ext.toast({ |
|
html: "You don't have any backup yet.", |
|
title: "Synchronize Configuration", |
|
width: 300, |
|
align: "t", |
|
closable: false, |
|
}); |
|
return; |
|
} |
|
|
|
if ( |
|
Math.floor( |
|
new Date(profile.user_metadata.services_lastupdate) / 1000 |
|
) > |
|
Math.floor( |
|
new Date( |
|
Ext.decode( |
|
localStorage.getItem("profile") |
|
).user_metadata.services_lastupdate |
|
) / 1000 |
|
) |
|
) { |
|
Ext.toast({ |
|
html: "Your settings are out of date.", |
|
title: "Synchronize Configuration", |
|
width: 300, |
|
align: "t", |
|
closable: false, |
|
}); |
|
} else { |
|
Ext.toast({ |
|
html: |
|
'<i class="fa fa-check fa-3x fa-pull-left" aria-hidden="true"></i> Latest backup is already applied.', |
|
title: "Synchronize Configuration", |
|
width: 300, |
|
align: "t", |
|
closable: false, |
|
}); |
|
} |
|
} |
|
); |
|
}, |
|
|
|
renewToken: function (callback) { |
|
var me = this; |
|
|
|
Ext.Ajax.request({ |
|
url: "https://rambox.auth0.com/oauth/token", |
|
method: "POST", |
|
jsonData: { |
|
grant_type: "refresh_token", |
|
client_id: auth0Cfg.clientID, |
|
client_secret: auth0Cfg.clientSecret, |
|
refresh_token: localStorage.getItem("refresh_token"), |
|
api_type: "app", |
|
}, |
|
success: function (response) { |
|
var json = Ext.decode(response.responseText); |
|
localStorage.setItem("access_token", json.access_token); |
|
localStorage.setItem("id_token", json.id_token); |
|
|
|
if (Ext.isFunction(callback)) callback.bind(me)(); |
|
}, |
|
failure: function (response) { |
|
console.error(response); |
|
}, |
|
}); |
|
}, |
|
|
|
login: function () { |
|
var me = this; |
|
|
|
var electron = require("electron").remote; |
|
var authWindow = new electron.BrowserWindow({ |
|
title: "Rambox - Login", |
|
width: 400, |
|
height: 600, |
|
maximizable: false, |
|
minimizable: false, |
|
resizable: true, |
|
closable: true, |
|
center: true, |
|
autoHideMenuBar: true, |
|
skipTaskbar: true, |
|
fullscreenable: false, |
|
parent: require("electron").remote.getCurrentWindow(), |
|
webPreferences: { |
|
partition: "persist:rambox", |
|
}, |
|
}); |
|
|
|
authWindow.on("closed", function () { |
|
authWindow = null; |
|
}); |
|
|
|
authWindow.loadURL(me.authService.requestAuthCode()); |
|
|
|
authWindow.webContents.on("did-start-loading", function (e) { |
|
authWindow.webContents.session.webRequest.onBeforeSendHeaders( |
|
(details, callback) => { |
|
Rambox.app.config.googleURLs.forEach((loginURL) => { |
|
if (details.url.indexOf(loginURL) > -1) |
|
details.requestHeaders["User-Agent"] = |
|
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0"; |
|
}); |
|
callback({ cancel: false, requestHeaders: details.requestHeaders }); |
|
} |
|
); |
|
}); |
|
|
|
authWindow.webContents.on("did-navigate", function (e, url) { |
|
me.authService.requestAccessCode(url, me.onLogin.bind(me), authWindow); |
|
}); |
|
}, |
|
|
|
logout: function () { |
|
var me = this; |
|
|
|
localStorage.removeItem("profile"); |
|
localStorage.removeItem("id_token"); |
|
localStorage.removeItem("refresh_token"); |
|
localStorage.removeItem("access_token"); |
|
|
|
// Set cookies to help Tooltip.io messages segmentation |
|
Ext.util.Cookies.set("auth0", false); |
|
}, |
|
});
|
|
|