db.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. const fs = require('fs');
  2. const sqlite = require('sqlite3');
  3. const crypto = require('crypto');
  4. const sql = require('./sql');
  5. // Indique si un fichier existe
  6. function fileExist(path) {
  7. try {
  8. return fs.existsSync(path);
  9. } catch (err) {
  10. return false;
  11. }
  12. }
  13. // Class Db
  14. function Db() {
  15. // Verbeux ou non
  16. if (global.sqlVerbose) {
  17. sqlite.verbose();
  18. }
  19. // Connection à la base
  20. const exist = fileExist(this.DB_PATH);
  21. this.db = new sqlite.Database(this.DB_PATH);
  22. // Création si besoins de la base
  23. if (!exist) {
  24. this.createDb();
  25. }
  26. }
  27. Db.prototype.DB_PATH = './data/sss.db';
  28. Db.prototype.createDb = function () {
  29. this._execute(sql.createUserTable);
  30. this._execute(sql.createFileTable);
  31. this._execute(sql.createUserFileTable);
  32. };
  33. Db.prototype.userExist = function (username) {
  34. if (typeof username !== 'string') {
  35. return false;
  36. }
  37. return new Promise((resolve, reject) => {
  38. this.db.all(sql.userExist, username, (err, rows) => {
  39. if (err) {
  40. if (global.verbose) {
  41. console.error(err);
  42. }
  43. resolve(false);
  44. } else {
  45. resolve(rows[0].nb > 0);
  46. }
  47. });
  48. });
  49. };
  50. Db.prototype.getUser = function (username) {
  51. if (typeof username !== 'string') {
  52. return false;
  53. }
  54. return new Promise((resolve, reject) => {
  55. this.db.all(sql.getUser, username, (err, rows) => {
  56. if (err) {
  57. if (global.verbose) {
  58. console.error(err);
  59. }
  60. resolve(false);
  61. } else {
  62. resolve(rows[0]);
  63. }
  64. });
  65. });
  66. };
  67. Db.prototype.addUser = function (username, passwordhash) {
  68. if (typeof username !== 'string' && typeof passwordhash !== 'string') {
  69. return false;
  70. }
  71. return new Promise((resolve, resject) => {
  72. this.userExist(username).then((result) => {
  73. if (!result) {
  74. this._execute(sql.insertUser, [username, passwordhash]);
  75. resolve(true);
  76. } else {
  77. resolve(false);
  78. }
  79. });
  80. });
  81. };
  82. Db.prototype.listFile = function (username) {
  83. if (typeof username !== 'string') {
  84. return false;
  85. }
  86. return new Promise((resolve, reject) => {
  87. this.db.all(sql.listFile, username, (err, rows) => {
  88. if (err) {
  89. if (global.verbose) {
  90. console.error(err);
  91. }
  92. resolve(false);
  93. } else {
  94. resolve(rows);
  95. }
  96. });
  97. });
  98. };
  99. Db.prototype.fileExist = function (username, fileId) {
  100. if (typeof username !== 'string' || typeof fileId !== 'string') {
  101. return false;
  102. }
  103. return new Promise((resolve, reject) => {
  104. this.db.all(sql.fileExist, [username, fileId], (err, rows) => {
  105. if (err) {
  106. if (global.verbose) {
  107. console.error(err);
  108. }
  109. resolve(false);
  110. } else {
  111. resolve(rows[0].nb > 0);
  112. }
  113. });
  114. });
  115. };
  116. Db.prototype.getFile = function (username, fileId) {
  117. if (typeof username !== 'string' || typeof fileId !== 'string') {
  118. return false;
  119. }
  120. return new Promise((resolve, reject) => {
  121. this.db.all(sql.getFile, [username, fileId], (err, rows) => {
  122. if (err) {
  123. if (global.verbose) {
  124. console.error(err);
  125. }
  126. resolve(false);
  127. } else {
  128. // Regarde si il y a des resultat
  129. if (rows.length > 0) {
  130. resolve(rows[0]);
  131. } else {
  132. resolve(null);
  133. }
  134. }
  135. });
  136. });
  137. };
  138. Db.prototype.addFile = function (username, filename, data) {
  139. if (typeof username !== 'string' || typeof filename !== 'string' || typeof data !== 'string') {
  140. return false;
  141. }
  142. // Ajout du fichier
  143. return new Promise((resolve, reject) => {
  144. // Ajoute les données de base du fichier
  145. this._execute(sql.addFile, [filename, data]);
  146. // Recupère l'id du fichier
  147. this.db.all(sql.lastId, (err, rows) => {
  148. if (err) {
  149. if (global.verbose) {
  150. console.error(err);
  151. }
  152. resolve(false);
  153. } else {
  154. const fileId = rows[0].lastId;
  155. //Calcul du hash
  156. let hash = fileId + '-' + username + '-' + filename;
  157. hash = crypto.createHash('md5').update(hash).digest('base64');
  158. hash = hash.replace(/=/g, '').replace(/\//g, '');
  159. // Ajoute le hash
  160. this._execute(sql.addFileHash, [hash, fileId]);
  161. // Recupération de l'utilisateur
  162. this.getUser(username).then((user) => {
  163. if (user === false) {
  164. resolve(false);
  165. } else {
  166. // Ajoute le lien entre utilisateur et fichier
  167. this._execute(sql.addUserFile, [user.id, fileId]);
  168. // Retourne le hash du fichier
  169. resolve(hash);
  170. }
  171. });
  172. }
  173. });
  174. });
  175. };
  176. Db.prototype.updateFile = function (username, fileId, data) {
  177. if (typeof username !== 'string' || typeof fileId !== 'string' || typeof data !== 'string') {
  178. return false;
  179. }
  180. // Met à jour les données du fichier
  181. return new Promise((resolve, reject) => {
  182. this.fileExist(username, fileId).then((result) => {
  183. if (result) {
  184. this._execute(sql.updateFile, [data, fileId]);
  185. resolve(true);
  186. } else {
  187. if (gobal.verbose) {
  188. console.info(`File ${fileId} for user ${username} not found`);
  189. }
  190. resolve(false);
  191. }
  192. });
  193. });
  194. };
  195. Db.prototype.renameFile = function (username, fileId, name) {
  196. if (typeof username !== 'string' || typeof fileId !== 'string' || typeof name !== 'string') {
  197. return false;
  198. }
  199. // Met à jour le nom du fichier
  200. return new Promise((resolve, reject) => {
  201. this.fileExist(username, fileId).then((result) => {
  202. if (result) {
  203. this._execute(sql.renameFile, [name, fileId]);
  204. resolve(true);
  205. } else {
  206. if (gobal.verbose) {
  207. console.info(`File ${fileId} for user ${username} not found`);
  208. }
  209. resolve(false);
  210. }
  211. });
  212. });
  213. };
  214. Db.prototype.deleteFile = function (username, fileId) {
  215. if (typeof username !== 'string' || typeof fileId !== 'string') {
  216. return false;
  217. }
  218. // Supprime le fichier
  219. return new Promise((resolve, reject) => {
  220. this.getFile(username, fileId).then((file) => {
  221. if (file === false) {
  222. if (gobal.verbose) {
  223. console.info(`File ${fileId} for user ${username} not found`);
  224. }
  225. resolve(false);
  226. } else {
  227. this._execute(sql.deleteUserFile, file.id);
  228. this._execute(sql.deleteFile, file.id);
  229. resolve(true);
  230. }
  231. });
  232. });
  233. };
  234. Db.prototype.countFile = function () {
  235. return new Promise((resolve, reject) => {
  236. this.db.all(sql.countFile, (err, rows) => {
  237. if (err) {
  238. if (global.verbose) {
  239. console.error(err);
  240. }
  241. resolve(false);
  242. } else {
  243. resolve(rows[0].nb);
  244. }
  245. });
  246. });
  247. };
  248. Db.prototype.resetDatabase = function () {
  249. this._execute(sql.deleteUserFile);
  250. this._execute(sql.deleteFile);
  251. this._execute(sql.deleteUser);
  252. };
  253. Db.prototype._execute = function (sql, params) {
  254. try {
  255. if (params !== undefined && params !== null) {
  256. this.db.run(sql, params);
  257. } else {
  258. this.db.run(sql);
  259. }
  260. } catch (err) {
  261. if (global.verbose) {
  262. console.error(err);
  263. }
  264. throw new Error('Error during request');
  265. }
  266. };
  267. // Export
  268. module.exports = new Db();