mirror of
https://we.phorge.it/source/phorge.git
synced 2025-01-09 06:11:01 +01:00
2a0af8e299
Summary: Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests. There's no UI to create these yet, so users can't actually get invites (and administrators can't send them). This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere. The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible. Test Plan: Unit tests only. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T7152 Differential Revision: https://secure.phabricator.com/D11723
55 lines
1.4 KiB
PHP
55 lines
1.4 KiB
PHP
<?php
|
|
|
|
final class PhabricatorAuthInvite
|
|
extends PhabricatorUserDAO {
|
|
|
|
protected $authorPHID;
|
|
protected $emailAddress;
|
|
protected $verificationHash;
|
|
protected $acceptedByPHID;
|
|
|
|
private $verificationCode;
|
|
|
|
protected function getConfiguration() {
|
|
return array(
|
|
self::CONFIG_COLUMN_SCHEMA => array(
|
|
'emailAddress' => 'sort128',
|
|
'verificationHash' => 'bytes12',
|
|
'acceptedByPHID' => 'phid?',
|
|
),
|
|
self::CONFIG_KEY_SCHEMA => array(
|
|
'key_address' => array(
|
|
'columns' => array('emailAddress'),
|
|
'unique' => true,
|
|
),
|
|
'key_code' => array(
|
|
'columns' => array('verificationHash'),
|
|
'unique' => true,
|
|
),
|
|
),
|
|
) + parent::getConfiguration();
|
|
}
|
|
|
|
public function getVerificationCode() {
|
|
if (!$this->getVerificationHash()) {
|
|
if ($this->verificationHash) {
|
|
throw new Exception(
|
|
pht(
|
|
'Verification code can not be regenerated after an invite is '.
|
|
'created.'));
|
|
}
|
|
$this->verificationCode = Filesystem::readRandomCharacters(16);
|
|
}
|
|
return $this->verificationCode;
|
|
}
|
|
|
|
public function save() {
|
|
if (!$this->getVerificationHash()) {
|
|
$hash = PhabricatorHash::digestForIndex($this->getVerificationCode());
|
|
$this->setVerificationHash($hash);
|
|
}
|
|
|
|
return parent::save();
|
|
}
|
|
|
|
}
|