Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F18787755
D7465.id16820.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
24 KB
Referenced Files
None
Subscribers
None
D7465.id16820.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D7465: Nuance - get some scaffolding up there
Attached
Detach File
Event Timeline
Log In to Comment