UNPKG

15.3 kBJavaScriptView Raw
1'use strict';
2
3var _regenerator = require('babel-runtime/regenerator');
4
5var _regenerator2 = _interopRequireDefault(_regenerator);
6
7var _getIterator2 = require('babel-runtime/core-js/get-iterator');
8
9var _getIterator3 = _interopRequireDefault(_getIterator2);
10
11var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
12
13var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
14
15var _createClass2 = require('babel-runtime/helpers/createClass');
16
17var _createClass3 = _interopRequireDefault(_createClass2);
18
19function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
21var ChatServiceError = require('./ChatServiceError');
22var Promise = require('bluebird');
23
24var _require = require('es6-mixin');
25
26var mixin = _require.mixin;
27
28var _require2 = require('./utils');
29
30var run = _require2.run;
31
32var DirectMessagingPermissions = function () {
33 function DirectMessagingPermissions(userName, directMessagingState) {
34 (0, _classCallCheck3.default)(this, DirectMessagingPermissions);
35
36 this.userName = userName;
37 this.directMessagingState = directMessagingState;
38 }
39
40 (0, _createClass3.default)(DirectMessagingPermissions, [{
41 key: 'checkList',
42 value: function checkList(author, listName) {
43 return this.directMessagingState.checkList(listName);
44 }
45 }, {
46 key: 'checkListValues',
47 value: function checkListValues(author, listName, values) {
48 var _this = this;
49
50 return this.checkList(author, listName).then(function () {
51 var _iteratorNormalCompletion = true;
52 var _didIteratorError = false;
53 var _iteratorError = undefined;
54
55 try {
56 for (var _iterator = (0, _getIterator3.default)(values), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
57 var name = _step.value;
58
59 if (name !== _this.userName) {
60 continue;
61 }
62 return Promise.reject(new ChatServiceError('notAllowed'));
63 }
64 } catch (err) {
65 _didIteratorError = true;
66 _iteratorError = err;
67 } finally {
68 try {
69 if (!_iteratorNormalCompletion && _iterator.return) {
70 _iterator.return();
71 }
72 } finally {
73 if (_didIteratorError) {
74 throw _iteratorError;
75 }
76 }
77 }
78
79 return Promise.resolve();
80 });
81 }
82 }, {
83 key: 'checkAcess',
84 value: function checkAcess(userName, bypassPermissions) {
85 if (userName === this.userName) {
86 return Promise.reject(new ChatServiceError('notAllowed'));
87 }
88 if (bypassPermissions) {
89 return Promise.resolve();
90 }
91 return run(this, _regenerator2.default.mark(function _callee() {
92 var blacklisted, whitelistOnly, whitelisted;
93 return _regenerator2.default.wrap(function _callee$(_context) {
94 while (1) {
95 switch (_context.prev = _context.next) {
96 case 0:
97 _context.next = 2;
98 return this.directMessagingState.hasInList('blacklist', userName);
99
100 case 2:
101 blacklisted = _context.sent;
102
103 if (!blacklisted) {
104 _context.next = 5;
105 break;
106 }
107
108 return _context.abrupt('return', Promise.reject(new ChatServiceError('notAllowed')));
109
110 case 5:
111 _context.next = 7;
112 return this.directMessagingState.whitelistOnlyGet();
113
114 case 7:
115 whitelistOnly = _context.sent;
116
117 if (whitelistOnly) {
118 _context.next = 10;
119 break;
120 }
121
122 return _context.abrupt('return', Promise.resolve());
123
124 case 10:
125 _context.next = 12;
126 return this.directMessagingState.hasInList('whitelist', userName);
127
128 case 12:
129 whitelisted = _context.sent;
130
131 if (!whitelisted) {
132 _context.next = 15;
133 break;
134 }
135
136 return _context.abrupt('return', Promise.resolve());
137
138 case 15:
139 return _context.abrupt('return', Promise.reject(new ChatServiceError('notAllowed')));
140
141 case 16:
142 case 'end':
143 return _context.stop();
144 }
145 }
146 }, _callee, this);
147 }));
148 }
149 }]);
150 return DirectMessagingPermissions;
151}();
152
153// Implements direct messaging state manipulations with the respect to
154// user's permissions.
155
156
157var DirectMessaging = function () {
158 function DirectMessaging(server, userName) {
159 (0, _classCallCheck3.default)(this, DirectMessaging);
160
161 this.server = server;
162 this.userName = userName;
163 this.listSizeLimit = this.server.directListSizeLimit;
164 var State = this.server.state.DirectMessagingState;
165 this.directMessagingState = new State(this.server, this.userName);
166 mixin(this, DirectMessagingPermissions, this.userName, this.directMessagingState);
167 }
168
169 (0, _createClass3.default)(DirectMessaging, [{
170 key: 'initState',
171 value: function initState(state) {
172 return this.directMessagingState.initState(state);
173 }
174 }, {
175 key: 'removeState',
176 value: function removeState() {
177 return this.directMessagingState.removeState();
178 }
179 }, {
180 key: 'message',
181 value: function message(author, msg, bypassPermissions) {
182 return this.checkAcess(author, bypassPermissions);
183 }
184 }, {
185 key: 'getList',
186 value: function getList(author, listName) {
187 var _this2 = this;
188
189 return this.checkList(author, listName).then(function () {
190 return _this2.directMessagingState.getList(listName);
191 });
192 }
193 }, {
194 key: 'addToList',
195 value: function addToList(author, listName, values) {
196 var _this3 = this;
197
198 return this.checkListValues(author, listName, values).then(function () {
199 return _this3.directMessagingState.addToList(listName, values, _this3.listSizeLimit);
200 });
201 }
202 }, {
203 key: 'removeFromList',
204 value: function removeFromList(author, listName, values) {
205 var _this4 = this;
206
207 return this.checkListValues(author, listName, values).then(function () {
208 return _this4.directMessagingState.removeFromList(listName, values);
209 });
210 }
211 }, {
212 key: 'hasInList',
213 value: function hasInList(listName, item) {
214 return this.directMessagingState.hasInList(listName, item);
215 }
216 }, {
217 key: 'getMode',
218 value: function getMode(author) {
219 return this.directMessagingState.whitelistOnlyGet();
220 }
221 }, {
222 key: 'changeMode',
223 value: function changeMode(author, mode) {
224 return this.directMessagingState.whitelistOnlySet(mode);
225 }
226 }]);
227 return DirectMessaging;
228}();
229
230module.exports = DirectMessaging;
231//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9EaXJlY3RNZXNzYWdpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTSxtQkFBbUIsUUFBUSxvQkFBUixDQUF6QjtBQUNBLElBQU0sVUFBVSxRQUFRLFVBQVIsQ0FBaEI7O2VBQ2tCLFFBQVEsV0FBUixDOztJQUFWLEssWUFBQSxLOztnQkFDUSxRQUFRLFNBQVIsQzs7SUFBUixHLGFBQUEsRzs7SUFFRiwwQjtBQUVKLHNDQUFhLFFBQWIsRUFBdUIsb0JBQXZCLEVBQTZDO0FBQUE7O0FBQzNDLFNBQUssUUFBTCxHQUFnQixRQUFoQjtBQUNBLFNBQUssb0JBQUwsR0FBNEIsb0JBQTVCO0FBQ0Q7Ozs7OEJBRVUsTSxFQUFRLFEsRUFBVTtBQUMzQixhQUFPLEtBQUssb0JBQUwsQ0FBMEIsU0FBMUIsQ0FBb0MsUUFBcEMsQ0FBUDtBQUNEOzs7b0NBRWdCLE0sRUFBUSxRLEVBQVUsTSxFQUFRO0FBQUE7O0FBQ3pDLGFBQU8sS0FBSyxTQUFMLENBQWUsTUFBZixFQUF1QixRQUF2QixFQUFpQyxJQUFqQyxDQUFzQyxZQUFNO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQ2pELDBEQUFpQixNQUFqQiw0R0FBeUI7QUFBQSxnQkFBaEIsSUFBZ0I7O0FBQ3ZCLGdCQUFJLFNBQVMsTUFBSyxRQUFsQixFQUE0QjtBQUFFO0FBQVU7QUFDeEMsbUJBQU8sUUFBUSxNQUFSLENBQWUsSUFBSSxnQkFBSixDQUFxQixZQUFyQixDQUFmLENBQVA7QUFDRDtBQUpnRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUtqRCxlQUFPLFFBQVEsT0FBUixFQUFQO0FBQ0QsT0FOTSxDQUFQO0FBT0Q7OzsrQkFFVyxRLEVBQVUsaUIsRUFBbUI7QUFDdkMsVUFBSSxhQUFhLEtBQUssUUFBdEIsRUFBZ0M7QUFDOUIsZUFBTyxRQUFRLE1BQVIsQ0FB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UDtBQUVEOzs7OEJBRVUsUSxFQUFVLEksRUFBTTtBQUN6QixhQUFPLEtBQUssb0JBQUwsQ0FBMEIsU0FBMUIsQ0FBb0MsUUFBcEMsRUFBOEMsSUFBOUMsQ0FBUDtBQUNEOzs7NEJBRVEsTSxFQUFRO0FBQ2YsYUFBTyxLQUFLLG9CQUFMLENBQTBCLGdCQUExQixFQUFQO0FBQ0Q7OzsrQkFFVyxNLEVBQVEsSSxFQUFNO0FBQ3hCLGFBQU8sS0FBSyxvQkFBTCxDQUEwQixnQkFBMUIsQ0FBMkMsSUFBM0MsQ0FBUDtBQUNEOzs7OztBQUdILE9BQU8sT0FBUCxHQUFpQixlQUFqQiIsImZpbGUiOiJEaXJlY3RNZXNzYWdpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuY29uc3QgQ2hhdFNlcnZpY2VFcnJvciA9IHJlcXVpcmUoJy4vQ2hhdFNlcnZpY2VFcnJvcicpXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZSgnYmx1ZWJpcmQnKVxuY29uc3QgeyBtaXhpbiB9ID0gcmVxdWlyZSgnZXM2LW1peGluJylcbmNvbnN0IHsgcnVuIH0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuY2xhc3MgRGlyZWN0TWVzc2FnaW5nUGVybWlzc2lvbnMge1xuXG4gIGNvbnN0cnVjdG9yICh1c2VyTmFtZSwgZGlyZWN0TWVzc2FnaW5nU3RhdGUpIHtcbiAgICB0aGlzLnVzZXJOYW1lID0gdXNlck5hbWVcbiAgICB0aGlzLmRpcmVjdE1lc3NhZ2luZ1N0YXRlID0gZGlyZWN0TWVzc2FnaW5nU3RhdGVcbiAgfVxuXG4gIGNoZWNrTGlzdCAoYXV0aG9yLCBsaXN0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLmRpcmVjdE1lc3NhZ2luZ1N0YXRlLmNoZWNrTGlzdChsaXN0TmFtZSlcbiAgfVxuXG4gIGNoZWNrTGlzdFZhbHVlcyAoYXV0aG9yLCBsaXN0TmFtZSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tMaXN0KGF1dGhvciwgbGlzdE5hbWUpLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChsZXQgbmFtZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKG5hbWUgIT09IHRoaXMudXNlck5hbWUpIHsgY29udGludWUgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IENoYXRTZXJ2aWNlRXJyb3IoJ25vdEFsbG93ZWQnKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH0pXG4gIH1cblxuICBjaGVja0FjZXNzICh1c2VyTmFtZSwgYnlwYXNzUGVybWlzc2lvbnMpIHtcbiAgICBpZiAodXNlck5hbWUgPT09IHRoaXMudXNlck5hbWUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQ2hhdFNlcnZpY2VFcnJvcignbm90QWxsb3dlZCcpKVxuICAgIH1cbiAgICBpZiAoYnlwYXNzUGVybWlzc2lvbnMpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpIH1cbiAgICByZXR1cm4gcnVuKHRoaXMsIGZ1bmN0aW9uICogKCkge1xuICAgICAgbGV0IGJsYWNrbGlzdGVkID0geWllbGQgdGhpcy5kaXJlY3RNZXNzYWdpbmdTdGF0ZS5oYXNJbkxpc3QoXG4gICAgICAgICdibGFja2xpc3QnLCB1c2VyTmFtZSlcbiAgICAgIGlmIChibGFja2xpc3RlZCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IENoYXRTZXJ2aWNlRXJyb3IoJ25vdEFsbG93ZWQnKSlcbiAgICAgIH1cbiAgICAgIGxldCB3aGl0ZWxpc3RPbmx5ID0geWllbGQgdGhpcy5kaXJlY3RNZXNzYWdpbmdTdGF0ZS53aGl0ZWxpc3RPbmx5R2V0KClcbiAgICAgIGlmICghd2hpdGVsaXN0T25seSkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkgfVxuICAgICAgbGV0IHdoaXRlbGlzdGVkID0geWllbGQgdGhpcy5kaXJlY3RNZXNzYWdpbmdTdGF0ZS5oYXNJbkxpc3QoXG4gICAgICAgICd3aGl0ZWxpc3QnLCB1c2VyTmFtZSlcbiAgICAgIGlmICh3aGl0ZWxpc3RlZCkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBDaGF0U2VydmljZUVycm9yKCdub3RBbGxvd2VkJykpXG4gICAgfSlcbiAgfVxufVxuXG4vLyBJbXBsZW1lbnRzIGRpcmVjdCBtZXNzYWdpbmcgc3RhdGUgbWFuaXB1bGF0aW9ucyB3aXRoIHRoZSByZXNwZWN0IHRvXG4vLyB1c2VyJ3MgcGVybWlzc2lvbnMuXG5jbGFzcyBEaXJlY3RNZXNzYWdpbmcge1xuXG4gIGNvbnN0cnVjdG9yIChzZXJ2ZXIsIHVzZXJOYW1lKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXJcbiAgICB0aGlzLnVzZXJOYW1lID0gdXNlck5hbWVcbiAgICB0aGlzLmxpc3RTaXplTGltaXQgPSB0aGlzLnNlcnZlci5kaXJlY3RMaXN0U2l6ZUxpbWl0XG4gICAgbGV0IFN0YXRlID0gdGhpcy5zZXJ2ZXIuc3RhdGUuRGlyZWN0TWVzc2FnaW5nU3RhdGVcbiAgICB0aGlzLmRpcmVjdE1lc3NhZ2luZ1N0YXRlID0gbmV3IFN0YXRlKHRoaXMuc2VydmVyLCB0aGlzLnVzZXJOYW1lKVxuICAgIG1peGluKHRoaXMsIERpcmVjdE1lc3NhZ2luZ1Blcm1pc3Npb25zLFxuICAgICAgICAgIHRoaXMudXNlck5hbWUsIHRoaXMuZGlyZWN0TWVzc2FnaW5nU3RhdGUpXG4gIH1cblxuICBpbml0U3RhdGUgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0TWVzc2FnaW5nU3RhdGUuaW5pdFN0YXRlKHN0YXRlKVxuICB9XG5cbiAgcmVtb3ZlU3RhdGUgKCkge1xuICAgIHJldHVybiB0aGlzLmRpcmVjdE1lc3NhZ2luZ1N0YXRlLnJlbW92ZVN0YXRlKClcbiAgfVxuXG4gIG1lc3NhZ2UgKGF1dGhvciwgbXNnLCBieXBhc3NQZXJtaXNzaW9ucykge1xuICAgIHJldHVybiB0aGlzLmNoZWNrQWNlc3MoYXV0aG9yLCBieXBhc3NQZXJtaXNzaW9ucylcbiAgfVxuXG4gIGdldExpc3QgKGF1dGhvciwgbGlzdE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0xpc3QoYXV0aG9yLCBsaXN0TmFtZSlcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuZGlyZWN0TWVzc2FnaW5nU3RhdGUuZ2V0TGlzdChsaXN0TmFtZSkpXG4gIH1cblxuICBhZGRUb0xpc3QgKGF1dGhvciwgbGlzdE5hbWUsIHZhbHVlcykge1xuICAgIHJldHVybiB0aGlzLmNoZWNrTGlzdFZhbHVlcyhhdXRob3IsIGxpc3ROYW1lLCB2YWx1ZXMpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLmRpcmVjdE1lc3NhZ2luZ1N0YXRlLmFkZFRvTGlzdChcbiAgICAgICAgbGlzdE5hbWUsIHZhbHVlcywgdGhpcy5saXN0U2l6ZUxpbWl0KSlcbiAgfVxuXG4gIHJlbW92ZUZyb21MaXN0IChhdXRob3IsIGxpc3ROYW1lLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0xpc3RWYWx1ZXMoYXV0aG9yLCBsaXN0TmFtZSwgdmFsdWVzKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kaXJlY3RNZXNzYWdpbmdTdGF0ZS5yZW1vdmVGcm9tTGlzdChsaXN0TmFtZSwgdmFsdWVzKSlcbiAgfVxuXG4gIGhhc0luTGlzdCAobGlzdE5hbWUsIGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RNZXNzYWdpbmdTdGF0ZS5oYXNJbkxpc3QobGlzdE5hbWUsIGl0ZW0pXG4gIH1cblxuICBnZXRNb2RlIChhdXRob3IpIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RNZXNzYWdpbmdTdGF0ZS53aGl0ZWxpc3RPbmx5R2V0KClcbiAgfVxuXG4gIGNoYW5nZU1vZGUgKGF1dGhvciwgbW9kZSkge1xuICAgIHJldHVybiB0aGlzLmRpcmVjdE1lc3NhZ2luZ1N0YXRlLndoaXRlbGlzdE9ubHlTZXQobW9kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpcmVjdE1lc3NhZ2luZ1xuIl19
\No newline at end of file