Commit 69695d818e7189723b0be539b908d6492aa564c0

Authored by Geoffrey PREUD'HOMME
1 parent cb1c1601

Serveur: Vérification des permissions de modifications de membres

Code amélioré en divers points
app/controllers/sessions.js
@@ -3,6 +3,8 @@ var noms = require('../controllers/noms'); @@ -3,6 +3,8 @@ var noms = require('../controllers/noms');
3 3
4 var sessions = {} 4 var sessions = {}
5 5
  6 +sessions.cur = false
  7 +
6 sessions.addData = function (session, cb) { 8 sessions.addData = function (session, cb) {
7 noms.get(session.login, function (nom) { 9 noms.get(session.login, function (nom) {
8 if (typeof nom == 'string') { 10 if (typeof nom == 'string') {
@@ -10,6 +12,8 @@ sessions.addData = function (session, cb) { @@ -10,6 +12,8 @@ sessions.addData = function (session, cb) {
10 } else { 12 } else {
11 session.nom = 'Inconnu' 13 session.nom = 'Inconnu'
12 } 14 }
  15 + session.canAddMembre = session.login == 'gbontoux'
  16 + session.canDelMembre = session.login == 'gbontoux'
13 cb(session) 17 cb(session)
14 }) 18 })
15 } 19 }
@@ -45,7 +49,7 @@ sessions.verify = function (id, cb) { @@ -45,7 +49,7 @@ sessions.verify = function (id, cb) {
45 } else { 49 } else {
46 if (session) { 50 if (session) {
47 if (sessions.valid(session)) { 51 if (sessions.valid(session)) {
48 - cb(err, session); 52 + cb(null, session);
49 } else { 53 } else {
50 cb('expired'); 54 cb('expired');
51 _this.delete(id) 55 _this.delete(id)
@@ -57,6 +61,18 @@ sessions.verify = function (id, cb) { @@ -57,6 +61,18 @@ sessions.verify = function (id, cb) {
57 }); 61 });
58 } 62 }
59 63
  64 +sessions.use = function (id, cb) {
  65 + _this = this
  66 + _this.verify(id, function (err, session) {
  67 + if (err) {
  68 + cb(err)
  69 + } else {
  70 + _this.cur = session
  71 + cb(null)
  72 + }
  73 + })
  74 +}
  75 +
60 sessions.create = function (login, cb) { 76 sessions.create = function (login, cb) {
61 Session.create({ 77 Session.create({
62 login: login 78 login: login
@@ -89,7 +105,7 @@ sessions.open = function (data, cb) { @@ -89,7 +105,7 @@ sessions.open = function (data, cb) {
89 if (err) { 105 if (err) {
90 cb('error'); 106 cb('error');
91 } else { 107 } else {
92 - _this.find(session._id, cb) 108 + _this.use(session._id, cb)
93 } 109 }
94 }); 110 });
95 } else { 111 } else {
@@ -7,11 +7,11 @@ var api = express() @@ -7,11 +7,11 @@ var api = express()
7 // Sessions 7 // Sessions
8 api.get('/session', function (req, res) { // Informations sur la session 8 api.get('/session', function (req, res) { // Informations sur la session
9 if (req.cookies && req.cookies.session) { 9 if (req.cookies && req.cookies.session) {
10 - sessions.verify(req.cookies.session, function (err, session) { 10 + sessions.use(req.cookies.session, function (err) {
11 if (err) { 11 if (err) {
12 res.send(err) 12 res.send(err)
13 } else { 13 } else {
14 - res.send(session) 14 + res.send(sessions.cur)
15 } 15 }
16 }) 16 })
17 // TODO si pas bon : res.clearCookie('session') 17 // TODO si pas bon : res.clearCookie('session')
@@ -21,12 +21,12 @@ api.get('/session', function (req, res) { // Informations sur la session @@ -21,12 +21,12 @@ api.get('/session', function (req, res) { // Informations sur la session
21 }); 21 });
22 22
23 api.post('/session', function (req, res) { // Se connecter 23 api.post('/session', function (req, res) { // Se connecter
24 - sessions.open(req.body, function (err, session) { 24 + sessions.open(req.body, function (err) {
25 if (err) { 25 if (err) {
26 res.send(err) 26 res.send(err)
27 } else { 27 } else {
28 - res.cookie('session', session._id);  
29 - res.send(session) 28 + res.cookie('session', sessions.cur._id);
  29 + res.send(sessions.cur)
30 } 30 }
31 }) 31 })
32 }) 32 })
@@ -42,6 +42,20 @@ api.delete('/session', function (req, res) { // Se déconnecter @@ -42,6 +42,20 @@ api.delete('/session', function (req, res) { // Se déconnecter
42 } 42 }
43 }) 43 })
44 44
  45 +ifPermission = function (req, res, perm, cb) {
  46 + sessions.use(req.cookies.session, function (err) {
  47 + if (err) {
  48 + res.status(403).end()
  49 + } else {
  50 + if (sessions.cur[perm]) {
  51 + cb()
  52 + } else {
  53 + res.status(403).end()
  54 + }
  55 + }
  56 + })
  57 +}
  58 +
45 59
46 // Membres 60 // Membres
47 api.get('/membres', function (req, res) { // Liste des membres 61 api.get('/membres', function (req, res) { // Liste des membres
@@ -53,27 +67,31 @@ api.get('/membres', function (req, res) { // Liste des membres @@ -53,27 +67,31 @@ api.get('/membres', function (req, res) { // Liste des membres
53 }); 67 });
54 68
55 api.post('/membres', function (req, res) { // Ajout d'un membre 69 api.post('/membres', function (req, res) { // Ajout d'un membre
56 - membres.add(req.body, function (err, membre) {  
57 - if (err)  
58 - res.send(err);  
59 - membres.list(function (err, membres) { 70 + ifPermission(req, res, 'canAddMembre', function () {
  71 + membres.add(req.body, function (err, membre) {
60 if (err) 72 if (err)
61 res.send(err); 73 res.send(err);
62 - res.json(membres); 74 + membres.list(function (err, membres) {
  75 + if (err)
  76 + res.send(err);
  77 + res.json(membres);
  78 + });
63 }); 79 });
64 - }); 80 + })
65 }); 81 });
66 82
67 api.delete('/membres/:membre_id', function (req, res) { // Supression d'un membre 83 api.delete('/membres/:membre_id', function (req, res) { // Supression d'un membre
68 - membres.remove(req.params.membre_id, function (err, membre) {  
69 - if (err)  
70 - res.send(err);  
71 - membres.list(function (err, membres) { 84 + ifPermission(req, res, 'canDelMembre', function () {
  85 + membres.remove(req.params.membre_id, function (err, membre) {
72 if (err) 86 if (err)
73 res.send(err); 87 res.send(err);
74 - res.json(membres); 88 + membres.list(function (err, membres) {
  89 + if (err)
  90 + res.send(err);
  91 + res.json(membres);
  92 + });
75 }); 93 });
76 - }); 94 + })
77 }) 95 })
78 96
79 module.exports = api; 97 module.exports = api;
80 \ No newline at end of file 98 \ No newline at end of file
public/js/controllers/MembreCtrl.js
1 angular.module('MembreCtrl', []).controller('MembreController', ['$scope', '$http', 'SessionService', 1 angular.module('MembreCtrl', []).controller('MembreController', ['$scope', '$http', 'SessionService',
2 function ($scope, $http, SessionService) { 2 function ($scope, $http, SessionService) {
3 $scope.formData = {}; 3 $scope.formData = {};
4 - $scope.canAdd = SessionService.logged  
5 - $scope.canDel = SessionService.logged  
6 4
7 - // when landing on the page, get all Membres and show them 5 + $scope.session = SessionService.cur
  6 + SessionService.onChange(function () {
  7 + $scope.session = SessionService.cur
  8 + })
  9 +
8 $http.get('/api/membres') 10 $http.get('/api/membres')
9 .success(function (data) { 11 .success(function (data) {
10 $scope.membres = data; 12 $scope.membres = data;
@@ -14,12 +16,11 @@ angular.module('MembreCtrl', []).controller('MembreController', ['$scope', '$htt @@ -14,12 +16,11 @@ angular.module('MembreCtrl', []).controller('MembreController', ['$scope', '$htt
14 console.log('Error: ' + data); 16 console.log('Error: ' + data);
15 }); 17 });
16 18
17 - // when submitting the add form, send the text to the node API  
18 $scope.createMembre = function () { 19 $scope.createMembre = function () {
19 console.log('Adding', $scope.formData); 20 console.log('Adding', $scope.formData);
20 $http.post('/api/membres', $scope.formData) 21 $http.post('/api/membres', $scope.formData)
21 .success(function (data) { 22 .success(function (data) {
22 - $scope.formData = {}; // clear the form so our user is ready to enter another 23 + $scope.formData = {};
23 $scope.membres = data; 24 $scope.membres = data;
24 }) 25 })
25 .error(function (data) { 26 .error(function (data) {
@@ -27,7 +28,6 @@ angular.module('MembreCtrl', []).controller('MembreController', ['$scope', '$htt @@ -27,7 +28,6 @@ angular.module('MembreCtrl', []).controller('MembreController', ['$scope', '$htt
27 }); 28 });
28 }; 29 };
29 30
30 - // delete a Membre after checking it  
31 $scope.deleteMembre = function (id) { 31 $scope.deleteMembre = function (id) {
32 $http.delete('/api/membres/' + id) 32 $http.delete('/api/membres/' + id)
33 .success(function (data) { 33 .success(function (data) {
public/js/controllers/SessionCtrl.js
1 angular.module('SessionsCtrl', []).controller('SessionController', ['$scope', 'SessionService', 1 angular.module('SessionsCtrl', []).controller('SessionController', ['$scope', 'SessionService',
2 function ($scope, SessionService) { 2 function ($scope, SessionService) {
3 - $scope.session = SessionService  
4 - // $scope.session.onChange(function () {  
5 - // // TODO  
6 - // }) 3 + $scope.session = SessionService.cur
  4 + $scope.disconnect = function () {
  5 + SessionService.disconnect()
  6 + }
  7 + SessionService.onChange(function () {
  8 + $scope.session = SessionService.cur
  9 + })
7 // $scope.$on("$destroy", function () { 10 // $scope.$on("$destroy", function () {
8 // // TODO 11 // // TODO
9 // }) 12 // })
public/js/services/SessionServ.js
1 angular.module('SessionsServ', []).service('SessionService', ['$http', 1 angular.module('SessionsServ', []).service('SessionService', ['$http',
2 function ($http) { 2 function ($http) {
3 a = { 3 a = {
4 - nom: "Invité",  
5 - logged: false, 4 + cur: false,
6 status: 0, 5 status: 0,
7 changeHandlers: [], 6 changeHandlers: [],
8 onChange: function (fun) { 7 onChange: function (fun) {
@@ -14,18 +13,15 @@ angular.module('SessionsServ', []).service('SessionService', ['$http', @@ -14,18 +13,15 @@ angular.module('SessionsServ', []).service('SessionService', ['$http',
14 } 13 }
15 }, 14 },
16 updateSessionInfos: function (data) { 15 updateSessionInfos: function (data) {
  16 + console.log("Connection:", data)
17 if (typeof data === 'object') { 17 if (typeof data === 'object') {
18 - console.log("Connected")  
19 - this.logged = true  
20 - this.nom = data.nom 18 + this.cur = data
21 } else { 19 } else {
22 -  
23 - this.logged = false 20 + this.cur = false
24 } 21 }
25 this.triggerChange() 22 this.triggerChange()
26 }, 23 },
27 get: function (cb) { // Fetch infos if needed 24 get: function (cb) { // Fetch infos if needed
28 - console.log("Session: get")  
29 if (status == 0) { 25 if (status == 0) {
30 this.status = 1 // Fetching 26 this.status = 1 // Fetching
31 _this = this 27 _this = this
@@ -41,11 +37,10 @@ angular.module('SessionsServ', []).service('SessionService', ['$http', @@ -41,11 +37,10 @@ angular.module('SessionsServ', []).service('SessionService', ['$http',
41 } 37 }
42 }) 38 })
43 } else { 39 } else {
44 - console.warn("get multiple times") 40 + console.warn("Unnecessary get() call")
45 } 41 }
46 }, 42 },
47 connect: function (login, pass, cb) { 43 connect: function (login, pass, cb) {
48 - console.log("Session: connecting with login:", login)  
49 _this = this 44 _this = this
50 $http.post('/api/session', { 45 $http.post('/api/session', {
51 login: login, 46 login: login,
@@ -62,9 +57,8 @@ angular.module('SessionsServ', []).service('SessionService', ['$http', @@ -62,9 +57,8 @@ angular.module('SessionsServ', []).service('SessionService', ['$http',
62 }) 57 })
63 }, 58 },
64 disconnect: function () { 59 disconnect: function () {
65 - console.log("Session: disconnect", this.name) 60 + this.updateSessionInfos(false)
66 $http.delete('/api/session') 61 $http.delete('/api/session')
67 - this.logged = false  
68 } 62 }
69 } 63 }
70 a.get() 64 a.get()
public/views/index.html
@@ -31,8 +31,8 @@ @@ -31,8 +31,8 @@
31 </ul> 31 </ul>
32 <ul class="nav navbar-nav navbar-right" ng-controller="SessionController"> 32 <ul class="nav navbar-nav navbar-right" ng-controller="SessionController">
33 <li> 33 <li>
34 - <a ng-hide="session.logged" href="/connect">Se connecter</a>  
35 - <a ng-show="session.logged" href="#" ng-click="session.disconnect()">{{ session.nom }} <span class="glyphicon glyphicon-off"></span></a> 34 + <a ng-hide="session" href="/connect">Se connecter</a>
  35 + <a ng-show="session" href="#" ng-click="disconnect()">{{ session.nom }} <span class="glyphicon glyphicon-off"></span></a>
36 </li> 36 </li>
37 </ul> 37 </ul>
38 </div> 38 </div>
public/views/membres.html
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 <th>Nom</th> 10 <th>Nom</th>
11 <th>Section</th> 11 <th>Section</th>
12 <th>Rôle</th> 12 <th>Rôle</th>
13 - <th ng-if="canAdd || canDel">Action</th> 13 + <th ng-if="session.canAddMembre || session.canDelMembre">Action</th>
14 </tr> 14 </tr>
15 </thead> 15 </thead>
16 <tbody ng-repeat="membre in membres"> 16 <tbody ng-repeat="membre in membres">
@@ -18,13 +18,13 @@ @@ -18,13 +18,13 @@
18 <td>{{ membre.login }}</td> 18 <td>{{ membre.login }}</td>
19 <td>{{ membre.section }}</td> 19 <td>{{ membre.section }}</td>
20 <td>{{ membre.role }}</td> 20 <td>{{ membre.role }}</td>
21 - <td ng-if="canDel"><button type="button" class="btn btn-danger" aria-label="Expulser" ng-click="deleteMembre(membre._id)"> 21 + <td ng-if="session.canDelMembre"><button type="button" class="btn btn-danger" aria-label="Expulser" ng-click="deleteMembre(membre._id)">
22 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> 22 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
23 </button> 23 </button>
24 </td> 24 </td>
25 </tr> 25 </tr>
26 </tbody> 26 </tbody>
27 - <tfoot id="membre-form" ng-if="canAdd"> 27 + <tfoot id="membre-form" ng-if="session.canAddMembre">
28 <tr class="form-group"> 28 <tr class="form-group">
29 <td> 29 <td>
30 <input type="text" class="form-control input-lg" placeholder="Login" ng-model="formData.login"> 30 <input type="text" class="form-control input-lg" placeholder="Login" ng-model="formData.login">