Page MenuHomePhabricator

D7465.id16820.diff
No OneTemporary

D7465.id16820.diff

Index: resources/sql/patches/20131030.pebkac-contact.sql
===================================================================
--- /dev/null
+++ resources/sql/patches/20131030.pebkac-contact.sql
@@ -0,0 +1,54 @@
+
+CREATE TABLE {$NAMESPACE}_pebkac.pebkac_contact (
+ id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ phid VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ ownerPHID VARCHAR(64) COLLATE utf8_bin,
+ contacterHash VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ sourceID INT UNSIGNED NOT NULL,
+ sourceLabel VARCHAR(255),
+ status INT UNSIGNED NOT NULL,
+ data longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin,
+ viewPolicy VARCHAR(64) NOT NULL,
+ editPolicy VARCHAR(64) NOT NULL,
+ dateCreated INT UNSIGNED NOT NULL,
+ dateModified INT UNSIGNED NOT NULL,
+ dateSupported INT UNSIGNED NOT NULL,
+ UNIQUE KEY `key_phid` (phid),
+ KEY `key_source` (sourceID, status, dateSupported, id),
+ KEY `key_owner` (ownerPHID, status, dateSupported, id),
+ KEY `key_contacter` (contacterHash, status, dateSupported, id)
+) ENGINE=InnoDB, COLLATE utf8_general_ci;
+
+CREATE TABLE {$NAMESPACE}_pebkac.pebkac_contactsource (
+ id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ phid VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ creatorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ name VARCHAR(255),
+ type INT UNSIGNED NOT NULL,
+ data longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin,
+ viewPolicy VARCHAR(64) NOT NULL,
+ editPolicy VARCHAR(64) NOT NULL,
+ dateCreated INT UNSIGNED NOT NULL,
+ dateModified INT UNSIGNED NOT NULL,
+ UNIQUE KEY `key_phid` (phid),
+ KEY `key_creator` (creatorPHID, type, dateModified),
+ KEY `key_type` (type, dateModified)
+) ENGINE=InnoDB, COLLATE utf8_general_ci;
+
+CREATE TABLE {$NAMESPACE}_pebkac.edge (
+ src VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ type VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ dst VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ dateCreated INT UNSIGNED NOT NULL,
+ seq INT UNSIGNED NOT NULL,
+ dataID INT UNSIGNED,
+ PRIMARY KEY (src, type, dst),
+ KEY (src, type, dateCreated, seq)
+) ENGINE=InnoDB, COLLATE utf8_general_ci;
+
+CREATE TABLE {$NAMESPACE}_pebkac.edgedata (
+ id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ data LONGTEXT NOT NULL COLLATE utf8_bin
+) ENGINE=InnoDB, COLLATE utf8_general_ci;
Index: src/__phutil_library_map__.php
===================================================================
--- src/__phutil_library_map__.php
+++ src/__phutil_library_map__.php
@@ -873,6 +873,18 @@
'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php',
'PasteMockMailReceiver' => 'applications/paste/mail/PasteMockMailReceiver.php',
'PasteReplyHandler' => 'applications/paste/mail/PasteReplyHandler.php',
+ 'PebkacContact' => 'applications/pebkac/storage/PebkacContact.php',
+ 'PebkacContactEditController' => 'applications/pebkac/controller/PebkacContactEditController.php',
+ 'PebkacContactQuery' => 'applications/pebkac/query/PebkacContactQuery.php',
+ 'PebkacContactSource' => 'applications/pebkac/storage/PebkacContactSource.php',
+ 'PebkacContactSourceEditController' => 'applications/pebkac/controller/PebkacContactSourceEditController.php',
+ 'PebkacContactSourceQuery' => 'applications/pebkac/query/PebkacContactSourceQuery.php',
+ 'PebkacContactSourceViewController' => 'applications/pebkac/controller/PebkacContactSourceViewController.php',
+ 'PebkacContactViewController' => 'applications/pebkac/controller/PebkacContactViewController.php',
+ 'PebkacController' => 'applications/pebkac/controller/PebkacController.php',
+ 'PebkacDAO' => 'applications/pebkac/storage/PebkacDAO.php',
+ 'PebkacPHIDTypeContact' => 'applications/pebkac/phid/PebkacPHIDTypeContact.php',
+ 'PebkacPHIDTypeContactSource' => 'applications/pebkac/phid/PebkacPHIDTypeContactSource.php',
'Phabricator404Controller' => 'applications/base/controller/Phabricator404Controller.php',
'PhabricatorAWSConfigOptions' => 'applications/config/option/PhabricatorAWSConfigOptions.php',
'PhabricatorAccessControlTestCase' => 'applications/base/controller/__tests__/PhabricatorAccessControlTestCase.php',
@@ -923,6 +935,7 @@
'PhabricatorApplicationPHIDTypeApplication' => 'applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php',
'PhabricatorApplicationPHPAST' => 'applications/phpast/application/PhabricatorApplicationPHPAST.php',
'PhabricatorApplicationPaste' => 'applications/paste/application/PhabricatorApplicationPaste.php',
+ 'PhabricatorApplicationPebkac' => 'applications/pebkac/application/PhabricatorApplicationPebkac.php',
'PhabricatorApplicationPeople' => 'applications/people/application/PhabricatorApplicationPeople.php',
'PhabricatorApplicationPhame' => 'applications/phame/application/PhabricatorApplicationPhame.php',
'PhabricatorApplicationPhlux' => 'applications/phlux/application/PhabricatorApplicationPhlux.php',
@@ -3124,6 +3137,26 @@
'PasteEmbedView' => 'AphrontView',
'PasteMockMailReceiver' => 'PhabricatorObjectMailReceiver',
'PasteReplyHandler' => 'PhabricatorMailReplyHandler',
+ 'PebkacContact' =>
+ array(
+ 0 => 'PebkacDAO',
+ 1 => 'PhabricatorPolicyInterface',
+ ),
+ 'PebkacContactEditController' => 'PhabricatorController',
+ 'PebkacContactQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
+ 'PebkacContactSource' =>
+ array(
+ 0 => 'PebkacDAO',
+ 1 => 'PhabricatorPolicyInterface',
+ ),
+ 'PebkacContactSourceEditController' => 'PhabricatorController',
+ 'PebkacContactSourceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
+ 'PebkacContactSourceViewController' => 'PhabricatorController',
+ 'PebkacContactViewController' => 'PhabricatorController',
+ 'PebkacController' => 'PhabricatorController',
+ 'PebkacDAO' => 'PhabricatorLiskDAO',
+ 'PebkacPHIDTypeContact' => 'PhabricatorPHIDType',
+ 'PebkacPHIDTypeContactSource' => 'PhabricatorPHIDType',
'Phabricator404Controller' => 'PhabricatorController',
'PhabricatorAWSConfigOptions' => 'PhabricatorApplicationConfigOptions',
'PhabricatorAccessControlTestCase' => 'PhabricatorTestCase',
@@ -3173,6 +3206,7 @@
'PhabricatorApplicationPHIDTypeApplication' => 'PhabricatorPHIDType',
'PhabricatorApplicationPHPAST' => 'PhabricatorApplication',
'PhabricatorApplicationPaste' => 'PhabricatorApplication',
+ 'PhabricatorApplicationPebkac' => 'PhabricatorApplication',
'PhabricatorApplicationPeople' => 'PhabricatorApplication',
'PhabricatorApplicationPhame' => 'PhabricatorApplication',
'PhabricatorApplicationPhlux' => 'PhabricatorApplication',
Index: src/applications/pebkac/application/PhabricatorApplicationPebkac.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/application/PhabricatorApplicationPebkac.php
@@ -0,0 +1,36 @@
+<?php
+
+final class PhabricatorApplicationPebkac extends PhabricatorApplication {
+
+ public function isBeta() {
+ return true;
+ }
+
+ public function shouldAppearInLaunchView() {
+ // try to hide this even more for now
+ return false;
+ }
+
+ public function canUninstall() {
+ return true;
+ }
+
+ public function getRoutes() {
+ return array(
+ '/pebkac/' => array(
+ 'contact/' => array(
+ 'view/(?P<id>[1-9]\d*)/' => 'PebkacContactViewController',
+ 'edit/(?P<id>[1-9]\d*)/' => 'PebkacContactEditController',
+ 'new/' => 'PebkacContactEditController',
+ ),
+ 'contactsource/' => array(
+ 'view/(?P<id>[1-9]\d*)/' => 'PebkacContactSourceViewController',
+ 'edit/(?P<id>[1-9]\d*)/' => 'PebkacContactSourceEditController',
+ 'new/' => 'PebkacContactSourceEditController',
+ ),
+ ),
+ );
+ }
+
+}
+
Index: src/applications/pebkac/controller/PebkacContactEditController.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/controller/PebkacContactEditController.php
@@ -0,0 +1,49 @@
+<?php
+
+final class PebkacContactEditController extends PhabricatorController {
+
+ private $contactID;
+
+ public function setContactID($contact_id) {
+ $this->contactID = $contact_id;
+ return $this;
+ }
+ public function getContactID() {
+ return $this->contactID;
+ }
+
+ public function willProcessRequest(array $data) {
+ $this->setContactID(idx($data, 'id'));
+ }
+
+ public function processRequest() {
+ $request = $this->getRequest();
+ $user = $request->getUser();
+
+ $contact_id = $this->getContactID();
+ $is_new = !$contact_id;
+
+ if ($is_new) {
+ $contact = new PebkacContact();
+
+ } else {
+ $contact = id(new PebkacContactQuery())
+ ->setViewer($user)
+ ->withIDs(array($contact_id))
+ ->executeOne();
+ }
+
+ if (!$contact) {
+ return new Aphront404Response();
+ }
+
+ $title = 'TODO';
+
+ return $this->buildApplicationPage(
+ 'TODO',
+ array(
+ 'title' => $title,
+ 'device' => true));
+ }
+
+}
Index: src/applications/pebkac/controller/PebkacContactSourceEditController.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/controller/PebkacContactSourceEditController.php
@@ -0,0 +1,48 @@
+<?php
+
+final class PebkacContactSourceEditController extends PhabricatorController {
+
+ private $contactSourceID;
+
+ public function setContactSourceID($contact_source_id) {
+ $this->contactSourceID = $contact_source_id;
+ return $this;
+ }
+ public function getContactSourceID() {
+ return $this->contactSourceID;
+ }
+
+ public function willProcessRequest(array $data) {
+ $this->setContactSourceID(idx($data, 'id'));
+ }
+
+ public function processRequest() {
+ $request = $this->getRequest();
+ $user = $request->getUser();
+
+ $contact_source_id = $this->getContactSourceID();
+ $is_new = !$contact_source_id;
+
+ if ($is_new) {
+ $contact_source = new PebkacContactSource();
+
+ } else {
+ $contact_source = id(new PebkacContactSourceQuery())
+ ->setViewer($user)
+ ->withIDs(array($contact_source_id))
+ ->executeOne();
+ }
+
+ if (!$contact_source) {
+ return new Aphront404Response();
+ }
+
+ $title = 'TODO';
+
+ return $this->buildApplicationPage(
+ 'TODO',
+ array(
+ 'title' => $title,
+ 'device' => true));
+ }
+}
Index: src/applications/pebkac/controller/PebkacContactSourceViewController.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/controller/PebkacContactSourceViewController.php
@@ -0,0 +1,45 @@
+<?php
+
+final class PebkacContactSourceViewController extends PhabricatorController {
+
+ private $contactSourceID;
+
+ public function setContactSourceID($contact_source_id) {
+ $this->contactSourceID = $contact_source_id;
+ return $this;
+ }
+ public function getContactSourceID() {
+ return $this->contactSourceID;
+ }
+
+ public function willProcessRequest(array $data) {
+ $this->setContactSourceID(idx($data, 'id'));
+ }
+
+ public function processRequest() {
+ $request = $this->getRequest();
+ $user = $request->getUser();
+
+ $contact_source_id = $this->getContactSourceID();
+ if (!$contact_source_id) {
+ return new Aphront404Response();
+ }
+
+ $contact_source = id(new PebkacContactSourceQuery())
+ ->setViewer($user)
+ ->withIDs(array($contact_source_id))
+ ->executeOne();
+
+ if (!$contact_source) {
+ return new Aphront404Response();
+ }
+
+ $title = 'TODO';
+
+ return $this->buildApplicationPage(
+ 'TODO',
+ array(
+ 'title' => $title,
+ 'device' => true));
+ }
+}
Index: src/applications/pebkac/controller/PebkacContactViewController.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/controller/PebkacContactViewController.php
@@ -0,0 +1,45 @@
+<?php
+
+final class PebkacContactViewController extends PhabricatorController {
+
+ private $contactID;
+
+ public function setContactID($contact_id) {
+ $this->contactID = $contact_id;
+ return $this;
+ }
+ public function getContactID() {
+ return $this->contactID;
+ }
+
+ public function willProcessRequest(array $data) {
+ $this->setContactID(idx($data, 'id'));
+ }
+
+ public function processRequest() {
+ $request = $this->getRequest();
+ $user = $request->getUser();
+
+ $contact_id = $this->getContactID();
+ if (!$contact_id) {
+ return new Aphront404Response();
+ }
+
+ $contact = id(new PebkacContactQuery())
+ ->setViewer($user)
+ ->withIDs(array($contact_id))
+ ->executeOne();
+
+ if (!$contact) {
+ return new Aphront404Response();
+ }
+
+ $title = 'TODO';
+
+ return $this->buildApplicationPage(
+ 'TODO',
+ array(
+ 'title' => $title,
+ 'device' => true));
+ }
+}
Index: src/applications/pebkac/controller/PebkacController.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/controller/PebkacController.php
@@ -0,0 +1,5 @@
+<?php
+
+abstract class PebkacController extends PhabricatorController {
+
+}
Index: src/applications/pebkac/phid/PebkacPHIDTypeContact.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/phid/PebkacPHIDTypeContact.php
@@ -0,0 +1,46 @@
+<?php
+
+final class PebkacPHIDTypeContact
+ extends PhabricatorPHIDType {
+
+ const TYPECONST = 'PEBC';
+
+ public function getTypeConstant() {
+ return self::TYPECONST;
+ }
+
+ public function getTypeName() {
+ return pht('Contact');
+ }
+
+ public function newObject() {
+ return new PebkacContact();
+ }
+
+ protected function buildQueryForObjects(
+ PhabricatorObjectQuery $query,
+ array $phids) {
+
+ return id(new PebkacContactQuery())
+ ->withPHIDs($phids);
+ }
+
+ public function loadHandles(
+ PhabricatorHandleQuery $query,
+ array $handles,
+ array $objects) {
+
+ $viewer = $query->getViewer();
+ foreach ($handles as $phid => $handle) {
+ $contact = $objects[$phid];
+
+ $handle->setName($contact->getLabel($viewer));
+ $handle->setURI($contact->getHref());
+ }
+ }
+
+ public function canLoadNamedObject($name) {
+ return false;
+ }
+
+}
Index: src/applications/pebkac/phid/PebkacPHIDTypeContactSource.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/phid/PebkacPHIDTypeContactSource.php
@@ -0,0 +1,46 @@
+<?php
+
+final class PebkacPHIDTypeContactSource
+ extends PhabricatorPHIDType {
+
+ const TYPECONST = 'PEBS';
+
+ public function getTypeConstant() {
+ return self::TYPECONST;
+ }
+
+ public function getTypeName() {
+ return pht('Contact Source');
+ }
+
+ public function newObject() {
+ return new PebkacContactSource();
+ }
+
+ protected function buildQueryForObjects(
+ PhabricatorObjectQuery $query,
+ array $phids) {
+
+ return id(new PebkacContactSourceQuery())
+ ->withPHIDs($phids);
+ }
+
+ public function loadHandles(
+ PhabricatorHandleQuery $query,
+ array $handles,
+ array $objects) {
+
+ $viewer = $query->getViewer();
+ foreach ($handles as $phid => $handle) {
+ $contact_source = $objects[$phid];
+
+ $handle->setName($contact_source->getName());
+ $handle->setURI($contact_source->getHref());
+ }
+ }
+
+ public function canLoadNamedObject($name) {
+ return false;
+ }
+
+}
Index: src/applications/pebkac/query/PebkacContactQuery.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/query/PebkacContactQuery.php
@@ -0,0 +1,75 @@
+<?php
+
+final class PebkacContactQuery
+ extends PhabricatorCursorPagedPolicyAwareQuery {
+
+ private $ids;
+ private $phids;
+ private $sourceIDs;
+
+ public function withIDs(array $ids) {
+ $this->ids = $ids;
+ return $this;
+ }
+
+ public function withPHIDs(array $phids) {
+ $this->phids = $phids;
+ return $this;
+ }
+
+ public function withSourceIDs($source_ids) {
+ $this->sourceIDs = $source_ids;
+ return $this;
+ }
+
+
+ public function loadPage() {
+ $table = new PebkacContact();
+ $conn_r = $table->establishConnection('r');
+
+ $data = queryfx_all(
+ $conn_r,
+ 'SELECT FROM %T %Q %Q %Q',
+ $table->getTableName(),
+ $this->buildWhereClause($conn_r),
+ $this->buildOrderClause($conn_r),
+ $this->buildLimitClause($conn_r));
+
+ return $table->loadAllFromArray($data);
+ }
+
+ protected function buildWhereClause($conn_r) {
+ $where = array();
+
+ $where[] = $this->buildPagingClause($conn_r);
+
+ if ($this->sourceID) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'sourceID IN (%Ld)',
+ $this->sourceIDs);
+ }
+
+ if ($this->ids) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'id IN (%Ld)',
+ $this->ids);
+ }
+
+ if ($this->phids) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'phid IN (%Ls)',
+ $this->phids);
+ }
+
+ return $this->formatWhereClause($where);
+ }
+
+ public function getQueryApplicationClass() {
+ return 'PhabricatorApplicationPebkac';
+ }
+
+}
+
Index: src/applications/pebkac/query/PebkacContactSourceQuery.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/query/PebkacContactSourceQuery.php
@@ -0,0 +1,87 @@
+<?php
+
+final class PebkacContactSourceQuery
+ extends PhabricatorCursorPagedPolicyAwareQuery {
+
+ private $ids;
+ private $phids;
+ private $creatorPHIDs;
+ private $types;
+
+ public function withIDs(array $ids) {
+ $this->ids = $ids;
+ return $this;
+ }
+
+ public function withPHIDs(array $phids) {
+ $this->phids = $phids;
+ return $this;
+ }
+
+ public function withCreatorPHIDs(array $phids) {
+ $this->CreatorPHIDs = $phids;
+ return $this;
+ }
+
+ public function withTypes($types) {
+ $this->types = $types;
+ return $this;
+ }
+
+
+ public function loadPage() {
+ $table = new PebkacContactSource();
+ $conn_r = $table->establishConnection('r');
+
+ $data = queryfx_all(
+ $conn_r,
+ 'SELECT FROM %T %Q %Q %Q',
+ $table->getTableName(),
+ $this->buildWhereClause($conn_r),
+ $this->buildOrderClause($conn_r),
+ $this->buildLimitClause($conn_r));
+
+ return $table->loadAllFromArray($data);
+ }
+
+ protected function buildWhereClause($conn_r) {
+ $where = array();
+
+ $where[] = $this->buildPagingClause($conn_r);
+
+ if ($this->creatorPHIDs) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'creatorPHID IN (%Ls)',
+ $this->creatorPHIDs);
+ }
+
+ if ($this->types) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'type IN (%Ld)',
+ $this->types);
+ }
+
+ if ($this->ids) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'id IN (%Ld)',
+ $this->ids);
+ }
+
+ if ($this->phids) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'phid IN (%Ls)',
+ $this->phids);
+ }
+
+ return $this->formatWhereClause($where);
+ }
+
+ public function getQueryApplicationClass() {
+ return 'PhabricatorApplicationPebkac';
+ }
+
+}
Index: src/applications/pebkac/storage/PebkacContact.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/storage/PebkacContact.php
@@ -0,0 +1,83 @@
+<?php
+
+final class PebkacContact
+ extends PebkacDAO
+ implements PhabricatorPolicyInterface {
+
+ protected $ownerPHID;
+ protected $sourceID;
+ protected $sourceLabel;
+ protected $data;
+ protected $mailKey;
+ protected $dateSupported;
+ protected $viewPolicy;
+ protected $editPolicy;
+
+ public function getConfiguration() {
+ return array(
+ self::CONFIG_AUX_PHID => true,
+ self::CONFIG_SERIALIZATION => array(
+ 'data' => self::SERIALIZATION_JSON,
+ ),
+ ) + parent::getConfiguration();
+ }
+
+ public function generatePHID() {
+ return PhabricatorPHID::generateNewPHID(
+ PebkacPHIDTypeContact::TYPECONST);
+ }
+
+ public function save() {
+ if (!$this->getMailKey()) {
+ $this->setMailKey(Filesystem::readRandomCharacters(20));
+ }
+ return parent::save();
+ }
+
+ public function getHref() {
+ return '/pebkac/contact/view/'.$this->getID().'/';
+ }
+
+ public function getLabel(PhabricatorUser $viewer) {
+ // this is generated at the time the contact is created based on
+ // the configuration from the contact source. It is typically
+ // something like 'Twitter'.
+ $source_label = $this->getSourceLabel();
+
+ return pht(
+ 'Contact via %s @ %s.',
+ $source_label,
+ phabricator_datetime($this->getDateCreated(), $viewer));
+ }
+
+ public function getCapabilities() {
+ return array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ );
+ }
+
+ public function getPolicy($capability) {
+ switch ($capability) {
+ case PhabricatorPolicyCapability::CAN_VIEW:
+ return $this->getViewPolicy();
+ case PhabricatorPolicyCapability::CAN_EDIT:
+ return $this->getEditPolicy();
+ }
+ }
+
+ public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
+ return $this->ownerPHID == $viewer->getPHID();
+ }
+
+ public function describeAutomaticCapability($capability) {
+ switch ($capability) {
+ case PhabricatorPolicyCapability::CAN_VIEW:
+ return pht('Owners of a contact can always view it.');
+ case PhabricatorPolicyCapability::CAN_EDIT:
+ return pht('Owners of a contact can always edit it.');
+ }
+ return null;
+ }
+
+}
Index: src/applications/pebkac/storage/PebkacContactSource.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/storage/PebkacContactSource.php
@@ -0,0 +1,70 @@
+<?php
+
+final class PebkacContactSource
+ extends PebkacDAO
+ implements PhabricatorPolicyInterface {
+
+ protected $creatorPHID;
+ protected $name;
+ protected $type;
+ protected $data;
+ protected $mailKey;
+ protected $viewPolicy;
+ protected $editPolicy;
+
+ public function getConfiguration() {
+ return array(
+ self::CONFIG_AUX_PHID => true,
+ self::CONFIG_SERIALIZATION => array(
+ 'data' => self::SERIALIZATION_JSON,
+ ),
+ ) + parent::getConfiguration();
+ }
+
+ public function generatePHID() {
+ return PhabricatorPHID::generateNewPHID(
+ PebkacPHIDTypeContactSource::TYPECONST);
+ }
+
+ public function save() {
+ if (!$this->getMailKey()) {
+ $this->setMailKey(Filesystem::readRandomCharacters(20));
+ }
+ return parent::save();
+ }
+
+ public function getHref() {
+ return '/pebkac/contactsource/view/'.$this->getID().'/';
+ }
+
+ public function getCapabilities() {
+ return array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ );
+ }
+
+ public function getPolicy($capability) {
+ switch ($capability) {
+ case PhabricatorPolicyCapability::CAN_VIEW:
+ return $this->getViewPolicy();
+ case PhabricatorPolicyCapability::CAN_EDIT:
+ return $this->getEditPolicy();
+ }
+ }
+
+ public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
+ return $this->creatorPHID == $viewer->getPHID();
+ }
+
+ public function describeAutomaticCapability($capability) {
+ switch ($capability) {
+ case PhabricatorPolicyCapability::CAN_VIEW:
+ return pht('Creators of a contact source can always view it.');
+ case PhabricatorPolicyCapability::CAN_EDIT:
+ return pht('Creators of a contact source can always edit it.');
+ }
+ return null;
+ }
+
+}
Index: src/applications/pebkac/storage/PebkacDAO.php
===================================================================
--- /dev/null
+++ src/applications/pebkac/storage/PebkacDAO.php
@@ -0,0 +1,9 @@
+<?php
+
+abstract class PebkacDAO extends PhabricatorLiskDAO {
+
+ public function getApplicationName() {
+ return 'pebkac';
+ }
+
+}
Index: src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
===================================================================
--- src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
+++ src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
@@ -208,6 +208,10 @@
'type' => 'db',
'name' => 'policy',
),
+ 'db.pebkac' => array(
+ 'type' => 'db',
+ 'name' => 'pebkac',
+ ),
'0000.legacy.sql' => array(
'type' => 'sql',
'name' => $this->getPatchPath('0000.legacy.sql'),
@@ -1712,6 +1716,10 @@
'type' => 'sql',
'name' => $this->getPatchPath('20131026.commitstatus.sql'),
),
+ '20131030.pebkac-contact.sql' => array(
+ 'type' => 'sql',
+ 'name' => $this->getPatchPath('20131030.pebkac-contact.sql'),
+ ),
);
}
}

File Metadata

Mime Type
text/plain
Expires
Thu, Oct 16, 1:22 AM (1 w, 1 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
8962066
Default Alt Text
D7465.id16820.diff (24 KB)

Event Timeline