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