Commit a470afda542fd8ff6240de72d7dbc019e7dcf9a8

Authored by Geoffrey PREUD'HOMME
1 parent ba3a9e89

Simplification des permissions

Vous pouvez mainteant éditer VOS messages.
Fix #12
app/routes/ApiRtes.js
@@ -2,8 +2,11 @@ var MembresServ = require('../services/MembresServ'); @@ -2,8 +2,11 @@ var MembresServ = require('../services/MembresServ');
2 var PolyUserServ = require('../services/PolyUserServ'); 2 var PolyUserServ = require('../services/PolyUserServ');
3 var DecryptServ = require('../services/DecryptServ'); 3 var DecryptServ = require('../services/DecryptServ');
4 var DosssServ = require('../services/DosssServ'); 4 var DosssServ = require('../services/DosssServ');
  5 +var DossModl = require('../models/DossModl');
5 var ConvsServ = require('../services/ConvsServ'); 6 var ConvsServ = require('../services/ConvsServ');
  7 +var ConvModl = require('../models/ConvModl');
6 var MessServ = require('../services/MessServ'); 8 var MessServ = require('../services/MessServ');
  9 +var MessModl = require('../models/MessModl'); // TODO Unfier ce bazar / supprimer Serv
7 var fs = require('fs'); 10 var fs = require('fs');
8 var mongoose = require('mongoose'); 11 var mongoose = require('mongoose');
9 var express = require('express'); 12 var express = require('express');
@@ -44,9 +47,21 @@ reqVerified = function (verify) { // Assert mais pour les droits (d'où le 403) @@ -44,9 +47,21 @@ reqVerified = function (verify) { // Assert mais pour les droits (d'où le 403)
44 }; 47 };
45 }; 48 };
46 49
47 -reqPerm = function (perm) { 50 +reqOwn = function (objName) {
48 return reqVerified(function (req, res, cb) { 51 return reqVerified(function (req, res, cb) {
49 - cb(null, req.session.data[perm]); 52 + cb(null, req.session.data.bureau || req[objName].login == req.session.data.login);
  53 + });
  54 +};
  55 +
  56 +reqMembre = function () {
  57 + return reqVerified(function (req, res, cb) {
  58 + cb(null, req.session.data.membre);
  59 + });
  60 +};
  61 +
  62 +reqBureau = function () {
  63 + return reqVerified(function (req, res, cb) {
  64 + cb(null, req.session.data.bureau);
50 }); 65 });
51 }; 66 };
52 67
@@ -86,19 +101,12 @@ sessionData = function (session, cb) { @@ -86,19 +101,12 @@ sessionData = function (session, cb) {
86 // Nom 101 // Nom
87 session.nom = nom.nom; 102 session.nom = nom.nom;
88 session.section = nom.section; 103 session.section = nom.section;
89 - MembresServ.estBureau(session.login, function (bureau) {  
90 - session.bureau = bureau;  
91 - // Permissions  
92 - session.canAddMembre = session.bureau;  
93 - session.canDelMembre = session.bureau;  
94 - session.canAddDoss = session.bureau;  
95 - session.canDelDoss = session.bureau;  
96 - session.canAddConv = true;  
97 - session.canDelConv = session.bureau;  
98 - session.canAddMess = true;  
99 - session.canEditMess = session.bureau;  
100 - session.canDelMess = session.bureau;  
101 - cb(session); 104 + MembresServ.estMembre(session.login, function (membre) { // TODO Asyc
  105 + session.membre = membre;
  106 + MembresServ.estBureau(session.login, function (bureau) {
  107 + session.bureau = bureau;
  108 + cb(session);
  109 + });
102 }); 110 });
103 }); 111 });
104 }; 112 };
@@ -133,7 +141,7 @@ api.post('/session', decrypt(), assert(function (req, res, cb) { @@ -133,7 +141,7 @@ api.post('/session', decrypt(), assert(function (req, res, cb) {
133 req.session.data = session; 141 req.session.data = session;
134 req.session.save(function (err) { 142 req.session.save(function (err) {
135 if (err) { 143 if (err) {
136 - res.status(500).end("Sauvegarde session"); 144 + res.status(500).end(err);
137 } else { 145 } else {
138 res.status(201).send(session); 146 res.status(201).send(session);
139 } 147 }
@@ -142,7 +150,7 @@ api.post('/session', decrypt(), assert(function (req, res, cb) { @@ -142,7 +150,7 @@ api.post('/session', decrypt(), assert(function (req, res, cb) {
142 } else { 150 } else {
143 req.session.destroy(function (err) { 151 req.session.destroy(function (err) {
144 if (err) { 152 if (err) {
145 - res.status(500).end("Suppression de la session"); 153 + res.status(500).end(err);
146 } else { 154 } else {
147 res.status(401).end(); 155 res.status(401).end();
148 } 156 }
@@ -170,7 +178,7 @@ api.get('/membres', function (req, res) { // Liste des membres @@ -170,7 +178,7 @@ api.get('/membres', function (req, res) { // Liste des membres
170 178
171 api.post('/membres', assert(function (req, res, cb) { 179 api.post('/membres', assert(function (req, res, cb) {
172 cb(null, typeof req.body.login == 'string' && req.body.login !== ''); 180 cb(null, typeof req.body.login == 'string' && req.body.login !== '');
173 -}), reqPerm('canAddMembre'), function (req, res) { // Ajout d'un membre 181 +}), reqBureau(), function (req, res) { // Ajout d'un membre
174 MembresServ.add(req.body, function (err, membre) { 182 MembresServ.add(req.body, function (err, membre) {
175 if (err) 183 if (err)
176 res.status(500).send(err); 184 res.status(500).send(err);
@@ -179,7 +187,7 @@ api.post('/membres', assert(function (req, res, cb) { @@ -179,7 +187,7 @@ api.post('/membres', assert(function (req, res, cb) {
179 }); 187 });
180 }); 188 });
181 189
182 -api.delete('/membres/:membre_id', reqPerm('canDelMembre'), function (req, res) { // Supression d'un membre 190 +api.delete('/membres/:membre_id', reqBureau(), function (req, res) { // Supression d'un membre
183 MembresServ.remove(req.params.membre_id, function (err, membre) { 191 MembresServ.remove(req.params.membre_id, function (err, membre) {
184 if (err) 192 if (err)
185 res.status(500).send(err); 193 res.status(500).send(err);
@@ -189,14 +197,14 @@ api.delete('/membres/:membre_id', reqPerm('canDelMembre'), function (req, res) { @@ -189,14 +197,14 @@ api.delete('/membres/:membre_id', reqPerm('canDelMembre'), function (req, res) {
189 }); 197 });
190 198
191 // Dossiers 199 // Dossiers
192 -api.get('/dosss/:doss_id', function (req, res) { // Un doss 200 +api.get('/dosss/:doss_id', reqAuth(), function (req, res) { // Un doss
193 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect) 201 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
194 // TODO Requêtes séparées ? 202 // TODO Requêtes séparées ?
195 DosssServ.get(req.params.doss_id, function (err, doss) { // TODO Async 203 DosssServ.get(req.params.doss_id, function (err, doss) { // TODO Async
196 if (err) { 204 if (err) {
197 res.status(500).send(err); 205 res.status(500).send(err);
198 } else if (!doss) { 206 } else if (!doss) {
199 - res.status(404); 207 + res.status(404).end();
200 } else { 208 } else {
201 DosssServ.children(doss._id, function (err, dosss) { 209 DosssServ.children(doss._id, function (err, dosss) {
202 if (err) { 210 if (err) {
@@ -217,7 +225,7 @@ api.get('/dosss/:doss_id', function (req, res) { // Un doss @@ -217,7 +225,7 @@ api.get('/dosss/:doss_id', function (req, res) { // Un doss
217 }); 225 });
218 }); 226 });
219 227
220 -api.post('/dosss', reqPerm('canAddDoss'), function (req, res) { // Ajout d'un doss 228 +api.post('/dosss', reqMembre(), function (req, res) { // Ajout d'un doss
221 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect) 229 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
222 DosssServ.getId(req.body.parent, function (parent) { // TODO Async 230 DosssServ.getId(req.body.parent, function (parent) { // TODO Async
223 req.body.parent = parent; 231 req.body.parent = parent;
@@ -230,7 +238,7 @@ api.post('/dosss', reqPerm('canAddDoss'), function (req, res) { // Ajout d'un do @@ -230,7 +238,7 @@ api.post('/dosss', reqPerm('canAddDoss'), function (req, res) { // Ajout d'un do
230 }); 238 });
231 }); 239 });
232 240
233 -api.delete('/dosss/:doss_id', reqPerm('canDelDoss'), function (req, res) { // Supression d'un doss 241 +api.delete('/dosss/:doss_id', reqBureau(), function (req, res) { // Supression d'un doss
234 DosssServ.remove(req.params.doss_id, function (err, doss) { 242 DosssServ.remove(req.params.doss_id, function (err, doss) {
235 if (err) 243 if (err)
236 res.status(500).send(err); 244 res.status(500).send(err);
@@ -240,16 +248,27 @@ api.delete('/dosss/:doss_id', reqPerm('canDelDoss'), function (req, res) { // Su @@ -240,16 +248,27 @@ api.delete('/dosss/:doss_id', reqPerm('canDelDoss'), function (req, res) { // Su
240 }); 248 });
241 249
242 // Conversations 250 // Conversations
243 -api.get('/convs/:conv_id', function (req, res) { // Une conv  
244 - ConvsServ.get(req.params.conv_id, function (err, conv) {  
245 - if (err)  
246 - res.status(500).send(err);  
247 - else  
248 - res.json(conv); 251 +
  252 +getConv = function (req, res, next) {
  253 + ConvModl.findById(req.params.conv_id, function (err, conv) {
  254 + if (err) {
  255 + res.status(500).json(err);
  256 + } else {
  257 + if (conv) {
  258 + req.conv = conv;
  259 + next();
  260 + } else {
  261 + res.status(404).end();
  262 + }
  263 + }
249 }); 264 });
  265 +};
  266 +
  267 +api.get('/convs/:conv_id', reqAuth(), getConv, function (req, res) { // Une conv
  268 + res.json(req.conv);
250 }); 269 });
251 270
252 -api.post('/convs', reqPerm('canAddConv'), function (req, res) { // Ajout d'un conv 271 +api.post('/convs', reqMembre(), function (req, res) { // Ajout d'un conv
253 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect) 272 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
254 DosssServ.getId(req.body.parent, function (parent) { // TODO Async 273 DosssServ.getId(req.body.parent, function (parent) { // TODO Async
255 req.body.parent = parent; 274 req.body.parent = parent;
@@ -262,12 +281,12 @@ api.post('/convs', reqPerm('canAddConv'), function (req, res) { // Ajout d'un co @@ -262,12 +281,12 @@ api.post('/convs', reqPerm('canAddConv'), function (req, res) { // Ajout d'un co
262 }); 281 });
263 }); 282 });
264 283
265 -api.delete('/convs/:conv_id', reqPerm('canDelConv'), function (req, res) { // Supression d'un conv  
266 - ConvsServ.remove(req.params.conv_id, function (err, conv) {  
267 - if (err) 284 +api.delete('/convs/:conv_id', reqBureau(), getConv, function (req, res) { // Supression d'un conv
  285 + req.conv.remove(function (err) {
  286 + if (err) // TODO Fonction propre
268 res.status(500).send(err); 287 res.status(500).send(err);
269 else 288 else
270 - res.json(null); 289 + res.status(205).end();
271 }); 290 });
272 }); 291 });
273 292
@@ -281,16 +300,16 @@ api.get('/messs/:conv_id', reqAuth(), function (req, res) { // Liste des messs @@ -281,16 +300,16 @@ api.get('/messs/:conv_id', reqAuth(), function (req, res) { // Liste des messs
281 }); 300 });
282 }); 301 });
283 302
284 -api.get('/messs/:mess_id', reqAuth(), function (req, res) { // Une mess  
285 - MessServ.get(req.params.mess_id, function (err, mess) {  
286 - if (err)  
287 - res.status(500).send(err);  
288 - else  
289 - res.json(mess);  
290 - });  
291 -}); 303 +// api.get('/messs/:mess_id', reqAuth(), function (req, res) { // Une mess
  304 +// MessServ.get(req.params.mess_id, function (err, mess) {
  305 +// if (err)
  306 +// res.status(500).send(err);
  307 +// else
  308 +// res.json(mess);
  309 +// });
  310 +// });
292 311
293 -api.post('/messs', reqPerm('canAddMess'), function (req, res) { // Ajout d'un mess 312 +api.post('/messs', reqMembre(), function (req, res) { // Ajout d'un mess
294 data = req.body; 313 data = req.body;
295 data.login = req.session.data.login; 314 data.login = req.session.data.login;
296 MessServ.add(data, function (err, mess) { 315 MessServ.add(data, function (err, mess) {
@@ -301,27 +320,50 @@ api.post('/messs', reqPerm('canAddMess'), function (req, res) { // Ajout d'un me @@ -301,27 +320,50 @@ api.post('/messs', reqPerm('canAddMess'), function (req, res) { // Ajout d'un me
301 }); 320 });
302 }); 321 });
303 322
304 -api.put('/messs', reqPerm('canEditMess'), function (req, res) { // Édition d'un message  
305 - MessServ.edit(req.body, function (err, mess) {  
306 - console.log('CALLED', err, mess); 323 +api.put('/messs', reqMembre(), function (req, res, next) { // Édition d'un mess
  324 + MessModl.findById(req.body._id, function (err, mess) { // TODO Fonction propre
  325 + // TODO Utiliser req.params
307 if (err) { 326 if (err) {
308 - if (err == 'notfound') {  
309 - res.status(404).end(); 327 + res.status(500).json(err);
  328 + } else {
  329 + if (mess) {
  330 + req.mess = mess;
  331 + next();
310 } else { 332 } else {
311 - res.status(500).json(err); 333 + res.status(404).end();
312 } 334 }
313 - } else {  
314 - res.status(201).json(mess);  
315 } 335 }
316 }); 336 });
  337 +}, reqOwn('mess'), function (req, res) {
  338 + req.mess.content = req.body.content;
  339 + // TODO Edit date
  340 + req.mess.save(function (err, mess) {
  341 + if (err) // TODO Fonction propre
  342 + res.status(500).send(err);
  343 + else
  344 + res.json(mess);
  345 + });
317 }); 346 });
318 347
319 -api.delete('/messs/:mess_id', reqPerm('canDelMess'), function (req, res) { // Supression d'un mess  
320 - MessServ.remove(req.params.mess_id, function (err, mess) {  
321 - if (err) 348 +api.delete('/messs/:mess_id', reqMembre(), function (req, res, next) { // Supression d'un mess
  349 + MessModl.findById(req.params.mess_id, function (err, mess) { // TODO Fonction propre
  350 + if (err) {
  351 + res.status(500).json(err);
  352 + } else {
  353 + if (mess) {
  354 + req.mess = mess;
  355 + next();
  356 + } else {
  357 + res.status(404).end();
  358 + }
  359 + }
  360 + });
  361 +}, reqOwn('mess'), function (req, res) {
  362 + req.mess.remove(function (err) {
  363 + if (err) // TODO Fonction propre
322 res.status(500).send(err); 364 res.status(500).send(err);
323 else 365 else
324 - res.json(null); 366 + res.status(205).end();
325 }); 367 });
326 }); 368 });
327 369
app/services/MembresServ.js
@@ -46,6 +46,18 @@ MembresServ.remove = function (id, cb) { @@ -46,6 +46,18 @@ MembresServ.remove = function (id, cb) {
46 }, cb); 46 }, cb);
47 }; 47 };
48 48
  49 +MembresServ.estMembre = function (login, cb) {
  50 + MembreModl.findOne({
  51 + login: login
  52 + }, function (err, data) {
  53 + if (!err && data) {
  54 + cb(true);
  55 + } else {
  56 + cb(false);
  57 + }
  58 + });
  59 +};
  60 +
49 MembresServ.estBureau = function (login, cb) { 61 MembresServ.estBureau = function (login, cb) {
50 MembreModl.findOne({ 62 MembreModl.findOne({
51 login: login 63 login: login
public/js/controllers/ForumConvCtrl.js
@@ -57,4 +57,8 @@ angular.module('ForumConvCtrl', ['SessionsServ', 'ApiServ', 'MessEditDrct']) @@ -57,4 +57,8 @@ angular.module('ForumConvCtrl', ['SessionsServ', 'ApiServ', 'MessEditDrct'])
57 } 57 }
58 }; 58 };
59 59
  60 + $scope.mine = function (mess) {
  61 + return $scope.session.bureau || mess.login == $scope.session.login;
  62 + };
  63 +
60 }); 64 });
public/js/controllers/ForumDirCtrl.js
@@ -59,4 +59,8 @@ angular.module('ForumDirCtrl', ['SessionsServ', 'ApiServ']) @@ -59,4 +59,8 @@ angular.module('ForumDirCtrl', ['SessionsServ', 'ApiServ'])
59 }); 59 });
60 }; 60 };
61 61
  62 + $scope.mine = function (obj) {
  63 + return $scope.session.bureau;
  64 + };
  65 +
62 }); 66 });
public/js/services/ApiServ.js
@@ -13,7 +13,7 @@ angular.module('ApiServ', ['NotifyServ']) @@ -13,7 +13,7 @@ angular.module('ApiServ', ['NotifyServ'])
13 }; 13 };
14 } 14 }
15 15
16 - if (method == 'get' || method == 'delete') { 16 + if (method == 'get' || method == 'delete') { // TODO url & data en même temps
17 for (arg = 3; arg < arglen; arg++) { 17 for (arg = 3; arg < arglen; arg++) {
18 link += '/' + arguments[arg]; 18 link += '/' + arguments[arg];
19 } 19 }
public/views/forumConv.html
@@ -28,16 +28,16 @@ @@ -28,16 +28,16 @@
28 <td mess-edit></td> 28 <td mess-edit></td>
29 <td> 29 <td>
30 <mess-viewsource></mess-viewsource> 30 <mess-viewsource></mess-viewsource>
31 - <button type="button" class="btn btn-primary" ng-show="session.canEditMess" ng-click="editButton($index)"> 31 + <button type="button" class="btn btn-primary" ng-show="mine(mess)" ng-click="editButton($index)">
32 <span class="glyphicon glyphicon-edit" aria-hidden="true" ng-hide="mess.editMode"></span> 32 <span class="glyphicon glyphicon-edit" aria-hidden="true" ng-hide="mess.editMode"></span>
33 <span class="glyphicon glyphicon-ok" aria-hidden="true" ng-show="mess.editMode"></span> 33 <span class="glyphicon glyphicon-ok" aria-hidden="true" ng-show="mess.editMode"></span>
34 </button> 34 </button>
35 - <button type="button" class="btn btn-danger" ng-show="session.canDelMess" ng-click="delMess($index)"> 35 + <button type="button" class="btn btn-danger" ng-show="mine(mess)" ng-click="delMess($index)">
36 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> 36 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
37 </button> 37 </button>
38 </td> 38 </td>
39 </tr> 39 </tr>
40 - <tr ng-show="session.canAddMess"> 40 + <tr ng-show="session.membre">
41 <form ng-init="mess = {content: '', editMode: true, viewSource: true}"> 41 <form ng-init="mess = {content: '', editMode: true, viewSource: true}">
42 <td> 42 <td>
43 <label for="nvMessTitre">Nouveau message</label> 43 <label for="nvMessTitre">Nouveau message</label>
public/views/forumDir.html
@@ -31,16 +31,16 @@ @@ -31,16 +31,16 @@
31 {{ doss.date }} 31 {{ doss.date }}
32 </td> 32 </td>
33 <td> 33 <td>
34 - <button type="button" class="btn btn-default" ng-show="session.canAbonner"> 34 + <button type="button" class="btn btn-default" ng-show="session.membre && implemented">
35 <span class="glyphicon glyphicon-eye-open" aria-hidden="true" ng-show="doss.abonne"></span> 35 <span class="glyphicon glyphicon-eye-open" aria-hidden="true" ng-show="doss.abonne"></span>
36 <span class="glyphicon glyphicon-eye-close" aria-hidden="true" ng-hide="doss.abonne"></span> 36 <span class="glyphicon glyphicon-eye-close" aria-hidden="true" ng-hide="doss.abonne"></span>
37 </button> 37 </button>
38 - <button type="button" class="btn btn-danger" ng-show="session.canDelDoss" ng-click="delDoss($index)"> 38 + <button type="button" class="btn btn-danger" ng-show="mine(doss)" ng-click="delDoss($index)">
39 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> 39 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
40 </button> 40 </button>
41 </td> 41 </td>
42 </tr> 42 </tr>
43 - <tr ng-show="session.canAddDoss"> 43 + <tr ng-show="session.membre">
44 <form> 44 <form>
45 <td class="form-group"> 45 <td class="form-group">
46 <label for="nvDossTitre">Nouveau dossier</label> 46 <label for="nvDossTitre">Nouveau dossier</label>
@@ -73,16 +73,16 @@ @@ -73,16 +73,16 @@
73 {{ conv.date }} 73 {{ conv.date }}
74 </td> 74 </td>
75 <td> 75 <td>
76 - <button type="button" class="btn btn-default" ng-show="session.canAbonner"> 76 + <button type="button" class="btn btn-default" ng-show="session.membre && implemented">
77 <span class="glyphicon glyphicon-eye-open" aria-hidden="true" ng-show="conv.abonne"></span> 77 <span class="glyphicon glyphicon-eye-open" aria-hidden="true" ng-show="conv.abonne"></span>
78 <span class="glyphicon glyphicon-eye-close" aria-hidden="true" ng-hide="conv.abonne"></span> 78 <span class="glyphicon glyphicon-eye-close" aria-hidden="true" ng-hide="conv.abonne"></span>
79 </button> 79 </button>
80 - <button type="button" class="btn btn-danger" ng-show="session.canDelConv" ng-click="delConv($index)"> 80 + <button type="button" class="btn btn-danger" ng-show="mine(conv)" ng-click="delConv($index)">
81 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> 81 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
82 </button> 82 </button>
83 </td> 83 </td>
84 </tr> 84 </tr>
85 - <tr ng-show="session.canAddConv"> 85 + <tr ng-show="session.membre">
86 <form> 86 <form>
87 <td class="form-group"> 87 <td class="form-group">
88 <label for="nvConvTitre">Nouvelle conversation</label> 88 <label for="nvConvTitre">Nouvelle conversation</label>