Page MenuHomePhabricator

D11418.id27426.diff
No OneTemporary

D11418.id27426.diff

diff --git a/resources/sql/autopatches/20150115.applicationemails.sql b/resources/sql/autopatches/20150115.applicationemails.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20150115.applicationemails.sql
@@ -0,0 +1,12 @@
+CREATE TABLE {$NAMESPACE}_metamta.metamta_applicationemail (
+ id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ phid VARBINARY(64) NOT NULL,
+ applicationPHID VARBINARY(64) NOT NULL,
+ address VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT},
+ configData LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT},
+ dateCreated INT UNSIGNED NOT NULL,
+ dateModified INT UNSIGNED NOT NULL,
+ KEY `key_application` (applicationPHID),
+ UNIQUE KEY `key_address` (address),
+ UNIQUE KEY `key_phid` (phid)
+) ENGINE=MyISAM DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT};
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
@@ -1945,6 +1945,9 @@
'PhabricatorMetaMTAActor' => 'applications/metamta/query/PhabricatorMetaMTAActor.php',
'PhabricatorMetaMTAActorQuery' => 'applications/metamta/query/PhabricatorMetaMTAActorQuery.php',
'PhabricatorMetaMTAApplication' => 'applications/metamta/application/PhabricatorMetaMTAApplication.php',
+ 'PhabricatorMetaMTAApplicationEmail' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php',
+ 'PhabricatorMetaMTAApplicationEmailPHIDType' => 'applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php',
+ 'PhabricatorMetaMTAApplicationEmailQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php',
'PhabricatorMetaMTAAttachment' => 'applications/metamta/storage/PhabricatorMetaMTAAttachment.php',
'PhabricatorMetaMTAConfigOptions' => 'applications/config/option/PhabricatorMetaMTAConfigOptions.php',
'PhabricatorMetaMTAController' => 'applications/metamta/controller/PhabricatorMetaMTAController.php',
@@ -5142,6 +5145,12 @@
'PhabricatorMercurialGraphStream' => 'PhabricatorRepositoryGraphStream',
'PhabricatorMetaMTAActorQuery' => 'PhabricatorQuery',
'PhabricatorMetaMTAApplication' => 'PhabricatorApplication',
+ 'PhabricatorMetaMTAApplicationEmail' => array(
+ 'PhabricatorMetaMTADAO',
+ 'PhabricatorPolicyInterface',
+ ),
+ 'PhabricatorMetaMTAApplicationEmailPHIDType' => 'PhabricatorPHIDType',
+ 'PhabricatorMetaMTAApplicationEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorMetaMTAConfigOptions' => 'PhabricatorApplicationConfigOptions',
'PhabricatorMetaMTAController' => 'PhabricatorController',
'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO',
diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php
--- a/src/applications/base/PhabricatorApplication.php
+++ b/src/applications/base/PhabricatorApplication.php
@@ -4,6 +4,7 @@
* @task info Application Information
* @task ui UI Integration
* @task uri URI Routing
+ * @task mail Email integration
* @task fact Fact Integration
* @task meta Application Management
*/
@@ -193,6 +194,14 @@
}
+/* -( Email Integration )-------------------------------------------------- */
+
+
+ public function supportsEmailIntegration() {
+ return false;
+ }
+
+
/* -( Fact Integration )--------------------------------------------------- */
diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
--- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
@@ -3,23 +3,18 @@
final class PhabricatorApplicationDetailViewController
extends PhabricatorApplicationsController {
- private $application;
public function shouldAllowPublic() {
return true;
}
- public function willProcessRequest(array $data) {
- $this->application = $data['application'];
- }
-
- public function processRequest() {
- $request = $this->getRequest();
+ public function handleRequest(AphrontRequest $request) {
$user = $request->getUser();
+ $application = $request->getURIData('application');
$selected = id(new PhabricatorApplicationQuery())
->setViewer($user)
- ->withClasses(array($this->application))
+ ->withClasses(array($application))
->executeOne();
if (!$selected) {
return new Aphront404Response();
@@ -119,6 +114,25 @@
idx($descriptions, $capability));
}
+ if ($application->supportsEmailIntegration()) {
+ $properties->addSectionHeader(pht('Application Emails'));
+ $email_addresses = id(new PhabricatorMetaMTAApplicationEmailQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($application->getPHID()))
+ ->execute();
+ if (empty($email_addresses)) {
+ $properties->addProperty(
+ null,
+ pht('No email addresses configured.'));
+ } else {
+ foreach ($email_addresses as $email_address) {
+ $properties->addProperty(
+ $email_address->getAddress(),
+ $email_address->getAddress());
+ }
+ }
+ }
+
return $properties;
}
diff --git a/src/applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php b/src/applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php
new file mode 100644
--- /dev/null
+++ b/src/applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php
@@ -0,0 +1,82 @@
+<?php
+
+final class PhabricatorMetaMTAApplicationEmailQuery
+ extends PhabricatorCursorPagedPolicyAwareQuery {
+
+ private $phids;
+ private $ids;
+ private $addresses;
+
+ public function withIDs(array $ids) {
+ $this->ids = $ids;
+ return $this;
+ }
+
+ public function withPHIDs(array $phids) {
+ $this->phids = $phids;
+ return $this;
+ }
+
+ public function withAddresses(array $addresses) {
+ $this->addresses = $addresses;
+ return $this;
+ }
+
+ protected function loadPage() {
+ $table = new PhabricatorMetaMTAApplicationEmail();
+ $conn_r = $table->establishConnection('r');
+
+ $data = queryfx_all(
+ $conn_r,
+ 'SELECT * FROM %T appemail %Q %Q %Q %Q',
+ $table->getTableName(),
+ $this->buildWhereClause($conn_r),
+ $this->buildApplicationSearchGroupClause($conn_r),
+ $this->buildOrderClause($conn_r),
+ $this->buildLimitClause($conn_r));
+
+ return $table->loadAllFromArray($data);
+ }
+
+ private function buildWhereClause($conn_r) {
+ $where = array();
+
+ if ($this->addresses !== null) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'appemail.address IN (%Ls)',
+ $this->addresses);
+ }
+
+ if ($this->phids !== null) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'appemail.phid IN (%Ls)',
+ $this->phids);
+ }
+
+ if ($this->ids !== null) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'appemail.id IN (%Ld)',
+ $this->ids);
+ }
+
+ $where[] = $this->buildPagingClause($conn_r);
+
+ return $this->formatWhereClause($where);
+ }
+
+ protected function getPagingColumn() {
+ return 'appemail.id';
+ }
+
+ protected function getApplicationSearchObjectPHIDColumn() {
+ return 'appemail.phid';
+ }
+
+ public function getQueryApplicationClass() {
+ return 'PhabricatorMetaMTAApplication';
+ }
+
+}
diff --git a/src/applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php b/src/applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php
new file mode 100644
--- /dev/null
+++ b/src/applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php
@@ -0,0 +1,72 @@
+<?php
+
+final class PhabricatorMetaMTAApplicationEmail
+ extends PhabricatorMetaMTADAO
+ implements PhabricatorPolicyInterface {
+
+ protected $phid;
+ protected $applicationPHID;
+ protected $address;
+ protected $configData;
+
+ // TODO - re-use validation from PhabricatorUserEmail
+
+ protected function getConfiguration() {
+ return array(
+ self::CONFIG_AUX_PHID => true,
+ self::CONFIG_SERIALIZATION => array(
+ 'configData' => self::SERIALIZATION_JSON,
+ ),
+ self::CONFIG_COLUMN_SCHEMA => array(
+ 'address' => 'sort128',
+ ),
+ self::CONFIG_KEY_SCHEMA => array(
+ 'key_phid' => array(
+ 'columns' => array('phid'),
+ 'unique' => true,
+ ),
+ 'key_address' => array(
+ 'columns' => array('address'),
+ 'unique' => true,
+ ),
+ 'key_application' => array(
+ 'columns' => array('applicationPHID'),
+ ),
+ ),
+ ) + parent::getConfiguration();
+ }
+
+ public function generatePHID() {
+ return PhabricatorPHID::generateNewPHID(
+ PhabricatorMetaMTAApplicationEmailPHIDType::TYPECONST);
+ }
+
+
+/* -( PhabricatorPolicyInterface )----------------------------------------- */
+
+
+ public function getCapabilities() {
+ return array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ );
+ }
+
+ public function getPolicy($capability) {
+ switch ($capability) {
+ case PhabricatorPolicyCapability::CAN_VIEW:
+ return PhabricatorPolicies::POLICY_USER;
+ case PhabricatorPolicyCapability::CAN_EDIT:
+ return PhabricatorPolicies::POLICY_ADMIN;
+ }
+ }
+
+ public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
+ return false;
+ }
+
+ public function describeAutomaticCapability($capability) {
+ return null;
+ }
+
+}
diff --git a/src/applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php b/src/applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php
@@ -0,0 +1,45 @@
+<?php
+
+final class PhabricatorMetaMTAApplicationEmailPHIDType
+ extends PhabricatorPHIDType {
+
+ const TYPECONST = 'APPE';
+
+ public function getTypeName() {
+ return pht('Application Email');
+ }
+
+ public function getPHIDTypeApplicationClass() {
+ return 'PhabricatorMetaMTAApplication';
+ }
+
+ public function getTypeIcon() {
+ return 'fa-email bluegrey';
+ }
+
+ public function newObject() {
+ return new PhabricatorMetaMTAApplicationEmail();
+ }
+
+ protected function buildQueryForObjects(
+ PhabricatorObjectQuery $query,
+ array $phids) {
+
+ return id(new PhabricatorMetaMTAApplicationEmailQuery())
+ ->withPHIDs($phids);
+ }
+
+ public function loadHandles(
+ PhabricatorHandleQuery $query,
+ array $handles,
+ array $objects) {
+
+ foreach ($handles as $phid => $handle) {
+ $email = $objects[$phid];
+
+ $handle->setName($email->getAddress());
+ $handle->setURI('TODO');
+ $handle->setFullName($email->getAddress());
+ }
+ }
+}

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 16, 4:12 AM (1 w, 3 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7705681
Default Alt Text
D11418.id27426.diff (10 KB)

Event Timeline