15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_MAC_SCOPED_AUTHORIZATIONREF_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_MAC_SCOPED_AUTHORIZATIONREF_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <Security/Authorization.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScopedAuthorizationRef maintains ownership of an AuthorizationRef. It is 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// patterned after the scoped_ptr interface. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace mac { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedAuthorizationRef { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedAuthorizationRef(AuthorizationRef authorization = NULL) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : authorization_(authorization) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedAuthorizationRef() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (authorization_) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void reset(AuthorizationRef authorization = NULL) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (authorization_ != authorization) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (authorization_) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authorization_ = authorization; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(AuthorizationRef that) const { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return authorization_ == that; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator!=(AuthorizationRef that) const { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return authorization_ != that; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operator AuthorizationRef() const { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return authorization_; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthorizationRef* operator&() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &authorization_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthorizationRef get() const { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return authorization_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void swap(ScopedAuthorizationRef& that) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthorizationRef temp = that.authorization_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) that.authorization_ = authorization_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authorization_ = temp; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ScopedAuthorizationRef::release() is like scoped_ptr<>::release. It is 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOT a wrapper for AuthorizationFree(). To force a 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ScopedAuthorizationRef object to call AuthorizationFree(), use 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ScopedAuthorizationRef::reset(). 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthorizationRef release() WARN_UNUSED_RESULT { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthorizationRef temp = authorization_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authorization_ = NULL; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return temp; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthorizationRef authorization_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedAuthorizationRef); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace mac 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_MAC_SCOPED_AUTHORIZATIONREF_H_ 86