1#include "pedigree/kernel/LockGuard.h"
2#include "pedigree/kernel/process/Process.h"
3#include "pedigree/kernel/process/Scheduler.h"
4#include "pedigree/kernel/processor/Processor.h"
6#include "modules/system/users/Group.h"
7#include "modules/system/users/User.h"
9bool Process::loadFilesystemIds(
const Thread& task, uint32_t& uid, uint32_t& gid) {
10 if (!task.m_FilesystemIdsValid)
12 uid = task.m_FilesystemUid;
13 gid = task.m_FilesystemGid;
17void Process::publishFilesystemIds(
Thread& task, uint32_t uid, uint32_t gid) {
18 task.m_FilesystemUid = uid;
19 task.m_FilesystemGid = gid;
20 task.m_FilesystemIdsValid =
true;
30 out.uid = out.gid = 0;
36 if (!user || !group || user->
getId() >= UINT32_MAX || group->
getId() >= UINT32_MAX)
38 out.uid = user->
getId();
39 out.gid = group->
getId();
43 loadFilesystemIds(*task, out.uid, out.gid);
51 if (task->m_FilesystemOverride) {
52 out = *task->m_FilesystemOverride;
55 return task->
getParent()->snapshotFilesystemCredentials(task, out);
61 if (!source->snapshotFilesystemCredentials(
creator, credentials))
64 publishFilesystemIds(child, credentials.uid, credentials.gid);
67void Process::publishAccountIdentity(
User* user,
Group* group) {
72bool Process::installUserIdentity(
User* user,
Group* group,
const uint32_t* groups,
size_t count) {
73 if (!user || !group || user->
getId() >= UINT32_MAX || group->
getId() >= UINT32_MAX ||
74 count > FilesystemCredentials::MaximumGroups || (count && !groups))
76 for (
size_t i = 0; i < count; ++i)
77 if (groups[i] == UINT32_MAX)
80 publishAccountIdentity(user, group);
82 credentials.uid = user->
getId();
83 credentials.gid = group->
getId();
84 credentials.groupCount = count;
85 for (
size_t i = 0; i < count; ++i)
86 credentials.groups[i] = groups[i];
87 credentials.valid =
true;
89 if (current && current->
getParent() ==
this)
90 publishFilesystemIds(*current, credentials.uid, credentials.gid);
95 : m_Credentials(credentials),
96 m_Thread(
Processor::information().getCurrentThread()),
97 m_Previous(m_Thread ? m_Thread->m_FilesystemOverride : nullptr) {
99 m_Thread->m_FilesystemOverride = &m_Credentials;
102Process::FilesystemAccessScope::~FilesystemAccessScope() {
104 m_Thread->m_FilesystemOverride = m_Previous;
145void Process::setEffectiveGroup(
Group* value) {
Group * getEffectiveGroup() const
FilesystemCredentials m_NativeFilesystemCredentials
Group * m_pEffectiveGroup
void setGroup(Group *pGroup)
User * getEffectiveUser() const
void setEffectiveUser(User *pUser)
void setUser(User *pUser)
static ProcessorInformation & information()
static Scheduler & instance()
Process * getParent() const