aboutsummaryrefslogtreecommitdiffstats
path: root/users.js
diff options
context:
space:
mode:
Diffstat (limited to 'users.js')
-rw-r--r--users.js226
1 files changed, 141 insertions, 85 deletions
diff --git a/users.js b/users.js
index c74f2a43..8994697d 100644
--- a/users.js
+++ b/users.js
@@ -11,9 +11,12 @@ const authy = new Client({ key: config.authy.key });
const whitelist = require("./whitelist");
const fb = "https://graph.facebook.com/";
const liquid = new BitcoinCore(config.liquid);
+const Sequelize = require("sequelize");
const pick = (O, ...K) => K.reduce((o, k) => ((o[k] = O[k]), o), {});
const l = console.log;
+let faucet = 1000;
+const DAY = 24 * 60 * 60 * 1000;
module.exports = (addresses, auth, app, bc, db, emit) => {
app.get("/liquidate", async (req, res) => {
@@ -22,34 +25,54 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
let user = users[i];
if (!user.confidential) {
user.confidential = await liquid.getNewAddress();
- user.liquid = (await liquid.getAddressInfo(user.confidential)).unconfidential;
+ user.liquid = (await liquid.getAddressInfo(
+ user.confidential
+ )).unconfidential;
await user.save();
- }
- };
+ }
+ }
res.end();
});
+ const gift = async user => {
+ if (faucet > 0) {
+ user.balance = 100;
+ faucet -= 100;
+ const payment = await db.Payment.create({
+ user_id: user.id,
+ hash: 'Welcome Gift',
+ amount: 100,
+ currency: user.currency,
+ rate: app.get("rates")[user.currency],
+ received: true,
+ confirmed: 1,
+ asset: 'GIFT',
+ });
+ await user.save();
+ }
+ }
app.post("/register", async (req, res) => {
let err = m => res.status(500).send(m);
let user = req.body;
if (!user.username) return err("Username required");
- if (user.password.length < 2) return err("Password too short");
let exists = await db.User.count({ where: { username: user.username } });
if (exists) return err("Username taken");
user.address = await bc.getNewAddress("", "bech32");
user.confidential = await liquid.getNewAddress();
- user.liquid = (await liquid.getAddressInfo(user.confidential)).unconfidential;
- user.password = await bcrypt.hash(user.password, 1);
+ user.liquid = (await liquid.getAddressInfo(
+ user.confidential
+ )).unconfidential;
user.name = user.username;
user.currency = "USD";
user.currencies = ["USD"];
addresses[user.address] = user.username;
addresses[user.liquid] = user.username;
+ user = await db.User.create(user);
+ await gift(user);
- await db.User.create(user);
res.send(pick(user, ...whitelist));
});
@@ -62,7 +85,7 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
from: "CoinOS <[email protected]>",
to: user.email,
subject: "CoinOS Email Verification",
- html: `Visit <a href="https://coinos.io/verifyEmail/${user.username}/${
+ html: `Visit <a href="https://coinos.io/verify/${user.username}/${
user.emailToken
}">https://coinos.io/verify/${user.username}/${
user.emailToken
@@ -104,93 +127,109 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
});
app.post("/user", auth, async (req, res) => {
- let { user } = req;
- let {
- username,
- currency,
- currencies,
- email,
- phone,
- twofa,
- pin,
- password,
- passconfirm
- } = req.body;
+ try {
+ let { user } = req;
+ let {
+ username,
+ currency,
+ currencies,
+ email,
+ phone,
+ twofa,
+ pin,
+ password,
+ passconfirm
+ } = req.body;
- if (user.email !== email && require("email-validator").validate(email)) {
- user.email = email;
- user.emailVerified = false;
- requestEmail(user);
- }
+ let exists = await db.User.findOne({
+ where: { username }
+ });
- if (user.phone !== phone) {
- user.phone = phone;
- user.phoneVerified = false;
- requestPhone(user);
- }
+ if (user.username !== username && exists) {
+ return res.status(500).send("username taken");
+ } else {
+ user.username = username;
+ }
- let exists = await db.User.findOne({
- where: {
- username
+ if (email && user.email !== email) {
+ if (!require("email-validator").validate(email)) {
+ return res.status(500).send("invalid email");
+ }
+
+ user.email = email;
+ user.emailVerified = false;
+ requestEmail(user);
}
- });
- if (username !== user.username && exists) {
- return res.status(500).send("username taken");
- } else {
- user.username = username;
- }
+ if (user.phone !== phone) {
+ user.phone = phone;
+ user.phoneVerified = false;
+ requestPhone(user);
+ }
- user.currencies = currencies;
- user.currency = currency;
- if (currencies.length) {
- if(!currencies.includes(currency)) user.currency = currencies[0];
- } else {
- user.currency = null;
- }
- user.email = email;
- user.phone = phone;
- user.twofa = twofa;
- user.pin = pin;
+ user.currencies = currencies;
+ user.currency = currency;
+ if (currencies.length) {
+ if (!currencies.includes(currency)) user.currency = currencies[0];
+ } else {
+ user.currency = null;
+ }
- if (password && password === passconfirm) {
- user.password = await bcrypt.hash(password, 1);
- }
+ user.email = email;
+ user.phone = phone;
+ user.twofa = twofa;
+ user.pin = pin;
- if (twofa && !user.authyId && user.phoneVerified) {
- try {
- let r = await authy.registerUser({ countryCode: "CA", email, phone });
- user.authyId = r.user.id;
- } catch (e) {
- l(e);
+ if (password && password === passconfirm) {
+ user.password = await bcrypt.hash(password, 1);
}
- }
- await user.save();
- emit(user.username, "user", req.user);
- res.send(user);
+ if (twofa && !user.authyId && user.phoneVerified) {
+ try {
+ let r = await authy.registerUser({ countryCode: "CA", email, phone });
+ user.authyId = r.user.id;
+ } catch (e) {
+ l(e);
+ }
+ }
+
+ await user.save();
+ emit(user.username, "user", req.user);
+ res.send(user);
+ } catch (e) {
+ l(e);
+ }
});
app.post("/forgot", async (req, res) => {
- let { user } = req;
- let mg = mailgun(config.mailgun);
- let msg = {
- from: "CoinOS <[email protected]>",
- to: user.email,
- subject: "CoinOS Password Reset",
- html: `Visit <a href="https://coinos.io/reset/${user.username}/${
- user.token
- }">https://coinos.io/reset/${user.username}/${
- user.token
- }</a> to reset your password.`
- };
+ let user = await db.User.findOne({
+ where: {
+ email: req.body.email
+ }
+ });
- try {
- mg.messages().send(msg);
- } catch (e) {
- l(e);
+ if (user) {
+ let mg = mailgun(config.mailgun);
+ let msg = {
+ from: "CoinOS <[email protected]>",
+ to: user.email,
+ subject: "CoinOS Password Reset",
+ html: `Visit <a href="https://coinos.io/reset/${user.username}/${
+ user.token
+ }">https://coinos.io/reset/${user.username}/${
+ user.token
+ }</a> to reset your password.`
+ };
+
+ try {
+ mg.messages().send(msg);
+ } catch (e) {
+ l(e);
+ }
}
+
+ res.end();
});
app.get("/verifyEmail/:username/:token", auth, async (req, res) => {
@@ -201,6 +240,8 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
}
});
+ user.emailToken = uuidv4();
+
if (user) {
user.emailVerified = true;
await user.save();
@@ -244,7 +285,7 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
if (
!user ||
- !(await bcrypt.compare(req.body.password, user.password)) ||
+ (user.password && !(await bcrypt.compare(req.body.password, user.password))) ||
(user.twofa && !(await authyVerify(user)))
) {
return res.status(401).end();
@@ -281,10 +322,14 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
if (!user) {
user = await db.User.create(user);
user.username = userID;
- user.name = (await axios.get(`${fb}/me?access_token=${accessToken}`)).data.name;
+ user.name = (await axios.get(
+ `${fb}/me?access_token=${accessToken}`
+ )).data.name;
user.address = await bc.getNewAddress("", "bech32");
user.confidential = await liquid.getNewAddress();
- user.liquid = (await liquid.getAddressInfo(user.confidential)).unconfidential;
+ user.liquid = (await liquid.getAddressInfo(
+ user.confidential
+ )).unconfidential;
user.password = await bcrypt.hash(accessToken, 1);
user.balance = 0;
user.pending = 0;
@@ -297,6 +342,7 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
}
await user.save();
addresses[user.address] = user.username;
+ await gift(user);
}
user.pic = (await axios.get(
@@ -318,15 +364,23 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
});
app.get("/me", async (req, res) => {
- let { data: { data: { url } } } = (await axios.get(
+ let {
+ data: {
+ data: { url }
+ }
+ } = await axios.get(
`${fb}/me/picture?access_token=EAAEIFqWk3ZAwBAEUfxQdH3T5CBKXmU8d7jQ5OTJBJZBiU1ZAp76lO26nh57WolM4R4JoKks9BCc49s8VrlEm2Ub1GlZCEzVD9fGxzUiranXDErDmR5gDUPKX3BhCsGA649a4hmbldRwKFTsmZCGZCergm9ACspKdTZB0WgFgA9wEdemIRIXuwCygNrymmKDh0Wd8nmoT4Hj3wZDZD&redirect=false`
- ));
+ );
res.send(url);
});
app.get("/friends", auth, async (req, res) => {
try {
- const { data: { data } } = await axios.get(`${fb}/${req.user.username}/friends?access_token=${req.user.fbtoken}`);
+ const {
+ data: { data }
+ } = await axios.get(
+ `${fb}/${req.user.username}/friends?access_token=${req.user.fbtoken}`
+ );
const friends = await Promise.all(
data.map(async f => {
@@ -346,4 +400,6 @@ module.exports = (addresses, auth, app, bc, db, emit) => {
.send("There was a problem getting your facebook friends: " + e);
}
});
+
+ setInterval(() => faucet = 2000, DAY)
};