get env variables the "Right Way" - load them in from /etc/passwd and /etc/env on login

This commit is contained in:
Lisa Milne 2023-11-23 21:54:14 +10:00
parent 03bc7b2e66
commit e49b180450

View file

@ -186,6 +186,33 @@ var clite = {
return true;
}
function defaultConfig() {
// /etc/env contains the default environment variables
vfsapi.mkFile('/etc/env');
var n = vfsapi.getNode('/etc/env');
if (!n) {
clite.log.write('environment failure');
return false;
}
n.data.content = `
PATH=/bin
`;
n.perms = '-rw-r--r--';
// /etc/passwd contains user account details
vfsapi.mkFile('/etc/passwd');
var n = vfsapi.getNode('/etc/passwd');
if (!n) {
clite.log.write('access config failure');
return false;
}
n.data.content = `
root:x:0:0:root:/root:/bin/sh
guest:x:1:1:guest:/usr/home/guest:/bin/sh
`;
// TODO: check cookies for a local user
n.perms = '-rw-r--r--';
}
function init1() {
clite.log.write('CLIte Version '+clite.state.version);
// setup vfs
@ -256,6 +283,9 @@ data/about.txt:/usr/share/site/about:0:0:-rw-rw-r--`;
fn.data.content = null;
}
clite.io.close(fd);
// populate /etc (mostly for environment)
clite.log.write('Populating /etc');
defaultConfig();
// populate /dev (data/filesys.txt is /dev/wfs already)
clite.log.write('Populating /dev');
defaultDevices();
@ -422,7 +452,7 @@ clite.user = {
groups:[],
env:{
HOME:'/',
USER:udata.name,
USER:this.name,
}
};
clite.user.getUID = function() {
@ -438,21 +468,64 @@ clite.user = {
return true;
return false;
}
function setLogin(user,uid,gid,groups) {
udata.name = user;
udata.uid = uid;
udata.gid = gid;
udata.groups = groups;
udata.env.HOME = '/usr/home/'+user;
udata.env.PWD = udata.env.HOME;
udata.env.USER = udata.name;
clite.shell.env.HOME = '/usr/home/'+user;
clite.shell.env.PWD = '/usr/home/'+user;
clite.shell.env.USER = user;
clite.shell.prompt.generate();
function setLogin(uid) {
var found = false;
var n = vfs.getFile('/etc/passwd');
if (!n)
return false;
var lines = n.split('\n');
lines.forEach(function(line) {
if (found)
return;
if (line[0] == '#')
return;
var sects = line.split(':');
// 0 username
// 1 null
// 2 uid
// 3 gid
// 4 real name
// 5 home dir
// 6 shell
if (sects.length != 7)
return;
if (parseInt(sects[2]) != uid)
return;
found = true;
udata.name = sects[0];
udata.uid = uid;
udata.gid = parseInt(sects[3]);
udata.env.HOME = sects[5];
udata.env.SHELL = sects[6];
udata.env.USER = udata.name;
udata.env.PWD = udata.env.HOME;
});
if (!found)
return false;
n = vfs.getFile('/etc/env');
if (!n)
return false;
lines = n.split('\n');
lines.forEach(function(line) {
if (line[0] == '#')
return;
var sects = line.split('=');
if (sects.length != 2)
return;
udata.env[sects[0].trim()] = sects[1].trim();
});
// TODO: read in data from /etc/groups
udata.groups = [];
clite.user.hasLogin = function() {
return true;
}
return true;
}
clite.user.genGuest = function() {
clite.term.clear();
@ -464,8 +537,14 @@ clite.user = {
n.gid = 1;
}
vfs.mkLink('/usr/home/guest/web','/usr/share/site');
setLogin('guest',1,1,[]);
clite.term.events.refocus();
setLogin(1);
// should really have init/getty exec the shell with the env data etc
clite.shell.init();
}
clite.user.getEnv = function() {
return structuredClone(udata.env);
}
return false;
},
@ -481,6 +560,9 @@ clite.user = {
hasLogin:function() { // check if we're in a user session
return false;
},
getEnv:function() { // get the current environment (variables)
return {};
},
genGuest:null
};
@ -1295,6 +1377,11 @@ clite.shell = {
clite.shell.reading.buff = e.target.value;
}
},
init:function() {
clite.shell.env = clite.user.getEnv();
clite.shell.prompt.generate();
clite.term.events.refocus();
},
exit:function(pid,v) {
if (pid > -1)
clite.proc.exit(pid);
@ -1497,12 +1584,7 @@ clite.shell = {
return;
clite.shell.history.setCurrent(c+add);
},
env:{
USER:'root',
PWD:'/',
HOME:'/',
PATH:'/bin'
},
env:{},
macro:{
clear:function(args,io) {
clite.term.clear();
@ -1824,7 +1906,7 @@ clite.lib = {
clite.shell.exit(pid,v);
}
clite.core.execSafeAsync(function() {
call(Object.create(env),io);
call(structuredClone(env),io);
});
return pid;
},