Index: src/applications/passphrase/controller/PassphraseCredentialRevealController.php =================================================================== --- src/applications/passphrase/controller/PassphraseCredentialRevealController.php +++ src/applications/passphrase/controller/PassphraseCredentialRevealController.php @@ -35,6 +35,7 @@ ->appendChild( id(new AphrontFormTextAreaControl()) ->setLabel(pht('Plaintext')) + ->setReadOnly(true) ->setValue($credential->getSecret()->openEnvelope())); } else { $body = pht('This credential has no associated secret.'); @@ -46,6 +47,17 @@ ->appendChild($body) ->addCancelButton($view_uri, pht('Done')); + $type_secret = PassphraseCredentialTransaction::TYPE_LOOKEDATSECRET; + $xactions = array(id(new PassphraseCredentialTransaction()) + ->setTransactionType($type_secret) + ->setNewValue(true)); + + $editor = id(new PassphraseCredentialTransactionEditor()) + ->setActor($viewer) + ->setContinueOnNoEffect(true) + ->setContentSourceFromRequest($request) + ->applyTransactions($credential, $xactions); + return id(new AphrontDialogResponse())->setDialog($dialog); } Index: src/applications/passphrase/editor/PassphraseCredentialTransactionEditor.php =================================================================== --- src/applications/passphrase/editor/PassphraseCredentialTransactionEditor.php +++ src/applications/passphrase/editor/PassphraseCredentialTransactionEditor.php @@ -14,6 +14,7 @@ $types[] = PassphraseCredentialTransaction::TYPE_USERNAME; $types[] = PassphraseCredentialTransaction::TYPE_SECRET_ID; $types[] = PassphraseCredentialTransaction::TYPE_DESTROY; + $types[] = PassphraseCredentialTransaction::TYPE_LOOKEDATSECRET; return $types; } @@ -35,6 +36,8 @@ return $object->getSecretID(); case PassphraseCredentialTransaction::TYPE_DESTROY: return $object->getIsDestroyed(); + case PassphraseCredentialTransaction::TYPE_LOOKEDATSECRET: + return null; } return parent::getCustomTransactionOldValue($object, $xaction); @@ -49,6 +52,7 @@ case PassphraseCredentialTransaction::TYPE_USERNAME: case PassphraseCredentialTransaction::TYPE_SECRET_ID: case PassphraseCredentialTransaction::TYPE_DESTROY: + case PassphraseCredentialTransaction::TYPE_LOOKEDATSECRET: return $xaction->getNewValue(); } return parent::getCustomTransactionNewValue($object, $xaction); @@ -92,6 +96,8 @@ case PhabricatorTransactions::TYPE_EDIT_POLICY: $object->setEditPolicy($xaction->getNewValue()); return; + case PassphraseCredentialTransaction::TYPE_LOOKEDATSECRET: + return; } return parent::applyCustomInternalTransaction($object, $xaction); @@ -107,6 +113,7 @@ case PassphraseCredentialTransaction::TYPE_USERNAME: case PassphraseCredentialTransaction::TYPE_SECRET_ID: case PassphraseCredentialTransaction::TYPE_DESTROY: + case PassphraseCredentialTransaction::TYPE_LOOKEDATSECRET: case PhabricatorTransactions::TYPE_VIEW_POLICY: case PhabricatorTransactions::TYPE_EDIT_POLICY: return; Index: src/applications/passphrase/storage/PassphraseCredentialTransaction.php =================================================================== --- src/applications/passphrase/storage/PassphraseCredentialTransaction.php +++ src/applications/passphrase/storage/PassphraseCredentialTransaction.php @@ -8,6 +8,7 @@ const TYPE_USERNAME = 'passphrase:username'; const TYPE_SECRET_ID = 'passphrase:secretID'; const TYPE_DESTROY = 'passphrase:destroy'; + const TYPE_LOOKEDATSECRET = 'passphrase:lookedAtSecret'; public function getApplicationName() { return 'passphrase'; @@ -28,6 +29,8 @@ return ($old === null); case self::TYPE_USERNAME: return !strlen($old); + case self::TYPE_LOOKEDATSECRET: + return false; } return parent::shouldHide(); } @@ -77,6 +80,10 @@ return pht( '%s destroyed this credential.', $this->renderHandleLink($author_phid)); + case self::TYPE_LOOKEDATSECRET: + return pht( + '%s examined the secret plaintext for this credential.', + $this->renderHandleLink($author_phid)); } return parent::getTitle(); @@ -97,5 +104,4 @@ json_encode($this->getNewValue())); } - }