123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- const fs = require('fs');
- const crypto = require('crypto');
- const auth = require('./auth');
- const db = require('./db');
- // Constante d'erreur
- const ERR_REQUEST = 1;
- const ERR_AUTH = 2;
- const ERR_UNKNOW = 3;
- const ERR_TOKEN = 4;
- const ERR_SERV = 5;
- const ERR_FILE = 6;
- // Fonctions de traitement pour les routes
- function verifyAuth(req, res, next) {
- if (req.body.user === undefined || req.body.token === undefined) {
- res.json(error(ERR_REQUEST));
- return;
- }
- if (auth.isActivated() && !auth.verify(req.body.user, req.body.token)) {
- res.json(error(ERR_TOKEN));
- return;
- }
- next();
- }
- function verbose(req, res, next) {
- if (global.verbose) {
- const nbProp = Object.keys(req.body);
- console.log(`\nCall ${req.route.path} with ${nbProp.length} parameter(s)`);
- if (nbProp.length > 0) {
- for (prop in req.body) {
- console.log(` ${prop}: ${req.body[prop]}`);
- }
- }
- }
- next();
- }
- // Fonctions reponses
- function error(code) {
- let answer = {
- success: false,
- code: code
- };
- switch (code) {
- case ERR_REQUEST:
- answer.message = 'Bad request';
- break;
- case ERR_AUTH:
- answer.message = 'Bad authentication';
- break;
- case ERR_UNKNOW:
- answer.message = 'Unknow user';
- break;
- case ERR_TOKEN:
- answer.message = 'Invalid token';
- break;
- case ERR_SERV:
- answer.message = 'Server error';
- break;
- case ERR_FILE:
- answer.message = 'File not found';
- break;
- default:
- answer.message = 'Unknow error';
- }
- return answer;
- }
- function success(data) {
- if (data === undefined || data === null) {
- return {success: true};
- } else if (typeof data !== 'object') {
- return {success: true, data: data};
- } else {
- data.success = true;
- return data;
- }
- }
- // Definition des routes
- app.get('/authentication', [verbose, (req, res) => {
- res.json(success({authentication: auth.isActivated()}));
- }]);
- app.post('/register', [verbose, (req, res) => {
- if (req.body.user === undefined || req.body.password === undefined) {
- res.json(error(ERR_REQUEST));
- return;
- }
- const passHash = auth.passwordHash(req.body.password);
- db.addUser(req.body.user, passHash);
- return res.json(success());
- }]);
- app.post('/login', [verbose, (req, res) => {
- if (req.body.user === undefined || req.body.password === undefined) {
- res.json(error(ERR_REQUEST));
- return;
- }
- db.getUser(req.body.user).then((user) => {
- if (user === undefined) {
- res.json(error(ERR_UNKNOW));
- } else {
- if (auth.passwordVerify(req.body.password, user.pass)) {
- res.json(success({token: auth.generateToken(req.body.user)}));
- } else {
- res.json(error(ERR_AUTH));
- }
- }
- });
- }]);
- app.post('/token', [verbose, (req, res) => {
- if (req.body.user === undefined || req.body.token === undefined) {
- res.json(error(ERR_REQUEST));
- return;
- }
- res.json(success({valid: auth.verify(req.body.user, req.body.token)}));
- }]);
- app.post('/list', [verbose, verifyAuth, (req, res) => {
- db.listFile(req.body.user).then((list) => {
- if (list === false) {
- res.json(error(ERR_SERV));
- } else {
- res.json(success({
- total: list.length,
- list: list
- }));
- }
- });
- }]);
- app.post('/get/:file', [verbose, verifyAuth, (req, res) => {
- db.getFile(req.body.user, req.params.file).then((file) => {
- // Erreur
- if (file === false) {
- res.json(error(ERR_SERV));
- } else // Le fichier n'existe pas
- if (file === null) {
- res.json(error(ERR_FILE));
- }
- // Création reponse commune
- else {
- let result = {
- fileid: file.fi_hash,
- filename: file.fi_name
- };
- // Recupération données fichier
- if (global.storage === 'database') {
- result.data = file.data;
- res.json(success(result));
- } else {
- if (!fs.existsSync(file.data)) {
- res.json(error(ERR_FILE));
- }
- fs.readFile(file.data, (err, data) => {
- result.data = data;
- res.json(success(result));
- });
- }
- }
- });
- }]);
- app.post('/save/:file', [verbose, verifyAuth, (req, res) => {
- //Si on sauvegarde les données dans des fichiers, generation du chemin
- let data = req.body.data;
- if (global.storage === 'file') {
- let hash = Date.now() + '-' + req.body.user + '-' + req.params.file;
- hash = crypto.createHash('md5').update(hash).digest('base64');
- hash = hash.replace(/=/g, '');
- data = './data/' + hash + '.fdata';
- }
- let promise = db.addFile(req.body.user, req.params.file, data);
- if (promise === false) {
- res.json(error(ERR_SERV));
- }
- promise.then((fileId) => {
- if (fileId === false) {
- res.json(ERR_SERV);
- } else {
- // Si en mode fichier stockage dans un fichier
- if ((global.storage === 'file')) {
- fs.writeFile(data, req.body.data, (err) => {
- if (err) {
- if (global.verbose) {
- console.error(err);
- }
- res.json(error(ERR_SERV));
- } else {
- res.json(success({fileId: fileId, fileName: req.params.file}));
- }
- });
- }
- // Le fichier est directement sauvegarder en base
- else {
- res.json(success({fileId: fileId, fileName: req.params.file}));
- }
- }
- });
- }]);
- /*
- app.get('/', function (req, res) {
- res.send('Hello World!');
- });
- app.get('/test/:val?', function (req, res) {
- res.send('Val = ' + req.params.val);
- });
- app.get(/.*aze$/, function (req, res) {
- res.send('URL end with aze');
- })
- */
|