router.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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 reponses
  13. function error(code) {
  14. let answer = {
  15. success: false,
  16. code: code
  17. };
  18. switch (code) {
  19. case ERR_REQUEST:
  20. answer.message = 'Bad request';
  21. break;
  22. case ERR_AUTH:
  23. answer.message = 'Bad authentication';
  24. break;
  25. case ERR_UNKNOW:
  26. answer.message = 'Unknow user';
  27. break;
  28. case ERR_TOKEN:
  29. answer.message = 'Invalid token';
  30. break;
  31. case ERR_SERV:
  32. answer.message = 'Server error';
  33. break;
  34. case ERR_FILE:
  35. answer.message = 'File not found';
  36. break;
  37. default:
  38. answer.message = 'Unknow error';
  39. }
  40. return answer;
  41. }
  42. function success(data) {
  43. if (data === undefined || data === null) {
  44. return {success: true};
  45. } else if (typeof data !== 'object') {
  46. return {success: true, data: data};
  47. } else {
  48. data.success = true;
  49. return data;
  50. }
  51. }
  52. const router = class Router {
  53. constructor(app) {
  54. this.app = app;
  55. this.doc = require('../data/documentation.json');
  56. }
  57. /* --- Helper function --- */
  58. // Fonctions de traitement pour les routes
  59. verifyAuth(req, res, next) {
  60. if (req.body.user === undefined || req.body.token === undefined) {
  61. res.json(error(ERR_REQUEST));
  62. return;
  63. }
  64. if (auth.isActivated() && !auth.verify(req.body.user, req.body.token)) {
  65. res.json(error(ERR_TOKEN));
  66. return;
  67. }
  68. let promise = db.userExist(req.body.user);
  69. if (promise === false) {
  70. res.json(error(ERR_REQUEST));
  71. return;
  72. }
  73. promise.then((exist) => {
  74. if (exist) {
  75. next();
  76. } else {
  77. res.json(error(ERR_UNKNOW));
  78. }
  79. });
  80. }
  81. verbose(req, res, next) {
  82. if (global.verbose) {
  83. const nbProp = Object.keys(req.body);
  84. console.log(`\nCall ${req.route.path} with ${nbProp.length} parameter(s)`);
  85. if (nbProp.length > 0) {
  86. for (let prop in req.body) {
  87. console.log(` ${prop}: ${req.body[prop]}`);
  88. }
  89. }
  90. }
  91. next();
  92. }
  93. /* --- Definitions des routes --- */
  94. newFile(user, file, data, res) {
  95. }
  96. saveFile() {
  97. }
  98. route() {
  99. this.app.get('/', [this.verbose, (req, res) => {
  100. res.json(this.doc);
  101. }]);
  102. this.app.get('/authentication', [this.verbose, (req, res) => {
  103. res.json(success({authentication: auth.isActivated()}));
  104. }]);
  105. this.app.post('/register', [this.verbose, (req, res) => {
  106. if (req.body.user === undefined || req.body.password === undefined) {
  107. res.json(error(ERR_REQUEST));
  108. return;
  109. }
  110. const passHash = auth.passwordHash(req.body.password);
  111. db.addUser(req.body.user, passHash);
  112. return res.json(success());
  113. }]);
  114. this.app.post('/login', [this.verbose, (req, res) => {
  115. if (req.body.user === undefined || req.body.password === undefined) {
  116. res.json(error(ERR_REQUEST));
  117. return;
  118. }
  119. const promise = db.getUser(req.body.user);
  120. if (promise === false) {
  121. res.json(error(ERR_REQUEST));
  122. return;
  123. }
  124. promise.then((user) => {
  125. if (user === undefined) {
  126. res.json(error(ERR_UNKNOW));
  127. } else {
  128. if (auth.passwordVerify(req.body.password, user.pass)) {
  129. res.json(success({token: auth.generateToken(req.body.user)}));
  130. } else {
  131. res.json(error(ERR_AUTH));
  132. }
  133. }
  134. });
  135. }]);
  136. this.app.get('/token', [this.verbose, (req, res) => {
  137. if (req.body.user === undefined || req.body.token === undefined) {
  138. res.json(error(ERR_REQUEST));
  139. return;
  140. }
  141. res.json(success({valid: auth.verify(req.body.user, req.body.token)}));
  142. }]);
  143. this.app.get('/list', [this.verbose, this.verifyAuth, (req, res) => {
  144. const promise = db.listFile(req.body.user);
  145. if (promise === false) {
  146. res.json(error(ERR_REQUEST));
  147. return;
  148. }
  149. promise.then((list) => {
  150. if (list === false) {
  151. res.json(error(ERR_SERV));
  152. } else {
  153. res.json(success({
  154. total: list.length,
  155. list: list
  156. }));
  157. }
  158. });
  159. }]);
  160. this.app.get('/:file', [this.verbose, this.verifyAuth, (req, res) => {
  161. const promise = db.getFile(req.body.user, req.params.file);
  162. if (promise === false) {
  163. res.json(error(ERR_REQUEST));
  164. return;
  165. }
  166. promise.then((file) => {
  167. // Erreur
  168. if (file === false) {
  169. res.json(error(ERR_SERV));
  170. } else // Le fichier n'existe pas
  171. if (file === null) {
  172. res.json(error(ERR_FILE));
  173. }
  174. // Création reponse commune
  175. else {
  176. let result = {
  177. fileid: file.fi_hash,
  178. filename: file.fi_name
  179. };
  180. // Recupération données fichier
  181. if (global.storage === 'database') {
  182. result.data = file.data;
  183. res.json(success(result));
  184. } else {
  185. if (!fs.existsSync(file.data)) {
  186. res.json(error(ERR_FILE));
  187. }
  188. fs.readFile(file.data, (err, data) => {
  189. result.data = data.toString();
  190. res.json(success(result));
  191. });
  192. }
  193. }
  194. });
  195. }]);
  196. this.app.post('/save', [this.verbose, this.verifyAuth, (req, res) => {
  197. const user = req.body.user;
  198. const file = req.body.file;
  199. const data = req.body.data;
  200. let promise, filename;
  201. // Si on sauvegarde les données dans des fichiers, generation du chemin
  202. if (global.storage === 'file') {
  203. let hash = Date.now() + '-' + req.body.user + '-' + req.params.file;
  204. hash = crypto.createHash('md5').update(hash).digest('base64');
  205. hash = hash.replace(/=/g, '').replace(/\//g, '');
  206. filename = './data/' + hash + '.fdata';
  207. promise = db.addFile(user, file, filename);
  208. }
  209. // Sinon om met directement en base
  210. else {
  211. promise = db.addFile(user, file, data);
  212. }
  213. if (promise === false) {
  214. res.json(error(ERR_REQUEST));
  215. return;
  216. }
  217. promise.then((fileId) => {
  218. if (fileId === false) {
  219. res.json(ERR_SERV);
  220. } else {
  221. // Si en mode fichier stockage dans un fichier
  222. if ((global.storage === 'file')) {
  223. fs.writeFile(filename, data, (err) => {
  224. if (err) {
  225. if (global.verbose) {
  226. console.error(err);
  227. }
  228. res.json(error(ERR_SERV));
  229. } else {
  230. res.json(success({fileId: fileId, fileName: file}));
  231. }
  232. });
  233. }
  234. // Le fichier est directement sauvegarder en base
  235. else {
  236. res.json(success({fileId: fileId, fileName: file}));
  237. }
  238. }
  239. });
  240. }]);
  241. this.app.put('/save/:file', [this.verbose, this.verifyAuth, (req, res) => {
  242. }]);
  243. /*this.app.post('/save/:file?', [this.verbose, this.verifyAuth, (req, res) => {
  244. if (req.params.file === undefined) {
  245. if (req.body.file === undefined || req.body.data === undefined) {
  246. res.json(error(ERR_REQUEST));
  247. } else {
  248. this.newFile(req.body.user, req.body.file, req.body.data, res);
  249. }
  250. } else {
  251. if (req.body.data === undefined) {
  252. res.json(error(ERR_REQUEST));
  253. } else {
  254. this.saveFile(req.body.user, req.body.data, res);
  255. }
  256. }
  257. }]);*/
  258. this.app.post('/rename/:file', [this.verbose, this.verifyAuth, (req, res) => {
  259. }]);
  260. this.app.delete('/:file', [this.verbose, this.verifyAuth, (req, res) => {
  261. }]);
  262. }
  263. };
  264. module.exports = router;
  265. /*
  266. app.get('/', function (req, res) {
  267. res.send('Hello World!');
  268. });
  269. app.get('/test/:val?', function (req, res) {
  270. console.log(req.params.val);
  271. res.send('Val = ' + req.params.val);
  272. });
  273. app.get(/.*aze$/, function (req, res) {
  274. res.send('URL end with aze');
  275. })
  276. */