123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- "use strict";
- var config = require('config');
- const db = require('../../models/db');
- const uuidv4 = require('uuid/v4');
- const os = require('os');
- var mailer = require('../../helpers/mailer');
- var uploader = require('../../helpers/uploader');
- var importer = require('../../helpers/importer');
- var bcrypt = require('bcryptjs');
- var crypto = require('crypto');
- var swig = require('swig');
- var async = require('async');
- var _ = require('underscore');
- var fs = require('fs');
- var request = require('request');
- var gm = require('gm');
- var validator = require('validator');
- var URL = require('url').URL;
- var express = require('express');
- var router = express.Router();
- var glob = require('glob');
- router.get('/current', function(req, res, next) {
- if (req.user) {
- var u = _.clone(req.user.dataValues);
- delete u.password_hash;
- delete u.password_reset_token;
- delete u.confirmation_token;
- u.token = req.cookies['sdsession'];
- console.log(u);
-
- res.status(200).json(u);
- } else {
- res.status(401).json({"error":"user_not_found"});
- }
- });
- // create user
- router.post('/', function(req, res) {
- if (!req.body["email"] || !req.body["password"]) {
- res.status(400).json({"error":"email or password missing"});
- return;
- }
-
- var email = req.body["email"].toLowerCase();
- var nickname = req.body["nickname"];
- var password = req.body["password"];
- var password_confirmation = req.body["password_confirmation"];
- if (password_confirmation != password) {
- res.status(400).json({"error":"password_confirmation"});
- return;
- }
-
- if (!validator.isEmail(email)) {
- res.status(400).json({"error":"email_invalid"});
- return;
- }
-
- var createUser = function() {
- bcrypt.genSalt(10, function(err, salt) {
- bcrypt.hash(password, salt, function(err, hash) {
- crypto.randomBytes(16, function(ex, buf) {
- var token = buf.toString('hex');
- var u = {
- _id: uuidv4(),
- email: email,
- account_type: "email",
- nickname: nickname,
- password_hash: hash,
- prefs_language: req.i18n.locale,
- confirmation_token: token
- };
- db.User.create(u)
- .error(err => {
- res.sendStatus(400);
- })
- .then(u => {
- var homeSpace = {
- _id: uuidv4(),
- name: req.i18n.__("home"),
- space_type: "folder",
- creator_id: u._id
- };
- db.Space.create(homeSpace)
- .error(err => {
- res.sendStatus(400);
- })
- .then(homeSpace => {
- u.home_folder_id = homeSpace._id;
- u.save()
- .then(() => {
- res.status(201).json({});
-
- mailer.sendMail(u.email, req.i18n.__("confirm_subject"), req.i18n.__("confirm_body"), {
- action: {
- link: config.endpoint + "/confirm/" + u.confirmation_token,
- name: req.i18n.__("confirm_action")
- }
- });
- })
- .error(err => {
- res.status(400).json(err);
- });
- })
- });
- });
- });
- });
- };
-
- db.User.findAll({where: {email: email}})
- .then(users => {
- if (users.length == 0) {
- //var domain = email.slice(email.lastIndexOf('@')+1);
- createUser();
- } else {
- res.status(400).json({"error":"user_email_already_used"});
- }
- })
- });
- router.get('/current', function(req, res, next) {
- if (req.user) {
- res.status(200).json(req.user);
- } else {
- res.status(401).json({"error":"user_not_found"});
- }
- });
- router.put('/:id', function(req, res, next) {
- // TODO explicit whitelisting
- var user = req.user;
- if (user._id == req.params.id) {
- var newAttr = req.body;
- newAttr.updated_at = new Date();
- delete newAttr['_id'];
- db.User.update(newAttr, {where: {"_id": user._id}}).then(function(updatedUser) {
- res.status(200).json(newAttr);
- });
- } else {
- res.sendStatus(403);
- }
- });
- router.post('/:id/password', function(req, res, next) {
- var user = req.user;
- var old_password = req.body.old_password;
- var pass = req.body.new_password;
- if (pass.length >= 6) {
- if (user._id == req.params.id) {
- if (bcrypt.compareSync(old_password, user.password_hash)) {
- bcrypt.genSalt(10, function(err, salt) {
- bcrypt.hash(pass, salt, function(err, hash) {
- user.password_hash = hash;
- user.save().then(function() {
- res.sendStatus(204);
- });
- });
- });
- } else {
- res.status(403).json({"error": "old password wrong"});
- }
- } else {
- res.status(403).json({"error": "wrong user"});
- }
- } else {
- res.status(400).json({"error": "password_to_short"});
- }
- });
- router.delete('/:id', (req, res, next) => {
- const user = req.user;
- if(user._id == req.params.id) {
- if (user.account_type == 'email') {
- if (bcrypt.compareSync(req.query.password, user.password_hash)) {
- user.remove((err) => {
- if(err)res.status(400).json(err);
- else res.sendStatus(204);
- });
- } else {
- res.bad_request("password_incorrect");
- }
- } else {
- user.remove((err) => {
- if (err) res.status(400).json(err);
- else res.sendStatus(204);
- });
- }
- }
- else res.status(403).json({error: ""});
- });
- router.put('/:user_id/confirm', (req, res) => {
- const token = req.body.token;
- const user = req.user;
- if (user.confirmation_token === token) {
- user.confirmation_token = null;
- user.confirmed_at = new Date();
- user.save(function(err, updatedUser) {
- if(err) {
- res.sendStatus(400);
- } else {
- res.status(200).json(updatedUser);
- }
- });
- } else {
- res.sendStatus(400);
- }
- });
- router.post('/:user_id/avatar', (req, res, next) => {
- const user = req.user;
- const filename = "u"+req.user._id+"_"+(new Date().getTime())+".jpeg"
- const localFilePath = os.tmpdir()+"/"+filename;
- const localResizedFilePath = os.tmpdir()+"/resized_"+filename;
- const writeStream = fs.createWriteStream(localFilePath);
- const stream = req.pipe(writeStream);
- req.on('end', function() {
- gm(localFilePath).resize(200, 200).autoOrient().write(localResizedFilePath, (err) => {
- if (err) res.status(400).json(err);
- else {
- uploader.uploadFile(filename, "image/jpeg", localResizedFilePath, (err, url) => {
- if (err) res.status(400).json(err);
- else {
- user.avatar_thumb_uri = url;
- user.save().then(() => {
- fs.unlink(localResizedFilePath, (err) => {
- if (err) {
- console.error(err);
- res.status(400).json(err);
- } else {
- res.status(200).json(user);
- }
- });
- });
- }
- });
- }
- });
- });
- });
- router.post('/feedback', function(req, res, next) {
- var text = req.body.text;
- // FIXME
- mailer.sendMail("support@example.org", "Support Request by " + req.user.email, text, {reply_to: req.user.email});
- res.sendStatus(201);
- });
- router.post('/password_reset_requests', (req, res, next) => {
- const email = req.query.email;
- db.User.findOne({where: {"email": email}}).then((user) => {
- if (user) {
- crypto.randomBytes(16, (ex, buf) => {
- user.password_reset_token = buf.toString('hex');
- user.save().then(updatedUser => {
- mailer.sendMail(email, req.i18n.__("password_reset_subject"), req.i18n.__("password_reset_body"), {action: {
- link: config.endpoint + "/password-confirm/" + user.password_reset_token,
- name: req.i18n.__("password_reset_action")
- }});
- res.status(201).json({});
- });
- });
- } else {
- res.status(404).json({"error": "error_unknown_email"});
- }
- });
- });
- router.post('/password_reset_requests/:confirm_token/confirm', function(req, res, next) {
- var password = req.body.password;
- db.User
- .findOne({where: {"password_reset_token": req.params.confirm_token}})
- .then((user) => {
- if (user) {
- bcrypt.genSalt(10, (err, salt) => {
- bcrypt.hash(password, salt, function(err, hash) {
- user.password_hash = hash;
- user.password_token = null;
- user.save(function(err, updatedUser){
- if (err) {
- res.sendStatus(400);
- } else {
- res.sendStatus(201);
- }
- });
- });
- });
- } else {
- res.sendStatus(404);
- }
- });
- });
- router.post('/:user_id/confirm', function(req, res, next) {
- mailer.sendMail(req.user.email, req.i18n.__("confirm_subject"), req.i18n.__("confirm_body"), { action:{
- link: config.endpoint + "/confirm/" + req.user.confirmation_token,
- name: req.i18n.__("confirm_action")
- }});
- res.sendStatus(201);
- });
- router.get('/:user_id/importables', function(req, res, next) {
- glob('*.zip', function(err, files) {
- res.status(200).json(files);
- });
- });
- router.get('/:user_id/import', function(req, res, next) {
- if (req.query.zip) {
- res.send("importing");
- importer.importZIP(req.user, req.query.zip);
- } else {
- res.sendStatus(400);
- }
- });
- module.exports = router;
|