Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function supports_html5_storage() {
  2.       try {
  3.         return 'localStorage' in window && window['localStorage'] !== null;
  4.     } catch (e) {
  5.         return false;
  6.       }
  7. }
  8.  
  9. function submitArgs(){
  10.     //args._users = _users;//{}
  11.     //args._rights = _rights;//[]
  12.     //args._groups = _groups;//[{id:0, groupname: "guest", access: []}];
  13.     //
  14.     //args._sessions = _sessions;//{};
  15.     //args._currentUser = _currentUser;
  16.     //args._realUser = _realUser;
  17.     //args._listeners = _listeners;//[];
  18.    
  19.     localStorage['myUsefulVar'] = JSON.stringify(args);
  20. }
  21.  
  22. if(!supports_html5_storage())
  23.     alert('No localStorage here! I am out!');
  24.  
  25. var args = typeof localStorage['myUsefulVar'] === 'undefined' ? initArgs() : JSON.parse(localStorage['myUsefulVar']);
  26. console.log(args);  //<--------------------------------------------------------------------------------------------------------------debug
  27.  
  28. var _users = args._users;//{}
  29. var _rights = args._rights;//[]
  30. var _groups = args._groups//[{id:0, groupname: "guest", access: []}];
  31.  
  32. var _sessions = args._sessions;//{};
  33. var _currentUser = args._currentUser;
  34. var _realUser = args._realUser;
  35. var _listeners = args._listeners;//[];
  36.  
  37. function initArgs(){
  38.     var args = {
  39.          "_users": {},
  40.          "_rights": [],
  41.          "_groups": [],
  42.          "_sessions": {},
  43.          "_currentUser": null,
  44.          "_realUser": null,
  45.          "_listeners": []
  46.     }
  47.    
  48.     return args;
  49. }
  50.  
  51. /*
  52. var _users = {
  53.     "admin": {username:"admin", password: "1234", groups: [0, 1, 2]},
  54.     "sobakajozhec": {username:"s1", password: "ekh228", groups: [1, 2]},
  55.     "patriot007": {username:"s2", password: "russiaFTW", groups: [1]}
  56. };
  57.  
  58. var _rights = [0,1,2,3,4,5,6,7,8,9];
  59.  
  60. var _groups = [
  61.     { id:0, groupname: "guest", access: []},
  62.     { id:1, groupname: "admin", access: [,,_rights[2]]},
  63.     { id:2, groupname: "manager", access: [_rights[0]]},
  64.     { id:3, groupname: "basic", access: [,_rights[1],,_rights[3]]}
  65. ];
  66.  
  67. var _sessions = {};
  68. var _currentUser;
  69. var _realUser;
  70. var _listeners = [];
  71. */
  72.  
  73. function clearGaps(array){
  74.   var arr = [];
  75.   for(var i in array){
  76.     if(array[i] != undefined)
  77.       arr.push(array[i]);
  78.   }
  79.   return arr;
  80. }
  81.  
  82. //function users(): Array<Any> Возвращает массив всех пользователей.
  83. function users(){
  84.     return Object.values(_users);
  85. }
  86. //function createUser(username: String, password: String): Any Создает нового пользователя с указанным логином username и паролем password, возвращает созданного пользователя.
  87. function createUser(username, password)
  88. {
  89.     if (!(username in _users)){
  90.     _users[username] = { username: username, password: password, groups: [] };
  91.     }
  92.    
  93.     return _users[username];
  94. }
  95. //function deleteUser(user: Any): undefined Удаляет пользователя user
  96. function deleteUser(user){
  97.   if(typeof user == 'object' && user.username in _users){
  98.     delete _users[user.username];
  99.   }
  100.   else
  101.     throw new Error('Wrong user for deleteUser');
  102. }
  103. //function userGroups(user: Any): Array<Any> Возвращает массив групп, к которым принадлежит пользователь user
  104. function userGroups(user){
  105.   var user_groups=[]
  106.   for(var groupid in user.groups){
  107.     user_groups.push(_groups[user.groups[groupid]]);
  108.   }
  109.   return clearGaps(user_groups);
  110. }
  111.  
  112. //function addUserToGroup(user: Any, group: Any): undefined Добавляет пользователя user в группу group
  113. function addUserToGroup(user, group){
  114.   if(typeof user === 'object' && user.username in _users && typeof group === 'object' && _groups[group.id] === group){
  115.     _users[user.username].groups[group.id] = group.id;
  116.   }
  117.   else
  118.     throw new Error('Wrong user or group');
  119. }
  120.  
  121. //function removeUserFromGroup(user: Any, group: Any): undefined Удаляет пользователя user из группы group
  122. function removeUserFromGroup(user, group) {
  123.   if(typeof user === 'object' && user.username in _users && typeof group == 'object' && _groups[group.id] === group){
  124.     if(user.groups[group.id] !== group.id)
  125.       throw new Error('User is not in this group');
  126.      
  127.     delete _users[user.username].groups[group.id];
  128.   }
  129.   else
  130.     throw new Error('Error from removeUserFromGroup');
  131. }
  132.  
  133. //function rights(): Array<Any> Возвращает массив прав
  134. function rights(){
  135.   return clearGaps(_rights);
  136. }
  137. //function createRight(): Any Создает новое право и возвращает его
  138. function createRight(){
  139.        var num = _rights.length;
  140.        _rights[num] = num;
  141.       return num;
  142. }
  143. //function deleteRight(right: Any): undefined Удаляет право right
  144. function deleteRight(right) {
  145.   if(typeof right === 'number' && _rights[right] === right){
  146.     for (var groupId in _groups)
  147.       if (_groups[groupId].access[right] === right)
  148.         delete _groups[groupId].access[right];
  149.   delete _rights[right];
  150.   }
  151.   else
  152.     throw new Error('Error from deleteRight');
  153. }
  154.  
  155. //function addRightToGroup(right: Any, group: Any) : undefined Добавляет право right к группе group
  156. function addRightToGroup(right, group)
  157. {
  158.   if(group != undefined && right != undefined && _rights[right] === right && _groups[group.id] === group)
  159.       _groups[group.id].access[right] = right;
  160.      else
  161.       throw new Error('Error from addRightToGroup');
  162. }
  163.  
  164. //function removeRightFromGroup(right: Any, group: Any) : undefined Удаляет право right из группы group
  165. function removeRightFromGroup(right, group) {
  166.   if(group != undefined && right != undefined && group.access[right] === right && _groups[group.id] === group )
  167.     delete _groups[group.id].access[right];
  168.   else
  169.     throw new Error('Error from removeRightFromGroup');
  170. }
  171. //function groups(): Array<Any> Возвращает массив групп
  172. function groups()
  173. {
  174.     return clearGaps(_groups);
  175. }
  176. //function createGroup(): Any Создает новую группу и возвращает её.
  177. function createGroup(){
  178.   var num = _groups.length;
  179.        _groups[num] = { id: num, groupname: '', access: [rights[0]] };
  180.       return _groups[num];
  181. }
  182. //function deleteGroup(group: Any): undefined Удаляет группу group
  183. function deleteGroup(group){
  184.   if(typeof group === 'object' && _groups[group.id] === group)
  185.   {
  186.     for(var userKey in _users)
  187.       delete _users[userKey].groups[group.id];
  188.    
  189.     delete _groups[group.id];
  190.   }
  191.   else
  192.     throw new Error('Wrong group in deleteGroup');
  193. }
  194.  
  195. //function groupRights(group: Any): Array<Any> Возвращает массив прав, которые принадлежат группе group
  196. function groupRights(group){
  197.   return clearGaps(_groups[group.id].access);
  198. }
  199.  
  200. function login(username, password){
  201.   if (username === 'guest'){
  202.     var guestUniqName = 'guest' + Math.random();
  203.     _sessions[guestUniqName]
  204.     _currentUser = guestUniqName;
  205.     return true;
  206.   }
  207.   else
  208.     if(username in _users && _users[username].password === password && !(username in _sessions)){
  209.       _sessions[username] = 'logged';
  210.       _currentUser = username;
  211.       return true;
  212.     }
  213.     return false;
  214.   }
  215.  
  216.  
  217. function logout(){
  218.   if(typeof _realUser !== 'string'){
  219.     delete _sessions[_currentUser];
  220.     _currentUser = undefined;
  221.   }
  222.   else{
  223.     _currentUser = _realUser;
  224.     _realUser = undefined;
  225.   }
  226. }
  227.  
  228. function currentUser(){
  229.   return _users[_currentUser];
  230. }
  231.  
  232. function isAuthorized(user, right){
  233.   if(user != undefined && right != undefined && user.username in _users && _rights.includes(right)) {
  234.     for( var groupId in _users[user.username].groups)
  235.     {
  236.       if(_groups[groupId].access[right] === right ){
  237.         return true;
  238.       }
  239.     }
  240.     return false;
  241.   }
  242.   else
  243.   throw new Error('Error from isAuthorized');
  244. }
  245.  
  246.  
  247. //Пусть right[0] дает право на это
  248. function loginAs(username){
  249.   if(isAuthorized(_users[_currentUser], _rights[0])){
  250.     _realUser = _currentUser;
  251.     _currentUser = username;
  252.   }
  253.   else  
  254.     throw new Error('У вас нет прав');
  255. }
  256.  
  257.  
  258. function securityWrapper(action, right){
  259.   if(isAuthorized(_users[_currentUser], right))
  260.     return function(){
  261.       for(var i in _listeners)
  262.         _listeners[i](_users[_currentUser], action);
  263.        
  264.       return action(...arguments);
  265.     }
  266.   else
  267.     throw new Error('You have no access');
  268. }
  269.  
  270. function addActionListener(listenerFunction){
  271.   _listeners.push(listenerFunction);
  272. }
  273.  
  274. function logger(user, action){
  275.   console.log("Пользователь " + user.username + " только что сделал " + action.name);
  276. }
  277. addActionListener(logger);
  278.  
  279.  
  280.  
  281.  
  282. //var _counter = 0;
  283. //function actionOne(arg = 1){
  284. //  _counter += arg;
  285. //}
  286. //login('admin','1234');
  287. //var wrapped = securityWrapper(actionOne, _rights[0]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement