Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15388650
D11418.id27426.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
10 KB
Referenced Files
None
Subscribers
None
D11418.id27426.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D11418: MetaMTA - add (basic) application emails and deploy to Maniphest
Attached
Detach File
Event Timeline
Log In to Comment