Page MenuHomePhabricator

D13394.id32433.diff
No OneTemporary

D13394.id32433.diff

diff --git a/resources/sql/autopatches/20150622.metamta.1.phid-col.sql b/resources/sql/autopatches/20150622.metamta.1.phid-col.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20150622.metamta.1.phid-col.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_metamta.metamta_mail
+ ADD phid VARBINARY(64) NOT NULL AFTER id;
diff --git a/resources/sql/autopatches/20150622.metamta.2.phid-mig.php b/resources/sql/autopatches/20150622.metamta.2.phid-mig.php
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20150622.metamta.2.phid-mig.php
@@ -0,0 +1,22 @@
+<?php
+
+$table = new PhabricatorMetaMTAMail();
+$conn_w = $table->establishConnection('w');
+
+echo pht('Assigning PHIDs to mails...')."\n";
+foreach (new LiskMigrationIterator($table) as $mail) {
+ $id = $mail->getID();
+
+ echo pht('Updating mail %d...', $id)."\n";
+ if ($mail->getPHID()) {
+ continue;
+ }
+
+ queryfx(
+ $conn_w,
+ 'UPDATE %T SET phid = %s WHERE id = %d',
+ $table->getTableName(),
+ $table->generatePHID(),
+ $id);
+}
+echo pht('Done.')."\n";
diff --git a/resources/sql/autopatches/20150622.metamta.3.phid-key.sql b/resources/sql/autopatches/20150622.metamta.3.phid-key.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20150622.metamta.3.phid-key.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_metamta.metamta_mail
+ ADD UNIQUE KEY `key_phid` (phid);
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2107,6 +2107,8 @@
'PhabricatorMetaMTAMail' => 'applications/metamta/storage/PhabricatorMetaMTAMail.php',
'PhabricatorMetaMTAMailBody' => 'applications/metamta/view/PhabricatorMetaMTAMailBody.php',
'PhabricatorMetaMTAMailBodyTestCase' => 'applications/metamta/view/__tests__/PhabricatorMetaMTAMailBodyTestCase.php',
+ 'PhabricatorMetaMTAMailPHIDType' => 'applications/metamta/phid/PhabricatorMetaMTAMailPHIDType.php',
+ 'PhabricatorMetaMTAMailQuery' => 'applications/metamta/query/PhabricatorMetaMTAMailQuery.php',
'PhabricatorMetaMTAMailSection' => 'applications/metamta/view/PhabricatorMetaMTAMailSection.php',
'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAMailTestCase.php',
'PhabricatorMetaMTAMailableDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableDatasource.php',
@@ -5744,9 +5746,14 @@
'PhabricatorMetaMTAEmailBodyParser' => 'Phobject',
'PhabricatorMetaMTAEmailBodyParserTestCase' => 'PhabricatorTestCase',
'PhabricatorMetaMTAErrorMailAction' => 'PhabricatorSystemAction',
- 'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO',
+ 'PhabricatorMetaMTAMail' => array(
+ 'PhabricatorMetaMTADAO',
+ 'PhabricatorPolicyInterface',
+ ),
'PhabricatorMetaMTAMailBody' => 'Phobject',
'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase',
+ 'PhabricatorMetaMTAMailPHIDType' => 'PhabricatorPHIDType',
+ 'PhabricatorMetaMTAMailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorMetaMTAMailSection' => 'Phobject',
'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase',
'PhabricatorMetaMTAMailableDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
diff --git a/src/applications/metamta/phid/PhabricatorMetaMTAMailPHIDType.php b/src/applications/metamta/phid/PhabricatorMetaMTAMailPHIDType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/metamta/phid/PhabricatorMetaMTAMailPHIDType.php
@@ -0,0 +1,43 @@
+<?php
+
+final class PhabricatorMetaMTAMailPHIDType extends PhabricatorPHIDType {
+
+ const TYPECONST = 'MTAM';
+
+ public function getTypeName() {
+ return pht('MetaMTA Mail');
+ }
+
+ public function getPHIDTypeApplicationClass() {
+ return 'PhabricatorMetaMTAApplication';
+ }
+
+ public function newObject() {
+ return new PhabricatorMetaMTAMail();
+ }
+
+ protected function buildQueryForObjects(
+ PhabricatorObjectQuery $query,
+ array $phids) {
+
+ return id(new PhabricatorMetaMTAMailQuery())
+ ->withPHIDs($phids);
+ }
+
+ public function loadHandles(
+ PhabricatorHandleQuery $query,
+ array $handles,
+ array $objects) {
+
+ foreach ($handles as $phid => $handle) {
+ $mail = $objects[$phid];
+
+ $id = $mail->getID();
+ $name = pht('Mail %d', $id);
+
+ $handle
+ ->setName($name)
+ ->setFullName($name);
+ }
+ }
+}
diff --git a/src/applications/metamta/query/PhabricatorMetaMTAMailQuery.php b/src/applications/metamta/query/PhabricatorMetaMTAMailQuery.php
new file mode 100644
--- /dev/null
+++ b/src/applications/metamta/query/PhabricatorMetaMTAMailQuery.php
@@ -0,0 +1,57 @@
+<?php
+
+final class PhabricatorMetaMTAMailQuery
+ extends PhabricatorCursorPagedPolicyAwareQuery {
+
+ private $ids;
+ private $phids;
+
+ public function withIDs(array $ids) {
+ $this->ids = $ids;
+ return $this;
+ }
+
+ public function withPHIDs(array $phids) {
+ $this->phids = $phids;
+ return $this;
+ }
+
+ protected function loadPage() {
+ return $this->loadStandardPage($this->newResultObject());
+ }
+
+ protected function buildWhereClause(AphrontDatabaseConnection $conn_r) {
+ $where = array();
+
+ if ($this->ids !== null) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'mail.id IN (%Ld)',
+ $this->ids);
+ }
+
+ if ($this->phids !== null) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'mail.phid IN (%Ls)',
+ $this->phids);
+ }
+
+ $where[] = $this->buildPagingClause($conn_r);
+
+ return $this->formatWhereClause($where);
+ }
+
+ protected function getPrimaryTableAlias() {
+ return 'mail';
+ }
+
+ public function newResultObject() {
+ return new PhabricatorMetaMTAMail();
+ }
+
+ public function getQueryApplicationClass() {
+ return 'PhabricatorMetaMTAApplication';
+ }
+
+}
diff --git a/src/applications/metamta/storage/PhabricatorMetaMTAMail.php b/src/applications/metamta/storage/PhabricatorMetaMTAMail.php
--- a/src/applications/metamta/storage/PhabricatorMetaMTAMail.php
+++ b/src/applications/metamta/storage/PhabricatorMetaMTAMail.php
@@ -3,7 +3,9 @@
/**
* @task recipients Managing Recipients
*/
-final class PhabricatorMetaMTAMail extends PhabricatorMetaMTADAO {
+final class PhabricatorMetaMTAMail
+ extends PhabricatorMetaMTADAO
+ implements PhabricatorPolicyInterface {
const STATUS_QUEUE = 'queued';
const STATUS_SENT = 'sent';
@@ -29,6 +31,7 @@
protected function getConfiguration() {
return array(
+ self::CONFIG_AUX_PHID => true,
self::CONFIG_SERIALIZATION => array(
'parameters' => self::SERIALIZATION_JSON,
),
@@ -54,6 +57,11 @@
) + parent::getConfiguration();
}
+ public function generatePHID() {
+ return PhabricatorPHID::generateNewPHID(
+ PhabricatorMetaMTAMailPHIDType::TYPECONST);
+ }
+
protected function setParam($param, $value) {
$this->parameters[$param] = $value;
return $this;
@@ -993,4 +1001,29 @@
}
+/* -( PhabricatorPolicyInterface )----------------------------------------- */
+
+
+ public function getCapabilities() {
+ return array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ );
+ }
+
+ public function getPolicy($capability) {
+ return PhabricatorPolicies::POLICY_NOONE;
+ }
+
+ public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
+ $actor_phids = $this->getAllActorPHIDs();
+ $actor_phids = $this->expandRecipients($actor_phids);
+ return in_array($viewer->getPHID(), $actor_phids);
+ }
+
+ public function describeAutomaticCapability($capability) {
+ return pht(
+ 'The mail sender and message recipients can always see the mail.');
+ }
+
+
}

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 22, 2:39 PM (3 w, 5 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7715301
Default Alt Text
D13394.id32433.diff (7 KB)

Event Timeline