--- /dev/null
+/*
+ * 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_