route.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. const fs = require('fs');
  2. const crypto = require('crypto');
  3. const auth = require('./auth');
  4. const db = require('./db');
  5. // Constante d'erreur
  6. const ERR_REQUEST = 1;
  7. const ERR_AUTH = 2;
  8. const ERR_UNKNOW = 3;
  9. const ERR_TOKEN = 4;
  10. const ERR_SERV = 5;
  11. const ERR_FILE = 6;
  12. // Fonctions de traitement pour les routes
  13. function verifyAuth(req, res, next) {
  14. if (req.body.user === undefined || req.body.token === undefined) {
  15. res.json(error(ERR_REQUEST));
  16. return;
  17. }
  18. if (auth.isActivated() && !auth.verify(req.body.user, req.body.token)) {
  19. res.json(error(ERR_TOKEN));
  20. return;
  21. }
  22. next();
  23. }
  24. function verbose(req, res, next) {
  25. if (global.verbose) {
  26. const nbProp = Object.keys(req.body);
  27. console.log(`\nCall ${req.route.path} with ${nbProp.length} parameter(s)`);
  28. if (nbProp.length > 0) {
  29. for (prop in req.body) {
  30. console.log(` ${prop}: ${req.body[prop]}`);
  31. }
  32. }
  33. }
  34. next();
  35. }
  36. // Fonctions reponses
  37. function error(code) {
  38. let answer = {
  39. success: false,
  40. code: code
  41. };
  42. switch (code) {
  43. case ERR_REQUEST:
  44. answer.message = 'Bad request';
  45. break;
  46. case ERR_AUTH:
  47. answer.message = 'Bad authentication';
  48. break;
  49. case ERR_UNKNOW:
  50. answer.message = 'Unknow user';
  51. break;
  52. case ERR_TOKEN:
  53. answer.message = 'Invalid token';
  54. break;
  55. case ERR_SERV:
  56. answer.message = 'Server error';
  57. break;
  58. case ERR_FILE:
  59. answer.message = 'File not found';
  60. break;
  61. default:
  62. answer.message = 'Unknow error';
  63. }
  64. return answer;
  65. }
  66. function success(data) {
  67. if (data === undefined || data === null) {
  68. return {success: true};
  69. } else if (typeof data !== 'object') {
  70. return {success: true, data: data};
  71. } else {
  72. data.success = true;
  73. return data;
  74. }
  75. }
  76. // Definition des routes
  77. app.get('/authentication', [verbose, (req, res) => {
  78. res.json(success({authentication: auth.isActivated()}));
  79. }]);
  80. app.post('/register', [verbose, (req, res) => {
  81. if (req.body.user === undefined || req.body.password === undefined) {
  82. res.json(error(ERR_REQUEST));
  83. return;
  84. }
  85. const passHash = auth.passwordHash(req.body.password);
  86. db.addUser(req.body.user, passHash);
  87. return res.json(success());
  88. }]);
  89. app.post('/login', [verbose, (req, res) => {
  90. if (req.body.user === undefined || req.body.password === undefined) {
  91. res.json(error(ERR_REQUEST));
  92. return;
  93. }
  94. db.getUser(req.body.user).then((user) => {
  95. if (user === undefined) {
  96. res.json(error(ERR_UNKNOW));
  97. } else {
  98. if (auth.passwordVerify(req.body.password, user.pass)) {
  99. res.json(success({token: auth.generateToken(req.body.user)}));
  100. } else {
  101. res.json(error(ERR_AUTH));
  102. }
  103. }
  104. });
  105. }]);
  106. app.post('/token', [verbose, (req, res) => {
  107. if (req.body.user === undefined || req.body.token === undefined) {
  108. res.json(error(ERR_REQUEST));
  109. return;
  110. }
  111. res.json(success({valid: auth.verify(req.body.user, req.body.token)}));
  112. }]);
  113. app.post('/list', [verbose, verifyAuth, (req, res) => {
  114. db.listFile(req.body.user).then((list) => {
  115. if (list === false) {
  116. res.json(error(ERR_SERV));
  117. } else {
  118. res.json(success({
  119. total: list.length,
  120. list: list
  121. }));
  122. }
  123. });
  124. }]);
  125. app.post('/get/:file', [verbose, verifyAuth, (req, res) => {
  126. db.getFile(req.body.user, req.params.file).then((file) => {
  127. // Erreur
  128. if (file === false) {
  129. res.json(error(ERR_SERV));
  130. } else // Le fichier n'existe pas
  131. if (file === null) {
  132. res.json(error(ERR_FILE));
  133. }
  134. // Création reponse commune
  135. else {
  136. let result = {
  137. fileid: file.fi_hash,
  138. filename: file.fi_name
  139. };
  140. // Recupération données fichier
  141. if (global.storage === 'database') {
  142. result.data = file.data;
  143. res.json(success(result));
  144. } else {
  145. if (!fs.existsSync(file.data)) {
  146. res.json(error(ERR_FILE));
  147. }
  148. fs.readFile(file.data, (err, data) => {
  149. result.data = data;
  150. res.json(success(result));
  151. });
  152. }
  153. }
  154. });
  155. }]);
  156. app.post('/save/:file', [verbose, verifyAuth, (req, res) => {
  157. //Si on sauvegarde les données dans des fichiers, generation du chemin
  158. let data = req.body.data;
  159. if (global.storage === 'file') {
  160. let hash = Date.now() + '-' + req.body.user + '-' + req.params.file;
  161. hash = crypto.createHash('md5').update(hash).digest('base64');
  162. hash = hash.replace(/=/g, '');
  163. data = './data/' + hash + '.fdata';
  164. }
  165. let promise = db.addFile(req.body.user, req.params.file, data);
  166. if (promise === false) {
  167. res.json(error(ERR_SERV));
  168. }
  169. promise.then((fileId) => {
  170. if (fileId === false) {
  171. res.json(ERR_SERV);
  172. } else {
  173. // Si en mode fichier stockage dans un fichier
  174. if ((global.storage === 'file')) {
  175. fs.writeFile(data, req.body.data, (err) => {
  176. if (err) {
  177. if (global.verbose) {
  178. console.error(err);
  179. }
  180. res.json(error(ERR_SERV));
  181. } else {
  182. res.json(success({fileId: fileId, fileName: req.params.file}));
  183. }
  184. });
  185. }
  186. // Le fichier est directement sauvegarder en base
  187. else {
  188. res.json(success({fileId: fileId, fileName: req.params.file}));
  189. }
  190. }
  191. });
  192. }]);
  193. /*
  194. app.get('/', function (req, res) {
  195. res.send('Hello World!');
  196. });
  197. app.get('/test/:val?', function (req, res) {
  198. res.send('Val = ' + req.params.val);
  199. });
  200. app.get(/.*aze$/, function (req, res) {
  201. res.send('URL end with aze');
  202. })
  203. */