Version 0.2.0 - Ajout du serveur Web et de l'Autheification Discord
This commit is contained in:
@ -6,7 +6,6 @@ const { __glob } = require("./global-variables")
|
||||
const { LogType } = require("../modules/sub-log")
|
||||
const { List } = require("./sub-list")
|
||||
const nodeFinder = require("./nodes-finder")
|
||||
const { platform } = require("node:os")
|
||||
|
||||
const client = new Client({
|
||||
intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers],
|
||||
|
@ -4,8 +4,9 @@ const root = path.resolve(__dirname, '../../')
|
||||
|
||||
const __glob = {
|
||||
CONFIG: root + path.sep + "data" + path.sep + "config.json",
|
||||
USERS: root + path.sep + "data" + path.sep + "users.json",
|
||||
ROOT: root,
|
||||
WEB: root + path.sep + "src" + path.sep + "web",
|
||||
WEB_DIR: root + path.sep + "src" + path.sep + "web",
|
||||
COMMANDS: root + path.sep + "src" + path.sep + "commands",
|
||||
SUBLOG: root + path.sep + "src" + path.sep + "modules" + path.sep + "sub-log.js",
|
||||
SUBPLAYER: root + path.sep + "src" + path.sep + "modules" + path.sep + "sub-player.js",
|
||||
@ -15,5 +16,13 @@ const __glob = {
|
||||
NODES: root + path.sep + "data" + path.sep + "nodes.json",
|
||||
};
|
||||
|
||||
module.exports = { __glob };
|
||||
const webroot = __glob.WEB_DIR + path.sep
|
||||
const __web = {
|
||||
|
||||
ROUTER: webroot + "routes" + path.sep,
|
||||
PUBLIC: webroot + "public",
|
||||
TEMPLATES: webroot + "templates"
|
||||
}
|
||||
|
||||
module.exports = { __glob, __web };
|
||||
|
||||
|
181
src/modules/sub-auth.js
Normal file
181
src/modules/sub-auth.js
Normal file
@ -0,0 +1,181 @@
|
||||
const { resolve } = require("path");
|
||||
const { __glob } = require("../modules/global-variables");
|
||||
const { LogType } = require('./sub-log');
|
||||
const fs = require("fs")
|
||||
|
||||
const alog = new LogType("Authentification")
|
||||
|
||||
var users = new Map()
|
||||
var sessions = new Array()
|
||||
|
||||
updateUsers()
|
||||
|
||||
module.exports.checkUser = function (token) {
|
||||
|
||||
if(users.has(token)) {
|
||||
|
||||
return true
|
||||
} else {
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports.getSession = function (session) {
|
||||
|
||||
|
||||
if(sessions.includes(session)) {
|
||||
|
||||
return true
|
||||
|
||||
} else {
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports.getDiscordUser = function (code, session) {
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
alog.log("Récupération de l'autorisation de récupération des informations de l'utilisateur associé à la session : " + session + "[ETAPE 2]")
|
||||
|
||||
|
||||
var link = "https://subsonics.raphix.fr"
|
||||
|
||||
if(process.env.DEV == "true") {
|
||||
link = "http://localhost:3001"
|
||||
}
|
||||
|
||||
const params = new URLSearchParams();
|
||||
params.append('client_id', "1094727789682380922");
|
||||
params.append('client_secret', "uwtyPOPKCgw6ciBs20qiJ7LJrW9Ziclo");
|
||||
params.append('grant_type', 'authorization_code');
|
||||
params.append('code', code);
|
||||
params.append('redirect_uri', link + "/internal/redirect");
|
||||
params.append('scope', 'identify guilds');
|
||||
|
||||
fetch('https://discord.com/api/oauth2/token', {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}, body : params
|
||||
}).then(resp1 => resp1.json()).then(authorizationKey => {
|
||||
|
||||
alog.log("Récupération des informations de l'utilisateur associé à l'autorisation : '" + authorizationKey.access_token + "' et associé à la session : " + session + "[ETAPE 3]")
|
||||
|
||||
fetch('https://discord.com/api/users/@me/guilds/137291455336022018/member', {
|
||||
headers: {
|
||||
authorization: `${authorizationKey.token_type} ${authorizationKey.access_token}`,
|
||||
},
|
||||
}).then(resp2 => resp2.json()).then(userInfo => {
|
||||
|
||||
var user = {}
|
||||
|
||||
user.auth = authorizationKey
|
||||
Object.assign(user, userInfo)
|
||||
|
||||
|
||||
resolve(user)
|
||||
|
||||
|
||||
}).catch(error => reject(error))
|
||||
|
||||
|
||||
}).catch(error => reject(error))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
module.exports.saveSession = function (session) {
|
||||
|
||||
sessions.push(session)
|
||||
alog.log("Nouvelle session enregistré : " + session)
|
||||
|
||||
}
|
||||
|
||||
module.exports.removeSession = function (session) {
|
||||
|
||||
const index = sessions.indexOf(session)
|
||||
sessions.splice(index, 1)
|
||||
alog.log("Supression de la session : " + session)
|
||||
|
||||
}
|
||||
|
||||
|
||||
module.exports.getUser = function (token) {
|
||||
return users.get(token)
|
||||
}
|
||||
|
||||
|
||||
module.exports.addUser = function (user) {
|
||||
|
||||
if(!fs.existsSync(__glob.USERS)){
|
||||
|
||||
fs.writeFileSync(__glob.USERS, '[]')
|
||||
}
|
||||
|
||||
|
||||
|
||||
const userDB = JSON.parse(fs.readFileSync(__glob.USERS))
|
||||
userDB.push(user)
|
||||
fs.writeFileSync(__glob.USERS, JSON.stringify(userDB, null, 2))
|
||||
|
||||
updateUsers()
|
||||
alog.log("Ajout de " + user.user.username + " en tant qu'utilisateur avec le token : " + user.token)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
module.exports.removeUser = function (token) {
|
||||
|
||||
if(!fs.existsSync(__glob.USERS)){
|
||||
|
||||
fs.writeFileSync(__glob.USERS, '[]')
|
||||
}
|
||||
|
||||
|
||||
|
||||
const userDB = JSON.parse(fs.readFileSync(__glob.USERS))
|
||||
var selectedUser = null
|
||||
for (const user of userDB) {
|
||||
if(user.token == token) {
|
||||
|
||||
selectedUser = user
|
||||
}
|
||||
}
|
||||
const index = userDB.indexOf(selectedUser)
|
||||
alog.log("Supression de " + selectedUser.user.username + " en tant qu'utilisateur avec le token : " + selectedUser.token)
|
||||
|
||||
userDB.splice(index, 1)
|
||||
fs.writeFileSync(__glob.USERS, JSON.stringify(userDB, null, 2))
|
||||
|
||||
updateUsers()
|
||||
|
||||
}
|
||||
|
||||
function updateUsers() {
|
||||
|
||||
|
||||
if(!fs.existsSync(__glob.USERS)){
|
||||
|
||||
fs.writeFileSync(__glob.USERS, '[]')
|
||||
}
|
||||
|
||||
const userDB = JSON.parse(fs.readFileSync(__glob.USERS))
|
||||
|
||||
for (const user of userDB) {
|
||||
|
||||
users.set(user.token, user)
|
||||
}
|
||||
|
||||
alog.log("Actualisation de " + userDB.length + " utilisateurs depuis : " + __glob.USERS)
|
||||
}
|
196
src/modules/sub-web.js
Normal file
196
src/modules/sub-web.js
Normal file
@ -0,0 +1,196 @@
|
||||
const internal = require("stream");
|
||||
const { __glob, __web } = require("../modules/global-variables");
|
||||
const { LogType } = require("./sub-log");
|
||||
const log = require("./sub-log");
|
||||
const auth = require("./sub-auth");
|
||||
const cookieParser = require("cookie-parser");
|
||||
const wlog = new LogType("Web")
|
||||
|
||||
module.exports.WebServer = class {
|
||||
|
||||
constructor() {
|
||||
|
||||
wlog.step.init("start_server", "Démarrage du serveur Express (Web)")
|
||||
init()
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function init() {
|
||||
const createError = require('http-errors');
|
||||
const express = require('express');
|
||||
const path = require('path');
|
||||
const cookieParser = require('cookie-parser');
|
||||
const http = require("http");
|
||||
|
||||
const app = express();
|
||||
|
||||
const port = normalizePort(process.env.PORT || '3001');
|
||||
|
||||
|
||||
const server = require('http').createServer(app);
|
||||
const io = require('socket.io')(server)
|
||||
|
||||
const indexRouter = require(__web.ROUTER + "index.js");
|
||||
const loginRouter = require(__web.ROUTER + "login.js");
|
||||
const internalRouter = require(__web.ROUTER + "internal.js")
|
||||
|
||||
IOConnection(io)
|
||||
|
||||
|
||||
app.set('views', __web.TEMPLATES); // general config
|
||||
app.set('view engine', 'ejs');
|
||||
app.use(express.json());
|
||||
app.use(express.urlencoded({ extended: false }));
|
||||
app.use(cookieParser());
|
||||
app.use(express.static(__web.PUBLIC));
|
||||
app.set('port', port);
|
||||
app.use('/', indexRouter);
|
||||
app.use('/login', loginRouter);
|
||||
app.use("/internal", internalRouter)
|
||||
|
||||
|
||||
app.use(function (req, res, next) {
|
||||
next(createError(404));
|
||||
});
|
||||
|
||||
app.use(function (err, req, res, next) {
|
||||
|
||||
// Set locals, only providing error
|
||||
// in development
|
||||
res.locals.message = err.message;
|
||||
res.locals.error = req.app.get('env')
|
||||
=== 'development' ? err : {};
|
||||
|
||||
// render the error page
|
||||
res.status(err.status || 500);
|
||||
res.render('error');
|
||||
});
|
||||
|
||||
server.listen(port);
|
||||
server.on('error', onError);
|
||||
server.on('listening', () => {
|
||||
|
||||
let addr = server.address();
|
||||
let bind = typeof addr === 'string'
|
||||
? 'pipe ' + addr
|
||||
: 'port ' + addr.port;
|
||||
wlog.log("Serveur démarré sur le port : " + bind )
|
||||
});
|
||||
|
||||
wlog.step.end("start_server")
|
||||
|
||||
}
|
||||
|
||||
// EXPRESS FUNCTIONS
|
||||
|
||||
function normalizePort(val) {
|
||||
let port = parseInt(val, 10);
|
||||
|
||||
if (isNaN(port)) {
|
||||
|
||||
// Named pipe
|
||||
return val;
|
||||
}
|
||||
|
||||
if (port >= 0) {
|
||||
|
||||
// Port number
|
||||
return port;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Event listener for HTTP server "error" event
|
||||
function onError(error) {
|
||||
if (error.syscall !== 'listen') {
|
||||
throw error;
|
||||
}
|
||||
|
||||
let bind = typeof port === 'string'
|
||||
? 'Pipe ' + port
|
||||
: 'Port ' + port;
|
||||
|
||||
// Handle specific listen errors with
|
||||
// friendly messages
|
||||
switch (error.code) {
|
||||
case 'EACCES':
|
||||
console.error(bind
|
||||
+ ' requires elevated privileges');
|
||||
process.exit(1);
|
||||
break;
|
||||
case 'EADDRINUSE':
|
||||
console.error(bind + ' is already in use');
|
||||
process.exit(1);
|
||||
break;
|
||||
default:
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function IOConnection(io) {
|
||||
|
||||
const alog = log.getInstance("Authentification")
|
||||
|
||||
io.on("connection", (socket) => {
|
||||
|
||||
wlog.log("[SOCKET] - Nouvelle session : " + socket.id)
|
||||
|
||||
socket.on("disconnect", () => {
|
||||
|
||||
wlog.log("[SOCKET] - Fin de session : " + socket.id)
|
||||
})
|
||||
|
||||
socket.on("GET/DISCORD_LOGIN_LINK", () => {
|
||||
|
||||
|
||||
var discordlink = null
|
||||
|
||||
if(process.env.DEV == "true") {
|
||||
|
||||
alog.log("Mode Developpeur Actif : Redirige vers LOCALHOST")
|
||||
discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=http%3A%2F%2Flocalhost%3A3001%2Finternal%2Fredirect&response_type=code&scope=identify%20guilds%20guilds.members.read" //DEV
|
||||
} else {
|
||||
discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=https%3A%2F%2Fsubsonics.raphix.fr%2Finternal%2Fredirect&response_type=code&scope=identify%20guilds%20guilds.members.read" //OFFICIEL
|
||||
}
|
||||
|
||||
alog.log("Redirection de '" + socket.id + "' vers le service d'Authentification de Discord [ETAPE 1]")
|
||||
io.emit("ANSWER/GET/DISCORD_LOGIN_LINK", discordlink )
|
||||
})
|
||||
|
||||
|
||||
socket.on("GET/USER_INFO", () => {
|
||||
|
||||
|
||||
var token = socket.handshake.headers.cookie
|
||||
|
||||
if(token) {
|
||||
|
||||
token = socket.handshake.headers.cookie.replace("token=", "")
|
||||
|
||||
if(auth.checkUser(token)) {
|
||||
|
||||
const user = auth.getUser(token)
|
||||
alog.log("Envoi des informations Discord de '" + user.user.username + "' à '" + socket.id + "'" )
|
||||
socket.emit("ANSWER/GET/USER_INFO",user)
|
||||
|
||||
} else {
|
||||
|
||||
io.emit("ANSWER/GET/USER_INFO", {"error":"USER_DONT_EXIST"})
|
||||
}
|
||||
} else {
|
||||
io.emit("ANSWER/GET/USER_INFO", {"error":"TOKEN_NOT_FINDED"})
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
|
||||
}
|
Reference in New Issue
Block a user