Path: blob/master/src/applications/drydock/storage/DrydockAuthorization.php
12256 views
<?php12final class DrydockAuthorization extends DrydockDAO3implements4PhabricatorPolicyInterface,5PhabricatorConduitResultInterface {67const OBJECTAUTH_ACTIVE = 'active';8const OBJECTAUTH_INACTIVE = 'inactive';910const BLUEPRINTAUTH_REQUESTED = 'requested';11const BLUEPRINTAUTH_AUTHORIZED = 'authorized';12const BLUEPRINTAUTH_DECLINED = 'declined';1314protected $blueprintPHID;15protected $blueprintAuthorizationState;16protected $objectPHID;17protected $objectAuthorizationState;1819private $blueprint = self::ATTACHABLE;20private $object = self::ATTACHABLE;2122protected function getConfiguration() {23return array(24self::CONFIG_AUX_PHID => true,25self::CONFIG_COLUMN_SCHEMA => array(26'blueprintAuthorizationState' => 'text32',27'objectAuthorizationState' => 'text32',28),29self::CONFIG_KEY_SCHEMA => array(30'key_unique' => array(31'columns' => array('objectPHID', 'blueprintPHID'),32'unique' => true,33),34'key_blueprint' => array(35'columns' => array('blueprintPHID', 'blueprintAuthorizationState'),36),37'key_object' => array(38'columns' => array('objectPHID', 'objectAuthorizationState'),39),40),41) + parent::getConfiguration();42}4344public function generatePHID() {45return PhabricatorPHID::generateNewPHID(46DrydockAuthorizationPHIDType::TYPECONST);47}4849public function attachBlueprint(DrydockBlueprint $blueprint) {50$this->blueprint = $blueprint;51return $this;52}5354public function getBlueprint() {55return $this->assertAttached($this->blueprint);56}5758public function attachObject($object) {59$this->object = $object;60return $this;61}6263public function getObject() {64return $this->assertAttached($this->object);65}6667public static function getBlueprintStateIcon($state) {68$map = array(69self::BLUEPRINTAUTH_REQUESTED => 'fa-exclamation-circle pink',70self::BLUEPRINTAUTH_AUTHORIZED => 'fa-check-circle green',71self::BLUEPRINTAUTH_DECLINED => 'fa-times red',72);7374return idx($map, $state, null);75}7677public static function getBlueprintStateName($state) {78$map = array(79self::BLUEPRINTAUTH_REQUESTED => pht('Requested'),80self::BLUEPRINTAUTH_AUTHORIZED => pht('Authorized'),81self::BLUEPRINTAUTH_DECLINED => pht('Declined'),82);8384return idx($map, $state, pht('<Unknown: %s>', $state));85}8687public static function getObjectStateName($state) {88$map = array(89self::OBJECTAUTH_ACTIVE => pht('Active'),90self::OBJECTAUTH_INACTIVE => pht('Inactive'),91);9293return idx($map, $state, pht('<Unknown: %s>', $state));94}9596public function isAuthorized() {97$state = $this->getBlueprintAuthorizationState();98return ($state == self::BLUEPRINTAUTH_AUTHORIZED);99}100101/**102* Apply external authorization effects after a user changes the value of a103* blueprint selector control an object.104*105* @param PhabricatorUser User applying the change.106* @param phid Object PHID change is being applied to.107* @param list<phid> Old blueprint PHIDs.108* @param list<phid> New blueprint PHIDs.109* @return void110*/111public static function applyAuthorizationChanges(112PhabricatorUser $viewer,113$object_phid,114array $old,115array $new) {116117$old_phids = array_fuse($old);118$new_phids = array_fuse($new);119120$rem_phids = array_diff_key($old_phids, $new_phids);121$add_phids = array_diff_key($new_phids, $old_phids);122123$altered_phids = $rem_phids + $add_phids;124125if (!$altered_phids) {126return;127}128129$authorizations = id(new DrydockAuthorizationQuery())130->setViewer(PhabricatorUser::getOmnipotentUser())131->withObjectPHIDs(array($object_phid))132->withBlueprintPHIDs($altered_phids)133->execute();134$authorizations = mpull($authorizations, null, 'getBlueprintPHID');135136$state_active = self::OBJECTAUTH_ACTIVE;137$state_inactive = self::OBJECTAUTH_INACTIVE;138139$state_requested = self::BLUEPRINTAUTH_REQUESTED;140141// Disable the object side of the authorization for any existing142// authorizations.143foreach ($rem_phids as $rem_phid) {144$authorization = idx($authorizations, $rem_phid);145if (!$authorization) {146continue;147}148149$authorization150->setObjectAuthorizationState($state_inactive)151->save();152}153154// For new authorizations, either add them or reactivate them depending155// on the current state.156foreach ($add_phids as $add_phid) {157$needs_update = false;158159$authorization = idx($authorizations, $add_phid);160if (!$authorization) {161$authorization = id(new DrydockAuthorization())162->setObjectPHID($object_phid)163->setObjectAuthorizationState($state_active)164->setBlueprintPHID($add_phid)165->setBlueprintAuthorizationState($state_requested);166167$needs_update = true;168} else {169$current_state = $authorization->getObjectAuthorizationState();170if ($current_state != $state_active) {171$authorization->setObjectAuthorizationState($state_active);172$needs_update = true;173}174}175176if ($needs_update) {177$authorization->save();178}179}180}181182/* -( PhabricatorPolicyInterface )----------------------------------------- */183184185public function getCapabilities() {186return array(187PhabricatorPolicyCapability::CAN_VIEW,188PhabricatorPolicyCapability::CAN_EDIT,189);190}191192public function getPolicy($capability) {193return $this->getBlueprint()->getPolicy($capability);194}195196public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {197return $this->getBlueprint()->hasAutomaticCapability($capability, $viewer);198}199200public function describeAutomaticCapability($capability) {201return pht(202'An authorization inherits the policies of the blueprint it '.203'authorizes access to.');204}205206207/* -( PhabricatorConduitResultInterface )---------------------------------- */208209210public function getFieldSpecificationsForConduit() {211return array(212id(new PhabricatorConduitSearchFieldSpecification())213->setKey('blueprintPHID')214->setType('phid')215->setDescription(pht(216'PHID of the blueprint this request was made for.')),217id(new PhabricatorConduitSearchFieldSpecification())218->setKey('blueprintAuthorizationState')219->setType('map<string, wild>')220->setDescription(pht('Authorization state of this request.')),221id(new PhabricatorConduitSearchFieldSpecification())222->setKey('objectPHID')223->setType('phid')224->setDescription(pht(225'PHID of the object which requested authorization.')),226id(new PhabricatorConduitSearchFieldSpecification())227->setKey('objectAuthorizationState')228->setType('map<string, wild>')229->setDescription(pht('Authorization state of the requesting object.')),230);231}232233public function getFieldValuesForConduit() {234$blueprint_state = $this->getBlueprintAuthorizationState();235$object_state = $this->getObjectAuthorizationState();236return array(237'blueprintPHID' => $this->getBlueprintPHID(),238'blueprintAuthorizationState' => array(239'value' => $blueprint_state,240'name' => self::getBlueprintStateName($blueprint_state),241),242'objectPHID' => $this->getObjectPHID(),243'objectAuthorizationState' => array(244'value' => $object_state,245'name' => self::getObjectStateName($object_state),246),247);248}249250public function getConduitSearchAttachments() {251return array(252);253}254255}256257258