--- /dev/null
+/*
+ * Copyright (c) 2000,2002-2006,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@
+ */
+
+
+/*
+ * AuthorizationData.h
+ * Authorization
+ */
+
+#ifndef _H_AUTHORIZATIONDATA
+#define _H_AUTHORIZATIONDATA 1
+
+#include <Security/Authorization.h>
+#include <Security/AuthorizationPlugin.h>
+#include <security_cdsa_utilities/cssmdata.h>
+#include <CoreFoundation/CFDate.h>
+
+#include <security_utilities/refcount.h>
+#include <security_utilities/alloc.h>
+
+#include <map>
+#include <set>
+#include <string>
+
+// ptrdiff_t needed, so including STL type closest
+#include <vector>
+
+// @@@ Should consider making the various types better citizens by taking an Allocator, for now values are wiped.
+
+namespace Authorization
+{
+
+class AuthValueOverlay : public AuthorizationValue
+{
+public:
+ AuthValueOverlay(const string& stringValue) { length = stringValue.length(); data = const_cast<char *>(stringValue.c_str()); }
+ AuthValueOverlay(UInt32 inLength, void *inData) { length = inLength; data = inData; }
+};
+
+class AuthValueRef;
+
+class AuthValue : public RefCount
+{
+ friend class AuthValueRef;
+private:
+ AuthValue(const AuthValue& value) {}
+protected:
+ AuthValue(const AuthorizationValue &value);
+ AuthValue(UInt32 length, void *data);
+public:
+ AuthValue &operator = (const AuthValue &other);
+ ~AuthValue();
+ void fillInAuthorizationValue(AuthorizationValue &value);
+ const AuthorizationValue& value() const { return mValue; }
+private:
+ AuthorizationValue mValue;
+ mutable bool mOwnsValue;
+};
+
+// AuthValueRef impl
+class AuthValueRef : public RefPointer<AuthValue>
+{
+public:
+ AuthValueRef(const AuthValue &value);
+ AuthValueRef(const AuthorizationValue &value);
+ AuthValueRef(UInt32 length, void *data);
+};
+
+
+// vector should become a member with accessors
+class AuthValueVector : public vector<AuthValueRef>
+{
+public:
+ AuthValueVector() {}
+ ~AuthValueVector() {}
+
+ AuthValueVector &operator = (const AuthorizationValueVector& valueVector);
+
+ void copy(AuthorizationValueVector **data, size_t *length) const;
+};
+
+
+
+class AuthItemRef;
+
+class AuthItem : public RefCount
+{
+ friend class AuthItemRef;
+private:
+ AuthItem(const AuthItem& item);
+protected:
+ AuthItem(const AuthorizationItem &item);
+ AuthItem(AuthorizationString name);
+ AuthItem(AuthorizationString name, AuthorizationValue value);
+ AuthItem(AuthorizationString name, AuthorizationValue value, AuthorizationFlags flags);
+
+ bool operator < (const AuthItem &other) const;
+
+public:
+ AuthItem &operator = (const AuthItem &other);
+ ~AuthItem();
+
+ void fillInAuthorizationItem(AuthorizationItem &item);
+
+ AuthorizationString name() const { return mName; }
+ const AuthorizationValue& value() const { return mValue; }
+ string stringValue() const { return string(static_cast<char *>(mValue.data), mValue.length); }
+ AuthorizationFlags flags() const { return mFlags; }
+ void setFlags(AuthorizationFlags inFlags) { mFlags = inFlags; };
+
+private:
+ AuthorizationString mName;
+ AuthorizationValue mValue;
+ AuthorizationFlags mFlags;
+ mutable bool mOwnsName;
+ mutable bool mOwnsValue;
+
+public:
+ bool getBool(bool &value);
+ bool getString(string &value);
+ bool getCssmData(CssmAutoData &value);
+};
+
+class AuthItemRef : public RefPointer<AuthItem>
+{
+public:
+ AuthItemRef(const AuthorizationItem &item);
+ AuthItemRef(AuthorizationString name);
+ AuthItemRef(AuthorizationString name, AuthorizationValue value, AuthorizationFlags flags = 0);
+
+ bool operator < (const AuthItemRef &other) const
+ {
+ return **this < *other;
+ }
+};
+
+// set should become a member with accessors
+class AuthItemSet : public set<AuthItemRef>
+{
+public:
+ AuthItemSet();
+ ~AuthItemSet();
+ AuthItemSet(const AuthorizationItemSet *item);
+ AuthItemSet(const AuthItemSet& itemSet);
+
+ AuthItemSet &operator = (const AuthorizationItemSet& itemSet);
+ AuthItemSet &operator = (const AuthItemSet& itemSet);
+
+ void copy(AuthorizationItemSet *&data, size_t &length, Allocator &alloc = Allocator::standard()) const;
+ AuthorizationItemSet *copy() const;
+
+ char *firstItemName;
+
+public:
+ AuthItem *find(const char *name);
+
+private:
+ void duplicate(const AuthItemSet& itemSet);
+};
+
+class FindAuthItemByRightName
+{
+public:
+ FindAuthItemByRightName(const char *find_name) : name(find_name) { }
+
+ bool operator()( const AuthItemRef& authitem )
+ {
+ return (!strcmp(name, authitem->name()));
+ }
+ bool operator()( const AuthorizationItem* authitem )
+ {
+ return (!strcmp(name, authitem->name));
+ }
+
+private:
+ const char *name;
+};
+
+}; // namespace Authorization
+
+#endif /* ! _H_AUTHORIZATIONDATA */