169 lines
5.9 KiB
JavaScript
169 lines
5.9 KiB
JavaScript
const express = require("express")
|
|
const router = express.Router()
|
|
const { requireAuth } = require('./../middleware/authmiddleware')
|
|
const clientid = "1008206768989544449"
|
|
const secret = "M2ixbjumSA6o1Qgt7KvCNcPb_giJHyp3"
|
|
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
|
|
const User = require('./../model/user.js')
|
|
const speakeasy = require('speakeasy')
|
|
const qrcode = require('qrcode')
|
|
const bodyParser = require('body-parser')
|
|
const xss = require('xss')
|
|
router.use(bodyParser.json())
|
|
|
|
router.get('/authenticate',requireAuth,async function(req,rep){
|
|
const code = req.query.code
|
|
//console.log(code)
|
|
if (code){
|
|
const response = await fetch("https://discord.com/api/oauth2/token",{
|
|
body: new URLSearchParams({
|
|
client_id: clientid,
|
|
client_secret: secret,
|
|
code,
|
|
grant_type: 'authorization_code',
|
|
redirect_uri: `http://mete0r.xyz/settings/authenticate`,
|
|
scope: 'identify',
|
|
}),
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
}
|
|
})
|
|
|
|
const son = await response.json()
|
|
//console.log(son)
|
|
//console.log(son["access_token"])
|
|
|
|
const resp2 = await fetch("https://discord.com/api/users/@me",{
|
|
headers: {
|
|
"authorization": `${son["token_type"]} ${son["access_token"]}`
|
|
}
|
|
})
|
|
|
|
const final = await resp2.json()
|
|
|
|
const dcid = final.id
|
|
//console.log(dcid)
|
|
const user = await User.findOne({discordid: dcid})/*.lean()*/
|
|
if (user) {
|
|
return rep.redirect("/settings?error=alreadyused")
|
|
}
|
|
const milliseconds = BigInt(dcid) >> 22n
|
|
if (new Date(Number(milliseconds) + 1420070400000)> Date.now() - (1000 * 60 * 60 * 24 * 7 * 4) === true){ // 1 month
|
|
return rep.redirect("/settings?error=toonew")
|
|
}
|
|
req.userdocument.discordid = dcid.toString()
|
|
req.userdocument.markModified('discordid')
|
|
await req.userdocument.save()
|
|
|
|
rep.redirect('/settings')
|
|
|
|
}
|
|
})
|
|
|
|
|
|
/*router.get("/unlink", requireAuth,async (req, res) => {
|
|
req.userdocument.discordid = undefined
|
|
req.userdocument.markModified('discordid')
|
|
await req.userdocument.save()
|
|
res.redirect('/settings')
|
|
})*/
|
|
|
|
router.get("/2fa", requireAuth,async (req, res) => {
|
|
if (req.userdocument.twofasecrets){
|
|
const json = JSON.parse(req.userdocument.twofasecrets)
|
|
if (json.verified === true){
|
|
return res.json({status: "success", message: "2FA already set sorry."})
|
|
}else{
|
|
// basically if they haven't verified that they know the secret before we will just remove it for them
|
|
req.userdocument.twofasecrets = undefined
|
|
req.userdocument.markModified('twofasecrets')
|
|
req.userdocument.save()
|
|
}
|
|
}
|
|
const secret = speakeasy.generateSecret({
|
|
name: "Meteorite"
|
|
})
|
|
qrcode.toDataURL(secret.otpauth_url, function(err, data) {
|
|
|
|
req.userdocument.twofasecrets = JSON.stringify({secret: secret.ascii, verified: false})
|
|
req.userdocument.markModified('twofasecrets')
|
|
req.userdocument.save()
|
|
return res.json({status: "success", message: "2FA set please verify to complete.", qrcode: data})
|
|
});
|
|
|
|
})
|
|
|
|
|
|
router.post("/verify2fa", requireAuth,async (req, res) => {
|
|
const {code} = req.body
|
|
if (req.userdocument.twofasecrets){
|
|
const json = JSON.parse(req.userdocument.twofasecrets)
|
|
if (json.verified === true){
|
|
return res.json({status: "success", message: "2FA already set sorry."})
|
|
}else{
|
|
|
|
const valid = speakeasy.totp.verify({
|
|
secret: json.secret,
|
|
encoding: 'ascii',
|
|
token: code
|
|
})
|
|
if (valid === false){
|
|
return res.json({status: 'error', error: 'Invalid 2FA Code'})
|
|
}else{
|
|
json.verified = true
|
|
req.userdocument.twofasecrets = JSON.stringify(json)
|
|
req.userdocument.markModified('twofasecrets')
|
|
req.userdocument.save()
|
|
return res.json({status: "success", message:"2FA verified."})
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
})
|
|
|
|
router.post("/setbio", requireAuth,async (req, res) => {
|
|
const { bio } = req.body
|
|
if (typeof bio !== 'string'){
|
|
return res.json({status: 'error', error: 'Bio not sent'})
|
|
}
|
|
if (bio.length>100){
|
|
return res.json({status: 'error', error: 'Length over 100.'})
|
|
}
|
|
req.userdocument.bio = xss(bio)
|
|
req.userdocument.markModified('bio')
|
|
req.userdocument.save()
|
|
return res.json({status: "success", message:"Done."})
|
|
})
|
|
|
|
router.post("/changecss", requireAuth,async (req, res) => {
|
|
const { customcss } = req.body
|
|
if (typeof customcss !== 'string'){
|
|
return res.json({status: 'error', error: 'Bio not sent'})
|
|
}
|
|
if (customcss.length>5000){
|
|
return res.json({status: 'error', error: 'Length over 5000.'})
|
|
}
|
|
req.userdocument.css = xss(customcss)
|
|
req.userdocument.markModified('css')
|
|
req.userdocument.save()
|
|
return res.json({status: "success", message:"Done."})
|
|
})
|
|
|
|
router.post("/aboutme", requireAuth,async (req, res) => {
|
|
const { about } = req.body
|
|
if (typeof about !== 'string'){
|
|
return res.json({status: 'error', error: 'Bio not sent'})
|
|
}
|
|
if (about.length>200){
|
|
return res.json({status: 'error', error: 'Length over 200.'})
|
|
}
|
|
req.userdocument.aboutme = xss(about)
|
|
req.userdocument.markModified('aboutme')
|
|
req.userdocument.save()
|
|
return res.json({status: "success", message:"Done."})
|
|
})
|
|
|
|
|
|
module.exports = router |