/* Copyright (c) 2020, 2023, The Unified Company. This code is part of Unify. This program is free software; you can redistribute it and/or modify it under the terms of the ESA Software Community License - Strong Copyleft LICENSE, as published by the ESA. See the ESA Software Community License - Strong Copyleft LICENSE, for more details. https://unifyjs.org */ import unify from '../unify/unify.js'; class visitor{ value = 2.0; label = "Member"; color = "black"; type = "userGroup"; } class userManager{ computePermissions( object, user ) { var permissions = new Object(); if( object.isAllowed( user, "WRITE" ) ) { permissions.WRITE = true; } else { permissions.WRITE = false; } if( object.isAllowed( user, "DELETE" ) ) { permissions.DELETE = true; } else { permissions.DELETE = false; } if( object.isAllowed( user, "READ" ) ) { permissions.READ = true; } else { permissions.READ = false; } return permissions; } getPermissions( user, client ) { var root = client.application; client.permissionObjects = []; this.getPermissionsChildren( user, client, root ); return client.permissionObjects; } createToken() { var token = ""; for (var i = 0; i < 40; i++) { token += Math.floor(Math.random() * 10); } return token; } getPermissionsRenderCollection( object, client, user ) { var rows = object.rows; for( var b = 0; b < rows.length; b++) { var rowObject = rows[b]; var permission = this.getPermissionFromObject( rowObject, user ); if( permission ) { client.permissionObjects.push( permission ); } } } getPermissionsChildrenObjects( objects, client, user ) { for( var c = 0; c < objects.length; c++) { var object = objects[c]; var permission = this.getPermissionFromObject( object, user ); if( permission ) { client.permissionObjects.push( permission ); } if( object.type == "renderCollection" ) { this.getPermissionsRenderCollection( object, client, user ); } this.getPermissionsChildren( user, client, object ); } } getPermissionsChildren( user, client, object ) { unify.extend( object ); if( object.getChildren ) { var objects = object.getChildren(); var permissionObjects = new Array(); this.getPermissionsChildrenObjects( objects, client, user ); } } getPermissionFromObject( object, user ) { var permissionManager = object.permissionManager; if( permissionManager && permissionManager.permissions.length > 0 && object.parent ) { var objectPermission = {}; object.updated = true; objectPermission.path = object.getApplicationPath().join("/") objectPermission.permission = this.computePermissions( object, user ); return objectPermission; } return false; } createVisitor( client ) { var table = new global.user(); table.username.value = "Visitor"; table.id = 0; table.groups = new visitor(); table.permissionObjects = this.getPermissions( table, client ); return table; } signOut( cookieUser, client, eventName ) { if( client.user ) { client.user.get(); client.user.sessionKey.value = ""; client.user.save(); } var table = this.createVisitor( client ); client.user = table; global.core.setUserObjects( false, client ); return table; } signin( object, client, force = false ) { console.log("try to sign in"); var visitor = this.createVisitor( client ); if( object.table ) { table = object; } else { var table = new global.user(); } client.user = visitor; client.user.error = false; unify.extend( table ); if( object.username && object.username.value != "Visitor" ) { var username = object.username.value; var users = table.find( "username", username ); console.log("try to sign in users", users); if( users.length > 0 ) { var fetchedUser = users[ 0 ]; var hash = fetchedUser.hash; console.log("try to sign in hash", hash); var password = object.password.value; if( object.sessionKey.value != "" ) { console.log("try to signin with sessionKey") var sign = ( object.sessionKey.value == fetchedUser.sessionKey ); } else { if( !object.password ) { return false; } } if( !sign ) { var sign = global.bcrypt.compareSync( password, hash ); } console.log("sign in with password", sign); if( !password ) { client.user.error = "password required"; } if( !hash ) { client.user.error = "user does not have an hash"; } if( sign || force ) { table.id = fetchedUser.id; console.log("fetchedUser", fetchedUser); if( fetchedUser.activation == "true" ) { table.get( ); } else { console.log("not activated"); table.activation.value = false; } table.group.value = fetchedUser.group; table.permissionObjects = this.getPermissions( table, client ); table.username.value = username; //console.log("store session key", table.hash.value); if( fetchedUser.activation == "true" ) { if( table.sessionKey.value == "" ) { table.sessionKey.value = this.createToken(); if( fetchedUser.activation == "true" ) { table.save(); } } } //table.save(); table.error = false; client.user = table; client.user.status = "success"; } else { client.user.status = "failed"; client.user.error = "password"; } } else { client.user.status = "failed"; client.user.error = "username"; } } else { client.user.error = "password"; } if( client.user.status == "success" ) { } else { } global.core.setUserObjects( client.user, client ); global.core.parse( client.user, client ); if( client.user.error ) { client.user.error = "Wrong Password or Username"; } return client.user; } } export default new userManager();