Skip to content
This repository has been archived by the owner on Oct 3, 2021. It is now read-only.

Commit

Permalink
improve error responses, format code using Prettier
Browse files Browse the repository at this point in the history
  • Loading branch information
jellz committed May 7, 2019
1 parent e0f133a commit f3e1e8a
Show file tree
Hide file tree
Showing 10 changed files with 352 additions and 137 deletions.
4 changes: 2 additions & 2 deletions server/client.js
@@ -1,7 +1,7 @@
var { Client } = require('discord.js');
var client = module.exports = new Client({ disableEveryone: true });
var client = (module.exports = new Client({ disableEveryone: true }));

client.once('ready', () => {
console.log(`[discord] logged in as ${client.user.tag}`);
client.user.setActivity('with boats');
});
});
29 changes: 21 additions & 8 deletions server/index.js
Expand Up @@ -6,8 +6,14 @@ var logger = require('morgan');
var app = express();

// constants
const r = module.exports.r = require('rethinkdbdash')({ db: 'discordboatsclub_v4', port: process.env.RETHINKDB_PORT || 28015, host: process.env.RETHINKDB_HOST || 'localhost' });
const JWT_KEY = module.exports.JWT_KEY = fs.readFileSync('keys/jwt.key').toString();
const r = (module.exports.r = require('rethinkdbdash')({
db: 'discordboatsclub_v4',
port: process.env.RETHINKDB_PORT || 28015,
host: process.env.RETHINKDB_HOST || 'localhost'
}));
const JWT_KEY = (module.exports.JWT_KEY = fs
.readFileSync('keys/jwt.key')
.toString());
const PORT = process.env.PORT || 3001;

var client = require('./client');
Expand All @@ -19,12 +25,18 @@ app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(logger('dev'));

app.use(require('express-jwt')({ secret: JWT_KEY, credentialsRequired: false }), async (req, res, next) => {
if (!req.user) return next();
let user = await r.table('users').get(req.user).run(); //req.user is the user id
req.user = user; //now req.user is the user object
next();
});
app.use(
require('express-jwt')({ secret: JWT_KEY, credentialsRequired: false }),
async (req, res, next) => {
if (!req.user) return next();
let user = await r
.table('users')
.get(req.user)
.run(); //req.user is the user id
req.user = user; //now req.user is the user object
next();
}
);

// TODO: improve error responses, use 204 when supposed to
// TODO: revamp permission system
Expand All @@ -44,6 +56,7 @@ app.use(require('express-jwt')({ secret: JWT_KEY, credentialsRequired: false }),
// TODO: discord bot lookup features
// TODO: auto create rdb tables
// TODO: hash IP addresses
// TODO: make code readable
app.use('/api/auth', require('./routes/auth'));
app.use('/api/bots', require('./routes/bots'));
app.use('/api/users', require('./routes/users'));
Expand Down
2 changes: 1 addition & 1 deletion server/ratelimits.js
Expand Up @@ -7,4 +7,4 @@ exports.editBotLimiter = ratelimit({
keyGenerator: (req) => {
return req.cf_ip;
}
});
});
108 changes: 69 additions & 39 deletions server/routes/auth.js
Expand Up @@ -4,65 +4,95 @@ var fetch = require('node-fetch');
var btoa = require('btoa');
const { r, JWT_KEY } = require('../');

var router = module.exports = express.Router();
var router = (module.exports = express.Router());

router.get('/login', (req, res) => res.redirect(`https://discordapp.com/oauth2/authorize?client_id=${process.env.DISCORD_CLIENT_ID}&redirect_uri=${encodeURIComponent(process.env.OAUTH_CALLBACK_URL)}&response_type=code&scope=identify%20email&prompt=none`));
router.get('/login', (req, res) =>
res.redirect(
`https://discordapp.com/oauth2/authorize?client_id=${
process.env.DISCORD_CLIENT_ID
}&redirect_uri=${encodeURIComponent(
process.env.OAUTH_CALLBACK_URL
)}&response_type=code&scope=identify%20email&prompt=none`
)
);

router.get('/callback', async (req, res) => {
if (!req.query.code) return res.sendStatus(400);
let creds = btoa(`${process.env.DISCORD_CLIENT_ID}:${process.env.DISCORD_CLIENT_SECRET}`);
let accessResponse = await fetch(`https://discordapp.com/api/oauth2/token?grant_type=authorization_code&code=${req.query.code}&redirect_uri=${encodeURIComponent(process.env.OAUTH_CALLBACK_URL)}`,
{
method: 'POST',
headers: {
'Authorization': `Basic ${creds}`,
'User-Agent': 'discordboats.club/4.0 (https://github.com/discordboats-club/website-v4)',
'Content-Type': 'application/x-www-form-urlencoded'
let creds = btoa(
`${process.env.DISCORD_CLIENT_ID}:${process.env.DISCORD_CLIENT_SECRET}`
);
let accessResponse = await fetch(
`https://discordapp.com/api/oauth2/token?grant_type=authorization_code&code=${
req.query.code
}&redirect_uri=${encodeURIComponent(process.env.OAUTH_CALLBACK_URL)}`,
{
method: 'POST',
headers: {
Authorization: `Basic ${creds}`,
'User-Agent':
'discordboats.club/4.0 (https://github.com/discordboats-club/website-v4)',
'Content-Type': 'application/x-www-form-urlencoded'
}
}
});
);
let access = await accessResponse.json();
if (access.error) return res.sendStatus(500);

let userResponse = await fetch(`https://discordapp.com/api/users/@me`,
{
let userResponse = await fetch(`https://discordapp.com/api/users/@me`, {
headers: {
'Authorization': `Bearer ${access.access_token}`,
Authorization: `Bearer ${access.access_token}`,
'User-Agent': 'discordboats.club/2.0 (https://discordboats.club)'
}
});
let user = await userResponse.json();
if (!user.email) res.status(400).json({ error: 'Email scope not included' });

if (!await r.table('users').get(user.id).run()) {
await r.table('users').insert({
id: user.id,
username: user.username,
locale: user.locale,
avatar: `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png`,
tag: user.username + '#' + user.discriminator,
discrim: user.discriminator,
flags: [],
if (
!(await r
.table('users')
.get(user.id)
.run())
) {
await r
.table('users')
.insert({
id: user.id,
username: user.username,
locale: user.locale,
avatar: `https://cdn.discordapp.com/avatars/${user.id}/${
user.avatar
}.png`,
tag: user.username + '#' + user.discriminator,
discrim: user.discriminator,
flags: [],

email: user.email,
email: user.email,

discordAT: access.access_token,
discordRT: access.refresh_token
}).run();
discordAT: access.access_token,
discordRT: access.refresh_token
})
.run();
} else {
await r.table('users').get(user.id).update({
username: user.username,
locale: user.locale,
avatar: `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png`,
tag: user.username + '#' + user.discriminator,
discrim: user.discriminator,
await r
.table('users')
.get(user.id)
.update({
username: user.username,
locale: user.locale,
avatar: `https://cdn.discordapp.com/avatars/${user.id}/${
user.avatar
}.png`,
tag: user.username + '#' + user.discriminator,
discrim: user.discriminator,

email: user.email,
email: user.email,

discordAT: access.access_token,
discordRT: access.refresh_token
}).run();
discordAT: access.access_token,
discordRT: access.refresh_token
})
.run();
}

const JWT_TOKEN = await jwt.sign(user.id, JWT_KEY);
res.json({ token: JWT_TOKEN });
});
});

0 comments on commit f3e1e8a

Please sign in to comment.