]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_keychain/Security/ACL.h
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / libsecurity_keychain / Security / ACL.h
diff --git a/OSX/libsecurity_keychain/Security/ACL.h b/OSX/libsecurity_keychain/Security/ACL.h
new file mode 100644 (file)
index 0000000..5ad2a2d
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2002-2004,2011,2014 Apple Inc. All Rights Reserved.
+ * 
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+//
+// ACL.h - ACL control wrappers
+//
+#ifndef _SECURITY_ACL_H_
+#define _SECURITY_ACL_H_
+
+#include <Security/SecACL.h>
+#include <security_cdsa_utilities/cssmaclpod.h>
+#include <security_cdsa_client/aclclient.h>
+#include <security_cdsa_utilities/cssmdata.h>
+#include <security_utilities/seccfobject.h>
+#include "SecCFTypes.h"
+
+#include <vector>
+
+namespace Security {
+namespace KeychainCore {
+
+using CssmClient::AclBearer;
+
+class Access;
+class TrustedApplication;
+
+
+//
+// An ACL Entry for an Access object
+//
+class ACL : public SecCFObject {
+       NOCOPY(ACL)
+public:
+       SECCFFUNCTIONS(ACL, SecACLRef, errSecInvalidItemRef, gTypes().ACL)
+
+       // create from CSSM layer ACL entry
+       ACL(Access &acc, const AclEntryInfo &info,
+               Allocator &alloc = Allocator::standard());
+       // create from CSSM layer owner prototype
+       ACL(Access &acc, const AclOwnerPrototype &owner,
+               Allocator &alloc = Allocator::standard());
+       // create an "any" ACL
+       ACL(Access &acc, Allocator &alloc = Allocator::standard());
+       // create from "standard form" arguments (with empty application list)
+       ACL(Access &acc, string description, const CSSM_ACL_KEYCHAIN_PROMPT_SELECTOR &promptSelector,
+               Allocator &alloc = Allocator::standard());
+    virtual ~ACL();
+       
+       Allocator &allocator;
+       
+       enum State {
+               unchanged,                                      // unchanged from source
+               inserted,                                       // new
+               modified,                                       // was changed (replace)
+               deleted                                         // was deleted (now invalid)
+       };
+       State state() const { return mState; }
+       
+       enum Form {
+               invalidForm,                            // invalid
+               customForm,                                     // not a recognized format (but valid)
+               allowAllForm,                           // indiscriminate
+               appListForm                                     // list of apps + prompt confirm
+       };
+       Form form() const { return mForm; }
+       void form(Form f) { mForm = f; }
+       
+       Access &access;                                 // we belong to this Access
+       
+public:
+       AclAuthorizationSet &authorizations()   { return mAuthorizations; }
+       bool authorizes(AclAuthorization right);
+       void setAuthorization(CSSM_ACL_AUTHORIZATION_TAG auth)
+       { mAuthorizations.clear(); mAuthorizations.insert(auth); }
+       
+       typedef vector< SecPointer<TrustedApplication> > ApplicationList;
+       ApplicationList &applications()
+       { assert(form() == appListForm); return mAppList; }
+       void addApplication(TrustedApplication *app);
+       
+       CSSM_ACL_KEYCHAIN_PROMPT_SELECTOR &promptSelector()     { return mPromptSelector; }
+       string &promptDescription()                                                     { return mPromptDescription; }
+       
+       CSSM_ACL_HANDLE entryHandle() const     { return mCssmHandle; }
+       
+       static const CSSM_ACL_HANDLE ownerHandle = 0xff0e2743;  // pseudo-handle for owner ACL
+       bool isOwner() const                    { return mCssmHandle == ownerHandle; }
+       void makeOwner()                                { mCssmHandle = ownerHandle; }
+       
+       void modify();                                  // mark modified (update on commit)
+       void remove();                                  // mark removed (delete on commit)
+       
+       // produce chunk copies of CSSM forms; caller takes ownership
+       void copyAclEntry(AclEntryPrototype &proto, Allocator &alloc = Allocator::standard());
+       void copyAclOwner(AclOwnerPrototype &proto, Allocator &alloc = Allocator::standard());
+       
+public:
+       void setAccess(AclBearer &target, bool update = false,
+               const AccessCredentials *cred = NULL);
+
+public:
+       struct ParseError { };
+       
+public:
+       static const CSSM_ACL_KEYCHAIN_PROMPT_SELECTOR defaultSelector;
+       
+private:
+       void parse(const TypedList &subject);
+       void parsePrompt(const TypedList &subject);
+       void makeSubject();
+       void clearSubjects(Form newForm);
+
+private:
+       State mState;                                   // change state
+       Form mForm;                                             // format type
+
+       // AclEntryPrototype fields (minus subject, which is virtually constructed)
+       CSSM_ACL_HANDLE mCssmHandle;    // CSSM entry handle (for updates)
+       string mEntryTag;                               // CSSM entry tag (64 bytes or so, they say)
+       bool mDelegate;                                 // CSSM delegate flag
+       AclAuthorizationSet mAuthorizations; // rights for this ACL entry
+       
+       // composite AclEntryPrototype (constructed when needed)
+       TypedList *mSubjectForm;
+       
+       // following values valid only if form() == appListForm
+       ApplicationList mAppList;               // list of trusted applications
+       CSSM_ACL_KEYCHAIN_PROMPT_SELECTOR mPromptSelector; // selector field of PROMPT subject
+       string mPromptDescription;              // description field of PROMPT subject
+       Mutex mMutex;
+};
+
+
+} // end namespace KeychainCore
+} // end namespace Security
+
+#endif // !_SECURITY_ACL_H_