route.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. const fs = require('fs');
  2. const auth = require('./auth');
  3. const db = require('./db');
  4. // Constante d'erreur
  5. const ERR_REQUEST = 1;
  6. const ERR_AUTH = 2;
  7. const ERR_UNKNOW = 3;
  8. const ERR_TOKEN = 4;
  9. const ERR_SERV = 5;
  10. const ERR_FILE = 6;
  11. // Fonctions de traitement pour les routes
  12. function verifyAuth(req, res, next) {
  13. if (req.body.user === undefined || req.body.token === undefined) {
  14. res.json(error(ERR_REQUEST));
  15. return;
  16. }
  17. if (auth.isActivated() && !auth.verify(req.body.user, req.body.token)) {
  18. res.json(error(ERR_TOKEN));
  19. return;
  20. }
  21. next();
  22. }
  23. function verbose(req, res, next) {
  24. if (global.verbose) {
  25. const nbProp = Object.keys(req.body);
  26. console.log(`\nCall ${req.route.path} with ${nbProp.length} parameter(s)`);
  27. if (nbProp.length > 0) {
  28. for (prop in req.body) {
  29. console.log(` ${prop}: ${req.body[prop]}`);
  30. }
  31. }
  32. }
  33. next();
  34. }
  35. // Fonctions reponses
  36. function error(code) {
  37. let answer = {
  38. success: false,
  39. code: code
  40. };
  41. switch (code) {
  42. case ERR_REQUEST:
  43. answer.message = 'Bad request';
  44. break;
  45. case ERR_AUTH:
  46. answer.message = 'Bad authentication';
  47. break;
  48. case ERR_UNKNOW:
  49. answer.message = 'Unknow user';
  50. break;
  51. case ERR_TOKEN:
  52. answer.message = 'Invalid token';
  53. break;
  54. case ERR_SERV:
  55. answer.message = 'Server error';
  56. break;
  57. case ERR_FILE:
  58. answer.message = 'File not found';
  59. default:
  60. answer.message = 'Unknow error';
  61. }
  62. return answer;
  63. }
  64. function success(data) {
  65. if (data === undefined || data === null) {
  66. return {success: true};
  67. } else if (typeof data !== 'object') {
  68. return {success: true, data: data};
  69. } else {
  70. data.success = true;
  71. return data;
  72. }
  73. }
  74. // Definition des routes
  75. app.get('/authentication', [verbose, (req, res) => {
  76. res.json(success({authentication: auth.isActivated()}));
  77. }]);
  78. app.post('/register', [verbose, (req, res) => {
  79. if (req.body.user === undefined || req.body.password === undefined) {
  80. res.json(error(ERR_REQUEST));
  81. return;
  82. }
  83. const passHash = auth.passwordHash(req.body.password);
  84. db.addUser(req.body.user, passHash);
  85. return res.json(success());
  86. }]);
  87. app.post('/login', [verbose, (req, res) => {
  88. if (req.body.user === undefined || req.body.password === undefined) {
  89. res.json(error(ERR_REQUEST));
  90. return;
  91. }
  92. db.getUser(req.body.user).then((user) => {
  93. if (user === undefined) {
  94. res.json(error(ERR_UNKNOW));
  95. } else {
  96. if (auth.passwordVerify(req.body.password, user.pass)) {
  97. res.json(success({token: auth.generateToken(req.body.user)}));
  98. } else {
  99. res.json(error(ERR_AUTH));
  100. }
  101. }
  102. });
  103. }]);
  104. app.post('/token', [verbose, (req, res) => {
  105. if (req.body.user === undefined || req.body.token === undefined) {
  106. res.json(error(ERR_REQUEST));
  107. return;
  108. }
  109. res.json(success({valid: auth.verify(req.body.user, req.body.token)}));
  110. }]);
  111. app.post('/list', [verbose, verifyAuth, (req, res) => {
  112. db.listFile(req.body.user).then((list) => {
  113. if (list === false) {
  114. res.json(error(ERR_SERV));
  115. } else {
  116. res.json(success({
  117. total: list.length,
  118. list: list
  119. }));
  120. }
  121. });
  122. }]);
  123. app.post('/get/:file', [verbose, verifyAuth, (req, res) => {
  124. db.getFile(req.body.user, req.params.file).then((file) => {
  125. // Erreur
  126. if (file === false) {
  127. res.json(error(ERR_SERV));
  128. }
  129. // Création reponse commune
  130. let result = {
  131. fileid: file.fi_hash,
  132. filename: file.fi_name
  133. };
  134. // Recupération données fichier
  135. if (global.storage === 'database') {
  136. result.data = file.data;
  137. res.json(success(result));
  138. } else {
  139. if (!fs.existsSync(file.data)) {
  140. res.json(error(ERR_FILE));
  141. }
  142. fs.readFile(file.data, (err, data) => {
  143. result.data = data;
  144. res.json(success(result));
  145. });
  146. }
  147. });
  148. }]);
  149. app.post('/save/:file', [verbose, verifyAuth, (req, res) => {
  150. }]);
  151. /*
  152. app.get('/', function (req, res) {
  153. res.send('Hello World!');
  154. });
  155. app.get('/test/:val?', function (req, res) {
  156. res.send('Val = ' + req.params.val);
  157. });
  158. app.get(/.*aze$/, function (req, res) {
  159. res.send('URL end with aze');
  160. })
  161. */