Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function supports_html5_storage() {
- try {
- return 'localStorage' in window && window['localStorage'] !== null;
- } catch (e) {
- return false;
- }
- }
- function submitArgs(){
- //args._users = _users;//{}
- //args._rights = _rights;//[]
- //args._groups = _groups;//[{id:0, groupname: "guest", access: []}];
- //
- //args._sessions = _sessions;//{};
- //args._currentUser = _currentUser;
- //args._realUser = _realUser;
- //args._listeners = _listeners;//[];
- localStorage['myUsefulVar'] = JSON.stringify(args);
- }
- if(!supports_html5_storage())
- alert('No localStorage here! I am out!');
- var args = typeof localStorage['myUsefulVar'] === 'undefined' ? initArgs() : JSON.parse(localStorage['myUsefulVar']);
- console.log(args); //<--------------------------------------------------------------------------------------------------------------debug
- var _users = args._users;//{}
- var _rights = args._rights;//[]
- var _groups = args._groups//[{id:0, groupname: "guest", access: []}];
- var _sessions = args._sessions;//{};
- var _currentUser = args._currentUser;
- var _realUser = args._realUser;
- var _listeners = args._listeners;//[];
- function initArgs(){
- var args = {
- "_users": {},
- "_rights": [],
- "_groups": [],
- "_sessions": {},
- "_currentUser": null,
- "_realUser": null,
- "_listeners": []
- }
- return args;
- }
- /*
- var _users = {
- "admin": {username:"admin", password: "1234", groups: [0, 1, 2]},
- "sobakajozhec": {username:"s1", password: "ekh228", groups: [1, 2]},
- "patriot007": {username:"s2", password: "russiaFTW", groups: [1]}
- };
- var _rights = [0,1,2,3,4,5,6,7,8,9];
- var _groups = [
- { id:0, groupname: "guest", access: []},
- { id:1, groupname: "admin", access: [,,_rights[2]]},
- { id:2, groupname: "manager", access: [_rights[0]]},
- { id:3, groupname: "basic", access: [,_rights[1],,_rights[3]]}
- ];
- var _sessions = {};
- var _currentUser;
- var _realUser;
- var _listeners = [];
- */
- function clearGaps(array){
- var arr = [];
- for(var i in array){
- if(array[i] != undefined)
- arr.push(array[i]);
- }
- return arr;
- }
- //function users(): Array<Any> Возвращает массив всех пользователей.
- function users(){
- return Object.values(_users);
- }
- //function createUser(username: String, password: String): Any Создает нового пользователя с указанным логином username и паролем password, возвращает созданного пользователя.
- function createUser(username, password)
- {
- if (!(username in _users)){
- _users[username] = { username: username, password: password, groups: [] };
- }
- return _users[username];
- }
- //function deleteUser(user: Any): undefined Удаляет пользователя user
- function deleteUser(user){
- if(typeof user == 'object' && user.username in _users){
- delete _users[user.username];
- }
- else
- throw new Error('Wrong user for deleteUser');
- }
- //function userGroups(user: Any): Array<Any> Возвращает массив групп, к которым принадлежит пользователь user
- function userGroups(user){
- var user_groups=[]
- for(var groupid in user.groups){
- user_groups.push(_groups[user.groups[groupid]]);
- }
- return clearGaps(user_groups);
- }
- //function addUserToGroup(user: Any, group: Any): undefined Добавляет пользователя user в группу group
- function addUserToGroup(user, group){
- if(typeof user === 'object' && user.username in _users && typeof group === 'object' && _groups[group.id] === group){
- _users[user.username].groups[group.id] = group.id;
- }
- else
- throw new Error('Wrong user or group');
- }
- //function removeUserFromGroup(user: Any, group: Any): undefined Удаляет пользователя user из группы group
- function removeUserFromGroup(user, group) {
- if(typeof user === 'object' && user.username in _users && typeof group == 'object' && _groups[group.id] === group){
- if(user.groups[group.id] !== group.id)
- throw new Error('User is not in this group');
- delete _users[user.username].groups[group.id];
- }
- else
- throw new Error('Error from removeUserFromGroup');
- }
- //function rights(): Array<Any> Возвращает массив прав
- function rights(){
- return clearGaps(_rights);
- }
- //function createRight(): Any Создает новое право и возвращает его
- function createRight(){
- var num = _rights.length;
- _rights[num] = num;
- return num;
- }
- //function deleteRight(right: Any): undefined Удаляет право right
- function deleteRight(right) {
- if(typeof right === 'number' && _rights[right] === right){
- for (var groupId in _groups)
- if (_groups[groupId].access[right] === right)
- delete _groups[groupId].access[right];
- delete _rights[right];
- }
- else
- throw new Error('Error from deleteRight');
- }
- //function addRightToGroup(right: Any, group: Any) : undefined Добавляет право right к группе group
- function addRightToGroup(right, group)
- {
- if(group != undefined && right != undefined && _rights[right] === right && _groups[group.id] === group)
- _groups[group.id].access[right] = right;
- else
- throw new Error('Error from addRightToGroup');
- }
- //function removeRightFromGroup(right: Any, group: Any) : undefined Удаляет право right из группы group
- function removeRightFromGroup(right, group) {
- if(group != undefined && right != undefined && group.access[right] === right && _groups[group.id] === group )
- delete _groups[group.id].access[right];
- else
- throw new Error('Error from removeRightFromGroup');
- }
- //function groups(): Array<Any> Возвращает массив групп
- function groups()
- {
- return clearGaps(_groups);
- }
- //function createGroup(): Any Создает новую группу и возвращает её.
- function createGroup(){
- var num = _groups.length;
- _groups[num] = { id: num, groupname: '', access: [rights[0]] };
- return _groups[num];
- }
- //function deleteGroup(group: Any): undefined Удаляет группу group
- function deleteGroup(group){
- if(typeof group === 'object' && _groups[group.id] === group)
- {
- for(var userKey in _users)
- delete _users[userKey].groups[group.id];
- delete _groups[group.id];
- }
- else
- throw new Error('Wrong group in deleteGroup');
- }
- //function groupRights(group: Any): Array<Any> Возвращает массив прав, которые принадлежат группе group
- function groupRights(group){
- return clearGaps(_groups[group.id].access);
- }
- function login(username, password){
- if (username === 'guest'){
- var guestUniqName = 'guest' + Math.random();
- _sessions[guestUniqName]
- _currentUser = guestUniqName;
- return true;
- }
- else
- if(username in _users && _users[username].password === password && !(username in _sessions)){
- _sessions[username] = 'logged';
- _currentUser = username;
- return true;
- }
- return false;
- }
- function logout(){
- if(typeof _realUser !== 'string'){
- delete _sessions[_currentUser];
- _currentUser = undefined;
- }
- else{
- _currentUser = _realUser;
- _realUser = undefined;
- }
- }
- function currentUser(){
- return _users[_currentUser];
- }
- function isAuthorized(user, right){
- if(user != undefined && right != undefined && user.username in _users && _rights.includes(right)) {
- for( var groupId in _users[user.username].groups)
- {
- if(_groups[groupId].access[right] === right ){
- return true;
- }
- }
- return false;
- }
- else
- throw new Error('Error from isAuthorized');
- }
- //Пусть right[0] дает право на это
- function loginAs(username){
- if(isAuthorized(_users[_currentUser], _rights[0])){
- _realUser = _currentUser;
- _currentUser = username;
- }
- else
- throw new Error('У вас нет прав');
- }
- function securityWrapper(action, right){
- if(isAuthorized(_users[_currentUser], right))
- return function(){
- for(var i in _listeners)
- _listeners[i](_users[_currentUser], action);
- return action(...arguments);
- }
- else
- throw new Error('You have no access');
- }
- function addActionListener(listenerFunction){
- _listeners.push(listenerFunction);
- }
- function logger(user, action){
- console.log("Пользователь " + user.username + " только что сделал " + action.name);
- }
- addActionListener(logger);
- //var _counter = 0;
- //function actionOne(arg = 1){
- // _counter += arg;
- //}
- //login('admin','1234');
- //var wrapped = securityWrapper(actionOne, _rights[0]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement