Files
Unify/application/user/signin/user.signin.js
2025-12-25 11:16:59 +01:00

310 lines
5.9 KiB
JavaScript

import user from '/user/user.js';
import label from '/elements/label.js';
import username from './signin.username.js';
import password from './signin.password.js';
import signinButton from './signin.button.js';
import userManager from '/server/userManager.js';
import document from '/unify/document.js';
import unify from '/unify/unify.js';
import groups from '/user/group/user.group.permission.js';
import querySQL from '/unify/querySQL.js';
import header from '/elements/header.js';
import cancelButton from './signin.cancel.button.js';
import page from '/elements/page.js';
import collection from "/unify/collection.js";
import IS from '/unify/sql/IS.js';
#ifdef SERVER
import crypto from "node:crypto";
#endif
class tussenObject{
password = new password();
width = "100%"
}
class buttons{
#ifdef ANDROID
width = "100vw";
position = "absolute"
bottom = "0";
#endif
cancelButton = new cancelButton();
signinButton = new signinButton();
}
class hint{
text = "Hint: You can sign in with username: admin, password: admin."
color = "white"
marginLeft = 22;
fontWeight = "bold"
marginTop = 20;
padding = 20;
background = "#221f1f4f";
borderRadius = 4;
}
export default class signin extends user, page {
_hint = new hint();
padding = 10;
paddingTop = 20;
color = "black";
//paddingTop = "0";
flexDirection = "column";
height = "400px";
layers = 1;
debug = true;
customElement = document.createElement("form");
useCustomElement = true;
display = "flex";
autocomplete = false;
_header = new header("Signin");
//userLabel = new label("Username");
username = new username();
//passwordLabel = new label("Password");
tussenObject = new tussenObject();
buttons = new buttons();
boxMargin;
enableREAD() {
this.hide();
}
createVisitor( client ) {
var table = new user();
table.username.value = "Visitor";
table.id = 0;
table.permissionObjects = userManager.getPermissions( table, client );
return table;
}
node async signin( username, password, sessionKey ) {
var client = this.client;
client.user = this.createVisitor( client );
client.user.error = false;
if( username ) {
var users = new collection( user );
var filter = users.getFilter();
filter.search = IS( filter.username, username );
users.sync();
var currentUser = users.get();
if( currentUser ) {
var hash = currentUser.hash.value;
console.log("password", password);
console.log("try to sign in hash", hash);
if( !password ) {
client.user.error = "password required";
}
if( !hash ) {
client.user.error = "user does not have an hash";
}
var signedIn = false;
var loginMethod = false;
console.log(sessionKey);
if( sessionKey ) {
signedIn = sessionKey === currentUser.sessionKey.value;
loginMethod = "session"
console.log( "signin with sessionKey:", sessionKey, currentUser.sessionKey.value, signedIn );
}
if( password ) {
var encryptHash = await crypto.pbkdf2Sync( password, currentUser.salt.value, 100, 64,'SHA256' ).toString('hex');
if( !signedIn ) {
signedIn = encryptHash === hash;
loginMethod = "password"
console.log( "signin with Password:", encryptHash, hash, signedIn );
}
}
if( signedIn ) {
if( loginMethod != "session" ) {
currentUser.sessionKey.value = crypto.randomBytes( 32 ).toString('base64');
currentUser.save();
currentUser.sessionKey.scope = "public"
}
currentUser.permissionObjects = userManager.getPermissions( currentUser, client );
currentUser.error = false;
client.user = currentUser;
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";
}
global.core.setUserObjects( client.user, client );
global.core.parse( client.user, client );
return client.user;
}
async afterLoad() {
var username = localStorage.getItem( "username" );
var sessionKey = localStorage.getItem( "sessionKey" );
var user = await this.signin( username, false, sessionKey );
console.log("signin ",user);
var core = this.getCore();
core.updatePermissions( user.permissionObjects );
core.setUser( user );
}
permission() {
this.allow( groups.visitor , "PROCESS" );
this.allow( groups.member , "PROCESS" );
this.allow( groups.admin , "PROCESS" );
this.allow( groups.member , "READ" );
this.allow( groups.admin , "READ" );
}
}