From cac1afbd31e70411f8d67dbb48c6e5f4fb64c28a Mon Sep 17 00:00:00 2001 From: Quentin Legot Date: Tue, 10 Aug 2021 20:35:13 +0200 Subject: [PATCH] add support to microsoft auth (untested cause I haven't minecraft on a microsoft account) --- package-lock.json | 94 ++++----------------------------- package.json | 4 +- src/client/assets/css/login.css | 7 ++- src/client/assets/js/login.js | 37 ++++++++----- src/client/login.html | 1 + src/server/main.js | 69 +++++++++++++----------- src/server/minecraft.js | 42 ++++++++++++++- 7 files changed, 121 insertions(+), 133 deletions(-) diff --git a/package-lock.json b/package-lock.json index b44ab44..25d9340 100644 --- a/package-lock.json +++ b/package-lock.json @@ -501,83 +501,6 @@ } } }, - "@electron-forge/maker-zip": { - "version": "6.0.0-beta.59", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.0.0-beta.59.tgz", - "integrity": "sha512-JDRfhuCPIT0k2S2mMKMj4BfcIAvDlMvBHwf2ERp2FbroCdlKnL5taYHNLNlGBldVjNqNuees1S3cQnLh+4rLag==", - "dev": true, - "requires": { - "@electron-forge/maker-base": "6.0.0-beta.59", - "@electron-forge/shared-types": "6.0.0-beta.59", - "cross-zip": "^4.0.0", - "fs-extra": "^10.0.0" - }, - "dependencies": { - "@electron-forge/async-ora": { - "version": "6.0.0-beta.59", - "resolved": "https://registry.npmjs.org/@electron-forge/async-ora/-/async-ora-6.0.0-beta.59.tgz", - "integrity": "sha512-vF60XyjHCyoyXHgkDi/tZy+OB9K6oSBio2at7B4pwZLO6nqstofkeAB+Gz/XUsVj9Nim+vHKtyXPzE0BTXQkZQ==", - "dev": true, - "requires": { - "colors": "^1.4.0", - "debug": "^4.3.1", - "log-symbols": "^4.0.0", - "ora": "^5.0.0", - "pretty-ms": "^7.0.0" - } - }, - "@electron-forge/maker-base": { - "version": "6.0.0-beta.59", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.0.0-beta.59.tgz", - "integrity": "sha512-S/Qdu2kwio5PdZgoDDxZPo6JSf2YwcuXi3sy9Tw2Qj58+ZT9nOHn0C+JBHI8sREv3IRK52Axu1/RYkwtX9+V8w==", - "dev": true, - "requires": { - "@electron-forge/shared-types": "6.0.0-beta.59", - "fs-extra": "^10.0.0", - "which": "^2.0.2" - } - }, - "@electron-forge/shared-types": { - "version": "6.0.0-beta.59", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.0.0-beta.59.tgz", - "integrity": "sha512-3tRCgfHqn5/8LijlVZsLb2xHm9W3qgzQ+KZNWXdYhb0Wj1+h6/sXn8rlxw10Mmb2mlYJEBW/NvIhpUDHgrGPXA==", - "dev": true, - "requires": { - "@electron-forge/async-ora": "6.0.0-beta.59", - "electron-packager": "^15.0.0", - "electron-rebuild": "^2.3.2", - "ora": "^5.0.0" - } - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, "@electron-forge/plugin-base": { "version": "6.0.0-beta.59", "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.0.0-beta.59.tgz", @@ -1602,12 +1525,6 @@ "which": "^2.0.1" } }, - "cross-zip": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.0.tgz", - "integrity": "sha512-MEzGfZo0rqE10O/B+AEcCSJLZsrWuRUvmqJTqHNqBtALhaJc3E3ixLGLJNTRzEA2K34wbmOHC4fwYs9sVsdcCA==", - "dev": true - }, "cuint": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", @@ -3542,6 +3459,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "msmc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/msmc/-/msmc-2.1.3.tgz", + "integrity": "sha512-g2X/VbdarLfT76reSKGgBKmnllliZnEx2KSxBTt53Y/BWek3WD6e1WfsYb3AOpNV34O9FEO2kbgelUb9FLmviQ==", + "requires": { + "node-fetch": "^2.6.1" + } + }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -3602,8 +3527,7 @@ "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-gyp": { "version": "7.1.2", diff --git a/package.json b/package.json index 04d12c4..6974a30 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "devDependencies": { "@electron-forge/cli": "^6.0.0-beta.59", "@electron-forge/maker-squirrel": "^6.0.0-beta.59", - "@electron-forge/maker-zip": "^6.0.0-beta.59", "electron": "^13.1.9" }, "dependencies": { @@ -36,7 +35,8 @@ "electron-squirrel-startup": "^1.0.0", "extract-zip": "^2.0.1", "hasha": "^5.2.2", - "minecraft-launcher-core": "^3.16.6" + "minecraft-launcher-core": "^3.16.6", + "msmc": "^2.1.3" }, "config": { "forge": "./config.forge.js" diff --git a/src/client/assets/css/login.css b/src/client/assets/css/login.css index 0530425..b2b38af 100644 --- a/src/client/assets/css/login.css +++ b/src/client/assets/css/login.css @@ -20,7 +20,7 @@ body{ height:100%; } -#login { +#content > * { position:relative; width: 300px; top:50%; @@ -30,6 +30,11 @@ body{ padding: 8px; } +#microsoft-button { + border-width: 0; + cursor: pointer; +} + #login input[type="text"], #login input[type="password"]{ width:100%; diff --git a/src/client/assets/js/login.js b/src/client/assets/js/login.js index e62d4bc..a5f1f87 100644 --- a/src/client/assets/js/login.js +++ b/src/client/assets/js/login.js @@ -1,25 +1,36 @@ const form = document.querySelector('#login-form') const user = document.querySelector('#nickname') const password = document.querySelector('#password') - +const microsoftButton = document.querySelector("#microsoft-button") form.addEventListener("submit", (e) => { e.preventDefault() - form.disabled = true - if(user.value) { - ipcRenderer.send("login", { - user: user.value, - pass: password.value - }) - }else{ - ipcRenderer.send("notification", { - title: "error", - body: "Veuillez entrer des identifiants" - }) + if(!microsoftButton.disabled) { + form.disabled = true + if(user.value) { + ipcRenderer.send("login", { + user: user.value, + pass: password.value + }) + }else{ + ipcRenderer.send("notification", { + title: "error", + body: "Veuillez entrer des identifiants" + }) + } + } +}) + +microsoftButton.addEventListener("click", (e) => { + e.preventDefault() + if(!form.disabled) { + microsoftButton.disabled = true + form.disabled = true + ipcRenderer.send("microsoft-login") } - }) ipcRenderer.on("loginError", event => { form.disabled = false + microsoftButton.disabled = false }) \ No newline at end of file diff --git a/src/client/login.html b/src/client/login.html index 68f44db..902bd22 100644 --- a/src/client/login.html +++ b/src/client/login.html @@ -30,6 +30,7 @@ + diff --git a/src/server/main.js b/src/server/main.js index 24749f5..02cd20d 100644 --- a/src/server/main.js +++ b/src/server/main.js @@ -2,9 +2,9 @@ const { app, BrowserWindow, Menu, ipcMain, Notification, autoUpdater, dialog } = const logger = require('electron-log') const { join } = require('path') if (require('electron-squirrel-startup')) { - require("./install.js").handleSquirrelEvent(app) - app.quit() - return; + require("./install.js").handleSquirrelEvent(app) + app.quit() + return } require('./updater.js').configUpdater(app, autoUpdater, dialog, logger) @@ -14,22 +14,25 @@ const iconPath = join(__dirname, "icon.ico") let win = null function createWindow () { - win = new BrowserWindow({ - width: 1000, - minWidth: 1000, - maxWidth: 1000, - height: 600, - minHeight: 600, - maxHeight: 600, - icon: iconPath, - webPreferences: { - nodeIntegration: true, - contextIsolation: false - }, - frame: false, - }) - // Menu.setApplicationMenu(null) - win.loadFile('src/client/login.html') + win = new BrowserWindow({ + width: 1000, + minWidth: 1000, + maxWidth: 1000, + height: 600, + minHeight: 600, + maxHeight: 600, + icon: iconPath, + webPreferences: { + nodeIntegration: true, + contextIsolation: false + }, + frame: false, + }) + // Menu.setApplicationMenu(null) + win.loadFile('src/client/login.html') + win.on("close", () => { + app.quit() + }) } const { setWindow, minimizeWindow, closeWindow } = require("./menubar.js"); @@ -37,33 +40,37 @@ const { setWindow, minimizeWindow, closeWindow } = require("./menubar.js"); setWindow(win) app.whenReady().then(() => { - createWindow() + createWindow() }) app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() - } + if (process.platform !== 'darwin') { + app.quit() + } }) ipcMain.on('minimizeWindow', () => { - minimizeWindow(win) + minimizeWindow(win) }) ipcMain.on('closeWindow', () => { - closeWindow(win) + closeWindow(win) }) app.on('activate', () => { - if (win === null){ - createWindow() - } + if (win === null){ + createWindow() + } }) ipcMain.on("login", (event, args) => { minecraft.login(event, win, showNotification, args.user, args.pass) }) +ipcMain.on("microsoft-login", (event, args) => { + minecraft.microsoftLogin(event, win, showNotification) +}) + ipcMain.on("invalidateData", event => { minecraft.invalidateData(event) }) @@ -73,15 +80,15 @@ ipcMain.on("launch", (event, args) => { }) function showNotification(title, body="") { - new Notification({ title: title, body: body }).show() + new Notification({ title: title, body: body }).show() } ipcMain.on("notification", (event, args) => { - showNotification(args.title, args.body) + showNotification(args.title, args.body) }) ipcMain.on("disconnect", (e) => { - win.loadFile('src/client/login.html') + win.loadFile('src/client/login.html') }) diff --git a/src/server/minecraft.js b/src/server/minecraft.js index dbe2559..051d7ec 100644 --- a/src/server/minecraft.js +++ b/src/server/minecraft.js @@ -3,10 +3,11 @@ const { Client, Authenticator } = require('minecraft-launcher-core') const axios = require('axios').default const hasha = require('hasha'); const fs = require('fs') -const { join, resolve } = require('path') +const { join } = require('path') const constants = require("constants") const zip = require('extract-zip') const logger = require('electron-log') +const msmc = require('msmc') class Minecraft { @@ -16,6 +17,9 @@ class Minecraft { auth = null modsList = undefined + /** + * Used to login through Mojang account + */ login(event, win, showNotification, username, password) { this.auth = null if(isDev || password.trim() !== "") { @@ -34,6 +38,42 @@ class Minecraft { } } + /** + * Used to login through a Microsoft account + */ + microsoftLogin(event, win, showNotification) { + msmc.getElectron().FastLaunch( + (callback) => { + this.auth = msmc.getMCLC().getAuth(callback) + this.auth.then(v => { + win.loadFile('src/client/index.html').then(() => { + event.sender.send("nick", { name: v.name }) + }) + }).catch((err) => { + event.sender.send("loginError") + logger.error(err) + showNotification("Erreur de connexion") + }) + }, + (update) => { + switch (update.type) { + case "Rejection": + event.sender.send("loginError") + showNotification("Connexion rejetée") + logger.error("Fetch rejected!", update.data); + break; + case "Error": + event.sender.send("loginError") + showNotification("Une erreur est survenue", update.data) + logger.error("MC-Account error:", update.data); + break; + case "Cancelled": + logger.warn("Connexion annulée"); + event.sender.send("loginError") + } + }, "login") + } + launch(event, showNotification, args) { this.extractJava(Number(args.chapter), event).then((javaPath) => { this.extractMods(Number(args.chapter), event).then((chapter) => {