Commit 69695d818e7189723b0be539b908d6492aa564c0
1 parent
cb1c1601
Serveur: Vérification des permissions de modifications de membres
Code amélioré en divers points
Showing
7 changed files
with
77 additions
and
46 deletions
Show diff stats
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 { |
app/routes/api.js
@@ -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"> |