mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-27 07:50:57 +01:00
Legalpad - add policy rule for legalpad document signatures
Summary: Ref T3116. This creates a policy rule where you can require a signature on a given legalpad document. NOTE: signatures must be for the *latest* document version. Test Plan: made a task have a custom policy requiring a legalpad signature. verified non-signers were locked out. Reviewers: epriestley Reviewed By: epriestley CC: Korvin, epriestley, aran Maniphest Tasks: T3116 Differential Revision: https://secure.phabricator.com/D7977
This commit is contained in:
parent
acb141cf52
commit
d740374cca
6 changed files with 122 additions and 3 deletions
5
resources/sql/autopatches/20140115.legalpadsigkey.sql
Normal file
5
resources/sql/autopatches/20140115.legalpadsigkey.sql
Normal file
|
@ -0,0 +1,5 @@
|
|||
ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature
|
||||
DROP KEY `key_document`;
|
||||
|
||||
ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature
|
||||
ADD KEY `key_document` (`documentPHID`,`signerPHID`, `documentVersion`);
|
|
@ -1764,6 +1764,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorPolicyQuery' => 'applications/policy/query/PhabricatorPolicyQuery.php',
|
||||
'PhabricatorPolicyRule' => 'applications/policy/rule/PhabricatorPolicyRule.php',
|
||||
'PhabricatorPolicyRuleAdministrators' => 'applications/policy/rule/PhabricatorPolicyRuleAdministrators.php',
|
||||
'PhabricatorPolicyRuleLegalpadSignature' => 'applications/policy/rule/PhabricatorPolicyRuleLegalpadSignature.php',
|
||||
'PhabricatorPolicyRuleLunarPhase' => 'applications/policy/rule/PhabricatorPolicyRuleLunarPhase.php',
|
||||
'PhabricatorPolicyRuleProjects' => 'applications/policy/rule/PhabricatorPolicyRuleProjects.php',
|
||||
'PhabricatorPolicyRuleUsers' => 'applications/policy/rule/PhabricatorPolicyRuleUsers.php',
|
||||
|
@ -4395,6 +4396,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorPolicyPHIDTypePolicy' => 'PhabricatorPHIDType',
|
||||
'PhabricatorPolicyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhabricatorPolicyRuleAdministrators' => 'PhabricatorPolicyRule',
|
||||
'PhabricatorPolicyRuleLegalpadSignature' => 'PhabricatorPolicyRule',
|
||||
'PhabricatorPolicyRuleLunarPhase' => 'PhabricatorPolicyRule',
|
||||
'PhabricatorPolicyRuleProjects' => 'PhabricatorPolicyRule',
|
||||
'PhabricatorPolicyRuleUsers' => 'PhabricatorPolicyRule',
|
||||
|
|
|
@ -58,10 +58,10 @@ final class LegalpadDocumentSignController extends LegalpadController {
|
|||
if ($signer_phid) {
|
||||
$signature = id(new LegalpadDocumentSignature())
|
||||
->loadOneWhere(
|
||||
'documentPHID = %s AND documentVersion = %d AND signerPHID = %s',
|
||||
'documentPHID = %s AND signerPHID = %s AND documentVersion = %d',
|
||||
$document->getPHID(),
|
||||
$document->getVersions(),
|
||||
$signer_phid);
|
||||
$signer_phid,
|
||||
$document->getVersions());
|
||||
}
|
||||
|
||||
if (!$signature) {
|
||||
|
|
|
@ -10,6 +10,7 @@ final class LegalpadDocumentQuery
|
|||
private $phids;
|
||||
private $creatorPHIDs;
|
||||
private $contributorPHIDs;
|
||||
private $signerPHIDs;
|
||||
private $dateCreatedAfter;
|
||||
private $dateCreatedBefore;
|
||||
|
||||
|
@ -36,6 +37,11 @@ final class LegalpadDocumentQuery
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function withSignerPHIDs(array $phids) {
|
||||
$this->signerPHIDs = $phids;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function needDocumentBodies($need_bodies) {
|
||||
$this->needDocumentBodies = $need_bodies;
|
||||
return $this;
|
||||
|
@ -75,6 +81,27 @@ final class LegalpadDocumentQuery
|
|||
}
|
||||
|
||||
protected function willFilterPage(array $documents) {
|
||||
if ($this->signerPHIDs) {
|
||||
$document_map = mpull($documents, null, 'getPHID');
|
||||
$signatures = id(new LegalpadDocumentSignature())
|
||||
->loadAllWhere(
|
||||
'documentPHID IN (%Ls) AND signerPHID IN (%Ls)',
|
||||
array_keys($document_map),
|
||||
$this->signerPHIDs);
|
||||
$signatures = mgroup($signatures, 'getDocumentPHID');
|
||||
foreach ($document_map as $document_phid => $document) {
|
||||
$sigs = idx($signatures, $document_phid, array());
|
||||
foreach ($sigs as $index => $sig) {
|
||||
if ($sig->getDocumentVersion() != $document->getVersions()) {
|
||||
unset($sigs[$index]);
|
||||
}
|
||||
}
|
||||
$signer_phids = mpull($sigs, 'getSignerPHID');
|
||||
if (array_diff($this->signerPHIDs, $signer_phids)) {
|
||||
unset($documents[$document->getID()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($this->needDocumentBodies) {
|
||||
$documents = $this->loadDocumentBodies($documents);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorPolicyRuleLegalpadSignature
|
||||
extends PhabricatorPolicyRule {
|
||||
|
||||
private $signatures = array();
|
||||
|
||||
public function getRuleDescription() {
|
||||
return pht('signers of legalpad documents');
|
||||
}
|
||||
|
||||
public function willApplyRules(PhabricatorUser $viewer, array $values) {
|
||||
$values = array_unique(array_filter(array_mergev($values)));
|
||||
if (!$values) {
|
||||
return;
|
||||
}
|
||||
|
||||
$documents = id(new LegalpadDocumentQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withPHIDs($values)
|
||||
->withSignerPHIDs(array($viewer->getPHID()))
|
||||
->execute();
|
||||
$this->signatures = mpull($documents, 'getPHID', 'getPHID');
|
||||
}
|
||||
|
||||
public function applyRule(PhabricatorUser $viewer, $value) {
|
||||
foreach ($value as $document_phid) {
|
||||
if (!isset($this->signatures[$document_phid])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getValueControlType() {
|
||||
return self::CONTROL_TYPE_TOKENIZER;
|
||||
}
|
||||
|
||||
public function getValueControlTemplate() {
|
||||
return array(
|
||||
'markup' => new AphrontTokenizerTemplateView(),
|
||||
'uri' => '/typeahead/common/legalpaddocuments/',
|
||||
'placeholder' => pht('Type a document title...'),
|
||||
);
|
||||
}
|
||||
|
||||
public function getRuleOrder() {
|
||||
return 900;
|
||||
}
|
||||
|
||||
public function getValueForStorage($value) {
|
||||
PhutilTypeSpec::newFromString('list<string>')->check($value);
|
||||
return array_values($value);
|
||||
}
|
||||
|
||||
public function getValueForDisplay(PhabricatorUser $viewer, $value) {
|
||||
$handles = id(new PhabricatorHandleQuery())
|
||||
->setViewer($viewer)
|
||||
->withPHIDs($value)
|
||||
->execute();
|
||||
|
||||
return mpull($handles, 'getFullName', 'getPHID');
|
||||
}
|
||||
|
||||
public function ruleHasEffect($value) {
|
||||
return (bool)$value;
|
||||
}
|
||||
|
||||
}
|
|
@ -37,6 +37,7 @@ final class PhabricatorTypeaheadCommonDatasourceController
|
|||
$need_jump_objects = false;
|
||||
$need_build_plans = false;
|
||||
$need_macros = false;
|
||||
$need_legalpad_documents = false;
|
||||
switch ($this->type) {
|
||||
case 'mainsearch':
|
||||
$need_users = true;
|
||||
|
@ -101,6 +102,9 @@ final class PhabricatorTypeaheadCommonDatasourceController
|
|||
case 'macros':
|
||||
$need_macros = true;
|
||||
break;
|
||||
case 'legalpaddocuments':
|
||||
$need_legalpad_documents = true;
|
||||
break;
|
||||
}
|
||||
|
||||
$results = array();
|
||||
|
@ -252,6 +256,18 @@ final class PhabricatorTypeaheadCommonDatasourceController
|
|||
}
|
||||
}
|
||||
|
||||
if ($need_legalpad_documents) {
|
||||
$documents = id(new LegalpadDocumentQuery())
|
||||
->setViewer($viewer)
|
||||
->execute();
|
||||
$documents = mpull($documents, 'getTitle', 'getPHID');
|
||||
foreach ($documents as $phid => $title) {
|
||||
$results[] = id(new PhabricatorTypeaheadResult())
|
||||
->setPHID($phid)
|
||||
->setName($title);
|
||||
}
|
||||
}
|
||||
|
||||
if ($need_projs) {
|
||||
$projs = id(new PhabricatorProjectQuery())
|
||||
->setViewer($viewer)
|
||||
|
|
Loading…
Reference in a new issue