1// UserSecurityContext.cpp
2
3#include <new>
4
5#include "SecurityContext.h"
6#include "UserSecurityContext.h"
7#include "HashMap.h"
8#include "Node.h"
9
10// PermissionMap
11struct UserSecurityContext::PermissionMap : HashMap<NodeRef, Permissions> {
12};
13
14// constructor
15UserSecurityContext::UserSecurityContext()
16	: fUser(NULL),
17	  fPermissions(NULL)
18{
19}
20
21// destructor
22UserSecurityContext::~UserSecurityContext()
23{
24	if (fUser)
25		fUser->RemoveReference();
26
27	delete fPermissions;
28}
29
30// Init
31status_t
32UserSecurityContext::Init(User* user)
33{
34	if (fUser)
35		fUser->RemoveReference();
36
37	fUser = user;
38	if (fUser)
39		fUser->AddReference();
40
41	delete fPermissions;
42	fPermissions = new(nothrow) PermissionMap;
43
44	if (!fPermissions)
45		return B_NO_MEMORY;
46	return B_OK;
47}
48
49// GetUser
50User*
51UserSecurityContext::GetUser() const
52{
53	return fUser;
54}
55
56// AddNode
57status_t
58UserSecurityContext::AddNode(dev_t volumeID, ino_t nodeID,
59	Permissions permissions)
60{
61	return fPermissions->Put(NodeRef(volumeID, nodeID), permissions);
62}
63
64// GetNodePermissions
65Permissions
66UserSecurityContext::GetNodePermissions(dev_t volumeID, ino_t nodeID) const
67{
68	return fPermissions->Get(NodeRef(volumeID, nodeID));
69}
70
71// GetNodePermissions
72Permissions
73UserSecurityContext::GetNodePermissions(const node_ref& ref) const
74{
75	return fPermissions->Get(NodeRef(ref));
76}
77
78// GetNodePermissions
79Permissions
80UserSecurityContext::GetNodePermissions(dev_t volumeID, ino_t nodeID,
81	Permissions parentPermissions) const
82{
83	if (fPermissions->ContainsKey(NodeRef(volumeID, nodeID)))
84		return fPermissions->Get(NodeRef(volumeID, nodeID));
85	return parentPermissions;
86}
87
88// GetNodePermissions
89Permissions
90UserSecurityContext::GetNodePermissions(const node_ref& ref,
91	Permissions parentPermissions) const
92{
93	if (fPermissions->ContainsKey(NodeRef(ref)))
94		return fPermissions->Get(NodeRef(ref));
95	return parentPermissions;
96}
97
98