]> git.saurik.com Git - apple/securityd.git/blob - src/process.h
securityd-36489.tar.gz
[apple/securityd.git] / src / process.h
1 /*
2 * Copyright (c) 2000-2004 Apple Computer, Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25 //
26 // process - track a single client process and its belongings
27 //
28 #ifndef _H_PROCESS
29 #define _H_PROCESS
30
31 #include "structure.h"
32 #include <security_agent_client/agentclient.h>
33 #include <security_utilities/refcount.h>
34 #include <security_utilities/ccaudit.h>
35 #include "clientid.h"
36 #include "csproxy.h"
37 #include "localkey.h"
38 #include "notifications.h"
39 #include <string>
40
41 using MachPlusPlus::Port;
42 using MachPlusPlus::TaskPort;
43
44 class Session;
45 class LocalDatabase;
46 class AuthorizationToken;
47
48
49 //
50 // A Process object represents a UNIX process (and associated Mach Task) that has
51 // had contact with us and may have some state associated with it. It primarily tracks
52 // the process nature of the client. Individual threads in the client are tracked by
53 // Connection objects.
54 //
55 // Code Signing-style Guest identities are managed in two of our mix-ins. The two play
56 // distinct but related roles:
57 // * CodeSigningHost manages the public identity of guests within the client.
58 // In this relationship, securityd provides registry and proxy services to the client.
59 // * ClientIdentification tracks the identity of guests in the client *as securityd clients*.
60 // It is concerned with which guest is asking for securityd services, and whether this
61 // should be granted.
62 // Often, the two form a loop: ClientIdentification uses CodeSigningHost to determine
63 // the guest client identity, but it does so through public (Mach IPC) interfaces, because
64 // clients may implement their own proxy (though currently not registry) services.
65 // We could short-circuit the IPC leg in those cases where securityd serves itself,
66 // but there's no evidence (yet) that this is worth the trouble.
67 //
68 class Process : public PerProcess,
69 public CodeSigningHost, public ClientIdentification {
70 public:
71 Process(Port servicePort, TaskPort tPort,
72 const ClientSetupInfo *info, const char *identity,
73 const CommonCriteria::AuditToken &audit);
74 virtual ~Process();
75
76 void reset(Port servicePort, TaskPort tPort,
77 const ClientSetupInfo *info, const char *identity,
78 const CommonCriteria::AuditToken &audit);
79
80 uid_t uid() const { return mUid; }
81 gid_t gid() const { return mGid; }
82 pid_t pid() const { return mPid; }
83 TaskPort taskPort() const { return mTaskPort; }
84 bool byteFlipped() const { return mByteFlipped; }
85
86 void addAuthorization(AuthorizationToken *auth);
87 void checkAuthorization(AuthorizationToken *auth);
88 bool removeAuthorization(AuthorizationToken *auth);
89
90 using PerProcess::kill;
91 void kill();
92
93 void changeSession(Port servicePort); // very special indeed
94
95 Session& session() const;
96
97 LocalDatabase &localStore();
98 Key *makeTemporaryKey(const CssmKey &key, CSSM_KEYATTR_FLAGS moreAttributes,
99 const AclEntryPrototype *owner);
100
101 // aclSequence is taken to serialize ACL validations to pick up mutual changes
102 Mutex aclSequence;
103
104 IFDUMP(void dumpNode());
105
106 private:
107 void setup(const ClientSetupInfo *info);
108
109 private:
110 // peer state: established during connection startup; fixed thereafter
111 TaskPort mTaskPort; // task port
112 bool mByteFlipped; // client's byte order is reverse of ours
113 pid_t mPid; // process id
114 uid_t mUid; // UNIX uid credential
115 gid_t mGid; // primary UNIX gid credential
116
117 // authorization dictionary
118 typedef multiset<AuthorizationToken *> AuthorizationSet;
119 AuthorizationSet mAuthorizations; // set of valid authorizations for process
120
121 // canonical local (transient) key store
122 RefPointer<LocalDatabase> mLocalStore;
123 };
124
125
126 //
127 // Convenience comparison
128 //
129 inline bool operator == (const Process &p1, const Process &p2)
130 {
131 return &p1 == &p2;
132 }
133
134
135 #endif //_H_PROCESS